diff --git a/.circleci/config.yml b/.circleci/config.yml index bfa65b951..d3c160cd5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -393,11 +393,9 @@ jobs: - run: go install golang.org/x/tools/cmd/goimports - run: go install github.com/hannahhoward/cbor-gen-for - run: make gen - - run: git --no-pager diff - - run: git --no-pager diff --quiet + - run: git --no-pager diff && git --no-pager diff --quiet - run: make docsgen-cli - - run: git --no-pager diff - - run: git --no-pager diff --quiet + - run: git --no-pager diff && git --no-pager diff --quiet docs-check: executor: golang @@ -412,11 +410,7 @@ jobs: - run: zcat build/openrpc/full.json.gz | jq > ../post-openrpc-full - run: zcat build/openrpc/miner.json.gz | jq > ../post-openrpc-miner - run: zcat build/openrpc/worker.json.gz | jq > ../post-openrpc-worker - - run: git --no-pager diff - - run: diff ../pre-openrpc-full ../post-openrpc-full - - run: diff ../pre-openrpc-miner ../post-openrpc-miner - - run: diff ../pre-openrpc-worker ../post-openrpc-worker - - run: git --no-pager diff --quiet + - run: diff ../pre-openrpc-full ../post-openrpc-full && diff ../pre-openrpc-miner ../post-openrpc-miner && diff ../pre-openrpc-worker ../post-openrpc-worker && git --no-pager diff && git --no-pager diff --quiet lint: &lint description: | diff --git a/.circleci/template.yml b/.circleci/template.yml index 58a91114b..6906f13f4 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -393,11 +393,9 @@ jobs: - run: go install golang.org/x/tools/cmd/goimports - run: go install github.com/hannahhoward/cbor-gen-for - run: make gen - - run: git --no-pager diff - - run: git --no-pager diff --quiet + - run: git --no-pager diff && git --no-pager diff --quiet - run: make docsgen-cli - - run: git --no-pager diff - - run: git --no-pager diff --quiet + - run: git --no-pager diff && git --no-pager diff --quiet docs-check: executor: golang @@ -412,11 +410,7 @@ jobs: - run: zcat build/openrpc/full.json.gz | jq > ../post-openrpc-full - run: zcat build/openrpc/miner.json.gz | jq > ../post-openrpc-miner - run: zcat build/openrpc/worker.json.gz | jq > ../post-openrpc-worker - - run: git --no-pager diff - - run: diff ../pre-openrpc-full ../post-openrpc-full - - run: diff ../pre-openrpc-miner ../post-openrpc-miner - - run: diff ../pre-openrpc-worker ../post-openrpc-worker - - run: git --no-pager diff --quiet + - run: diff ../pre-openrpc-full ../post-openrpc-full && diff ../pre-openrpc-miner ../post-openrpc-miner && diff ../pre-openrpc-worker ../post-openrpc-worker && git --no-pager diff && git --no-pager diff --quiet lint: &lint description: | diff --git a/chain/exchange/client.go b/chain/exchange/client.go index 7c3ea4f7e..db39628be 100644 --- a/chain/exchange/client.go +++ b/chain/exchange/client.go @@ -430,6 +430,9 @@ func (c *client) sendRequestToPeer(ctx context.Context, peer peer.ID, req *Reque } _ = stream.SetWriteDeadline(time.Time{}) // clear deadline // FIXME: Needs // its own API (https://github.com/libp2p/go-libp2p/core/issues/162). + if err := stream.CloseWrite(); err != nil { + log.Warnw("CloseWrite err", "error", err) + } // Read response. var res Response diff --git a/chain/stmgr/call.go b/chain/stmgr/call.go index 8f8aebf63..61be26e56 100644 --- a/chain/stmgr/call.go +++ b/chain/stmgr/call.go @@ -226,16 +226,6 @@ func (sm *StateManager) callInternal(ctx context.Context, msg *types.Message, pr Data: make([]byte, 65), }, } - default: - // XXX: Hack to make sending from f099 (and others) "just work". - // REMOVE ME. - msgApply = &types.SignedMessage{ - Message: *msg, - Signature: crypto.Signature{ - Type: crypto.SigTypeSecp256k1, - Data: make([]byte, 65), - }, - } } ret, err = vmi.ApplyMessage(ctx, msgApply) diff --git a/chain/vm/fvm.go b/chain/vm/fvm.go index 2ac70e6ef..a81bc10d6 100644 --- a/chain/vm/fvm.go +++ b/chain/vm/fvm.go @@ -206,14 +206,14 @@ func (x *FvmExtern) VerifyConsensusFault(ctx context.Context, a, b, extra []byte // check blocks are properly signed by their respective miner // note we do not need to check extra's: it is a parent to block b // which itself is signed, so it was willingly included by the miner - gasA, sigErr := x.VerifyBlockSig(ctx, &blockA) + gasA, sigErr := x.verifyBlockSig(ctx, &blockA) totalGas += gasA if sigErr != nil { log.Info("invalid consensus fault: cannot verify first block sig: %w", sigErr) return ret, totalGas } - gas2, sigErr := x.VerifyBlockSig(ctx, &blockB) + gas2, sigErr := x.verifyBlockSig(ctx, &blockB) totalGas += gas2 if sigErr != nil { log.Info("invalid consensus fault: cannot verify second block sig: %w", sigErr) @@ -226,7 +226,7 @@ func (x *FvmExtern) VerifyConsensusFault(ctx context.Context, a, b, extra []byte return ret, totalGas } -func (x *FvmExtern) VerifyBlockSig(ctx context.Context, blk *types.BlockHeader) (int64, error) { +func (x *FvmExtern) verifyBlockSig(ctx context.Context, blk *types.BlockHeader) (int64, error) { waddr, gasUsed, err := x.workerKeyAtLookback(ctx, blk.Miner, blk.Height) if err != nil { return gasUsed, err diff --git a/cmd/lotus-bench/main.go b/cmd/lotus-bench/main.go index d7b9b0409..279f2d5fd 100644 --- a/cmd/lotus-bench/main.go +++ b/cmd/lotus-bench/main.go @@ -468,7 +468,7 @@ var sealBenchCmd = &cli.Command{ } bo.EnvVar = make(map[string]string) - for _, envKey := range []string{"BELLMAN_NO_GPU", "FIL_PROOFS_MAXIMIZE_CACHING", "FIL_PROOFS_USE_GPU_COLUMN_BUILDER", + for _, envKey := range []string{"BELLMAN_NO_GPU", "FIL_PROOFS_USE_GPU_COLUMN_BUILDER", "FIL_PROOFS_USE_GPU_TREE_BUILDER", "FIL_PROOFS_USE_MULTICORE_SDR", "BELLMAN_CUSTOM_GPU"} { envValue, found := os.LookupEnv(envKey) if found { diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index 3bb904d7a..fc5fdcef6 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -813,6 +813,10 @@ var sectorsRenewCmd = &cli.Command{ Usage: "use up to this amount of FIL for one message. pass this flag to avoid message congestion.", Value: "0", }, + &cli.Int64Flag{ + Name: "max-sectors", + Usage: "the maximum number of sectors contained in each message message", + }, &cli.BoolFlag{ Name: "really-do-it", Usage: "pass this flag to really renew sectors, otherwise will only print out json representation of parameters", @@ -1020,10 +1024,20 @@ var sectorsRenewCmd = &cli.Command{ for l, exts := range extensions { for newExp, numbers := range exts { scount += len(numbers) - addrSectors, err := policy.GetAddressedSectorsMax(nv) + var addrSectors int + sectorsMax, err := policy.GetAddressedSectorsMax(nv) if err != nil { return err } + if cctx.Int("max-sectors") == 0 { + addrSectors = sectorsMax + } else { + addrSectors = cctx.Int("max-sectors") + if addrSectors > sectorsMax { + return xerrors.Errorf("the specified max-sectors exceeds the maximum limit") + } + } + declMax, err := policy.GetDeclarationsMax(nv) if err != nil { return err diff --git a/cmd/lotus-shed/main.go b/cmd/lotus-shed/main.go index 623afb55e..6f84739fa 100644 --- a/cmd/lotus-shed/main.go +++ b/cmd/lotus-shed/main.go @@ -51,7 +51,6 @@ func main() { exportChainCmd, exportCarCmd, consensusCmd, - storageStatsCmd, syncCmd, stateTreePruneCmd, datastoreCmd, diff --git a/cmd/lotus-shed/storage-stats.go b/cmd/lotus-shed/storage-stats.go deleted file mode 100644 index 68495545b..000000000 --- a/cmd/lotus-shed/storage-stats.go +++ /dev/null @@ -1,199 +0,0 @@ -package main - -import ( - "encoding/json" - corebig "math/big" - "os" - "strconv" - - "github.com/ipfs/go-cid" - "github.com/urfave/cli/v2" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-state-types/abi" - filbig "github.com/filecoin-project/go-state-types/big" - - "github.com/filecoin-project/lotus/chain/types" - lcli "github.com/filecoin-project/lotus/cli" -) - -// How many epochs back to look at for dealstats -var defaultEpochLookback = abi.ChainEpoch(10) - -type networkTotalsOutput struct { - Epoch int64 `json:"epoch"` - Endpoint string `json:"endpoint"` - Payload networkTotals `json:"payload"` -} - -type providerMeta struct { - nonidentifiable bool -} - -// force formatting as decimal to aid human readers -type humanFloat float64 - -func (f humanFloat) MarshalJSON() ([]byte, error) { - // 'f' uses decimal digits without exponents. - // The bit size of 32 ensures we don't use too many decimal places. - return []byte(strconv.FormatFloat(float64(f), 'f', -1, 32)), nil -} - -type Totals struct { - TotalDeals int `json:"total_num_deals"` - TotalBytes int64 `json:"total_stored_data_size"` - PrivateTotalDeals int `json:"private_total_num_deals"` - PrivateTotalBytes int64 `json:"private_total_stored_data_size"` - CapacityCarryingData humanFloat `json:"capacity_fraction_carrying_data"` -} - -type networkTotals struct { - QaNetworkPower filbig.Int `json:"total_qa_power"` - RawNetworkPower filbig.Int `json:"total_raw_capacity"` - UniqueCids int `json:"total_unique_cids"` - UniqueBytes int64 `json:"total_unique_data_size"` - UniqueClients int `json:"total_unique_clients"` - UniqueProviders int `json:"total_unique_providers"` - UniquePrivateProviders int `json:"total_unique_private_providers"` - Totals - FilPlus Totals `json:"filecoin_plus_subset"` - - pieces map[cid.Cid]struct{} - clients map[address.Address]struct{} - providers map[address.Address]providerMeta -} - -var storageStatsCmd = &cli.Command{ - Name: "storage-stats", - Usage: "Translates current lotus state into a json summary suitable for driving https://storage.filecoin.io/", - Flags: []cli.Flag{ - &cli.StringFlag{ - Name: "tipset", - Usage: "Comma separated array of cids, or @height", - }, - }, - Action: func(cctx *cli.Context) error { - ctx := lcli.ReqContext(cctx) - - api, apiCloser, err := lcli.GetFullNodeAPI(cctx) - if err != nil { - return err - } - defer apiCloser() - - var ts *types.TipSet - if cctx.String("tipset") == "" { - ts, err = api.ChainHead(ctx) - if err != nil { - return err - } - ts, err = api.ChainGetTipSetByHeight(ctx, ts.Height()-defaultEpochLookback, ts.Key()) - if err != nil { - return err - } - } else { - ts, err = lcli.ParseTipSetRef(ctx, api, cctx.String("tipset")) - if err != nil { - return err - } - } - - power, err := api.StateMinerPower(ctx, address.Address{}, ts.Key()) - if err != nil { - return err - } - - netTotals := networkTotals{ - QaNetworkPower: power.TotalPower.QualityAdjPower, - RawNetworkPower: power.TotalPower.RawBytePower, - pieces: make(map[cid.Cid]struct{}), - clients: make(map[address.Address]struct{}), - providers: make(map[address.Address]providerMeta), - } - - deals, err := api.StateMarketDeals(ctx, ts.Key()) - if err != nil { - return err - } - - for _, dealInfo := range deals { - - // Only count deals that have properly started, not past/future ones - // https://github.com/filecoin-project/specs-actors/blob/v0.9.9/actors/builtin/market/deal.go#L81-L85 - // Bail on 0 as well in case SectorStartEpoch is uninitialized due to some bug - // - // Additionally if the SlashEpoch is set this means the underlying sector is - // terminated for whatever reason ( not just slashed ), and the deal record - // will soon be removed from the state entirely - if dealInfo.State.SectorStartEpoch <= 0 || - dealInfo.State.SectorStartEpoch > ts.Height() || - dealInfo.State.SlashEpoch > -1 { - continue - } - - netTotals.clients[dealInfo.Proposal.Client] = struct{}{} - - if _, seen := netTotals.providers[dealInfo.Proposal.Provider]; !seen { - pm := providerMeta{} - - mi, err := api.StateMinerInfo(ctx, dealInfo.Proposal.Provider, ts.Key()) - if err != nil { - return err - } - - if mi.PeerId == nil || *mi.PeerId == "" { - log.Infof("private provider %s", dealInfo.Proposal.Provider) - pm.nonidentifiable = true - netTotals.UniquePrivateProviders++ - } - - netTotals.providers[dealInfo.Proposal.Provider] = pm - netTotals.UniqueProviders++ - } - - if _, seen := netTotals.pieces[dealInfo.Proposal.PieceCID]; !seen { - netTotals.pieces[dealInfo.Proposal.PieceCID] = struct{}{} - netTotals.UniqueBytes += int64(dealInfo.Proposal.PieceSize) - netTotals.UniqueCids++ - } - - netTotals.TotalBytes += int64(dealInfo.Proposal.PieceSize) - netTotals.TotalDeals++ - if netTotals.providers[dealInfo.Proposal.Provider].nonidentifiable { - netTotals.PrivateTotalBytes += int64(dealInfo.Proposal.PieceSize) - netTotals.PrivateTotalDeals++ - } - - if dealInfo.Proposal.VerifiedDeal { - netTotals.FilPlus.TotalBytes += int64(dealInfo.Proposal.PieceSize) - netTotals.FilPlus.TotalDeals++ - if netTotals.providers[dealInfo.Proposal.Provider].nonidentifiable { - netTotals.FilPlus.PrivateTotalBytes += int64(dealInfo.Proposal.PieceSize) - netTotals.FilPlus.PrivateTotalDeals++ - } - } - } - - netTotals.UniqueClients = len(netTotals.clients) - - ccd, _ := new(corebig.Rat).SetFrac( - corebig.NewInt(netTotals.TotalBytes), - netTotals.RawNetworkPower.Int, - ).Float64() - netTotals.CapacityCarryingData = humanFloat(ccd) - - ccdfp, _ := new(corebig.Rat).SetFrac( - corebig.NewInt(netTotals.FilPlus.TotalBytes), - netTotals.RawNetworkPower.Int, - ).Float64() - netTotals.FilPlus.CapacityCarryingData = humanFloat(ccdfp) - - return json.NewEncoder(os.Stdout).Encode( - networkTotalsOutput{ - Epoch: int64(ts.Height()), - Endpoint: "NETWORK_WIDE_TOTALS", - Payload: netTotals, - }, - ) - }, -} diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index b666d8ca7..4b705adad 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -1897,6 +1897,7 @@ OPTIONS: --extension value try to extend selected sectors by this number of epochs, defaults to 540 days (default: 1555200) --from value only consider sectors whose current expiration epoch is in the range of [from, to], <from> defaults to: now + 120 (1 hour) (default: 0) --max-fee value use up to this amount of FIL for one message. pass this flag to avoid message congestion. (default: "0") + --max-sectors value the maximum number of sectors contained in each message message (default: 0) --new-expiration value try to extend selected sectors to this epoch, ignoring extension (default: 0) --only-cc only extend CC sectors (useful for making sector ready for snap upgrade) (default: false) --really-do-it pass this flag to really renew sectors, otherwise will only print out json representation of parameters (default: false) diff --git a/node/builder_chain.go b/node/builder_chain.go index 39439c67f..541b451b7 100644 --- a/node/builder_chain.go +++ b/node/builder_chain.go @@ -259,7 +259,6 @@ func ConfigFullNode(c interface{}) Option { // Actor event filtering support Override(new(events.EventAPI), From(new(modules.EventAPI))), - // in lite-mode Eth event api is provided by gateway ApplyIf(isFullNode, Override(new(full.EthEventAPI), modules.EthEventAPI(cfg.ActorEvent))), ) diff --git a/node/hello/hello.go b/node/hello/hello.go index 651716da9..e05b8a482 100644 --- a/node/hello/hello.go +++ b/node/hello/hello.go @@ -158,6 +158,9 @@ func (hs *Service) SayHello(ctx context.Context, pid peer.ID) error { if err := cborutil.WriteCborRPC(s, hmsg); err != nil { return xerrors.Errorf("writing rpc to peer: %w", err) } + if err := s.CloseWrite(); err != nil { + log.Warnw("CloseWrite err", "error", err) + } go func() { defer s.Close() //nolint:errcheck diff --git a/node/impl/full/dummy.go b/node/impl/full/dummy.go new file mode 100644 index 000000000..865e14c9a --- /dev/null +++ b/node/impl/full/dummy.go @@ -0,0 +1,109 @@ +package full + +import ( + "context" + "errors" + + "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/chain/types/ethtypes" +) + +var ErrImplementMe = errors.New("Not implemented yet") + +type EthModuleDummy struct{} + +func (e *EthModuleDummy) EthBlockNumber(ctx context.Context) (ethtypes.EthUint64, error) { + return 0, ErrImplementMe +} + +func (e *EthModuleDummy) EthAccounts(ctx context.Context) ([]ethtypes.EthAddress, error) { + return nil, ErrImplementMe +} + +func (e *EthModuleDummy) EthGetBlockTransactionCountByNumber(ctx context.Context, blkNum ethtypes.EthUint64) (ethtypes.EthUint64, error) { + return 0, ErrImplementMe +} + +func (e *EthModuleDummy) EthGetBlockTransactionCountByHash(ctx context.Context, blkHash ethtypes.EthHash) (ethtypes.EthUint64, error) { + return 0, ErrImplementMe +} + +func (e *EthModuleDummy) EthGetBlockByHash(ctx context.Context, blkHash ethtypes.EthHash, fullTxInfo bool) (ethtypes.EthBlock, error) { + return ethtypes.EthBlock{}, ErrImplementMe +} + +func (e *EthModuleDummy) EthGetBlockByNumber(ctx context.Context, blkNum string, fullTxInfo bool) (ethtypes.EthBlock, error) { + return ethtypes.EthBlock{}, ErrImplementMe +} + +func (e *EthModuleDummy) EthGetTransactionByHash(ctx context.Context, txHash *ethtypes.EthHash) (*ethtypes.EthTx, error) { + return nil, ErrImplementMe +} + +func (e *EthModuleDummy) EthGetTransactionCount(ctx context.Context, sender ethtypes.EthAddress, blkOpt string) (ethtypes.EthUint64, error) { + return 0, ErrImplementMe +} + +func (e *EthModuleDummy) EthGetTransactionReceipt(ctx context.Context, txHash ethtypes.EthHash) (*api.EthTxReceipt, error) { + return nil, ErrImplementMe +} + +func (e *EthModuleDummy) EthGetTransactionByBlockHashAndIndex(ctx context.Context, blkHash ethtypes.EthHash, txIndex ethtypes.EthUint64) (ethtypes.EthTx, error) { + return ethtypes.EthTx{}, ErrImplementMe +} + +func (e *EthModuleDummy) EthGetTransactionByBlockNumberAndIndex(ctx context.Context, blkNum ethtypes.EthUint64, txIndex ethtypes.EthUint64) (ethtypes.EthTx, error) { + return ethtypes.EthTx{}, ErrImplementMe +} + +func (e *EthModuleDummy) EthGetCode(ctx context.Context, address ethtypes.EthAddress, blkOpt string) (ethtypes.EthBytes, error) { + return nil, ErrImplementMe +} + +func (e *EthModuleDummy) EthGetStorageAt(ctx context.Context, address ethtypes.EthAddress, position ethtypes.EthBytes, blkParam string) (ethtypes.EthBytes, error) { + return nil, ErrImplementMe +} + +func (e *EthModuleDummy) EthGetBalance(ctx context.Context, address ethtypes.EthAddress, blkParam string) (ethtypes.EthBigInt, error) { + return ethtypes.EthBigIntZero, ErrImplementMe +} + +func (e *EthModuleDummy) EthFeeHistory(ctx context.Context, blkCount ethtypes.EthUint64, newestBlk string, rewardPercentiles []float64) (ethtypes.EthFeeHistory, error) { + return ethtypes.EthFeeHistory{}, ErrImplementMe +} + +func (e *EthModuleDummy) EthChainId(ctx context.Context) (ethtypes.EthUint64, error) { + return 0, ErrImplementMe +} + +func (e *EthModuleDummy) NetVersion(ctx context.Context) (string, error) { + return "", ErrImplementMe +} + +func (e *EthModuleDummy) NetListening(ctx context.Context) (bool, error) { + return false, ErrImplementMe +} + +func (e *EthModuleDummy) EthProtocolVersion(ctx context.Context) (ethtypes.EthUint64, error) { + return 0, ErrImplementMe +} + +func (e *EthModuleDummy) EthGasPrice(ctx context.Context) (ethtypes.EthBigInt, error) { + return ethtypes.EthBigIntZero, ErrImplementMe +} + +func (e *EthModuleDummy) EthEstimateGas(ctx context.Context, tx ethtypes.EthCall) (ethtypes.EthUint64, error) { + return 0, ErrImplementMe +} + +func (e *EthModuleDummy) EthCall(ctx context.Context, tx ethtypes.EthCall, blkParam string) (ethtypes.EthBytes, error) { + return nil, ErrImplementMe +} + +func (e *EthModuleDummy) EthMaxPriorityFeePerGas(ctx context.Context) (ethtypes.EthBigInt, error) { + return ethtypes.EthBigIntZero, ErrImplementMe +} + +func (e *EthModuleDummy) EthSendRawTransaction(ctx context.Context, rawTx ethtypes.EthBytes) (ethtypes.EthHash, error) { + return ethtypes.EthHash{}, ErrImplementMe +} diff --git a/node/rpc.go b/node/rpc.go index 2c1798614..a96e6e3ac 100644 --- a/node/rpc.go +++ b/node/rpc.go @@ -107,7 +107,6 @@ func FullNodeHandler(a v1api.FullNode, permissioned bool, opts ...jsonrpc.Server Next: handleImportFunc, } m.Handle("/rest/v0/import", importAH) - exportAH := &auth.Handler{ Verify: a.AuthVerify, Next: handleExportFunc, diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 2b9862808..8c7323a2b 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -36,7 +36,7 @@ parts: - libhwloc15 - ocl-icd-libopencl1 override-build: | - LDFLAGS="-z noexecstack" make lotus lotus-miner lotus-worker + LDFLAGS="" make lotus lotus-miner lotus-worker cp lotus lotus-miner lotus-worker $SNAPCRAFT_PART_INSTALL cp scripts/snap-lotus-entrypoint.sh $SNAPCRAFT_PART_INSTALL diff --git a/storage/sealer/README.md b/storage/sealer/README.md index a4661f9d8..83fa3ea5f 100644 --- a/storage/sealer/README.md +++ b/storage/sealer/README.md @@ -21,16 +21,15 @@ Please report your issues with regards to sector-storage at the [lotus issue tra Manages is the top-level piece of the storage system gluing all the other pieces together. It also implements scheduling logic. -### `package stores` +### `package paths` This package implements the sector storage subsystem. Fundamentally the storage is divided into `path`s, each path has it's UUID, and stores a set of sector -'files'. There are currently 3 types of sector files - `unsealed`, `sealed`, -and `cache`. +'files'. There are currently 5 types of sector files - `unsealed`, `sealed`, `cache`, `update` and `update-cache`. Paths can be shared between nodes by sharing the underlying filesystem. -### `stores.Local` +### `paths.Local` The Local store implements SectorProvider for paths mounted in the local filesystem. Paths can be shared between nodes, and support shared filesystems @@ -38,12 +37,12 @@ such as NFS. stores.Local implements all native filesystem-related operations -### `stores.Remote` +### `paths.Remote` The Remote store extends Local store, handles fetching sector files into a local store if needed, and handles removing sectors from non-local stores. -### `stores.Index` +### `paths.Index` The Index is a singleton holding metadata about storage paths, and a mapping of sector files to paths diff --git a/storage/sealer/docs/sector-storage.svg b/storage/sealer/docs/sector-storage.svg index 3978ef2f8..0e2ed27a7 100644 --- a/storage/sealer/docs/sector-storage.svg +++ b/storage/sealer/docs/sector-storage.svg @@ -1,3 +1,4 @@ <?xml version="1.0" encoding="UTF-8"?> +<!-- Do not edit this file with editors other than diagrams.net --> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg xmlns="http://www.w3.org/2000/svg" style="background-color: rgb(255, 255, 255);" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="851px" height="1001px" viewBox="-0.5 -0.5 851 1001" content="<mxfile host="app.diagrams.net" modified="2020-04-06T17:42:42.123Z" agent="5.0 (X11)" etag="ilAX9XQorx-cbKmfSJum" version="12.9.8" type="browser"><diagram id="6lDjA8ebbJXz-MvvKowY" name="Page-1">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</diagram></mxfile>"><defs/><g><rect x="0" y="680" width="610" height="320" fill="#bac8d3" stroke="#23445d" pointer-events="all"/><rect x="479.5" y="680" width="120" height="50" fill="none" stroke="#000000" pointer-events="all"/><rect x="0" y="0" width="850" height="640" fill="#bac8d3" stroke="#23445d" pointer-events="all"/><rect x="0" y="30" width="840" height="470" fill="#fad9d5" stroke="#ae4132" pointer-events="all"/><rect x="60" y="440" width="770" height="60" fill="#fad9d5" stroke="#ae4132" stroke-dasharray="3 3" pointer-events="all"/><rect x="500" y="110" width="285" height="210" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/><rect x="605" y="110" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 120px; margin-left: 606px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>LocalWorker</div></div></div></div></foreignObject><text x="645" y="124" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">LocalWorker</text></switch></g><path d="M 620 170 L 640 170 L 640 230 L 626.37 230" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 621.12 230 L 628.12 226.5 L 626.37 230 L 628.12 233.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="500" y="160" width="120" height="20" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/><rect x="500" y="160" width="70" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 170px; margin-left: 501px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">stores.Local</div></div></div></foreignObject><text x="535" y="174" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">stores.Local</text></switch></g><path d="M 620 140 L 710 140 L 710 273.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 710 278.88 L 706.5 271.88 L 710 273.63 L 713.5 271.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="500" y="130" width="120" height="20" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/><rect x="500" y="130" width="70" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 140px; margin-left: 501px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">stores.Store</div></div></div></foreignObject><text x="535" y="144" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">stores.Store</text></switch></g><path d="M 620 200 L 680 200 L 680 273.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 680 278.88 L 676.5 271.88 L 680 273.63 L 683.5 271.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="500" y="190" width="120" height="20" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/><rect x="500" y="190" width="100" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 200px; margin-left: 501px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">stores.SectorIndex</div></div></div></foreignObject><text x="550" y="204" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">stores.SectorInd...</text></switch></g><rect x="510" y="250" width="140" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><rect x="535" y="250" width="90" height="24" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 262px; margin-left: 536px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>ffiwrapper.Sealer</div></div></div></div></foreignObject><text x="580" y="266" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">ffiwrapper.Seal...</text></switch></g><rect x="565" y="286" width="85" height="24" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 83px; height: 1px; padding-top: 298px; margin-left: 566px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">SectorProvider</div></div></div></foreignObject><text x="608" y="302" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">SectorProvider</text></switch></g><path d="M 650 280 L 575 280 Q 565 280 565 290 L 565 310" fill="none" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="stroke"/><rect x="650" y="280" width="120" height="30" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 295px; margin-left: 651px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">localProvider</div></div></div></foreignObject><text x="710" y="299" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">localProvider</text></switch></g><path d="M 710 310 L 710 310" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 710 310 L 710 310 L 710 310 L 710 310 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="500" y="220" width="120" height="20" fill="#d5e8d4" stroke="#82b366" stroke-dasharray="3 3" pointer-events="all"/><path d="M 500 230 L 470 230 L 470 270 L 446.37 270" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 441.12 270 L 448.12 266.5 L 446.37 270 L 448.12 273.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="500" y="220" width="40" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 230px; margin-left: 501px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Worker</div></div></div></foreignObject><text x="520" y="234" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Worker</text></switch></g><path d="M 557.5 250 L 560 250 L 560 246.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 560 241.12 L 563.5 248.12 L 560 246.37 L 556.5 248.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="10" y="70" width="220" height="160" fill="#ffe6cc" stroke="#d79b00" pointer-events="all"/><rect x="77.5" y="70" width="85" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 83px; height: 1px; padding-top: 80px; margin-left: 79px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>stores.Remote</div></div></div></div></foreignObject><text x="120" y="84" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">stores.Remote</text></switch></g><rect x="30" y="130" width="170" height="100" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><rect x="80" y="130" width="70" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 140px; margin-left: 81px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">stores.Local</div></div></div></foreignObject><text x="115" y="144" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">stores.Local</text></switch></g><rect x="80" y="150" width="120" height="20" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><rect x="100" y="150" width="100" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 160px; margin-left: 101px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">stores.SectorIndex</div></div></div></foreignObject><text x="150" y="164" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">stores.SectorInd...</text></switch></g><rect x="40" y="180" width="100" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 190px; margin-left: 41px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>localPaths []string</div></div></div></div></foreignObject><text x="90" y="194" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">localPaths []str...</text></switch></g><rect x="40" y="200" width="70" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 210px; margin-left: 41px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">urls []string</div></div></div></foreignObject><text x="75" y="214" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">urls []stri...</text></switch></g><rect x="110" y="100" width="120" height="20" fill="#ffe6cc" stroke="#d79b00" pointer-events="all"/><rect x="110" y="100" width="120" height="20" fill="#ffe6cc" stroke="#d79b00" pointer-events="all"/><rect x="130" y="100" width="100" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 110px; margin-left: 131px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">stores.SectorIndex</div></div></div></foreignObject><text x="180" y="114" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">stores.SectorInd...</text></switch></g><path d="M 200 180 L 200 170 L 493.63 170" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 498.88 170 L 491.88 173.5 L 493.63 170 L 491.88 166.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 230 150 L 230 140 L 493.63 140" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 498.88 140 L 491.88 143.5 L 493.63 140 L 491.88 136.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 145 390 L 145 430 L 145 430 L 145 463.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 145 468.88 L 141.5 461.88 L 145 463.63 L 148.5 461.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="20" y="300" width="250" height="90" fill="#ffff88" stroke="#36393d" pointer-events="all"/><rect x="85" y="300" width="120" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 310px; margin-left: 86px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">specs-storage.Prover</div></div></div></foreignObject><text x="145" y="314" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">specs-storage.Prover</text></switch></g><rect x="170" y="350" width="90" height="30" fill="#ffff88" stroke="#36393d" pointer-events="all"/><rect x="170" y="355" width="90" height="25" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 368px; margin-left: 171px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">ronlyProvider</div></div></div></foreignObject><text x="215" y="371" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">ronlyProvider</text></switch></g><path d="M 157.5 230 L 157.5 290 L 215 290 L 215 343.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 215 348.88 L 211.5 341.88 L 215 343.63 L 218.5 341.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 230 110 L 230 110" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 230 110 L 230 110 L 230 110 L 230 110 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="340" y="70" width="120" height="20" fill="#b1ddf0" stroke="#10739e" pointer-events="all"/><rect x="340" y="70" width="120" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 80px; margin-left: 341px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">stores.Index</div></div></div></foreignObject><text x="400" y="84" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">stores.Index</text></switch></g><path d="M 400 90 L 400 110 L 236.37 110" fill="none" stroke="#10739e" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 231.12 110 L 238.12 106.5 L 236.37 110 L 238.12 113.5 Z" fill="#10739e" stroke="#10739e" stroke-miterlimit="10" pointer-events="all"/><path d="M 400 90 L 400 200 L 493.63 200" fill="none" stroke="#10739e" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 498.88 200 L 491.88 203.5 L 493.63 200 L 491.88 196.5 Z" fill="#10739e" stroke="#10739e" stroke-miterlimit="10" pointer-events="all"/><path d="M 400 90 L 400 160 L 206.37 160" fill="none" stroke="#10739e" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 201.12 160 L 208.12 156.5 L 206.37 160 L 208.12 163.5 Z" fill="#10739e" stroke="#10739e" stroke-miterlimit="10" pointer-events="all"/><rect x="415" y="470" width="120" height="30" fill="#fad9d5" stroke="#ae4132" pointer-events="all"/><rect x="435" y="470" width="80" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 485px; margin-left: 436px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">FetchHandler</div></div></div></foreignObject><text x="475" y="489" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">FetchHandler</text></switch></g><rect x="30" y="320" width="140" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><rect x="55" y="320" width="90" height="24" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 332px; margin-left: 56px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>ffiwrapper.Sealer</div></div></div></div></foreignObject><text x="100" y="336" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">ffiwrapper.Seal...</text></switch></g><rect x="85" y="356" width="85" height="24" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 83px; height: 1px; padding-top: 368px; margin-left: 86px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">SectorProvider</div></div></div></foreignObject><text x="128" y="372" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">SectorProvider</text></switch></g><path d="M 170 350 L 95 350 Q 85 350 85 360 L 85 380" fill="none" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 270 470 L 270 450 L 327.5 450 L 327.5 416.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 327.5 411.12 L 331 418.12 L 327.5 416.37 L 324 418.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="225" y="470" width="180" height="30" fill="#fad9d5" stroke="#ae4132" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 178px; height: 1px; padding-top: 485px; margin-left: 226px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>specs-storage.[Sealer,Storage]</div></div></div></div></foreignObject><text x="315" y="489" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">specs-storage.[Sealer,Storage]</text></switch></g><rect x="75" y="470" width="140" height="30" fill="#fad9d5" stroke="#ae4132" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 485px; margin-left: 76px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">specs-storage.Prover</div></div></div></foreignObject><text x="145" y="489" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">specs-storage.Prover</text></switch></g><rect x="715" y="440" width="120" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 450px; margin-left: 716px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Manager API</div></div></div></foreignObject><text x="775" y="454" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Manager API</text></switch></g><path d="M 157.5 230 L 157.5 290 L 280 290 L 280 430 L 475 430 L 475 463.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 475 468.88 L 471.5 461.88 L 475 463.63 L 478.5 461.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="290" y="220" width="150" height="190" rx="22.5" ry="22.5" fill="#fad9d5" stroke="#ae4132" stroke-dasharray="3 3" pointer-events="all"/><rect x="335" y="220" width="60" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 230px; margin-left: 336px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Scheduler</div></div></div></foreignObject><text x="365" y="234" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Scheduler</text></switch></g><rect x="320" y="240" width="120" height="110" fill="#fad9d5" stroke="#ae4132" stroke-dasharray="3 3" pointer-events="all"/><rect x="320" y="240" width="120" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 250px; margin-left: 321px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">[]workerHandle</div></div></div></foreignObject><text x="380" y="254" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">[]workerHandle</text></switch></g><rect x="340" y="260" width="100" height="40" fill="#fad9d5" stroke="#ae4132" stroke-dasharray="3 3" pointer-events="all"/><rect x="395" y="260" width="45" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 43px; height: 1px; padding-top: 270px; margin-left: 396px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Worker</div></div></div></foreignObject><text x="418" y="274" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Worker</text></switch></g><rect x="390" y="305" width="40" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 315px; margin-left: 391px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">WorkerInfo</div></div></div></foreignObject><text x="410" y="319" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Worker...</text></switch></g><rect x="370" y="320" width="70" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 330px; margin-left: 371px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">resourceInfo</div></div></div></foreignObject><text x="405" y="334" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">resourceInfo</text></switch></g><path d="M 380 350 L 380 350" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 380 350 L 380 350 L 380 350 L 380 350 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="330" y="380" width="70" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 390px; margin-left: 331px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">schedQueue</div></div></div></foreignObject><text x="365" y="394" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">schedQueue</text></switch></g><rect x="545" y="470" width="120" height="30" fill="#b1ddf0" stroke="#10739e" stroke-dasharray="3 3" pointer-events="all"/><path d="M 575 466.13 L 575 410 L 480 410 L 480 200" fill="none" stroke="#10739e" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 575 471.38 L 571.5 464.38 L 575 466.13 L 578.5 464.38 Z" fill="#10739e" stroke="#10739e" stroke-miterlimit="10" pointer-events="all"/><path d="M 600 503.87 L 600 533.8 L 650 533.8 L 650 570" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 600 498.62 L 603.5 505.62 L 600 503.87 L 596.5 505.62 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="550" y="472.5" width="100" height="25" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 485px; margin-left: 551px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">stores.SectorIndex</div></div></div></foreignObject><text x="600" y="489" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">stores.SectorInd...</text></switch></g><rect x="347.5" y="40" width="145" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 143px; height: 1px; padding-top: 50px; margin-left: 349px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">sector-storage.Manager</div></div></div></foreignObject><text x="420" y="54" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">sector-storage.Manager</text></switch></g><path d="M 712.5 470 L 690 470 L 690 400 L 470 400 L 470 290 L 446.37 290" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 441.12 290 L 448.12 286.5 L 446.37 290 L 448.12 293.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="675" y="470" width="150" height="30" fill="none" stroke="#000000" pointer-events="all"/><path d="M 750 501.37 L 750 532.5 L 735 532.5 L 735 570" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 750 496.12 L 753.5 503.12 L 750 501.37 L 746.5 503.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="675" y="475" width="150" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 485px; margin-left: 676px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">worker management APIs</div></div></div></foreignObject><text x="750" y="489" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">worker management APIs</text></switch></g><rect x="0" y="0" width="120" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 15px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Filecoin 'Miner' Node</div></div></div></foreignObject><text x="60" y="19" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Filecoin 'Miner' Node</text></switch></g><rect x="330" y="560" width="490" height="80" fill="none" stroke="#000000" pointer-events="all"/><rect x="330" y="560" width="60" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 570px; margin-left: 331px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">HTTP API</div></div></div></foreignObject><text x="360" y="574" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">HTTP API</text></switch></g><rect x="350" y="610" width="120" height="30" fill="#bac8d3" stroke="#23445d" pointer-events="all"/><rect x="370" y="610" width="80" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 625px; margin-left: 371px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">/remote</div></div></div></foreignObject><text x="410" y="629" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">/remote</text></switch></g><path d="M 410 603.63 L 410 530 L 475 530 L 475 500" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 410 608.88 L 406.5 601.88 L 410 603.63 L 413.5 601.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="480" y="570" width="340" height="70" fill="none" stroke="#000000" pointer-events="all"/><rect x="480" y="570" width="60" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 580px; margin-left: 481px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>JsonRPC</div></div></div></div></foreignObject><text x="510" y="584" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">JsonRPC</text></switch></g><path d="M 550 646.37 L 550 660 L 300 660 L 300 680" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 550 641.12 L 553.5 648.12 L 550 646.37 L 546.5 648.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="490" y="610" width="120" height="30" fill="none" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 625px; margin-left: 491px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">/rpc/v0</div></div></div></foreignObject><text x="550" y="629" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">/rpc/v0</text></switch></g><rect x="291" y="780" width="285" height="210" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/><rect x="396" y="780" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 790px; margin-left: 397px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>LocalWorker</div></div></div></div></foreignObject><text x="436" y="794" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">LocalWorker</text></switch></g><path d="M 411 840 L 431 840 L 431 900 L 417.37 900" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 412.12 900 L 419.12 896.5 L 417.37 900 L 419.12 903.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="291" y="830" width="120" height="20" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/><rect x="291" y="830" width="70" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 840px; margin-left: 292px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">stores.Local</div></div></div></foreignObject><text x="326" y="844" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">stores.Local</text></switch></g><path d="M 411 810 L 501 810 L 501 943.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 501 948.88 L 497.5 941.88 L 501 943.63 L 504.5 941.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="291" y="800" width="120" height="20" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/><path d="M 284.63 810 L 260.5 810 L 260.5 820 L 230 820" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 289.88 810 L 282.88 813.5 L 284.63 810 L 282.88 806.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="291" y="800" width="70" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 810px; margin-left: 292px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">stores.Store</div></div></div></foreignObject><text x="326" y="814" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">stores.Store</text></switch></g><path d="M 411 870 L 471 870 L 471 943.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 471 948.88 L 467.5 941.88 L 471 943.63 L 474.5 941.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="291" y="860" width="120" height="20" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/><path d="M 284.63 870 L 270.3 870 L 270.25 700" fill="none" stroke="#10739e" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 289.88 870 L 282.88 873.5 L 284.63 870 L 282.88 866.5 Z" fill="#10739e" stroke="#10739e" stroke-miterlimit="10" pointer-events="all"/><rect x="291" y="860" width="100" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 870px; margin-left: 292px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">stores.SectorIndex</div></div></div></foreignObject><text x="341" y="874" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">stores.SectorInd...</text></switch></g><rect x="301" y="920" width="140" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><rect x="326" y="920" width="90" height="24" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 932px; margin-left: 327px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>ffiwrapper.Sealer</div></div></div></div></foreignObject><text x="371" y="936" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">ffiwrapper.Seal...</text></switch></g><rect x="356" y="956" width="85" height="24" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 83px; height: 1px; padding-top: 968px; margin-left: 357px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">SectorProvider</div></div></div></foreignObject><text x="399" y="972" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">SectorProvider</text></switch></g><path d="M 441 950 L 366 950 Q 356 950 356 960 L 356 980" fill="none" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="stroke"/><rect x="441" y="950" width="120" height="30" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 965px; margin-left: 442px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">localProvider</div></div></div></foreignObject><text x="501" y="969" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">localProvider</text></switch></g><path d="M 501 980 L 501 980" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 501 980 L 501 980 L 501 980 L 501 980 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="291" y="890" width="120" height="20" fill="#d5e8d4" stroke="#82b366" stroke-dasharray="3 3" pointer-events="all"/><path d="M 291 900 L 250 900 L 250 715 L 349.63 715" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 354.88 715 L 347.88 718.5 L 349.63 715 L 347.88 711.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="291" y="890" width="40" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 900px; margin-left: 292px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Worker</div></div></div></foreignObject><text x="311" y="904" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Worker</text></switch></g><path d="M 348.5 920 L 351 920 L 351 916.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 351 911.12 L 354.5 918.12 L 351 916.37 L 347.5 918.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="10" y="740" width="220" height="160" fill="#ffe6cc" stroke="#d79b00" pointer-events="all"/><rect x="77.5" y="740" width="85" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 83px; height: 1px; padding-top: 750px; margin-left: 79px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>stores.Remote</div></div></div></div></foreignObject><text x="120" y="754" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">stores.Remote</text></switch></g><rect x="30" y="800" width="170" height="100" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><rect x="80" y="800" width="70" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 810px; margin-left: 81px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">stores.Local</div></div></div></foreignObject><text x="115" y="814" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">stores.Local</text></switch></g><rect x="80" y="820" width="120" height="20" fill="#e1d5e7" stroke="#9673a6" pointer-events="all"/><path d="M 206.37 830 L 270.3 830 L 270.25 700" fill="none" stroke="#10739e" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 201.12 830 L 208.12 826.5 L 206.37 830 L 208.12 833.5 Z" fill="#10739e" stroke="#10739e" stroke-miterlimit="10" pointer-events="all"/><rect x="100" y="820" width="100" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 830px; margin-left: 101px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">stores.SectorIndex</div></div></div></foreignObject><text x="150" y="834" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">stores.SectorInd...</text></switch></g><rect x="40" y="850" width="100" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 860px; margin-left: 41px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>localPaths []string</div></div></div></div></foreignObject><text x="90" y="864" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">localPaths []str...</text></switch></g><rect x="40" y="870" width="70" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 880px; margin-left: 41px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">urls []string</div></div></div></foreignObject><text x="75" y="884" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">urls []stri...</text></switch></g><rect x="110" y="770" width="120" height="20" fill="#ffe6cc" stroke="#d79b00" pointer-events="all"/><rect x="110" y="770" width="120" height="20" fill="#ffe6cc" stroke="#d79b00" pointer-events="all"/><rect x="130" y="770" width="100" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 780px; margin-left: 131px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">stores.SectorIndex</div></div></div></foreignObject><text x="180" y="784" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">stores.SectorInd...</text></switch></g><path d="M 230 780 L 230 780" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 230 780 L 230 780 L 230 780 L 230 780 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="181" y="680" width="139" height="20" fill="none" stroke="#000000" pointer-events="all"/><path d="M 240.5 706.37 L 240.5 720 L 200 720" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 240.5 701.12 L 244 708.12 L 240.5 706.37 L 237 708.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="181" y="680" width="119" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 117px; height: 1px; padding-top: 690px; margin-left: 182px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Miner JsonRPC client</div></div></div></foreignObject><text x="241" y="694" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Miner JsonRPC client</text></switch></g><rect x="15" y="710" width="185" height="20" rx="3" ry="3" fill="none" stroke="#000000" stroke-dasharray="3 3" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 183px; height: 1px; padding-top: 720px; margin-left: 16px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">miner.Register(remoteWorker)</div></div></div></foreignObject><text x="108" y="724" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">miner.Register(remoteWorker)</text></switch></g><rect x="330" y="680" width="269" height="90" fill="none" stroke="#000000" stroke-dasharray="3 3" pointer-events="all"/><rect x="540" y="750" width="59" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 57px; height: 1px; padding-top: 760px; margin-left: 541px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">HTTP API</div></div></div></foreignObject><text x="570" y="764" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">HTTP API</text></switch></g><rect x="489" y="700" width="101" height="20" fill="#fad9d5" stroke="#ae4132" pointer-events="all"/><path d="M 521 726.37 L 521 760 L 72.5 760 L 72.5 800" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 521 721.12 L 524.5 728.12 L 521 726.37 L 517.5 728.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="501" y="700" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 710px; margin-left: 502px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">FetchHandler</div></div></div></foreignObject><text x="541" y="714" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">FetchHandler</text></switch></g><rect x="514.5" y="680" width="50" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 690px; margin-left: 516px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">/remote</div></div></div></foreignObject><text x="540" y="694" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">/remote</text></switch></g><rect x="341" y="680" width="120" height="70" fill="none" stroke="#000000" pointer-events="all"/><rect x="356" y="705" width="89" height="20" fill="#fff2cc" stroke="#d6b656" stroke-dasharray="3 3" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 87px; height: 1px; padding-top: 715px; margin-left: 357px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">RemoteWorker</div></div></div></foreignObject><text x="401" y="719" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">RemoteWorker</text></switch></g><rect x="341" y="680" width="69" height="20" fill="none" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 67px; height: 1px; padding-top: 690px; margin-left: 342px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">/rpc/v0</div></div></div></foreignObject><text x="376" y="694" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">/rpc/v0</text></switch></g><rect x="341" y="730" width="59" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 57px; height: 1px; padding-top: 740px; margin-left: 342px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">JsonRPC</div></div></div></foreignObject><text x="371" y="744" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">JsonRPC</text></switch></g><path d="M 284.63 840 L 210 840 L 210 850 L 200 850" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 289.88 840 L 282.88 843.5 L 284.63 840 L 282.88 836.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="0" y="680" width="110" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 690px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Seal Worker Node</div></div></div></foreignObject><text x="55" y="694" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Seal Worker Node</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://desk.draw.io/support/solutions/articles/16000042487" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Viewer does not support full SVG 1.1</text></a></switch></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="851px" height="1001px" viewBox="-0.5 -0.5 851 1001" content="<mxfile host="app.diagrams.net" modified="2022-12-15T09:46:16.454Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36" etag="ppr1dJrvkcN22-tXQQDf" version="20.4.0" type="device"><diagram id="6lDjA8ebbJXz-MvvKowY" name="Page-1">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</diagram></mxfile>"><defs/><g><rect x="0" y="680" width="610" height="320" fill="#bac8d3" stroke="#23445d" pointer-events="all"/><rect x="479.5" y="680" width="120" height="50" fill="none" stroke="#000000" pointer-events="all"/><rect x="0" y="0" width="850" height="640" fill="#bac8d3" stroke="#23445d" pointer-events="all"/><rect x="0" y="30" width="840" height="470" fill="#fad9d5" stroke="#ae4132" pointer-events="all"/><rect x="60" y="440" width="770" height="60" fill="#fad9d5" stroke="#ae4132" stroke-dasharray="3 3" pointer-events="all"/><rect x="500" y="110" width="285" height="210" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/><rect x="605" y="110" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 120px; margin-left: 606px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div>LocalWorker</div></div></div></div></foreignObject><text x="645" y="124" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">LocalWorker</text></switch></g><path d="M 620 170 L 640 170 L 640 230 L 626.37 230" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 621.12 230 L 628.12 226.5 L 626.37 230 L 628.12 233.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="500" y="160" width="120" height="20" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/><rect x="500" y="160" width="70" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 170px; margin-left: 501px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">paths.Local</div></div></div></foreignObject><text x="535" y="174" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">paths.Local</text></switch></g><path d="M 620 140 L 710 140 L 710 273.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 710 278.88 L 706.5 271.88 L 710 273.63 L 713.5 271.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="500" y="130" width="120" height="20" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/><rect x="500" y="130" width="70" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 140px; margin-left: 501px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">paths.Store</div></div></div></foreignObject><text x="535" y="144" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">paths.Store</text></switch></g><path d="M 620 200 L 680 200 L 680 273.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 680 278.88 L 676.5 271.88 L 680 273.63 L 683.5 271.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="500" y="190" width="120" height="20" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/><rect x="500" y="190" width="100" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 200px; margin-left: 501px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">paths.SectorIndex</div></div></div></foreignObject><text x="550" y="204" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">paths.SectorIndex</text></switch></g><rect x="510" y="250" width="140" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 262px; margin-left: 536px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><div>ffiwrapper.Sealer</div></div></div></div></foreignObject><text x="580" y="266" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ffiwrapper.Seal...</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 83px; height: 1px; padding-top: 298px; margin-left: 566px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">SectorProvider</div></div></div></foreignObject><text x="608" y="302" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">SectorProvider</text></switch></g><path d="M 650 280 L 575 280 Q 565 280 565 290 L 565 310" fill="none" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="none"/><rect x="650" y="280" width="120" height="30" fill="#d5e8d4" stroke="#82b366" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 295px; margin-left: 651px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">localProvider</div></div></div></foreignObject><text x="710" y="299" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">localProvider</text></switch></g><rect x="500" y="220" width="120" height="20" fill="#d5e8d4" stroke="#82b366" stroke-dasharray="3 3" pointer-events="none"/><path d="M 500 230 L 470 230 L 470 270 L 446.37 270" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 441.12 270 L 448.12 266.5 L 446.37 270 L 448.12 273.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 230px; margin-left: 501px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">Worker</div></div></div></foreignObject><text x="520" y="234" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Worker</text></switch></g><path d="M 557.5 250 L 560 250 L 560 246.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 560 241.12 L 563.5 248.12 L 560 246.37 L 556.5 248.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><rect x="10" y="70" width="220" height="160" fill="#ffe6cc" stroke="#d79b00" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 83px; height: 1px; padding-top: 80px; margin-left: 79px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><div>paths.Remote</div></div></div></div></foreignObject><text x="120" y="84" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">paths.Remote</text></switch></g><rect x="30" y="130" width="170" height="100" fill="#e1d5e7" stroke="#9673a6" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 140px; margin-left: 81px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">paths.Local</div></div></div></foreignObject><text x="115" y="144" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">paths.Local</text></switch></g><rect x="80" y="150" width="120" height="20" fill="#e1d5e7" stroke="#9673a6" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 160px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">paths.SectorIndex</div></div></div></foreignObject><text x="150" y="164" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">paths.SectorIndex</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 190px; margin-left: 41px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><div>localPaths []string</div></div></div></div></foreignObject><text x="90" y="194" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">localPaths []str...</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 210px; margin-left: 41px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">urls []string</div></div></div></foreignObject><text x="75" y="214" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">urls []stri...</text></switch></g><rect x="110" y="100" width="120" height="20" fill="#ffe6cc" stroke="#d79b00" pointer-events="none"/><rect x="110" y="100" width="120" height="20" fill="#ffe6cc" stroke="#d79b00" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 110px; margin-left: 131px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">paths.SectorIndex</div></div></div></foreignObject><text x="180" y="114" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">paths.SectorIndex</text></switch></g><path d="M 200 180 L 200 170 L 493.63 170" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 498.88 170 L 491.88 173.5 L 493.63 170 L 491.88 166.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 230 150 L 230 140 L 493.63 140" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 498.88 140 L 491.88 143.5 L 493.63 140 L 491.88 136.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 145 390 L 145 430 L 145 463.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 145 468.88 L 141.5 461.88 L 145 463.63 L 148.5 461.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><rect x="20" y="300" width="250" height="90" fill="#ffff88" stroke="#36393d" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 310px; margin-left: 86px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">storiface.Prover</div></div></div></foreignObject><text x="145" y="314" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">storiface.Prover</text></switch></g><rect x="170" y="350" width="90" height="30" fill="#ffff88" stroke="#36393d" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 368px; margin-left: 171px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">ronlyProvider</div></div></div></foreignObject><text x="215" y="371" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ronlyProvider</text></switch></g><path d="M 157.5 230 L 157.5 290 L 215 290 L 215 343.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 215 348.88 L 211.5 341.88 L 215 343.63 L 218.5 341.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><rect x="340" y="70" width="120" height="20" fill="#b1ddf0" stroke="#10739e" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 80px; margin-left: 341px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">paths.Index</div></div></div></foreignObject><text x="400" y="84" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">paths.Index</text></switch></g><path d="M 400 90 L 400 110 L 236.37 110" fill="none" stroke="#10739e" stroke-miterlimit="10" pointer-events="none"/><path d="M 231.12 110 L 238.12 106.5 L 236.37 110 L 238.12 113.5 Z" fill="#10739e" stroke="#10739e" stroke-miterlimit="10" pointer-events="none"/><path d="M 400 90 L 400 200 L 493.63 200" fill="none" stroke="#10739e" stroke-miterlimit="10" pointer-events="none"/><path d="M 498.88 200 L 491.88 203.5 L 493.63 200 L 491.88 196.5 Z" fill="#10739e" stroke="#10739e" stroke-miterlimit="10" pointer-events="none"/><path d="M 400 90 L 400 160 L 206.37 160" fill="none" stroke="#10739e" stroke-miterlimit="10" pointer-events="none"/><path d="M 201.12 160 L 208.12 156.5 L 206.37 160 L 208.12 163.5 Z" fill="#10739e" stroke="#10739e" stroke-miterlimit="10" pointer-events="none"/><rect x="415" y="470" width="120" height="30" fill="#fad9d5" stroke="#ae4132" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 485px; margin-left: 436px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">FetchHandler</div></div></div></foreignObject><text x="475" y="489" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">FetchHandler</text></switch></g><rect x="30" y="320" width="140" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 332px; margin-left: 56px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><div>ffiwrapper.Sealer</div></div></div></div></foreignObject><text x="100" y="336" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ffiwrapper.Seal...</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 83px; height: 1px; padding-top: 368px; margin-left: 86px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">SectorProvider</div></div></div></foreignObject><text x="128" y="372" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">SectorProvider</text></switch></g><path d="M 170 350 L 95 350 Q 85 350 85 360 L 85 380" fill="none" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="none"/><path d="M 270 470 L 270 450 L 327.5 450 L 327.5 416.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 327.5 411.12 L 331 418.12 L 327.5 416.37 L 324 418.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><rect x="225" y="470" width="180" height="30" fill="#fad9d5" stroke="#ae4132" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 178px; height: 1px; padding-top: 485px; margin-left: 226px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><div>storiface.[Sealer,Storage]</div></div></div></div></foreignObject><text x="315" y="489" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">storiface.[Sealer,Storage]</text></switch></g><rect x="75" y="470" width="140" height="30" fill="#fad9d5" stroke="#ae4132" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 485px; margin-left: 76px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">storiface.Prover</div></div></div></foreignObject><text x="145" y="489" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">storiface.Prover</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 450px; margin-left: 716px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">Manager API</div></div></div></foreignObject><text x="775" y="454" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Manager API</text></switch></g><path d="M 157.5 230 L 157.5 290 L 280 290 L 280 430 L 475 430 L 475 463.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 475 468.88 L 471.5 461.88 L 475 463.63 L 478.5 461.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><rect x="290" y="220" width="150" height="190" rx="22.5" ry="22.5" fill="#fad9d5" stroke="#ae4132" stroke-dasharray="3 3" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 230px; margin-left: 336px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">Scheduler</div></div></div></foreignObject><text x="365" y="234" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Scheduler</text></switch></g><rect x="320" y="240" width="120" height="110" fill="#fad9d5" stroke="#ae4132" stroke-dasharray="3 3" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 250px; margin-left: 321px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">[]workerHandle</div></div></div></foreignObject><text x="380" y="254" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">[]workerHandle</text></switch></g><rect x="340" y="260" width="100" height="40" fill="#fad9d5" stroke="#ae4132" stroke-dasharray="3 3" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 43px; height: 1px; padding-top: 270px; margin-left: 396px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">Worker</div></div></div></foreignObject><text x="418" y="274" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Worker</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 315px; margin-left: 391px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">WorkerInfo</div></div></div></foreignObject><text x="410" y="319" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Worker...</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 330px; margin-left: 371px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">resourceInfo</div></div></div></foreignObject><text x="405" y="334" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">resourceInfo</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 390px; margin-left: 331px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">schedQueue</div></div></div></foreignObject><text x="365" y="394" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">schedQueue</text></switch></g><rect x="545" y="470" width="120" height="30" fill="#b1ddf0" stroke="#10739e" stroke-dasharray="3 3" pointer-events="none"/><path d="M 575 466.13 L 575 410 L 480 410 L 480 200" fill="none" stroke="#10739e" stroke-miterlimit="10" pointer-events="none"/><path d="M 575 471.38 L 571.5 464.38 L 575 466.13 L 578.5 464.38 Z" fill="#10739e" stroke="#10739e" stroke-miterlimit="10" pointer-events="none"/><path d="M 600 503.87 L 600 533.8 L 650 533.8 L 650 570" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 600 498.62 L 603.5 505.62 L 600 503.87 L 596.5 505.62 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 485px; margin-left: 551px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">paths.SectorIndex</div></div></div></foreignObject><text x="600" y="489" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">paths.SectorIndex</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 143px; height: 1px; padding-top: 50px; margin-left: 330px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">sealer.Manager</div></div></div></foreignObject><text x="401" y="54" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">sealer.Manager</text></switch></g><path d="M 712.5 470 L 690 470 L 690 400 L 470 400 L 470 290 L 446.37 290" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 441.12 290 L 448.12 286.5 L 446.37 290 L 448.12 293.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="675" y="470" width="150" height="30" fill="none" stroke="#000000" pointer-events="none"/><path d="M 750 501.37 L 750 532.5 L 735 532.5 L 735 570" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 750 496.12 L 753.5 503.12 L 750 501.37 L 746.5 503.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 485px; margin-left: 676px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">worker management APIs</div></div></div></foreignObject><text x="750" y="489" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">worker management APIs</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 15px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">'Lotus-Miner' Node</div></div></div></foreignObject><text x="60" y="19" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">'Lotus-Miner' Node</text></switch></g><rect x="330" y="560" width="490" height="80" fill="none" stroke="#000000" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 570px; margin-left: 331px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">HTTP API</div></div></div></foreignObject><text x="360" y="574" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">HTTP API</text></switch></g><rect x="350" y="610" width="120" height="30" fill="#bac8d3" stroke="#23445d" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 625px; margin-left: 371px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">/remote</div></div></div></foreignObject><text x="410" y="629" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">/remote</text></switch></g><path d="M 410 603.63 L 410 530 L 475 530 L 475 500" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 410 608.88 L 406.5 601.88 L 410 603.63 L 413.5 601.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="480" y="570" width="340" height="70" fill="none" stroke="#000000" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 580px; margin-left: 481px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><div>JsonRPC</div></div></div></div></foreignObject><text x="510" y="584" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">JsonRPC</text></switch></g><path d="M 550 646.37 L 550 660 L 300 660 L 300 680" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 550 641.12 L 553.5 648.12 L 550 646.37 L 546.5 648.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="490" y="610" width="120" height="30" fill="none" stroke="#000000" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 625px; margin-left: 491px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">/rpc/v0</div></div></div></foreignObject><text x="550" y="629" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">/rpc/v0</text></switch></g><rect x="291" y="780" width="285" height="210" fill="#d5e8d4" stroke="#82b366" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 790px; margin-left: 397px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><div>LocalWorker</div></div></div></div></foreignObject><text x="436" y="794" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">LocalWorker</text></switch></g><path d="M 411 840 L 431 840 L 431 900 L 417.37 900" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 412.12 900 L 419.12 896.5 L 417.37 900 L 419.12 903.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><rect x="291" y="830" width="120" height="20" fill="#d5e8d4" stroke="#82b366" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 840px; margin-left: 292px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">paths.Local</div></div></div></foreignObject><text x="326" y="844" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">paths.Local</text></switch></g><path d="M 411 810 L 501 810 L 501 943.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 501 948.88 L 497.5 941.88 L 501 943.63 L 504.5 941.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><rect x="291" y="800" width="120" height="20" fill="#d5e8d4" stroke="#82b366" pointer-events="none"/><path d="M 284.63 810 L 260.5 810 L 260.5 820 L 230 820" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 289.88 810 L 282.88 813.5 L 284.63 810 L 282.88 806.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 810px; margin-left: 292px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">paths.Store</div></div></div></foreignObject><text x="326" y="814" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">paths.Store</text></switch></g><path d="M 411 870 L 471 870 L 471 943.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 471 948.88 L 467.5 941.88 L 471 943.63 L 474.5 941.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><rect x="291" y="860" width="120" height="20" fill="#d5e8d4" stroke="#82b366" pointer-events="none"/><path d="M 284.63 870 L 270.3 870 L 270.25 700" fill="none" stroke="#10739e" stroke-miterlimit="10" pointer-events="none"/><path d="M 289.88 870 L 282.88 873.5 L 284.63 870 L 282.88 866.5 Z" fill="#10739e" stroke="#10739e" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 870px; margin-left: 292px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">paths.SectorIndex</div></div></div></foreignObject><text x="341" y="874" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">paths.SectorIndex</text></switch></g><rect x="301" y="920" width="140" height="60" fill="#dae8fc" stroke="#6c8ebf" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 932px; margin-left: 327px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><div>ffiwrapper.Sealer</div></div></div></div></foreignObject><text x="371" y="936" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ffiwrapper.Seal...</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 83px; height: 1px; padding-top: 968px; margin-left: 357px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">SectorProvider</div></div></div></foreignObject><text x="399" y="972" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">SectorProvider</text></switch></g><path d="M 441 950 L 366 950 Q 356 950 356 960 L 356 980" fill="none" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="none"/><rect x="441" y="950" width="120" height="30" fill="#d5e8d4" stroke="#82b366" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 965px; margin-left: 442px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">localProvider</div></div></div></foreignObject><text x="501" y="969" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">localProvider</text></switch></g><rect x="291" y="890" width="120" height="20" fill="#d5e8d4" stroke="#82b366" stroke-dasharray="3 3" pointer-events="none"/><path d="M 291 900 L 250 900 L 250 715 L 349.63 715" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 354.88 715 L 347.88 718.5 L 349.63 715 L 347.88 711.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 900px; margin-left: 292px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">Worker</div></div></div></foreignObject><text x="311" y="904" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Worker</text></switch></g><path d="M 348.5 920 L 351 920 L 351 916.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 351 911.12 L 354.5 918.12 L 351 916.37 L 347.5 918.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><rect x="10" y="740" width="220" height="160" fill="#ffe6cc" stroke="#d79b00" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 83px; height: 1px; padding-top: 750px; margin-left: 79px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><div>paths.Remote</div></div></div></div></foreignObject><text x="120" y="754" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">paths.Remote</text></switch></g><rect x="30" y="800" width="170" height="100" fill="#e1d5e7" stroke="#9673a6" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 810px; margin-left: 81px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">paths.Local</div></div></div></foreignObject><text x="115" y="814" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">paths.Local</text></switch></g><rect x="80" y="820" width="120" height="20" fill="#e1d5e7" stroke="#9673a6" pointer-events="none"/><path d="M 206.37 830 L 270.3 830 L 270.25 700" fill="none" stroke="#10739e" stroke-miterlimit="10" pointer-events="none"/><path d="M 201.12 830 L 208.12 826.5 L 206.37 830 L 208.12 833.5 Z" fill="#10739e" stroke="#10739e" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 830px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">paths.SectorIndex</div></div></div></foreignObject><text x="150" y="834" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">paths.SectorIndex</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 860px; margin-left: 41px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><div>localPaths []string</div></div></div></div></foreignObject><text x="90" y="864" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">localPaths []str...</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 880px; margin-left: 41px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">urls []string</div></div></div></foreignObject><text x="75" y="884" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">urls []stri...</text></switch></g><rect x="110" y="770" width="120" height="20" fill="#ffe6cc" stroke="#d79b00" pointer-events="none"/><rect x="110" y="770" width="120" height="20" fill="#ffe6cc" stroke="#d79b00" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 780px; margin-left: 131px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">paths.SectorIndex</div></div></div></foreignObject><text x="180" y="784" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">paths.SectorIndex</text></switch></g><rect x="181" y="680" width="139" height="20" fill="none" stroke="#000000" pointer-events="none"/><path d="M 240.5 706.37 L 240.5 720 L 200 720" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 240.5 701.12 L 244 708.12 L 240.5 706.37 L 237 708.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 117px; height: 1px; padding-top: 690px; margin-left: 182px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">Miner JsonRPC client</div></div></div></foreignObject><text x="241" y="694" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Miner JsonRPC client</text></switch></g><rect x="15" y="710" width="185" height="20" rx="3" ry="3" fill="none" stroke="#000000" stroke-dasharray="3 3" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 183px; height: 1px; padding-top: 720px; margin-left: 16px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">miner.Register(remoteWorker)</div></div></div></foreignObject><text x="108" y="724" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">miner.Register(remoteWorker)</text></switch></g><rect x="330" y="680" width="269" height="90" fill="none" stroke="#000000" stroke-dasharray="3 3" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 57px; height: 1px; padding-top: 760px; margin-left: 541px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">HTTP API</div></div></div></foreignObject><text x="570" y="764" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">HTTP API</text></switch></g><rect x="489" y="700" width="101" height="20" fill="#fad9d5" stroke="#ae4132" pointer-events="none"/><path d="M 521 726.37 L 521 760 L 72.5 760 L 72.5 800" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 521 721.12 L 524.5 728.12 L 521 726.37 L 517.5 728.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 710px; margin-left: 502px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">FetchHandler</div></div></div></foreignObject><text x="541" y="714" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">FetchHandler</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 690px; margin-left: 516px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">/remote</div></div></div></foreignObject><text x="540" y="694" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">/remote</text></switch></g><rect x="341" y="680" width="120" height="70" fill="none" stroke="#000000" pointer-events="none"/><rect x="356" y="705" width="89" height="20" fill="#fff2cc" stroke="#d6b656" stroke-dasharray="3 3" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 87px; height: 1px; padding-top: 715px; margin-left: 357px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">RemoteWorker</div></div></div></foreignObject><text x="401" y="719" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">RemoteWorker</text></switch></g><rect x="341" y="680" width="69" height="20" fill="none" stroke="#000000" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 67px; height: 1px; padding-top: 690px; margin-left: 342px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">/rpc/v0</div></div></div></foreignObject><text x="376" y="694" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">/rpc/v0</text></switch></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 57px; height: 1px; padding-top: 740px; margin-left: 342px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">JsonRPC</div></div></div></foreignObject><text x="371" y="744" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">JsonRPC</text></switch></g><path d="M 284.63 840 L 210 840 L 210 850 L 200 850" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 289.88 840 L 282.88 843.5 L 284.63 840 L 282.88 836.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 690px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">'Lotus-Worker' node</div></div></div></foreignObject><text x="55" y="694" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">'Lotus-Worker' node</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file