diff --git a/plugins/analysis/client/parameters.go b/plugins/analysis/client/parameters.go
index b875fadf36853578cfc8ef31e1d843459e72cfa5..d8db0874b6960bbedc4f08dc2b788c6aef225b77 100644
--- a/plugins/analysis/client/parameters.go
+++ b/plugins/analysis/client/parameters.go
@@ -5,9 +5,10 @@ import (
 )
 
 const (
-	CFG_SERVER_ADDRESS = "analysis.client.serverAddress"
+	CfgServerAddress = "analysis.client.serverAddress"
+	ReportInterval   = 5
 )
 
 func init() {
-	flag.String(CFG_SERVER_ADDRESS, "ressims.iota.cafe:188", "tcp server for collecting analysis information")
+	flag.String(CfgServerAddress, "ressims.iota.cafe:188", "tcp server for collecting analysis information")
 }
diff --git a/plugins/analysis/client/plugin.go b/plugins/analysis/client/plugin.go
index 18c8fa6ce470095eed6b3806ca97f37b4f45bcff..e73a0e98d85e85a9a64f7d77aa7346be3f00f513 100644
--- a/plugins/analysis/client/plugin.go
+++ b/plugins/analysis/client/plugin.go
@@ -3,24 +3,17 @@ package client
 import (
 	"encoding/hex"
 	"net"
+	"strings"
 	"sync"
 	"time"
 
-	"github.com/iotaledger/hive.go/autopeering/discover"
-	"github.com/iotaledger/hive.go/autopeering/selection"
+	"github.com/iotaledger/goshimmer/plugins/analysis/types/heartbeat"
 	"github.com/iotaledger/hive.go/daemon"
-	"github.com/iotaledger/hive.go/events"
 	"github.com/iotaledger/hive.go/logger"
 	"github.com/iotaledger/hive.go/network"
 	"github.com/iotaledger/hive.go/node"
-	"github.com/iotaledger/hive.go/timeutil"
 
 	"github.com/iotaledger/goshimmer/packages/shutdown"
-	"github.com/iotaledger/goshimmer/plugins/analysis/types/addnode"
-	"github.com/iotaledger/goshimmer/plugins/analysis/types/connectnodes"
-	"github.com/iotaledger/goshimmer/plugins/analysis/types/disconnectnodes"
-	"github.com/iotaledger/goshimmer/plugins/analysis/types/ping"
-	"github.com/iotaledger/goshimmer/plugins/analysis/types/removenode"
 	"github.com/iotaledger/goshimmer/plugins/autopeering"
 	"github.com/iotaledger/goshimmer/plugins/autopeering/local"
 	"github.com/iotaledger/goshimmer/plugins/config"
@@ -32,27 +25,22 @@ var connLock sync.Mutex
 func Run(plugin *node.Plugin) {
 	log = logger.NewLogger("Analysis-Client")
 	daemon.BackgroundWorker("Analysis Client", func(shutdownSignal <-chan struct{}) {
-		shuttingDown := false
-
-		for !shuttingDown {
+		ticker := time.NewTicker(ReportInterval * time.Second)
+		defer ticker.Stop()
+		for {
 			select {
 			case <-shutdownSignal:
 				return
 
-			default:
-				if conn, err := net.Dial("tcp", config.Node.GetString(CFG_SERVER_ADDRESS)); err != nil {
+			case <-ticker.C:
+				conn, err := net.Dial("tcp", config.Node.GetString(CfgServerAddress))
+				if err != nil {
 					log.Debugf("Could not connect to reporting server: %s", err.Error())
-
-					timeutil.Sleep(1*time.Second, shutdownSignal)
-				} else {
-					managedConn := network.NewManagedConnection(conn)
-					eventDispatchers := getEventDispatchers(managedConn)
-
-					reportCurrentStatus(eventDispatchers)
-					setupHooks(plugin, managedConn, eventDispatchers)
-
-					shuttingDown = keepConnectionAlive(managedConn, shutdownSignal)
+					continue
 				}
+				managedConn := network.NewManagedConnection(conn)
+				eventDispatchers := getEventDispatchers(managedConn)
+				reportHeartbeat(eventDispatchers)
 			}
 		}
 	}, shutdown.PriorityAnalysis)
@@ -60,135 +48,63 @@ func Run(plugin *node.Plugin) {
 
 func getEventDispatchers(conn *network.ManagedConnection) *EventDispatchers {
 	return &EventDispatchers{
-		AddNode: func(nodeId []byte) {
-			log.Debugw("AddNode", "nodeId", hex.EncodeToString(nodeId))
-			connLock.Lock()
-			_, _ = conn.Write((&addnode.Packet{NodeId: nodeId}).Marshal())
-			connLock.Unlock()
-		},
-		RemoveNode: func(nodeId []byte) {
-			log.Debugw("RemoveNode", "nodeId", hex.EncodeToString(nodeId))
-			connLock.Lock()
-			_, _ = conn.Write((&removenode.Packet{NodeId: nodeId}).Marshal())
-			connLock.Unlock()
-		},
-		ConnectNodes: func(sourceId []byte, targetId []byte) {
-			log.Debugw("ConnectNodes", "sourceId", hex.EncodeToString(sourceId), "targetId", hex.EncodeToString(targetId))
-			connLock.Lock()
-			_, _ = conn.Write((&connectnodes.Packet{SourceId: sourceId, TargetId: targetId}).Marshal())
-			connLock.Unlock()
-		},
-		DisconnectNodes: func(sourceId []byte, targetId []byte) {
-			log.Debugw("DisconnectNodes", "sourceId", hex.EncodeToString(sourceId), "targetId", hex.EncodeToString(targetId))
+		Heartbeat: func(packet *heartbeat.Packet) {
+			var out strings.Builder
+			for _, value := range packet.OutboundIDs {
+				out.WriteString(hex.EncodeToString(value))
+			}
+			var in strings.Builder
+			for _, value := range packet.InboundIDs {
+				in.WriteString(hex.EncodeToString(value))
+			}
+			log.Debugw(
+				"Heartbeat",
+				"nodeId", hex.EncodeToString(packet.OwnID),
+				"outboundIds", out.String(),
+				"inboundIds", in.String(),
+			)
+
+			// Marshal() copies the content of packet, it doesn't modify it.
+			data, err := packet.Marshal()
+			if err != nil {
+				log.Info(err, " - heartbeat message skipped")
+				return
+			}
+
 			connLock.Lock()
-			_, _ = conn.Write((&disconnectnodes.Packet{SourceId: sourceId, TargetId: targetId}).Marshal())
-			connLock.Unlock()
+			defer connLock.Unlock()
+			if _, err = conn.Write(data); err != nil {
+				log.Debugw("Error while writing to connection", "Description", err)
+			}
 		},
 	}
 }
 
-func reportCurrentStatus(eventDispatchers *EventDispatchers) {
+func reportHeartbeat(dispatchers *EventDispatchers) {
+	// Get own ID
+	var nodeID []byte
 	if local.GetInstance() != nil {
-		eventDispatchers.AddNode(local.GetInstance().ID().Bytes())
+		// Doesn't copy the ID, take care not to modify underlying bytearray!
+		nodeID = local.GetInstance().ID().Bytes()
 	}
 
-	reportKnownPeers(eventDispatchers)
-	reportChosenNeighbors(eventDispatchers)
-	reportAcceptedNeighbors(eventDispatchers)
-}
-
-func setupHooks(plugin *node.Plugin, conn *network.ManagedConnection, eventDispatchers *EventDispatchers) {
-	// define hooks ////////////////////////////////////////////////////////////////////////////////////////////////////
-
-	onDiscoverPeer := events.NewClosure(func(ev *discover.DiscoveredEvent) {
-		eventDispatchers.AddNode(ev.Peer.ID().Bytes())
-	})
-
-	onDeletePeer := events.NewClosure(func(ev *discover.DeletedEvent) {
-		eventDispatchers.RemoveNode(ev.Peer.ID().Bytes())
-	})
-
-	onAddChosenNeighbor := events.NewClosure(func(ev *selection.PeeringEvent) {
-		if ev.Status {
-			eventDispatchers.ConnectNodes(local.GetInstance().ID().Bytes(), ev.Peer.ID().Bytes())
-		}
-	})
-
-	onAddAcceptedNeighbor := events.NewClosure(func(ev *selection.PeeringEvent) {
-		if ev.Status {
-			eventDispatchers.ConnectNodes(ev.Peer.ID().Bytes(), local.GetInstance().ID().Bytes())
-		}
-	})
-
-	onRemoveNeighbor := events.NewClosure(func(ev *selection.DroppedEvent) {
-		eventDispatchers.DisconnectNodes(ev.DroppedID.Bytes(), local.GetInstance().ID().Bytes())
-	})
-
-	// setup hooks /////////////////////////////////////////////////////////////////////////////////////////////////////
-
-	discover.Events.PeerDiscovered.Attach(onDiscoverPeer)
-	discover.Events.PeerDeleted.Attach(onDeletePeer)
-	selection.Events.IncomingPeering.Attach(onAddAcceptedNeighbor)
-	selection.Events.OutgoingPeering.Attach(onAddChosenNeighbor)
-	selection.Events.Dropped.Attach(onRemoveNeighbor)
-
-	// clean up hooks on close /////////////////////////////////////////////////////////////////////////////////////////
-
-	var onClose *events.Closure
-	onClose = events.NewClosure(func() {
-		discover.Events.PeerDiscovered.Detach(onDiscoverPeer)
-		discover.Events.PeerDeleted.Detach(onDeletePeer)
-		selection.Events.IncomingPeering.Detach(onAddAcceptedNeighbor)
-		selection.Events.OutgoingPeering.Detach(onAddChosenNeighbor)
-		selection.Events.Dropped.Detach(onRemoveNeighbor)
-
-		conn.Events.Close.Detach(onClose)
-	})
-	conn.Events.Close.Attach(onClose)
-}
-
-func reportKnownPeers(dispatchers *EventDispatchers) {
-	if autopeering.Discovery != nil {
-		for _, peer := range autopeering.Discovery.GetVerifiedPeers() {
-			dispatchers.AddNode(peer.ID().Bytes())
-		}
-	}
-}
-
-func reportChosenNeighbors(dispatchers *EventDispatchers) {
-	if autopeering.Selection != nil {
-		for _, chosenNeighbor := range autopeering.Selection.GetOutgoingNeighbors() {
-			//dispatchers.AddNode(chosenNeighbor.ID().Bytes())
-			dispatchers.ConnectNodes(local.GetInstance().ID().Bytes(), chosenNeighbor.ID().Bytes())
-		}
+	// Get outboundIds (chosen neighbors)
+	outgoingNeighbors := autopeering.Selection.GetOutgoingNeighbors()
+	outboundIds := make([][]byte, len(outgoingNeighbors))
+	for i, neighbor := range outgoingNeighbors {
+		// Doesn't copy the ID, take care not to modify underlying bytearray!
+		outboundIds[i] = neighbor.ID().Bytes()
 	}
-}
 
-func reportAcceptedNeighbors(dispatchers *EventDispatchers) {
-	if autopeering.Selection != nil {
-		for _, acceptedNeighbor := range autopeering.Selection.GetIncomingNeighbors() {
-			//dispatchers.AddNode(acceptedNeighbor.ID().Bytes())
-			dispatchers.ConnectNodes(acceptedNeighbor.ID().Bytes(), local.GetInstance().ID().Bytes())
-		}
+	// Get inboundIds (accepted neighbors)
+	incomingNeighbors := autopeering.Selection.GetIncomingNeighbors()
+	inboundIds := make([][]byte, len(incomingNeighbors))
+	for i, neighbor := range incomingNeighbors {
+		// Doesn't copy the ID, take care not to modify underlying bytearray!
+		inboundIds[i] = neighbor.ID().Bytes()
 	}
-}
 
-func keepConnectionAlive(conn *network.ManagedConnection, shutdownSignal <-chan struct{}) bool {
-	go conn.Read(make([]byte, 1))
+	packet := &heartbeat.Packet{OwnID: nodeID, OutboundIDs: outboundIds, InboundIDs: inboundIds}
 
-	ticker := time.NewTicker(1 * time.Second)
-	for {
-		select {
-		case <-shutdownSignal:
-			return true
-
-		case <-ticker.C:
-			connLock.Lock()
-			if _, err := conn.Write((&ping.Packet{}).Marshal()); err != nil {
-				connLock.Unlock()
-				return false
-			}
-			connLock.Unlock()
-		}
-	}
+	dispatchers.Heartbeat(packet)
 }
diff --git a/plugins/analysis/client/types.go b/plugins/analysis/client/types.go
index dabbb160013a8823d2bcb0b2c8d87dfe97834d15..9e29eb5390d11ce6504ae2115e9f754a40cd2a50 100644
--- a/plugins/analysis/client/types.go
+++ b/plugins/analysis/client/types.go
@@ -1,8 +1,7 @@
 package client
 
+import "github.com/iotaledger/goshimmer/plugins/analysis/types/heartbeat"
+
 type EventDispatchers struct {
-	AddNode         func(nodeId []byte)
-	RemoveNode      func(nodeId []byte)
-	ConnectNodes    func(sourceId []byte, targetId []byte)
-	DisconnectNodes func(sourceId []byte, targetId []byte)
+	Heartbeat func(*heartbeat.Packet)
 }
diff --git a/plugins/analysis/plugin.go b/plugins/analysis/plugin.go
index dd5dea3bdf5a6a0b3c56baef33cacf0d929b99f8..dd65e237fe26b591e10d99d71509f2d15d9fed52 100644
--- a/plugins/analysis/plugin.go
+++ b/plugins/analysis/plugin.go
@@ -15,21 +15,21 @@ var log *logger.Logger
 
 func configure(plugin *node.Plugin) {
 	log = logger.NewLogger("Analysis")
-	if config.Node.GetInt(server.CFG_SERVER_PORT) != 0 {
+	if config.Node.GetInt(server.CfgServerPort) != 0 {
 		webinterface.Configure(plugin)
 		server.Configure(plugin)
 	}
 }
 
 func run(plugin *node.Plugin) {
-	if config.Node.GetInt(server.CFG_SERVER_PORT) != 0 {
+	if config.Node.GetInt(server.CfgServerPort) != 0 {
 		webinterface.Run(plugin)
 		server.Run(plugin)
 	} else {
 		log.Info("Server is disabled (server-port is 0)")
 	}
 
-	if config.Node.GetString(client.CFG_SERVER_ADDRESS) != "" {
+	if config.Node.GetString(client.CfgServerAddress) != "" {
 		client.Run(plugin)
 	} else {
 		log.Info("Client is disabled (server-address is empty)")
diff --git a/plugins/analysis/server/constants.go b/plugins/analysis/server/constants.go
index b4c1f739dd4a89df83743403082fcf930e553634..844fc02729cacb3d36c86681bacadaedac4773f0 100644
--- a/plugins/analysis/server/constants.go
+++ b/plugins/analysis/server/constants.go
@@ -3,22 +3,11 @@ package server
 import (
 	"time"
 
-	"github.com/iotaledger/goshimmer/plugins/analysis/types/addnode"
-	"github.com/iotaledger/goshimmer/plugins/analysis/types/connectnodes"
-	"github.com/iotaledger/goshimmer/plugins/analysis/types/disconnectnodes"
-	"github.com/iotaledger/goshimmer/plugins/analysis/types/ping"
-	"github.com/iotaledger/goshimmer/plugins/analysis/types/removenode"
+	"github.com/iotaledger/goshimmer/plugins/analysis/types/heartbeat"
 )
 
 const (
-	IDLE_TIMEOUT = 5 * time.Second
+	IdleTimeout = 10 * time.Second
 
-	STATE_INITIAL          = byte(255)
-	STATE_INITIAL_ADDNODE  = byte(254)
-	STATE_CONSECUTIVE      = byte(253)
-	STATE_PING             = ping.MARSHALED_PACKET_HEADER
-	STATE_ADD_NODE         = addnode.MARSHALED_PACKET_HEADER
-	STATE_REMOVE_NODE      = removenode.MARSHALED_PACKET_HEADER
-	STATE_CONNECT_NODES    = connectnodes.MARSHALED_PACKET_HEADER
-	STATE_DISCONNECT_NODES = disconnectnodes.MARSHALED_PACKET_HEADER
+	StateHeartbeat = heartbeat.MarshaledPacketHeader
 )
diff --git a/plugins/analysis/server/events.go b/plugins/analysis/server/events.go
index 979dddec563888fc68a2c18a572a8f3f83741d83..9e88d60a9920f91eeb6f46819207a3cb815ab48d 100644
--- a/plugins/analysis/server/events.go
+++ b/plugins/analysis/server/events.go
@@ -1,6 +1,7 @@
 package server
 
 import (
+	"github.com/iotaledger/goshimmer/plugins/analysis/types/heartbeat"
 	"github.com/iotaledger/hive.go/events"
 )
 
@@ -9,23 +10,29 @@ var Events = struct {
 	RemoveNode      *events.Event
 	ConnectNodes    *events.Event
 	DisconnectNodes *events.Event
-	NodeOnline      *events.Event
-	NodeOffline     *events.Event
 	Error           *events.Event
+	Heartbeat       *events.Event
 }{
 	events.NewEvent(stringCaller),
 	events.NewEvent(stringCaller),
 	events.NewEvent(stringStringCaller),
 	events.NewEvent(stringStringCaller),
-	events.NewEvent(stringCaller),
-	events.NewEvent(stringCaller),
 	events.NewEvent(errorCaller),
+	events.NewEvent(heartbeatPacketCaller),
 }
 
 func stringCaller(handler interface{}, params ...interface{}) {
 	handler.(func(string))(params[0].(string))
 }
+
 func stringStringCaller(handler interface{}, params ...interface{}) {
 	handler.(func(string, string))(params[0].(string), params[1].(string))
 }
-func errorCaller(handler interface{}, params ...interface{}) { handler.(func(error))(params[0].(error)) }
+
+func errorCaller(handler interface{}, params ...interface{}) {
+	handler.(func(error))(params[0].(error))
+}
+
+func heartbeatPacketCaller(handler interface{}, params ...interface{}) {
+	handler.(func(heartbeat.Packet))(params[0].(heartbeat.Packet))
+}
diff --git a/plugins/analysis/server/parameters.go b/plugins/analysis/server/parameters.go
index a8d66903b7079edcfd7d0b87f0ed154366327dfa..645f32cc915295d2f8b0fef890795857649b4c91 100644
--- a/plugins/analysis/server/parameters.go
+++ b/plugins/analysis/server/parameters.go
@@ -5,9 +5,9 @@ import (
 )
 
 const (
-	CFG_SERVER_PORT = "analysis.server.port"
+	CfgServerPort = "analysis.server.port"
 )
 
 func init() {
-	flag.Int(CFG_SERVER_PORT, 0, "tcp port for incoming analysis packets")
+	flag.Int(CfgServerPort, 0, "tcp port for incoming analysis packets")
 }
diff --git a/plugins/analysis/server/plugin.go b/plugins/analysis/server/plugin.go
index 2f13eb6f637341c247b931b854c421a64285f37a..158ad6f17dd7d49c46ed5105e8c8282d461a3906 100644
--- a/plugins/analysis/server/plugin.go
+++ b/plugins/analysis/server/plugin.go
@@ -1,9 +1,7 @@
 package server
 
 import (
-	"encoding/hex"
 	"errors"
-	"math"
 
 	"github.com/iotaledger/hive.go/daemon"
 	"github.com/iotaledger/hive.go/events"
@@ -13,11 +11,7 @@ import (
 	"github.com/iotaledger/hive.go/node"
 
 	"github.com/iotaledger/goshimmer/packages/shutdown"
-	"github.com/iotaledger/goshimmer/plugins/analysis/types/addnode"
-	"github.com/iotaledger/goshimmer/plugins/analysis/types/connectnodes"
-	"github.com/iotaledger/goshimmer/plugins/analysis/types/disconnectnodes"
-	"github.com/iotaledger/goshimmer/plugins/analysis/types/ping"
-	"github.com/iotaledger/goshimmer/plugins/analysis/types/removenode"
+	"github.com/iotaledger/goshimmer/plugins/analysis/types/heartbeat"
 	"github.com/iotaledger/goshimmer/plugins/config"
 )
 
@@ -37,7 +31,7 @@ func Configure(plugin *node.Plugin) {
 		log.Errorf("error in server: %s", err.Error())
 	}))
 	server.Events.Start.Attach(events.NewClosure(func() {
-		log.Infof("Starting Server (port %d) ... done", config.Node.GetInt(CFG_SERVER_PORT))
+		log.Infof("Starting Server (port %d) ... done", config.Node.GetInt(CfgServerPort))
 	}))
 	server.Events.Shutdown.Attach(events.NewClosure(func() {
 		log.Info("Stopping Server ... done")
@@ -46,8 +40,8 @@ func Configure(plugin *node.Plugin) {
 
 func Run(plugin *node.Plugin) {
 	daemon.BackgroundWorker("Analysis Server", func(shutdownSignal <-chan struct{}) {
-		log.Infof("Starting Server (port %d) ... done", config.Node.GetInt(CFG_SERVER_PORT))
-		go server.Listen("0.0.0.0", config.Node.GetInt(CFG_SERVER_PORT))
+		log.Infof("Starting Server (port %d) ... done", config.Node.GetInt(CfgServerPort))
+		go server.Listen("0.0.0.0", config.Node.GetInt(CfgServerPort))
 		<-shutdownSignal
 		Shutdown()
 	}, shutdown.PriorityAnalysis)
@@ -60,21 +54,20 @@ func Shutdown() {
 }
 
 func HandleConnection(conn *network.ManagedConnection) {
-	conn.SetTimeout(IDLE_TIMEOUT)
+	err := conn.SetTimeout(IdleTimeout)
+	if err!=nil {
+		log.Errorf(err.Error())
+	}
 
-	var connectionState = STATE_INITIAL
+	var connectionState byte
 	var receiveBuffer []byte
-	var offset int
-	var connectedNodeId string
 
 	var onDisconnect *events.Closure
 
 	onReceiveData := events.NewClosure(func(data []byte) {
-		processIncomingPacket(&connectionState, &receiveBuffer, conn, data, &offset, &connectedNodeId)
+		processIncomingPacket(&connectionState, &receiveBuffer, conn, data)
 	})
 	onDisconnect = events.NewClosure(func() {
-		Events.NodeOffline.Trigger(connectedNodeId)
-
 		conn.Events.ReceiveData.Detach(onReceiveData)
 		conn.Events.Close.Detach(onDisconnect)
 	})
@@ -83,11 +76,7 @@ func HandleConnection(conn *network.ManagedConnection) {
 	conn.Events.Close.Attach(onDisconnect)
 
 	maxPacketsSize := getMaxPacketSize(
-		ping.MARSHALED_TOTAL_SIZE,
-		addnode.MARSHALED_TOTAL_SIZE,
-		removenode.MARSHALED_TOTAL_SIZE,
-		connectnodes.MARSHALED_TOTAL_SIZE,
-		disconnectnodes.MARSHALED_PACKET_HEADER,
+		heartbeat.MaxMarshaledTotalSize,
 	)
 
 	go conn.Read(make([]byte, maxPacketsSize))
@@ -105,66 +94,21 @@ func getMaxPacketSize(packetSizes ...int) int {
 	return maxPacketSize
 }
 
-func processIncomingPacket(connectionState *byte, receiveBuffer *[]byte, conn *network.ManagedConnection, data []byte, offset *int, connectedNodeId *string) {
-	firstPackage := *connectionState == STATE_INITIAL
-
-	if firstPackage || *connectionState == STATE_CONSECUTIVE {
-		var err error
-		if *connectionState, *receiveBuffer, err = parsePackageHeader(data); err != nil {
-			Events.Error.Trigger(err)
-
-			conn.Close()
-
-			return
-		}
-
-		*offset = 0
-
-		switch *connectionState {
-		case STATE_ADD_NODE:
-			*receiveBuffer = make([]byte, addnode.MARSHALED_TOTAL_SIZE)
-
-		case STATE_PING:
-			*receiveBuffer = make([]byte, ping.MARSHALED_TOTAL_SIZE)
-
-		case STATE_CONNECT_NODES:
-			*receiveBuffer = make([]byte, connectnodes.MARSHALED_TOTAL_SIZE)
-
-		case STATE_DISCONNECT_NODES:
-			*receiveBuffer = make([]byte, disconnectnodes.MARSHALED_TOTAL_SIZE)
+func processIncomingPacket(connectionState *byte, receiveBuffer *[]byte, conn *network.ManagedConnection, data []byte) {
+	var err error
+	if *connectionState, *receiveBuffer, err = parsePackageHeader(data); err != nil {
+		Events.Error.Trigger(err)
 
-		case STATE_REMOVE_NODE:
-			*receiveBuffer = make([]byte, removenode.MARSHALED_TOTAL_SIZE)
-		}
-	}
+		conn.Close()
 
-	if firstPackage {
-		if *connectionState != STATE_ADD_NODE {
-			Events.Error.Trigger(ErrExpectedInitialAddNodePackage)
-		} else {
-			*connectionState = STATE_INITIAL_ADDNODE
-		}
+		return
 	}
 
 	switch *connectionState {
-	case STATE_INITIAL_ADDNODE:
-		processIncomingAddNodePacket(connectionState, receiveBuffer, conn, data, offset, connectedNodeId)
-
-	case STATE_ADD_NODE:
-		processIncomingAddNodePacket(connectionState, receiveBuffer, conn, data, offset, connectedNodeId)
-
-	case STATE_PING:
-		processIncomingPingPacket(connectionState, receiveBuffer, conn, data, offset, connectedNodeId)
-
-	case STATE_CONNECT_NODES:
-		processIncomingConnectNodesPacket(connectionState, receiveBuffer, conn, data, offset, connectedNodeId)
-
-	case STATE_DISCONNECT_NODES:
-		processIncomingDisconnectNodesPacket(connectionState, receiveBuffer, conn, data, offset, connectedNodeId)
-
-	case STATE_REMOVE_NODE:
-		processIncomingRemoveNodePacket(connectionState, receiveBuffer, conn, data, offset, connectedNodeId)
+	case StateHeartbeat:
+		processHeartbeatPacket(connectionState, receiveBuffer, conn, data)
 	}
+
 }
 
 func parsePackageHeader(data []byte) (ConnectionState, []byte, error) {
@@ -172,30 +116,10 @@ func parsePackageHeader(data []byte) (ConnectionState, []byte, error) {
 	var receiveBuffer []byte
 
 	switch data[0] {
-	case ping.MARSHALED_PACKET_HEADER:
-		receiveBuffer = make([]byte, ping.MARSHALED_TOTAL_SIZE)
-
-		connectionState = STATE_PING
-
-	case addnode.MARSHALED_PACKET_HEADER:
-		receiveBuffer = make([]byte, addnode.MARSHALED_TOTAL_SIZE)
+	case heartbeat.MarshaledPacketHeader:
+		receiveBuffer = make([]byte, heartbeat.MaxMarshaledTotalSize)
 
-		connectionState = STATE_ADD_NODE
-
-	case connectnodes.MARSHALED_PACKET_HEADER:
-		receiveBuffer = make([]byte, connectnodes.MARSHALED_TOTAL_SIZE)
-
-		connectionState = STATE_CONNECT_NODES
-
-	case disconnectnodes.MARSHALED_PACKET_HEADER:
-		receiveBuffer = make([]byte, disconnectnodes.MARSHALED_TOTAL_SIZE)
-
-		connectionState = STATE_DISCONNECT_NODES
-
-	case removenode.MARSHALED_PACKET_HEADER:
-		receiveBuffer = make([]byte, removenode.MARSHALED_TOTAL_SIZE)
-
-		connectionState = STATE_REMOVE_NODE
+		connectionState = StateHeartbeat
 
 	default:
 		return 0, nil, ErrInvalidPackageHeader
@@ -204,147 +128,13 @@ func parsePackageHeader(data []byte) (ConnectionState, []byte, error) {
 	return connectionState, receiveBuffer, nil
 }
 
-func processIncomingAddNodePacket(connectionState *byte, receiveBuffer *[]byte, conn *network.ManagedConnection, data []byte, offset *int, connectedNodeId *string) {
-	remainingCapacity := int(math.Min(float64(addnode.MARSHALED_TOTAL_SIZE-*offset), float64(len(data))))
-
-	copy((*receiveBuffer)[*offset:], data[:remainingCapacity])
-
-	if *offset+len(data) < addnode.MARSHALED_TOTAL_SIZE {
-		*offset += len(data)
-	} else {
-		if addNodePacket, err := addnode.Unmarshal(*receiveBuffer); err != nil {
-			Events.Error.Trigger(err)
-
-			conn.Close()
-
-			return
-		} else {
-			nodeId := hex.EncodeToString(addNodePacket.NodeId)
-
-			Events.AddNode.Trigger(nodeId)
-
-			if *connectionState == STATE_INITIAL_ADDNODE {
-				*connectedNodeId = nodeId
-
-				Events.NodeOnline.Trigger(nodeId)
-			}
-		}
-
-		*connectionState = STATE_CONSECUTIVE
-
-		if *offset+len(data) > addnode.MARSHALED_TOTAL_SIZE {
-			processIncomingPacket(connectionState, receiveBuffer, conn, data[remainingCapacity:], offset, connectedNodeId)
-		}
-	}
-}
-
-func processIncomingPingPacket(connectionState *byte, receiveBuffer *[]byte, conn *network.ManagedConnection, data []byte, offset *int, connectedNodeId *string) {
-	remainingCapacity := int(math.Min(float64(ping.MARSHALED_TOTAL_SIZE-*offset), float64(len(data))))
-
-	copy((*receiveBuffer)[*offset:], data[:remainingCapacity])
-
-	if *offset+len(data) < ping.MARSHALED_TOTAL_SIZE {
-		*offset += len(data)
-	} else {
-		if _, err := ping.Unmarshal(*receiveBuffer); err != nil {
-			Events.Error.Trigger(err)
-
-			conn.Close()
-
-			return
-		}
-
-		*connectionState = STATE_CONSECUTIVE
-
-		if *offset+len(data) > ping.MARSHALED_TOTAL_SIZE {
-			processIncomingPacket(connectionState, receiveBuffer, conn, data[remainingCapacity:], offset, connectedNodeId)
-		}
-	}
-}
-
-func processIncomingConnectNodesPacket(connectionState *byte, receiveBuffer *[]byte, conn *network.ManagedConnection, data []byte, offset *int, connectedNodeId *string) {
-	remainingCapacity := int(math.Min(float64(connectnodes.MARSHALED_TOTAL_SIZE-*offset), float64(len(data))))
-
-	copy((*receiveBuffer)[*offset:], data[:remainingCapacity])
-
-	if *offset+len(data) < connectnodes.MARSHALED_TOTAL_SIZE {
-		*offset += len(data)
-	} else {
-		if connectNodesPacket, err := connectnodes.Unmarshal(*receiveBuffer); err != nil {
-			Events.Error.Trigger(err)
-
-			conn.Close()
-
-			return
-		} else {
-			sourceNodeId := hex.EncodeToString(connectNodesPacket.SourceId)
-			targetNodeId := hex.EncodeToString(connectNodesPacket.TargetId)
-
-			Events.ConnectNodes.Trigger(sourceNodeId, targetNodeId)
-		}
-
-		*connectionState = STATE_CONSECUTIVE
-
-		if *offset+len(data) > connectnodes.MARSHALED_TOTAL_SIZE {
-			processIncomingPacket(connectionState, receiveBuffer, conn, data[remainingCapacity:], offset, connectedNodeId)
-		}
-	}
-}
-
-func processIncomingDisconnectNodesPacket(connectionState *byte, receiveBuffer *[]byte, conn *network.ManagedConnection, data []byte, offset *int, connectedNodeId *string) {
-	remainingCapacity := int(math.Min(float64(disconnectnodes.MARSHALED_TOTAL_SIZE-*offset), float64(len(data))))
+func processHeartbeatPacket(connectionState *byte, receiveBuffer *[]byte, conn *network.ManagedConnection, data []byte) {
 
-	copy((*receiveBuffer)[*offset:], data[:remainingCapacity])
-
-	if *offset+len(data) < disconnectnodes.MARSHALED_TOTAL_SIZE {
-		*offset += len(data)
-	} else {
-		if disconnectNodesPacket, err := disconnectnodes.Unmarshal(*receiveBuffer); err != nil {
-			Events.Error.Trigger(err)
-
-			conn.Close()
-
-			return
-		} else {
-			sourceNodeId := hex.EncodeToString(disconnectNodesPacket.SourceId)
-			targetNodeId := hex.EncodeToString(disconnectNodesPacket.TargetId)
-
-			Events.DisconnectNodes.Trigger(sourceNodeId, targetNodeId)
-		}
-
-		*connectionState = STATE_CONSECUTIVE
-
-		if *offset+len(data) > disconnectnodes.MARSHALED_TOTAL_SIZE {
-			processIncomingPacket(connectionState, receiveBuffer, conn, data[remainingCapacity:], offset, connectedNodeId)
-		}
-	}
-}
-
-func processIncomingRemoveNodePacket(connectionState *byte, receiveBuffer *[]byte, conn *network.ManagedConnection, data []byte, offset *int, connectedNodeId *string) {
-	remainingCapacity := int(math.Min(float64(removenode.MARSHALED_TOTAL_SIZE-*offset), float64(len(data))))
-
-	copy((*receiveBuffer)[*offset:], data[:remainingCapacity])
-
-	if *offset+len(data) < removenode.MARSHALED_TOTAL_SIZE {
-		*offset += len(data)
-	} else {
-		if removeNodePacket, err := removenode.Unmarshal(*receiveBuffer); err != nil {
-			Events.Error.Trigger(err)
-
-			conn.Close()
-
-			return
-		} else {
-			nodeId := hex.EncodeToString(removeNodePacket.NodeId)
-
-			Events.RemoveNode.Trigger(nodeId)
-
-		}
-
-		*connectionState = STATE_CONSECUTIVE
-
-		if *offset+len(data) > addnode.MARSHALED_TOTAL_SIZE {
-			processIncomingPacket(connectionState, receiveBuffer, conn, data[remainingCapacity:], offset, connectedNodeId)
-		}
+	heartbeatPacket, err := heartbeat.Unmarshal(data)
+	if err != nil {
+		Events.Error.Trigger(err)
+		conn.Close()
+		return
 	}
+	Events.Heartbeat.Trigger(*heartbeatPacket)
 }
diff --git a/plugins/analysis/types/addnode/constants.go b/plugins/analysis/types/addnode/constants.go
deleted file mode 100644
index a112e89aa7550521b7dd59e85e6862e8e9facf3c..0000000000000000000000000000000000000000
--- a/plugins/analysis/types/addnode/constants.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package addnode
-
-import "crypto/sha256"
-
-const (
-	MARSHALED_PACKET_HEADER = 0x01
-
-	MARSHALED_PACKET_HEADER_START = 0
-	MARSHALED_PACKET_HEADER_SIZE  = 1
-	MARSHALED_PACKET_HEADER_END   = MARSHALED_PACKET_HEADER_START + MARSHALED_PACKET_HEADER_SIZE
-
-	MARSHALED_ID_START = MARSHALED_PACKET_HEADER_END
-	MARSHALED_ID_SIZE  = sha256.Size
-	MARSHALED_ID_END   = MARSHALED_ID_START + MARSHALED_ID_SIZE
-
-	MARSHALED_TOTAL_SIZE = MARSHALED_ID_END
-)
diff --git a/plugins/analysis/types/addnode/packet.go b/plugins/analysis/types/addnode/packet.go
deleted file mode 100644
index da2ba9925b765ba15835f694d9d8c287f0c0a361..0000000000000000000000000000000000000000
--- a/plugins/analysis/types/addnode/packet.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package addnode
-
-import "errors"
-
-var (
-	ErrMalformedAddNodePacket = errors.New("malformed add node packet")
-)
-
-type Packet struct {
-	NodeId []byte
-}
-
-func Unmarshal(data []byte) (*Packet, error) {
-	if len(data) < MARSHALED_TOTAL_SIZE || data[0] != MARSHALED_PACKET_HEADER {
-		return nil, ErrMalformedAddNodePacket
-	}
-
-	unmarshaledPackage := &Packet{
-		NodeId: make([]byte, MARSHALED_ID_SIZE),
-	}
-
-	copy(unmarshaledPackage.NodeId, data[MARSHALED_ID_START:MARSHALED_ID_END])
-
-	return unmarshaledPackage, nil
-}
-
-func (packet *Packet) Marshal() []byte {
-	marshaledPackage := make([]byte, MARSHALED_TOTAL_SIZE)
-
-	marshaledPackage[MARSHALED_PACKET_HEADER_START] = MARSHALED_PACKET_HEADER
-	copy(marshaledPackage[MARSHALED_ID_START:MARSHALED_ID_END], packet.NodeId[:MARSHALED_ID_SIZE])
-
-	return marshaledPackage
-}
diff --git a/plugins/analysis/types/connectnodes/constants.go b/plugins/analysis/types/connectnodes/constants.go
deleted file mode 100644
index 09889329a44e0c98c8207eb1cc8d6a0175c7ef0b..0000000000000000000000000000000000000000
--- a/plugins/analysis/types/connectnodes/constants.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package connectnodes
-
-import "crypto/sha256"
-
-const (
-	MARSHALED_PACKET_HEADER = 0x03
-
-	MARSHALED_PACKET_HEADER_START = 0
-	MARSHALED_PACKET_HEADER_SIZE  = 1
-	MARSHALED_PACKET_HEADER_END   = MARSHALED_PACKET_HEADER_START + MARSHALED_PACKET_HEADER_SIZE
-
-	MARSHALED_SOURCE_ID_START = MARSHALED_PACKET_HEADER_END
-	MARSHALED_SOURCE_ID_SIZE  = sha256.Size
-	MARSHALED_SOURCE_ID_END   = MARSHALED_SOURCE_ID_START + MARSHALED_SOURCE_ID_SIZE
-
-	MARSHALED_TARGET_ID_START = MARSHALED_SOURCE_ID_END
-	MARSHALED_TARGET_ID_SIZE  = sha256.Size
-	MARSHALED_TARGET_ID_END   = MARSHALED_TARGET_ID_START + MARSHALED_TARGET_ID_SIZE
-
-	MARSHALED_TOTAL_SIZE = MARSHALED_TARGET_ID_END
-)
diff --git a/plugins/analysis/types/connectnodes/packet.go b/plugins/analysis/types/connectnodes/packet.go
deleted file mode 100644
index 1e672c3ad4a5714ca390f2289155b1cc39585f04..0000000000000000000000000000000000000000
--- a/plugins/analysis/types/connectnodes/packet.go
+++ /dev/null
@@ -1,38 +0,0 @@
-package connectnodes
-
-import "errors"
-
-var (
-	ErrMalformedConnectNodesPacket = errors.New("malformed connect nodes packet")
-)
-
-type Packet struct {
-	SourceId []byte
-	TargetId []byte
-}
-
-func Unmarshal(data []byte) (*Packet, error) {
-	if len(data) < MARSHALED_TOTAL_SIZE || data[0] != MARSHALED_PACKET_HEADER {
-		return nil, ErrMalformedConnectNodesPacket
-	}
-
-	unmarshaledPackage := &Packet{
-		SourceId: make([]byte, MARSHALED_SOURCE_ID_SIZE),
-		TargetId: make([]byte, MARSHALED_TARGET_ID_SIZE),
-	}
-
-	copy(unmarshaledPackage.SourceId, data[MARSHALED_SOURCE_ID_START:MARSHALED_SOURCE_ID_END])
-	copy(unmarshaledPackage.TargetId, data[MARSHALED_TARGET_ID_START:MARSHALED_TARGET_ID_END])
-
-	return unmarshaledPackage, nil
-}
-
-func (packet *Packet) Marshal() []byte {
-	marshaledPackage := make([]byte, MARSHALED_TOTAL_SIZE)
-
-	marshaledPackage[MARSHALED_PACKET_HEADER_START] = MARSHALED_PACKET_HEADER
-	copy(marshaledPackage[MARSHALED_SOURCE_ID_START:MARSHALED_SOURCE_ID_END], packet.SourceId[:MARSHALED_SOURCE_ID_SIZE])
-	copy(marshaledPackage[MARSHALED_TARGET_ID_START:MARSHALED_TARGET_ID_END], packet.TargetId[:MARSHALED_TARGET_ID_SIZE])
-
-	return marshaledPackage
-}
diff --git a/plugins/analysis/types/disconnectnodes/constants.go b/plugins/analysis/types/disconnectnodes/constants.go
deleted file mode 100644
index adf347455bccef6bebdac55f671930bd86289ad3..0000000000000000000000000000000000000000
--- a/plugins/analysis/types/disconnectnodes/constants.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package disconnectnodes
-
-import "crypto/sha256"
-
-const (
-	MARSHALED_PACKET_HEADER = 0x04
-
-	MARSHALED_PACKET_HEADER_START = 0
-	MARSHALED_PACKET_HEADER_SIZE  = 1
-	MARSHALED_PACKET_HEADER_END   = MARSHALED_PACKET_HEADER_START + MARSHALED_PACKET_HEADER_SIZE
-
-	MARSHALED_SOURCE_ID_START = MARSHALED_PACKET_HEADER_END
-	MARSHALED_SOURCE_ID_SIZE  = sha256.Size
-	MARSHALED_SOURCE_ID_END   = MARSHALED_SOURCE_ID_START + MARSHALED_SOURCE_ID_SIZE
-
-	MARSHALED_TARGET_ID_START = MARSHALED_SOURCE_ID_END
-	MARSHALED_TARGET_ID_SIZE  = sha256.Size
-	MARSHALED_TARGET_ID_END   = MARSHALED_TARGET_ID_START + MARSHALED_TARGET_ID_SIZE
-
-	MARSHALED_TOTAL_SIZE = MARSHALED_TARGET_ID_END
-)
diff --git a/plugins/analysis/types/disconnectnodes/packet.go b/plugins/analysis/types/disconnectnodes/packet.go
deleted file mode 100644
index b810fa8fefa0a53d56facc09c03a3e2d48805f84..0000000000000000000000000000000000000000
--- a/plugins/analysis/types/disconnectnodes/packet.go
+++ /dev/null
@@ -1,38 +0,0 @@
-package disconnectnodes
-
-import "errors"
-
-var (
-	ErrMalformedDisconnectNodesPacket = errors.New("malformed disconnect nodes packet")
-)
-
-type Packet struct {
-	SourceId []byte
-	TargetId []byte
-}
-
-func Unmarshal(data []byte) (*Packet, error) {
-	if len(data) < MARSHALED_TOTAL_SIZE || data[0] != MARSHALED_PACKET_HEADER {
-		return nil, ErrMalformedDisconnectNodesPacket
-	}
-
-	unmarshaledPackage := &Packet{
-		SourceId: make([]byte, MARSHALED_SOURCE_ID_SIZE),
-		TargetId: make([]byte, MARSHALED_TARGET_ID_SIZE),
-	}
-
-	copy(unmarshaledPackage.SourceId, data[MARSHALED_SOURCE_ID_START:MARSHALED_SOURCE_ID_END])
-	copy(unmarshaledPackage.TargetId, data[MARSHALED_TARGET_ID_START:MARSHALED_TARGET_ID_END])
-
-	return unmarshaledPackage, nil
-}
-
-func (packet *Packet) Marshal() []byte {
-	marshaledPackage := make([]byte, MARSHALED_TOTAL_SIZE)
-
-	marshaledPackage[MARSHALED_PACKET_HEADER_START] = MARSHALED_PACKET_HEADER
-	copy(marshaledPackage[MARSHALED_SOURCE_ID_START:MARSHALED_SOURCE_ID_END], packet.SourceId[:MARSHALED_SOURCE_ID_SIZE])
-	copy(marshaledPackage[MARSHALED_TARGET_ID_START:MARSHALED_TARGET_ID_END], packet.TargetId[:MARSHALED_TARGET_ID_SIZE])
-
-	return marshaledPackage
-}
diff --git a/plugins/analysis/types/heartbeat/constants.go b/plugins/analysis/types/heartbeat/constants.go
new file mode 100644
index 0000000000000000000000000000000000000000..a8b46886f7e64f2380e65a33b645a7c935e99c91
--- /dev/null
+++ b/plugins/analysis/types/heartbeat/constants.go
@@ -0,0 +1,34 @@
+package heartbeat
+
+import "crypto/sha256"
+
+const (
+	// MarshaledPacketHeader unique identifier of packet
+	MarshaledPacketHeader = 0x01
+
+	// MaxOutboundNeighborCount is the maximum number of allowed neighbors in one direction
+	MaxOutboundNeighborCount = 4
+	// MaxInboundNeighborCount is the maximum number of allowed neighbors in one direction
+	MaxInboundNeighborCount  = 4
+
+	// MaxMarshaledTotalSize Maximum packet length in bytes
+	MaxMarshaledTotalSize = MarshaledPacketHeaderSize + MarshaledOwnIDSize +
+		MarshaledOutboundIDsLengthSize + MaxOutboundNeighborCount*MarshaledOutboundIDSize +
+		MarshaledInboundIDsLengthSize + MaxInboundNeighborCount*MarshaledInboundIDSize
+
+	MarshaledPacketHeaderStart = 0
+	MarshaledPacketHeaderSize  = 1
+	MarshaledPacketHeaderEnd   = MarshaledPacketHeaderStart + MarshaledPacketHeaderSize
+
+	MarshaledOwnIDStart = MarshaledPacketHeaderEnd
+	MarshaledOwnIDSize  = sha256.Size
+	MarshaledOwnIDEnd   = MarshaledOwnIDStart + MarshaledOwnIDSize
+
+	MarshaledOutboundIDsLengthStart = MarshaledOwnIDEnd
+	MarshaledOutboundIDsLengthSize  = 1
+	MarshaledOutboundIDSize         = sha256.Size
+	MarshaledOutboundIDsLengthEnd   = MarshaledOutboundIDsLengthStart + MarshaledOutboundIDsLengthSize
+
+	MarshaledInboundIDsLengthSize = 1
+	MarshaledInboundIDSize        = sha256.Size
+)
diff --git a/plugins/analysis/types/heartbeat/packet.go b/plugins/analysis/types/heartbeat/packet.go
new file mode 100644
index 0000000000000000000000000000000000000000..0135db97ca801bb1447853fc0c16d816d64247bb
--- /dev/null
+++ b/plugins/analysis/types/heartbeat/packet.go
@@ -0,0 +1,125 @@
+package heartbeat
+
+import "errors"
+
+var (
+	ErrMalformedHeartbeatPacket = errors.New("malformed heartbeat packet")
+	ErrTooManyNeighborsToReport = errors.New("too many neighbors to report in packet")
+)
+
+// Packet is a heartbeat packet
+type Packet struct {
+	OwnID       []byte
+	OutboundIDs [][]byte
+	InboundIDs  [][]byte
+}
+
+func Unmarshal(data []byte) (*Packet, error) {
+	// So far we are only sure about the static part
+	MarshaledTotalSize := MarshaledPacketHeaderSize + MarshaledOwnIDSize
+	// Check if len is smaller than the static parts we know at the moment
+	if len(data) < MarshaledTotalSize || data[0] != MarshaledPacketHeader {
+		return nil, ErrMalformedHeartbeatPacket
+	}
+
+	// First the static part
+	unmarshalledOwnID := make([]byte, MarshaledOwnIDSize)
+	copy(unmarshalledOwnID[:MarshaledOwnIDSize], data[MarshaledOwnIDStart:MarshaledOwnIDEnd])
+
+	// Now the dynamic parts, first outbound neighbors
+	lengthOutboundIDs := int(data[MarshaledOutboundIDsLengthStart])
+
+	MarshaledTotalSize += MarshaledOutboundIDsLengthSize + lengthOutboundIDs*MarshaledOutboundIDSize
+	// Check if len is smaller than the size we know at the moment
+	if len(data) < MarshaledTotalSize {
+		return nil, ErrMalformedHeartbeatPacket
+	}
+
+	unmarshalledOutboundIDs := make([][]byte, lengthOutboundIDs)
+
+	for i := range unmarshalledOutboundIDs {
+		// Allocate space for each ID
+		unmarshalledOutboundIDs[i] = make([]byte, MarshaledOutboundIDSize)
+		copy(unmarshalledOutboundIDs[i][:MarshaledOutboundIDSize], data[MarshaledOutboundIDsLengthEnd+i*MarshaledOutboundIDSize:MarshaledOutboundIDsLengthEnd+(i+1)*MarshaledOutboundIDSize])
+	}
+
+	MarshaledInboundIdsLengthStart := MarshaledOutboundIDsLengthEnd + lengthOutboundIDs*MarshaledOutboundIDSize
+	MarshaledInboundIdsLengthEnd := MarshaledInboundIdsLengthStart + MarshaledInboundIDsLengthSize
+
+	// Second dynamic part, inbound neighbors
+	lengthInboundIDs := int(data[MarshaledInboundIdsLengthStart])
+
+	MarshaledTotalSize += MarshaledInboundIDsLengthSize + lengthInboundIDs*MarshaledInboundIDSize
+	// Check if len is smaller than the size we know at the moment
+	if len(data) < MarshaledTotalSize {
+		return nil, ErrMalformedHeartbeatPacket
+	}
+
+	unmarshalledInboundIDs := make([][]byte, lengthInboundIDs)
+
+	for i := range unmarshalledInboundIDs {
+		// Allocate space for each ID
+		unmarshalledInboundIDs[i] = make([]byte, MarshaledInboundIDSize)
+		copy(unmarshalledInboundIDs[i][:MarshaledInboundIDSize], data[MarshaledInboundIdsLengthEnd+i*MarshaledInboundIDSize:MarshaledInboundIdsLengthEnd+(i+1)*MarshaledInboundIDSize])
+	}
+
+	unmarshalledPackage := &Packet{
+		OwnID:       unmarshalledOwnID,
+		OutboundIDs: unmarshalledOutboundIDs,
+		InboundIDs:  unmarshalledInboundIDs,
+	}
+
+	return unmarshalledPackage, nil
+
+}
+
+func (packet *Packet) Marshal() ([]byte, error) {
+	// Calculate total needed bytes based on packet
+	MarshaledTotalSize := MarshaledPacketHeaderSize + MarshaledOwnIDSize +
+		// Dynamic part 1, outbound IDs
+		MarshaledOutboundIDsLengthSize + len(packet.OutboundIDs)*MarshaledOutboundIDSize +
+		// Dynamic part 2, Inbound IDs
+		MarshaledInboundIDsLengthSize + len(packet.InboundIDs)*MarshaledInboundIDSize
+
+	marshaledPackage := make([]byte, MarshaledTotalSize)
+
+	// Header byte
+	marshaledPackage[MarshaledPacketHeaderStart] = MarshaledPacketHeader
+
+	// Own nodeId
+	copy(marshaledPackage[MarshaledOwnIDStart:MarshaledOwnIDEnd], packet.OwnID[:MarshaledOwnIDSize])
+
+	// Outbound nodeIds, need to tell first how many we have to be able to unmarshal it later
+	lengthOutboundIDs := len(packet.OutboundIDs)
+	if lengthOutboundIDs > MaxOutboundNeighborCount {
+		return nil, ErrTooManyNeighborsToReport
+	} else {
+		marshaledPackage[MarshaledOutboundIDsLengthStart] = byte(lengthOutboundIDs)
+	}
+
+	// Copy contents of packet.OutboundIDs
+	for i, outboundID := range packet.OutboundIDs {
+		copy(marshaledPackage[MarshaledOutboundIDsLengthEnd+i*MarshaledOutboundIDSize:MarshaledOutboundIDsLengthEnd+(i+1)*MarshaledOutboundIDSize], outboundID[:MarshaledOutboundIDSize])
+	}
+
+	// Calculate where inbound nodeId-s start
+	MarshaledInboundIdsLengthStart := MarshaledOutboundIDsLengthEnd + lengthOutboundIDs*MarshaledOutboundIDSize
+
+	// Tell how many inbound nodeId-s we have
+	lengthInboundIDs := len(packet.InboundIDs)
+	if lengthInboundIDs > MaxInboundNeighborCount {
+		return nil, ErrTooManyNeighborsToReport
+	} else {
+		marshaledPackage[MarshaledInboundIdsLengthStart] = byte(lengthInboundIDs)
+	}
+
+	// End of length is the start of inbound nodeId-s
+	MarshaledInboundIdsLengthEnd := MarshaledInboundIdsLengthStart + MarshaledInboundIDsLengthSize
+
+	// Copy contents of packet.InboundIDs
+	for i, inboundID := range packet.InboundIDs {
+		copy(marshaledPackage[MarshaledInboundIdsLengthEnd+i*MarshaledInboundIDSize:MarshaledInboundIdsLengthEnd+(i+1)*MarshaledInboundIDSize], inboundID[:MarshaledInboundIDSize])
+	}
+
+	return marshaledPackage, nil
+}
diff --git a/plugins/analysis/types/ping/constants.go b/plugins/analysis/types/ping/constants.go
index 41de5de4342d2f55f4fa5e9b053bdead43d37fd8..05b18da561669157b088357e58f74e8f853de304 100644
--- a/plugins/analysis/types/ping/constants.go
+++ b/plugins/analysis/types/ping/constants.go
@@ -1,11 +1,11 @@
 package ping
 
 const (
-	MARSHALED_PACKET_HEADER = 0x00
+	MarshaledPacketHeader = 0x00
 
-	MARSHALED_PACKET_HEADER_START = 0
-	MARSHALED_PACKET_HEADER_SIZE  = 1
-	MARSHALED_PACKET_HEADER_END   = MARSHALED_PACKET_HEADER_START + MARSHALED_PACKET_HEADER_SIZE
+	MarshaledPacketHeaderStart = 0
+	MarshaledPacketHeaderSize  = 1
+	MarshaledPacketHeaderEnd   = MarshaledPacketHeaderStart + MarshaledPacketHeaderSize
 
-	MARSHALED_TOTAL_SIZE = MARSHALED_PACKET_HEADER_END
+	MarshaledTotalSize = MarshaledPacketHeaderEnd
 )
diff --git a/plugins/analysis/types/ping/packet.go b/plugins/analysis/types/ping/packet.go
index 68193e5153630da265a8776b527356cf4a34e1fb..cfa624c4e2e7b3f8a1e71e4bc926a60698b527ae 100644
--- a/plugins/analysis/types/ping/packet.go
+++ b/plugins/analysis/types/ping/packet.go
@@ -9,7 +9,7 @@ var (
 type Packet struct{}
 
 func Unmarshal(data []byte) (*Packet, error) {
-	if len(data) < MARSHALED_TOTAL_SIZE || data[MARSHALED_PACKET_HEADER_START] != MARSHALED_PACKET_HEADER {
+	if len(data) < MarshaledTotalSize || data[MarshaledPacketHeaderStart] != MarshaledPacketHeader {
 		return nil, ErrMalformedPingPacket
 	}
 
@@ -19,9 +19,9 @@ func Unmarshal(data []byte) (*Packet, error) {
 }
 
 func (packet *Packet) Marshal() []byte {
-	marshaledPackage := make([]byte, MARSHALED_TOTAL_SIZE)
+	marshaledPackage := make([]byte, MarshaledTotalSize)
 
-	marshaledPackage[MARSHALED_PACKET_HEADER_START] = MARSHALED_PACKET_HEADER
+	marshaledPackage[MarshaledPacketHeaderStart] = MarshaledPacketHeader
 
 	return marshaledPackage
 }
diff --git a/plugins/analysis/types/removenode/constants.go b/plugins/analysis/types/removenode/constants.go
deleted file mode 100644
index b8edb5d1795c5199e38b3b95ea7b08ef1f206999..0000000000000000000000000000000000000000
--- a/plugins/analysis/types/removenode/constants.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package removenode
-
-import "crypto/sha256"
-
-const (
-	MARSHALED_PACKET_HEADER = 0x02
-
-	MARSHALED_PACKET_HEADER_START = 0
-	MARSHALED_PACKET_HEADER_SIZE  = 1
-	MARSHALED_PACKET_HEADER_END   = MARSHALED_PACKET_HEADER_START + MARSHALED_PACKET_HEADER_SIZE
-
-	MARSHALED_ID_START = MARSHALED_PACKET_HEADER_END
-	MARSHALED_ID_SIZE  = sha256.Size
-	MARSHALED_ID_END   = MARSHALED_ID_START + MARSHALED_ID_SIZE
-
-	MARSHALED_TOTAL_SIZE = MARSHALED_ID_END
-)
diff --git a/plugins/analysis/types/removenode/packet.go b/plugins/analysis/types/removenode/packet.go
deleted file mode 100644
index aeb890357109db49775d45fe0b52cfe08748e3a0..0000000000000000000000000000000000000000
--- a/plugins/analysis/types/removenode/packet.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package removenode
-
-import "errors"
-
-var (
-	ErrMalformedRemovePacket = errors.New("malformed remove node packet")
-)
-
-type Packet struct {
-	NodeId []byte
-}
-
-func Unmarshal(data []byte) (*Packet, error) {
-	if len(data) < MARSHALED_TOTAL_SIZE || data[0] != MARSHALED_PACKET_HEADER {
-		return nil, ErrMalformedRemovePacket
-	}
-
-	unmarshaledPackage := &Packet{
-		NodeId: make([]byte, MARSHALED_ID_SIZE),
-	}
-
-	copy(unmarshaledPackage.NodeId, data[MARSHALED_ID_START:MARSHALED_ID_END])
-
-	return unmarshaledPackage, nil
-}
-
-func (packet *Packet) Marshal() []byte {
-	marshaledPackage := make([]byte, MARSHALED_TOTAL_SIZE)
-
-	marshaledPackage[MARSHALED_PACKET_HEADER_START] = MARSHALED_PACKET_HEADER
-	copy(marshaledPackage[MARSHALED_ID_START:MARSHALED_ID_END], packet.NodeId[:MARSHALED_ID_SIZE])
-
-	return marshaledPackage
-}
diff --git a/plugins/analysis/webinterface/httpserver/data_stream.go b/plugins/analysis/webinterface/httpserver/data_stream.go
index c096ffeb631cd9bd7b42808c3b7f9d943d80a217..ee9fa354de91974f1349edbc19ac1903c44b67cf 100644
--- a/plugins/analysis/webinterface/httpserver/data_stream.go
+++ b/plugins/analysis/webinterface/httpserver/data_stream.go
@@ -23,7 +23,7 @@ func dataStream(ws *websocket.Conn) {
 				replayMutex.RLock()
 				defer replayMutex.RUnlock()
 
-				wsChan.TryWrite(messagePrefix + nodeId)
+				wsChan.Write(messagePrefix + nodeId)
 			}()
 		}
 	}
@@ -33,7 +33,7 @@ func dataStream(ws *websocket.Conn) {
 				replayMutex.RLock()
 				defer replayMutex.RUnlock()
 
-				wsChan.TryWrite(messagePrefix + sourceId + targetId)
+				wsChan.Write(messagePrefix + sourceId + targetId)
 			}()
 		}
 	}
@@ -46,14 +46,10 @@ func dataStream(ws *websocket.Conn) {
 	removeNodeClosure := events.NewClosure(createAsyncNodeCallback(wsChan, "a"))
 	connectNodesClosure := events.NewClosure(createAsyncLinkCallback(wsChan, "C"))
 	disconnectNodesClosure := events.NewClosure(createAsyncLinkCallback(wsChan, "c"))
-	nodeOnlineClosure := events.NewClosure(createAsyncNodeCallback(wsChan, "O"))
-	nodeOfflineClosure := events.NewClosure(createAsyncNodeCallback(wsChan, "o"))
 	server.Events.AddNode.Attach(addNodeClosure)
 	server.Events.RemoveNode.Attach(removeNodeClosure)
 	server.Events.ConnectNodes.Attach(connectNodesClosure)
 	server.Events.DisconnectNodes.Attach(disconnectNodesClosure)
-	server.Events.NodeOnline.Attach(nodeOnlineClosure)
-	server.Events.NodeOffline.Attach(nodeOfflineClosure)
 
 	// replay old events
 	recordedevents.Replay(createEventHandlers(wsChan, createSyncNodeCallback, createSyncLinkCallback))
@@ -69,8 +65,6 @@ func dataStream(ws *websocket.Conn) {
 	server.Events.RemoveNode.Detach(removeNodeClosure)
 	server.Events.ConnectNodes.Detach(connectNodesClosure)
 	server.Events.DisconnectNodes.Detach(disconnectNodesClosure)
-	server.Events.NodeOnline.Detach(nodeOnlineClosure)
-	server.Events.NodeOffline.Detach(nodeOfflineClosure)
 }
 
 func createEventHandlers(wsChan *WebSocketChannel, nodeCallbackFactory func(*WebSocketChannel, string) func(string), linkCallbackFactory func(*WebSocketChannel, string) func(string, string)) *types.EventHandlers {
@@ -79,8 +73,6 @@ func createEventHandlers(wsChan *WebSocketChannel, nodeCallbackFactory func(*Web
 		RemoveNode:      nodeCallbackFactory(wsChan, "a"),
 		ConnectNodes:    linkCallbackFactory(wsChan, "C"),
 		DisconnectNodes: linkCallbackFactory(wsChan, "c"),
-		NodeOnline:      nodeCallbackFactory(wsChan, "O"),
-		NodeOffline:     nodeCallbackFactory(wsChan, "o"),
 	}
 }
 
diff --git a/plugins/analysis/webinterface/httpserver/packrd/packed-packr.go b/plugins/analysis/webinterface/httpserver/packrd/packed-packr.go
index 8b691e01969fae6e424463bc64e5ec7b88645beb..0ec6dd9933d6982af7e6ffe3cab19be20ff816e6 100644
--- a/plugins/analysis/webinterface/httpserver/packrd/packed-packr.go
+++ b/plugins/analysis/webinterface/httpserver/packrd/packed-packr.go
@@ -11,14 +11,17 @@ import (
 )
 
 var _ = func() error {
-	const gk = "121d14fc26d6554942f445fcba76462d"
+	const gk = "dbc35aeaab9fce72cf7b7d0f22c0c4ba"
 	g := packr.New(gk, "")
 	hgr, err := resolver.NewHexGzip(map[string]string{
-		"1251d44231d5c73843ec32f152a99720": "1f8b08000000000000ff9c57793494fbff7f701b528454f6a6414d0bb330c34c46b319141a63494a356661304b331343ca9232527675254b961a85b2e5226d52e426a25c1165c992352d971a7ec7fdd5fdfeceefdc73fff87ece79ce799ecf79bd5eefcffbf5bc9ef7394f1cd5c55e4d554f150000354707320d0000e6f2a5020200403090ee0e0080aed8ce4becc6678b43e842164060f27d5960472edd8f4563d199a1479b593600a0c4e6b87b89bd9c9db00c3ed79cbe8c31977005c0f2b2d92511d019812c31d897e5c7e1e120d375f720600e1307d98772863b0b482c7f8e439890e516e6e2ce080b646098905db6601b0956c2157059623a58c20de289b0121ce42f5d2c4f845dde8641c07f41c48138c8ff1ecacb990a26f1852c30cadcc28c014720c068b439c2128546237680917004120647c2e0683384251685c622adc03f16c4166c2364b2b13432e5472d21938d83f88bc5022c0c161212621e6261ce17fac110180c66590389341332d966a2509e982e31e3898c7f2a9059228690231073f83cf0f233dd977f4c8c83407eb6c015383bff2dcc13fd308ac1e7c22474010c610e8771b9b09f689198c662ff3b5ae41e2a60c1682c11ff9890c1a2b1d8c6ffa7d4bf539781026767ec5e21c78fc3a30791f98c635c164fec48c641245c813993c3c492e0d61696240286802212ed3008040665412158a348186b22dc9a6205ffa9f14f5c0ba2350a498193ec50966404c20e43b023910948b21d91444121d094bfb98e3c9198ce63b07e7239ffe112ff958b25095974315fe8cee707fd4c00d59f2fe68bfcf90230c90d0d86eee3f098fc10d1d6e5d7f3e3a42c212798c5a408f95cf05ffe6239ff509f648724a0911824c5924859eedbdadace92842120890822c20e4db484fce032ff1bcf60b6601bd8ff0bcbcf2d1a99b27cfb77f46dc1fff978583c260e2284ecb2456c7c1a0100aad71cc90477c9eb091f1f2783ae757d1972852f1b2fbcf94c73d3d5dbd2d4b6704d637f00637f952fd3f4d9814ec87ed4f5dac71f1999328f02879262cfaa8517b15f1acf2b30b679941ffeded95975c3ab64d89aaad963b6127de445658bf98e6f4b4b56f256f6556f2a42837d41579828c6357c6eed3d3e15f2bc6624fbf894615642f275697e0408045aece8eb9b82673ebb1a6e7b737bfaee4bb23b6095dadd857983d6a5bd9d9deec80ca733be653298b6eacbf09219aaf9c563eab1f96fe7e6074043f506f18dde5cf401739dd52e8f078faa3b71cee88ab3779348a7ba0667c56834baf5667171cc8b31cb9bebf0b2ecb7044047f9b28b9f85822f79f39a4b7afafac7dd185ae6e08cbadada430a16bb769b684d1fbc77527e1b84f268895bbbe5a4aa6d8206d820ec02909efe48fec8b3dfd2dafa37c6c1a400c38d1bf9163aab2903efde3e3815353535158707e7769c4d4b4c4878519818135d701a682760ad470f2fceddd1783ed90b3479c4e28df6b9dcecfa905b2b79f144676fc152c70baf56d20a9187c6fd18a3b0ae5c5643cce3b566fafb6411eb941463623d3e5a1ba83f47e48b4680a8b36a1448f25645135b14eab33c08fd6d73e045c3fc4f0db16b22d4a82e49976a37a89ede761176d8bc22b81b71c96573ea4646244c0b6cf7ca68a70b0b31761b97d4404c7d23cc53f0d62b48372a2eb229dc818cdb1097f86ca69c8b87375c4c5750fc7562f6a0f935e30d525a2455d7fd42bbbf89687f7282697d6aaf6b5a9349bf34c74c41f8fe775d25d53181b5812de09a96baf23a74b344f1bd8665c9af898dbe7b1c149d67864076e27d495e1278e2383943f1e9fba16db17d24eea9e6eb9ad33e4e85b4bd7442ba8a06c6342633236336d4263be7ca7d05787a5ef3af079da8ac76b71515dd0715ffe0e73fe853300e3565f7fed2f4e8510cb7ffee897e5243fde98f9fa039c64569f11b03f493d6599efd66456d7dcaceee51053fdeb2373b5c572dadf117b656d388abf4960fc804b7eab3fb2daf1d86b27065fcd1c1a75b0b7b62636343af758c9130874f55ee6c3f5ea4bcebf4183fa5a5e37cad9b6e74cfe4a24a0aad77e278b5a2038bc532958a1dcb5598b79113caea0692c691b9faf657af3c15496713defb838d1d37466ec8d583f9d4054f5ef8dd2e491a936c8b89580ce754f48d9400448de771631126b12257b1d6c995290f3b70f3e2f12301aa26a793b4de5c21c52ebe7cf912b5f59a1badbccfe19823c3dea77807e6727c4a40b46ae79ebb45619ac53bd41917930d5276634cabf35e856685490fafa2e21cb82e8e879e48151e4a151e02f44740f73a930fe525cce3a91bed2f4575c4f85764bb9450cd72aafa401849fa0a8d222dcb95014141c5afe75272b6673ef3ec601b047a839bf73819f90ea4ffa92df7bc2191dfc96d5254f1002c7a37bb4fd839691fbecfdcee57d12d39b894ec60b299f3a54e1fd8046f3aaf1e37ba028c7b5b455cf9953db378ff08dc29aaeb61b004d5b4c9b0a1a161a1afaf6fe4cb44f7dcfa6de1e55428d5cbef21af3a316db7a990eca9db8e75251dae0f7b193adeb97517b6e703bba21b7448ad92a75432b3b3b23171b6225aefb1c6e0c444d09ecda9f3403debc13bc104e9f45eb49555ddcad5351b2282b534a8fa05773b2683ad9415a30e5ca1fab7fa9669df39345d07402b7c9c6f71f1642bfbadebe39fe5e62d51606521c1c1775ff7f52da67846dfae1e6573f0f9736dc07e07f91fcf32adfaed959d6a0e96162e2e2e965bde9a96c5fc295fd4daa669d26ea8af2f72f32336fef686b9bfe4d2f6993bf83d5d381c4e4176ab3b2a4a212a32c9f8fe81f53e908cc8826c9971fbc0b9d2d6433d6199f59543abaa8aef09de45833f9ac587de8c11f657e16d48ac8a0cac280bee1b09c777b20e21f19d96d4dd9efaf37169de2f0a919d680e4ae68c241fb03daf1bd13e26f6243816d2ca63d25fb5ae15d618d48408037ab885b53e6efeb27064467833affa498967a081d6c711df329d8bc605eee268ac4b8eed09e4faf8132b724394d26c86e3dfd9af4e42dd0e5fa1969e919525bfdd321cb64e8b68d4cc07e392480b140ae59c7da2d1e4e7b0fafca473a0c8078d83b3d052c5d3c9d7e9dbab2e019a79eda34a0e8f8605d64179d6fd0909096bdef0be469fabafe68485d59a66b92c81c0969074c192f6f052fa78ee1953450f00a25e9cdcd8d8d8e3301dd75d5817326d9eb333a4146a3cda4d861cfdda9e6fffd5d4ec8cb6a19eded3cea9e1235ad18f67bec97565e79cb846a6b3a3abf7ebad6269cf66e327eb64169d81a2a4aba0635bd53d9b439b2b82f714b1a61ad8e341be4dcbe176bd78881d19aee050d47a55966eb7a5def14062f396aa8c26dbe6775b30f282b55d43e74ea6eda82db9e05a51262bcfb69379e3c9a0add2e2daf964452564c6395e7d56695e4f5ead0bb7ccebface0ac0b7900a756faa81da1fbcd8b9890a4a444aceda6a575f4e47303640c767748fe5f7bf40500db2d741035ce39a0b6891eed53af690645bf84cc3d5ab57b5819a158fd94bfda1d24f56c31be21b471e0c554f04d73d0b427f18c30c2d29ccb7f47cfe72f689c278db561bc97448f20ecf1b55e7cab5a0733087c4ae1bfa18f4ec84e8cf672d72b9fc5bfb832fa9e24d39fd2e7fc80622a510e777bb0ac910cdcb3939fd394e9b238605d690ca28a3f98a0f9f7bcbca102db3834f0ef7d4854cc3e25cc74b9af6becdd8e9d0221cfddedeeedaf1ae21f65e02f26402b2f81720ec7823bb62be7d70e3cd6ab470f8e9ba9632c6930425e9e1dc7ceb077ee67ae74f9e5dda56bcc52340b14011ce265e699b6694fd7a8c4ebf3231376f4b31762add5067821c528d6de09694940c1716161eff2de753587d84bd71382456e45a7c60b0b7f7f28af1e9eaa483abfa22548edc91524a836e69b03333329a2536d97ba8856a49a536f7bfabcc2fa56d37dae3884f696969f99a34fa9df23477a6b1a9ad8dca53cadaf380ad38293d4dae5f155773eece2dadd6c6b1b1b13582bdb16bbf038c275645bd6ad9f1574ed5c77eb27ae3a7ccdf6d333c6c64cf547e34fd75c4f5815d514aca92bf85ba0db6360af4bab5d5656aa0317e486e96b23ba9e5779311885e44f2ea187d2b9e25f1fc6bf4f81bc8de1aef6b439e92d7b3841375ea361c5cbde7e926ee544262e29c4e9b73e6093e2e2be57aa6ceaba3d5e9dbdea85c3f8fa597aea5acd6a0acd600a91883549462349562fe1eb1f4ca339db777916146330fbb9a9b9bda073664ed837ca54df080980b24681b5e4a8618707fdf273c1e29fe8db039f5cac76dc29bdf397a1a47cd0e78797b2fb40d0bb32abc4b4282d00708cd3ecec05d9dd5a0e9cacacaefcdbceafeab70d3dbbb982870cb6851c49d88a593aa69631f3edc80ca88bf44ca3950ed5acdf39441434343ccd572cf1b6b381996508582211de19789fd0b52fc25dae4751325a61ab46a95dbe7c5f204ef81a4aa85c9871efae1a3ab9407089c75b534f74dc97fbe5bff2c5ce6951ae9f04a036573a23b125bddccdc2655e6bf870614d6d4d42ce89ff58a7b3278f624766cd51a15b5bbfefe58c19ce262f84981809a78af4e5873d9d6407de997f9fea84f6d5dea46830bc1d8ac562db013513b2f3959f3446060e0f36463fb85f63f606d21e1636bfba2f060657ced79cae0beb14c1adc0f073cc9adeaa056e9f411b246a129f99ea92547951a93fbba4eaca7374935f37d48063dca3273dfa9907f723e7279862e8f511d043e5849be2f5201703603e3e232da84cbbf828e762ee452e291e8ff090000ffff241161e8770e0000",
-		"365b40bdd0eaf3ff91befa9cf678cff5": "1f8b08000000000000ff9c544f8f9b3e14bce753bc9f7fe7e06c0e55d5029736daaeaadd54bbabae7a74cc039cf89fec076dfae92b2024e44f2f3d016fc6e399b145fadfe7f5a7d71fdf565093d1f92c1d1f288a7c0600901a2401b216212265aca172fe9e013f80a448637eef5e6a650c0698c313d24f1776f05dc54668f51b43ca07d6b0422bbb83803a6391f61a638d480c68ef316384bf88cb1819d401cb8cf1488294ec46dcba607abda4231cc4a20ccad374f556b462983288419e34b691b7aa155510be9e2f92bb65b2488cb2c936b23ce5c3927f5235e24a25e5437fb374e38a3df44133b611725705d7d8e203fcbf5c2cef96ef3e8e410ad5822a32a65de50eb37eeefb69df1fcbefd72f5f1e1e1f57cfe926e44fabd7b7f5f3d794fb095d990aa416311e94cecd2a53f1cac5c4db8a81d094b1e3c18d3e78a1da7c76eea9af4c76f96e80ca96370c771b367d25fe0616509833c68932ca461441d66f41787f34774a697d4313daf4fa30f05a48ac9d2e308c04285d00eb0a4c92848168c84967bc46c28cb9b2bcad3f686e1a226759bf9bd428028356e806c7af1c4ee6877eaeb2741bc7b5d5cae231d02d706c78daf3b510098a9786fd117e282e4a9fe0cafe1d730d5d9ed629cde135e5dd6dee6e35efff127f020000ffffe59390183c040000",
-		"653d997454aa41f83d7201bb5a44c823": "1f8b08000000000000ffdc7d6d73db3892f077ff8a8e669f8872144af624b3bbf628fbf835e32ac776d94e7273b99c0b2221096b8ae001a06dedacfffb155e48822028c94eb25777fa3015938d46bf77036870229a72017b677ba7bf5f9d5cdd5c1d5d7e3ababcf978790a23b827694cefc3844648109a8633ca05bc82ce20460271c1309a7776373486b3f3c3a39b93c39bd3a3b3f7d7bfc1087e79b3bbb13118c08432e0748e810b86d229068611a7294434a14cbe9d23c115148ea798034a6348698c39a418c720288c31c46432c10ca7220c438810c3933c7961663e3a7c7f7473707e7a7e79737874bcf7f1f41a46d0f9e98dfa95f45950e71fafdf9f9f9cbd57603ffffc4b3c7eeb033b393b38ff50806d457f89ff3c29c13e1d5d5e1ffd5b73d6e1c32feae707dc3bb83ef974a4e19c796b7007e767674707d747871ad43ff7d5c9bf4b545b52cc5182388763465381d318fed8000050d02c8f046501cab29e792c7f62467888b20c4680b26cd7791e097287cf688c6104ddaef39663c4a2d9356673e76d4ca37c2e3584e2f8e80ea7e294708153cc826e9490e8b6db8700f760f4cea243fec8048219e2079285008702b129167de8a6dd5ecf0195bf040b98897962e82b06ec7a01a51d9dc4302a4784244d31fbedfac3e9ee4663049954841403fad0d5f2f053630b33649863b1574a2fe83589923f8645ced2e6bbc7264583015c9f1f9eef008a63d07480d6b5f41286e7f40e43463927e304031533cc3804298e30e7882db4ef2985c104239133dc6b4e52d25fa75ecbae0f82e5d8e1e4b1fcebb10f13947009503713921271a5662ec460d8b35f58022dad678ac55182e53ff7172771d0d1e4777a1eb3bac58b3c6b332ba9fe3b94e4b69184ea4128189907bd50d0537a8fd901e24a558e510666f068049d8e4ff58a4da5f23a9fab54eda8b9e9546ae2fa9806670cf33c111c4690e27bb8c2c29d7d4259a03c00e8a4d270cc43155acfd384a4d8c715990469c80562827f2662a6a5d06afa860ca99b20f5f0ffd862360d9ec824287071f20f2976d8f24d3a184042844830cc50742b93038aa4b103d636e38f02302a2955fcf0a017a6f84104bdd0236c58e2132deed0d4684c7896a0c55925ed82416bf0a36d76ad1e102518319f0374545cedb438c032fb7cacfb640dea494e597858a7b36e9a58152d0d497c46ef3545c70427f15a6475f5a49f19ca32ccbabd908b4582c388f36bfc202495462b3be38446b7bb9dda84585c092472fe41c6ce290ee67cba9e2cd4a84eaf4a2d3082399fee36b0cb7ae9b973c8b1ebcd34a3f7529ea724bde52a88f721c5643a1b53c6d79a4c077e671af950967e40d29d0ebcaa508624d52e2b5fd25c386f692ed46bcbd08b0c2e1542d288ce493ad5b5df0e5866341840f1b67c568b6a36093df8a31e50d404af46902aba5e32c4d82e48d23ab250fd75ccde595355814986bf0667a3110ce50405ce4e4aa14ef88b8e85a355b02475842a115a822984427331a5ad4229deae120acd45ab5494103aae6894acd6134da156af6ceaf4af271b9a0baf70ea3ee4294ff22c4602ff86f86ca42b9146996b97b37ad4aecd5485c04d3833c205658b90e12c411196ae8b83344f923ee8ff767feabed218edd85ab7f4526630aae7e1e2f9178de1ab1b401b7e2cb9ad3cb919c0ed586a713218409433b9764a16450da9bcf99e240924949725a524f641d6161386f96ccd45c16a2141b7b72ba9504442b198841972e7500015cf1e16ad97cf8e6476aa5adf55d71ad534e2629861c25315b4d46383819209c8e73027d39990cb600419666ac99c46186e499260f6a21c63a18211ec318616e184d1796d8e9053266af5ae158fbf5856580f2bed55a38c0b320c3866e2abdee42c6196f359d0fd956728d58637eaa4c62e3befba65181a4880771db7d4029c70fc14d46be0f404bba5266504e18957e1df2949834ea734ddc7626d7ea8774cf2482ec2be7181ae7747bca57ff5beb483e55093c93a60878447344d712470bc04d6c0109a2e25cf8a8812e603ca1c5f9f16b5d8b52ad2eb6e81eea64528b5e653d968731b0610b83278bdd5831d78bd258d14a7822d74f80b50728f165cfa64c95baf9c48afdc40eb1ba842b4a3b2a48bbeac7e82fa5b5b66254c4f27ddd77072c85d745519f5baccfc0580cba9014377530d143c411eead5ebad9e5c011f93071c07db75f1a338565984c47bb6ecc9247861513b435c41b88e6e81c865a104d9f52c90cce2ca571577501ce3f89a4a22324a13cda246e4c5a353b84612f85371b99322f03ca34c6d8e9007b54132417922168052942c38e1c031bbc32c8498424a852c3bcc7e24d5ce12ba2b1d95964c38afa82cf3d69c9aacfc3c79ca2841131c62c6280b3a153e18e742514852436042b8d8e9f43da27237222cc99049d062b416456d761de3040bc375bd56acbbba0757f9cac1e127cc98ee6aa333803652bfd14c19ca6606ee1366023f3ccb562d7dc85c6b42459bd956226a61d398d81a7c1ac8d58cae4db9c6d84eba9fe47502c1f723325d12133cc25d1a22aa7585e3c0dfeca43594dfc94f651d3fc3d12d90490d9b998463d142f4535da78ada5e4d69bf4171dcee3492548691c026df4a52cba43f479967fe723544e2bdaf657e5748ce8a77e7e3bfe3a8b1d3d912999e9b7b6aaaabacacd288af027d1a56e0b724cb70ecc3eed777a96b53ae39cafe6ef1e339be191f333a3ff7c50e1f57eb38648bda2d564c75e62c44d29daae6ecd75ed15c78df3dfae28066c50d043fa48028dcfd3b851b631dfff7eb8217df62f1df5895ae6deaf5801d6320dcda89d175c2ffca62477bbca7ce79b6c36bbb51db2241445365a9f23ffbdf9e8a6ddc4b3da32f47ae748fa5c4ec7f2f62f6d723a6613df6025092249178ad6799926b44baa94a2d3cdf99bff6ede2cb9717e5723d8e55e4ad4893a6bf904e31a6626658470cbb1e012bbc025ebe6c7a42a107f95252fb62e45a518b6ba0383e8aa7d8b1be9683415bcc329a685d35600703b33b0d716df747e70c5eed0d4342e96d9ef927ab97466ae75d47b056f2ec11fb5f4392b6853c43a4e92350f5b5bd1ba20cb231e047e4857571efaf857bbf9e2f1a1a5fc7f0571b7c036ddb2e042cdbb72c024442a76d9e87899861a653888c17da4f3aad66eaee67567bcf3f32ce3ae8ffc743ed13e8f9e1d1d6063456da9cd09babbd31c90db1cf0f326d01c676a5e503747c695f44b84510072e4892c00cdde16a51e8067dadef19e25277e54260557029a39c135996215c1a51ca38eb6df158164a1ceb5b2f9aacdecff445915a0471adfe5941a41636bc4ab048f09e71d64d6ad75db7059e43765fd3400fdec1b067a8298f52de4bfff8c623941999ce12329d091c9fad384db140d5d1631db40eab5c1746f089dca150d1a91f3590aaa724e275d84f04df87f7783c4dde9bf7cd2316944479820465f5a1114e054309118b2655095ad05cd4e14fd5b3704259840f0953f61e54a4f51d23e31923e9f414a75331db819f877dcfdb038a27931d1886c3e170ab0e103364bddeaebf9c327447c462075e6f85db9511fa854b221e2624bd0d02f95f4fdb933131af544fe5babed92edcd691559fd52cb22f189d32340fc63949e203c2a244ed4e5ecd508c59d06b1f2f5d2f5047b1ed544bc3fa8cc7ef4f35e2c06af5ed7b7b8e9792ce701a638699c7c88a574b54aead66c736a186de14673b7546fb6e741288a498edb4b76da99151d7d9b3d1242a97db515d774b38252911aa37ce5d59ea482a15f4911cd08432d311a59acffbc0d11d1ea98e3e37a2c9112745382b7538d536f0f144ebd1ee2381c08c7931823c8df184a43876ab010d12ead6f791a6a2adc490b479ab093776e9eecb3a3d8f4d21484916422882fe6a414434ad49418a40620a7cf50899c85a454a20cd93c4255ea2934eeb97ab22ef448e0f49ec2446295d33729974d5240aac94708618c79a67f56879e7668bd47d925776592cfe9a14b7d4e00d4dec2fe41f27b1626fb536568a4f05c5ba59ae21b8f585f67413ad04e5d056df7bad753b719ca884e4f6911485772325bf8321fcf39f2deea1ca8b77aa4dad519a2618a5906745638ebf1c5bd2d7ef6e74691f19e329493f2a5d373a6d56f783d9dc7fddaded2796bc151b892aa2d44968863c1b61df7723a5d7364bd9e568ad604ac865cd984d417a2271bfe5d68baf2c6ec6b0b40f75c63c57775a7b012a16692e9ecea3eeadfc173059e730edfbae31ad34479cc69531d6de176540c8b0fea7e7b2469157ddd21aabe7f5da42555927699617a3ea9581455423856b74e19ce61c1fa502b3d65ac95e7c390da132102f2913ec394e31bac341e0bd90f43da30cac1169e009b7881e6bfc81d32079c1f01da13957d6e351daf2f8d4bc34e2b2f94cab37d56a7559c863b0c5e4896f72a58025937b536adf7335702909dfc567fc3bc97e45a038ae1553f64654b16dd7b60fe4290d56566a1e12f4e6af02b41274c58b755ad4ca43d9dde4a17ce578a741cab1692d607764a5833c0d9acd967b599610d366dcdc27c859d24098b3044690b3c491d1a4b852a917fdc50d4b15205c79c6c5d640add7d30b5aec13486815390b282f9b727665b5aa8d9a7010330cc8e211250ca3780105fcdf1c26124ae3337c0f2318bafcc957e749ac5fd52ab2e775db6b9dfa9ad75d1914a26db97668b5e5afddea5eb32a4f346c2160c54da41517838a745108df1ba56c669bd876dd2573b9a1d7fd7f510d7c07baf00ae67cda87aeaacd77e4327cd16dadabd7ba77f40c16fc385730d218f45476ea1ba3aee61bb2356e193afdc4cd9b66faf4509f8bd868391627b216b94349512a34ee2dbac229eebd8589da2d6bab09fc5743dba5eeb93a50b0576bceaf04d7879f8743c77964b8741287acf1084a8e6524b82673cc8ef3348211f84b23d34e5c8694774e1c79055b432fbf95863cdbe5611802c311267738ae9a9ecb495e41471a89dbb80f9e28561bb8ee195c82112bf55c6e28d584d236b5ba2a7ba9fc86a4d325c59a67c7aa36018c6ad6e6d54a1fde961aad61fa8cc79c46b7d5ee7561db0e75f57ea65b12ddd2c9c4a40dfb4a999b7d04cbb1776333ac9740d0e8bdfc7e1ab7aabde6c988cd96f114b05bf7d57df9e2263cc149dc968bdc6ba79e5b59b560d1b67256072d19e21cc740525959d477018a0f13343eb181f82ce4f9980ba5b1adda664e91497de1d99745dbc2a863328d38aa9e9bf2e4331e5f69b8da9c41e0529e312a6844137d657e2644c6773a3df81b74ee39df190c3ab023ff29ffd52bf46d8bc510eb2325a429cd70da1294fcb1bf53120e722c8e4338a528960b7d697b6e2cf144fa1687d714715905766e1a7789fa32fed93efab8942d75582df96a5de82e634c8fa663d5701887709160c431309c5014872e6dce01791b9a4e1fea17dc977330d764b5f1208d5d2c32fd15861809f465f875b701215f9410c6fc6bb65f0092780f4660430dfbcea767bca3f6eb0fdd1cfec22d7feae1e8d5abc60930bf27229a412079f3a5bb482aa273d3d969bc01152a746fe84c9ae36b2082c3df732e0041668761fb376618dd3a9aa84fb6d73259ed80d8acd6406d85f87b422b226142128119d05c009e67620124e65e5832918bb7a2e4198d5c9db47c3f02aab593671de9fe9afd4296605a8482d6118a75c9600db914047b17ae2dd441bbda0e5a2824f1be63ea7599aeb07b2fa3b5de009bd5beba4ed669eb7ab3d9ae35119178ef95dab758d232b79e18a27fa118dc2e89674ac2eda8fa7ec2385fc76aeb770a9e60b86d37d69e4e277d0a9da63bfd19845a1df92b292d7ecd13b8c78d8d0d990d543788a95e682a53a55358e8a61159fc581b4981e71369861ab56b2b57566a8a8d8d499e46c51577f359ab04cffbfa4af2199a9709c39cfacbb7a17a794ab808cd91390f2af85d89b944db389f33e8ee10d3efe2037392377c180eff8af15f26131320d5026e91613a31df5f93c55a57179b5d78f9126a088b11ea6115dc47f046a6c8c1007e62d3b153635827dbc537018241f0e53f7ffada1bc865fe9fb6feb4653e0810e75aba18308a663253cb64831f229c099810c605fc146e3415ea25e9af25496c3a1d8f11aad155178bfaeb2415064b596ff461eb9766bb9577ba3f9be9282b660c974c182c9d117efd15fed2837fc2f0412aca99dead0919bd87ae468c1f32dda84b5298e107f3313db8276206995c5da972b7f3532784a3701ac24fc3e164321c86f09e9a8f63e90d98461f82c37dd362d27c3ec6ac6b1b4a9d630b65b971a78cdd025356bd31d8dcdc804dddf6025ce493096cc0e6c0b277bb2386937f14ed1bc5e4ba1e551f2301fda919a81a2f6bd43c6e0c0670861f0444748ef53eea0cb1581225641d36cf745f8ade56a513d8bb38519d9451ce059d03575d3e124ba6db80fa90cb15de7801eae8abd881653b15f52d8d4286f8c1008ea526a503648ccc89fa3ec73dd61f3f7c03480846c6b9c07c071efab030bcebf52cf987b94b243d7feffafaf264ffe3f5d1d5cdc5d1e5cdc5e5c98713f3b9c13755678d5a141f5fc108bed4ecaa2bed857049f01cc7249f6730492812bbdd7a574ef70eb185b4aa3b1cbd31726d805012c31c913490ffeac11f2e80f1e1609adc5c50928a034a591c3ec06b18866f7bb0096d6f5eb96f16ad63ca37bfc230dc7eeba702609adc1cabe634db503c908533ae83448a2618f6bc68dc678fddaffaa311ddff48ed0e28a5a74f1e3d950621a7d9067473a70e582e2877e71b0ce00245b78ec100490595630565211cab282b13502ad4fd24d38082239ac6f0da32310beb1549230c4474b9b611690e9994bcb4db08990b1e39c7b0fd06c64480a0909594f0306c6014b39c034ab219826886d21427929898d12cc3715fd14e2480fa6003e23c9f975f06dd0a57c847bbee5ee9470db5e429918153c3e7373c6218a7573290b441ce917803f98d6028e5f2c18f721265d19ca83032b227844d6d6496f60736e57d18f661cb6b8185975ce980d994cf97adafb0694ff665f8552eda3db894f621f2a3f10fd1f96f0c2398d33888fab0fdf69770d8db5558e47a9b05d1c03c6b1d3efdb6e16cade1c66f0623d87efb361cb6a34330822d0f40ddb577ab12cda48e127a9a54ff1ee7930966d5dfc5f69ad556990b9270275214e79352213f6fab4fff04bfbc71e3c901cd5321cbc2ea7984d23bc43f9358ccfae68fdf3099ce441f4a03a8a0093f5020878489c5ae9dd6ad8d6599cf8bdf261ca024f16548e9beaaf6964958e7551d9aa6896a1ac50fc2f2eccd81251114ef40995e836972a0c1dd4d8669022328dfd657078a968f52909e06160b657d94d11c8cacf1e6927ad1166ce276bf48b40e866912e6bc0436f8dc1dab42e5f579a6589c166f82b2fcf8d2b56240b70fdda627caa77670d07f97daed7e6dd28853344eccd1bd46a44daa242d2ce77cce6097420787f601a53c23dd7df5a4d678d77f8ec1999b327a73be88ac24553668664592560b9f8dfaff6748aadf34fabed6db96731ae3441589124b7968a2bf316495ae7a1e996311c73d0fda8c72780d7fc82aef112259c4901409756d5ca1560d4e5e972858b1dd4213d997ef5cc7904188c40fe673781f4f4212d715a06cf78b04d96c2d2bbfca7514e5e1c3d387c22bd892c35fcbf18b678ddffe5a51efac5e9e80e5670b4bb572586e5e97f8bf72cc85be2dd9b43014891c25c9026286ee81e6cc2c69546813336ca3b2221d5c4bcb30ad1d1165582a5d8d5691d1af763dafadf466085c1d6ea6493826696c5c6c9a847b97977bbfdfec7f3c3e3ebaec1bb7f08c51cf0f9140cd314afc7d0975f8fbd9de8793839bc3cbbdcf9ea6ee5a3ef17e8ed80628db601a60924f5d9b7d4082918737933b2bdc54894c8fb7529b673fa9c2b53db190d8c5556bd26c3dfe3588efaca0a8aa30cc7c31b50fdb4a7ac7a7e77bd725d1ad86bc59cbfbe1feef05c8d1e9d187a3b3eb3e0c9bfa5b4e8a1ba1bf3b45dbb0096f9a5449af5163b8b4aa8bf393b3eb2b55cc56f5cbb72581fb194ee5d284018f5082f92043a9f13aa547bd79a26f9a7a9d4ea790ebc2806a2117df97cf1b67b465e9ae2ab512cef109c7dcf5b9fb7761976119e19ec1aa347987cb03dbfecbbf8d0bb8d7132b58cdba3578d703a9b1d8a0fac90f169450e7716422d7ad206648e8948befcdb75211379fa5898b7a41f53f78e566be5f4363ec2664df7d20a7ccc30f02a7b1ae984c1cad6cbfdde57a9e04a8cbfd5723d8fa11a229c462be09a213e272c1542766ab0453dca7323ce81e2a9babd792abc63d5f28bac0e1571bf8e54b68206bc4fdc100ee71f1cd1e867512572dac80d2853eaa2d79d4d92ff4213949b9c02896c8f83dca0c8eb8f8e6ae9829049d0471d131df8549eb954185aba849d318622ccd8a639823768b5951145a7842784fee3087944418ce83ad9e0fa3f5fdd8beba133f47b7b2e2883170d5b9922cd496a8d4fb0ca5400444344f6218e3e6518fbd0aa2d94219ed0562c2365ca98cf622cc36eea5606bdafde31a86ae4aad391633aa7695a2a5b153f23f43e91473b549ac8a7122b88d4f2b8987f0599a4fda156aeb8b0898616684acf6ca528c633dd1dec509041c6353edcdebffe782cd22c25807cc3d4370afc5afd439cb05a3196682606ebb9779595c21c1f7e6565521a1c7dd8dc78dff0e0000ffffbfa0422806680000",
-		"6efea0b1a321e915a08e349981e5ecb4": "1f8b08000000000000ffcc595b8fdbb8f57fd7a738ff0cf2327fcb97997a67a1c13eb4db6c11a08b14cd027d580430251d59ec50a44052633bd97cf7821749d4cd49da9da26320b128f2dc2fbf436f6eff0fb8901561f423ae33a5e0f9fbf576bd83dfe0e7b7bfc05f69865c21fc0647aacb265d67a2da70cc04236a333c77bb89a2cd2dfc59644d855c4700f0c3eff6e7a9df46700bbb35fc28a4c44c832e1118e50825d263a98172208c412ac549a1546bb3fd6e0d7f93f88c5c03c9ffd9286da453200a2804d7a0e84704526894202445ae89a6824356127e446528d277ef0da14d1495ba62f029027b322e4845d925814a70a16a92e1aafffa089b5bd8994360058c9d8009ecd6bb7df8323e61fa4475acf1ac63234bec844c60b7ddbeb63befcccecfd6b8ef3133d2a99733eedfb112cf680d5b117934ea4f6dba89a254e4176b0ab72b81ed6304209e51164c9c1228699e237f74727bca3c4769291f2a42f90190a1f10564822baa3472cd2e86dddb379e89d96699e454d58c5c124899c89e42aa612404fee4792bbee07028771d330527aa4bcae1a09c2d0f66b3a1742052d38ce1c1c863dc619dff632945852bf8894a2cc4796549bf270591b40d8a5d1f1286790277583d8696597ff78095319073e25fa4686aca8f8ecf0b67ca1ff3dcda26f3764ac5d998c8b0a7bcd5aacd93f7a538d9ddad1fcd9e37f9d119b4734b29adc6a938c78e54d2aa12a7e21c46771bf5db70b10f9267aa68ca7014e573494e7989926ac233278bca08333a0cb27821fb433a22cfe180d5a13be50d3113e1b5c46fcff5200a76588dd3f71793e40c9f9181c28a704db3ff4e2a1f25b9404ab2a7a3140dcf4d52904cd3675b3d9f944b3ad86dbdeac4f9b7db1f67820999809684ab9a48e4fa71e8ab80572ab41615a4429a74ef5208f60fb177c838264db2418e9990aef6066967826f056fdface05d8d92cca41f4953f9aba69ae1071f95866feca448800b3e7090adb33daf041a53954c89ee9d756d17e4426bcce74276ac960db153d798862a4df4485791d252f0631f74279f3da96039cac7ffa9ecc8448eabe829cd57912255fd3b67cab23d9754d94491aacce2a8167fbf7d1d1aae450207d5a4b6f29b6f75d01d0a292a2045619a033fce000c43658e79631cd8d463fe0ffbd78f630c605b652d1475b1259111938b66f5194d13222c268c1e790229516883d3e8a09ad487b88bed78bbbedb9b5e63df39d65ad4f645bbbeb98537558a798ef9cbf79b4115b0e96fb2b9220e48299a2fd41b5a1dc3dc55fac2d0a7aed7e12721ab172c95269f2ce00b708411422d65cd2c4cf2dd7426b71bad055f4594d78d5e45a2d6a6aed6ab4821c34caf22536f8844f29fa5510b18bf0677f6b06d26f36671806bffc6548b30614e5df874b5f50f006267d3b0a089c23508db7c0a21ab96db0894f5f27d0ba1000105923bbf0c44b72da13b3a88ce0910a59ca494517d012d5c2041c668f6445286a02f7537572c87caaf66db0fafdce3ab0fdd8244853a78564d5a51fdcaf5be769820758d441aa513701416edcc51b6b96a64a9499e4fb161275792c495f81817226b546c0f4f24bdb2c5cb7e6547abcd74cb627d8056e6a443d85e4ba5856c133a6b549bd10d57a821bdd837b5c4672a1a05b261c3f00d2490941fa77a2ebc6f955c78dd69387c6fd5138d36399bc0ae3e7b9c017fb2ec0c705c0ab645971514596e74fd3430d2fa7e6fa691f583fbefbbbbbe55cc610b9b322749eada3319cd03630c61a1e220ef6c4b3db4d204bdb62f2af783a46d355202720396458d520191085c68c848633ab168349c4ae4e6c4053ea21466c9100358e236d3b7191e91e79379a643918371c6c360af5c0818bb01559376a0e90aed393ed15c97d3021d04ae59bd77aba7926a8c6da14ffcd54c7f68191db5c8012c72b073f5d2f86aa17437e588a344a5ac05aea28f69f5c8b1200d0b58ab4c0ac65222bb06ffff9ecda0c1f55d80345a8c62effac0daa18651130e922004163ee9b212b3a7549cc33a4a722a5e7df84ac78f3c356a9783f06fa412d2177d5100e59974b71cc6f239b64fae8c04570c43897953a5286d21f435dd56c158d594c7a31e31dd2b1a3ddc6bd56ca1c08cd1c74340df4082016ed8ab26b3832b5e5e73ca876dadad7e4864565ee956264e6cee0e2e0c1ce9581485429d407c579fe7fc30696c41544c7430d0b4225977b73792b037a65b09a6c145e1c7906032a5fd7ba8c05adaa1538b4c6b690aa2a6a80ca183af468789cd7b150aca306e6a26481e06c415b83042983335cfe1f2b75ca37457092f82cee72a9dafb53d0c7495c6d5b6610bcc5113cad4f21de217e8cf0e7a5545e465489251a563aafb99eb67aab2971b57ae483caaba55cd88c6a1b0e330fd12b53641dc95ee87456271ff274e3c788acdf11b268ec29e0d665f922ac11a6d611c00c3a29d8ebb0165b7adcf6ea19b64b6dd52df57cdcae7285a074cc6feee89c68e91ab83c1b20ceb63407fefef106eec359327efb1c051e2c56db603826f9c199abc70ebe184f68756f2f07e27152c1fe8dc9ac097afee2e6befb5bca1bcf882296570d3d0b72f67cc9154bbbb56a840037bde31539ae8468dd98597169de0dbb1c6f30a43afb1b3e20d21c43d7f8c29cff16c7cda729748aa6f9001eeea336ccd27e4e0dc6409da72fe0f0368fd543189e62f333186842ddc9b7f9704b77cc60c28b79d2c08c9fe967574bf6a5f5a3432ce89b15bdb671fae77dbdecd57a33474b2953671839293b99b467aa3786ace5de658c6904c8cf8a23a3a7c95402da84bb1a99a9d60d7d4e93795068e0e93ba8fc7c945b0554d975234c7d252896eb8c851bdb34afbb01ac5290c63a82d64df7775ac05c4f125f1187a2ead3a53ec5dd8cd3b78128881785ff6d4e676e0ac9491ece9d1b7fb012555137ea5d00e64ddb77a8eeee6ed984b548939dc3c64e6b3e0e339e66bff03c6d071f7f7dfe5e97efe445250a9749c9594e5fe9817c85e9ace49d392799b87bf756ec35b877d5b03662bdc959f1ba241f5835e644df45796ba87c55207be4face0c60cca9fae8593af62e6c05192baccc6cc61d85bc26976dc995fcf056e1f928fd1e77f050000ffff222970aa71200000",
-		"8dc98ea9b53fc120222481e941803c10": "1f8b08000000000000ffecbded7adb38b230f87faf82d6798f06b04ab424dbe90e15c4eb244e4fce3a4e3671cf4c3f1a1d0f2d42123b14a006415b6a4917b03ff70af616f712f6c1074990a2ec74bfe73dbfb63b8f450085ef42a15055281c4d333691316788e24d3c452d7eff2b9dc8162172bda47cead1d5920b99b6dbad8c45741a331ab58ef2c4058fb28462f3e35b5042111ed224a59e2a2f2fbf2cd194d26e9b5f3f5c44d87ca2d118a8c9ba790885c7864d753ec62ce28f178c988fa0096696f0fb30b960c47c34c2a43499b6db8811f58181f97f8b1f42d5f6dd0e1583823782ca4c302f8ff128622041e04d11c35108991ebc23390ac7e68be92fd58b94348c81a0bf65b1a0edb6fd18aa3c59bb9d625b5f8a4238ea61151fe771b18d53a54e09a38fde95105ca0d6db90312ebd69cc223b25de5f5a9db0d3fa4b0b0fe55cf0476fea4f784449ebe3a7773f5f5fdddd7cbabd7bffe9e79b772d98ee547913a2da4e36760e83cd6e37547d18f5c6fe244c1234c9a7175c8c515925d180fdf1888e87b6a91cc90b1950bc830994392998b1db592855659eb89b72815471f1f78c1784a4370c5f093fa16c26e7c3b0d3c11c0935e845137668d30f46656b55e5a6c58250d46233112ee7be0859c4172d0c9c6c92f0f7f5d54a521605fb185066595031a32dec87cb65b246721ea7108a59b6a04ca67807a6c40f928a5072d15092f0ab20b620d150ca13b91b73d107f511946d35112dbc1b72ff271543360f54a431670ac83fb101ffd7b48541677132ebbf2d0c29157198c4bfd386de6c121e46ef055ffcc7d74f374edea9e08b5f53ce5476c905bde53500c94df26e0713caa4089358ae4da32e931917b19c2fd29332c934912fd598c59ca57ba06592ed0d6d1abf4dcc2415299d4855c0ac08b53014df5f6caa7ff2b38c93f4a492a00bdfede091decf1203f5777affd3f5898e3055ebcf0f6c99c9ab62422a604e5ade5876105f9c09c9a154134017126c1426a9af8f210b675498ba74cc492da9deb8861c7b89a6bba00722d844229cb148f065a5963cd294afc8d05542154a7ee6692c0b5c3383d9906cf2c97891b7c540ea887c78e4bb7841595a2bcc8db723499d113740f7e1e4db6328a2b77cb10c657c9f5067e477701daeb91ac7291713fa2e16742269e462b28a4f34500bc384b35486cce287c97b9247da12ff16d3c760734b573213d49d7b69a29c79b89449b88f1e3ad69dad4538a3373ca29f059f8970b18f4f350027ef75ccbe1dcae6a439399eaae8601db4a970b7a75f7fcb42b10f65a2eb7d6deea003a569593cb143a706fca4126f40ef749cc28260b30c454adff2840bb7f032d6ce5dfa306b28db8935250bca222a727cd53079940198a469518eb3a4cd6eececdd0e9c17a75e4497824e424923dffb9cd030a55e96528f2711159e25d61e9f7a0ff143a8d1d343afbc9eff03f6e2a9b7e699c7288dbc58daaea8e97a1f4e2417eb275b5105fdaf6ec8842f161953e4fdc991c8a19ea8beac4d5756ab0b3c2ebc7fcda55ca6c1c9c92c96f3ecde9ff0c549c81ec26fe1895dd069b20cff6519254dcaebf45ee4645e0da14a48e3c532a1e9c3ac85e18de08f29151fd89457884c196d3189150c31dfc1e6a96d2d387d014fed65c1e90ff0144d0f4e7f84666a1c9cbe84a7697b70d6836642169cf5e1bb686870368043e3109c9dc273a43f383b87c3143d387b018777e2e0ec07d89bb7e0ec25ecef22c1b9eee9de5a0dce0770609d07e7a77090bc04e76770808e04e7e7d044f483f317b0cf2f04e73fc001fa1f9cff0807086170feb229a946a08317bd3a5495f5085ef4a1996e072f06fb29df2a659fc293bb43f0e20c0e51fbe0851e2287ff0c5ebc80921f0b4ea1c6c3062fa1694b0efa7dd8633a837e99dd619a82fe195499dba0ff02aa7c7dd0ff016a8783e0b40735b63538ed43411582d3c16e0c83fdc346714614283ffb14074a32dd6e51c4279a77f7c328d273721da752b5f76213465110835804e12ed0814c05d21d86a9822e0adc3907d1ffd24ac4a2a18eb8ac83ee9587ead0a10b2de8823fd0a733646586788a04dedf24cc51374be9db70a996951733b5297db86ae121f54329c3c95cd7815a9cb53a6a1acae253b73d116d82154ded241cc45e6f897048bcc84fe55992ec60b31bc3e9f7a0037088418b0fb4a800a63081081258c203cc61060b58c30a1ee19e6c56410fd6416f979f6f5322ba0c2684762524441eb32e3d163023e931ef4c8ee34e020b921e879dc971d649a07744c8acdd563f8b767bf69af40859bc266717aac1019a92ac1b434478378425098fe32e3fcee0814c8f69273a669d25ccc9f45876a263d159eac21e4c61f376fb4117367f4d7ab6b035498fa3eef478023d42c8dac6aec8fa55efa2bb3e1904eb9301ac480f1ec9e478d98d8e13b8f757043dbeea5d3c7657c16367854fd6f048a6c749373d5ec2bdbfde4bbdc718ef9cf137837eb63fe8058c1fd199a094e84d3b15931313361b7d09754fe523a58cd1342d419dc83afc24e129ad42175175583ad11b7f3c89e5ba0477632defb069ae37d03473af8ae005ec7529f8010e141ffcb81bc3f973d8e98425a278331fd1f10919ec5c281debc7d198f42a54086f52a2e2214329861855e80756072d44150dbf0a2773b565a0100f27b928c7a46bf91f99f84bbe44182441fdcec3888df1c972c4c62048a47e38e90d792904ea74b859473111233e1e3e8ce271872c47f1f858eed8112169bb8de62336ee105dd6ae42a8f0e661bf3319aa0d0cdec44841e15a874d7b55ca50358d8cc690a8df6e1f548bdd3263059f8ce89810d2edb7db487f27a370dce9c3d45f66e91c518cc1829884761b2d475477271c4334a263031862bcdb1f4fae72cb31e9c152fd14c54a3c9c96e3acda1c92a99fcee3a9446a0a6c915094a6767c1a993902010cef769650a91e4ed49f887cd222637f2268282952ab1d43d218bb6c8c7d688c9d37c5e6c4afda5de1b438ef3fdb6e6dfe6f749da239ce0190c430dfa71c2ffee88298ee638bc68fd0a07eacc691a30a9e9821a7c46d588afd45b844ae503527f0233ade617f1a27928a26007aa410688741219e995590446db45136a1c8ed4e99a7c37678285ff72ea6a3704c10ebf6f1890c74a082a37b78ef60786a30fbf012d00016bbf577aa96621f328361ac11690586d4206d56606b56c5d6986405b636e1680cbcc0d11032859e6923724dbf1fb9641db90486e93efefcf087f087e5a273eacfa8543d4811536465988d98462b8124e818dd190159638be3296204b1edb675cfe5bc857dc9aff923156fc394220c269610a22062a6d86515c08284a5862666792437ba17ad06ca64eb48c5ee716057aba5969079e519d633db8ef72d669117a7811733f07826d571dcb46b2848bc3b34bc598d85cdc7a6a7b52234577fc861be3108d21b8a5739ce0f4587f4b1ec103a12635ff20f91eace453fe8e5132a6bfcebff5405ea8cf16415a1bb442ff24282de3ecefcf8df48737ac31ad5c9c961d1826258d48a1dd257b2dd469448ac0e038a3cd0ff9f3cfc79f2f0f2e9a9ce87e770b51bce4ae9993e39187d6da12b2b149b8da7a624b90f27dfbc38f568be7e25f7eea91716aacd96d12cc6848d64a1c88bb75b6462c8688c213643bfc90b0c044ce42ae03b0c74077c3aadb4d1f48a1347fd5a68f4a45a7b3c5f7a8d3d07ad165575e7d3dbd45ba3228d684225f574d33565cb9772a81b0f19e90db35761c92a66381c6546b7a93a420811ed76e8a7cb249e509441bfd052d21d4c63419d9ee55a445d9b222122ef07d543c887854ece56f85aa13a279742846b7f29b8e4aaf9b636a3602db2401fe361a90ded0d6397c58d73be4d8ce2f1302c3a60d581a13f912be04ee377b5756848de3e595747db78baf6ca13b6370d9374ed198b002f4c3d2388f1d2ccd80894ad6464a44ed0d05203d582169f4e5b63500456be6265db258ea788faf330fdf4c83e0bbea442aecd04ef37e8aba9256fcf3d35d5c7d39846e0a5319b502f965e98081a466b6f1ea6ded216e9fda5d551a56a05b8b3165d1e4a8dc5d0b45dadbf7271734698cf19509f4fa7ea733a552b3c169430fd037467d674bff7fc113f4795d6c80ea34681b1da712dc697d820f95729623633f820f5ee2e701513a48b0956e0338ac7b886f45ecc3c6ad3c37d1191c682bd8990b846528ac5aaa7c88cd050d382a2dba5ace981c791d73b22445c20aa60d47121505fbbdd3e3dec37a8e69db16b2090eef675d3bc7d5174a38e850cef6a32a87c1ad4889a761242241624377729c809bda081dea30a2b144e981a28b58de892f482cf09d75010eec751bedabe8dc4b822cc2a46e74631f38e1c0a6f1492a1d6641eb2198d5a30719a3c5519ef34b2a1562ac3fb84b6803a0013cd0cd8c936cb8cbacb2cb77250f4a915468aec12e19bba6ed74b7a8184cf7844dbedc47e294e13849fc4ec5bbbfd80cc17c641cb48c3ea05b4db45094bfb55669f17d9779f09530caeda18d3b73c63d2654e2284379f490f5865ff74176962cedaf0b943f439c7ddd3d1835354521aa3a891d6735492e9bc096a9d1b72bd476d6216cb373c5a23ec3d86a9a756208dbcc758cebd8c7d63fc9179aa935e1cd96d9213e12fad12c3a284dda46648e0212757aad637349537f451959c6b3c508c77925cf96114a9e84ba94eabd28f234241b59d4858208a618d046eb791f4e3f473cc188dc851cf15592cab4c15a89eb3f150716dea434b22c16e8b7a595c59c9a6eea6c4cee83da8a2168adfd2bc2d560dd08c744e216f4679da58d76352c7204c3fbe2e15d9d2c2dc1c0df1f057444160f86659565156372f27cba6aa016c9aaea241bc126b9a26daed05121a3fb8fae4fad3f6d8165c74da3651ba23382b47706450866abc2d8cb0d8b05c631f4339f717314316263f700f3098d3821c763a05c7638146620c31e1b61b4744cfd4c5cd288f1907ea5b8fe5306eb7638551ed36334c565c6ce2ac6cf3a26c738ee8cc5f84694aae15d2dc648b7b2afc38bd096f6c42c3d6aa86d153695e3ae75912193e90e9bc2d072fd6ee49469d060a5cdc6ea91f85326cb7cd6f91e0e45ed59a9a7766bb456ab98289c6e0f4eed1b1292b0fc6e5ee2c2ffa9d7c073c390dfa3b6d6ab7df41ada6f35229b289d611943c44c9891adcbe774cc196f3751a4f523f8d1759124a2e5a18aec8bd62f1afc9a35a590d5ba3d4c4ef6398a6ed36ba2665d0947fd3c8d87e239b1d28d2f72bb9f2532a65cc66a99f6a1cbd15214ba75c2cb65b3e8c10861499a22ec9511feec8269574e92ad2e32952dbd9678bb547bda139f15df90a12e1e19d9f84a9fcc81f28a1506e2b74d9cad7373df90c92b057c4eff5f3b1be3c224411934b2241ad4e0c7207760d16763d0d522935ed0a8f77903e016cea55b043a646a0d0071b3696c11eab7c8053862b3f660f611247a1a46fdef015c2ba995a5779b8e66ff9e2b1a3b6510b32607a5daad683e401f325d73dd1056a9cd29602fb165a86d6dbcaed1ea5c86c20601933350841551a67707c65b6b7a14be38fd80ee2548f9b8e3930c42a5f916b07519c2e794adda669ceb5c26014736fa1a396192addd24c7d192a1984502c81e0ca5a0532c891c8d141c5e80ec35d55dce0f27a8eeaa328f1e905678fa00d068cb0a9eb83fb03385c52d07fa9d8cc06a56c813ea3b3f1e8a5b670b5969c1553ca4d942d035dc67768f272fe9211b6dd729044aa1f415aa9e6e81d73ea8bfff8fae9c6d7e60288e2c01c1843c8488c70853d353c54badd3a318ab6a4fbe4cedaff263c8c3c631da318179e494f17e1852cd2dc4b6a8f6cb9f1ac8e2bf9c63037586696a54bb53dada2b169fdacd0528cd021c2ab392545c242e9c5a967d767e0dd180e4ac52de2345503838799e220f4c69e2a3626d5fb8911001546bece865bb6734aa46534cb764ef7da6936da16de6e1b12d5ce7bb81baae8fd6ef8de1b2ee79e29570fad2ac50b05cdad94a3bc579a4d9ddabd1ea67aa387a9eda05d4259ed785e9cdbebba65775158c35c674d14d60c0a611bb4a0eed9aa2e55d49ccf764b5ff5f647e283e9b4650e3c7516b488a4491808c290412a7b0ce9f6f5094414fd97203b7d0c6504ed48a09d5aa48e2af67907b8db87c131ed2ae09ad0f3cf379b11e93015aca8ac07baa23282e675b326218aaabbbf5ff7a5f4121aa6d2938fdc54ab91a390bb4db9f0267cb1d47caa9dc97c3415a35b1d4f3d9a2a2c88ecf48742c7082c8fb4c08a3b03281cd3f78abc5b16ed3d927abcb65bd9346806eba3c2fa4a37bbc0fa9bea506a094338997bcb50c8d89c6a0b6672a6991de1c979c8bc9eed9e367628ba6745ecba332acc091df257b423b51a372efa258017fd8a6b42f6ff1ac4150501ea6190a45f8cba839ddd3e38d859b557b1d294577d35ac0df870a0256a0067228e2a28508e513c457d42086db7fb46566187c06d6c7c60247b43fe4a96eaf090880e3fa643f1baa7ce1879a74210ddbe4ac0c0f7523a8877fbf89816742aae5ad1e4263a79b7b75bf127fa7e5ae9bcb58569eabef929c4ac993b0a99bba7e9eda11c05aa474185adf8ac94a0a6243ca6c712a68477e263da49877a141cc20dbcdb374918e2bdb40e8af508a9d4703f55e543a18638964dd47e6a31f88f60af1ab7fb3009d984469e149456d119b839a62ef9231a0035e8dd33c35862793fc7725eca8a6222212483e31832f557119aa23731842ea58e212bba236a22a943dda9d38e9252bc26057d68d84cca6568752d0d4b30324b704f7156958ee99278595287e1611348a90174a9ad43663b0c4487e19dc1fdef99b94912ff96512dfd52f36783b198246afae229fa4eaa61327e8d7fa70dc5e4edd6fb071864a71ad90592101f4b8bc2654fe2631ddfed97db86b311f2bad84eed82dc15b859eb3563a8f79ac806b674ce794abd7411260915debfbefdcbf73eb802fd2414b37c97a863fabfd8bf2c5e849041da7063cb7ea078bb3d1b609816c863488134a4a098f2b01ca4895926d3842bf2793250ac4844fac3e8d564d8e944b85e484650d409f1bf4b637a696964660a7c2a633c45a9cfe84abee3d97d42117e65497242c26151aaeee592184824313c90252124d96ea785e43981a5391eb4dbd352329260cb152b1ad9ede30967326619d50d1b3e0cf1f794aa6a9f133752f5cccacd74cc1c3b1d5779f2f53fdde597c0c228a22290903336012f3edfc48645a0410c39f17a13b35b416930856528e7410893584cb22414d7a620016a7b508752b54b042930ae7b1c4ce0319432fd2a059f85f2f720017721049151eef27d5e79e8f0d3da3ea838994ecda507ad99386c1c9c9b02f7cf1587fd8cf95c2e656859991a71d50b1db544de8592160c287df43862759332398f533fa534aa6adead425f553a8cb8c7c8e05843ba68a6d89503f194b063d691c772f8388f138ae86bd2df6ef5265172c4c77a7da4bf0989ba031348f80c517c422b9a95dcb8a0686aa14623b433e80f7e78d91f0cfa671d445fbdea0f70fb6cf0f2ece58b1f062fcf819232d046a7a767e7bd1f063ff47aff49ff93be7efdbaff12832ae4f487b31f5ef44f5f9eea32ce9f2882764ecfcf7b2f4ecffbfd17ff495fbdb2059c0dcefb2f5f9efef0f2075dc2e9538de89d0dce5f9e9dbf789937e205066716000d5efc78767a7e767edea6f8240fbc68d6f83824666f1e8e69dd28b97226b3e8a3982cbd924bfbae6e7fc85ef786dd2ec392c46669337d92d2ca1ed08a373a62ea8b8d8928e6c3c5ad5cfea408b8dd6d9df2a52e5f629197af4f6a5c1bbf80fae3d4c481218e8779ee769b213aea8d8dcd524cd8762b0c2fd7a0b837a537d82a64a9e48b2f7ab97911a7a9a7768b452827f3f20c75f9f943e0e9d6e1f26a7645ac908bf58c302ee090ceb3e934a181dc1d90509915de1095dfd32529704722a9aa27d95e94996312561232164fb958d462676196a671c8486c95a2cf18213a21869c002d2591bff9f77416b39f97512829794fbec16f3e65910dff443ec31b22e11311f09bd674432e71fdcd157e19eaa520861acc411f69b0f58b35044962f62da0506a0603e62a5f45155a6ded4f404f0cb42b056bb054283823234db23601a28587efada45c92a8a2344052cb5c08834f48422bd383d1c23840525fa3374661f0b5d331006114b530860f461bf713c2202bfc6631da1f2a5adda424fc51ae6acce5cb477da775cc48adacd6cb86b4c2ae6681e668fb055e203912e362efb58a2ed504f8daedc227c420d7d662dde8a35e455b68f0296f85d06ddc6e15df0e9c4488e90053cce3cf16381fc1db5c210521121063a04784b0763b448a01843728b663a6ab8d2b8a45d708c2503a77dbcb1aae98cc9b3201276febe23ba187986fb76b0d82377cbb456f1585eae572e4d6ffdeea789d8e8a1ceaa23a31b08ea3593bd086596d2a73f00b3b5981bee751d5cab9b684477d2b68e288c2adb1d37cd5abe002dce6c6460cfa0ede163a4f3d43b9aed3a2b27658a1ca94565309ec35e9b5db36e896884114d0a20a2d9aa0df20fa04feac1dbd85699955a56fb747a2a635cdf1d89cabf6c4b7325792e6c25b6344c54bcb4aaace29b921272e845a4ef9ae9651e3347c6c321cd8e98e34e81715f3d46cea42b1d9717b20c96dde68a6f9798629bad517078a02efabb89a0f8b28c6b8516758f4495e5ce7226c50e31b5c5582653d57c57690d3077bf981365c7ea0233e8690c4aea96aacc733c8e3742389441f46e118625ca80e1dedf8f51fad521be23975b6dbb68ad85a0bc4b8b1a21b843765e81bc29b771de2588f7e56315dd2d7b789deb5db5f729bba5ebb8d7eb32aad42cdf505430e407ace08fe5aee918e25d1c565e0a8af2e73273887d0a262a4a92d913ee043666ee8c3888de478ecf4b9a8e8eea98aacef1b8d86eaa4ffa128ce2d6b4709dd6e373b68654c1d80d4f1e843d48a8da67ec259ca13ea3f8682554f4281f755aae3189b6915467195bbe7f7cfbc7fb965fdab760ffb9fece7947aff5a64898c7551fff2f8d2305e2c95348cfec95ad0d27f6eb8a48127e75450554898a4dc3333a43a14d1699825d2bba7f3f021e622f0deab9630fee8f1472b55d615fc93c5a9a7ba1247541416ab8a1d0cbdb219defdba2812e9cc349ae97a4d6fb0dfc240fd3203d1fc58d14f0c25b7e140697b0727d39125d21f9afcd35494fc170d2aff60b3835b321ac35bb2d9c157d28377a4071fc9af08c3cf957a2fe6c1037c51a06fc80d7c2237f09edcc04fe4067e231b2bcc0826608fe3c112ca837ab0b0010d93e4dafa20828a30a74181fdb5d0991f04c989610919ccc031dc0a3ec29ec57570efc6058fe030a7c17b2818d3e02798243414c10aac142258abafb2f526ae503c4fd16f1818c2f0dbdedd0197ebeaf68d814ccc22bafa342d76a83c22b701d5a2c77c013b5bd75076481f5b2364cd8d165705f20af6ae16e8c39eb6e6d25f256f67c28611ad5d91c51b6b3074915b175943f8c086c9888d1b6fc9ea322dcdb535ea8d9339b549c8db24f64e9d85d96b6e7c8a70a7f5fffe3ffff7ffe5b53acc89dc53474ebf4f47af15e8df713746cf829a2cbadd224a363b0c4c935c2d33657a0e9aec557373abbd24885de35508c911df6e731a3b92e32342e26178a18fb10a22283d9f9158ad7d6dc2aa7fc05828ef9a54b3f6e0f61d3739f41c2c794a8cb84733b5264ed087cf0df1fa92bb8935110f34e1fae6a813a74dbffa7b8b80b6dbb9ecc9316d358288558358ca5f5d507f15f44ca1eb2688f505f5d7414f1d9a0e9572419f28815db0a0b77f93bc3630f6c678c3d05453cac1091b06276c1e9cbc88ff85c363207e6f82f8fd82fabfffcf0ee0c1f2e58554c35ba2e6c61a20fd8d4e24178328e0a0624ea320b671a75110ee40b84656a52116a91a2cb9d3e1af483e67fe2aa73a79daba4c5b13b6abc83b044da924ced66207c2f6b8b783f83b1a53e2cc1f6e4e35edf732ed772277107e7f53ed2cf4f29b004f5fef6992ee516064996f39da104d51bbb91fb3940af98647314dd1120f59b73bc494e86bcfaefda5b91d35b12d4518e6be916ba8497eaf52b411b18d44d4de2961e4a138d4a892173980b9115d78c7f34f92f8fec458246ae7780eb55f2d79aace88ae458af5890761c3b6306424460c36a6b46b731deeb40726fc96d3e934f89176cf6026c28758ae836edf1f809c531906fe8f1089d002f9bd81f612f655d26530e8edcce69d116659adff330ba35b41e9765b36e2b72c8ca4a0f45e3bb22b40dff08c45a906345dbdd7112dad47b230ef4438d323e98045795c0bc3a48034767375d8b48c6d618888623b249d6959a20346b3848a0f454a0b43e234335a3ba065640bc352f1880feacf9c6488619891142dd5f6b1205a90b3260aad60458e7af0487a704f36f71aaf8225fc66872a98db69488307c82d51030675235369c5469444aa0e3f9f86423431cb1149df04b3c6ed15e3c503178f149c62d61de3295be432bf0bef947829bfbbccdc3abf56b839c3258e546799735bc07650dac8d72b2a24424b977d542dd0b21d5c94e68855f499755988c767c56a552738284ce7832af128f4aada66a7c1bed91afc8551a4a5219e9942753ed234c1730d2af7363ad96e2349baf63813ea0d33774812bf26bd8b38e8f61dab9b87c22d40a879ff5b2ec3e4237fd07e9c1a0e0a8ff920eef5ad3a8c0fee30e69cf9eb6eff023d5486f0a8870373423386b80d772a9a8c6467cefd8be2ee05b516af6ff8aaa1e5ab761b3978bc52673e98f9f77cb583aa91b19b59adaf5d41bb1a5a52dc8ca21788f916905098fbe6fc9ca24d9e9bee0c7f838302706729e1b3056bb06ab126a75ba88ed9ed4a3fad0cee3184e81ec37d8dafad12c660a01d49d5a85030e8c31e650c06033840db82c12954f7966070060df432189c3fe1ffc96e4141bff784f32687f2078317bb310c1aeeeb355c0eacefdeb9929339bbb51e74d7c8c45ebcf878f98fbbbf5d5eff7c05623f8a17511f6e6c54b81735a46a5bded88d6d44c7c3acd8f52f5066b99cac647e20b3dc4d19b7c601722088cd050e848d5b639b7df5ca90051b2aa25f737d71b516bd7e25b474af56c8fa75d86ea3b088dec5feaa4f24c4fe6a4038c4feba4f84fa1990705f515fb7eb381b281663b3ea073d58ab3fab81fa1a94f6e79b7bbe0a62300b3610a0896be56a84aa5f57db338dd075f75c32f2c41d811804e9694fc3fab6a4bdd8544cbab9524cdd2bc5a243e8281bdbe10e9dd07a284e4a2f1d61f9bdd317370541cc5ff53bcc5f0df0c90042155eabf05a8587c6604dfa2e0b950fc22a101d6e54b529eea627035807613566a7fe2b0fe7a55b33b52abec349726e5ebf14f12296f183b6a36cbe57eb285684afaf9a51ecd6dd5054d0ff51b5a3c154bf6975169e33f6784fd1c0a40e19918af7ac3091bbfc0adfc6a28edb819caf5e7509f38b6cc7b43861fa2bc861d60761d6258d1588018751ab806b8d3170774c9e22676a649ebd80502a667ac015ae1bbc85ac40b3a1bd2594e56c4acf917365a5562635dafd296127e6fc3c4c9d8e77c8f438cdc7079c94b59bb21e1a232b3727446e700d09294d4c26c7934e741ce161a2afc9bbd9c8e424a9d443a29344cd343bae941e5723d6608f831d22ece7ba4362e01d536d789f2281d5022d82854e10f163de098f437c92ed0b7a064f9bd6175edd1cc15c2996cbcf9f563b61c5721385124498c0238d6773b97fbae7173ce83734a7c10ee9cfaf992602dc74f0cbd7947b7e1ba8f35be580f7637e3e8b1b97996d901e22558b2fb93a50dac179d5bb6015621794b4937033b75d996f6b36666d63d6903ad8151e879dec38c34385fea9de9f90a85a45f9e7f8e45cad9603094dc5e56ef8d36e0c13828ea899c8edd67e383d302364e3f1f1f4243da676a687325f4d1d32390e210fae5530035ed22295ca4bb23339ceaa5c5c0ca396535d0b5aeef02992137f2fc969707fa970ed3b3c64e5b445ab1ca9e6c07a41df09f58381131a04a74ee8b4a6542f7c15548a23b25a2091d5228934856af58d2e96c8461f108d4219321b2d8a9baaf402e5956af97d5ea31318b881d33c70cfa375fead6590e6e71ff6f717d2d3f7a4a7da59975ef00afd9744e594922f480f07c84837a7a05a4428864e6701b4e645ae3013d3d7069696e6f7604afa30213d6dd4aa8ddf47bd31590fa796b17c20f16832861979d04d1d4ebb0abe438cd1c282cc14773b9cb5db8b0b24c9cc2e376a979bb0316b1bb3cecdcef5fa90c7b2238e8539f972cd53d66c60f355250e253415878191e478a6c7efd80ce389a2d4c75c9371762c21533f02070b5de98319f213f3eb34de44fc524df86fea037a30f3dd7dd0d38f4ff8abf905523d7bf89e9ea107838eed368a47d198d8204c3ba40f5187f43198a87e15a2bf0f31a8420cf6214eab10a70e04c63b5ad2adb064873a24abfb54d418fae461a8888abfe77c0469c9d31881666a2499f64e201db19cff9e9481f5706a8f2c530cd3d7b1ea9bfa9cbc32e79b0986893dbc4c8c14342271574042c2aeb1918c5e271721e19d288889d0ce557bb0261261589ba52c606d17730c6bbd9c39acf3051d022369b76fed6fd0da9008d53c2be1cd90b6da5ce39a31a93e6c1452232b8a5903c5c3a3073f4eaf164bb9467858ca548cc3cc98307d831342c2cc1ad7c619ea2b3f5bc6b578eb30c21c3121547f713ea8a7c3886f72a6ce457748088a2d4ec706a78f27b024ba4cd5f36eac86021f4f86f9d1d5807592e2dcaa213a4b505468678c92a7af7bed76ad2939073bdd4b31e47a67072786ac18a81842bc2b3cb9cc4968316366bfd6c3d81068f3d309f50fc4965cdb5f1b7d3cb709bfd8845ff28499a59b3dc8bb078fc5b87456ea40776fba0957e5d074eed5c96efefab1dd460bb5b656e4111e89cd8661f6facaa4a8dc577045f28c86f5b82602c5b0c0c3eb0bdbdb6b087180ae35525e1ba45cc1b546c57bb8b6c8f908d739525ee9cf684d42e0aa28b8c678b7dbe93bcc9b1d94a2aa7d55549e74517c050abbad0caa015e275cd8dfc0ffd19e680f339ffd973f9e61981a5d8442652d70d721a322f92ac3c9372d573791e9d77051f81ab04274dbb65c54ae36d409cc896d06cc5474b19087c50331a50626086146e517ce9b049deb1dd4542e410c56f6d624aea317a8412d68dbd86ea38414210c0d90bad1ed369a13fb9d8bf50af161626585f3fcc05f1dac60a09d02d7862a18681ff37a8c83c1cb03dcdfd33afcfcb682aa460daa55ac2d3f44ab9a6fe04299a8eacbcf4686fe54ecb21db524d95842d73007da915359d90ed44a6874b6503670e464180fb57970de18db121c1c807695f49d4eb5625ef7cae124bfee15962365c1ddae5bf46e5f7c551d45ab6b1c34d81a348962ca9e17675c759060fe4a9dfa9cb87597f9ebd2c4f4559f767f6cb785fecdeb6cd06f36d4695b5cee263ae870d045b85f0b0f6ae15327ac0974affcfe871bf8250f6872d7cb8fdacbfc3367a84dc890c05c6b7bfa8cffb6efbbc503153571e1cf9055eebfb0bdfb2fecd0fd17f69fccde7f518538f75f58fdfe4bb508e6de7f61fafe8b2ac0bdffc2eaf75fd8a1fb2fb6112fb07be785b9775e726aa9b8812662e75e7f31175ea0641c1a16b244b8e6aab044e027ef91c8ffd67b2475998a3e79d96bd8ce251aa12fd108cc89691e129dbe56988ff818d41fe73a4d0c0cc54d97688a2b2bce68597eda5edc69bc1824f23ad9fec59dfc62101f3afe211d9b11fbea9ca83f62c7f325f3b4dbbec64594593f239a474911c5f58b6e996bf336ad0294c75cb28923ed9aaf107b94ea2feb8b0a3163f066c215af0da1538e31970b724b7bd096d1c6d2fe8f946dd8687da7250d466330170346e31da40a63639812b9dd86cfbb2cd7d72a3906ed19c6388c89a76b9435bc6f70faec2323f99ae156395dd8b6b22637c7ae2933cbef0d1ff2360a997ee971d8523d6d1142c20b73ef006538907e28a5d0d76277fb3e9179edf292a3c3dc6ed10389d1122bae5d9746312c6b178e543f6d8670ffd9912558d3b06583f4a8c8d6f4fe48534e47452d2a5602e1724959f4761e27913116a85f5cb2900335343507b017da0cf8881076b1f4532a2fa514f17d26e9cd57642445c070b0b48ddc4fc5b054c9b3a69cb8f972d27e13f66a4ea1b5d237b8e6824e5b876aa942d5bd2e36e8a297bea42bf99633499924d414ea44edcc8567edde77df43125edaa75dfde2e11aa371b64f47dd7c4559fe4eaca73573c5433c5537bc0fe5d41510e4a8074b8daa6402f99492292c35ea91084c4349024b9f3322d5cf744a382cf5baffca336d7708cb1ab33ae18b659cd0d274ca46141ead0a905bba5826a1dc07bd93362537a30aa3a8ab75dfddc4e26b0b43465a732997c1c9c9e3e3a3ff78ea73313b19f47abd93f461d682b429b9fff2e5cb133d85ad52af9f3730382d54f27b0d094ecfa0a919c140d1a267d4527823c5ba38fb688204218a8defabf7822fac6d3185961af293d52269e162ceed64e3dd44edd888150fc635f8332ed6eb5f568b84a5819ae7a746c9d3604f82fc45bfa4a0b90574f29faffef9d839c1152f9572d41b17fee1730a9f66f7a914a80702775a5eabc3f4df225ee0dd21531e3d285ecc9699f4d46804b9e31dd5d68b96755a1e1ba489f842c3dba70635b2f8fe49f592bb9e69ffa4159c6a6b8c4a9ee0f45c4de033caace79d92e74721730dd4e5021df2cdf0461bde54f79a7d07beb474ab4dc743e1bcd7b13bcc1a52cd5cdcae971404d1ae62b6db53f5639c271b59d730f776ac69b7be088170a1eff42745acde198d5e3f75f5fa1ca5a34c3b168ea7e8d438a43186fba0df9c32a4322d64904e9c53e4d42d32465355a4bee6b56bb08aae4e046bdc3342a0a3d45a6d7242fd8730c9a8f1ab6eef65718bc2997d49daeee6d44ff8244c6ec2058594c4a3fe18a6242decb15a7e0bbf328f234cf719eb82967a934c08ca64b22ef9eb345b2afcf3184d157f7d1fb32866b3dcedd284c8513a1e4e2eec53330207268a8cc478b7dbbb1551c52233d77f539d246c148f736bd532da99744e44a5efe590a8de8604c5b5eec2ffc6b423edf022ccdf1708425d0fd9f3616ded4e4f361be4772ef06e7762d9b3a7fd42e49b65933ffc779f3e7ed6ebf36253239001df05fab0994354fd2deecd4f01a70e32ce9ca8e9586bf983a7a8fb948b45f1b6265f5275ee4933eae94b5b87dfd0749ec2744704613b024f6b098b57989d87adde96af3f73302f893851719dde1b9a94b9ef74395c5a58f1a35179ed23b30f80552e218748e2da29c161535d06928ee4b84b2bf7703456da0e7da3eb80815e818186daeddf364414fb29172a9b7ef447627b8828c5a0e5a32afbd47c1f24385343fe9c68ceb630a22cad5a2842f5191ad7ddcfd095af5ddc843701bb28dfaab14027481e23d9ed631c0c8e9f486d72007ffa071f3fc9cd926267170e4bafd03f7fb0be5463c25188a1d1532f67faee63bb1de79fa8883c98e59d08672687fa4279d41355f0655e035fa23c0a83b09eb063ad914031b111b8dd46b12fa85e89a8f0609da75a2ab7298dde6216a916dcbc137c597367312c8ceafcdab3dc86f1ab3f0eab26e2fb9e26d15ae60cec1385a40709e9c1921cf5e181f4604ef6cde77afa666ce91066bbb56cbd662681facb7046ffb1dd9a8f5f2eb43443c769de4b47e200517f92c494490d693e7fc1fa667b91d2a99f17ee79b4f6d389e049724da7722fbdc6643aa0ba6a5bcb53c5def2e577967aabe67ec4408e7730ab5e64117823db6d85dc9b55c0ba11ac03d14d76faae00246aa52c48d5342d957cf959f06538d3af035fecc5201c507f12b2094dde64f7f709d5c6c9eb5a314ba1e7e09db935db6ed76314355f3599f569cff447fd1d3c564bdc9b5dc5d617f303e5c4ede09ed40dc2f7322f71b53aeb1c413b04f4ef3329396bb7ed79dacd68fd185910c7ff4754e20a24e504c384505f866246a542ae544cecd401d35238352d6a52d49470fd5cc38267a97191008f95b86cd9822b6c3cf7a77be757ce529ad0894c15a5816943ba5a9826f5c9bc640513179aace0a85f98c7c3d533b3c28d4fe8bd5e1491b61b4fb721adb5610a1323ae17edb6d026f6d715339be68bee19de684d63a5816c0f35eb310803f3cdcc1a4e30470f1044dfe1e044ede2da723810a3deb8cb47bdb15a59a3befaee8f77434998ff38a734794713ad952c0327a72f7a01d36fc3c6c949f72564fa598318ef767053e9d551d66eb38bd623bdff169b5ba3be7dfbfaa2e1655c33bcba9e165ceb496b827af7e9e34705f855938e1c326bb78f58bb8d0e54d624d86aacaf11b0b14a0c19613bf856d327590bc962317559fe858f1b633b45ec2f45ec2f0eac1bbb83cf75d26056bce4d9645e38aad62f55148eebf3c4516f3c5434a7a81a9c827349d1a0b138435cbe21b72c2803fdb179e141be7ab810a4db0fe4eb076d49d2c790210a425109376fd1827553f42f3b0c0fe51b1fda38fad74abff5a66a17a5ce6e56ea675c89a42c6ac1afd53843f775747d455eba3329cd18eaea2122d2a18df2cfd0c6e5768b96e4a86709e25ea3d97e9bd95e93f10eee9ab69c261cb8b8d4db4b39b88604364e70bb8dcace3e3c39cf18ef4a59ce81251cf147d6827b7df0df83d06569a2d8823b0c1bcb5b36e9c798d57defc0f0934d30d281513c64138c7061f4126e82ba519d376096d174954a4f9110a7bf8d40b52e7fef0ef33f8bdf37460ed5702ce7561a665eff2f78b2e2c17b7b6fb580b074f4039bf2aa38cd244f631659cc2fdea828f8e903650467a7f0541382b33378b686e0ec7c3786b367df182b153e4c1bc6ab651f93cd0ec2fd37c3a5afe7e01d7f64f5e7610985d05f91927e86feba08fd0236a77d741d89fc06456c1ff0c9e581ed362f8f59c5276210ea3b8fd814f373f5c15b999f7e3e56ebb0ddb1b4be56952243c5712bff426e2d1ff943fd15dc523e24493c126e798a132f8e7bf917629a352f76b6d05fc1ba08ffd20dfdf50e3f397047bddd0e43edd0566b943d183260dbad3dfdd9b827f0fbeff4fea7eb93477a3f4b3eb065e662b8c5cdc310c18bbec2ad6795b9f5970272d773233ade318571b05984ab7f04fddee00c16e1ea17f395521a05ad775452b188599cca78e2198532a369ea2dc2887a0bea455c4ba35abbdc235d8c9876b5a9b90fedf261cf46f46044611f5a8f50fcf86607d386bd4571885655eeab7e60c5263a11bfa8cd7952e381a8bf7ac5fc555fab84577d42fd95228eabd7cc5f0d4ce4208f5cbf62feda40ae15e45a47be66feda40ae073a7207d19f762a9454fa1559549a2a7a3f41360819dec1d23553319aed9acca7dd4699ead1de1867aaf50db1abc1be796ea63ab5175b557e276ab37fa8343cb50da7bb9a2ca174bbd51b32f7b65d29bbd2cf9ed9d7e850fedc9d749fbb4bac89170eecf28a46327ff66e8cad33bd43991f90492f32a7231361c433bb66057f5257f03fa888ca937f730c1b91556f1e5af330ba5447f0fa25fc5c9d69a8dc738f12658dcf0251f75920d586679f1b525535bf62b4ff1e94fc8ea797d2f23130f3ea925a6db9d343c975507b3ddc3df58454c5ed9e2e51bf49b8220c84bf2652617c124e68add985087e7fb9d10b342514d4e81ab3caa9e6ce9b0970ed1a557cd892b5c64f08b588f718883c36387bf9bdf771ce9e3105a9398b2ddc5156df3da97073e6e153b68ba78503b984cf50eb761ea7de82ca398f6a3ee172fd419652ef6ff14368ef6a239cfb846b61281fd8a65690e318d770963f706482d369253c8d052de5381bba9294450db84e15fb1ba8e220558cb22e6917e4195853eade05e4d25f49a3dcdd756975f6b4eedbc83c1ab43c46d8b1dd1e59a947fd4122163ec433e3b8217f98ccf29641ab05d6575fd0eab576d61b872da7c8e76729159733ca64ed2978464e90111fe091f7cf93311afdf3d11f77f00948728254fd214617817f6c2bc1173530414ed0228d29f6ca38aee2f8ef7192d8cc179e7808f2747c71a22f22d0159d685fb3b2fc14e5272d157113be588632be4f680bbfd2af151450a38266e403128ffae3edd6199678345011bdd6ae493375f6b4b6bb66c8428a29cbd9f78b30d8701670fdca75bcaf8f2e84657bc7c2aa2bcfb806de74aad239acaa56dbbf6749e2f077c37af7f64082b31f5597bfd34dbd91d46b25399f4e532a3f8782328923eeb10ec9238d78bc0cdff2a5f5216f45b188925a0139ad31e2ef3d1dd0d9b3feae1dff2e9b054dd3704683dc646246a5fb58119f968f3b7a13ce6418332aec422995057f8f233977a4fc7f35f7302d6e25742a831e2822d18347051a30986b909aa6c5f6e059d7765a6fa2dfb581b4c031639c469d94ed56fbe9ad40ab38a9e3582d8e69b3b53cae2464b398492a52f33877b5b1655270aa1afeb4faade0900b8ce78674f2dde1d7fe8a95f68c46a9e2bb5071d0db6deef5ac4f5811580d882c5306446cb7bdfd19386f3820a30396287513c4ca06c949e80bfa5b465379c9e285d6a6bc17e182aa7335458a7cb9ae845569a1d5b4d4e03906eede7a50c3c9b75b86ec4c151b30c2b0d1a32a41502d4309c46e573d7219ec45b9b539564cfb6dbc50243d7f94365ca11ef45f7411eb66581d9a433f35403c93c8e5fd10eb28c6a8f4ec9d11d691206a2af6d0d7de38f312a8f5e7af1f67ea414a46ad45da82d682ffde825c260d2dde1adbe7579c9defa8baf35d989fa009825ed06053363c10e0b622103b6b9e5a0af68e0ecc5869b83a25a97926bf118e84a369a7f5a529a93586e6d93579de36a4b4c6dbad9378a0d89d638fda00b0dda2438d95f84093749ec6b6f28a95aaa8ae5785ced8be353f8f53689a9359c2efc3e4c2fc34ce5a4a93e985fad3985a9df5cdce5288f3a7250f4fd9c9d8129fd98c2d5bf47d5bb105fe5fb8119f7f87d97693a465cf38f6b78bdf1caf59af492f68dd739ed0d0b910f1db76fb5b75d27f223f157ab68a321b3e914fdbad1a864dcd7703d49d3bec30bc27efb7db500117db6bf0937e96bdcec60aca222ab431480b6fb788f94e0c39ea61a3e83391c4f956f4fe6782defbda12f263c8c2998a4c31a2f0be62798c37efcd53175f7446ab162c2a69b7dfbb4184210f5bf33f78ef5316e599dd87128a5dfa1fe4933d8ab7db477f83441dbbff517b35fdcb768bbe38079a8ba94b70154bd5257da0af7a39253f2a1e5866bbf23cbf838feabcb9848fb8f21202defc7dbb45ff20477df8e2db3d02e1ca4305e6acb17fe3b21853ab433581d7bdc2913925bd217de5a40d6987f471de67f77583dc3bc227df9539e853c504fda4762244fdd5a043fd551f9f0c40a8f05a85d72a3cfcab650bff4198afb9aa934117c9e3bffae9244c685762c8217e21cc37fc96021105885013a6cf616fa96264de1a210a2a4a2e4bc0f00b39ead75e31b796ac7e4d60618d86de17af845509847ec2fc7d2e9d36008dcf0998925dc1875bb27d4b94551f0e704a3600557fffe60a216a99bbaf0efafcec5784c96a3deee999f04635c915ec208ae1936fe53888825a847f23473d982becabeba01ce1caa131fbe4a70df120fc5547faab133b7120fc7547faeb3c6c2b4d4ca555a516deb80d641ab4bfdbe1eaa30478b33f0046175440dd68ea10b3582ae4accae5d67b84a22aa67bc4d5b7088a39423f61f74d82f2729a16240e73d121734587487ba2be527f7e69b71708e3207f62630ff45a41add41f63c4b22f9cfd45514e1ce4efd7d44a68b79d228a7a2b2f20386e7792987dd3d72f6cb3a95312ae0dd02392e56d0ba7fd4fe5b9afe4295b5cc9a3cf752de302de53842bb758d536a66a97a291efdd7e7af729f03ee451de821eb56a6f36580b357b27ae2228668aa61921311899efc567247190cb7c7f550d9dbbe4ee0ee1cd0261a8d0c00f086fdeb4dbe88d63a8f786d4f0eeb62e5f8d5a70e9a4bf753dd4dba950f473c8c86615c89c34c23a900511dc59fbbfe261cfbe7f06f4a2eb0f027f50f0f1767591f7e61709b57cd486f51ff973ff2aba05c52ab41f65dbbe22bcc9b47c5ad034fe9d6a6dee0775ca40da73594b61e01b12a915f526d78e55c5c1ef7d29429626a1a45f688298bf02e6afabedd045294a8875c9c644ce94bddddaf24d0546998dea6cd35bc45ef540ea02aa2bfb0ac32dda13b2bbe3ff0ee1cdef6a2f5570aa6f99992ca7c7ffa163307cd18675a82ec4770f967b184ff1aede26175ed12e5819a84fbe15cd230cdfecb9f02339ed0dadf3052db4f819bec01bf844989f846b9e49786f5c1a2ce7f124859fd4eacff930f88d9417fdb49b61114e64fc40b7db4a1074f7152101cd54280a0b7f577ffe4a3676270d7a6077d2a0071a4b82fe0efe8370b4d915f761eb7a0b8b87bf6fb748f1623384e1066150ebe82bc2aada1e8607d70aa176d7fdbd7172f255a3afc99823757f07cb30abaa31feaeba904f922e2e5bd4012a3c938231f3d5203e4e50deaedf395f7cca9ad4296fd1510f1b800fac39bd6fbccbdeaa5530e562d100f5d71d28f279cb83fada798ab9e9d29c112ad99c2e3b2e56b3de4e73d62c9ea40d15bf37ef7668446a48fed4a82c7a67b6e9a0c90accfb0fdf46e4f627d3e941c0e9d4817c5aa5924be12b3a15ed5fc8ac82c242e3247d98e51d36961b5945d3620e3caee1476ad3b536fc245213599e320cc8b452848c1779c2a49230a3f25d217a340051b5f07de3eb27ea0d4e7f84037983d397f044bdc1d90b68686f70de83c323119c6bafbdb5f10bce4f9f70b9ebce40d0efab43ed733a9022408b0304472d7d75a43803a998590b9bcbc3adfb6c3aa582465db352d5d1175ad19a858b78a21ff1a95dc1a53bc7365d8ba672df679b1d44644f3d5e885f5b42cb486db57adf6d41bf974798cdd78d99c649d282d6bff57ae180fed8aaead3ad5d80815cb580f9abee799e73adc2ebeef99ecabb6c4c12335a342695827fa3aaae972f5faa8ae67baf1f1455f5755d454d3ab8ce83ab410ba493aa836b5cb542d7fe4ef5ce2ca8262691aa72519a0ec1daf95e39df8fa47ad065f91cb716a114f10ab53ad34e0bbc9efa67be5b9d4cff4d3b2ddc1a32db309993cb1650bcdb0d25a1d6d9fc3dd914d73b9a769bc9888e8be7889a41b4a90ab0ba12f8d0db5bf97e5018d5ed5d6c7c26e74391f329edb3b7ac825dd76bb160f302cc1175b8047a078510a31abdbf9bd468734628a484c1a322f1aeb42508c165e3dc6cc5d5badc0ce5ebdf7efacc63753cd18abe19956f6f3f2245a0f7217c8316c5e6a82fe03d50a178203ce4fae90eeeaf89006eae2d1e0406058cb8bfea86fe0a1fc77ea83322eeafbba1bf563111c43eed10eeaf20f6a7ea636defec95d819fba1839fb11f69dc54f9cceff41096667867f9a2ef1b1bdd39e1af4cf7b4afc1fd0e96a3e70e8bb9b2e814f9d1b41e97acb61a085532b6ac3f75d3ba2ab1ab52217426c83c37b64cd628c6c32909fd103212fa0a23427f6aaf6a96231556462ab42315da910aed48956605f5019b288650db54c0d4b27e5fabe3873753eb7db2a41f7d5ba3673f9eac8296559805a34eff35bfceeee621b1c2fca63b5cda645ae2064359aaafebd0763b3785cd8bda15afb139085108501ef24721731a21fcfc690a22edd39c84426eba2580991bc9d626549fff5ff72e58fe340c9d72a14f788a70a752370207acd23d8141143dd8a32ee6e4692b1cea47456b3d82c24eca5e4283fce5b9a61e26cff4d07ad79a383d3cd8d83d8a698fc9dfd1d849d15847d25bc1b15cf2e9c5cc9be0788a2675d1352d246d6a73192eb46567de197f050b6ddc5944ac6189182cc00881f02eafdabc8f77a8ea48551d1dae5adb33adab554f055ff82b5857ebd7b16b585561a55af5ab2aa4e4fe1ae688c11ad4b15c1bb4ed2a8786aa97bb272da5da6d242f28923810441de974395f1f66071ce5c9d2482ede7b69a23c0038578b2bcc7f7122089fe5dfbf8bd1dee3718b8a83d381626c9ff58b40c90451d85016de27f44d42f525f7e0a8074b45dcc4037d27c2c798cdde687e3638ea1b55e65b9ef05a48df610a3622e8c32ce8c37dd08730e8efac49ace16c234860090f308719e9597f85a33ef4ecff8d5f635891d1181ed59f7bc5085fa93fd72456077312225cb9db53da0ca2bd6b38362545a7bdfed98f2f7f7cf1e30fb87265056faeed9b29e56eb6c670d31059b9878237dfd18dcaa510bc61edb6a20011b1c2b25203ceecb9d8d877f4b1becb62f8f87d2063f4a1a0f44bbd0f317d54d888549d112418aedbedbc535fe3df298a4e06909c0c30dcb4db374d0978071f9e63ab87f269c736a83509d943983b4bb8d5dcef61d6f62ae77e0f33c8f77f8afbfdf6a7b9dfcfffa5dc6fc94b57f853fe0799e1c5eb9e9a4d91eb09672a7c53847770af359f31fb76cbdf0bcee4becdaa5a86e45ab14f1ac0bc1b8bf0f0dad7796d3e443188d76a0fb2d793e30824791c8931a83fe471c4cc977e8a13549048fda32218fe0eae7d3dea0fc664704c4fa26e1fd6a3fee998f4bb83637692c0afa899112944cd8b4e0704f9ec98800a55b1daa1f5f38b706df1518b3a058647fd06265c15fbb668e4038a0a66ba826f072a30fc002bf9811b5b5dee106d65aabb77ab3b7414c9c7a24306c7eb516fac46e464ad6f7aaa41e9eae8f3b11a9813f56146678f6b2f9a3e3866fe4a0faa3003eaaf4f92c2f2b44b746520f4c7a9ae44d52d8f51bf4bb1a9b3434411ec8d8f0905dd024255ddf0c172a72aed100f6cabbb44e6edf63b8455d69ca32da94e7057636f0be7269b9d31e36bdc87b49f81c614a392271c5495975a975e63960591faf4c099a42b895a74b5a42256542b4cbafa8a490b620c4722f7ccd07acbb32432da1c16cb384ce2dfa9a7afa4f8de574a17a997c4dfa827e7d4b3169dda8b0cfb4be94426967e6b68fc9be4061d0915d23c45a6fb59dd81b505f8bd0abccfd80409ffeb97b77797d79fff7a09c2ff747375f7f1c3cdcf5fef8a580cc2968084ffe6faeae69d562a94bb73ee2bdb8d338e66841383325f40e6cf20f3ef21f3ad5b5ed73aa1e221d4e444c27ffbe9fad397bb373fbf7f7ff5e5eecd875bbcdb5dfb090f35477c60fb29d21b77218d690d047ade6ecffff099264ebfe68e63ea1e28e9f76e64c0882ebb449d6aa811914ae9e0e1238c26ea68d125fdfc2ab0a552437b18b041b8f6cbf7b111b3cf3d13e6c7fa0d7cf96aa137b51e2164b1dd2e0821d26e66f64ed2e368311e5a4268a8d9eef059456f2d68e6b4eabeda2a1b841bbf7ca8bba955b3a255b3ed76b6dfaad568361eaedc56e922f5766a0f14314d1103519e490e1f871ca99ed19ecedcfb35ab111b0fa9bf22d23d08517fed46ac61d96e2f915407f19b225a870f1f8ae2293ad24b852f62e33ae64b2ef7c5cd8d2bbfcdcb458bf2e5223555720c9ce8cd469f8c86cc5f691910f3d7a4cbb5e4c5a44a0ed4a6d13ceda1dd7e50c76ad585ebb20b26e6bfe0a834b747a5dc6c42f09908177bcf598a769be21b424bff86564f7e53578c5b3be8f4315c7ae93c8ca8f038d304759aac7ddff77ea1d26fe90ab565ca53155eff575658c865de6a13eb5baec7ed2de7228a592869b377747fa5181bbb0bab5951fb3055fbb09e2bedbd5aefbbd86cf40a44bbafd6bb2f36dbbc82a4feea5891447dd98e507f7d8cba9a3a52a769ba49b7dcb4f03b9aa61a5629f4242fd4d6a8dad4316c425ead6a51c7300c790f3a7d7caca8b56e7cbf4bfd353e4e54b8e0e42fa569d3679ed6ef8936fa3f2efcbaeaabb2c6fff573e3af38b4f2ed42b590667a21c553c490222baabdaa8dc5aba62ad218ba38b5ed9cf7f86f31dc1ebcab6acee3e54dd48aca2ddebfd0eaa06bf54eb603e3aca1aaf6cf81f9fa5b160a5a55fe55aba18edaaf2e6e98ec5ff4aac8171afb139c19cd5b4335c18b414392dbd1e0c5691da2d6cde0c5591da2ec64f0e2a94733dd27e5cebff36648bf77d63f3b3d3d6ff6d4aa08473c4567daaea7f0b64009cdb722748246fff96f637c3283d6ffe8ff8f7e0b6378e9406346b4b3bb0feaf0947bc9ec63e8bf30c6430ae57f3872e03561fa8be6ba4a27de31f3e674e529840fa5f718cbb9b7147442154be8b5feade57b57feccf7feadd79b4e7b3ddffb894bcf386af3fed2a1c3c36d78f5eac7ede0fc5cfb0fd977026f0e790eb3b27f37e1d9fb2de60538cd2c7d374b65f248fb16b989aeb0548328878ad377b1906b72d40717d8884edc182b28a10d7d78e686cbbebfbcdc2ba3d559e87d02496c0e2666db306e748d9512cd1de35a4881e148b38826fc3914e1824a9500d47ffbe9e3e70fd757775f6f2f6f7ffe8a739d8b03ff814df9359f21819b4e0e1c03cfcd6e857bd342960a9cbce576d519dd96e264fcbf5d7db9bdfac7ddd7bf5ebebbfaa2352aba51efbf5cfef4f1eae6364f303d0da50c2773db29ae0e477b71a18a4b4a12a09a67fa6e23cace2b7ee5fac3cdff51ed79d6d473ded8f30c4396f79cbbe6e1764ee329d20ee38fe56b5a718d23f455fcf7090fe5e9e05288705dbc857a2c8f07ce513fa54604b22b2e6516d584f655ddc2f1f866079cf486fc952c6f7417a75839e2630849b76f2c14b5bfa3516fdc6eb7eecc777fac1b1c9aee1bbfa8d77c623ca03135d62121a4dbdf775e6a07b6386acec3075abc0eee156e5b03afd589f1508c623fd52f510ff09884bb9c26b5b2d69169d376dbba33dffd71c33bddea0cacaa99c6b34c508f67d25bf34c78b1f683ed7b9749e2652c56a42bf5d2b93e326b832543c6fe92ddfd45d1b269bc022f644e03530b10defda5a511ce8ec5cfa6b0ea60a8bd9a1012fed1e1b02d3b3018e53ab236619565134830976f35ca0402267cb9d6df9f4321030e8a8b2cc3b156e3db56a741081343cd025abfdc61ee8ee59864904868eca123d6d12f2bc80e1fefb9d43d94cbe29cc93cac9401e687c40d37ffce9ff15fd970fd9a6a9eebcaa5cac606ffb15c03143f8ee8d80169bc0eb61ed1f1d09891da3bfa7aa9d843a64a057534868536073432ef1cb237cc0d4f8b141064821678b8440264eed9653dba1f2dc6a567170b5c9407f7a3fc734c14a8b92051bbf766733fd67cacda68d5d2ca836796cd5d37e8c61852d0962fb0e7655a10b90f8b70464190c5503fa5a5764f9ea69f443c8b1969858cb3f58267690ba4cf59c2c3c815c9a8864f91be68897720fd544c888b7769f906387df462343f9ee1e1a3f112ec5aed4fab6e09268a1af2dcae32a0bba1d0cee533418d838cd7e4b1609b52946bfb1f4735b0f13056fbbd1f89f051f7539debfd094f8e67207cc11f8f6730831986fb111d13a69a0feb91fe1deb67b70b6cea81da02dd770b4a33f613faea550f0461ff4ed531f964ae823111ff5e3c345d69542041f0c780c38427951b5811c29b2bb7ca15e9c103a9beed99a8116db7919dbdca75c3070c2b3587260f86d5eb7eef22423878c85924e776630467bd5ee5fa8e23d47d1cd1da485a7e0704791cb1bd34b902aead6ad5c8c68499b11d0a67e4a5e657543a2d471e38c466061a6a7446a2a1ce32559bb23dc0dc7938926eb7fddee00cab999891392c481fd66aeb54436a557b234308b85a22e6d87e1b2734f5965478b6ae7c63b9a7de923faa43fbd4938fdc6f6984bb221bdb88423369420c8c8cca38f5b83565a58100cd6b9607e610d47a0ab2e2307855bb4eeab81246b44dbb7dec3ab3b78ddcbb4f676ed339a9c1f90b45779fbd5c5cdc5dbeb399831edcd935d88334fe9d068d2f3a9d0e201593803510fb17cfbe14e5107b6b0dc842193f50e3b5a7dd5ef88638db6144d5f45c00b8b0ac670e85870bdf186ee7318b51ebf6ea1fb73f7fb96a75d818c342df8529527d9b7837780752a54abad2883b78574decc1c2fff2d39bcbf2e7e79baf1f7ebab97a77f7e697db2ba076a5d8320a4634ae1653063e5efe74f7fec3f5edd51758284ef5eaf2cbf7e7fd7053cf7bf7f1c3e78f979fefd4f7d5d75b55d48c322a42493fc6cb45b8ac94a5922db3d28fd1e3a895868b6542851a2373c670479bc8ea35ee788ae6f942b4841e2499fb0ed623232f31dbb574b7eb23e9ecd7edb60eb9956db70ca948a07838f7cbe585dc6b4d42d1e10561b022196218e6d6fd15c53023abda79e457f8acfb9b16318af09095ef72506806a35678f740859a019eb6a015de9927b18a6704546476974e04a5ecabbe00d1caee1c9b2a9568c6b1e706fa6e60e0064e4d098afe7ca6c28e5d6beccece143dfa3500a00ac0e861fea6db6b5a68ce1a8f7ed187a7c1ea9dc3b02ed693d172b9f779d2aaf7f3383afe36bc1b49b57daebad4575402ee46b2d31f932ed34f1d17518331393ba6be25293aea54e7eb384067fbf9ce2bf93a7d1df962afc61f4c4eb7b01fab39073af2e57e5b7bfb59fbfda6bcfdc15e83fba7fb2dee9f3535b97fbe9ff94543cd3f54339fd65e58ba232bdf3921a03bb8846f182ef367a899598115a9a56269f0905d14a516dc6880cab81ecc8d9a4cc34341b83559ae67dce10a3f44f1e6522b712ebba4af08471cbdba6cb74d9c2eafdd9e5be58d6d0facfccad906dd814128b83cfe06df70f579268575ac6845d19edaa34a378a5db826748fb1b92714ae080305e05e45c69b3a45303b83c5fc857ff9e5cbe52f56d9086b9dac93de8532ac27dfc1c27ff7cbcde5c70f6fefde7db9fcbb367b4137eac052ac6463887a367d500b3aa71970d4876b67b90fd4722f090cdcc31556c90fcefad546b254b80b1d06b0f0df5f7fbabc55059e1ebbc2075f6d4f5fef3e5f7db9bbbabefa7875730bbdc345d68902f4ff50c93f62904895ae18400d94aa7de7cb87cb9b9faeafbe420f5e1c5f1a6e660e335868e3ba47d54db8861bf846fa3fc267c211865fb5e595f6c8ad5d245e921edced4b565e9c1537ac34532520d743052994d612c1144afd6130813dcd5f1041cdfa2a485c0382a555c9050f357f2ed65f4f6b29e8244ef5ed6f1ac5d962e94d553b872d683d84621db399f7402767de84275cd4624fbd074bdaf5e255a9161fbc7cd778e7957bcb33e9fd67d207cfa49fead6f138f21661ccf47b78d8dbb4a0e5795e3cf550a5adfeef1e215ecf2f203c6f96dcbd17e1ccc89c49ce530fdea1b20750edb0bf5ae3a1c9bef3ac52adb19efe1faba7ff67eb19fcb17a067fb69ed33f56cfe9b3f56ceaa5289c438549781f0fbd5d0b5abbd6d8ff95c70cb5fec95a15ff1e254217923355c6c0735823556599aad1dcdbe7955c2cd325b89c939bb808e599e7f0516e9a297c8f457a7efd1cc0df597297dfbef7885ba9776c86cae9e689dbe07cf85ad0326d9a70c1a81ae1058fd07eefc13bf31d68d5fe0f2ca22b9bc1bcf3ba9fcd3b51f960bfc7b5b254ca17fee8114f9f7b9f03573df0d4f23971325741def2245b30dbbca2b9e0d6562bd4d46f5faccd339cd4e1b56b4433548a4ef4f2a9a823b2c1d5012a86b958394efefef3f9fb4fe51f7c57fd3d37ffb3b5596885732e90774c8aa11fd613fd95d721eeb01f3f01bbce61d5803f05f87b311d4fa3d74933bad48882e3c4476b4d2f651256ae8d9ae8036288222d38d74fa8578b08ce7fdc8de1c533ee946b12e1554d24a6c5bb2b97e513cf59967cce459070597b31f7a95cdf9a7285cfe5ba69ca953d97ebba2957fa5caeaba65cd3e772dd37e59a3c97ebb12957e468c5b4fd9a3ad5949acd9c27034e4c52a9035b75f92bd66eb357c25f7578bb2dfc7597bf92edb67c25fc7527573ebacc7b52be22e6156e3f1c2b10c420aa4a38fffc4b40ce89c131c7b68ffa148973e7700c424b3e8c9548e1554376481fc75324081dc9b11f2e97c9da3e350c0ce3fd4ece9cf7971d1b2ef34805e9434cca07d5c38a21fd1cddc048021d6360dad4a67ce0635d3ee5b383cc95e8ef3f4310ee3f43a0eff155ef23e8f17fc3336d4e6a66c0783ada0d0fb9142bbc47a41852d4fc2e84d38ebaf5d50a6f44a7f3ef3f1042d41153952072f3410e3139ea0f2bddeeaef553f7d5de77d7bee44be024d12fe0b4dbf288107e8164bb3d47f73092630c92a8e2e2ed768e1e750c0eac5e30876fb7910528b218097cdc6e2fb52fe4277a67de89a85bce0bd38314d526efa95e0832d2dda06310a3def802c5648eae4034bcc114eebdc19461583cf3fcd2d38f1b3d802442bf2862b133effc137d5715eff79c9728fddd533834db94ee7f4642fd90a920a370bb95f978945a93033d5800efc6afce7abd763bbb98a3cf20703047dfd400c684c31c5d83c0a65378878d1d75fd9180c263f35e8a6ea13ee89ae129d41070a5fe5cab3f37eacf37f5e7b3faf3ab5956aef124c2c319fad560f925d9e851bc5267f660023a704dc30775cc2ddeab0852b04f47041914cf3b04214c9278f22d8821ba4fdeea4f01ee5315dab7e6dee3120173dcb6d7bb482ee172f75d4f8934bcb7fbc49b1f8a4778d66977ae4bd757c5b85e75ce9b7eda52491f860e302a5580e0fc5c55fa9ca30623f2aeb8aab5cffcbd80840c8ed1e0194149e7e7981d4ec5b0247f46a270f0cce39e080bf02abf070fe4fbcf7cbadef0ae28ea4f9ff3fe6847fef4e1cd57e70abf971f972776306c1ffcf07ed6342673d28399163ae999b2b2c1fe8be34451cd3d61d40cc35ac73ab3ab225735cf0f68dee9e3e3e4f5ccbf5f4b7aedd80ed1bdca06c71528600dd6457ae3a9554bf1506a03a3b56e2aac898419a18505aa119715ed0af186911084790c941251d3a13cc052ed488ec4543f1927aa3a14daa4435103fcb4e244732a871415b1abcf780a4c57a487a2aec4286582f5559d33a871049c88e368b818712dac87c58877faea730deb11ef0cc6849a1a74cae998480b74a63e0dd07901b483f26258c5407a8530cc3ba40fa1ae7507e5658b0adc5ccbcfe7a54c7ddefeffa83b831d3761200cdffb14cd1e10a65304c9de56ee6d0f95508ad4dea21c28260b6263455936218df2ee950788c70636d9b4aad4cb6ac1662e197d1eff33633bf86e6b69e787463b17907b4285bd3d19935a4df9248015cf8cde28b366ba3be622c57b30fb0740d93e20a96a2e4d59bcc261ad9a5bc34f202dd53c751c37e59350799aad9a17a66abe627ad274e51654357f8517a6868724eec250cde5fb54f331938d63dc83b492c293e02ac95c52b95c6242f73b0430f5720609cf3f876dcbe550bb65d2f64f6e7da33ecc5d777e91a05f40820e952887c2ca79d29739d051979c8c55f4da9dbe5a3b2fdd1a707ec85a18c60a86fb2f3cba8a86d19fd1b06430e7124a5e61b6e844cb10d851f00c7678e707a47c6721f0117e3210d4fd53061f367c673230bd998162146e1bcac0b7a6b50c7ce66234915bd989dc87f9a2f2ea867af86f97c36d9f107d98a52cf179a62967466258b2b3a6824c7b5e74ce33b58cc2c1d851a38212a35bc69a73b1e3e0bb9dc5b9b2f1e71a62af869a5149851d339741fc898766051a9542d8d1fee504059730c9f48cc31a5cd67004c202d7c1715cac4f147d706d4c70ad999e345db91b0aae1c9e981a1ea20cf1019881d0e0aaaf00d798c90e5ca20fae8b66c3a9b24bc825fcf8dbd7f90f85aeb8d10f537a144393ede3f7b0e797a0f87678ac764fff3a3a7eb4a3e3d9ff1c1dfbf5612cbbd1592a64d5660de877bf3e7ad4f422582e82e5fb62ea68289ede23966d94470cca1eca2306f1f99af4268a953ac0ab7af1cf96c63a054d03273441fc3a90137e39c73f37af8617da8648f1dd789d5d1840b7bb957f63773bd064a33fbc0bfc30f0c33bace3537f60112e991bb2137bf81d0000ffffce0c5d9bfc000100",
+		"287120212be299bde5ff45348f42b702": "1f8b08000000000000ff9c57793494fbff7f701b528454f6a6414d0bb330c34c46b319141a63494a356661304b331343ca9232527675254b961a85b2e5226d52e426a25c1165c992352d971a7ec7fdd5fdfeceefdc73fff87ece79ce799ecf79bd5eefcffbf5bc9ef7394f1cd5c55e4d554f150000354707320d0000e6f2a5020200403090ee0e0080aed8ce4becc6678b43e842164060f27d5960472edd8f4563d199a1479b593600a0c4e6b87b89bd9c9db00c3ed79cbe8c31977005c0f2b2d92511d019812c31d897e5c7e1e120d375f720600e1307d98772863b0b482c7f8e439890e516e6e2ce080b646098905db6601b0956c2157059623a58c20de289b0121ce42f5d2c4f845dde8641c07f41c48138c8ff1ecacb990a26f1852c30cadcc28c014720c068b439c2128546237680917004120647c2e0683384251685c622adc03f16c4166c2364b2b13432e5472d21938d83f88bc5022c0c161212621e6261ce17fac110180c66590389341332d966a2509e982e31e3898c7f2a9059228690231073f83cf0f233dd977f4c8c83407eb6c015383bff2dcc13fd308ac1e7c22474010c610e8771b9b09f689198c662ff3b5ae41e2a60c1682c11ff9890c1a2b1d8c6ffa7d4bf539781026767ec5e21c78fc3a30791f98c635c164fec48c641245c813993c3c492e0d61696240286802212ed3008040665412158a348186b22dc9a6205ffa9f14f5c0ba2350a498193ec50966404c20e43b023910948b21d91444121d094bfb98e3c9198ce63b07e7239ffe112ff958b25095974315fe8cee707fd4c00d59f2fe68bfcf90230c90d0d86eee3f098fc10d1d6e5d7f3e3a42c212798c5a408f95cf05ffe6239ff509f648724a0911824c5924859eedbdadace92842120890822c20e4db484fce032ff1bcf60b6601bd8ff0bcbcf2d1a99b27cfb77f46dc1fff978583c260e2284ecb2456c7c1a0100aad71cc90477c9eb091f1f2783ae757d1972852f1b2fbcf94c73d3d5dbd2d4b6704d637f00637f952fd3f4d9814ec87ed4f5dac71f1999328f02879262cfaa8517b15f1acf2b30b679941ffeded95975c3ab64d89aaad963b6127de445658bf98e6f4b4b56f256f6556f2a42837d41579828c6357c6eed3d3e15f2bc6624fbf894615642f275697e0408045aece8eb9b82673ebb1a6e7b737bfaee4bb23b6095dadd857983d6a5bd9d9deec80ca733be653298b6eacbf09219aaf9c563eab1f96fe7e6074043f506f18dde5cf401739dd52e8f078faa3b71cee88ab3779348a7ba0667c56834baf5667171cc8b31cb9bebf0b2ecb7044047f9b28b9f85822f79f39a4b7afafac7dd185ae6e08cbadada430a16bb769b684d1fbc77527e1b84f268895bbbe5a4aa6d8206d820ec02909efe48fec8b3dfd2dafa37c6c1a400c38d1bf9163aab2903efde3e3815353535158707e7769c4d4b4c4878519818135d701a682760ad470f2fceddd1783ed90b3479c4e28df6b9dcecfa905b2b79f144676fc152c70baf56d20a9187c6fd18a3b0ae5c5643cce3b566fafb6411eb941463623d3e5a1ba83f47e48b4680a8b36a1448f25645135b14eab33c08fd6d73e045c3fc4f0db16b22d4a82e49976a37a89ede761176d8bc22b81b71c96573ea4646244c0b6cf7ca68a70b0b31761b97d4404c7d23cc53f0d62b48372a2eb229dc818cdb1097f86ca69c8b87375c4c5750fc7562f6a0f935e30d525a2455d7fd42bbbf89687f7282697d6aaf6b5a9349bf34c74c41f8fe775d25d53181b5812de09a96baf23a74b344f1bd8665c9af898dbe7b1c149d67864076e27d495e1278e2383943f1e9fba16db17d24eea9e6eb9ad33e4e85b4bd7442ba8a06c6342633236336d4263be7ca7d05787a5ef3af079da8ac76b71515dd0715ffe0e73fe853300e3565f7fed2f4e8510cb7ffee897e5243fde98f9fa039c64569f11b03f493d6599efd66456d7dcaceee51053fdeb2373b5c572dadf117b656d388abf4960fc804b7eab3fb2daf1d86b27065fcd1c1a75b0b7b62636343af758c9130874f55ee6c3f5ea4bcebf4183fa5a5e37cad9b6e74cfe4a24a0aad77e278b5a2038bc532958a1dcb5598b79113caea0692c691b9faf657af3c15496713defb838d1d37466ec8d583f9d4054f5ef8dd2e491a936c8b89580ce754f48d9400448de771631126b12257b1d6c995290f3b70f3e2f12301aa26a793b4de5c21c52ebe7cf912b5f59a1badbccfe19823c3dea77807e6727c4a40b46ae79ebb45619ac53bd41917930d5276634cabf35e856685490fafa2e21cb82e8e879e48151e4a151e02f44740f73a930fe525cce3a91bed2f4575c4f85764bb9450cd72aafa401849fa0a8d222dcb95014141c5afe75272b6673ef3ec601b047a839bf73819f90ea4ffa92df7bc2191dfc96d5254f1002c7a37bb4fd839691fbecfdcee57d12d39b894ec60b299f3a54e1fd8046f3aaf1e37ba028c7b5b455cf9953db378ff08dc29aaeb61b004d5b4c9b0a1a161a1afaf6fe4cb44f7dcfa6de1e55428d5cbef21af3a316db7a990eca9db8e75251dae0f7b193adeb97517b6e703bba21b7448ad92a75432b3b3b23171b6225aefb1c6e0c444d09ecda9f3403debc13bc104e9f45eb49555ddcad5351b2282b534a8fa05773b2683ad9415a30e5ca1fab7fa9669df39345d07402b7c9c6f71f1642bfbadebe39fe5e62d51606521c1c1775ff7f52da67846dfae1e6573f0f9736dc07e07f91fcf32adfaed959d6a0e96162e2e2e965bde9a96c5fc295fd4daa669d26ea8af2f72f32336fef686b9bfe4d2f6993bf83d5d381c4e4176ab3b2a4a212a32c9f8fe81f53e908cc8826c9971fbc0b9d2d6433d6199f59543abaa8aef09de45833f9ac587de8c11f657e16d48ac8a0cac280bee1b09c777b20e21f19d96d4dd9efaf37169de2f0a919d680e4ae68c241fb03daf1bd13e26f6243816d2ca63d25fb5ae15d618d48408037ab885b53e6efeb27064467833affa498967a081d6c711df329d8bc605eee268ac4b8eed09e4faf8132b724394d26c86e3dfd9af4e42dd0e5fa1969e919525bfdd321cb64e8b68d4cc07e392480b140ae59c7da2d1e4e7b0fafca473a0c8078d83b3d052c5d3c9d7e9dbab2e019a79eda34a0e8f8605d64179d6fd0909096bdef0be469fabafe68485d59a66b92c81c0969074c192f6f052fa78ee1953450f00a25e9cdcd8d8d8e3301dd75d5817326d9eb333a4146a3cda4d861cfdda9e6fffd5d4ec8cb6a19eded3cea9e1235ad18f67bec97565e79cb846a6b3a3abf7ebad6269cf66e327eb64169d81a2a4aba0635bd53d9b439b2b82f714b1a61ad8e341be4dcbe176bd78881d19aee050d47a55966eb7a5def14062f396aa8c26dbe6775b30f282b55d43e74ea6eda82db9e05a51262bcfb69379e3c9a0add2e2daf964452564c6395e7d56695e4f5ead0bb7ccebface0ac0b7900a756faa81da1fbcd8b9890a4a444aceda6a575f4e47303640c767748fe5f7bf40500db2d741035ce39a0b6891eed53af690645bf84cc3d5ab57b5819a158fd94bfda1d24f56c31be21b471e0c554f04d73d0b427f18c30c2d29ccb7f47cfe72f689c278db561bc97448f20ecf1b55e7cab5a0733087c4ae1bfa18f4ec84e8cf672d72b9fc5bfb832fa9e24d39fd2e7fc80622a510e777bb0ac910cdcb3939fd394e9b238605d690ca28a3f98a0f9f7bcbca102db3834f0ef7d4854cc3e25cc74b9af6becdd8e9d0221cfddedeeedaf1ae21f65e02f26402b2f81720ec7823bb62be7d70e3cd6ab470f8e9ba9632c6930425e9e1dc7ceb077ee67ae74f9e5dda56bcc52340b14011ce265e699b6694fd7a8c4ebf3231376f4b31762add5067821c528d6de09694940c1716161eff2de753587d84bd71382456e45a7c60b0b7f7f28af1e9eaa483abfa22548edc91524a836e69b03333329a2536d97ba8856a49a536f7bfabcc2fa56d37dae3884f696969f99a34fa9df23477a6b1a9ad8dca53cadaf380ad38293d4dae5f155773eece2dadd6c6b1b1b13582bdb16bbf038c275645bd6ad9f1574ed5c77eb27ae3a7ccdf6d333c6c64cf547e34fd75c4f5815d514aca92bf85ba0db6360af4bab5d5656aa0317e486e96b23ba9e5779311885e44f2ea187d2b9e25f1fc6bf4f81bc8de1aef6b439e92d7b3841375ea361c5cbde7e926ee544262e29c4e9b73e6093e2e2be57aa6ceaba3d5e9dbdea85c3f8fa597aea5acd6a0acd600a91883549462349562fe1eb1f4ca339db777916146330fbb9a9b9bda073664ed837ca54df080980b24681b5e4a8618707fdf273c1e29fe8db039f5cac76dc29bdf397a1a47cd0e78797b2fb40d0bb32abc4b4282d00708cd3ecec05d9dd5a0e9cacacaefcdbceafeab70d3dbbb982870cb6851c49d88a593aa69631f3edc80ca88bf44ca3950ed5acdf39441434343ccd572cf1b6b381996508582211de19789fd0b52fc25dae4751325a61ab46a95dbe7c5f204ef81a4aa85c9871efae1a3ab9407089c75b534f74dc97fbe5bff2c5ce6951ae9f04a036573a23b125bddccdc2655e6bf870614d6d4d42ce89ff58a7b3278f624766cd51a15b5bbfefe58c19ce262f84981809a78af4e5873d9d6407de997f9fea84f6d5dea46830bc1d8ac562db013513b2f3959f3446060e0f36463fb85f63f606d21e1636bfba2f060657ced79cae0beb14c1adc0f073cc9adeaa056e9f411b246a129f99ea92547951a93fbba4eaca7374935f37d48063dca3273dfa9907f723e7279862e8f511d043e5849be2f5201703603e3e232da84cbbf828e762ee452e291e8ff090000ffff241161e8770e0000",
+		"38b04054a71c2121a7cfd5829358f302": "1f8b08000000000000ffc41bfd6fdb36f6e7cb5ff1a601b374f5643bfd5897cc3d244dba06c8daa1e9ad380c43c148b4c4452605924a166cfedf0f242599a2285b696f3dff10d822dff77b7c1f621246858493372797ffb9bab8fa7875feee97f3771ffffdee1296102c0ebf8be7f13c5e04f00882598a24129263b40e8e0f0ce09bb767e71f2fce3e5e9ebff9f1fd6b58c2b327cdd2354a6e32ce2a9abe6405e3b084c9d7f367f3b3c3ef27f50eca52dcaef1ec1a858b67cfa77038577f1ecfa7308f9f471398cdbe3e797e363f7f56831584de74c10e9f3e9dc2e250fd51b0f3f849340105b75a7d973e4b6ab89c647941b25cbed9477711cf3d745bf80bda4037e08f9f4c61f1fd93293cb5a0e1ebe7cf92c3c7872ef8db4a3ad4bf5f28cea7b0f8eeb10d7ebd9a23941e1c240512025e714625a629fc790000a091f22a918c87a82ca3fab1fac89c881895252c0195e5b1f33c91e4162b1528fa13675560c493fc3de66b67356549b5c654c6284dcf6f31959744484c310f274941929bc914421cc1f285c587fa9015843896886758c65a100518278c4a44a808031a449103a33e059690cb755133daa038f66e548e7491c2b2858809a598bf7effd3e5f1410f82acc2769f87a389d1d0c4cb96adde986381e549abcf30ea73a73e1ccb8ad3fedaa6f7e42198dbbddd9d46155390bcc20ed496de660a2b5408b5a16b7e4289bcd22e6093349e91b33bb3f48ae0226dd63706830d68a9adf59a0ccbf302abafa7f7176918183f0b228f3bdde0fbaa1c722765ed5b5454b64fc4fa412c395987512cd925bbc3fc25125a6d8e338635f0720941e033b09655abbfaf875d06dd7429f583491376f851d2702caa420a58c2afbf7551ae180fb577035b6dcd9d8a383b4312c5cad2c2270259853426692c24e2527c203237520f3a74cd425c56220fa947e0cd5e515322ca02dd2b17146f6941280e6bac16ba8d6d8f41d7480a8cb8cf33027dd004039eb1cb709baeb376763dc85b1bd70b82b1e7e6be90ae59ea45d708b62686e8078eca12f349140b795fe03811e23dfe432a2e6bab1c5d172cb9390e6c82b3195ce5ec4e1f9d423ff198b0e762cda9ec78eb6c061f724c41e618cce9a9f14286a5008ed7ec16a753b8c34accaa488d01f46eb5ed92d01b908cb5e86e110722b6bafa59eda74a227d6a6de97622c41b0f752cc072e9663f5f3028d14c144c7e1025a2a0d3c332a0b554c18b093c028df011043fccd49e17812760fcdcab33d939350017023f8493512c5827fd7ee7a65b8307d13671d6d934fe9d111a06360595d2bff248e86a7436eb38c31d6a7d612070fd096fd389132caf249295f8090b81321cae45362e84359423e05a64c73decaabefd541a0a761ca59cddbda97d5fe8389b02a16f30c9f26bc6c5145825db5fa3889bc4ef90d58a7f0401107aa46a788b445c609ac95cafb24aea659b68bd6e9dd856f00784266c4d680638cdb03882a0731834abfe40b598705d46a37fb404aad9fa8623ce8f41371faad1f8e19abf085cc7301e197a245b2e611ec19f2dd28032e8f2fd5530264008f5c485a5974627ac92191bd449b3ead7c990b96da5681d04ae66b4aa7669c66354af6abaec8f530daba45737dd98f294a7559922895f23912f4d25da6b5fec36c54075d4798625e66b4231d04638532699d3a69b4bb6bee1242eb56aebc759ee175daaf714f18af17394e4a1fae56f79d44a2c58c5135ca71f2343d43fea3bf6d147be06ae6b5b92ba67bb49192d9176df4e2276786c69b40c467bd347d4ef06bae797b2eaf009e6e8b4d38ad7e0837b6c1aee268e571c8bfc478ecafc750320424fbd6727979dced6abde34f8565897055dafb6b47da42dd84f3ec9ed8a73fc49350aaa1fc40d582d44df5abe69439c2923744d2b54156f20fc18b7b6f5a2fc1fc59d272086b87e5b199e34e30adbaed6bb0fbb8db206de0ae487c5f10398bea09fccf305f5b0bcff5c886c6bba1130d637345c2f9ef630391aa8638d079032aa7c08995d10a30ea8d90cdee115561bb12a92698ab9cac46c059a5a7d94f8310d6adbfcadc1b61437cd40f1cc8c73ab44561c7fe6545147292c9d88d4adc511fcfadbb43bf650fa528fb7fee4a0a318a742a1bcc24edb576b0ca5a93e8c487ad2e3d11a8f985cf72790f408487ab289867425b0d48a55a0e1168b6b4d87af6e43674fe47c6d447092a63805c5f7912edd14f34eb650edd11ec1b4f660d97b14af4821310f0b753216d621f8d572a948c137df40611d33f5e3e8d8b89fa26c2c03484a94e43805c9bac594abde2e1746e3351754714187e8f4b17e6153183e761a236194e2c41c55ca1c5320e9e92e9b34ce6634af1d6e0a46dfeac729fc9fddefa511a8965ab462eb8ee245fdebb499d16d9aa1d083f5b0cf37c3d1ce791ab91af83c32a74331307cce7f11cb9cb55ade6f1ccb43b36618f21eff213bb5a5ea6bcc1ce252b548bac153f1caf498c720ef45ae3510f8b6f17ec2a8e86d37ba6ee6030d4d8b9eea28e15b40b798a30cdbb866d4045c779a34805b8fe9e7f0d75f83bc2eeb46b6935efa8cd8adb16fe2369bc189c525e44880bc6380692aa6201824aca25240caaaeb02abcedda4b67807ddc37f0e89351b90268a257b45fec06978d81b7f41fbdac122d3cbe8da531f98c87734662ac428be832b2cc368605f5d2f8dd8d9144aa390da1df908c423b6eb708625bc623cc15a518fcfc26e7d1b0e4eda35703289bafb63e71577e8fc8e5c273b230229074a39ca3242eb99b5f6a712f315676b4413dcf5aa185305a3ec71c651169a718983d948a7cf28bb6d72d8554ef8b6440991f7e1229e3bab8a97ddabbfa0223423c55eef0576243b657e8e4c87a7fa091db1fadd640f1cb62efeb4b7582f2cbafd8887476388baa3fc9bd9ec5f281841ccee653e83647d076104c14e1ff419149b6b0b43b6a15e25b8366a2f6f84a6531d6ba3a62f5302d4807f9fbe3e8fd43e45b52ad8ebccefb06045a5525278e8d1e30792ca3c5cf40e03b57646b84966a8f819714992028bf0a94ba35a9f9135a642a5e6f030fac7484c5725c669388fe78bc89df56e8b257302f5eac46d6b6aed72aa9a2d121bbe569f174de4a6c293b22c4882743aef67c48a173dce2a5ec0122a5e38855bda24954ebfac9d6620c5a8cd5a04dfa655738dc7ec6b6ef5585b9b66b0a2fd4925a1447ec0d782253758faef68e8f2c0bb645ef29942be7f7dc342eb5235cf6b8e3fe0eb2bb3af9b3cc33b4253761717cca83d2e39932c6185b96d914b598aa320827f417027c4d16c16c091faaabe454d8159f1a2c55ab3e8632566949598c212c2a1ab0025a199be1324b0bca012f35b5484bedd2e6aa1ac117cecbd539dc2623e9fdb95d94efe30e7fa8a97f7b282f24556e0586f0a8356a560a0d8b5c0fc16a7c1147097e000b1a460020f6843cfa55a0d58ba89bc2c152cd30cd536b7aa624d248d83c8a94d07785a9bee664805059620ef4b7391274512fd3a77eebfa81da9192b991db1a8ae85e4e122ea6f54add212ec5df3a9733bd10b757a7cd0bdce22ee884c7208156fbe3b02091218828fc1913717cc662903ca644e6806df0291027eaf840404a5fdeecffe5c738c6e1c57ea123b1920d631593d11037c8ba93c0aa6d640a3cf24984619582501af4b790f2415debd64a57a7eebbda1a3d3812b45b03d3d637b56e767a87f13ce52cc8052d018a56c076a63f4d230ec8ce1fc9bf79bede50087243d755cb5abd33d7eeb15d41ed274449d9a06786a4d0f86c4f60f7a3e55fae40b4aef4ca93e5501eeb00bc62ba1f9b8af4eadeb1e9dec6b858d273f75754a5661a772b02e9b3571f9a23f0581c18b8a3dd15bc49e2b608d6eec3b875b19a7f0b84d89f64db6ba06d92de50e467ad77c5a36ba23af3dac8cbacee3a1ec87f9cc6b0da6ff57fa353d34a2a97577815048c92d10ba62c39ceda4f8c077de2ddec18b899b83039523f5cb9ebab663b46028750a0d334a52a5a15574879e7f29a831ebdb90aab83dd8fc370000ffff364014ad7e300000",
+		"a12d353e7a623119cc2a243f305e433f": "1f8b08000000000000ffecfd7b77db3892308cfffffb14b2cfae7f2408caa4aeb66cc4279da467b34f6e93cb6c776bb43e300949dc50a09a042dc9b6decffe1edc4890a26427e99e99e779dece698b000a8542a150280005e0f4b4f537926651425b7e7be0b57dbfd50ddd699206c49da578396fb9ad3963cb6c747a3a8bd83cbf6907c9e2f416672c4f234c93d32af8ffef689ad3804509b50864f6fd7172f33f2460c708b1cd9224d316592f9394652727c7390dc934a2243c3ed2898b24cc6372257fda0a1431cb1e1d6bb4252699fbe444feb6f122bc929f16b3471641e4e12123f1d46effccc9fb0ba7aefb9223db5a6c1e65d02a28b5ef8ff38cb4329646013bbed0f12dc2eb00a97d9f1296a7b4c55a116d91abf7a24a6d59d887345992946d04e8fd2d8e7332a290d07c41527c1393d1910783844ea3595e845769c4d4f7d61e91319b200ac9b6289749dedde2b445912aed2bd96416b12fa2a9a5626684bd5f515dfea7cde2268933992b458760381a767262a5286d4fa39891d42a79c18ada36a27849b2208d962c49058dedb2a25bdbb6216d2ff36cdec6cb65bcb1284cedad4246cbda518bdaf7d324b524a5fe457a89d359be209465ed98d0199b5fa48e236b12219ac7f1112a20c6e9e4ca0c8ceeb717e9bf77ae98628b15d9f0c8b3dbd3247d858379b566c4a290c168cc26f6d6b6478fd4306b6ce9886416858f65b522db1e1934351144ecfb6651a2903c5680154162f34a343038e59855b4595834b59ea729deb4a34cfc5ac4b6155864117b6b11fbe1a196a1a9974a313a3991bfed889114b324e59d43d5b7442c0b9ca6c9a2a1042ee4d1d43a220a9a0bf731ef857466280c8346c8ec8b4aaf58a6094b38609b259f44c67680e3d822763b8ba3805867d0f5ed8be3f75a0b217a7242da41423396e6014bd293138ba24a4c9be285ec68c76ff152e4797838fe4464f6868a5109fc5c4ba5ca72fadfd6d5e84bf4f0daa6ccba1a9d3df883876ec7b6ae462f62bc5892d0be1248feedb4cd48c62c6a576b5ae3967dcfe669b26a51b26a7dde2cc9ab344d52ebf835bdc57114b6306364b1642d96b4b2654a70d8a2097545dbdcc4a415d18c611a90f6dfe96bda4ad290a41cf486b43408141930a7a8259576d65ae4196bcdf12d69e1d6b8d6dc13cb6e2d089b2761fbd8de5a76297f92fc7b8bf75c84d8c3037b4654c7b64f4e2c868ad085560314793045bc6a5232997d412fd905751c3b1dd30922633ab950dc49b7b531e63689c29687106202fbfd560b096b473423297bce780391e631274c02d16c5a73ea707b4e70f8f050046784bd8a8968e09f369ff1ec1d5e10eb98031ddb636f02a332679012cc8882e612bd89c9b17d11b57991e89891353b0db2ec181eb364a98492abe234632fe6511c5ea58af09fc8344989154133d51ea55cc1121a8a205778515b94f1694e08bb3203ed20cb3e93354364145532d568e530ef9290f09ebbdd5ac76d3198bb119d26ee229bb5eeff4e5b2d962c47adbef7ef173cb08a42361fb57c4f8579a55c1c47333a6a058432928ae820899374d48af12da1a18a4b963888d866d4f2da4311314d2873b3e88e8c5a9dce722de2964916f1261eb5f04d96c4392325e8142fa278336a7dc23473339246d38bbfd3eddfe9df29a7fbe64648bc2039c8d38c97bf486e657e1dc1e12a11ee22b973776357e4e66bc47442ad8c110e58745b2b4aa44674d68c7d37c52841256e8f6d58c8f4bb7c7143d2f6ab0f9f5ebf79ffeee4c4aa46a0b798cddbcb646575a0dbefd8bb39a3ec35656446d2326f11854c6d2fbbd731153086fe3d3989b29f231a312e1d2727a2c0699c700bc0460891ad51a648cca2193d39b18aef86525ae4d2bb72fd1179e65df92387e338e66af738a2ad9f1574a9dc113af24f4e9ac7ca5d688509decf081b19ea531b71f3282b460bcb6e2f300be6d6e97fff3d031af8ef19b0c6fffd77ebefd904d8a7f6d89f6ccd4a2a4270a62a5a09a3da002a9520b11b95f70b4c69c25a41426f49ca5a85766a25698b67e42a5a19d0a5ae64a818652145fe05dd359fa8369f52c370a2930b45cf114a6d8d2de2c3766aef8ca7739c1986871c55531809053e8e26281d4793c2f8604ae56274ffe6d5cf9f471e7cfbfae5cb37af463efcf8fa2ffff179d4811fdf7f7efef9d5c8832fdfbf79f3ebc8871f9ebf1b75b6a5b19d58f6fdb6c24a2b311af51e87e1ab5b42d99b2863849274b46f10e0ed7b1d2ba88cd35b8d3107886aca4581848ec9845b06633241e3890d5d5f45b6231a92f5fba9c5ec931311c10d5e8bd95b38c7d92102a3a9b58f4635ee1ff97bc8525c96d98f3475ae7fb443d316a684ebba271172b44bc87d2301632244a72c5f0b17358abe10f4a42727b49d2d85ed9542dfde6eb7308cb225ef6482a851ad7f1c2685ed922206d12a3ddcb26f339cce888437cc0aa6ec40cf8629f260846831c5b88cc434838ed389146f312b249ce46dd9db32349ec0007917c165a73fb8081cc7cec6c10459c1a53fb83af68e47c7c7b613941ac51f48e98a618eee5fbefa4be7e3f39723a10b3fbc3ef5cf3cf8f1f9cbcecb577f19f967dea98a87335e39ccc8972faf5f9a3a8b2322a8d739ef9d0f869df33e1019524cc36461d90f1e648712e9a1c4f440a292382b1b77fafd133271b23179f6ececa4d3efab6f7f60043a3d1938768f1d9985f114566491094c64f3fb0f839e4aae661c744fe883df39e389b496979a45d232a72c2ee51fa941616a82a705b8dd66c997e592a42f70462c7b0b036e8957fa8731dd174c59e0b5c5a0fc8c289f9ad9f616923c88a39060fa3609f338a9f530c53df2efcc61f6bfb32d5ce0e59b88129cd68a825ca3eae252c7222eb38115b9a97d6a519777e798a4fbe8b37c97da803814b02dcc1649c2e619237b6b432e11bbf246e419a257fec822489426cbb1010156d7ed00626b5424fd11640458045803405cbf6f3bbec71513a6e1eb4aff2f59d5228e615654841158cc258e6f2b0c3fc7093e8ca392d1ccf5494c8b464dc608b0da7db792dbdec290cc3e271ff7e5c8dbaa6ff312c2cfc94b32db07a83afc1646d9876445d2f7d3cfaba409d843c82227c4f5ed9313aed7c81606248a0f67320c40f1c9734816c6c9cc22b6d4316fde75789d0483bf0d9fd1260d0833c2fe9a6346521a25f4e73459488be1551e936661976682a434c960a24d460a33842d7adab1618012f911236c59cc496d1ec8515206e622c59581a548518190a7a45c183b369cf21415b838fee5d75ff8642bba22ed8c302b03390cc01c0660093310dba3e35f7ffbd5049009124802fcf6cb6f55009d3b5700bffcd650c4140620d445fc522b22841a4815f16bad089d5b151124344b62d25ee1945ac79fffe3e3ab576dcec22f2c8ab351ab7da8412cbb456890e47c7646c216a6ad9c7ea5c94a2d08f079bc6190cd65ef1203f01a91073edaf0ef0d9fd27be5747f692920a2a6c768ec434ffc2b7e27b06ea33ef34e4e745d88b4868bcaa4d1ba3b6ab1396919cb322d9ab4e284ce48dae2fd386b95185b794644cd2d5b2c74102cd624f6addecd4db352ce630fcd15d642ca2b5d45f364bb857312cde6ec2082cd1e041b8e606bc3aad15ba12ecafe4678e53ba323af86c4d07c9a9ca27dc48728f55380e3cab0b337132933fdf228bc00fb752f5805db8b64b14c28d951fdd92ae2332f62df0738232d6fa44a60173729c15f2f44ac3fd27552b12199e23c66a3723ea5e652c2126d45592bc9592b99b6524c6764d43a7648394d1124cd9a496a20a852734d4fa59edf470eb73b124a1ae4852310980dc197f397b56a276eb424cbcda1162a6011696f543be0306c969dd288beb29a748b96bf561b87a165b768b26a2534deb470109025cb5a092545576cb7bef09e88c35066cbac1686ad9b96d92d256d0608a7c61ea95a3a06f94e41bf2d2af0982c3b85303b85fc95e51cee3aedb5c32a7c7398c93b5e3451980e2112e40366560014bd31bff9d126c8f29b27364196df3cd6040648a5095ca3095cb309b2fce6b126708b26704b155094f35813b8d52670cb2658e4318b96f101b10706d5c0107c9df331ca41413928280fa3db2824fbf39c1a659e1a65ca7c8f945825ccf24fb9b12a36cef40868e63426c36ba826e81b9822528cba175576a6636f0298938ebb13409d743c9868cea6635fa6f464ca70a25915d1036aa598022922487b6d6b94d5b40d24ed8dad91e2f5a348f9146b1f529d5641ba3b6ddb8b98b750499e6eaeb5bd5b0c6f3f0372a3156ea5d09d463d54b481ee40b13b50b522df087ba9bedc55aed3487bcab22b02608aa0451f1e7cbb2e70cd0450bb9826ecb58790312f50d5aad4ca48295b8c44f12308c5c4a5095f9950a04b939c868fe013308d088d942ac6cfc96f244df6e3953f97ded50ec1a3fd3c913fbb9936bb990a6a289961d664202842dc8a4da08285fa49d8013d27863aa9e808374d8334c9b283f01bb7805f6fa114b74fbfef250ea8a15065d226705c13e3ea8433fb3d65d681fc36d724748e19c3b4de21aa98f04da65bc0a9467024344917388eeef6f2b6d2712afd8b77a22dc4741637659645314c3b966e0db742c687d7622554ecc27ede3ff32e1951027ffa3dc72909c5e61cdc89de3b4eb8c4182b5cd2de141a023087026ab0f4e5e384957ce5787778cbf1cbf5801d7d556570d102d68e4a224d0b5e3b1696252c05c95ac3d4b24a41b50b9b8b636b323e4ca79e9a2dc420d9218cdac2fae5f491df731c37f617d25eeba5fdf5c909696f7468b385d33459889ded431660b183ed29ddb14664cc8a719b8c99e3ebb19a254f41474e4e2c223630764b106e477ad815a8b5554124bd3fe5d329499f33964637b9a98caafc2b7705ca097da3f59a4ca71961ad39ce5a3784d096dca9085bbcac56bba144cb2e6c556e1ece08fbc562766920ce08fb55477005ce3023cf6b23833158ea35279e252d969d7828323b0c6eea30928608501783d431665811481d0ca853187f3bf3f965753eaf8dbb86f9bc5c22831826308381243b96d4d48dbc78ec4d1081f1d89fa014c6e3ce0425301e772788c178dc9ba008c6e3fe0465301e0f2688c2783c9c200ce3f1d904058a635148288bd8669f2acc08b37656724ad3a471066b35cd60ed7621ff56a53a4d935943836930489bec5cce023af62690712ed031ef1b9c1174dce15f5dfed5e55f3dfed5e35f7dfed5e75f9c29c226e67ca1c206e6aca1e333ddc3c89aa538603fe12cdaab3bc41addcf69b250adfa2289f385b48221efc407927d1bd203c91dbb5c4029417a0d9cda3303e08dc724777ab272824f8209908dcf25b30427788237b19f3ad5d20082a48064c5be195ca6e4db73133dbdaca73476e2b2b63045ac0c443589c15234122903996cec404a492cc52197ed3e9702b39492114a11988af9135c203e7f823324e64fb762ea04f90caa37817c8a359cc01b94f2ecd728e5d957281d9f159e4a1117510ca64e026e9d0cdcc0884b25060b27011b2703d730e28288c1cc49c0dac9c00a465c960330756270ebe4224b8f472c9c186c9c5c6419f288991383b5938b2c9d099a83a9b304b74e28b2f479c4c259828d138a2c673c62e62cc1da09c1eaf1a971432734fb9d9822f399a5f81da85f5ffdf6d4ef50fd76d46f5ffd9e4d8c293661245d441453b6bbef596d5286086f138a086f851411cef70811de421811de260922bc153244647313de423122469b308041ec329080c0a52002b14341023227051108dc14602097085fd35b9266a4d1cbe0480ca37b56e2e5e275bb4461d9ad005363f9fa46ac6b0b8f6012b658d2928b87096d85446f04b78fb58f4255e22b1c89a4906329d68914e44c8a7c20853c96629dcb0e309722bf94421ea22508dc18cce114c520779720830b3407991b801cce500442474aefe2229a5adc7a98d9751de3c1da3f49f72df24f6785c71eef0721b885bcff202b01737709b02d223a1364c500bb090864447782a6e2a33741d612446e027299d21779333706918c184cd0427c0c27c8c22077e73ae56c82ac00442e06198f5036538a69b64c32b22369708fac13a47426378ee460d2e5e32e8fefa8e14669d0818eefab8186c941653829647d46d83b61fc4a29d9ab22ab2adf22b6294c4259b68baa58b651afd774d72c3cd897798742629420451549512922ec09ce00deb9901848485135dec5241b782f9315e71d0db1720ccd08fb72fb9993374dd2c51e6347529895f65964c3a0b4cf22fba210360a324841005d0aac0c60270089ed6087403705014c41c63f2c3700d8c97852e23065b56c6116e078a73b97ab2875d650a5e6a8527354a9392ad41c8354a839fe3b14bfa611dac0fea272c269aba81cb11b3a752a3bb5187a1239f46472e809e4d0138ba1a7d2bb18881cce1dd17f18c00e6793e8210c240e05b1ec7b5ce5394cc0f544083b4c000e4528711888cdde1263f68d3c731001420f71c6c9407f22b827036713c14207310dd6530101365481d20cdb9d6f958e70fbad449822ef22bd3c172e3ed1d462e37422dca5d249e96da53ebcfdf3b39d6993e9b17c412fcf85ab5d850ce5aeecb0c94565dba979c6f694a9dac50196cbc323b2078b391c95fd9539da12e6dfda16e6dfda1ae6dfda1ee6dfda22e6dfda26e6dfda2a265be53617a2fb19612f31c35f3ebed915f58beaa981c28ff43f3ebf7df302d35b9c29c768bb34a2d3403868175eea8de00c910b1267a4e4597c7262c57bdcaedf7db28ee78c2d47a7a7abd5aabdeab6937476ea9f9f9f9faee76c111fc3e340a03fb66d18b7c5363022f217c66db9ad8b88fa504d10b7c5e6216564cdace34e786c5f54887ebdc033c2397345dbcb9c15418b88917144db618a57225a46415da22ec8860cc5c57ea54c7cd6f17a670f0f4c8188e0156bb344b581751c718ca7ffb324b363d81ed8a386c4259d1ddbdb2d9c22afdce25fec4e3b61bcef548a30f38fa3f0581f739a3ace564dc7f33c0a51de36ddd82c9544f182a0e3631910b4a0c28a225764b468bf7cf5f3f32f6f3e5fbf7efbfc2faf24dc225a2ef052f8dec9305e2e233a43c656193372be7dfee1c3eb777f91b0ab142f3f9590f48a8e7ccff3cbc4cf65627a951a890b3cfb599c872a01a2ab88030c3459b40e80af30073853db9a34ca129626cb4d09115c052355001f05312b9392ab64e47b9dae620e6524a538fe5942d13c96ba581e1b28326557192ff15ca6c95515717462ce8d31c5f5942c09d6d1be9eb6b7a567fe2e341fb6a284224f33829b1ecf73967c5986981174544910f997324637f95bd5621ad2980b3e8f97738c8e340fe268f96b0196d3250ebe3e8fa319e5bd16f56434a14112561a3cbe8a475da238752b8f2c6a7213aac8e42c2b1d53665abaf73ab1c8ef3b448bef554d364a6cb77aee2fe1a4be909994b2506b915910655922993c13f631d7f495b4cf246305436e23b25a2629ab67a09cacfbad1201b266794a04cc4279be42aafb05a452ead5ef6791a264997f6bb185548920a442a820352416d282ed76a550d56b6ba4c8d82a23aa4955b6e8b4bac0941db59e7472b2135545d5d01d8dca5e19df461f0ec992cde54a232afdbdcde887874a50b51c233488e2dd8c95049eb5126194f95935a141ab197f550d8eaab2bcd1d2776bfa2a8b28451f5e2c6392a15e99675d93ff6bb3035c9b3de0daec02d73b7da0a6a25532dcd1bfa8ebf1d8f2dc4675255485e4306d3af7dbf0de582d1c2d6094692e1c7930177dbb3e675275920aa95d9d68588666d44bb52ab431d5a34e53a14d55199a1a5343aa90f0c2f9a605d02059ca11f431ff1d315c12f1630e99aa4f554747a2bf4a27f7ca68490afd600c8c44a90a6338244a6bd40641622891daf067f4bd9d818f983ac51cf688563e4da31da94518239f74f9af34a3602751a1ca90a79364a832ece92419aa0f7da4d6f03b6320d9893201357219b29b07c71dedb767ac243b51e6d849e46ff3004aea31b50195149fc54ed27f7e7affae61ca5a4e4d1e1e764fe57283fd889d9c94b69c56cbd9b8300927a58ddf90a88ceafb056138c40c8feed5b83eeab5fb9017343a567ae0589f9048d222ae2d293fde428e6d54e085bcef8c8ace04551f18995d034af1188d0f68830994e2a5809ad5c9044a695240cdda6202b5688daa1a86773b95b3de292750769691d183244f8a8e01754b8e2a4d0ccb51afda6b61d19d47d59e0ecb0e3baaf56628446d544a1fac4be6a85184614d0a474dc2babdd8390024b49c3e5e54c65c98a7a752d1cc272756da3cefb06129985c7c258a6c9c2a9994170b5cec1c874f6dfb3e42e34931c7c7c883094af589217c995c60c7b12379e62b6c97d3602b1de3896d6ff9fcb415a16a927d512701dd0b91952198a7f128da6ea952f532b698033e3c588dbd07511b5279b8aab6a4294d0ef3d095752f7b93023edeea55432e575f6eeb67b2ba5ed11eaabf14fd58ccd3dba69b9a6528411b92f6fad27b7820edf533df560eb5a57c2bcf5a9f744744b9fc99c749db6bbbe2fbeb79be86bbf4aebc915f4bed8c7c7de614df64560dd5bf77ec2b52712ee2b12e69aff715be1595dbc80a6c1a2af0b95201e9a458c1b169aa8080fbe60a6c540536950a6c780536fb0a371d9d65773d39e109c817ee19620d0736cfee179503b48484991ce38ee17ddd79fd48ad57995331c7d9873a229935fb368ffbbb3d0ef3774ff5b85fed41b06af4b89f3579dcf7f6edd03fe275cf67937a2a9996cbe0dfea87cfebaad1fc699ef9bfed05bb33c1fe6b2fd8eacff3f317b19d91a2a612db1da9c2ff45cf0428d22bfcd49457b8f78f3f3da0644b49d6779d25e0b251603096f2daab2bd25ea995ae1f3e70d0fbe71e3868df39462df9f74abb297cd7410481afc456f2e8070f27c8c67058d920a4bd72587b5596f0e3471714337448b2e38f3ad6d0fbe71e6b68dfb94643bb66437fd7710781afc456f2e8078f40c88676ab0ded960dfdfdc71cda77c5d7aaf4cb302cbc26a723a5548c83084ab1283f9c15c4fb8f2660793401cb0308787c3601a983c77e6702225d772c0f29e0715fc29c2b986e017387f0b823610612c6f71450af005a213cee4aa0a102f215505f03fdc8798d8cb0e7eb287b4e6731f9394d16e5d1cb26e3a323cfd963b10fdc5ec9ed34b5372cfc7eb999b6022249177de913b777a56418f99a3fc5d2b5570838179f536608cf293344e794191e65159a3faad968835782a04fef0f99bbab8968449821de883040bc11612c5a0de688b71a9c23de6a70299a09868837139c22d14c7c165158bd991bdb976dcf5757cbf0a8c05dd6a3e66e28a2c404a5ccebf0bc95acceb2163377c25a4ce2e4ced4edf2d81d7f16e5e8289975a11ae7c36bd1540b64258e6f9f76e00c59b9fcba45d6547e6d9020e7b407d7489071da833748147fdad3edb978363b39593cbbbd5af0ca5c59f2e2abf6d01bfade6078e6c3c808d8232b459b538b1a22b2b06d18a1f529b547b367b757338dc640212fbaa8a0a11c4d6aa099093437a7a93dba6d445121c91328d6a75664a0b8b56d98a29bd3482b5ec22c292a5ad438cfae8d1c56e8ce6d20fe3aa28d81f8eb58b19bd940fc2d04bf68ac6bdeec5c14ac6be417eec002c9e9b59676814707ef9040a5832b54f63ad5f4be381dcefeac534fedbb5ada1d24ed3bbb424e91b682bcbf6b62fef8d35205313aad89189d5621e69f70caca24960fcb06a41af8eeec5dd2f9a06d40aeb479fb4f3bb955a9c60e54631576a056ffc79d02d35c31526a7268a4acfe9493639a8432a1464199b0fab3ce9a691a8c941a1146caea5ff17c1a9f908b9fdd4c77bb99cacac99fdd4cabdd4cab3fe0245cfb4e050b9bd9554a8e7df339394799ca62b6256d65d25e7def69388d4dfe6884f2e7474fca1dc2fdc79ca2ab45dcd523567fc439bb7fa983647c066c89f997acb03115b6c43c4c56fb5fecd8190fdde9d01d0fad7468f5871f49e3b30ce17558cc4f85df61b1c9f8271e5793ce8edab691ee8eda9af9138eb2f5fee4a36c62be3623ecb722622523feab38ecb6b5e1ed0fbb59dcc228fb2f72f397371fc5d5ac9fc5fd796ad5fb53a5e796f700496f9f72f55fb9f8885b7e2d03a2d131ea3b1d87d4a695a5ad26ed2f551c3fd871afaaa4fc699e1a559751b3beba06357a9587800e579daccafdf3b6a057bb4f9aee4ae431b724f2a8f311a9048bf58fefdb43dcda70f34431bcdd2b861b2d866fb9f2936e4c7589dcd70e0656c1ddca3d8e8a41ca2f8ae8afa20755c95dc3fbace1b23d63bf87aa06b4db02d06230e5e314fffe39c6fb8e72ead30d749c3a9e3c96933aea105acad5652e3eba133847d1187398a5f8f02730141f9d099c8a8fae5837c98f109a3e3c644708cd1f1e822384960f0ff11142a12c6a817c3781339481b91380a51383d0c9c114dea2d933e45df923d7871be4bb3330e3e836cfaa170a4b246b63d6beb1e10d328eb7afe10cdcda178bf214c302dcd8a76be32e372b11316a012001b7bca40c6560e1ccc1350cc481b625b886318ac1429c51cb510e16ce145cc30542bc0a929015f24f4b5232903901089c18c44e0e72fb2203680503fe27e67f728056dbad182a323d4a047a8088f5d8901fdaaa5c9b9b81eb83bb8cd7fb6e06bb2eb6f3ae13fa628ee98cbcc0717c8383af96bdddc2cd61b4fbee0bbbde1c467b7718edbe5dd5ebbbc3685787d1eedb6bbd5e1d44bbdb01abbbb0c64aea9336620d9e175bb1d7c55eecb5de8c6d22a698667febaedaf55a97a8cbd3a53d36765c1b5b6bd7c6dedab5b1b976bd2a76230e50ad0e8bed5eb8a89e5678783822ed2813e9f6ce3ea3b46b0c5eb7da2642b52b43d64bf11c00a62d11ddd20e4cad14b339495b6c8e690bb7a47dd46d611a16370a16a718afd7e2baa2eb0d8cf8cf9d585016505a71044906b3f23e48e31ac8c44af5159091bcfe3193494b94c9a4106522492d7f1cff22af51c457baa5d01cc420e71a118405df792877794a58f03fe02167ce538a76e0711c6e09427187e30fe1761b703b1af76ff27ec83a6eb701b7f3ad74ff26efbffc5edc07e9fef5b746dc4d3c792aee82ee5fe4b59cb8b8cafb00e14f6d4c45383cf2e561dea7f5b262dfa4791deeb4635e2c41ab6b71b2cb83d4ecf4454874fb22b42a8f0b6af7ee47497b7c17a77a3a8eca372bc451302c4f7825f2f05826cf84714be55cda299dca01625f9828a99339735dc1e533efca62a8dd37c6eaa5a357ebaf57a8dde9ebdda8eb35b2723728e6d0d71b6461372ec377c84adcc806cc1ea5cfb29393f4d99c23579b67729fcc49ddcc9d97f80546a38476a76fe28f9ca44cbd43167662fb94d9a3ac0975e6a615d49c3893f80ab24da5a83b64054e2e50efa09dbba99b1968791d4db492a6926689a8402c8a79aa307ca1116bde70d6da384c98c56cc72f8e6e5efac41dc8fda8623587b4d7f63323746797dddb2dc7ac8d3196dda1f21401d55b93d76b549e3a70cb01eece18f838b8012fbc0fda77aef03ba894c4c3e2a616c02a8878585cda028afd0781547e1a8b45ea0ea7e6ab8ecc2ddaa2e6795b2cc1ab6b9912f1f282eb435fac92cb23bf9f93154ec3666e8b6caa4cf58497673e25c4d32fa4c76bb106ef43765a532072d64160aa1b3baa5f5150b5318284fe4f3ee3932f618da8c07e631620d7d77c36beef8cefbd72776829f57a0df8e8ef68d4dc0670346e6e09a8c08a079eb0a47aadd63d0d94eab7c0aa7e0bc485a5fad4a5d5ef2f63dfdaa771a3457dab462c7d5d357415afa153f9e26d3bff94149aa3607269fe6a4e17f90b7617780a9e3faa531aae74f9062f9f8a6da9513dd1db47839738f6bbfd34c14aff9fbdc9ec7beeada9e1af5e5d6324eed1bb8d56f0f50a2688f1b48cff6c60c07fee60cc7f56752b8282d8c120715210b811c88a564f457ce644207129088ab68f447ce05090b929480a09c020762948dc14646e54c0ef1f5a1a16d4952663154d164d2dbf1ea9974e2a0f9cacb5db90e0862257dfbf257882854a70a85420a9541d91501abc98e4d2d3dd66c5c795eb153486a772762642e50ccb158c4f909b28e150c4c1e419aa3a84702e152869c9e992b7b050de19f2dd042462a5e312352daa04c877d9450d7f20ae60d055d665058016b16bc3c24d8bd88d61e34645ecddce68f748b3ca3bc68c15163ecb32167b6298f0e95661d45abecb6c90dba7315c1a77a889987ad5309817da7159b2b1885d17b15c78e785a65d1aa23b2ff4edf231013db445725dec915c8b4d92eb6297e45a6c935c17fb24d762a3e4bad829b9feeead926b73afe4baba59725ddd2db9ae6c971ca8e31fb98f725ddd48b9aeeea45c57b752ae9fb497d2b0c851d9eab8ded9ebb8ded9ecb8ded9ed80053ff6db18758e158e8c3b29e6a0acafb4b811e7aa57f05afcaecb0b12569543df870f90d71eaf5a359d2ad873efdf53cf14fcd851827fde09827fc4d180ff1d0e01fcb3fcfd7fd4d1ff87ddf9bbff3aeefc3feec2ff2738eeff299efa3fec9bdffdd7f1cdff717ffc3fc10bff47e7462597bf7362f418bfeb7015a637bf98208e03944cff23ce1594589ec87e50653fa8b21f189d66b98c37f5ad8fd2ece3969cdafa7878687c6cc8d04e05aa3f60d343e9a865654a685d57f756c46dde0266dfb2b2c998bdc88accb275bfe30d09c95a3121dd73622392273622f99844341e4cf45af50645f2a446244f7344e3619176872279422392a7382271d2c36cba275d8758396c4cecda52de779f5321e665b1fea915c98322913c2812a98322d1d8ef4fec1a3bac821fbdb25e1cb433b101d68cb10acea8da9f2ba86e0975c7a1148f06aa5c4f81f50a3055cd3d874b9e50d3b55866d8c04474ed4cec2b062803ccc120751340618c32409d0430370229cc51c66910d75d3338476e04988b01751390d6781180cc9903377262e0266e0edca2feb14cc14e0edcc80d809be83ae732257102e0623706ae3e88b34c136e423f45147ac55d1bff95a471a8aec7b4eb200a63b131626f614ebfb1983a8e7d6519e498e7eb5f46a9ccfd4777c65ead53999dd110b99dce680a5ac3eaf8f7bd7ad3be3b35ccc5ef3f51f50f3e8ef10f3f72f12f7eace25ff6b0c4ff0dc720fe51871dfe91671afe0f38b9f0471e42f8ee53077fcc51833ff670c19f749ce0ff92d3037fc63181fa634edf351915489e381315b08f4d432b40c6a65c259ee9dd383376cf2e9adc44937b6862c7a8bd163b681bb18176577f0a4f6c7025858d04b04bf5bed91d925b60b86a81bea73bcb30e57b1bba235ac5563e6bbe16bf747e13ee167c467d5add00d21ec53b2d6a50f221c6b4d11cbb317cd5db35c22d522eb95837f616a6641a1fb27905dc3e7a3ab2c34bd7077b8f0745fd30bbd12d39af80c9b85dcea973d6a71d738b501658f2acf4cdd02e19543962fcd3dfd62a4c77971802281fda725290fef18f6dd5f5262fd82e5c803e2de7248d021cef6ff11ae08b2449c3cc22ed1487519e41d25ece2348da6c4e186e402ce1771497e1c8229f570264a73f1a3e72551346bcce048a7d0b056938c21564bcd8c4110d9f54430374b78ea276b078bcac11feb1dd1a60d456d787162b56c0a85ab50e72eaf821c9a23dd3c3bd734036f63bc5292c36f6bbc5212c36f67b93a6623ed5de3fa8c8730552bd4344a06717c3aa96f56640df004c0f0176ec660b7d8dd80ee3d2a65a484c0746e6f2a5296381a707985d43d4fd3e4c5d81e9c74fe3fdc9e7effea127eefe843376dd7ff4193bbd13fc56ed047f12bf1fe12b1956e339fcac823e1477aa3f57d06fd4ef07f95bee1f7fdcff367ef9a65ae5eb9b5fcaeffd712fe5ab9deb8f4d2fd6edbd0fcf7c3a00e6700e97308453b890fa65d6fc6cc54cbe5f3713efcac099787a0dceb8524329ff9da008cec6fd09c270363e9fa0844776272883b371678202381b0f2628e6b1de04e5fcb7374173381b7727680967e3e104853cd69fa029ffed4fd042f58c6f79f66e4f233d7264449c2cfcf8bfdbab779ccf543e0ce78b427c598a2c463e83240a12438f680e2a471ec17c2a071ec16acaff6a1e25cbcd8121ee29557e42b1dffb64dfe117fb0e3fd8d7f85edf027f25070928644caca2722bb2bd160f816c209fc0d0f64684ee206bdf41dabedb953a554dedf1ff4d4c8529f24fdf3e61bc8f0ec099c33d3e00d734da6bf9056929c1e25bc9b0f8ee4e90578a30884a2116df4a8cc5f750822a29e6f3382dc7e2bb906419f2253417284f0993a704c953b2eb1b0da959dc74c2cabe7fc2fe62a1a2db8de8ea5b8ddf79bcaaa9c1eb5364d3904ecc432ad078792badbcbc95da30aebcca95575ee58aa6963e66a50e7249f19b230c62b84418e430440988e1142520bf104d9f815836ac9b815cb65b200561e98420900d3d77a7e2f37c82dc84cfd4b9704cddb9881c4c50e82cc5a72f9e57ccd4adcb534b9fccaa90b31065ce102fef160520861b14687216ce062492a05b90b8334911068a262c68e4c390205bd023a99981c4bd95d46c9c85c0b1438d3acb5550739812b7a0c4c59a35b7ce4ca29ea099732b3e4d6236ae2cb923f228e63493228f7e15a43cad8d4210b84b49c91c04ce54529269a64c41e0cc25254b10b8a1a244d3211a6eb7897efb65a789d61c04de08be5f8b8c2b9480a046cdca5d6bbe5c83dcb991d4ec3690f8128488afc104dd80dcb956c4acdd15c84b72d4d9b2829ca791e26ad11511fe04ad41eeac6a94dc80dcbd96a45c83dcbdd16c8915252b903bebc2034deb3ca5cf7e4453edd927aeae3b2dc49d0aaf20819fed2d8c93e4ebf35daf44e31af6faa8fca1eecc03f9e4e183b1c67372627d68df21df861f2a0ec9cfabeb7e147e90799f57f3566ec6a6ed3bfbea437bed209fb8bdd187f69dfc7a1c358f3441de54413ec0e736142fe83de72a9337ee1bf17136411fc487cf9336f2f9c937e2e39c276de4db95cfdb77f299bd37e283b7eb873fc83bc8183bbecf3ba87862f731f720f32ddefa8189ff5d5ef9edc9838b67ea95df8e3cb9e8cb938b7d7972f15c3e7dca8dc7501acc53690f2f94b53b53e6e4ad34a237d2465e2bfbf746d9b5d7f285c6957c8cf1ad78f2177e42a928f5957ca9f1b37c0ff839e2e202dff0c8ee047e908f057f948f3abe404260e07bfedb9bc097f2c9c777f261e1d73cd69fc03bfedbafbf297ced24e09593810f4e005eca478231583909f8ec64e0a3138077f2d55f0cde3a0978ee64e0851380d75038a9200c3e390978e364e0bd13803bf9ea700cae9d1cbc72e6e083b31448fb3c72e5e4e0b333071f9da5407ace23df3a3978eeccc10b6729917679ec2727076f9c3978ef2c05d20e1f42ae9d2978e52cc007672690f2f11bac9c29f8ec2cc047672690fae281d8b7ce143c7716e085339358c518f4c9998237ce02bc7766026b978fd5d7ce06bc72d6e0837323b00e79e4cad980cfce1a7c746e24569fc7be7536e0b9b3062f9c1b89b5cf633f391bf0c65983f7ce0da8f7d7ef7d10b9577de058dc685b791959bf807caee3bbb527928ba794354abf577b6c593faaec6b9c7eff879f53eec9e794cfe473ca5c8ab17c64d9784ff95cbea7cca538964f2fe7f295e5398f15478209a7b67c98b23b019613810ce46e0a0290bb1148c0dca120007327050958ba146460693b84d7ca72180fb94ca4470083b9788e79e9f0dcb1cb31c51c96d79c0373944ca0e1c0b94305302f2476792112b83f01969b8a488e3f7798a08263ce5d9e8553c431fff8fbc03d35edaebf0f7ca6a6d9325ebf16acde603fd7f1fa7561a627ba1d9da2df11667ada5bbc41ac66e5a27435fbee4d4cc7fb8689f7a3233b9fd3a8a9c695954a3ae448c8cb15039f28a57d678f74ba4a652aad58acffc187b47b7fe443da55f14fcd41c67873d7976fee76e49bbbddca9bbbe221ed540a7d2a1fd24ee543da42cb4f953e5f28cd3d5343c2add2fe1ba5e7d752a3c31b14820d98bbb7600ae6ce2dc8c1c28dc1062cdc10e460edc4600ad6f01acd78babb14b0330ee5041cca5972283710502bb404b7223d0473670662b07003700b16ee12c460ed0420046bf816f1f4dce5b0b9cba1a60e879a3a1c6ae372a80dfc842270e3c83166e564e0addeacfbf4f8ebdf4d6f81bf42fee927f38d6074035e89578091c5eb9eb99c0f997b0b12b070b0a85b0812b07631af9b2d80e53be1122c07199f0d81b98b0553620eec60ce0e09dc9d208bf3307363859ff7792cf8cc81177c8a051612b8c7ed73fed1170f8ef32238c7333ef7020b37122db2144544253d8309b266a28840654984dada886b9738f15149cf503c47ce29590ae29782f848b46b206a1d95f49cf1a901ff3817458422d7ad28020bc85bd1f6581411ea22f8086a050a2e16d46351c6ad28030beae302da17758d05f9b2042cc80f05f958d43bd614f12efe567e75453e315706214844295351ca54e0d8081c1b95af276a108344c862226a908b1ae4a2948d284543f7450d429008994d441d7351c75cd4602a6a30e5d04ac11ddad2dabf1a521db8a91ab8533570476abca66abc4ed5781da9619aaa613ad5c374a44667aa46e7548fce51a904df62b9fff69e3e5f9b4b83878666c0fff0218c7ff9fcabc3bf3a7acc06fc8fc30768c0ff387c34066248968339e07f1c3e7203fec711c334107f2f7676c54b7f4571b5922d67959fd51be04d2348f39239510be5eadd7548eb8b97e664f5977dfe034d0fa55fec5fa367d095e55055eede127ffda1129928a2dc0b10a53e52e26f3f586253cd0e97589530635665ee435776e861847c970a1ff1b5f011df081ff13b18a0086018a308243ba405003b1406f200390c40c66d3ae8f11887c7f01e4c612c0e9d63112f8f9fc70212436ecf650e6dae4b7db37acf0aba2101fa6b1fc239a9f9b336cb30130888925c0ed6b4ed23574f9e6254f1296bfb7a2d7c94ae37f298ff9d3ce6bfe2ec75221823ec6098a3c449e01c4520804b148118862802399c8a05a58558a99ba1442c1d6620801bb11ab516ab713788b6b9a140db1bb842b4d4706261c3f25d6beacc6c1bdcc8e50c6be9ac65800faaa1bb9101b1c2245640aca5bbb6c1b55cf3e0d9e722fbb55ce9b016cead0c0c658e338ec5d9d860251747ac857b2b03bea7f34f6d15e3cb3c07ac4a985656b742f26dec169b1196b0e78435c76b59d9afd0007cd6c34d3a5e2903202900ce26a23eb21ec65686f4202a675a967de99d9c58117223f1009e32fb487ba30c3fd2be53a6df27c3654bdf1a701ac100f9a7bc9ff9a7453ffb54d4498c52193422fc7a44a71ec107b4c08ce8d72306f5083ef6c566c4793d428c7671b94756bd72cafa6443da5ea308d2f6066148db7728317ae00792664b12b0e8b6de92720fd92edff5c78fcd096af82cdb741390573a86629b844763714e368b66148beb555b1f628233d20ae624f82af6cec324c8f43c21a90954863a203ab5984b6c18c86fea8a9d118b39c4562939b2a893da2a6d8e5c0b3b917d6a612e124be47600e639795037702256946132162bba09ef45314cd4826f32f6e54f7f820298f05e95f3c8ae8c55300305ea4dd09cfff626680993b1021aaa547f825c9f7ff427ea1e19d920ef53364f66295ecea3605f8b3432c42fd8e117ccf0555d73c91690c1b964895067821b20ae54bd03aa95f754e5ddbc52fb0e50f5f754fddd792303dc0e88150fdc6626788a075ab13438f1e8873f1fd941f52ed24b7f70913a8e1d4d2d364e274708d171aa9fbb3dd2d76a1d79fbfd7c761c6e8a674729f22e282f803a8e5d21644c27888ca9c326179593ebcdce3e4ff1f2699a1b974b384cf91a28f71fb19eaa9c7fc4f2a9ba21422c96f26fed73c0bfb5d701ffd67e07fc5b7b1ef06fed7bc0bfb5f78128abf03f10a1c20341840a6700112adc0144a8700810a1c2138168f79e17caade77dfda28797dff956bad83642e9c3c3cbf64b79b8ff3d8f291f617f57be549e7d45fef6655bab4d0198a1b1d8448562630c8a3d432876a5a0d8cd8462eb6e02abe891ccb3ef0edb97ffdf1db635b4a2990ea31620fbd0cb66fea6fb6c5f56bda8a4fbc01f71956d217246702f61871d95bee76e5bb951fa94fb6dafcd0b6eafcd1b6eabc878c4936af1d85597a659a81cc4eb077d23b95f14c9fda248ee17456371217724f78922b94f14c967cb22f96c59644c9bb5d783c5b85a30b9a26fa352eecc5878515899f2512f2f56cceccbf6b9fcafbcf7cdb875c99dc36979418e9990406c5e93682485302eb37876794f2dab17c1a972536bbe43d67c97ac8d5944b687aa00c62551951cee12e21a55ca2ba291aad40a77880a1f21ca5deee755852caf99746cdbe5ddb8aca905ddd45aee90b57ca409c3bdbcaa3460235192f2f256dd82aabb0aaf821da282c7e52a2eaf62aab753e3759db5e6b7cbfb781ba972532bd9212b799457cd54657b85ddec201b21574d1306a9735b7be62b766b16dd12daca69962f9749ca8872ab1ab58e9df2aa55a1a198bc28983ef5a2e046178cca9ac38b1d8f30e37287e2f04e23e12f04a2a22ced31bddf935d7b1b127148f90ed6b4d616a64456bc419dbfaf5e5a2166ae15e20cb2dfc3c79eaaf9e67bd824fb759c1aa39b4ceaddf14738c9eaf1675cb979ad3381e5c3c5e3eea4b8595a8d47e3eee4d16b31ff7957b1c9b192701276dbbe64f615914b88cda3b93d929eecfb92ffdc5bd76ab6d23bd3566ab4c0a4f57c79491ebc2d2414dfd416fe0ba0871ad4f3b872a0ba44e6fa9c81b3d93e44ff5d200aa36c7f7927e8ffb124a05d40ee2dd3db4246b2c64378de11b24aa444fcd87adaf21a79f04e9d31f82aa72ef0673595f949c57f51bfffa37eff43c1fda538b2204e30fcad38d0e0f3e07f19e71b7c1bfe8ed42b2f380c4978bc85bfe80875fce2785bce997eb5ecfba629885cdf82c751780cef6f719c93d16bc7d9aa1e95e75188f2b6de9ffdf2e5f54b7d4b25c50b828e8f65403c29732cf1775faac8254e096588e671ac8e96cea3384c094563d5bff325fa55cf95be2cf55b3a17729b45728689df97902a0ea595431d17ac946bcb329a91d634213cf2edad6d43ba079e356848aad480cebb6f06271878bfd4bbf7f77a9b5bc8e1910709cd17a408491e137517f59333b02dfcbd1ca79e9485ea4db72741a75bb8484212ff2d222b65ac2b7910a2abcf79ef262db75a5ae49d2a4ad48d1871cbca6ef4f39c255f962166a49482b7b5941d34ef08093395eb485d751de30d9f9cf302dec998db288b6e62828e946d14e08c7d9ae330591599521290e896d462a7699eb17cf1228f631216d953f1c4919ccdaba83c23e94bcc30badf96eb07bf59f6fdafe5bb46b6d9393e058412d533b8929d89ab168cde41e86d94267451ed33d3646684925b92a65148de724988706c24e1929b471e3ccea95a5a3d3e429c8064dababe1696d6f5cb577ffbfcfefd9b4fd7d72727bb71b587a438535fe4194b16327c9cdc6424bd25c7f03e240c47b1f040dcdaf6d6e8c955b5b5b77139a1bffef0d368bfc228d39a878b73427f22d32455ef5255c63298d0e75346d2a6a4bd9753354aacb22d7311d036aa29ac6dc3f3b230115552b14b220711ad39244cd9cb95e5c6bbb07df85629739c2ff33791200c51d390dd779d591d57e305663bd876cf5decc1a36e558347de2e92862bc6f660a9d9da6417d7a137de0d7cea28bd7e20a0bef36f5a8b5f9b59516fbcd20ff86b79b78ac42df4d88f1760b66ead8cfdf7c69af5b3fe02cb2aefbf43b692e56f4696fdf7c956b2fc97c8c29477c241dede15771ad46fd0ab555e7143f71c71a5c65dfd220456dc465414be9f3135fa146f8ad8fdeca967fc5b35e37e26d5334a3ec54980e3cf899091e66959e522b3faf0686fe18aff7e4ede247b4edbd730fc6c3aededa0db7fdcc0f43cfc49b7dbe827b5d7cf412e8c3d5f690b5e184a53e0571df748d858f04bbbf1acfd2e55b2f5a3ec05e6668c9a2047d99b683667573fb725c5d617f8933633ed5111fb13fc52c4eef4a966bdf2b30dd39313ebe776ed309f9556a9faba3fffc1cedb8eb4cfa46dd76fef15f7f6ef9c32f6cded2fef825dd6212e98de8ee25da3481db3eafd88dbc23756cedacbc30d9593717a78e5c846ad44845a01a6ff7fd6ba212d31fd6889cd5b61e1b792692b621989a7ed63fdb4a33db2d4093c8debcae2b60b9fd32be1e0c9f2ab2de72f7cccd25182baea2ca2bdccb3b984a99a2cbf1b2b4c8f578326ac85a9386e81694038f135e8b2125b2829fb23db47d5757f13199b7e45d5c515d4efa7a51792ab56bc2cb27fdad5ce967114108bf2c9639d69bf14ca12338683fd7731ededbd871509dc69ed82d443284bfb450357b413ac2b331ed380ce17e88afe400c9767d9cc3f6d5e37aa5b91c5802a66cd62c2cc15b691f80e2ff6afbf3422e193e81d343ab936464653c1d53199ecbce2616c46eb2b3d8a4657f2462f53b1452d765ca22acc984e1ac9e3c55e4453ab587e8b74a9d156502c78dc785ebc6969ad69d5b730dc85ef78059f65b7987854b61565e228554a7ecfa39484c73654ab037a95c2b0c2050aebc8e382f0c4d1a4acca61f3fa7b2a6398308f56677db03a75b28d59c41748e0ffd8909415d9bd3fe607ea2090fd686b1c24ff3fb88635c8df730beb77d05e60fa41facda3db662d76cf6388655c7d4783743bae5d839ce24d8033569d7eb214d78f5ed8f744399fd55c5d74bf85aabfd7fb38e31d5a23b494392a027f93eb22f5f14b3eac682c9cfc3145abd22cf12e828e7c4e0392d5ae8babf8822b53518d1762a01017bfb47730c87bc0ccf66a58c91533ee6f9e6f1f5e77f2aaa5ee1aebdfb066b0a38f8c921e1e887d72220c25bdad22b973b5238885aba28ad527430d90c653a20dc3aa59f74718e143ce8def9392dd7e468ad63406ef46ef685350b8fc2aada064869e9cd0fd46c537b4cd3f95f147f2ca3dcddadab80e23e4418c52cddae8125f448e63a7e368b2c702f2b82248fef3d3fb770d5daf54ae0f0fc7194b233a3b467ae590408aeeb717a22fa2fb19491684a511c946f75bb8504b9122a05ec517dfd102cfe45736c74bf1b585b4bd200c8762e1947766aee37bed3e94fb1652811f43b5df90a4a3624fa12d293fdeea69e5bdb1b91159bbb75671e68da9d8c1105b86fa1b51858a6b0f2823b7d1d44ae56647b1ed0153b9705b2ce1c2e363ad25b9d9767262a57213a488d26d565d711680e602b467c25596a105686d619a43fba8aa9e055cb1c6ed9b1095056c01575bd2f66de81d158517ebdaaae8729dbb0e60c3e3fb2de700e75d5b4a483455a2af57c36d81a6581bafa6c154afd41babf662ef0cea89b439c0b6d5a6ad65566fb7df169370735dd92f96085eab795df8966473012d97e32bf1c7306d07494eb5fae29f306deb39e15b83b66a9c1625bb288fa33316242829021f9288b2ccbe4fdbaa036d50649176d99ba09a27c84429e78a873a922b0dbc208ca459c530c72727e5775bf637ed11acc33c8360683bca246313bbd02e19f2608012ad4db2cbe022d3b3851825e36c72c1899598606cab4b39caa8c4de6e4d8a746b09dd60ef145d4d96e5e4683c11238924a60252272c97b3ff48dee42f1510ace4186713dbbe488b30521789183107728b794fd344ea99c75bd0d8c9d4145f64978d132f4e6d5a5bb4a8cebeb249a991da7255c2e6bc64fa8a9e45454c6cb8143105e5360c458456be369c8ab054c0f64522424a282ee6c64d751635f0a2b90d97d5c4a208b4b461584dd3a5a1d086d36a922c184d6d985413240d2829def2a2aabe2885b454e78b725852fc15a37e2ba22da25d06c9984e2e421213269a540d2a904906a7e56b61bb4f7291cad56faac717fb497639a2cb1b8eabae936a265e7310296638624020e247cf26d4da68b9de58ac5aab041dde5d2554003bebdec246d5a9bb06ab4ed967c255d3cd25d51d4d4a76a20e1a84644f02ac6b7c442afadf1cdc10d15f3b7bb7c40834ede2926ab8694b9754c3bbfbbbc40cd5f67ac5d0b7c47c56551b054939cced586ef28800d95d92d10a96176aacc55c14eb54a97689a83e7eb7b5e16f4fdc36fd75efb6e96f30cac49ef4e8c86b127255a08140884db9bb0dc5ae54b1ac57ee696b072d6397db4c2eea54e635b6be75667337bc02d0907d9acc74b6693293110d60f5cd739d6767537d17b4c426dbc6ec20b8b16b3cde870e18e326d32590c9f66279584f91abcce6d5526ad56c821a54c50836f0d49a4223329ba30eb70f956a168d82378d8e37ed26e18955bfc943005657a8956f93023ede160e57ff89c6d257e8c97f27f0afcabde87f89df98c07f5311a4703cd21f547fa4fa23d21f587f24fa23d31f01a95f2fabf671d5da404451e9d5784594839f7fea41f57fa191d7c8b87c8a29409743157fecd2052527e5a930294e1826620cc5c813e785a5f671bb17f8122517d8415dfb3e20e60dca10ebf38e517b0d4a876571bb79d4de54a2363ceaae1275678b47b1c3845901b1618c68f19da3547f730bab38c9ee165fe2665abb7cd94586ed6759715e6b5b9cd7aa6abe98544f71fc94ac1b9f70addd7e1515dbff05c7950950f313def5622d973d784b50f137157f23241a07cb9f44fe48bb96546d59ce7e69659371262feac91c5f5ed593399dc9457c296d8cd886f925e57614ca6d38bf1453366eb4c5cf2271a295033cc32727161600cf9293132b41f3cad821aa2b0fab53981a35e671e272e05aa5f7df14fdddd517d3abfa1443dd012d9eb456d73f67366782bcf939b3ffc97c90b3b7a645beafe4d562c93696b90ae68953887aabef9296db7d64bdc434fc6923f0596467b7afb8d79e5046d2e734fc547959c55803fbab96d2badf43bb5fbd9bc09070f17204ad0b3a916f92d46fed97bd6bffb57165cd61a56a329f7ce2e4c09dcb070cefc74e2c9535e29f3bd5e19fe67d0282ca7d67c9382ebdee1051fd5011ffbc13a25ce02e1627d605105eb7efa46ccbc2a2ec70511ccb6559aa5a1a1018cbe88d117d5746dfc9378f85587cd7ce8e50876267442279fa8e88aa96652b2f75795dd088980ffb6a3a0b7e3589a5a8424da0bfa7029fc44eca0f936f3ed5a3a886ba1ef61656baea41595c44b4327c88c7c9ca1ba0259a86476a7614527e53c153d9abd6781e7ba82f12ee508ae96e0d5df16a520d69435fdfbf917ea11fbcd0cb5217e60d61c57645fb861b9a119dfd94ac4f4e98d884c919f9a98cb56cf8bf54af378179ec81e71ad5a44c6caafe2fdb3c8a5d4ea3608af82854ccb5d2cb481c016f5254e23078550907096538a2d9bea63fb248ad2793f6fa59d9c979b8daa5497b53a68bb0d9b745b84c976f804b127e4af63f7928cabe44447e9c8893085cc594ea69ad363604151a72a3213706e4c680bcd390771af2ce80949ae8835e897cc29318877b7381e95097664597167db87cd04b54dd3eb5ca2a9bf1b07ce24bd4dc04acc4c3f2d12f517113b0126f6f61c4d5674602b6a7718e2cd2a0eb552bd5a46457f9ab36aa494b7d34d07035a92949134fffec774711076e9511d20ec48000ff6ac3bf36bdb6a4d26d2e15f22d1ea03fcc1277dfbe127a02d272735cee83b7d7cfbc2b8b2b101d0625a384e5548be7ccb2474d39784a530ed9f845f44614e894709b126e03694302e73b2f724f52631e294845f45dbdd0bb12eeae82e00e188d386accc3931af308a184ec12b9445a5398cfdce933336cb6d2e734c2b47e904a2f7617436579390693fb0fda68c0c48649f3d0c993fead72d3741b8b4842aab1372296d56203114babb104fe9b0dd36a79041262c3a812f96f90113d2e8d3de852c2d945c4fb0c6e2a2e2a52818807221e103012760d5315487920528188075caa80d72a7d0353151068045071defce828271683ff0609818cc0446ce0cbc8f23919bf7c40a60a9891daa5d804a67cd62c7267bca04c5cf845da7795acb6ad9e5cad0f58dfa1910dcdf0347dace710f291b75d43d07caa6daf2df5d747d128eba8b8da498c42da98d8afed4cb3b2d12bb41c88aac80ed6beda290a0d09b55e44ed3ed040c25afdab716b1531fae361bb523c015c9de2085bb39ce1945d568fdfb569d916e607cf8b14f66bbd1c59763993da7b40c6c45650f3f060fde7d89b94a75aa57237b4aea1be6ad69e0dff73ec3f9e5568cb86ac9d3d5985de3e5c6af7f1acfb4aed9959c5b0f4e4baf61fcfbaafd4c19eac4fa8ebf0f1accda58ab4cab288f59fbb472d1e9ba01c98e81c3893ce33cbf4a2916c6da356e2b9de51ebc373a21679cbb5d8a5b9162bfb6ec372acda1c921dbab2085b5f7a5c92fd87a2eb0b8eb2b8ea9aa32a833db2e654738092988cc9d715d56b42a339a93511b10d8545cb59939c2879e242c9ba2f51f9d6770a699365388ec426bb79f447d6a4bcac347dcafb5becfbd7822aec2cf4b0494bf180a412af434b3412f212798fcf015ba481230649b69a32298bd9f87ed2806862afa0752b980e1afc864b9e8477342f4a935cf1efd1aa00f6f8c4a745da757a741b1e9a269817dce21b6e0bd6f853a1a5cad70376cf4e4f697c49f6e2a9e691e2eff71b48903edb2310629b8c9b37663d2b2fa1b09dc36d656eb97a5b61116415eb684f6b3dbae25654b98aebf1a5b79828ff7b932c68920849bbbaa055a91137919e646fa8866d1ca2b45235782e7613aaf73b5b4f1fb974614f1dac14bc392ea9daf3214b91872ad2ac86ac506f234ef5c7427fccf4c7adfed8e88ff5ce9ee38d39ce2569346bdc7694ec0ab5ab7cd37ea3b841d9af3f3e79f30dc39e2cbd3aec1545d636dcfea4a1a242820a355342ca88f258d4774eab3ee2cda8d5c6dfa42caa34353c7a5f7679558d86739af557f8ab35b44b85a35054158e3c4e4caa27150e3054446066111812db68c88c644c28cbddb16ee766cdfdec6b40f4d4d5c2cacb574675f56d9ac57bef06c30b0f8b4befca6c129575f4b466a24dcdf484a17fcffbe79f7ed735afbc7f5e44370cfd21d95fff43f566bcde460b370d9c232b244f6203db65030c9b8ca79d6a7d22b305a14d57304e4965ebb27113142e48b145aad60e4c099f91dd86157053b59254bc95cb27f35573cc8631726bdd8ab373215c1c66a489b7708e5c95c2c1961cac7c440d86e5036abe1b03e9811a3ef3ec686a611483dc9dc30c052084568462307773fb1992a9cf909b898f4ba4bc7ea7c83f0d2f126445004d6d60454e0c2cccbf9d0ec86d07032b0691839d0e98dbce527ac66214c004b956549afd1e74ad186027b76d9bc3034b67b95059dc6fcf7389dcecaa21931b8340e7b2308a9e79576e302a1c414a5f9100ba731b06b65da21ef1ba5f5991f071b1d40b9a8fe6b2478db4d7a9782a119a27b1a4fc5b38a3f5cdc9097d529f8a1afa547a72a2e6410bb29301cb0c5362c3c4b0c677260d5c2787f59559c37cab2acfb059d2539d1012dba5808a8b3d6b3b075cbcd367c589529ac7b1f2782fd55fe4a6364c107531cc1075707127f5a57772925d7a573cd728d1ca0a332b834c1dc0c1cc4ac415254fde1269d0b307773e0c4ddebcf3512ed637a95af54e4f71925718e2cd331fc5f42b6f54b08922d7aa68e884932b8bb39d72e9df3e6585703d43de1515280caed469afcd9c6a95b4aade8708212a1b41f39cd678be9f35876a7a61f0843d3c1ce22360979e516075aa5354c67cfa1cf9a735d5bd1697a2d7223730df8dbc83736410aae90c386b2d8a2cb5c9e7cedb6b1b0430457a2b50c5d8230565c42928239f0d638130d2091b77deded820865867d631f6484119710acac8c7e79ef8e1217a96cad6b2ace8197d78a047888a038628b2a1852fd38787f408a5e2140fc236cc051589c676e7cedb7736c861a64bd431f6484119710acac8c7a9c81e1e92928aa44a4562432bab5291d930d51dbd903129c82964f653b6632b7eb2a6a0485bd540d0b03766f8525677a120b1e1a6124579d4bab683734be046d9131826a8c166584b57c8e49927f6e1d28a46c4c81783b338a56b25979e5d4b767d3eca24dbd9ee9e9c145148b43327060da56f6af4ce04bd82a2ecd2dbd1ce4133965b85c59aa9bc412d2f47e704cf921d843172315066d1ba542e71bdcde3d30446f6135705944e6c5c1528091713fe69922eca43e24f9ad62bece6b45ea92d3ead2ff19b00a5bed253fc6b3d6b5fe98fb7f263594edf3f99d377a9021bbd86e56d91e5cc18537678bdfa53cd55566ae9477d659516aecce18b028dc5eb17c9629950525fbcdebd3d5d212cef0caae14cab0be2ef04f8731abe489631a6383db0ddf938c1ae31f5530367b5b84a29f5aae8a31bd7351dc06cd51556f5b9975d997fd4df68da5f3f2b85e44f5e19a9f0a9c28c925da54da168292a63d223efee54e3a6425b3cc6d350e4ceca46b5d4f2b5544a6695b5b9fa1bd91ade5537392afc325bb1a0f184d9b7995b5855b65329c244f2448b72c79e744b2b729926bc67fec8c6bdecbdadb689ea9b579b54a3d71bc46dae886dab655063f47c13ed1a924f25bd82e429b45f688fbf90c40c5bd7c4d637df184d575ad9a96965ef699b8ce194d97abd478747b20e724500b93a7e47755485c43e4d8b47a02f3d6e79f95712915e3bda3ba7d3059b864d8db5959d9d7d1581bb16bc4a273434577a4e4ee833efe181f22ff6ccfbc66d1e392dd8d9e5d9df33f6660ef628f5a7ef576869aa607a92a330796a4f281a78af29624ca01e1ede8a1d8777c6d5b95629a95532afc9ee567b54116923b56bd1fda34939c2c9c336d1376c71a8ac2e22fb06c743a69122d4b47c54666e1a1574e93b12b4465526d12b6d097dd61fcff5c71bfdf1417f7cd41f2ff4c77bfdf1527fbcdbd910794df4e82d0dcbbdbb21370dbb206a682a53289f4ef3949a79f59ac0fba2d91b4ca04290d33d825c4c445aa5f81c92e354cb715a3746e0ab1d3304a6ca4279a5173a8b6b443efd5e8a52f4ccbb4aeb9dc03f3556676c7b941a1ef572cb11a79b2049d2b0710e5525864fe0e0e71dfb093edf2159ad0cbd9242f98ad830d181cfc486990e3c172f9d7d2e53621d782e56663108dc042417e609eee8496d50d4eb503344ba1938debcb82c4df0c8ed40d787aef29e9f23ff34874b640520731310db600e43646110bb09c86c30bfa864f6dda51bc2102eedfd7e0935fbfa35a992ad5be10db1e11bd25e3f43dec9c91bd2dee88fb5c34397c817edf8e56f0d0d28575076eeb56b2ea478749a7faaa307449d17b1224143530ae6299ba69484a7dcd9501cb4f9394d28fb1907119dede7c1ab5dd9fabcdb1d5ee9c9eb6722374552fbd2db7df7e0f5c1cdcefa0ba5b83ae9b8a9ec70b6036d033439fc3ca7e16b1a4601796cf6a4cb18b349b51832a6936a49649c4efee43984a6a68d6bc4b46f6ab4b403e3fec5e729c10d56fdabddf58c40a1ad37a22cbd486cf741a5452bfea26fa370f9dde645552368544fb42fea67a50a820def8d1d9bc33fed4aba7786925a3f57434405b362babe5e72afdfcd37d65bda6c8f56fa1331ae60accea41bc93c347c1c526a4d3566f67e1d56c3f5e56f7b9128f8277882bd16b64d09b307a5bd5f7199a82a30fb9bf49bac74dd84454ffef18d79432abe7377fea2589a47aa96eabaa31bbd521a5c7ca874750c231b7eac44253cea7d4dab477acdf3831cfddf0bbbe0631190cb9b7ce00b2e51b152a96666917df1b2864f1d888f35be97c29af8580438be580ca4f9258a6bf8b01ef23390bb310838f05c149e892cb1410245d9a995b97131379793c2ca38f881406a5fbcab9198c852969ac477c486a126f11d51dbc9bcbce5250a6b24aacc53b404819b8190034f257f4496d0203145c1a915b8e121123f12984a940b1483d05d829ca35c0894b92b59b574393d1aed8b5aab626ed55ab91bdba7fcaf632dddd02ecac4bb65be28ca9c21ffd45a3853675e6e56a12998c114cdc1ec31ce3657e6f0bc0757a63c58cc766e2a713772065475062b1683ef08bac77114909b382723bf3f3cef74cfba105316fd9e93d53c6264e40f7abd5e77d887f8f71c8f06fd7e577e2e701a51323aeb9e9df5073d88eff254a2e8f9c33ebc21d18ce7f5fdf3cec0833751f63b2f61301c7a9d5e0fdec438f83af2f82f0de624c4f122a1a148ef78bd3e14f474faf2e3364a62c246e75ebfdff13af0264d5674e47b679d5ea7db8337791a6f5649128efc5eff7cd0e9fa30c0216102c5a03318f43b673098e394a524cf24c1dd7e0706f32448c4a4d4ef0ecfce7b430f06498a634e44afd7197678904ee364455289ab7fee9f9ff9223a8be2af82da7ef7ec0c0669b4c8123af27bbd4ed7f73c186c3055ac0a71fa5572b77b2e0222addb1f76ba22384be290d09493dff1ce3be70a6a96e2cdc8f77dffdcf3872a86103aeaf4079ea7c33588af73fc351af99d5eb7dbe94b340b3c2394e1d1b9ef9d0f7ab2c4248e6e89c4d6ef9f0fcfcf2568928a77bc78ed87fd8ea7e28279148e7ccfeb799edf1171290905babed713e14cb4ddc8ef77bdb39e2ff36504cb02ce7bfef9b92f0b102b008215bd61b7d7ed0dcb58515bceb9de79df8c25d55896a7bfe749949151bf73de93715a3806e7e77dce3b4296cb888ac6f107e7bc104296d9d78d2cf8dceffb308c16a2c0c1b977d619f4659818e1249ca936ef785ed73f3f87d328253769147c1df99c417e6f00a7319716dd4786c3fe79c783d3242519534dd51974cf7a1d38cd8379166141917fdeedc3191fb06f9234e10233ecf5061e9ccd938c695c5d7f3018fa904b06cf34180c3b1e34e4a4d7ed9cfb3c8a57e2acd7f17953c832bb9de1e04c7e6f481c27ab91eff7bcaed7ef4351450d3d4f28d98464a53aecc083f38469be75cf863d0f46348c30e5aded777bfdb37ea727a26689e062b7ebc1e8364937a2eec38ee741257efde1d97030f0608c6fe573377edfef76b864e8989b38cfe6225fb73be8c318afa8a4fecc3ff7ce8703189345428379349d72c1e2bc3d3bebc3389acd65aff6fdee79b7d3efc928d56bfbc381dfef0e541cef647e6fd8ebf7cfcf6554c140cd9841af77d6e1648954d1dfba67679d6ea7aba3a4049f9f75fa8322aa0ea599d63feb0d148dba470c86fdce70d05191ba4b74fc5ee7ec5c15ab05f3ecdcf3ba3d554ad9258667ddeeb0dfad44937a342324566ce99ff1ae25e38b6a0e8743ff8c472eb80eeb9c79e253c94bb773ce9b328e28a18225fdc1d0835a6d1422bbc0699250a13b07de195c9030ca17c62830187687dd4e4725a8aed35741ad453a1d9f4bb68a5de6e93226a3f3c1a03338ebaac8824bddf3e19977ae614bd571e69d0d87e79e8e5fa6119dc91c839edfefa9f85251f486c34ed7d3f052594899f67a437fd8858b28a4a5600d7abd73bf03171165414af0828f601dffacefc14594b14d9a647a10e3599320c05944554ce71c527c8bff272974c2e06c70d6e7919b91df3983491cc638e029835eb7dfe711d12d117db23b1cc85098e29bd1d0eb9d0dbbe7b054c9fd2ed72e322cc81f0c3be7dd5e0f6adef6ba7e9f37fd12c7c45015fd417fe8773d192dd8e47b5ea77f7626a34a3ef97ebf737e3e188868834dbdee99dff1ba708997788357f368293bae371cc225c1c17c994fa7a2aec3c1b00b9724cdb9be189c9d9ffb50f78d81ef75fb7019e70b3e46777a83ee102e9355a894aceff391d5f7a012092e65c3ee00a6e486040156b183c1f9f0eccc87aafabe3f38f3609a641b650f74bafd61df3f8769b2c1b23ff43a67033e4c64380c6322c1cefdced03f1bc2a28ff6fcc1d959076698861ad3c0eb76ce063d580aa3d7f7ba9d218fc8e6241626c2b037e89ec12c2294e291eff5bdc1f07c08b328bee52aaf33e876b8d6a8f4efae0f4b411e9c0f3d6fa0626467ef0e3be7bd1e34fab98ea1aa23f7cfbb1eac087dbfe70d61a9027a838e777ee641c6d55f9777161e20381e753b67e703318f633119f9bd8ed73b3b3b832c59609608ad3ff4cefbd0e8399dbe7fd61f4035c0fafd41d7f7ce067035279809cbaecb6b540e80c38edf97c16c917cd5c6df591f1a9a68703ef054588ba3dfeb7bc3de167e25e87e3ef26036f2603cf2b6f0e75a44b99afe13a92d7d9993c6e29b5ee93d6e8b28e7bc8cb08f7ff949652e2f2ffb52c727f6a42cea20df86f499cfbf5df17de99ffebfdcbd0b73dbb89230fa5718eff9bca405d1a4643b89648c2b0f27f159dbc9b19dcc64147d2e4a82249ea1480d09c9921ddddf7e0bef0749d9c9cceeddbaa99445008d46e3dd6874378e4e50e368cfc54de4eda59df4d83f3cc19df4b8b5dfd612dcd67ebb997a1da40af937d259f7633f38080e0e4ffce0f9f3f6cb97a4abf610d3f79c6777aefff2e0f90b32c75f1ceda1861f1cb6c276eb79101e80967fa051fec1461ab4c376f0e2246cf92f5b7ba813fac1e1e19e448b807f101e1d1d794d12afd0bc47bab0555e5220712781c51544aa5f7243aaf9a99e63caf5eb8a25ca315a31f950014d2fbcb9779277c4639cc32cc97218efeec67e5cbc21819398227a8d744c34c546147b27b14424bcc69ea523a439af8b4ea2921eca6b4b0f8522ef3c0b40de09c1a4138241272cbdf22f5a99bd27c42815f769f411aa9d74311ba05cf35f2e47e007b4a210250fe7dc7aba40f81aafe99b054a34fb88c79d5cf4cf44751452b93fa06ae90cd3731d2759a6d41e72e8a25f7e098f765b8787de3e397771c424fa85153b806eebf07017a928f6fcddfbd75b25d31ab958204a3572afcf4bd9e3b18be0c2478b61128f50945e64a34592b908841ec0e2f57e17b36769531991b208a6e5cacb1625f372a9ca34d7a4498fa17f7892eeb961037b9db4819be91e06316ceda5cdbccbf37f466e0c72801ae17e5bd8e1cb48217896114d2a40b5fdabd11e363dd98909885d29fa62de8ca8b7d77749169194e350f910d045616cd83aaf92f934728642f9c9c9c6ce4e0335769cbb38499c0172e2499ae568e4ef78ec55a76e3c7653b8ff7f5df7a4934f06dfa745e24527de37f75bb1e7f6feef37afbfe77df3f67db44243177137d9398861da0bfb208269afd5ef1677311e4eddd87b184605dac927839d8ef88a763af1d8cd4911df460def5bb10708ea8a6f97067a41f3657fef9b7f423f688277f20f4e40e479e638925af164fcd1863a4bb19b13dac2c033c66f1d68cb061dd482b6755037ef1df20b8dae51c3ff63d4ab1cfa4bf50c83a0aa9e24daaea705dab24107b5a06d1d54afe72047d11f5ddab5d322e19d3c2d12ad932beaf5d71b83fb91d76602a9bab7df3e0a40014b95a4840f61a946245eaa2968f5f2d9a2e352dd6c6fb3e1aee5d9ccf8f61f6eef55f35dd41c33dafe614d86844d8505941ee2e3b1dbd66f5f791f4a72127f388df257d80dbc86f60dc22363c096e1430d3eb4e00715f02d0dbe65c213228f7e9848bbd02a22f542db4f20f240833f34e137fa3e2bdcb8cb8d942e7997d10c099e8e2b7ef2d80a65a57bd4437dd3da9a2957685b33562ff755acaf9fd33fd2ec2e7528a74296d6476e349daa1b4d6e67cc9b505cc23d72b749dd82cb4d5e6683885fc9b0ecefa3d92cbac9cee314454f718b86614beefb8a35f473f9daeb448f9ec8e8811e3d00ca6c369baf59e13719a565db950e295c9840fe129c84fbb813762bd63d41535a4d535a4d53aa684a09df58d734b6f691d588c2e3b589acae8e6564066409d97c7d7df5fef5a354e5901c19fc5c36000d4e64c5697050d509d7262f66a3fd60a2fd60a2fd60a1a555af26b85c711d4e7b8bbcd4842685f50d48e00c3c138bb195595b87dcf3517e7c1c1efd5f199c1c1fbf50a1c1f17120905c535ebc42216127a0ff76986a2503763d1f672c871b1e799e5fd0372d9b47eccad7e45e9ff0661c5f5a7c9677fbb5b6710ae6dec6c8598d5bf08b6bcc897e8da9795021273a50a87d9fc70ca15b34326fbf452f25218499c71c08078a394e60d62c04a797c221e594937d376b145e27d9775bcdac597820633ca093773074e366e4ed270d373e8e4e8e3a81a7f10f4e4c00a2664e005a7a424412f2664c120e36781f1ec96dc09f420c905fc014203f8143fe609fc54c8bce23dca7bbd370d570f81e788d1da0474dca51031ae5ed6c40361ed79c462ced23d26d7f200ffc81fc690322f25b342026bf49431c940b01e74f29004d95a6fda3fab73ff386b6f437b4b5bfa12dfed168c48ec55b4c11e816d2c0c636d2c0c656d2c03ac6c74e9d0d798e935f83863a782e065b561ecd2495c534f585c84e9d34f575c94e1d34b5654ae8afd497bda7b5e79ed69e7b5a7b9a5a305b71294c0a0fc792a07cbead431a902cbfdc9d8eb787656b926598454f64f480460f9a9c5fd8c35a21f620e5721b6d6c22117887c4a6bbf049563622df913fd803b9165b90d882c4c65a6c426213804be6230439d35779829a6e2ebd8e10de6e2242137a6d2d42830d185778bdaf676602c9cca01eeecb61dec38db02f47790f375a7da18e9c3d0539a2afcef5fa1e2897470a12ab2f2b482cc1ac20b10ea3f2631be575846c2e9b8d075e23fff2d5c5e935bc47960ae07b435cf537ead1612ee7938a3e7232f8d463be61d2526da59364ca0916097855c23864864b1eeb0d6161a5ff7a0382b43e2a4589c752287613335b25b72066003a5e1923d1eae21cbe0d7f41305062e95f91eb3df09e1ba1719c22f9a4316501e9dbcd0fcb2859a0ce17d4686c844be9453c820b9fbf3e883e7f3e7bebeaef3aedecb0007b414ebc0dc323c7d9043e134b6282a8af24c86d918a7884204f1b27117dc188243f0b2b24ab22329b47c318af050eaabbcfdff61620b49ceb7c085bc18116f3b6c0b0151c6a31a77f2ee883f450c91f78562ab3d21e0b17082ae3051a3b7184e678fa6e910e615b8bb84105964d42637ecd63fa7c2a6f158cd2619cd0c88ba8f803ca932a4fa1180fc39746e4151ac3a004569d3f8a13f8fce88509fe7b4df4a7a828cad19c64dee0c3249ecfe3744275200bfd8df5249e9f096d3bd2d07a0ef61a95ead98286afc9a0d03090de371b689ea3615c106c0a6c9e25eb49967ea4dc91c468c4be8bc88a231ac948fa9cc6b81029a3184f51ae8fc388f42bed364501df8b633462bd2ec7ac787e9283e22c4517d17c8e46324abe9bf5b091e39c562750371e7fd28b935f917ae0c83326192aa6afa3221e5ab38d5d56b0db09575c7ac9256fae3518bd83bfa88c221d9616da1c8b321390864b50c51c0d1749945bb0a475cc28942ecd8861361bc4a95c0a72344ec870596ac87334ce23da345764aa41ffe50b967017d3a4991a8c32861cd2eee2119ec2aa946134873bf4cda79d8ad47f67716a26177fc469aa8f8a5996cfa737f458a48d6184bf9005b47091b7f9153df139b2acf639b25f11880bd1c99d6701c8d2d7689ce5e84d369bc7e609838a9a58e9b6176b65ce239f5fc3dabb8129654d8ca733532f1ebb3b055b91e90bafc2b297d493404bd0fc845fb4b13b2766fb927a1df3fa6d77977a71d1aee384b27f87638469a5948b9f7349e334763ace7fee347063e73fd949143b9133e79b98938de9e6e7c8c73177f87b9c4fc0eaf39a3ad3a8700608a54e8e66d9128d7ce773811c3c45ce20cb1214a58ebe5539715a60148d7ce1fc58dfc64208f94d4e2505b2576595e42ba6a4728b94edd1f45ae4a75f28168f1357be40bc114cf7837828b253f1fab05a62b4f787e50b70e2fd61edfa3bff5bdfa98cc76e6abf419c3efa06715a7a8358ad8ffc4e93f1867cd4d22c6cf5d41205fb2b786cf94070b6984c535414349b0c5989762e52cb44e692212b5148ffa708a5e2f6957c1b94d218a8252a4ad9123b8b8b225e8aeb5b11347088486882d46092cbfdeeae7c15bf224dc3ab36886a60cfdc36445d79d0ac2e8f8426485df714d3388d6543cb909568e71a2628ca875984d95810212bb136d7953126cad175e062648a848b682e06a816e5c7c50d9bc2267ab2919681d5bbb964bad825c8a22b8ad2d3eacad461ea6af53815c2f8b744824ca82b5f02c0ba8c66c9a09497eab157e6a629ea896dc53a4937f236593341c7acaecab3080f35042450c24122a10e50894930531c97085ad824cb65025562143c1fc728821646c92c9a40d534661a8159057599222dabec2c8bbdac603985d06d319babc278c82a8ec74203a4542449d006850c7aba84411595d60cd1d41c9969fd80944937722333a224884655ba65848ee2629e44433443a9d69d56ac45ad950a2bb39428d70134e24ad116e8eb382aca90245688c7caab525ebf18e5a535287f74e9915bac2a418fb2e7a49604cbc09525883d4e15a0c558f8b5145802adc4ae1db0accdb28c5d3f8c9540ab69a7a73241360dd814b3739b0e501a1dc6d9ad749a6300c641aeea74676fb1ec78c859347654d413ec2d99d1663125665c25a0984b933c1ac5c63cd262ac36d1526009d46e678b4b89ef795fc5f748455581bdc218a54cc62473687195801e907c9a90bbb1055108e18c24f13ab77586a139f4338d0de0018dd091a8cf08a928af2ccba350a6704f08c9b974ef98eab44a599f9ea453aa09ffd8e3fb9a30d006f0c8822405726c2512419144653c2a890445121341a9341a06a9290f6395d6622c002a8e2b01915805a8c8d32254f2151a1ba957686ce62d95212235b0284e4c90284e54f2efa5f4df2d002a133400488c58c7311fa8da7109abb12b026692deab86688ee6b1a47b8136ea2a447ce52c5cf45797a10e1d150b96b13169610db8e4abb8ec493b2e697194a712d22933d19effa3a8985e8ba54204cc243bcb249acb1cfcdb48282d3164bf6653576de805e37f9e699ea1b85c94330f524a1a789698f49740f1a16a4ac9a0d1d725492a6befb280b5065c472625781487920c9a895e9d989029d257c90f6b3278804b089fd904700163199f64f3edd8edb8fe9dc569191915525603ebcda20b2a196b63482e83122cbfb352b0424dde841512513672a47894c08402868bc3d98a2f44e3a10ea104e46c09d7e4e5a107761e36a445e85bff4cb8158fb93f2a2146a73e529550dd4c135ea76298bbc81752300f4434cc24615e37968a7c8c060e06630f446612cb012329a04aff56c7218ccf276316d11f758786c85feb1a0dc94fed3e0dd19fb23412e9a18afb35f362d1bc6b43e2ab7ce786f49075fd86e4a7750b87e467d5651c32c3551773c80c57ddd121335c7b5d872a22edeb3ba4b10a267b209228ab607107228d710295db3ee92d9b13b0f76e05a3cad79801a4730255fbbe99bf5c04d9ec91c10994b67e95fe7b19803203a88213305823b3a2f2a964f3e610b02b3daaffcf9d13cb5b07713b9ed2eb2d61a823c5cb310cbaf13308f36ea3117b692fee43dc8be5edb8f1c8bd7d5d597357894a51e5bb4ba4874ad798480b94ae339116b02f3691faaebadf4466b8feb21355c5d65e80a28a48fb4e14a96ffb7214a9efda6b525411695e9c22f155ba3f455ac0ba49a5fb0355e376adad02a9bd4073763acf0a63c5e6952ce6111e4e4f9728c5ee03bbfde0c03b1b4f737d65694fe8f77c60274568547ca66f84efd80eb1bc87675c77472cc0a48b1b0d82fbcf8adb427e3fa8176002ea7b0bfc1399697151ba2786cf023bff7c0d2bb4a17eb581d44d34408f6bd7cca94ecddcba6b46f2b3eec61995e3f43b68c47e2bafa1911551be95467ac8ba9e46f2d3b8a446fcc3bca846e2abe2c21a99128f2af9068331241e26170791faaebdd446159135f7dca8145577e58dca71d6f537929f15d7e0c808b2f946d7fadf4a2e27bf22cd8cce349b449e87a77976470d156ed673746a3c4cbb188f51fe0ae33c1e2c30ea3811c9e414d36c918c9c0172229a67c4f6087fc7eb2aae4aa82ad12c423732c668c6ce48a29717baa3707422ec3cf67127d005c2f13dd5ea80506c218b229a20d83e0c0eb8ded1822e0357513a41f081a9ee7602400be834c37af58fdf65e37cd5544000698fb314bf10cd64d909ffb33ed7e7b83edbbf1ec9f62689667334aac9fd5f5b490d8f6ab2fd637ba1b5f9a44bf4cae2daad9a6cb83e1b29ae365f5a9f8fda7cd566cc1fc97874509331c6623f22fc783c44051416c4293f8619a6c92ab8581adf2d1998e4d962aed28c192b7490c8a4fe1551871d1290c471978b326ea0de3bd4d5e08c27a2b50451874b84466c4f94aa32bc361529ac5e15098b65552cab9e91a09a33c25c0586bd23c32632b72f6b86fb81a6eb897a411fa43004b97af3353d260c65eaa15edaff85e9d7522f9252db7253cd127cfd5b58025367e8ab65156e2f84543be8f33cc9a2d19b284906d1f08f927ad067b242d56a8eb3f54b288a6f778d6f1f52d9924ac63762df8675198ff3ac1517c94f7de945ecb7b4d4222da02fb888fd6a64bf2a7b21457bd0281ba47b10cb90f5eeaf01d9cd8fe36e2e1472693d7aa891f721e681b491f70df55b4683a5c46db905a54dc49c3f6884b3d37739ab1aa52a3748610018bd72bc0a521f986760d4cb85a2168430aa7be1de1c48be4588eb75b86da1ae96b403720f445cd7d003b897361a7d18f9b9fa9ca8cfc1a6d43e4c0facf5bfa1b20629a4ba4b1a5157dfa956dd95fa5cd7d5b1fdbfa78eeda7d6f1aea68eeaf3beaeba07ff7baa7bf0d4ea4e1eafaefabc336baefb9fafa974205e1da00b9bd4f0ff0df92b2e9947f837177be037e4af65cc571e732f637ee73186cb7bededf9dfbefeee6202b0a2986866d332a0fea5a0ff116a0f7e865afd9d80ff4992edf7097e80eef2234aff4384d7bfdef444ca6b9f3aaa316bd2363265724d88debef5f5d09eb1c9f669c9bf6d314cabce26df5722adf26345364256e8d71f2d94da53a9627fffc1625bacd8df7fb8d89651ecaf3f586c9b15fbeb0f17dbeeeb8f58fdf6b5cef2b4c46119fc5220b0c898b0af3bd8f9edebeff57edd7f1ab58c69f5f557b37efbfafbafdb9c60ff8de5c998761fc69c02c1a6d7bfd466f1f18a27ff61970e6cab356a635e42d559003e08f08ed514eb398f2ab1f9ec3840a33b4cfaa26488d4205d9d84c5794071f41d8bdddf9013d0eff542d1af8650f4f73aa1e8ef08fcf3a948fe5987e49f08fceba948fe5587e45f08fcd75391fc571d92ff42e01f4f45f28f3a24ff4000e12722d1010d240803fc5424b80e09c6207d2a92b40e498a41fe5424791d921c5bc7ed181b56add96cbec0e83d953554efe52085bd3ec8b9e49072b5e368880a10c1a01b1d8b4be66e24f8db0cc6bda8dfcd4cebd367ecfd9b1c5af140f7bfe5627e566eef454dcc9eb60229b39ec09e07307ca0719df65e040c349d7ce36d7e089526424a99f1f37b94cd10ced76573146ad4ca6a9df32be5980444637ca177cc9f97a451e25ed0dfdd257fe51d3b204d12d2d8508b2d099687b0d01c1b0d7f09bc07c3d824814137391e7613726aef257df84056a64ed14bfa6c8da2c62ebdfea65b9288f9f3ac88998212f546b60073513a5783002338d74a1f91d217a27456f28896bc5025cf9f5232775bb8d830a7f34817c081190f73211d98c031270242f9501158c25939b69b6b4a0c545ccdc3ca6d1bd225ec8c75949decbc8b86284145e14c58548c0a27ca11b5bf2a16f37996636aa6a435802881b6031d1a6b98f6927ed7900a726b9fdeda8ffa80fc0cd8cfb0cf2c9356706d9a510b37562b21c8d325890cdbaa17f4c1aa17923fadbea79c850ce09a4376cbb906600006ccfddc2db893c532298828f5ce2895492959f63b52e81d29f4ce2cf402ae1960b794e7025c800b6f138f5d2a008c3c3929dd5b3a377a49df3b11724f96e79694734bcab925e5742a8fc366f7f9fa842507e1cfe2f8eb2cf96474768030989725513907d0feb2076c29a999456a6892dafaefa4b56512dbaaa756ac05d730e85e1f0fbbd762249ec2a277dd9783b08b49884c4b86eb940dc753361c4fd970dc106c0cd34861ba8173814959fa27fdeec2c478e347e0c61f801b7fe86d2642775bcd6d063566e58e59b963562e586ae07cea33f019039f31f01927d37454a46d59aeae886b49e45145649d8c1e95e36a84f6a8145525c44766b846a28f4a51802b8820ebee81ec671537123698d00bf1ca785e672b1bc9eb6c6502a8ec5873b790611882823de3720586ece32b48f8c32e60c13e1204a6f26b8eed8bd1117eba9b860c3760ebe7fc3430a199986c3c29a6ee3034eb6d215353174574c77a5513cf77b22b9444385eda57343f7b8934caa33b7e87ca981a71851aee071b4b13e461b31955f0823f68763dc240dcafc86df059404edd8c87aa7197429b8f1e302d30e43dd857dc277a83a33b975e54fd421fe538c1b8f30fe45147b21d0d8c799652173eb5e77fd93b3d2e57a9ca533afcebb9e4899fd9e86e2d939bf196917014d16844d7a092dc401b1a6c4de3dd8b78f7628b73351e980c36f4bd2614e5364f6e20863dd6026fc518aa7249240718e37e8562808a660c32de223dd585dbb20d242fd9b518ee9244d4d7ae08e1b340ba20b4f071fec534d4e71a7274139c7b150fab76d30a7966ee81d42a75c314e9ec4231698214977c54c6bbbb6e5c23708ced0a8975d69effd2189bee55af55825b9d45acf255b9589a7cd49ada16a04a396481fd59f407bae2d607bfc9ddd1e898029ba82ae58b16aaaf4f43552933b450fdfe18aaaa776b0d891c4778c3e114c056b454f3ff1194d4c4ef29c8922cfbe355a5a3f221f65922a9e610735d193e3aab900e49d1e4535e98d257c3ebfd34560c297bf891d9f286a27113ec99cfa2fbb27ddd04fb2b90607f4dfedc5bcf53b24da56235403e3f30adc98c457ecc9ec12bbe7f27dfe7712add6f90a99b62b7bd87d5d9889fe8dae2195b9e3ed47d458136e5ca85785f2ed3ee8e587976405a71fda78af1d4e580969b16b203f2d255b0289f3e3996c4297acb9fd12e7677ad08750e2d554ae8e4f36a55670421d7dc3249d3417740eccbab761b8de76dc402f2341ed1062bf188f8311e1157f288cc098950c7dcddc5a4a9e24230167c2d338e3eb87c29a31e42adb949eaf5f985aaa1bc928ab34acc7c6e700f1bb1bf02b1bf06b17ffffd7b609e1b6a0712ef2dd096aab46cce6e9b045420644f03d20e62db4afddbdb91710a94e7ccd447093513d6f87e2a19e312b6aa746a35a21e92363c491b4d9c7addbcea3094561d86f28a93505a7112cacbc7a0b47c0ccaad33506a9d81f2f20128ad3800d5285755d0c5a2abd4aad2b24e55b9281a0b733e4878d7940bdfdd555c895bcf0b795ce468af490a65053f54575b6e8f5451e747a891efafd7d0c2f1559352d5c09212bb991f2184e94d4b3af4c556e0aa26a2a23b3dbb3f1f297bb1b41ba0258b5e2c6bcab5070c893316de2717afe752840802ccc5bc92949a623951f6301606e4ba50442e4d969c9b7f544f06b1fad58ac2a547517b69634c7a8c3d732d127c1e893425626e1987c70ab684b465eea3a4a3dade43a58df871ee01dd395f115df42be609d2f908291a92d2669dbd2991620257eef50c441291d61121262b95a62293451254e4d55418b09544705e88d3900b1af4898a2457c408582cedd2e372e9ad3d1db0b2e8c552961b839657314f290aadd896556e545b6e6b7bc12d5972b4a5e496c724a354fae5c4c26b2c9b44426807cccb1bc5b35081d0d0badbe9657d90c0002ce050de211c2fd43dc2140e7b491fcc154f3c65a256c511cf99bc6bca2e5cb86c615e3172584ecfdb5449b67a591f16ac617559add9be2341c6c15e151838a86c5e0e88563b6054a1ad6660129dab0b804d1ac6360d26d8161a18e00e18d712c15179cadef57f91d815948f78fa61901401ab240ee552983096495d502de70230ac1a284aca637a5a7c106bab5e03cec95b2a8b740790ae19191b8f6bd8784cd8f805aec3147bf5f2d813778e4b2feeebd4cde2142c30f9a9382aa3d53c4a47afd7ec21f339f6c063d8a215c516ad9e82cdeb943198404fa48c17e9f127732ac8fa039dcee678ed7a5d372e2ea3cbca86f057def7ef5b92d7db93ef3dcfbe5efd4f5d5d55de79550c62e70d8b1b39b338dd9f452b671a2d9173195d3a54ee5ff8cecd14396a9b76e46875e2c249e23f50b2767056caf69f000bcbf30ac9d9639367eb54a7d2c7bf650a49a94845313e93f910b0fa29604c26aed05fa3608c7b79bf3badc514fdc06462a3134cf9205de047270c1ba8340799225539bc8e5b8aae2d612a06fe026b72ad945f4e4166eb2214ae99bea9688e39a6cc67a92541eee9af7564ccab1765b86fb2eb3f17518e46944eca487aaa807283f3c6569b7f6dcb82210c4002234ee3f038e90eeb698cc0d003c5eeae9bd4d561281ade4db0f7c4fa6caa065f1e8de2057faaa4f833c76ee6818a25c080feb9554088b2b5a580a123f3fb32bafcab0b805c01de4543c46fae4d63219efe45bfdbd621b4794e6fa740e97c4787843af68b492d63980aa0da34a9a4909fcb9f7018b0f95aa172e281b6c734301cb50608c45c1d32860188947e4c7c1c75e346c3cb7b711f066cba80020c4162675cf0abdc29ff9df3df11ff1df3db5cb58ccd20b77da2239f152c661f2b17b6bd0cb6f766bdb811f441c13f43c21ab3cf561f2c7cf9e8849b82cc035323a2f0c0dc88187a60e4178b81586ae660ea81b11eb32031237f986745e18e3d90f4b27e038efc15f96a84f47b4dbf5bf4fb1e24bd4242141a44a1410c25c45083180a888dec16d610a9d903f0a5675634b62b1a37da7655e3c6d14f5436ee733a494b7332494bf37ac48db602385000870ae048013c57002f2880ae6114df8b09e65229061b4ed6cddb06cc505eba9c24a3883de76aae16a537cb02506f172397185a0259523e2e517e97c7384e274e96c793388d12a1dbb5060ebd032569117698cd320c981b6c13e1671c2705c36a24c4a8703dd2c94e921505551ca340fe8e5773afa9acefc81992ba1e577cb47ea79cf73de5f023ede57d3e2d231b0c6430e269058ca4f2f21e0643f5d254264e484235b35978fcec5908f541b06834bcb8b7e8c3ac9798567e95ba73756d2e9a97392d4fa9e370b2eb38d9d8a9ccb90390b701f610d25760d112656e8be502e29111d3b4648efd1595c933bb9239f6d72cf89507ef59f0771e9424b81e40ca8884a0a1996916aa477e99b1532d1a19644ad36d36a8d529872f8cf4ca42aa97f35b2153919df7cf1eb5d70a400603509041afd88ce278d82d049b51f4f7724b1734a71284b897351a7d98f6a246a3bfd174e7a98425a7476d9df3a53b9bb84378c214d3db80f4ba48209b7294e4281a91019036630622dcc67795c46e8485411085912d54376362326372692fe7922d0ca45e179bbb670c22a6dd9855f2df6c6f22a8b29278262318eb2432a4482a8f49bd2e17b444de06976429711f1622da5612aae5036525a750932b81397409395329c04a8ee74a3e348253aa67ea0bb51377c4759a47dcac7864ea556bbee62b6c21d804dbea20dfd6a4d2dce49786877096cfe475a6577bf4a8577b54f26acf159afe40ebc2f28aa6fb2d43b5eed14c4780f20182c2506851d1a6377facf440712fed93827a699f7ecbfb4bb44154c8061fd4e0ed3c6c9857905c1be95d2e11ca29bd54a2c7b49e98239efca7ad4d784e8f2be995f45bcc3ac5622ab97318938a082fae5e9776c75cf445c4fa62ce3b8293ac6d42691f467cca3d6c40019f8556eb55cc4335f98695f3b49792a9d8eb830599006a3e2e8ea7dd859801f32ea57ed85b3c99fa444edd441f3719a94402a8e3bf4da13ac6d601cc809ef0e4f9cd3a64a44feeeec81cb7142b9727d73b791a799cb31857c90cbaa6e872ac105b228c07a150c2a50ccacb366087afce981fea361e40db1dff8df023aefee433995dfc17352fff9a72a5e6c881cf0f644ec858682073ad46379662d82edf75ecd944df968984914bd4c3fd0a09340699529160fb0daadc972836be220d493513481fa021694c549ad8a2d2211bcf492fed2b622b2714eec3e1a676845a77137263a28621f28243a3645129b49dc205d5bda01d2bb6a529df96a67c5b9adadb129dcba6005cf4c9bc4a883d37fb655492be5b13615423c91b9962f6b276a41d53ad2d89ec184b53576d4a42d5f4a7fdb2b1b92f14af67ec6380c00473b124580a1decb5f858898f81f8b8151f77e2e3427c5c8b8f53f171c33ea6e095f838171f9f04cc5549b7fb0db3927ef8bae55d2fae8a2d0e0c8623aa0e6711d980153eddf457c329c49f48773f75a18d6057f334f4112bcb5710810c14f4c4c9f95f977a68a5ce444f723f165e106ff2384a270972331081183c0b40e175aad219cad6338104149ee76903b07bc5aefbddc20357b6462c57f4fb35cb9311ebdd214c7db2c5b3f3aa26b473af94b2d4f038f55314e5dfbf0f7f49fd71949f90923a0f02ba3304f32c4e718794cdc638c898e212daa886795b6a183004095880b9f7b0ac1632c620f1c0ba2e6de181555dda5ccd566da9394bc7c902a5432145337df846bbbb23efe182f2f86e00021078e0da089dea21c9778c610066505c9576c7c7b3ee58ac511338ea8dfb6009a3deb8df25a369b2bbeb0eaac95e92eaded6a52d3c70579736f74076e25e50f69c2a917269b83bc060426b6127dcd284d372c21d49f03ad5c8fc62317097d8ab454a01d60ca0123905585100b2413101f205a6dd4c3eaf31ed55f2798ad96abd86da9c5a62b0c66085c1274ca5e36bef81b05037d52d5390167d5597b6f0c0795ddadc036b7fb18467f4d4fef98bfb09abb26f307885c13916565160584fc2700b09c32d240c0509ada7d1c04dfb48e83d72d9bceab29c4ccae1caac2bf99ceb9a9a8fc29538acad376f9e6ae6f1b5d6cce30d064c19b1f32ca87577f575ab234c4d4e55397dc51e5b99589789bfdeeed5a17f1b5322a37c5d815e255aadf2b00135582c7d4e7dc3289d8581f6b6bbaed79957492999e76d9be90211d4cfad319d1e91a5d5408da37b41df7c9630a3f2bf2d2d5ae1e44e6b10d2043000180ad15f171de32e6a34bc14663dc44c74bf7fe70fe9a3f2ed9fd64794c30cca20aa38727a42ec16fa8131b8b9b1902bab906277b7d00e3e959245324e2b777427cd9c244b272817d6b80517294ac10395de5649acb4070c371b9047eb6154d8fe5fe889d5ee72e1244d3021e2717f6de3363a2ededd159c455eba50ce6b2d39269c49b0f3d0148367883cf02ca41385da59097ea4e0a826d8dbdd75c7f462f42c5d924492658685ffda3c5a7b26c631666a2a06c9afb3d5f7efb4a019d64a799dad5c03c8f33c6fcbacd0780a30026330031398f38bb425cc2bafced7e599a41257d6d89277a90313db62096eed9816b88342e7185cc05c31ee9a27ee8957f2d31a7b1eb7f80673691c2da571246906e39e3b8677bda4ef99c79b3e58a86bd8313f475cb05f0f8c94909ea735c6fc10c1611a172cec7517c7a3ee825da24d98547be181427e37420f0c55a8e50137856f315bc067008119064bb0062b3000b78cd7f3d8930264c361ef835362c64996e5ee62bfed0196663d223eb6dc35704dfb54bf8c4c549d0355dbb9aaeda4ae96ac55f55a265a2d13a3968955cbf8876b99905ada15d0a7f3f27ffd68d8dacb70010ab868846008c990f8ffaebf978ff6f7d67ea4c2b984d623d95e0fab4737a24773cd12852d4dd7e014dc8057e01cdafd0b3e41653201ae60ce3d7dbce15fd2b9472fe877dfe882bc57f08d3a857c8401780bafc408f978fcb6fb519c422ee155ef631f9cc1f393b877690d924e6c6c2967bbbbee35fcd4bba4e6faf463d00737f463d8072961c669bb9db1766315fb843d8ff99cdedd7dd5fbd867e5de43f2ddbde1dbc17d2fe8535e9887c23ee57e79a8d5677af006bbcbb05bbcee86f506bc047ab77c541db1d96c7ec6a993dc858d3dd8903872a9c82586013813a2917b6193fe474934f1ee07ccce2f7fdeecdc32382ff938b67c1ad3016684e42083bd5ebfcaa3b1c1015e5a2e939feae6d8b02cf859d16aa575d2a37e91ab9d1cff84b7e47aeb887abfc9effebaedfc3b72a8d2ade69fe071b2de7699dbb4198d5692b11aa9bdb46fdb576f9480568daa3af55a09d04bfbdd58aaffe81e37b1a7df8acb858d5d4dc7a63f10e9f5e938a39e9face45ed4df86db52bb2eeb32f321f0775b4f570ed0a07628068f9b5c9f3dc9e4faec2926d7674f32b9b651559a5c9f3dc9e4faece926d7673f60727df63493ebb327995c9f3dc1e4fa5e37b9be7f82c9f5bd6d72ade43f5b2c8fe87ec19ef2a107327aac3941ba4603f7e540553f4c8d4165bba954072d050ce3586cf80e324973bd8ef389e3d0142473f4e722ced188aa280db394dfe81bca18b156bcd431929c8730073dc90ded4051a94c87a4cbf309ff35e10a1d6eb13c217f4c88a109d1a2202d0346091186421864f262611ff6fa9ea50e132bff5cb0ed61cb2397cb3c406b6a763148746954b6bb8b0d67562ef703ae65c94816c55f2c5c249c6c323264476727bd7ea727f0f590bcb203322ead88cb655c9fab65be47bc0ce5319aa22e572702ed3d44ce485509695d42eef5410262af8bf90e42abbed0da855ac1dbac300363544c759c0568492a4a09695d42eef5b51287e512c3fa128775250eeb4a1cf212e56d24bff28cc7ee5c49ec94e3b7b9eef84d8cb9119cf7923e1843a18a3383633081e30657c9e9ce8e27dd1919899a8b97859bf6667d90f6668d90fdb4fa25dd9dcec29d81592304b346ab94583eb6a65ea58b3ad8f6486909292661a5250de1c7cd5159c4acd96f8b4c0920a72f72f6ea56f89ed094abddbf6cf2f477595ee1ff06df197f6cf19df107f657e00fecafc91fe93b43f238a5ebde1ab644372ca9b409110ae8955af8848d8410e293b013ee63ee51e34af4594e2fcb5210800034d33de4af4000521158d3f89405ee69200061d576995b866935caf54a7193dd138bfbe29fe15085dc5572bf31390d67a5c8411f14a5c861bf8b7435e902646481d562221283b8e2345636be4c1d5472c74c86aa9915d4980de87a2fec6e95ed4b62bda64a6ed4b83bd39ef9ab62fe3da0f94eb70f0642d535ebe17e49219f0b5e4d457ecd34a6dcfec28425d29b3e2f3768449a7e588a1cf441528a1cf6c1426fe8040c3d30353b63e881056ffaa907328a9fde372e586860848622a494ecebd7a2c7aa9af55cabb69e283c9277721a0d66e4d08a646a3c4febafd2c9ea315299ce1b2cd36b7a0e6d4328ddb69eb873b22fd351cb9ad50373b26fca98018d696931c3bee775683ec87b4270242427e46da1e25a2c6ea8149036a53a50d958ed994a99e9bd4b22bcdd10879c0abadbbb9c5d7c95db51dc804937627a3ba2ca76cc653be6b21d53390272d9927a5ccb8ef33a34b7f4dd21db8ee4af8a6d9563ff429b5e68e2a19a4b4e10779f22382030aeb52c7bfeedad30ad50dd70125746b386118ba9d7a98682b1dd243a9c313cbe7f776bd3c861808f851a49851810b5287aa87fb22d51d46769c59b35b373d9e4680781aee6ca00d33e89b8645035ba3ebe0dafcaf6308fc7eeb392809050f750156b6a5f6aa48dd5e4aa14391298a5d5f05d5b03bf1a1f28aa41cc89f894a139e4bb5c021fa20e5777e3bf43f6bb01193b2d0c3de1292161cc3edb25ab08e13d2065b7a53617c4d27b82a87a3992d1c63870bd47b9209b011ac285de784c457a618d2502674d3390f851f5480dfa2471509d18d2c4617562abff34596379b948c51caf9afac02a07d6cea3bfdf274299ed379c9199ccd97fa7657995b0fd115aca3675fcbd516e55675e7ce582cdb05df0592c36c874cff6c61a3494deef13a809e7c1427a4356af59d107fd61e0997efdebfd7862cda7f5140660a49458a6c7a3ee546ce16398f5a6dad2a9611f9bc7154c6621f33dcd862d43bbb0d172eb8085869691c2e0879564ccc0042cc11a0e7bd33e2839720703dbc7ba3b13329cb51f3562b0f607f4efb0117b9e71ce58cb19ac8463bbbbb34a497d5e2da9bf8501b8935ee4bbb7c777dddb46c39bc055ef5631713afac936bc6066eda4b4bd265e77a6bf91cc3dc1332a1805039b82251cf46efb12df1b4dc4b6546d3fb3aea2d766b8918aa57ca6f7abf5024365af5dd850bda9f6005b857471daaf963a4e95d49155f5c2aeea8372d07e41ea7c4ab6d11b188057f05ac0de1cbfeade341ade29abce75efc6d6e7b74be53edcbd0df7feb15d66fc03e699966126cd495507f5c32d5f5748fc89d4627eb5c099f040862a65ee8c0ce58c0c88ac9ed77942054871a41233544ceb2b40f5c734e2bff015ac96f915aacf8405e24647bd3e9832ad827976e7860138f06c3ea4ee920e41fb964e8969873dccb0e664757791bfda9b7a8d9ddb9d8611bbae8cbddf9b7afd137748cffac292c92ecb030b6acb240c7d43af4323163d928f316673f186c7a37298f2f61dc10593bcc4fe807e0ec8e7907e0efb2082249524022a755182d1a03b3a6e774784af19bb516fd48710463d77d408bdffd3ee7b0f73a129d01de428fa63c3d98bb9ac4837fd0506ddb4d914abffbc97f6d5519055a0985385d231083d6e3c5b9e3ca296d971d1cdc46ba7e6f4cafa3aa60d736f50d5eb4d6991a34b1525c39880d9369fa6b66640d77c2e0fd962037e7245d2cec8bccda07cae9bfb2b90fb6b90338fa79ef9866391e598f05bc5ebf585e173bcdede9aedf358924318d76e7a8cd968efa57dff361ec1b48b7c82dc752b3daf5b4a454d6c86375c5b9acec6aae53790b23efb0ea01bedee469a0f5eca5b90b35fb6bb9b99f1b15caaf52a70955551936ebebb9b7333c15ed1f740bcbb1bb37046c29bbc7a2308fa30a7c035775371e513644f30bbad34b8fd6f34b5fd1f309555fe4a7a7d10c3a01b1f57aea9b1e6c0c814e9f6bba28ffc1588fc3588fc7b61f8ddeb036ed2ad16f4870d9892af397cd8080725a25463ed8b957db5b6f4c57d308666c3d8bd4f60667024b83386cef57e09c0048e2a0510bf046009c367108e38f7947fffae0727667000d612d11bd3f3235891da8cdd15bc7057cc30867d86e099fc6e8167a1f86e83b1f83c0033f1790826e2f3082cc5e773b0f6c4e17925bf467e0446fe008cfca11667de4b81b1c75f24aa6bb12ecf79e30ee86994fc86fcb7d5672e0167641e33b6c81d49a11a9830dcb776e37625f02d45497e43fe2b502e25ca539737afe7017e3cbab35ab92b41ef2842f21bf25f8a5019545d581a0de909fa1e1e1fe30edafd7f5cf2a159a55debfed3573eceb832bed740feda0cde6bc1d2eb04645ffffe9db10585bcb7138c31f25700f984d1baf73c40801405a73a05b959e4c40c0eb651b06014901fc97808fe842a0e7e402bd7f3086ba2177ff3c40628953767e5911f289c23ecb7c0d4a8b1e70102b091fb0f33cedf080b6eb9ede622868b516101920adb6caeaf9778d21f839eba5816b037ed4bf37826b4cb1e339e7ef764e3697e8964730cffffd325b4cdb40b4d06a15daf94ae542af8a1a287fba6a9f050892714aa61252a5de96358429408f9878627a9c4a3295024061a95b1e6bc6a707d8bd279951b866f3bb3e29a332ba667567e37b6a8bc679ac2452f27db25e74a99cadfd456f2939e48a27e772e3681f29d855e34f752eb6de4eb7f86a9906a96716543ccc8064e76053652c6f4262d9a21c5b6d028291ca3faf8c69461d536a0ec26985923c900d614723c434f7bac6ef544b9a99a4a5ab1a64768ad54e3a93e1dd428b32cfa17321066df6abee2a8b5e8a4b24597bc45653d26a2b6724f650a2e25313faf5319be7248ad2b00c9185b91f2577e04d77e2445522b7f00d7fe400b0fe1da1f2a915595206ac53677a31e9ac49cd7c2bad0d0eaa0a5d83530b271b19795a5a68f8c3c4bd64703f38d4bad8b06958b48e951bc416945ba359fd1d450ded6a2349ee5bb2da1bc23473e7d4dd790de5522359f37e12f4662fec8e545b58b878b2a99fc8549c9f5632e1eae6b44ead7968b870a4d75541159ab1a5cff82e0135efbfbef7864b04ef71dd5a5d4a8c4573c3c88ffaab38a61121585f31a3b6885513a2a9c775857a0d77d0f780fc5628e72d77012f13a5b595614ead4091feee2119e761098d279d1c16084e678da49014db84613daa79d9c03c8889801ca70b4516f12586ab58445fb6cf848f07441a6102cbade66c3eafa59d575f4c375ad7ca8f0bfa7c6dafd6c1741f4fd7b0830c4e4278529f9c97593aadc2351b11e15d3a8488f8a485457f3a7d6eb1bd2d400cc61a0bdfe68b89ee0a6a160c9b70ab0020318edcfc02d1ced4fc0058cf65be01a8ef65be0148ef75be006ce1a217805278d109cc3007c8201b8d2549cc8817875fcaabb12bbcf1bb8dabb6d5ed3c4350cbaebe39bee5a247e84ebbd41f3a27bd5437df8712f075784477ab31783ab5eda87a780fbd9b9f257e0ca5f832bffde03143860a001031cff129c849d66284e3f06fc82c5adf767f23b6caef6271e386fc090093c19d9134ab6a274a6287d0ba78d75e3666f052ef997bb6a841e3883d386bb6e849e8cb9d76256c267dd5b7009eee505f8253823a14f0d78b4c994c39e39f8444efff306fc04a60d78be19b93bf73b6067bd0376563ba01992ff29c00051d72881074c0099de6400210558ed0001148210200a918308b4cac94d96de64006d09b066401c400c9f033bbd29019a0ce2503dfec55c3b1595af81959e801aca27a0b6f8e84db19bd4c189872d52ec2e40cb9015fc1babf32f974949291af20c47a1988c2d7274eda57dfd91ab5edeefb2c709e382ca2abe7f279ffcee4e0f1cb0007fd9420fb4f50007bb412bbcc89177825921507ac2ead8a6921a08f7e5d09131cadfa0acf4076cda433d6cb83459bde5a5e4dca485a8dcd0f201897b711fe6bdb8af0a20a9ef317c6087ed7f637e23fe016fd48af38596fd2baa7149743d8d4628174271befc320341e5826c91c6e32c9fa908c685b2bc7087b29eb3284e5dcf79f8967ec393e4561a6640679e67ff664f47b25e71f69c593642c99718ddc998251a1eb88eb47777423f70bceeb774b323f6a988aee3dbca7c9747133a201cc8f1857e009c40feb191126681ee2290dbccddc5391a93ad475ad1c998731b769c4d345b3c2a2690367b493c9fc7a94a276c67aa471862082352f0e82292eeac459ca5057c18a13c5e52bbffa2f32c04a44dded2cdf05908467974c7f6529a56d076e243fafce3dbceb370233b375a246aba7ea1aec3e103e5b43a3db24a857db058767a0108c8478b7df1ecd4ca2790b92f496371731663ac981689cad189fe68946e1c54e316c31c9f1d65e75338c5345b242327cdee9c0172c44be271fa98270cb962b19abbc8d3e493bf62b7de7fd79b6886f268479ae50a5718dce304b7c2651c8c35e8b7a519d915297f4a1ecc7bf815d790f409e5c59c205b2283ba71b6345d8b1df2feb9cfb29918c2298a72683cbbeb8bc1ad27e42779a785da02f17051c090638b68e1a68b3261031ba33b4dc2358e93d9fb683141b07da8623e7207d4ba43b34f56f3b8dee64b85dd2ab754fd15e9a6aa3aa06e570dbf60332d2ecc91059f0576e6f91a5618d9e9e555380caa5aac901551b186222368adba64479021cf5ca22b7c00f124cf5ed290faae5ddb5045a4b1c421fe612d74487e5a0b1e929f150b9f2904ab58044d994e6941445a801fdc8c3e64b784b06cc26874228332bad1badd2b6f80b2371e3447b722b297f67d6a49cf2e55256771827510eef97607ef0066769f0b6faec8a3d7989b0ecf4ef7b4eacc439559dc38c86c9ceda9ceb86ce9c5723fa856d6764dd6f6e3590f6ab21e6ccbca39b8eaacb3ada5727eaf266b75a9162c87d86c4a4e97c5843254d0e50c34400036e77569a6036caf0e152b06b751d5f8e348ba145623de7b2605e02ab217f5096bdc8bfaf49d71be6899feb8cc7a68f329f600de805fffbae7b55f31880bb61f55f85ed31424b6795f03d8abdb698557a7728a57bdc58a0c767c0db8554c4db230079b204c49904fa49b9759baf553959379de4e8e5fc2e37a0ea66ba3131794cf11b6cd3b1ee0d6659ebe735ea8e670c52bf3b8e4b84b4afea46602b58f6be2de8b3e68e2de4bfa370cfaa6ab02502ac3a8a6de9325c88a3db2a25335df5d36882c9e8618666b449509d0609f3aaeb693b0ed52930b30e51cb0bcb5803f9f3aabf4e9674dab3fc9b42a717cdb67d8af365353d914845d44e4afc62422faa3718a88fe28061191bf3a5788d8afc11a22fe613185643ed010f3e15ac1c69044cfe61d91fa2e3191480b08c70b08bfcb8651724e17bc0a5f06fee11e930c23fc2e4e661fa808d1f5f65157364b6b6fe15fbd7adb7a7bfa7e8f0afe221ca52ef61e6159c9aa5059b6d07ea2b8082aff706fe1bf3d7ddfba7af5764f142b96ee5a026901a7e3311b09ef3e7ea930f6ad26fd9182f7e508e0958893d9af54065b634d2c7b644ffabdd2060008151a46fda378f6a5572d1b0f39b4c5e88ef5b1a5f92fc4ccc6e0dbc740374820634adc99d0a1f880d26890a0119943e34592b08a86f49b531b02f64ace6f9d807f7ded044cf8dc0985543a14ee9208569f23952e5568a4440f9115cb0a82da14f17991302dc57d85b916c7b8f6588b6104c1e8b1e1394c509457352633e17856d362aa6ee1a333a03aa5e69531b6b4403e889e323c410a5b7b583e9e427b7c2f05316cfa877bb934eb88d19de6e750ab54a94ed2a3bdea2bfabc90eaa36edc8091e89cbd7c3f03b82923beeea5fb05c8f760c4ba653f032909b01ed92f36dac30f6aa5ea0adf1e7103a2bde1be3edb2909f216afc4d3cca23f90b61bb831881b39c000375380e432fd088b63ef78250ea9acbf2957cfaf8f9ca2c4ecf699176eba9c8a8e0432966e36aa57653cdd73b4b121b144527b5b8fa53b90da8c540a5f0bf4b5a46a840b70ba2e94f623094a7a439629f72573013321f8f664f53bc09b8de63fe5374dd8532b7e5a0c8490879f10a83778ecbe0ce8d502f6bab1bf9873d7e0cd10041e88854b20a6261d523549e1dc60347263ddfad24015d9a8221355b3842b124f519670650a17f5ad9099a8089c8129f3f8955a0953a1636a861e286c544d0b57213dccdbb886760d87362e42ac866a28d4a04aa8121b555246d53470251ec861fefdfb03398146b81306ad1698459377718251de0983e008cce2540bf24198a3748472263361eefeb04b864d39d5c74ceec01df569c3475fb9a1c936eadbe53cca518af94a593e6288e7dee82272a5154c3d1094c8010b984b92843fc18b783e8be645b736053e0bd9bb644601396963c4d1bb18c45e2550680045d5402d0328ab066a1b404535d0810134f4407dad1695080e0d04495529a9b711b237b23eda3c90ba668a2bfb25aae8970c06ddecf8889a85940b143e4248712e2ba35b868af54bbeaf5868045f2e660394fb717196623421b5f26a4ec1bfa2c1fb73324475b41d473bfe38642d8e486b8ae370651ed729e27b049c6c4e68291c6fc70318a61e581a271f32d815c5bfd7bd0931f51e665a3e2acf56e9049a3e3e491b359e4513041fa84503fafe9dc2323e912a19705631fdfe5d5cc5c8e9ae04e8c3932199ec5cd82e170005909c241a40c56461fb4c12cfbf2a9f93e93c1afef12a89272939f82bf1bff148e56ff5427643d2f35b9d8cfd370cbed6e358ea38bed6e1f86ae2f0e3a2b293096b6dc08df36c764a8523431ca593451289cb2f6b7d63fb299f95cc4c84d98818096c5186987f9889281d66a3389d402c3ff94a4896e3df410e1f8464b1f38005551d2e6124c362b301ba50b0d3db5946f93a4e27ce120ddbced214037577c00e8da75e97085e252172e294e519c539208159840f1c26b6703ce76107ec7cc3426b4c4a731c5780889b579a3df003c7733c7fb5be773c52ea8694acdfb4527416790eac244cdde5d2db5e7ed34bd17ec3ff11a7c3643142cef1004de2f496b5c62f561ae745b5d4cd4edfff7716a7eeceb774c703a6d8b4d3dbe1edee14d16c9ea0bcf5d691ed4f5bf19156fe0f26c775ae4edf9c7dbafaf8e6d5f9eda73327f0dbe18b76f0f2c58ba3f0451d54cb09fcf0f0657878f0f2a0bad5782fc946d3bac36e51de4a4b346cf1aa7cfec2a244c85f3bd0898a38759d6112cde6ae42edaf81d36457df21eb5067cfaa51c309fc430be18a2024e72e0dd33dd002ab32a2968ec9ba81e7b3a5f5d6557d00646dc4f8d2bb73c35f07fd2235ebc8b49f45f377dae4de01726efd1bbbb9762f66cca8dc94ba5b0325b76fe48a78843a21182488ea5176820de5a5396e5f5680ddeb40ac31cd6fb0d0983b048764078fbd6e5ae6877fc36e0842c2508a635166b272747fc99ec6c0f1a56d07649c2d73114809872e4c8c7dae93483d7108f3242d9289c77eaf5fad67fa6afd7bdd6afd3b36d3e2e26d840575f0197b6bfb9ff299ae7f95dc52ff17ae10decc93284505ec959ec6bad6f4ddc563587a5c7a9296e2f293bc14179fc4a5b8e824e271fd8d79fafb2fad86e0a15ef0a4797f6135901d2dbd28210f64d27d122601e9378904da3c9093c08170b44302873c104917743f2b8a2e5bdb28bd248d76aea07444359330f5d0c9ef4268b26ed8a844ad7936ab97f620d3925294a21491410ed35ed0278b402fec8308a6bd561f6430edb5fba08069efa00f8630ed1df64102d3de11f50bda7bde075398f65ef4c11ca6bd977d3022d9833e1893dfb00f66e4b7d50713f2dbee8325f93de88335f93d546f3e934e2a107e93cde6594ae871b3660e16cd028c9b53b06ece4c9f1098f4a305dfc8c1a2518071630ad68d127cab0c1f83456308c68d39583726367cbb4c4f0c16cd211837e760dd2cc11f94e123b0682660dc1c81757369c31f96e989c0a29180716304d60d1b9ef6b27a1285cd918aee557e0e746d75fada5cc94f75ad93ea7f726ffc761e6fdb4b724241c97a1be69fd8d309bf9ee7b1e1e0594aa149a1ec6550eda9b57f62ee6312facf83e76170f4fc4518be383a3c787e44d2fe06724c0f3a5b26a4748599c3a6f47cc92c7a8f98056f3c76712fee6befe751fb7b37f58e73ee66f959c8f5079f053a198623a1272d0a42f381fa511fbbffc2fe4a7a4ef657bf0427a43556feaa83c831c65f817f617fad20d61262cd21d604e25e41dc4b887b0e710ff252d5fe85bde3a0aa6ec32cc5519c1614ec07eb46db312db723d2cbeacab2f8630cffc0f06198cd6659da7918c5e3f1a24092e9a7fe93ddf0f0e8f0c5f3f681b701d93c1ac6782d00c20d984573e38c0016cb1bc157eb78e624a555971425f3697461a1da80628e86e450440b118132184a971402a54b3b119033e5a911df0c372047e384ca9fcdca502522dae257118e3391e2bf7c412ababa88e7e7688912111f6c3620ca68d151562a99469da5544f412f6503a83212cd46bf4a39456c6566348b8b225e2256631e28b7c960319b5310f2512a814452dfed3a66368269a6943b79b2b2b168232375ce4c98446fc30c5092684877468a478f2861d3132d628cb4d77154e84d9e678bc9344545418b90a1721bcc108e1209284365c009599604cd2250061b6793cec3389bbc357ba575889a8734f51245b95689713679a7225aa84da3e851c39e6247cf9f3f6f85879e181d45e7219a0d0819e72468e4e9f539d0a73c1b203d561e7ba2e49c63118960ce5e4e895141ba45e87c3c902587e2de6ccaf9c93923bbabc352d054d63b1bc04257ec4d6a19be88e6d7f13d2aa1bf16a935e48b74ca8d6920c53cc35bab266a03c4499e7c1bf5950fafd2baa7e84d46e99da374311be4110f8ed0305a33b265997f737310bc95eda027d80d40df8afd8916e0d5d16bbfd1b1fd9d75e311ecd4c7e684194767852cbfb20d8c14bb11a664dda32cc8d38779f1c7fa8d689909f5d3f4460d7c02f72a47d18f372c13953e6c84a0f46123eb55fcd4865ad03654416b612cedb7955b67fd2e4c461765257f8636eea0dd58fafd43e01f7afc4113da2862a5feebb46a162148ddbc33f56cf82ce4ef7928a0dca5675afa1422dedd75531aa6b7137f2e50815fa5f18c12f92e8f66c8cda5c7a507fa04807e327dc6dd13f24bd794fa8fa84343a809bc0d28703637ac2fe1b3901e32658ef34c8740de430a11857893a518ad3412b0f78020de681714587ffb126221656e71cff1bfa2e88f8b68ce19bc8709aa7c6e05f16b8d3c41d1128dac7773a9ab73e617c303543bd745a46fd12c5b228336fc181e0c31c3c3a5cc0c1bf6baac2947284118b16c6eea0fe807299325b8d893ba185ab920fee1922355b2f604073b2d61a0a14ee5e1803fae1243ec2f8a688240444e3154c4c409f6bac81fc4e948d0cf4619abc4db08472e7b5504603f4b3fcf932c1abd899264100dff708578ed306c1d495fffd2355e3676de255984db2daaf17bc2e03a6580a30306507b2ba51ee4ec389f53fe082b1a39a4651c46a9c36f710d8cfe8e6716f7394e7178a491d336d3cface45639bb519bc3527623f9a094fc424b0dcac859f2eeae4b01420f3cb0da7522e6942b03833546c527949f32994d27f75f7fbd39bdbefd747a757b7a7e7a717a7903842f2faa0a4dbe361b3adcbc4e24628e65daeeaefb4c1b39f2011932d6d8d8c960ce859ceccd5263b8c4007ba019420833f6d6c889183bd78b011d3e310840e475dcb42225e39a3b7b51453522990c386eaff3a328fc623188d873390a17fb6808a49e400f9ba1b771235e04a097dab2c5a06c314f5fc852ede2f75dad8d1039e0fe8885b569599dda96d5f976dbf15cd1546337ae76198dfcd156f27fdc4cfcd14a301d1ad2cfd065e6e0de7e0b14d06546e12430d44dbd536afd9d946dc41770d808c194bed43987687f084610ef27600c7b7d30237f26e4cf52f32ad38d8ea7ca95cc1a467ba366a179685b288f6c2b18efcd9b5977c6bd7d80e61a041e98f017aa9942cd9285e2fda1fc0e9bd17ee231036b5662424b54850c5521031837167b11b8a5bf6ed4083d7007e3462843173c1475c7dc1907b805171ee0a15b70072eb8ef1b696f3c7e9abdf1ec89f6c69327d81b2fa9bd719ad65e6cbc33d4ab7540e366234d415e8f646420c9eb90e429db3753f840f9b55934bf15174f9d9dff88c72334763e5f9fdebe3afff4e1d5c5ab4fdfd26f9833936fd88362ce9e719326d83ee02c3f2f1dcf9f74bfa5ff81d2513cde01b2887994178f9753be2a15c86d9c1815b88c8fe2ba39bdbe21c8e2b1e33a16e5c70ac4f19c515c0ca37ca4e3ceeadbe32327724cb653879fdf3f0e87c9a26097a7aed12a99689296e3f939bbfda4b795a6e4c86990842e41ccc5566844cf297e9cb213ce5b5605d2ea76a134db7fc4636169ea524a4f2fbf5cbcfae478ceeeae4ab8be7975f9f6d5d55bc72379442d4619befce240a788f02227a388c4b8d23731177b0215b18cd1dddb38773c6ab44c10d5507dcde579846c2e511751927c97950f4af5028ebc1f1472c12b2108e205b31eb37b6ecb30fb583fc63236c0541aef62a3a3b451a2eb07742c3508346296de6da56d40ef95691ed69c664ea695c9cc0965560648abaad5e1e6d5e5fbd34b3ab8b5ac37840549b1cc8b59986b4c685417a371410b6d39718ad18474b8e893d7576fdfb94cb3c98953471b1dc08ecd554f30337796be44c3036718483bf7a61302a7e9047ed07a7ec8be0e9fb7a84247abc53b51cf192a0b790a74d03aa4ca02071ccb01cf43a173076a74ec91721bce30ec6af333080e1ce8cce2d475727fe5ec91bfc041ab798bd0f6d26fbd70f6f8f867ea0804aae1e4fe9a4f46e6ea100d093ca323a45490294c9013d8fbbbeeb774f32d6565ce090fb1e0d23539706eb2b33c8f4631616adf45d4078ddda454de275c04951a7cb8c0d9785c9b4c853fa72b7663c6fa445b121cd7f9f4e1ebf5d99b57e7e75f6fdf7cbcba3a7d73737b7ef6fec3cd355b0b38168efe5d9424d978ec40ba5eed3bb3684546f29d6b1369154bfb2ce47d148f5d8b6ae717aec9f3c0560dbbb83d480a69b9da4a44ca6f92d803ab6c67df46eec9f568a3f59d55069d0a4981b61248974cbd6216dd1c356d10456af311fa1a6cf12f355a8964b61588b56df32da5f39c4cce5bbe0ddc9e47b301cab13686b8168fdae804b91ca9a967b36780765529ef6eaf87d3241efe61a3164b30cd501e7e193eff204a6451e31c152922ab199b6eaed33cf40f0f0f9eb7d9943bffe0349d23ffe58b767844e713c7a14f3cd1ff46e11458606f98695535b995bbc65b3447e908a5a5767b1754d5e829cbded3ea7af9a55c57b2e474e52afe8e2c66749ab1f59bd55b2b0e38efc8086c3aef02bd85dee54663d044b914bdbf7dfffeb7dbeb598ca7a5d586325095b53eaf6e0bb3c651cb11939562e275618913d2121415e99f3fc9388d5a4e437667d4a28dc0b23338cf44b0e408be3c11c1178940cd2167df7109297b049d57d32e6fb23c4749840977f43fd9424bd9427b3f5841ab89bf3c11c1b9dd42817f2856f6c9d26938930438a79faecfce3f5e9aadf596b4d60fb4ce871f6887114ab3994c17b9f71c5a1bc12debcc71e55a16b59c7d818222f4bad6ba29381cab2a67e9301e890b3827d643c05a2238cf6b470bdef84716cb9a4584b58e688bdc627529de69948c09e36de8681a64fb4a91b3e1483e5d6f713a164accbea8471d32af84a4e2c42090d8e7037d6cd46612752b653aafc8544366190b5b5c1da86f6c56efe8fb0e5f1f1c58b746f061cf57017d19e793c58162c268a0d6b6f68e8ef0f7ce9ef3561baa2de7fce6cdede7a5bd395ddaa3ebc9dc384b3cff7c737b7df6fba9e340e7e880cfa412c09b57e7a7f4f82ac1c5f4db975195395f9fbdba26a8d97a62806e1d2c97c0f9a27753cb592c19f7af8f7ec01737b6aa992b21855f2c9d3dad060d4993dee08ba5bea091667e93c4f3391a3125a777593e2b31e5b4a9c7e614258b2e7f498024e945d085d475c8764336e2b17f4f9bcea521cef805c2cd175f9a0821a7a30962ae49eaa95886a5d5a86512b662bb814b41972d63485285ec41e13a2b233aa27df6e2f0a0fdf2c521dd3902ffe0e5d16178784895a783f0e0b0151c397bce9a2ec96b2defc0814edb3f089f1fbe3c0868de033f3c0a8f9eb7c889a80c4f3a2a72f69d811687a70847b7459cd20f3af45692d13e71964e870ea93d276656a06c1cd0666683811ce756c00951f339e5fd9bce52ef10f680ad6c1067cf2ad1ee8765942ce8e8fc81d947233e6911b308b79dd959bab481c802f526cbf251d1730e9cbee83ddebde420ab01844e9f307f5a4ce0f4d572b66c59f0ededf0f45c22650b56bbc8a31a1d3e1a28703e95913a9e73ccbb489d8ddbae1cd9bcc49b1038372d1abe09cddd8a70c2978c0376495b5ecae97c43aad514f45d02e7469c2459ab4698b0c8672999f054d232cf0a7411e136b51969bbbc541d252566a89a9d2f60aa3a90a225abb15dd1a6f349ca2754af54c38795f0ad5af856257cbb16be5d09cfe8d79a564fa822bd02342c81b6ea405b25d0761d685b82b2f16a2d6f5248658c1a13a401b7ae8eb2a2a0a22a3f872cd491b5fe22b2968eacfd1791b57564aa73f9d68f8a454266c6d65dad54b067c9b7daaec0b49577be3d4d97719e516bbdd22ef5dfce21ff20db49998a413e1a3bb04ed6c94ff936b3cddbc5143bec515c543e483fd6bca1b2786435d4c522c171318c3046799c4e6a1a8ddf19c643ae1722e5eb3fd9568479cf1698e789d34982ae190d46ca8c10c7139ed4bc4fbf072833db95b29732ff5dd5073fdf7b8c8ca2382d0a424b65c7893a33982de9b3824b419b0456c31f2d27a4ad8c21d2d822b10afce0e0f951f8b22b1050cc9ccc3d866f5fe627e5f2485629a343c9bac172b2fd51ef529244339fce0a53e8f13a89d3f4d3344b27b767b379120f63ec5a52c2c06f1d9a677f95a9240228a6711ab391b74d0c50736877557eda3a87824f66620b2e0d001a54fdca5449e4d30ef77fd32cd4a8d438bb1f3caf9727d6e3c7e7d2ecfc5f778eae1e76a533b3de87dac87adaf19997f7fe37b9dedc6414a110b39706ef64b2bab2771929756e51e92113c41880f4601404213d6eb4d4718ee1344abcc974724ae50f74588b0076d4697111a609d960c58a824bf7bed71f4e4f2f1d4f4de037d3284f62e496760b1671997d303681385dbea2822879f923b3685d36cc8ad6d48124b7b347fe6a69459cd2347254638b1985a6c7dfe0f98bb075e875555b93da3464a962f2531c40114317087a9e26f07bcea733a3e1bfdc5ea2c50025d81595faa2ea776e35ae98015c447c4011ba97d9b9d32019c9f9243ba7b5fae279f56bcef514a1b4d4ad5afb9acbc7f9d3d69cf252632c28970eb467bc9a9e5ff444be84a8d40ff639ace19c3f6581b904ce075b766c33466a94e90da0c4b9aa7f28ce4be07cf180f83c5783595c5233c3962d17f9af3f5f7caabdcae7e6301597f9d226467118a30fa3d5fa767c3772e5f51e8bbfbe1951a9cabbd1ca654a2d5d2b79cd92d766322be94342cedab23c7264556a219c40a12bb332728e5eaf9e98b3c189f4fc95d324255a78d63f84675dc263dc7e8f5eaf00c5a9dd57d2713547395ee403263478950f5c3e8617f9f8769e15400b92e147c3bcd91dbdc9dbcef23a9ecca2dfe4f19035bd40e4afe8dda919b7ae88bbd7f45234bc5f75bceb0abceb0abcebad78c96c9415d353ae424dd0c24a0704dcc87ed5d2802e81acbe3990c66f1196c23d0601087e0945d2f7a0e3b221ee3ad4db4196e277d1304e2774fab5e82a1ccad3b6a0ff7d1e8d4815e249eab282d8dd0bed1caa2e711592d141836b126c691a3fb6eb0e2a63945864bb384d5e901c38629a0bcfdcb7ccd0d19ce9cee5e78bdb37e7679f3e9d5dbebffd74feeaf2f4daf9c509be09ed0f9a896901cd49c6c859a4799624b74996cd6fa9b23f5ddbb2dc217c0e7662073a41d7899d63e7f3e5d9c74b1b3b496a34d498a405902ee2647e6206e64ecce54842b98cf60c39797f928e456856a67be3fcc2437786ae199f4155a4a374f48d6b7455d2e91c57b50da3689065092398aa20e17c8138ad5b1bc96ea6daf6a92cda6eb8a734dd37aca8fcb136dcdd1515e4a836f515e44dc97b4a9468f683ad43668fcaf226b475681a8e5cf41a19db11d376b25aa70a6dbffb0865428decafd05557c05371ebe8a80c77b61441d2817a098461a8ded2df7c3cff78f5cdd633cd2703b2ba2d85768789a89e4190d8ac8ad7a3d12afb5348b6e667952183193a43f16da0a0d6d9d283cfa733a7ed8707e1e1cbd6d161fbf0e5b754a5b49c23bff5a21dbe386c07cfc3177ad2ed8757e7ef9cd03f7c1e3c7f79d46e1d3d7f79a0e5dde23da80648771ea440ce3fbe6f39a17f70d03a7a79a8a285f640889a47f46492928610eca482930c66e4091f4191fe108ed27d1239eea631466f32c2e051215ae429418be45623b23f4b2d3c7a76b39873ea784a5c5cacf6565d67a3c1b71f85b7731cd4e4e0df647fa7790486d6deaaa5618896288f26a51ba7a1e0fa453eba3a0ed9215b08cedbed769bf22304dd349e4ce7e20012a5231323bd5835ee8575f8889cf35afecb172f5f007aaff7fc85df6ab7813374a073d07e7ef8c23f3c386cd3d54bcf37925cc962e9afd8c9a5453a7240c8024e4156825936729d1106643c1b07086a834f4e796e91126e61a88eb364cc7c387bffe1f6131989d7671f2fd511659ea3615cc4597a1d8dd139bf886593526f307145bbe4ed2335fe189659b46a5765a3778b4c07cb5f0167c9b8c02561fc289a2752a1736fb36825fd98b023719b334a4b437bda227bdfcc485a488f3019a96f5cafdf12783d6817606cbdb25d7dd128ca312ce3221ed053d1a62bd15d193add1a3e4323ddc62bcec72ade52612f276859b4e24b876445c05cdf52b54b06edca499e7ef9887a737efaeaeacdc7574a6f9afa8d1c6611bfeed4352ebbfcc0ff136eedb431fe835eed949c815f78dffc7da5970add93994aa573df761f53ca96b8a2446aee0c1c23c861b45812e437cde6d5825082e56b860608182eaae5ab709acb455321d8330a69b04cba2ca88847e8e39811effc55ea85bc839e9018e515c4022babde9c499c220a74265cdab83619e7b14e057b28560a627f9664030d3bd55537bc68f0a64e0ed55d296730917a54374fcbc5aa4d6febad0b7a4b4142d0ca40674c5483677371a9cd76b9190d92a57846af67f9578b7cf1f141f384e53c6b99672df3acf53cad729e7b99e75ee6b937c72123550e35d21c517e935da1843e7e77be98c52919a5b55bba5c7deed8f3d1da55782b6c1d91e9f93c3c640612cfa58584ce07f08c80b391843fe6c38daee4c6331cdce33d5f2558f98edced680df92d3e64f201f604e1703140b78be5adf0a093a5651e9b9917ddde7cfd747afbe6f3ebd3dbcf5f14bb46107cfe72abb9d3715ef841393d4e65fa41557ab4ba8913741ddf23a77578548d41428414800bf7117e170d916bee77bcfe0eeb936850e89e42c9a6ac20bb0c908b6022ba703559039178729cd4f3fb2be71703a17f2f0b7b0af4da13b08e286d64409355fb84feed386d4986e330c6a636eb5a660d69d603997543b36ea1f1fe8768bc9705b56841877f0b8dec47b08cd11069ba9213843f7fb13a18681da677768b29008a7a3212202955eb25a57dd8acf133ba268ba2314efc9567b6a78e3eac41afe5068e5e5619fd7a0bfa5619bd86795dc275bf0557fb5152ff4a431c6ca5f4fed15a6fefa2d52394a97a1bc389e916ba8b25bb76d6b7ec41cc16f637749171d5c502733e069cea51378be76729e63535560eb11c59eb0b87a17eb4cfc4f9c0ad581c9b1c37dd16585e16c1b388d47256a3a068c8564a6ea5c2e9d520305aa18483f0dbb136bd1d2b2fc82c9b52db65d3516f133a07f7d828a0389ba29d79beb103f93970b164d1a433982271d319d318398c7e31c6fb829ccd1a5056492cd704b209e50ab96148fd958075f6cc2cf198b782735cb169795669ad9ab630ca6274c93eddb372a90dabab13c79a99f4251583546c804d8e48d02f5b8cd961b37e138ddb76303546a2e3f586a4de64e7744cbbea12488ce6c5d2f3081f6110548532ff6994eb1a94839f47b9221d5d85f2272bceaa38a3d6a22b1727c0c13970c6626163b845f22001ce404f163c15c93a03ce6046d2d642a8c199963c20334085970115e46802ba59e0345b3a481e3a81af09e79624dc7a7ea465092963a2653970025f13d62d0fa8ea919ee5c0310b392474049a246f794815c0f53c87648c6a798e28cbaa6539a2f7fb6d8dd8d91163ebac9bf19bec229edbea08c6b2398be754393d906b8052f1fa053a7928170206e9e686b11c5d7648bb38b380ea0cb0e4909c56667c6550bb9489faa0843a2ca33e20a843869a261f50d4e176d48725d40765d464e99b1d30d434f990a23ed88efaa884fab08cfa88a0664a142cf988a23ed4511b589a6cc549b249cb0dfdf0c8d9d35076f9922747fe5ceea007e2a679fb06caa2a9c6e8e38381c989ad31a4320067662c9b55fbdf2c9ebf935bce2c9e5b696c3b65ee5364aa3abd050eb41903511bad22fa9e4aba899569b29aea5afdc065a881da19cd7e50c5873f50bce268ece2c8fa248a6468699e779e4e81a18ac11f65aff259a0793b90c605ba1f03d36dc1d9e5f5cdabcb376797ef95463f53776fbbd2dd937c8b819ed34bf8f7e50d3e3909cfb802f88c2b4503191df2e8d08c6ef168aadc5d5b087466c2c0408fd7e48355798437552ee5abccce1ae3ddf9d9a7dbebb3b7a76febca6f6e2d7d8b2b082d9bf207e1b2672ebec4e8eec214421a9e230c7164975f4097e935285685342bcaaebc5db5dcc7d65ebdbd3dbbfe74feea0d755755abe863b99ead50f829f99f7d04e6751c15dd7a6a9f46a8ee06a461285d196e3e98ae85a694635547aa07516b7dab1e4ea344b7e1e74373215c7d417a7a71767d7df6e594d34c976d91a9e2a50ccd0b31d0d49d8c1c54180575509303b3f00bdeeb1bc6198e92539e78c5bd6410c6b684bea686f5f7c05635cb6348a35647ce9fcfd1b15acf8808e1dfc7059e2f30ad2957be11305e574764d1c877ca738e45341193181e38d447a625d2654fb7ab5df67d349b45355981a6e94ac084d98789902e0354d99a66222d2cae18cd5c1ee0109126dc56d4534afe6e0ad809f449741457ef5f3fb10d6981641fb44aa52aa62f0f9ebf387ade7af9e2c869281ba5c356d86e3d0fc2035a3c8d6df9073a35227ff0fc79fbe5cbf68be085004c08b3328dd2d33f1751525149c29a070787cc79c963cd4caaf993d553e51d84474747dcdb4de80787841554553db42b15b6fc97ad1fa84dd00edbc18bedf5b97afffaf447ba4ba78739d81058f79cd6e121d36e6bbd6046b6a16164ab1a8f145a5358dd5dadb80d66c58bba4c54b5068602edf874a558556788e2c465ccb37d9beb01a749e9054ed87a2ed5f26aeabccfeb4cd17bc0e15f0d5165679f3782d5c4178f2f0db368457d573edaeaaabd4596ad0d7df1f42255ecfbd7d2058a68702d34d1dadc68f50bd5e41ccbbe46a4d22aa1592830ed980b397664036eef049645910f9c0bbbc5dffe8d2dce2e8d39f0be46aa9c505b7be0edff600fbcd5668ba097a1d39bfeadea2776c872deaaa62f75d49676794bffb206d9d76be3016510c2eedfe83163789e4dce17cb0b79da08fc562b780998f085167d10be3820bf61d87e417e8f9ebfa0f1cfdbe14be6d32a68f1741adf7a79f4929664eee1b49cf21aa35dfbfd36bffd7afbdbd7dfe93a21e8da5315a475d78168bbca08b935a2e611d0feea663a07cef28a5a72b208f6edaffe5ff6fe853d6d24591c87bf8acc39af5fc9b40960279981d1f82136497cd6b763709259db3f1e19046807245612b649cc77ff3f7daf6eb50476ecb9ecc9ee2441ddd5d5d5b7eaeaeaeaaa85e54a3cf47e407e7e05a379e45b5cd5499897845a10572c986129a8efc4a11a977594bcafd4a5846f6d5b62d86539b9021d658a6757a368917168599c6839c26f2ad56a6d1759dbf5cadb2ade8cb76b95b73ffffc86fcd8d9a95791b553a955eb3f236bfb75e5eddb3af136b7c341ab3ffd5447d6ebca9bfa9b9fc03093ba56ec5ba00fe9a07e15ad2cb394bb66763aa8e34e62e8714f52a4f3d83681fb462c11307ccad82e0493586870f7822a7ca6d0879f1ace5026a0772c84e6d3541539089f204bbeaaedc32516bc2547402717c9e0bcd93ef9d4fb7c7a7e747076da01c6ea7d1a5f2ec2e235b72196a6bd41721aa7e368147bb371d087a6c8b09c16db902ca56d622b444fc64491c0f4046a7a2d27bdced28131d7d2122a9c951490784cc272769b35f24cba8c542c9ca9e1002e22540505a642f055b4a257813d7ddc3aeb1d9f1eb47be7edf747edfd2eb3b613b53113804f7e9fb89c201fb6321648a148d4c02dee72315186918b09595aa01e809a6a14944ab255dc32f335450ba1375d982f082cbb961fde6ae7dffdf98d6f2bba4bcccb78cc216b0b545cb947f06b21df8cfc973f814ff50cf613dc296b0115179f241db21a041c291454d3fedf8bc3f3f63ea806c4f0bc826e5c690f82890ad2f930e4c7fb84ed5f33e0a7865246fc04b8be2a3d5b10f3b3b017892e43519c5e7c5add759db38fedf336efb947f492322f03ff4e2d60c3c5c9b572997165367ae0400aa52558d5aa060342b004c05f5de3bf45178015a5a0a3c4c189069654986b128451012ca68b39598b013340fceea87d727078f2a1777c71d43d3c3bfa8d628fe6e9280ac211b552a5f773969288d44f7c880ca5453e12af193b694c2c70e58a26c1c30aa78724eaf00b9f1feb50f40214b40e0ecc14945da53a6b6b557d46cd2ddbc4e94b85228d9bd8d055352b1d7ae8495987903c55c90c42723ae1573acd956c5c53f261c6c96ad727b9411d08e1f83ccc74c2e35b9fed5efde1367bd26a39d6c3839a73727a7edc3acae69d7d3c3df9c0875c3cc2d0c427d36ad2e5ab6cf069e5d192a12d7067ce700e059d691b36f5a641b5ae88864febac67efabf57a6cadde58af5bcd3d365e2441df9b981ea719bdc067d70c97face5b40ea5b9f20b6b58d7cfada8084a93b64f6fcd2d3f523bdddf0957e7846ed9ed4e7c16b4bbe1997182b45608d81b00aff3df7e3059326b3421f20074b7df073f155d4236aeab6bf742fcedbbda3d3835efb4b97e7ca8df6d89b1924bea368d0fed2955b38a709f1e7be6a7f816aa104beaa9627e117dc916ef11c33bf05cad9e90501f2fae731c2f1aa96400959394ec0d7cffae944c7a7cb3a6a6bd9b99738b1d1dbbd65dce6c0dba1912f9ebbf06e5dcb8744eed210da3b9ed5e97b132fa6a60c9901549e9627c168ea592e6d0974a42f7f738744e58c9325e9c13709627f20aa700db494991a9c56a8bd7a62a7060d0f1371b3b874f703460e749ee53f8f7251f6847158e34c6d590567ea6d415ba81ea52d2befbc41e44a785ce0ed308ea5639afe3924d1c3b94ed23a6772ed7454c0a521e10606cda6a8b656a8a569760581a132cdf7b5b9fdb9a24278e449ff2559fe39e8ad4ca73c0fd75fbb8abf3ce387532bcbb7d657919895242fa2fb7866edc7f7ccc1fa813e033969cf33f54c2a98bfc48c53b53c2fa6bcc17f54d5cdf38e56be96e7f9c7efc9753deb886664b3b5c532ed5cb5ea109a737e56d5f82e153c350f18597535d77d7f2295429732d9db0ceb4abb4ca085fea00b0df37d8689844ccb9ff952236318f91df71b6cbf335d6cd0a6ad73b5a12051ef340c48d6bbd5508ffcc368649a97ef4f89212d09553f4bc7966b6d03af2bd0b7084690a7626158b89282e9e1184e0d8751dfc510705bd1d30fbdf697b33a14e148847ce6f699baecf0ef67789aca28fbd696e16346d492e26746419dc59e4ca3281d27a93fb32d16a91f5100faaf8a88f73734d963ec8708d67a3a41c15c5dca5a1d534717f514f000b42330360b0721a77b35e5a9e8c03c25a780c31d63d440d1be322a9e46b13708a0cdaeb18d1fce5b07874516bb1c0db4b664afee467efa81e54205927240bb15eeece12b74cd85f1117732108a57eb6a017edb5da74eb545d0091e8f07ec61e0be23b795f275b8dc1f413b99eb6eb06581b1111e47094ce59e78d77f4b03203081017f358049a43a7f9725449a977bbf4e82bc41235f02ce77576553e7393c6025bbe52f8c475966ea0305abdcb39564da0500d8145651b4267f96c12665a718476eb86058596fd29bd0c06aea4b07e6914a1c09f930e4ea349b57a15042cea45c90718ba5692ad5bd34fb34c08145b88f60d7243088e983f07f35328500ea6d951273636ebcfeef1f6483e0276c54a6a13aac68db76d673a902285b64f0627a4be61ff16c98891f70cbf53ee66c36750e4e2fde1db5e553068af19dd7ffdd149080a334e6f3d5a77adca105c8ef267ff546780af727030008dbef499738dcc5dad9e9e18988ccc8fcab3ddebfa18e49f7d037f2d3b328081953a4912a01cf252e3d482af5d98780b21eb441082f0ad7cd68df410918508a97cde913ae9784a5a523233e7a74c0cb9ad35a12ec6caba8bb8194a84f0b899c0cbd827b7b7de442be28f6f3085ef59051eb9c9d3ecff0034486d1efcca2bcc14f66d18fb1ff53c6fee0f0fc59865ee2318cbc9083bc49ce041848881ff3e0cf98071fdbc787cf321100227d26685b6699e8d53ffad32021b163329362ac66e973423f7a1b3b54d9529f5a2394180ca7e7757a5a087b44c42431b91b252e29122f4ab1dff7835bbf33f606d15df32a540e6d2c4eb91c761d6022eea32ead9f890757fade79fcc1072d6c01476032fa227b1a3dde8ffce130e8e38a1282251bef2d1477cf0bf9b540d657f9050c7b459c201d77d5ba26679e9f7e7a53afbf65323f812d67816b04985a87572baf6bb5376f7645acb7fc627573b1af2b8aed988bddaf28b6ab14dbadff5cddddc1c5d620f4b5b9e8620d62df90a2e4c4b6bb53abbfc645c89f6dab5aa9efbe7d5bfd491ca9f270bccda77c55f53fb16114856c1a20cfda26d42fd4771531b0a7375ca39a0c384c537b9d9806aadbb3e7b3e1a0ae1205a56466671698a27b93c4ab9d2191a81dd2020b3dbf4b32ec4069b042a0897348fbc9dc08ed4c332c316de17d515363e5b4255fb6606e360fb4dd5e31b9515d8566dc892e95337606934190d048b9369bc2753eb60e4e3f531baecd4db510cb14cdc86d0865de526dcde3f4e054f6cc3b9b71ee0d82b9cca2d77f24e7d89b3147334479ade9cf722ad77b8026ebfd209a74ad9b5845c1c05a4b66135372e520ac1786249aebee6415994f06f0d70433e8da8b55a8486c6639d050489f79b020f3560bfddb2fb35294e924cda6ca9938df2ab37da61a3d6a935d7765aa59c1f4bd85614d809a94437586c0f557022896bb1664b52fba0ad452fbe4de0328974dd9ef45aebe843234cfb4846cb7ad5c38454a0eb10c8c63f4accb846e9d34c02309f0cd6b917ab46da31ead68c900751e47addace30b5b770bccbdd4bebd0a6450c48cc5bbe1474cbb566f3b09fced9c215aad56e243b9b47a1542842b0928131112f2a23999203d8d9c3a1b5a1a8ebf4b82385ba16b67e3a5c07b2923facd821d7641a32ac56e8ef47899236f3c3f9f426f678baca6024a5506fa3b76e7dee224be5321751e51fbac3eab526ea77a6d12b7943810a4c2c7d43ef3e0763c8e50ca296bf0463600102c2d1044f4aaedb31568b00e959fd0e316a10787e05b06cc2c3079bdcf02f4adbc321bd5a8717bb99b2b06ab05690ac50da9d98581d4428976d0eaf03646d3d9df1c1be32a4296c6fa5e89335d030b552bfdfc8473cf4264283b5cce19ce470d23a6fb7ccecf3dcefa7add8f7b22c54d1dee5f1d4b137197e0e06ecee1b247ef4d9dd8ace05c1ed5fdaefd59a793975a5944a660cbf183bc9b4f3bab996ba8ef583a6dd5a7db44a7e5feceb3d348aa37938d8cf3974e95564b5663a8920307cb1024ef039531d6bf342dd52bd584f2c501bb8082d8f21989af533990e96cb7cf952ccda1b50ed044e2c3b6425a06f61dd7c1890a136a0e85ce7d49e736e375aad296777c53c8de92bd34871c5de8da2f0d84bfd38f026d694fd681207fce46705465222872c35b0120455233acab8c626988e8875ebca48ad4640febcd0cdbc386caa8dd22efbd547539f02ff0e46ab623dfffea8457779769dab94c9b8cd634b52e933a1a651834e3565b2d22d4da17f95191dd0fe6c266f2c8b2982258ff3768f4a1d3d4c4a6eb862c09b1f19acd8382b7804702da68b6adc91afb8cab1cd59f79a27f70ae7b9545f8a894ac6400516a7415c5966ef885a7bd89679c9182d60d4983566fcc6c0d4ca90ca81332f41437a078498de326483c926e7daa16aafa34f3a6da8fff0a9b6dabae8bb066f09c39ab17577c5feaf2e440550eb34066dea4a598cf7434faad18f4e0f2471967395da5547de3d9180d892e5c999f2f767e9b46d7f184f3774dd9fcbd9d70847ff74fe5e30511eb5f454716c5554f93cce9e7717c36d297ff0fdbf06df374ec9efe3fecf3511ff127b806ccc13760253e1c7ef07ec49bfe498672ce97b360472114ccdeea77eea4df03c02a6ebf4284a9cc3110f5e2434218da7cd475c463543227b61ca2608f92b679a792e1edf417f9a24b834b268506987fea036a899c99d41209ef3d14620ea9ff5b5e5340bca96dd2c452b6b0b423bbbd8cee53bd39a6a5dca1f987c3aec12c734b9db3039825275cc71ebcbe131d15ab6f72f8e5ae7bdfdd3f6fbf787fb87ed93aeb5c56298aa8e60487f69638c8c432bacccd7a1e4a0fdbe7571d43553f2882a1517e54acc45418588bb48fc41b2df4d33081c906ca26e972fea1386f9864ab7149377919e09c79ff105a2d4d03b3fbdf8f0f1a4dde914d425a9cfa9540080da175aedc67e93bbb521db69aeea4ab6147341c0aa5a352e394b6b2505caea325150d34cadc128743eb6db27eacc1efb7e28e45cfc91b5eccff399c2af4c75665b24426ad2a0da72b37c695a13ecd24759045a1a445dd415cc6c8c778316cd546c4a450ca75a81015f0a3942b552dde5bc5e907af0f1bc359bc5d1fd5a0e2da0f8a9fac22dacb92cb6b3629645f63de2029b42938a90f59a453f053980b8bab82f5caed6756b323f5726f7f84402bd50a0687ea4cc952b123c4ae25282e6c2e716208cae1a48d7fc2623a3c5cf790e226fba882c44ee92945e30028b6b800cf48a0b02233cb83b80c470a6a116c85ee0c60afbcc930a207a8c713f8ae201b5486c7255af4ca5b14e459f94418bb795fb0ead5c4d2db79d5b2e53633dbf64b9b8e44e3ead8692322edc5177bf7771ab7a23252e45b27e1968e4a09afad09cdce72012c15c01ab67c1ea0a188d307318de72a7c0e0c679c7b6d21a1641ab08ffc042a89a6b59e4d914223f32b969adf29597bde3ee02148f8fc3d84f42e2adc42043d229b765a5f5ca3de167e0511916d3cdf00e2db100ee73561c4fc1fcde12146d911169df7a9339911f32e3c25722229d87c0342eae191cd7948acd0795c790413c3ad7a853e10c35e0725263c8063efc5c2a98e7e1c27f7f058c49a611124cff6045cbb400ecab9ac86f90fb87b099bc9afc47226b5fd42998f3aeeab2320fdc10c031c32817154abcbc296b2f7095603315aa5aeac3872f39faa88a5879f9e3b3de51b148f0cf79c4af756795397f371ec184c4bb460771114fc18f196981e6ae836568b1591428004c5614d21e86e70aee91c5288475b881286fc35fa0798f9a019cf7acadaa3c97e1011fa7aa7d44531ea7facbd3871a7687efd3863ecf9ef0f2ba50bd43c4ccc8eb11437fe4f71465d162e1ff195dc97a72f5def4e9317b53e6d9bd93c7a783d0c0a9f51e599b5df7dae16d1047e1d40f217d7f20b7ce6ee8acfb9a7ff08ef8f86d4303a387812ca39112541284a389dfe97b29a62a1c991c0360b8e97c9206abc1fa511284cc70c81f28728bb28c15476ea4b83a0f8e717589a8ce3c279ec2a651a6c528d336d01ee907234faae77cdcce7665398bb9d8c5887101e131dcb240dfe9f5ac8b5127662b77b48a3002c6cc3ba710d17a97519c011a80859e492d91d13e3de116abb028ef3aad6c66f7105ac1683a9ba73ecf3fedf727f324506c4fe4f9e753462fc85eca8962f9be5935e5a164e844c547b05b65033e1a5e67dbaabd21af2d25be6de1af719bb9bed50bf3b0364cb1cc55c9fc25f1e3fdc26c67ec21f21cc33c970318a53e788da5ec97799b0bbc8dc9186514f944f92f62096e7a9d455f2088d709626653f58af189ce73bc985af9e8483f883cbb2b1659a1f2ec863e77675becdaee5a56396958d55bb67571727e7a74d43ee81d9d9e9ef50e4f0eda5fb28d10bde8e86d60bde89a1e6fc9f6184debbdc9c4b66e9827aeac653a521fe59305ba27de78d144d6151dfe9c84b90cd069a928ef4d72f3df055e929b499fb120eb16544f1453c575ca37722b40de7b3159b33526d4a85a08b13c565a97a0cc4183abcdd67448619b9e4a15af56c3ab9967787fb4e201d0b32cd402a739a23af864445fa5ebb8d579c9356ae83d47235facd0ec03aa175aa07c6de20af5a5a911a1af4c73365d98e63cb12e3ba236b92cff4a2b4a7d905fbca0563eea5e7b79e53ea37fd403f667596bf95e8af44a0defc3f585f778af462fb90cb3bdec985b261663aea380175e93a05e7d699a49d2576821145da8852062bd1ee894fc3597adc91a206ff18a53191dfe022b80e6d397914e90be98947af48b6e658265e9b6755b8517e856d86dda8994761b5536de4c14f58951dda23f59c9f3df62f0d8429080f2d43b9534dd84c5a51b998cff2b394fb4478122f254d1183fcd939781ee67f0e3b5cca7970ca1ee21387f3085d2458ee6aa81ccaa4bcd0e38b347f0a9374bb4305879f32ac7a1ecd3bce4429392636fa6ccd5ef768dfba85b4c0309797799eabcc916cc5ec299838b29dcafd36d9d1cb4ce0fb4e482c81eeadaceac3c435031c886445c40cd31b2715ae6529d3b5f57d2759e7d0df7888bb473356e8dd614e3154676717c1769997b83428dfcaafeceae483f1cacb920b3e9b672c9b4e6e6f3387e64c8b0c19597323791e966eb515495d0241a0dfc593abe990f8be2f61d9d7e38689f753fbebb78afcd542db7d7fed2a52d61feea89d3789ce85ab787c9991fe3a99606b7bee5922b122cff71cff6513ca87cb51a2c3ad7ad284e6e5e27cc01fdbbf9f0fd3e75c097d38e5541089fd018cd6f3724856e138aaf7c49b92953e985a22618e22300e2f43d43259b6d024564ad24acc06b7fb60732eb0eb4e6191a22e782cbb4e0a3494ff80cbfe30dd266188f3917c064eab5cfb66671f42f2ae2733f7ed98b3d16fe64cdd2520482c47dc57b2e99d1c4cebd7dd6393c3a3d416a03ac3208cba44ef56d70d6d0316fb9c67e589a4624d7253ff4c69fe2dddf1060672a5e04902a14b069469600d9145ebd96730140532530dfcb7eae83fd2988dd2090a4417fe217310173b4d6d6d1d9c79688502acd466d6b7e2bdc42d2e84a3b36edfa20a41680957bc42e1bd5e405bdee702af70bb3cd3cec7ede9586ce17b6a47a5f66bb5f60c979b0c05ba963ab78dacb106f321b7bc7bcf6ca28af9f5771dc753a9b0f2c319405bd5dd869c5b321b7d1d962bca5b085fc4591ba7058804bedb9912b539a2aa1ed6eeb083ccc91abec9817d0069b271fab4b4eaf91af2281a67293477cc1a2d2a833f4272007e28fe2d9988a9126f67e7c7a7ef691863e262781e806334b765b87e72c2edef5e2919fbef312ff301c4ee63e17f115e03203a69f556b0b9615e5a8f5faaad2b5fcd2b5d5a5ebf9a5ebab4befe497de016e7c58cfa60428570c20dddb6d9d7f68d38396ba3917762e3fb8994629170da4f627e1c18ced926b95dad5fc9e995abb4643410c9295d308c29615d83566517ee13526517ee135e6507ee19553a87874f311efe623de5d49d5ebfcc2af57167e935ff8cdcac26ff30bbfcd996e8c63e926123c9e95e6ed813c9d18dc0b6d0f7d88acd82a54eec9735443c6222fe3ab6a253f1c2c60058bbc0a32198bbc0cad02532c9f7e1c25898d1b8708018efa4437b7dcad127c2ed7b9be5694186231519c1cf6a2307deff5a9cd15f52fbe6d8825a51c0bbaad930fed932e506ea55e38f249781d486097a52a7ab09bc00cfc4ea4af112f40a2e0bf1ed72cfc7f4888fcfd583c5069a6c85aac933a67adfd768f2e7db3e8251f0e03a82b6912be63dd76df9df0a74abcc148d29c090b9d173050b82f579ee70bfba1ec92142a533c0ea7effea7bdafb70757226618909c681a7c39bdf80afb0fced9f7478767c619bb6d8147879999f87253ddb4da7883584857d0e35ad4d8bc71176b79eacd4e9ed059b81889a3cac9eaf4bd89df2c5a9a46ae81e7d216252273c41605667e9ccee31b266cb5e21bdbda56189b8cfbad60e2b36da29f3ade5d1c9f896e30575358cbe0e3e07ed11bde0d6c47d199d1fc62c15a99ac59a95af47ef34a8dc158d73a5a3bc8e4ae07e5f404e78da681dce05d64d970ecf81db2cc5c83955805bc04cc3dc3b892747fe1f76651c2a22826f378d8c384b36f3ac4cafbe07f57b59d9861807b304f5a6493beea4fb7fe5dd3365e1ddf228b6f918baf6e252926906df917b79524d5f36b347f91c9674e66f1a05bae9504a3d0c6e015bc372469b59258dbe45ffa5dab246a4b3a7a28e87f5719606a6de3766eb1d29807d15a94f25dbdfcb6c49058658921c9c370a26210a3a9be7f4d9350ec291d64759175020004af79dc6ec82c6d61a4c22454d90d705d2954e6bd625950b9e5506f014ff477ea9acd695125caee96b37ab2351e67d8b746cc0a3eae20629dac6158cdd9b3edcfb27895e20cafcfa230317d4be3c7992b21732daaa42f87209f49eb0e5ab27c1ad664562be5bb6029c0061dadac42bb6227c94e84ec969233d4bcab665efff7201cb1e0a2f88bc275a3f30feff4e7575c0851acdc33320b59aa226e2d0863330f31fef30fefba11ad24f3bc6b74a321a7e187e2d10d8bdf4d27f5f22aa40529eb3cf3fabf5fcc3803adbf7e53b15e59f5d7af2b4d0875416a3f88ee4209f99a42bea934394642074648356d89d82508da2df80f523fe8970331edb24a252e9d88572c563fa8115935888612df1907c3f43c188dd39fc82588249b544390fab3744c86ad9579d8700bdca9ee5acc07f7ae6db128e1b7d696d26607595cf31857165fefac6dd78a197301943465082786808d021d225ab518f456372224aa83be2b6963b8c8e3b75ba4759d23e6116d6dfda33719f2d692899ed7c6db0a3ee7b28656eec978bda62ff86f2b0b90b590594a48268a26aedc5bdb565c59b0b95545f803fff595a4dfc1f43b496e5de90142b66d6e38b59cbbe58e18644d94d4af2cf94e26f35e61831cf877ffec46f0f185dee10030f38a252486e05ae2d08b352a6d5adc2a93029663bdb26cfa739b424392229d966e84d9fb3f33244dc8edc5fe24983d993080821cc4204df8644763c1e8bd056ef75ea2b3181965d66998330e79afd9e4e736efc72d0e03a99c69e4e5f55f10de7e57e7313a017556863c5e071ce8129ac53e79be369b04fea047ae52b21beed979fbf8e2a87b787674d83ea0b73157a670f7f44a53a67970a7a297ae301af62e88622dd63bd019661ce3e1ddf5f0a4d36d9dec1f9e9010f80a8220a41110c4a95be6829d5a29328d06fee4938c07a7950117b458e0d1ef8d15e8121a04e998beaaccf4e0c161f763fb9c119de937d712456d2b930bcfafb20ab368a4d4c31e5a0acc326c82ee497f1407831e7845167be1c0568d3bee17eaa981e2ed25783fe99d7f7807eceaeaaf2533dd563fe11708c7934145fc0952e941cf45d6765e86da0ced90411b5ece14d34f19e2f99ee9ee50f31989bb0a7a5593d3549728e5dd21f45d074e0571d6811fddc5b41af9dda140a35ced2ac4e74bcfabe5ddd824e69610b5b42e462eacdbd9896455d0bd6ce56653f2a240778a7fe7dd7c13f0f582e565a33aad43b5f628a53086904e6fe689c99a11880c11ead621557fdb561c0c4d2736fb4e6ddd606a74118959bf1f4d675eecdb70e8f13649154b756b7e8b2cf906d88b7d688b4edfe892403e2c1799a455b0c438eef9adf031cbec6d486d02f22048d238b899d3f0a160804993056d19620c9222a89d97a6b5cbba69033f758ed9c30a3bb7c24c67283c3c126f8a5d6075448a0e408320d7d11a0a0854745b632f1ef412f1d80b76b98514e4957b2550132cb8e1322b292d3ad340068fe238b7759c4db5c8ad178b202cde3db1e4c6ffd34859902d424970344449344c318febcde2e8c6bb0926414a2ef438fe57962d7e9725a55bf2a7d3a4f87230f527de7486653163feb655adec3071ad5af9f9354f203e5385f043f0c3c1654849d3410f2373251a366891cfa6adc0adcf49f8e04e9b937493ca045ce33314bed9c9466c43948f249283e8f288986c7222036872947de54204c27c0ea67da5c18db5187237a4f2207c1fcf93743efde4f72dd7a289b682f2defad5a57da7a6fe42c852531746d80583151d4f22828baa2df6e84aa1c50164d6ad21cde8fa492a09ad83226a855f8d150224bc4a0daf125d0d828b7151ee2ac50e4f8df0cff6dfcb1b48ce4afd099e10542aac739784af0a637f0eeeabe4164f9426c77d63ac3f5660a11758ac28705fb35cabfc981af4022b6ba86371febe8aa55c60fbc9d191dc454eeefd0e295bcb294b72177aae582bc2d318b1f1d47758b96cd595840fb7f4cddf3de6a00ba2ae50e7946395bf0f3559182f837a705f7b39d4754446ecc53ae425500fee775e0e3539c1bd585f3f2bea97e9d8976a7ded453b16b38e179bc42f819a4de297414da8aebd5c87bc046ac6e64ca8396247f8cc7a65d5de2a264793e2cdbbd7397ddf7da61ddc72e1e69ad9c294ec4553a99258ebabed57018696cbd5fdf35bb10d334ae8751510f1e7b7d6b66b0dad2d59e3d3f74c7cf87aea90ce6fc1307ef73a07d8d87cfb6e6ca27f0af11095dcbaa46de7b7145912e795511960c4c8747ef96815ac437c12fd3eea8d1dfbddc49bb13e23ed64526c3f27f104236bc13ad42fbe837adc45cf4a3c46f89db43f7eeaacd382abd47ac2f4c9c1ac232653486ddbe35b51d46dcfd094754725a73d64ac4c7bdfcf6b6f7d9f3ac71285d8128426ee31c2a5ac8fdbcb008cdf23b51acc8655ed0d85d75499fdf98ddf8d2e3eb13b1fa139149cfe37cd3ecfbb493e592e0dcaa5abff884d4037da9fdff8ec05e72b11e1eb53e51e818f05a2ff42fb3a827acb8568b86e524b064e3fe9e480e4427de66ce2851e311190320273f638994649dae20ff16a249ab34463803d0d7de1c91596861a11d6a65f5d50063acd18929bfdafd6af746f92f394125ac152d12ea9e156c8442cd2bac47f9f8b9f0d43300abf080bc35ba06a55eac1746c31e032eb47f29557ef628d7a7f03f52ef2eabd57eafb8d7ee9a00b85c4dfe8501bd5927cf3a9d55fb37b43126d870ebddc9b76de92ecb7afb33a75dda3df0b2b315528e89e2f9bfede8b9515582470db9aa0bbc5f277f9beec183c8774237071ade94e955530989137b21312f8d1ce1476aced4c8314aa647b4c80447d3d981915b1f479c760e7403547cc50d05c5303a9bc94c83de51441291b02199568384cfc540cc9b655a34f82551d20e431e054c38d33d694c525d3269d52669557ee170ba428201d84476d7d213f0ff1e2a510df2fee5f8ae26745fc42adbf7fa9f17a29c4f7f72f355e3988d790dba41cc596d1f78e6b46925ae69a35185eb33ed5a861eaa5bb267b86340eeeffaa260d846668cd2089fd6b19341042155b0649e9cb9b336427cf77cf9bef747fc9d1e97edd0a3d22baf9d313676f5977513c199cc1a87ac52ef91e37edbed7bb6e6e9b8d5e5b5dc3bc7ebe56164cdaeff6f69ddb4ea3d768ee36fb795baacff8e477dd0c4c331c38f692df6d25469938146b8f3a1fbf56d67433db7cc175b586775983f755d6055baee651f5a9de5457f9512df4a0fa54dfa9cfc90272dd717fc7d8ad6610462fdc4f1dae4287d4b9aea8cd4ea81fed7efa591955411883ef188e3518594ef482c78ec8637cf8e77befcff1dbff688ffd85befa0bbdf43f62504168345525b82ca1e4f720bcf112df289bfce3f0e4841bd26351ea260afd632ffd427ddebea35fc4651a4673180efc7ba17682057e2b2ab03014f8675181af86029f8b0adc2926f2383d1416f22b9aad4892374138102faf73f30ec35b3f4e94f796ef4e4fdabd6efb4bf7e2bcad4aa8e360349e01c5136e4e971e649a2a245e3420175c5792fab5c6ebef47b26abb7f59ae15585bd66ec690e89ebe7bb0ad7f21fe5857ab18689478a105f5c817c5b6f52febd5fae5c88d303de0e595315d12af5962412ca2c8217291b900a6d2bd160418e042e28a8820b8e70890b5501a42f1d41f83a7968f67e73178eaf978761f8367c78447ac2ffaae7bd7b66e6bc8baad23eb7607e10a1c5d938581a1aed6e063122eda38200e7d8e5b5f7a7885c8f3d7636734a454c51d84a91d38027101a59a04cb99c40afe4075bcbf07e12702475cbf70464015b1794f9640d9d01f88e74dd23d35cf29bb92ef6ec1bae8078dfdc5ae0db2657e2b28b3c829f3cf82325f73ca7c2e28436f9fa0b327d7b2b31c9315c2781da686568623d7235d669fc2e06c0cf8d455fb9565965da50bad2dd1d3c5900b09f95b31e45709f9cf62c83b09f9598754a695da5b62aa699b93e2ae8e4f2ea5004d8270cc7442f47ebebf005aaa2bfc1dad40dfe58e8532f8f565c7fc229b9e56f1bc4e1a93bb08f53d150f3a99794e257c302bec9023d31e53e975087324965e89a12b2d033495ce4ccd29780fa5926e7a38248805c8d328f4a7de6c96794f087c0761b9e3b875767678f241f1dc0c9f16a664d2113c2b1e17c21ab3cd21cee9784c3c19d84f44c9f31cfe32c1834f0ee4c34bd5d92020ab7d3f8b122a11e5c27c1e07a94fc4ed267347403da67661ebb20f1cb9ee385b1909ae489dd8720707e77e108ebd78b002a78898626e82217e202df14a8bcf5f16681d359ce345d81f7b71ea0fea1ffdc9cc8ff11eeed05b769b6ce85be4c148edb5b5c5a4965a95fa6ca068ab953afdaed6d9559da1880ebbc303159262af480a82a112f05092ce90e43d7b47655bce11be32e451e28c93443cf0e2637b3a4b8369f0d51fec07a11f85df4b795ff84fbeb76127218687746375d7523c11903092bc497840de54ea7c1a72e1930d581e4cadf2960d5bf50df12b409d5b54ea5a735bfbedcefb60320dfacf3e4690b87ae5754d694175c7d0847a6577476de7cfac11b55d4e7709cd6f4dbe886dd52fd8c527eaee6a03247feaf43eb5cfbbed2fbdd393a3df84ff2aa9e3afe31d00f0395e9341d4b8f804b74515f395bcaca7f81401d8501f3c9aaf74914cc8caa5086f6179aeace7b70637d5185d7db53b7d16adc4e4e1f954baa1d39a5637d502487f4a1d5e4a1feaf9fcb163bd995775a633ebe6deac7f2f4d24280bedf5baa9dbebc67e27eaf55954d023226c08acfbe090f835689bdcb481786142f851b4f8c5de1314394ff59f7095ea78324e14b2d7057256eb85893b85dc92bc876ebcfeefa3389a870332371ba5ac4894d60ff03e9f5d5324e6fcd40b421bba8b49fd7b83e3fbb47e00853f28fbe4b9be878eefff2b08fb93f9c0b77e318962bfaa207ed88f0641384a20c052692b9e0f8d92a14d05bc21dbdcf51981127040cc9099704ebb40f41d239f26cb12eacf6f7c3626b069b758c0ed47d36914aa2ce5575d628b665e9f461a02eddcb16e3fe3a920ee168868cfd1933ae7b73d16e924884288de34de3bd62d0bdb8f5b9541ad0ecb2d3c6bfc6a98077e78cba31968f23371a92f5bf44c3382b437331756f411e97b6377a8a5f002e0f34224ca4147ca0ad5a739f1a2c7d896d618d57bcbafdae4227132f46016cb12220feec57c1a5a243848efacb5ff0f7c60715d6ba75ead5e65fc90cb2e97ded5323d0168a33ed094345d98503233c7352597f8c02906c98d58a340f527013b4b4dbcd04f32902a27f8188cc667b1df0f92200afff9d9b4f6f3512b5390704425d2045ffbca86903f1a99c812da2a00d749b04b73d681e8cfa2fcd44fd23c00539c2302c2bc21711735ffb45c22436f653af3b27a6dbdcaa6d6ae858fbb953da2310de69b4c9ce6b621190ee2fd25dd28e660af19b167fcc141e4ca18884546194ae13a51c55e256b1024b389d7f771d76a5650eaca31073850604cf72fc5abc700635c3b02ee3b568e10b2b549a6dd93fdaa494d07879db3a3d67efbb87d22a3fb699c535160feaa8364a36e6440325ad05ff3965b01a7ce466530b414a8beb55c7d26acbb1b9887d708a08f2d00d2c752db56bef27d85b9dfc08b836f2f4c77c2c568299850d794fed08ffdb0ef037154dd74b00878c0f06632874a9e61db8652ee5f6baf5ab90bf1b562bdc836f3721b84741f63b9c27c5d1d0d6b3b3bf022121329675304dbcaf033050618f40c00c421552324c178d8c8707401aa4f67c6c833d3f93b26dd5f85f1af60ea3f98f69fc7b435a5c52338f6674d05a01cfad945d0b284fc7fcf6940e8dc137f9b413ceaec987f2ea23e0ae5b1083abcd6ce4ce2bab6cee8b9f8446f8bd80779b4e4254168f31b0e81b8b240d4ad31023100cfdbfb8767e7a7fbada3ded921103105be7b8c2ff54288e82bb0cd230f80353c7580a848e7c1bb1189b6fc99ea0f31ec7ffb03efb2842641e80fbc64eceb7a2b36d9c85698911de4d1494dc79898958f7eeb957adc5d8116e6130f1510440ab93e51b7170806c368f4f247dc271e6189e29fd828294d46b26f2cc7fa557421b4c84dfa5e3c509ec3ee58d13c1d454138e2d6858648e139a20c4bcc1ce8561f4ef5815032758294f3763cba312d5876e10e4b224b3ba83fd7ca8500789ee46415390fce2c19ca01d4a9cedd8d4bedbff4276d10b8bf6f15182412b1065ee6989ae15d90728bbd7d2691da950665278f91453d4e5df73c0734b5eb20739cfac9f8c64b82fed378233730d0e3b8291b8616ace33b1960e1b92b737bf6bca7322f5aa161c4cbbb18a4582d9f812b60e2850af875378c5c5b98bfd0b6f2b27cbee0086bd8029e51416ab2aa2220e76af0782d96bc6ba9f99a21c35a1fd9fb457eb54af6e350d8ab92097dcc644e4562e539e4aaae0ebc7643da2a8116e6bfecaa28a518ab245b0e754c2f520fc3d40f13a9ca16f7f7abeb03b63bb97a70baae95415881782b67f7370a2ec5b81e7ff7f5b79429e44ef37d4a6fcd742197699af6fd274b157f150dfae3952dd2a0c2c8dc9ea2a0a1861006a9c6a05059a59359a99191da127fe8cd27e99fadb4f93e19edc90a9bcc1c5f5bba9b78d31b3fd6353839f21d0d13380d9224b82d92fb54018f702012362e9375c8781dcfcd89ea69c0f7ceebffae1b1301842cfbc957cd392139fe4f89a26c9cff6202eb4d321826d9b6305e4856f663045cd54744218cfe30fa3f5f52fec3444d1a3f3a4abd499bcdba736fc0c3010086f3b717decdcbeb31a2257932d99ade043e7b707a18c7acaf6ccb03e9aada37275af26a01d910f4734f63dc5623c3781f2b85eb1b8179df165ceb91b2f8bbf383f73df6dd3ba23b9e9d91d01fd957fab0983b4a6e7eb897d4ad2bbf8b74dcea1eaabe0e2e28f888a65b5bba8387e6ca43d03aa7196da8571c76acb2990bfc5f3804a9777f7ad0b1acc4a6de291fb58edfb5cfbb7f37d9eb654e728f9511fee4939fd151d5dff36cf83c07bdece9f2fb8f817ff9c3df5ac7bbe21362d1e18fad00c83db2cdd39c5ead717e9c7a699fb162c98c8e5bddfdd699766e5cff2a55da0f50ec19d605c351ff05af19befbf4567c66b9994f67c5e5e9f4ff8f3a8afc3de47e6308fb1530536f964871ea36f0ef0e8258b36d81131e1e99ee353872b062282a5fd98bdd6d9172af1eb84830b3384a12510659f7d07086046f607e27a2d4b6ee9108278e68ca42a6b010e3bb3fbf560db0b95e903305717b4017b7c1dc85662831eb5458faa55d1140904ca07b438519b34621531be5da8cc8bc05f1fd47ddef03beae0a997c08ff686e5c2025168b6eeb5a42fe672af7ff9e729a71f65ca5b7c22d066078e06524cbcebfc5fb2b5b6abe80f5c655aaee1aaeb50d025b4b1b4ebcd8d388695be552ef9e9e9eac14e0f2ee03483ad7816504be641c84010bae9c6f39f24361ff320afb51ec0d02c80e9f22813ef27ccd72c934fb3e5dfcf3c8be3f94f53f94f58f52d67f975cbf86cedfbc548a410a89d1610cc4e8207e38d07bee0f52f91acb0b1750b9080044bed2f86f2f8fafab1626334615d7e91efe1712d68b54baeb8aea3f74b5ffe1badabc29b9befcff7f49fa5f43c85f5f7ffc04fdef6c1c317624f9ced9c7d3930f3f0e0fff818787bf9879fa13cf2174cefe3888fc3888fc3888ac3a8848fefee324f27d27910c77fcbf69be4227947a506102c37fd849e5affddce0c741e6c741e63ff620536408f3a443ce2209fa6c4f956cabd36d9d1cb4ce0f84eddcd9c7df3a87fbad238291019db7df1fb5f7bb879f0ebbbfc1f4fda376eb7cffb4d58589ddf3d649e7ac75de3ed9ff2deb63fb49af32e2683e1a1b0f4c533ff5262b8f52a4612a5dba6b3f3279675eec877dd5bf1f29ab7780461e3b00dceabe014959a593d482fd89efc5fdc84b9b0579e7a0f11a6aea82b5dd3e81c5e9d973ecfb2128f08cdbd255ae737eb500f3bddf34e5bd0b5290ab3ae3ff71f67db9b36ff6b0b9ee21f6b1a766ce6d9e7a3db7e62178652d7fdc39582cd80218c1c88a5109aef6e34cfde34cadcd9a3ce2e09479d983b79ce8eb20cc87fece333d10677e1cebbff7586f949032ee76b7a04fc15ac5da56c426ab4cfcc57871373af7275e1adcfa47f36910d2675ddf4bbf93318bfa3fa46e60735dd53848d1fd3f47bafb71f1fa435ff1e7ea2b0a16800c3b66c6c2f3b9c1b75c086a116eafce839f09c48eb565b1122c766876f9fcd0a3bcec8530905224ab3d393d3f6e1d15aa1864c01430f70c615cde5d1c9f6583acb089d6396bedb77bb43653941b0377971a81bf28977fb467e9ff84b7418f3a587c975c6e9482709fd3c1266e9d6df0e4059ec9e47457250b3edd7f4cebe7125efe6e710c1e2f44fc10087e08042f2410bc2c1b5a2d6b80982624467ec2a483477b122de01dabd4d38c69a4417fe23f5da9fa672b0cff6c8fc74a2f3e599797d5d5fd9f719bcce6ffadc965b2c96538f7a3bceedc7f8153f98bee864ff382bc9217e745350bc294b81577796f2b9b53e7f09fed56b7db3eb968750f4f4fe89e731345132b48cefc3899914b4a5c5af9e681ee59a541142a5ee999d37315856329f46cb996cd9c46bf5239e8d782d78c7f843b09fd78474f832606ce832e3f9b45eef3da7d7ea797b7cc1c367223d20792c36e593c8898e65709f8d77d41d62487eb56f3a75ac413f2946c05abf8a90ecb9f55f190cce220f55f40b4f833fd7cfc90389e3dbcd4df58d690b3dc2440c451ea6911d088078fbe1fa67efc1db1a4fee0600a796765eabfe3568f4a8ccf1f2232311d28e2f244fe558373b52e64aaab94fc22417b44983132b94168994bab6a5d57ee51366d6148fb2a183b45bd28465d33a0ae1950d714d4fc48fe878b2c2caa8576c6fb9af59c52b7bc49300a7d183e4a09506c6d5b369b97d636f32ec3a3e4e333bb1c22828dcc6c5f8d55ada59151ec47892d960141a4d151b9b7b62d12efa9106a61ac6141c4c65565efadf21a74d01a9493b255768d0d55633d67466c0b8c45017b7dba7ca8edb34b1485ee37e2a6bdf18df199a4f131b52fff3bad50be82fe3bad80770cf8939a35e15fe4be1fffe04659f8f7301a5d3b88d682e5243f6e786145f5078f38233401e0bc25628ecd9e8f2e604fc1c8141009fac6731bdf6ebdc9dc6f84fe9df5ceb7abce7299d31ae8792da73dd019f712114bf9176b0fbb29c03fc59500fed094558f6a3ae2146959b55aeda7dd9f6a18803fdfe3103bd5dc0e932f0572ba4bbe4d59a224f5c281170f8afaebc53a081a19e16f6850f4b80e1498785ee5f512097430d10f6f61e40b9e552be84e600991dba3c0326889d2280a1f31019fb95781a7923f71168a77f5395d263c352c11f59955d4618f5c74df3846d68ef964924b2770d895432970d5b864caa82cad343d9f2f032596a11aa0e25d221a22aca83b481bc97e2fa72fe2f1df40920810c7d3eac66ed0e29219e8d382fd2d699ced2212b59131d42a43751b2a94c1f297ecbaf039a6c73776a82a5ef4e03ac74019b8145db2934596349a9e3f1bc089c4500538952fd18dd7ff7d1447f310ce886ff3db2ebff281ab75b64469fd409df799ca25c63c02000425a23fbf31b492ed0bebf52a31facea98fe4d19a788c4cd85811c67345c394f89a866a94b0ab4b25d2f023a632fa9609a30c87e06e89607464b01a8786547fc7d8599920c8a625a2c7fd5e32cd55b62d8cf773ce41346e06febfd63802ed9869ea4a55e772d91cce431a9734096d1fa52844b1f3edd68bad0079287245d52871aba8efe2614513b78ae6e4a72c3eb67d143adff0421f0efd38a9901654123fdd9ff85e6cfb9518f99511f22b37a48e65eca7f338fc36620044ddd0e0e86ce71bcdb7a2254acc203e4a9d6f11aec1f61d34b62394b8e4d05ddd70dd742f6de0ed90a36f4d6663cf803e91e83510dff94671fa5876f143dc7b223345319aa101eda9a11b83e588a6ae5fb98fd1c89d56467edaf1932488c2cd4df8653bcd60688f36374bde6010e06368c975dd115ead411c8578bcde4dfc70701c0dfccd4d7b48fada41f86fd775877b8430a731dcdc1c568284f4cbe6a63db687a8e6a081bb517590ed57bc791a91963d3c0c9ccd4dbfd2672321324849041248c86f98d049fdb01f4c1c34c474e0cae6377e97fa337d78c0099ffd9b0f4738f59cf451975c5f3c3cec54df60522b4c55e438dfe8d8b8aeeb6d6edab647a6d67e6ae37f2e52bb866a9878fcf529b5bfa58b99df28bd13bd8a2b38f6523f0ebc490989c5f3afd48e286faaf0346d39f06c98a82f0a0ea326a32418f88d1add47bb7e923636d8c767b2a36cd4d0301a35366a4bc7712a233f9afa69bca80cfc899ffa2d1e20d42ed1dda8e420af00687e4b00a2f09d3f8c62d6972e9ceb64758d83a4322507641255b8d28f660bcee1ec1066394b747a838fd4157add7d1647333f4e17b687a1483fa21215b44b08af42c3e220d5f17ead50e00a613ccba583c2ca7c36f052dff61ca789d7c1ad9b3b1ff68615e604b7316c4a0accc8dd5b6402194e82595b0153a7e3de76ad51437d3ceb3637f13ab9c5834e17dfdc755dbf9246a17f4ce7e3c303e8884ae8fb83e482b4c6ddc06c6e8826b2389aab651d9456e661320e86a9ed81510554a32aaa92e5ea2cfd49e25b6ca5324a37376db11802bc1802b818e2d0aea37afe52c85d069207152c0600b462490048d3c2a83edfc2304fd4004cd4e9dab334ad1f18a668e0382830cc2901ed0ed14695312cbc865af334a213028f1cc5c2b48b664c40daa318c9dab4393e074ecc61f1c40c564ccce13a133340819c988161623acbe552ecdefdece6efc67c31d79ba48b133fc5fb910b77c8c0f59788e4c61ac74a312abf3288bdbb561c7b8bc40e104e936312a3c0510a1f86545a4a2496184528417de75b30b4f1b6dea7e44dd01c6fa09e33717d34774bb2168e63506a9285170c6d737eebe4c351bbc4b7547be2a6787fb64b24bd1770b09e478a951cc761d38dacdc7e1426d1c4aff8711cc576a9fbf1bcddae90ce7a47c41fcafbfcb861cd93201c591440544e813eb0e1b16ee6a935f6e2c19d17fbd620f2132b8c522b99cf66519c5afe3dd18344a165a6ad52729a93cbf9b51db0ce925d9ca000f595819e88bd04f7632ce5b7c04e492f97c6c1683cc3e208fdf62bec8ed78fcf62bf1f6042dee3859bda3bafdfececa09d373b3b3f399519cffcb58a458dc242754321d6bdacfa66ea96a6fe20984f672526298a6f4cdaca2a285d6f9f42975a684fd4db284da2bb5969893bce734bf390d99195365ccca2a3a145570b1dfb201ced4721def436377d8b8f592ed0c3433ec2fd683a9ba7fe5a787360512445e350366f0ffc6eb0ae47891bd891d34c365c37dadcb4f954bff3e25099e9628e9750844a60c6fa0344a77d0925a88449f4bd41a5e4a0c84da8a4d07709b30d2b9368e4c5413a9e067d227ad28581262e19a9332ff6a67eeac7f6ceeecf3b5587f03b35fdf59b3755078d33e93b6f7f76d02c8ba6faf60d9690b3e8eb35070d33e96f7676df3a44a2cfa4ffe4a09129fd6707ddbaf35fab68e17a0f0f1b1b8caf9cb63b3d2602f5c8bd66c969b2231067b30d0f1f578ebdfb561824511a47b305dcee82a12dc630e6dc2826fd1972eed5fed295b50493d48f7b1e4716f44595564c4e147832ec694d082bc7ad2fbd6efb4bf7e2bcddc3bf5b27879dd3eef9e9d96fbdf697aed3a82e19996209350224a75184cc83dae8a3a977cf24a0a431c15f9f880422d2e60082a8c4c638018b78536f46126638418810496320b15c70616848d2a8f176d298e2aff74c7e113023261789aa6f1119140e28d217345d23f476737381f176483497a4e1e9bdb8f3a6f6d30eee2ac979e7780cf160f92edef3504acfd2a15b45b1bb514301fe8b9e8a3a3e3b79cf50e2027d0a02e20016af24f7eedbceb784ca1d1b843ddaeccb4d51a2481198d522bf12cea767e472cc0de9d76198fa7142afe0dc2ad8306c2216a08012dfe71327dd4b2bf40ab8514513aa0c909b7430b4272e23016de0c4e0e181edb5138a69eec6e5ddad3e1abbcab9e530c4c28ddf8c708752c36726778d1d6473140f0f1356fb2f736773d39e90ee7a8f876aa74e767a7bee38cd6114dbb8ae995b4503376ece3075cd727986066577d7f1a88c965eceae9d8a379b4d16b4aa5d7b8c227c1ca3126a258d28ca091a3868723928ef5cbbb82c61bee99277f544ebea8d2adbba2cd8df7d537fa3c9128ab16e42e52259aa2a12b48224390883141e1603e4d14e8e5cdcf73eebab8787e0e1816c010f0fb16405014add89ed230f551d140a681431e98c984151332f209a61e16fa38a26363de650503f1c98016ba86f73a0c44f3b29ee2040b18722344763342373672316b3c57f78a8ba4a133637372227d8631537fab643443dd2de811bec551b211ababb5b033475c7157e174c6aa4589b7cc0a6684a1a3e47433493b365e4569ba30dd71d36cbe59133bd1c5dbbe9e5e8baa92173a7e631f1f6d4b16b54b5c12cbb0328928d89248d2b4edd6fcba6d48b49e61faadc3fbd0caff906807f37a92c97dc05697f8c81fb5ee2973eb7df7d38ea512d3ddb134a8d986e596d2e53da4630e7e141073b3efd676f4dd0cfed77ff38ec9aa19b37b1effdde2404aed8ac0cb4aedadecc643fbe146bc1cadd143486b6b61f4d67b19f24fe40144c7652635b8a0b148ec0230a2963915b6ead86cc6ee347b68496780255ac20238b3de1c9d61c722db2c59845bcb9b95a5cb54ae5b05c02c72a4574c5722a5e536e8c62b84a67eac189ec379f7deff7636f8602f82537658fafeb081fd3891e0c256e4c24b548b29bbe15d0066cb82e66e503ff7e7333adc4fe34baf56d96e2a0a4e209b9c701d932f5b27fed342396d3be25c17293d40ffdd82e0d826416257e09790e8a992a0613414ed36e40684a9ce66473d316b8270e0a3868e2e063e5d49f46f182eb15023fd9de963d14f1e686eee535c2834528479eeb03222bdc5c0a456e154b0cace54cf180fb871c6b9b911b733d87ec2abc53ba09db0b9afd5f26cd7ed9dde1024572d92f57afd198fca85da319f951bf6e8695d93c19db788319a3199aa1b9b3248ab96f89eb89fa3ca53eb5ae573bdb3550dfdced97ab68ecf6cb353473fbe5bab90aba2585fe9deda576e8fcfae6f5eb9dd77b69daf86fdfb14354739a035ea71ba1941fdb076867f7e7373b7474866c747ca73904f362880787dc7da001bc4cd1ee47883287cdb95488ffc1c3839d56bcc1a06096a4952051f5147b819b3670324f807accb4d2bb51a0c94cd2d25ca2e01ca40ea6fc7d1c4da9e6cff61d0705591478aae226a62830cebe7299a89068af293737741af219182b3350cca6002cbc10772debfe90753f8a1d91165f06d724b94e47054f6af25ca39583d773f867e47ab830bd3f8bf8dc4d7ee937937259d6105d26bc0672c0fa1cc4fe109f27440d9916a6726a04433bd59add844d63b3ec9750aa1ef17aa5da69fc4b4c0d8611f2be81e96a90b0b2c76808133f3dc47429d9b81fd3c50c1f78fccacd22f593333f6e4fc845ee6acd22034cec00c5c843e956f468fd621f4dd05ce817e7b4816334c33d9a3863d74733aa3fe47519348c79109a8e71fc5c3a46d28d5c8bf847ab1ac797b36b3b4013e4a1fe5684e6a0c72728206c4fce9c21946dc96c6e5451df9b4c88541c075e389a100999d9ec54d1242022b39083e9a26f7c93ab1e97e407f1aab89a4dd12c8e46b1374de851d99ba7d1b99ff86963a38a62f2039c48d20a21a65c46698590834f52154110f9a224919f8428b76a6035745130c93b76e387871a47592e23268a5bbb0d80bcecc65bb6ff6a074a5d56adc16a61b975257747cdddae29b97598ebc39c6a833703667179aa68820da3867511fe1e4677a185e73631dc6e94508887578eef946d336cde1e7be9b8e2dd24767a59bb76b6c5a78f3f65a99172e24161f6f0fe93508ee93d1e23c27da4b440b830bd653c0c8793b98f5738eabb62674af6aa0dbe8da3899b5e06956070dd14072aaa9298b897d78283cfdd6a73fe4bbf392f979dc9e5fcdabd9ca3ea759315752764631fbb1eac3cd9dc0cf42d410a3b330e4c551a4660aa6d20444002be61c6640f5d4c887359bbdedcb4c7b878e63e0d10532acf1d34cb87a25460286799a94fd455bd76e7687859bb7693cbf9f5725249a238b5a721dd02076e15d0fa132d4b2416dcb70c074998bac3cbea351ab91817b17c70be9126247e9a4b3f1a5f4eaf59230c70a2056846e0423c4c233428bba3663f0ad3209cfbcb2549ad2ee9ed74a00c17f745b6576bd4b60754dfc4f5833611503e7993b96ffb0812f6ce4b7c31cd4ae8d6416b169473932d22b11a6ef5dd55394de42c03b67e3c37669b1b6568641b15d77e09db707c1469fb7be26c503b8c4811e712c6c915d14ccaa509973913e4390ef22b81dceb8efd64bcb929b6022c83d01caa5263920d4a884d17163215d5366c32ec9b85e81bc4840ebc613bdf7c799de1eff98dcb6b94aab63f3bd51abcf388f6a246ad5aafa329e1cd36d1c09a30537961380966bfb91b3549c83d182488831ae65025dcd41bf9eeb781977a0da6694277c1201d3752bc2b8cfd60344e1b21fe4d4d33f166c10494a9377a4f140c6ead5add6169419849bb8bbdd939feaed1ef1196dbbdd43f0e66536f96b81b35b5014cf3a42a2545a36efe831a1585156ee1edaac6755158e116f4e2ba1e7d13fe27b9295d758944dab166988cb25e974dc544667e79cab63ad02e184ffdb15d4335270397c143fc371bcc02a1bf4549d9339acb2fc2ca2c8ed208cbea2eb3d7e8c73e5eea5399e3287054431ecffb6914bb8b50cd534c77dc8d6a8e11082c834a643626c59620048658f529dc12cc66621a72bf6683eef31a741faa794172e0a55e9787fa26720c6ed7cd9a15dde4557413aa794a453b07ee46956cc73d2a464dd11dfd711fa263faeb26441dfa6b11a236d1ce74c9df2d83e4557be3a02343facf0e3a3324ef3a52df75aea9c8fccb2ad9ede35fdceac3432ceef82dbf49f7b9742b449edb0e2f03551cc31b9397ad2b701081753d07113eef7c8bc5dd8c87aa52a516b9357cde6e4618aa592e474e527643e45f46d7a04022d4879ee489fb4ca225a60f5468c448d84fd6828d9aa88adedf71d066f84bdc0ccb650717bf0caf5565fd468dedc290099fb20a5584a98e106323b864c903a0e309dd6e78995e37451f869b9b361dafc350f460ea2002e686b2af62b7da8c593fc54e78195fbb7ec59b4ca2be97f2f5791106a92d4488509270a29040d658dfeb8ffd667859bd663791c234b33624db4bc51b0c62946291ad7aeda6e05c7098874db9fca8dc3ba424f9b9b91962f914ff5e3c3cc8baea4a5d957b945616bcc6ca3d22857012bd3a0a86f67e688728e527f0264074ab527d4a018190f2f5fbc8c6bfebf4f757d8841d4313505af96a68062218709ed049808a6359710c2a1e818a6f0a2ac67f4628addc888a635ef188577cb3ba23775677e4efcfd791f8f70efd7d07dbb69bd3a928addc15752c22e830d0ca86eeae6ee8fb9c869285ef333592c21263a7a84a2a63ab5315cb49b26e85e85860380b893c1f6361be18d759c890c5b021ef5ea4213b8f6fc8515e4332b88e8c0db9789186ec3ebe21adbc866470b58c0df997b60983a6046e98c7d829b70e146e1d80ea0207611897e8e1136fe877fc54883a76faf0d00b510038f9c73f800a4001dbdd1e1eee54323efc9164ec908e385629f8f4470f0796aa311d1d958ecf8fdaa883151bf5bff3b0b1e5a0ecc481991d02745f1e816e6735badf1e816e7735ba7f3eaaebe6abfaee7f183a2016a92448d0ffcd800679a0ffd041f56e97a0ffad83ea5d2a41fd5803d5bb4b82a631eca5f3d04ed9ad4ff0d54775274fa00a018ab008c58e93274a401471118a5d276f938628827551e46c9410975784ebe70caecc5e05714545b86a6f32c832fb054496c41a5be2faf1c03da05b4a3367d205f2e4e0b9d5a6b7e1ba71b35cf61cd3be70e95dd3ade1d283fafffecbd74ed920a9bf93a97f122b0faa8281eb2351871b22b9c6f129995f5e7ea2ef44804e815dfbf8ec96e775adfea6c1ce482721bbb979fde6cd2e4f3c0489af79e25790288aff2e13df8ae2ef41a228fe0e248ae2172cf175adbedb10d9559efd1954f956e6d778febf41fe4f32bfcef3bf80fc9f65fe0ecfff4d562fe8fc27a093e37c53fb59fcaccb9f3bd53702e94fa2d27f01043fcb523fcb526f39e80709fa5355e6839fa05a41f5275eea4dfd27807547fcacd5642941d6c770b9b45372870d66d8fc09332cf8eabb295dce4f9a72ff639a72696c9872616c9872716c9872416c98725e6c9872515c38e5fe77c594fbc78a29f7df2ba69c1f7fe7f44ae2a7cc997e6c1afd712c358e62e413ffdf62aca7deccfdb65cce63a0d6a31727fb644e640d3d80d8a1bcfa800ab2cdcd546aacb8466a73d306932da353e3600e917c52e43b4b3486641966219dd8527fc49b8702b74ade8d31d555b0e1ba5eb35c0eb8155c7c195c37237843965e469560704d6ec488527016bbafeccbabbbab41efbaecd857d7ce9e7d75f9705571f65e8da4aa71200493c4ff37b5bc4af18969eacd2e5372479b0223046dbbf12ba137c5f2b7a014b7651657265ec24c54aacd26bf609bc515ffdeefe31359e4422094b8de65ed1af5ddd275c9755defb27e8d26ae77b943b499fdcd4d3b7970ab0e92d7cc0f0fa54b0c3ad9dc8cca75d77503e7db20b64300b287876812dbe47aca213afe39ff62b7fe4b7a451d92d62640e737dfdc24d8e6649cc731b5da73e7f0c29e755cce94046a4dfaa281da54c8870d29da79fdb6f6938388daf09790280dd9b52529d1225ed5d87d28b1d5690e633b403eb8263dc2671e6aca1390b1a0974df0183bca8c19d599d34b0a60cae6137f067edc89e671dfb7b12c87fc4a3f9ace8209878e1d142fa76bcc6a7905cbfb44ea54e9812c80b3971cbd918ef87486117a93cc8a61ab85186c8b873c9b9b0ab38758e7b349e40d0c240a4333b2ded2dcf59652bbb3902eb2e6468d5898828bb3cd4d6535f2071bb1b3240424febf3f07e938db53505b4d6c3dab28903af01877959c189eeb5fc6d74daf120cac20b4d2cd4d662be949f35dbaf86ff1a49277bfb161c3dbf139efbd2c1d91a8622554b22d42b7e594ae1913af566b022c39fff02e07a82e80ce3fbc6be700ed42a0630984acb795aa02f93a17b2f646037d03410f2068fdb50efb56c07ef0a6530f0293c749b6f5a1757cdceabd6fed774fcf2d47290cba2b1a1dcd6fb546725ba0741c477716661b6d6a0d340f8549b4c5fd7936ac52d987abf43eb34ae5fb4a8d65ec382880f987e1303a8a4676ea54d23898cadb857873b3847964b0572a35a05112bb9fb446932c16871a755f85a5725086bb279fa7a9eb5792d924486d0c84b962b519fe226f59ca6587587d87e55ab984db49962917a22aff8a8290965cc217b18ce928ea821be59cb600bcaa443c7d96ca7eb944dc66eef271b0be59aca65239bcac5e974bdd884dee727859bb2e979ad6b224abe8c12af8b38f94ad905a2374f9d250adc442b774ee07e1d88b0725d5ba2c744b17617fece1d1ae2b79bb380f73b469f0d51fec07a11f850ac06b0cd0da6f77de079369d02f69366685f30a3c5d275dcef9418938e8951dc59c706b1d857b4994b73988da5377848730ac252c16c9bce358b15df32bb14f7c08d9af4e2e8e7b0787e7bda3c30f1fbb9d57239456c2f9f420888987dcc451213b67a75d0db4338b5223ec797bbfdb6b9db75b5a8173bf9fb662df33163a3b3d3cd16b203ed68dd01fdbc7871af0477f1a1861452349e48cd3cf99b6b2c75cb92dd6cb89869b0b8296e8256583785139529dc291da3f3a3c3b3b3cf9d03b3b6a9db405c27df6568bbeb902845c9c1c9e9eac576a5ba4c1175e0e11c0dab1fbeaff5d5a57e9f596702a5afe85caae9557d765e7d757a3a9dccdba60268216b463d48a41535b0af7f0c89d2ebc75089dcc8adaf7e81396d84fa2c9ad6f4917a7a5725a2efd2a5ffd76639b117f14bbaffe6b167ba3a967cdc3389a4c7a93289a5d5e25d7e5bd61145b57b61584a9155857ae655f0dcace55d30aac5fc0efabf255d9ba72acab6ff6e55572d5b92eef39f69e7bb574ae96af46e8cc5c432f49bd387dae7a281e53357e3880e7857373ef9fc5e8349653e32846fb7030f6632973f1039ff2bc88ec4b4c466e58063a2c2a9c5ac9224cbd7b2b48ac813f8bfdbe97fa838a7536f1310b9d27bea92ced2a51543ea33f9564013382d8241f964ac873675e9cf887217900e2fd22be42a7e995cb4e502636846c715c5de22ebf7e3542a54bab54f6ca25ebbaa42c9ef3d3a3a3f641efe8f4f4ac777872d0fef26a843c695e08cc1362797c2d89f7e198ad4ba703e51215619a57613e4410a6cd5253f10f415e844a370669d92d5d853c4cd9c7c30f1f7b67e7edfdc3cee1e949a9013d47e4973a6e1f1c621605ca117f0f6a217c9c568a1d9d7e06651c04ce9d27aa7424ed0ca91cc45c33d80e9ab821b37b4af0d94d75cc337643ddffcecca02028517e7adc3aeb757f3b6bf7deb53a87fbbcd7ac1a6945c24235ccba8b99bf972d73b6ffbed4a8af0bdaeb9cbeef961a3b5978dc4999129f3ac7a47becd041035303da279f04f0fec5bb76a9496c70a86728879f03d8f771341047822ad7cb55eb0d231e28eb08e54ff5ad09b877f14983e7fabfeaae0edffedf8bc3f3f6be06ff5a07eb9c7d6c9fb7b91b138bf6c0b0a0078e4f0fdabdf3f6fba3f67e174faab5fba16e2295633b6f516c2a1dd3023ade1db54f0ef01679727a92371afd687a13849c846ac350faf8e2a87b7876f45b497bef60803cfca289ac06a0d6c181d606e286039f8cde7bfd348a7fadee29df8d1aba7543f154091f2b609bd9f1c8af88c72f077e1cdc12dbf0e4e18137797f7ee35f7cc2df37f3e9ecd89be19f2c065b67e6f57d61b18933b2769c387538f1c812266e9e4adcc2b22416901f1f1eec95fe4bbec2f970d43b6d777adc7cb5379094590dcb0fbd9b895f6a944ac806e4bf8fbd11f1bb81ab34fbe220de0063f670a89d29a8d3d0fed22566a0f431b75a33ecb7d8bba3f813237e906faa61107b77ec01206e5d4c5d81669a477920bbe6393a3d9043646e950a1f0d4c55d3ce17cf8f27d14069e47585befeb6ef6247390a860e5a1816107849125a4168f9d22232646a98787333a55a10115d933e4b2e95856f4ceddc3971d0bddb677a30267450479278729f7b77b4a5dc3ddc9e6dc7eee5228776879d7c7fad6e6eda31d9d14a0eb203f7f216ad552660659c06aee6004b96488620ffd83a689ff74e5ac76ddc2c36b94fbca98f1628e44f038270b4278a5c74dabdc3934eb775b27f78f2818c7a586147c54475bf220b7d6a9f77dbc25b4d879412998a52a4541ec99ce3d697debbd39376871037f5eedf4578eb0d2bf3c47f1f8d3637c3ca30d2687b7fca895280daf7b3ba047c7ffaa1d7fe72566790536fa622396e9db12c3a63d55ccae972004ae521cd208e623365c9994a96f6a20c44eb1420670ec6b3241c1f763a879fda1294713b158c8553642021e7712a9008a8a883e1ae8b8821b4ca3865f1d377ffd3ded7e3329ad01819b0c4630ef0c810416b7f95f2fda376eb7cffb4d53500431bff9c52bdf3d38b0f1f4fda9d8ea1bc814ab5b04e26746dcc5abd6a59608407879db3a3d67efbb87d029ac1ddc767eaef9cb5f72f8e5ae71234ce6da8a179c28d7f06f8b8dd6d1da9c0248051767e1e9d7d6c4920e69f898eafd63636ac0a247165abc1ed9f1e9d9e2b5017b71ac8c527beaa6f59779e86930580f9d4e9312e737a72f41b03061b3958fc320229ef6d163a55ebea7f1c9e9c481e374f7c651c253066519cb7f17e060fd8b47e3e3d3ffbd86d9d7f68773b1058bc37dca8118f6b46d205023af938824134bf99f89d60e00f24ecc1e9c5bba376af7328db399c04330deafdd1e19902230e086db2ad0eb43ee1678595d0a5f28c81045ffd569afae19cdc2569f8d4f8410cab5918d218e9e98783f659f7e3bb8bf785a5f03a2c94a0cc38b1b841b7291ecb6aeaa5bb302c52d39827a34165f2f5d0391980dbbcb23b56081c6cc14caa74f5a67eec89203c209b45623a8dd331164366e3a08fb341cc49b095a392259c2f5082d4a781a42409b35442250949489881cab52cf65a56cfa85bf35b8d16ce2e50e92a5560777910658504509232904c391e1432a794b2140d85c122ae365700d45601d45701ec50009d3ebed2719eb938e51c8cc22290da6a90fa6a104ea73f49fc0260daa8dd227c14e4f56a9037ab41de72aaf8301bc65b3074c304c35b00b116300c13cdfd4c9e502a73e92acc3b722022a03f4eda26db6dd74f52c994c85edb6d77ba045e00946df0f1ffab910bb84ab5e4148bd57fa4d84ce3bce8b9ddfdef91ab072b04ee6cc6f48724fe7f5112fffb08cfe499b02e61b5db277f07d99a87c6cab4f1c379ebe05039cdac2986ffa5c55825b63a09412281cecedb4c797ad83ea063cc1073dde164b11fc5b1df6757c1a0e8c7df3a87fbada3a3df7afba7e7e4da99de09ff0545613b2cd2ee8552bb67a8c6a0dde31c87b9303e3a3dc811bacd72f193445fea571bd833003af029eeb8452e9b091159588f7ef2a8ba4a986373895e6c97c0371e1b1807806b0ed23171020e66fd61f763fb5c1e3ea3793a9ba76d66df833b7b8a272bfcc41b2e4ca1a3a1a4c83d0c26f3ed91a7e166cac8c099462a55efddc47669eacdbafebd3f11c6302a8c034502ad204e329485900edcdd95e23429535c857432fbb78a43a6671165cb38aa44a1a0e289193c3ab4631ad33ddb734b1352a61b9d922c82a8842257874589bb88edc841dc52c9cbb7543a62284be5e4b27a5d4e8499129f7c78ed9fd1f0f760fee1b5df3b6bedffe3f0e403113e211c59a2f9c2af83e66e27b6e7ee31feab1bdb730785e4bf314e1fe3f4314e1ff3f4b97b4ea0c6f85f9c2a6e813637378c5a73aaa9bf71376aa8e7befa7f57c9d67f318779574979a75abd4aca7e72956c5d85af9a18815a7a7393f9dc9b93c936b67b8e481a8324fbc6dda8a2b93b1717eb3d542a613ac76a8a8362f7b2c449b076aa55cb4fae42208ecb134500936fa9ff732b9aa72035e54f73f8afd235e85f6a3f17e3334661951c37aef0861c12a2796a918b793a59663470ed3e3b2453185e5a09410e21410d0c86ec1fed2f5de5bbb03999bcfdf98d9f9f5b3f388ba37ff12ffcdb0473140d3011a9d864f210a9802cc54cd35a383fc41e84c29f79556ba03cc95cb9096f762204c452e80e1da38e1b94c7a8ed8e62bb8f68748db83c775057a6d451875c45f52b5e9a7afd31b3bcbe476d0765d2badc269eec6bc4596555f8f7c2e7d6bd7ee5260807344d588bdfa32a32823b0d164e4275c7968ba4c4d54a254cdc24087fe7d769f70ef22b03ff663eaaf4c77eff774a3231b44a286b68b97d6018cfed4fefb9152b3aa2f9aa796a5b649f99b2bb22fb1cf3857d778378c6251adbbed10cff9ed8d4ee3aceb77377a3468ca74fdd7b3c186dccbcb1ac5d72d0014deaa212df684b4e33dfeb9f306462464b04a2619510a1815a9b39a8846b7ecd1273087beda01235d355fba9845ae8141dd0c7efc41eb3b597ebb0599063c2643b25d4c25bcd86eb1e6d6e927fcf1e1eec7d77a3e634f7f9ab9741e08dc22849837ee27e8be72111c31be7dc57e451346ab4541749df26d1a8718466b13f0cee1bf152778f44f2cf787eb05c8adbda7e65e067a7be96d6a569135f3c65686752ba0ef78325fccab9596747c224f06e73d3bea3be7ff068df3b0eba5b0a0cd2bf60118ee3cd4dfb38d7c4ffdb12c545ef41ea3507056eb519fc123703ee05d083ef412815c4912f79f0d10c2fbd6b06a0aecf14c16701ac3dc7ac3d033f49e368015bc2fb0eac6002ca4698b98063e571d5aea220e38fb46ee37219bccafb87bf70d9fbda79e20fbac1d44fdc9a8af99e7ec2d9e3b699a73265ceb85d920afcdc6866f397d7c41900974d90971f19272257389988242881617d509f3c0ed202a310333335ec099abbdf8efd644c6ae0424ca334a0fb2cc90984aa9e678298a6144644e960102cae1bc97be725415f6691a8f634e788068497792c423ccd3d1b47e148e69170e834a71b918b0e9691465148d33bcc4806166206360c23fdcacb3f26a703994b4f0b2584055d732b70ce0189b80c7a877c971031674e405de4bb843a4c23c0d3a986a0843a249e304827dfa5251abb97d278b2844a7c929450c97c0d5c422555aa2fd1184cd4e0a2c462e995c0418a7cd1c696d433524986882c497b33f19101a346522524ce2ce02700263a515c481e84d42f00cbb49e255412ea46dc4283d2b2844a4625640995a082117e4215224c8765b5fb77dcef520f5842a558c5019579255402da2cdc70a6bcc37551c3b912dfaea98e4d7c72e59c48b8b8c5bf154d5a099586784f2d51d53afd6cdfcff0dc00aa314cb17a578a47c5c85e3028bbb32673811ac6d01a945956527c9b26fc935d36d3b2c71a004b913059d5171e65f0d0827e82a70e3441beaea0dff27903fd561f53a838d9e3021db392ac3f62c0bda229f260527731c3fda1a8634a390a3a3e07ba7e82cf65403349c68ce91f2919ea530499069f22601ce0004da62b53fa10127d3f2c5d4b33f899b05113cf27f77c1997742f757da1a269f87c4382815c8b02c2b12d98881d0c235fc8efe3687aeccd1ad6200affff29b178a7aa3c8bc6c5482c2fe1c791a4625d24be958efd20b678d8586bc63c424243784c2ecb17643b8dd4ddf17750bae41290105614bfef63344043344523744bbb64e10e49e8ed7be2d6deb4a3ec0d618066ea66fcc68d9962e8e1e11ef5dcf9654c5e835fa33b129fb6839713f58ebb973514f42bc9ef587a89c2ca0d5e6958ea8fb897c45ab5becba2bbf551ec1267dac34914c5b61d6ed7abceab5d2c7591e469809b249c140a637cf1c06d6f8d307e5687d1628dbdc42a9579d972c922c455acee3848ac0f6717dc5f3c860aca253c1455a7112ced5ba751e5610762c5681ecb275ad4381b40388e5e62d52c5347b65142a0f45ad10849d7ea322f7d51278329c46e449ee084ee372c3b3658b002e15ff6435ae94fa2d0b7e3bc90bb716198dd5813156954122baf3a19e55aada438bcb51ed87a291d39da31ea39cd58c49ddea7efa6ed63e4d30eea50211db2003b1bb83040dc7cb9d14352ba6e1cd397f682fee31cfa8f0be93fd6df3fb0b7128d58bc9a3068f21ab149bf8774951d01d3606430c30449d1892a196e75a7d7c82c8635264815c31a6c5d74f6667687b32da7e1eb3ad8a9376b6c6cc495a9374340486bcc6c92e6202aa23118fc13a9421b83c4490ea2bca9b1b17183a400d7b8d9dcbce191d9912acb3566f60d2f46c5395c7873d3a601dd45b187879dea5b98e0202ee911d2f807d2e53f421e4f741091054909f20b012990a4826f649010093690ee20263092c2ec3712a22349155fc82446366a2e664502086fefc8285836aa0648c58734ae0d26e4b88a56c0608ec91fb4022c929126a612302d0dc57aa5300141c995ce2e908080d04b32c137e2622d1d46f68180e84b32c037f3634df0e05f8849c38d983f2841aa18dc88a1b541acdd602328420b8e4b3f91109f1b1b1b74093d3cc4f21107408c3f40b3f0276f0cfe0d6619fe847d87bf616fe16f38eecaf7b956d0f4562433760e5244ffc69fd3144061767a3934eafbc602d1f308dedca211626792c6627373510992f7f41381030a06945f483bac3462ddd4332fc0ac87f8e10597613f3737ef7ead227e9469dc21fd28d388103cca349488220982e71a9ec73e9176c869f8152d0569871e00c171c0f34e635c19043195ec3d1ee014a947a0c698467401b9f23cd41857925904f3d4b350635c8959028091e7a7c6b832f6a701c8d3ce4d2a855c993133922a8b10824dc0fa498bd16f02554f438d29329c861a23248e3f5838e0bf917e7c6b80078b15face67b0b93910ef5b9072b853a08940061d17c4e2e6dd1fec29e1f81b5594730c6cf879161c287b286ec4062311248e918d58daec2170a0240f39f1da19f8489c2cd9e64612959b57e99046b991c5bc167e23c3ed0b96a0b2a9c8f49cae114b4b8f04e3965f15f0b60d65dfb215951c7220647a8a5658a70443b926284508120d16e5dbc134580464e2c25a04eb96cfea4a4eb6306c46a6388baf0a5ecd9950e806326632b20fe04a0ed20e058dcc316129af19d8a96c9f2bcf65b4361913929cabe44347e60548a6380d5ba4a912bf8344063c2838e01e91478e4844dcbd98781b12c90c03c4c5b22ee36b4771b2909a2d0380dba566f0cb58b85d2a9739f2f4727c195c5f3b3c1aa42edc8bba9507aaf2be8313a6f573258d3a2966643689c2492e6a79683baf4f9e49b2fe8751f2808fb600796e1545d2e199f74b441efff3285a971e191d70fbe1baa1f3ad5cb6033771e41d087340b6d4ef8f82cd4d9b06f1218fde43943af8408e5b13380e0a441c3ee2f12043ac4f03f0b9eef6b62f2be35a12c65f4e87244ce1657aedc697bc25dbb56b5c5134b3e9cd2db91fb21d3e33794c383706eefa631188dd106849892c02422aaa0134b5300bdf96c867912a433c444b44a3742a987c1e4b3535c4ac649e1b783d2400ad3154929f172ae977dd49ca288ee6b3d378e0c774ad8bcf3d98b70d731afcfdac2c06bef794dc6d250fef68b4af4929f67b4fa45682c1760a3e882444175625189032e07b4fc9dd56f21a7ee52b81ffbae757be6ea795af0d9f020503e061ffcfee0d4e635af9baed9b697c27272209605545cc9b1ab90ffc160c1adb30c6bf678724ca257121410b4e5cff32bdce4ccac99e3d21e5c34a306087dc4688785cb0468c787f363c7e15def0f8e83c3c040874428460c342d84cf4b59150d0467f893029eec469d878945c52f5845997bb219a88b0646e8c2662405d0f4dc48daa42c2048c841ba109acd855c99854beba092fe0f61d9496cb68c283e24633efdf73bf118220496923464118a8212171ff33aee256512c7e2e11e6634a5c5d14a8a3e029894d9b688a820aa8702f6e840e658813bcfcc3641c0cd36741ca7011bcc3200c20adf0163f35c5a9e1ae1b2fc36b1e8c99d4120c1cea88212083399f4c502006937e89f164df6248d9371f550e4e068784b15aa2248af548c5bcef7fad9127ae519cdafec3c3efb1238602e7c434277d78781f2b51f42ecc5c5dfa27b765e86e168cbb19af88959dd23d8530edd81c6419c6c465bb4498dd25bc3db63bbe8bd946112240a58378491afb81863b2e08cf9c3a4e4320b703d723c563c711dbf0bb18790219d9801fb397fc4b76e6b765dece0883b2f8d4ebaa08f0443f9baa833aea2697780a291dc8532439f8941aa1fb4d1c2d89dbd33b445ed9b130674b18a35e9c1b49316ecdc54a156141dc7aa15145fd28f4f723127cd60fe7d39bd8a35f03bfef2d1a55a54279aa35d598578309133e6c27b3b11ffbf9ed4e7e5fec439478e98483fdbcde50cef804a1429046ecd89b0c3f93087ef2fb230be387138470c706d10d51b8a4a1cc3f2afe393f285bac9d56fa5ec28eee7bb546d5d9b67d3d09c4c588016ff2514a66e2bf6214ba369e73e8a5679b611ad133febbc0c393807e9c7b83609e346a521fd009beb2887d45f3e391a858da3e797470e27bb100a349ef718abf631e1907c5ee3766addba8a2b1978c1bdf8092e688f0cec6768dc658969f096ebdf8e27a219932f6a781fca2ba2055f393b08c33a9dfe1491da1c6c1294be44d6f02bcef5e56ff3ff6dec5b96d5b5918ff57644d4797b0370c29f91529a8c7719c34e7d8896fec344975fcf3d01224a1a14895a46c2b96fef7df60f120f890edb43df79eef9baf995a209e8bd76277b1d8050fbc4b41755ca3df4e0bd2d2a72c5e1b791accd6c46709bf1349a273fa37afa8205c2a47e8a27a24441887cc04f28a8a12ad4a8cae4a0c61b77fb952da712f90574473c1d74c1203b8e5b44b79b92163fcfd08a9fcd5e83765d97c669f995c900a7a0b85d48339f540902e33eaf5662f5ff4667963fdd9259e0638fac67d2f8ca80753eac1987a70433d58500feea807d7d4832b3a10477ac2ef3ec749387c178935c67a4c1ec06f1382ede8f66f73d262f6f2169bbe9717aca26d38a7a72e222538a6a72e8f5038912de0829eba1a61c2213d5582b6564b87f031a8fda16fcef03a4d902ca72e4f0fe5eac20d48c22d7aee269bc7301781f1e6314c44e07af3d83847136530f399181c233138a15eefe4e58bde8935702797e22046879dc35f9960d71d018e3b88d968c407a2d9b47f7209c7a4507b19e32002738e94cce59410391cee209e2d1c3536c45542be85682e100d99912270944b5ec5544a8d0a313dfa9592736acf1791e77f6d3649fe147317aa9f5f3b41310aa9ce519ce448c0b922706a217839df67660e7bce4779e78fbdcd31223d73af7990c247d7468cf4cc4d3060e21586a46762d6450892aaecb93fbca41feb124e8399483bac4f13fd16c9d6c24227c58badad55a180c87404c3adad953db9e6dca8ceaa3e6c9f36454779fe60360b17ca738b18da237b819c5796c6b19c1eb973e8c57fe4ea105d40124b2aa90ce2d43975d1073ef63c27ba2ae99b8effecd4e420d898a0a504b610bfa585f7ef5d74f919d19fcad556384644e4612912d7d7b4babeae717d899c22f508a6a58555a0e4c8fd3a7cb16639fc6d6b2f75f9904519cf160e8158e3a842e9d8ba9358c832ec2e4b8241f631cea426772cda30d4261e3feecee6a98beea3f11c52e992fa54e71366916ea5f31cb286029869a974393131375dfdb118ea7169a8738aed7f6a133f19cbab4d6d9d8c0f2f7f81773ff6fe9d9b40a7e4142a3d73e51b5937624152caf0c64e1f05094a680d79d41fc95d54a4a144ec613916f7d1a8ba8fee701f6156917c04a3d2ec96b82c394647bdc22cff20c27c0abecb73c89b78fe9d39225e33740f2f04dcc416afa7735b51756512bcb3eddf8871b8d9da5aad125751db7def9286907ffa97746e7db62fe9443d1d4a5cc137f43eb815c681523a6cb53eb816f340291d89a89c81a0944e454c9189a0948e456cce48504a6f444c2d3341295da8449ba1a094dea9688ba9a0945e2f974e5273614e870a1bebefa9850c74dc582f351d3152e3a8bf6fea28079db8584372d8e9d642d6d17795556fa7e407888ebd2e9f3576c21ab2660d08c5c4bb9af32aafbb6e150ca1b804465098ff2954267f0c8599bf8175d3be80ea9cdf4165c2459f159b4b7f49b6b6c80ad22cc85837b104579f8b52c05f13c868ff12e5ea4669b12cf7cd65be9125f39575dfa3a25a8abe92ba9962cad5672455dbd2aef4363f9fa9bbfd5cc958fa27cae63375bd2325c998ade89b5e5d0aaa0c8acdb473442687d5d93ffeb7459eda9bb9b42e3d095227225ad2f9f9ef9374aafa5539d14c526ca65423e9f23cbb148cfea800f40bda2effccdc411086f894503d2b432ffecdca9ba9a67e9f96ab4ad04edbf394eb2fa58b4437d413325bc3288f0ca4785cddeb2a752d2baaa46fb526055955fd56cd4e4012404174cb13364a822933ad9b98131e3124d1741da338075c3b0b4a1ddbdfd9d7278c56e91d59535f088f58c2a201d3a7ae9281c8d77a2c487439038c1dc53affa9e3bb76ccbe58cea2e807bc4f51167d9dcf2c4f226067147c549a25f3411627f44b524c936f150aab916e78e5f2b3a29d62ed08929532e53308ca2957714db3a2365071f49909d6cc022baad59919419f6da52961b91269edc4b08a66eb9a5962d5b835f3c62a51e58dc2f2f0da1dc36a22e5db4ff8fad489ffba6ee2bf26c53435f1a58d25e6feebdf35f795ed294952564d20355b96153eabfb97d95ffff7af25eb2affb7d2036081f4fe99813cd22610a85f29091e432a689881f813d2fb15cce9bdd7f5c1ef7ad0eeb6573093b44ee6dceb8711f7e787a76727c7571f0f2f8ebbede7fbf0cbe1c99b2b3bd27fbebfcadf65a80b8bab5990a6dd7bb4f582f2d515a05399395e1fe978bcfc00c933eac8edd5aaf8a2a3899735d380470e69dcff2bfa57360eaff4626950b413e218f39ed0f05daf417aff8a56cdf2eb0f6379290da6b39025edd70d0bdadebf22cb7053bb91c36ba5e083e98684b8f7af287790339378ece77f4525701baacc9405025acff57a7964fac73c48d8f0aa90f8af4c264a13f9b4318f44e51fdfbe3abc8811393bb9c10ec7ee01349cdc264a9c0cddbb45a3411acfadae34088e4da3318a9386a3a0e00dda78e6bb9ef49723c64f84b668c39a66d597464359abfce5c3c777bf7d787f78727576787e2e931a72e0863c95da9b727e6cf0dbbf04e1e847c0dfc22a9d060731380dd2d85483bfae5fe23f1ccd2d5a00c4bd33c985412f675b3436cb115ba58aca3974cd686f5437f2374ea11e03cff5a0d1e00dd2f8b15110edadef3c42b859c825ad878af04afc518b137f361be5fd8f654aebb8f0b9a688da00d9f06ac86eb04c9239c592cf749bf8237b56b0f9431b625871515dc462741d3554a20098ca89c2072b02433a53cfec486fa8b536dde262a6d20aca0871e130eb8d04dd6534929ddce40bb2235f99537185db7fe6c3331fdc1de8a8df673e74c0ddb924d021f2d26c8ad51f65ce08660416e8263447eb778eed415479f475a6a43733efde5c6bd9486f9bd28fabbed6022b6bbe44ec9c2890b373e19a3239942c0f79afc2ab3d2c7c16a429fa470d5990a0caa4d4a3924ac692397712902a3b30832906090c1fed80a8d97462f8a44e0cff64279ede81a1ee80e59eb1e4b1f2e54b6f99bd7ce92fa3972fdbc069da4faa0a75b97aeb97449cb296e27ca7edf9c507242c7f8692ad08880a29171c68eebff11118060fc3f03571ee1f6a71506df1564a20a40b2aadf59b19152e1848666742af61463377304fb3785ae029d020917cf0660bcf5b2d6742afec42257ad4727f3c930d0fe986dfab35d8241b485d9ecae97cabc03b18524501e6d66c5aad4a9491c33f9466de78744d63ba9956cb310d19988adfa6b4c20723d397acf8d85b77c6720230a21b5e77edb3e65c99a02163adca1ab73c9b348c0eacaeb191b2ac91c58d5110a6ac8bb21218d08933841118980a6f55a5e1a5c680cea437a7301e04a17e5973acdfc128c007219f29e15bab254d750d0a8f70f473f37b891907ee7cce8730a6910cdcd0b03fb5bc53dfb45ace8da05f4534bd9103b8a037fdb195494cc2820e34ba07914a17a25f8bdcced20d4ff9752810850ac1c062d4228b511be05317daa194c607ead98336cb7ace87ecc0fee84698bbfb68be795fe6bc84813d4ac5315369f97055c64fe5b05f30a93c7694ddb79cd38cea384db46566329830d4ee5b8c1cace1225b2d6750c3fdd55f9424c58b9241910be43028707d018181e584d589b45f3cbc8743e748665e312a72c360c11271baa499c3d51769b5d0ef91807eb98c50a1236232248defc81cf94599484bd880f11b76aeb44cc4bac07c1b913b4ae669369f1ecdc3900d97cb046fe5701252c9ae3b1121e45ee0ac823f067323839f03963a418dde8c343f6a0609d7fe20a71122e904706a215b244a5c2e85cd4e488c96ca9c0ea4326daab47de65af366f272d69b68cd9b219df7279730a2617f682a4653f4a8e93b6ab546f930cb1d7ceb44308218d4a59ebcbb4b49aff6900de4213b10472c0cc9cadcbf8579b5b2caf04f5529cfed95eeb5402b83090f87098b94aed258f7fbe6e5a277b3b5454e9d71ffe6d2aca7953401a2def719795c30cf62e9fe9c6e785a6c615ca29b6c28a8f1b51c44c06a3fae413d6dbd5e17f91b421d9137b25caa28ab1122116a56c0a0619da90598db66d48ee6d7ec4d3010887162c79ff2d934989db01b163a046694b9787dd19b891dfb2a149c4134763c0233573d155317d329cb8e9092f201ffd93990cc11392ec4bedbc0d229cbce073c4de34446fac46880497d32e3517bf872d41beab538a5597f7809633ad557d4b63ae798dc7329581a6bda506e906b3a167d7c23b01c3e68cb52e9f08c9b4de75c1308ca85c1e1eeddcfd172c9ddc5cf1179c8664d7eec36610acd49902ac6aec1ee068c89716b4c833bcdf8355241b83612369ca3352d02d852abe504ee9d6da2257a7eedde612a0ddcbbcd6bf70e0c7c324e242e54d145b9e8025369e02e36afdd855514e30801a5a88f09add6c6b880dc6df466d6b29c892b7a3fe5d11b34afdbf53d6f17a6c1d8fe14f47890757dafdd59f5c65268ce6e1b376248054c70452438c6f20e1ad59be2cf5633572168ca6c822fa8ab41690748fc77567261e39055fe1801ab21f765c83b45c83b7f2fe48f8157654dc625d6c4528dc4552c4e8c599c6447f13c121bfb9c7abdf397b7bd73bd498e8bf99c73d28bf14e4b2ca063f70ec46a38761720bfbfabef5bb12f6f74a158f451426dcea3299c1348f45ec253ce2170eaa430303d85698ef5c8aa6e392d979d0d6b392d9777ce18069aa2fc81fd15c56a8bb94db25a94716f75604398c3a470f1f98fb2f8d4984eec49de5bccbb75cd279f116ef81029816aa21ea5c84fa9150b1eb1546d4f83f49b75e549ee1341132f97d972895e4fc33811599c08f09f18df88e03df0493cf8c686c5fb5d2aaf8811d5da6ffe124df9485ea4d572b24d1a4322fe049b342610a967859893005e857297fd310fc2d441d4a6161cca56f28c0aa14684a00c97959e3a6df8660cb08167be1a82d56aa5c4cf6bc64f94c9876f1e86d6a0e17374bbe3ece095d37ed17e41ba9fe42f0e43716c13721f09f2548fed50729de9377caa4b1359e6cd3c1a94df03e0933c0c65da216d661cd1aa8a443967c76f93a2f3d962ea0b52f43a5b4ced14523ba5d49d42ea762975bb90ba534add2fa4ee9652770ba97ba5d43d9d3a64a3601e6615b0e4c6ac009bd06cf5a3eb94dc7331d4f96293d2d08c00a7d9da0556b758c4f28a7f687989d5287e62f993ca1f25af081f5d81b8a67015ee7a7215ee7ae429cb30cd5834e0e1630b1122882572c85a2d2e1f040782dbb42bc1d1975921a178cf03018d65851f669557c0b1ac2e95d50d245879751fb43e09c434132302030ddd0f4d6a589cd47359bb98d6f007a7f5099324663e5546848df5e0cef68bb62f987bb1223ef128db97dc4e8aec50256e5e1337a1f77803265a520f1547f247bd3cbc913fea99e21d5566fbf0e74afedc8a7e9dcaf0b9fc39963f17f2e750fe9c54e0dfd9ddf5099c89f21fa90747e50c7b2f3afba4f74c300047e6157b13cfaa2639703e4adffc2886769eff7f18ffaf86d3f79ebdb824cf5d76c706ce11e9fb97a28d8f3f539f74cb757d98b1e8ed49e3f8bc290e83528532f15f8de3f3876a6d13a505889d7c2d06f4bd3a28dfc9df5cc4fd5dafd1fca0b5e6639be02b4879afad6c4e3882d9bbe6d1507f67100832296377669cb89381efb5b77d78b1d7de5f97eac9544358c5d4ebc52f935ebcb545b0c4bb693066edd74eb4158307bbdbde3e72352ab8e3b77de0e67166804fdabed17beb5ef68d130127f7cea01f5d521ff02d753fbac43d22593c693a48ca15659f05eb8ed909ccfbd1e506a55ccc84931cb0aeb2b071f8feedc9f195f67a38bc0a44c1b449483f3950e65d658daff90d4fe3a4d9ad8bc55a9a9708223645b925d77e2576f48660a726fdcc8658ec67114537ecf7779f30bb6f671ff2b498df27ab6ffdcece4ee7927e77c42fe01f9fc0b77e67dbdbddc3781100f1f705ec12494e4896525255be7a6aa0d84c02b1958380a20fd4730481273b043e0bc612fe10b95f39edfdfd6d02bf3aead9d2eff4def7bc6ea7bdb7b70dbee763685fac0f0cbd5809fe3021bff77daf734945d40e888f6df9b18baf7470f5fe621b40b9164cf2d59447d3e0ae49b40dcb5f5a2d47d5f48b7bfaeefdd5f1970b5ddb2feee9e11711417021bda5f76dcfeb7ad0f6fcae0f6dafdddddbdd87b6b7dddddbf3a0ed7bddbdbd5d687bfb5d0179dbdbedeeedb5a1ed75ba7bbb2fa0eded74f7f644b9175d0172dbdbebeeed75acb5f9ab2dc237f207cfd040c3e5d279e574bced3681a1986cd811c7080968b05c46108b23298194a6cb2587486aec8a93ea0e8f16ecfff11fd2c0d6399b05499031e7f77e7409bff7834b22b029dcd1401c6028cae552582b8eaa6b79545de51589893495bced2797f0b6cfc59f58fc492f09dcd0041694c3358de18aa6044634835b799c6b4152b641e968b91c6c507a8b5df43d4fc22d0335903bb82e04b4bee7c19df84b6050a60e05fd5785d3073101f8b7420f9adc8e0f7e851eacd62556be98d6725ddb6b728ba5e2c1de9e57a6ead67b6b384705d5c6bbe82608f9b071ada43cdd46133245fc3da9db62753ea5e322df035dc74ebc58df59d9c9bfab7bc543bd789acb95345002c961abe57ccab7856fe1c0cf62644e1511941d307794c45186f2b576c7db26dd52cc0e81534118e50ab8a202dc81078e465462d19eb75a8e60d4449d8379186205be27f8a0764df4be68c98ae8b409415a152b3ca799a597aa8f5f6cb1d3de6f77085c483af1d0d089b3385c8ce3e8c36824157013912782439a60bdb298a5be89766e8cf1233118b4d379b1bfbd75f2cc27f0c19089010a1bcd394ee083180e457d2bb161573d3ee7d2be58370045b576e315dadcc8efe4eacc5430ea4146075a8ac85e663db6b545067d7649bd15c823cd54512074df384c30b0e53c87d1501da0dd37a0ceb84fd13c65c3872191f658f4a3829e98d7a8b7b59591b09f89537e503a37ab948120a4c5419a03d57da521e87e82b9318454a0ca15793233a39ee71335ce6806e224074bb2dbfd55f233caa64bd1ae461b95a7533e64076a4975d55a55c6a57d93a197a135a38d481cc1110199a2b79e7221ce0a1648c4b9dcfdd5c973410923ebeff364a083afd3ac9c4bdab4cbb316be5fa799feae1ac2b349078bd955d128a556d122aca291ab53d19f139e3145b8a8785cc132bea7aee835ef85b1522e877527049256cb89add2764e11a5481e05a1c51282f9fac8465048b2ca7d9859a5021ee6197f2b7da27207812f650c00a56f6975ac1cfb29e259aa785c632ef033728e0a3575ff401693474cda8fb057add81ec7ad9673d66a31bc79c42c62c11e232f99b2eccc6eadfb058a770915b951c7db47b911feaea0807bba5fc1e228ba45a3674a6cfca1d5faeae8f97bddff605d328b194be87db69831654605f4ab72ed2e4614a0687b06ef81702f265a702c45814e99ad8996cb6ffdecd214ca202f11a1d19f5aa0b500c48251ee7dcbb69da80f9141a145698c526ae8c80faabb631a9611640583783a4b589a32515e714a05e63e59dc8ba55fcd259f353a0c82643c9fb2482c9301fab263e4feb113bc090cadb13dd066f66f69a9f3404b9dbfa5a554aedec23e4014f95e0b683329a055199dccbd83cc5d40e67e87ccbd25f05e4a69334256a045f8d5eade95aa33c2fe4a7defacfa2ad21beb60eb652ff3836d6b8bf8c8e83efd3ceba1d4c51618cc0aa297a22c85bb088b2390af0ec53a64cbf5ff5bc9f54b8a4a30a03c778e1452ee4e83dc85d1447e1fcdaf99d18e2b6491ba6632ea1c75885318d90f7f604a37fc9e582153da9c4752bf70d8dca06247c5a386c0588384b1e828886e82d47874145594d2903d105ce5511c891de834dbc3a6b5b2f2be8e0bf6e9a6077595891cdd613cc005aaa42ac7216a95bf3f779a932c9b759f3fbfbdbd756f3b6e9c8c9ffb2f5ebc787e37c9a661139a03aca469117a377a78b5f8c617ccb2c3e493ec9f93e592a9a7d73f27d29454f25cfa9708ee742ed0590801fed25f2ea5a611f2677583f7cbc5e909ee390578abc51a5a125293bc5caeab448ec9fa5a0ae9f5d56043af788677a6850aac14edbd2c3b98cb0bd9b3f896251f4617b77137bfa58598060edf54834260a03ed5d8e4674d8ace2fc64e0c03a53316d2e8407e77532d8c0a653d68e74e5641076832afb890d0602dc22a685df040d4024f70eda1b6027af6b8662c6a242ce5dfd9b0314ae269c3696ea98e6c35ef445882b0d5248d2c16a931c60fb69ac46d126359af390cb2a0c9a3067bc05d470e03c2dde051e37590051a209e36b2386e5cf3f10350884699317e94afe785f59c658e57967aa6f46a25ad5625414dd1ca52db2d998a641113acb1d4aa485bad0c250e9d0d41fc9a3b688cdb2dc6d96aa662a37108a44d4fbb42076da3aae7895757d3e0ee944bdd0da90510c663c7ec3a5103d9c4cf930f6fdbc7b61229e249a58542291d687b5889b6e4b781465c8b96b322cb6c5674d97bc2bc1d66199bce50d3709eb2461447cfd81d4f331e8d1b98b5819a52511036e4157ce3bf9a5bd156f3bf9a523216d0442ff3dd6dafa3e8af1dbfbdabb45a03dae974dabb0476fc8e5f88db2128b52dc4f984c0ee36fa9ea8d6b3bddfd92bd7b3bdbfdd29d7d3dedf7e21ebd95f574f059eedfded76b59e9d5d420061dda03468b5b02b2a284a98600763974b4be8887c8632de7c85aaf54d0281adb59baf6fb10005f7b55cfa9eb76d423b2274f062afbddf7db1d77e612bd619e3b5997efc1b3df2f8f79440d5f46da24ddfda169223f7eaea965d8fc37711cfd482eae987c39a3e3599548434ca21007032b2120c66e4f2f4573e64b1cad16a8df4e3e348d00853368d9385a665d367cff2fe9dff89fe9d3fd43fe03a689cb3a0ceb3e99ed944bcd42fc1f2147b5ece417a99e6415589e2b7ab4094da4d992676044d63ab421815c0807abde0e52e9a70d66da396945c4bf9c85b9128c5350978837baddcf7eb2a645be53aacaca28e9eb9577e4aab7fb949ab8253c1f9cb576043ab89bcb25a60d694b2ea45d5091b90c7c0ab1428f7f2472aab1420bd7c9b98a558d93a759b436a1159261a2f72af567a75cb55cdaa1bafe29c2c566a8f2e6a19f746aab8924be1fb1aac1e98d6622564e530f1adec34fcecb55a622ba84f3c2b5538f711cb055950402e01f9018a661a24df041d13270d0945e37a9e35b8a435d2464e05ca856b7436036475c5b410fba5c56b8783e8d4530ec62782c023dd5293ac5651498a2a05ad995841366f8f376d153492a3bf43f4a52b7ab32b15fd456b0575d2b880b9337b4ee2c29c64f99c7c70624050ea60e41518f1ea2fae6079e6cef81d0bcfb33861dce9ec6d6f7b90b9a390cfbee697b7a91434bb3c3db2450ea2067146627ffade655d3aea27981c02975ab92de212e6b47fa9ac21eea249c2797f7649d3e5323c080f74a9d9a50c74f388ee8d937fc0860f1b1e4c94d54418d179dfbb84295d3823b25c0e608c6b29ba61c8914b1288c06d21563eed3ea557a262452dbdc19c30865b9ca123359e194c09a4925db761bf1f5201be3b9554a91948a947a87d97d8ea84c3fef965cff7daa8b7a70013546bbb6d45e85711e383a856f88350bdd89ac1399cc2b1e2018f8d852e3876051740d63f6ca92524c3381836e69171d1d7c89b36aab68a98e451434a5b8dfb7a87344937b22ffc1f81710cb71aced52a2ed1dc43e349002f8cee87342b8cb13d077ce484e4beb6690f4e01e747b68ec1020018833060b5eba6ed823a72e648697df6ea7bbce5c3295ca8562f8a4d5ee83e63c7d682ada15b0f985a4b0f4020875843fcc030afee1cb1c25bad6bb3de470afa9166cdc04250397a82cc8d23a9282af6bc0e3bfab6f3af612d4b0c75a20d923f0d53637dfa70ad542b8d62defbacd3f5bded177be07b9edfed74bc3d5f04dbdd4e67777b7f051f51afa123a8f87d91b0dd7df1627f5b8476446857847691c617a13d11b72342fb22b467e9091c3991949dc5074e598f26423d9a369cf503f7360966e797555d1b99a763f25c5c12e8b4f7f75e6ce02d6367677f577032d172592dd969efefe7b57f5c5bbb071ffb816bf4b7d7e6f3653ecd5e5f12d25ddb271cd2f5dd51c93fd61355484c99a04be49821e39f7f5f2c973f402bf0b411c5596316dfb2a4118f1ad96decea44597d23888685988b463a89e7e1b071cdf48b3fd9c451184c6717f1f170cc3e27d2e5144a4ad60cf9ad630d39593fe4984f0f39c1de779060aa8a3e0a717fd728982ad7f5fb3d0b1296662a539ca8e8131eb12091b16e5309db525bc947bb371a619eab20e2699c25f18c0f9a7804a74acbc4dfc1d995972eea3a4955f3e1f83caf4670ec572136db249a4d9435ec566b700686f9b76b9904e1a85c95aecb095c03e4e2677fb9946826106866304f12166587265d5e0ed8733a722248dd8be32f179f3e1e5f9d1e7eb93a7cffeefcc3c5c70f675f5195c9380fb6db41d70ed969709757ed10a26556f56d53bb021b977e907772966b254b708004a0f54d37bc87ad819d12c84a18b6aa6e58658db6b62ccaf9352ac9734d240b42bb971409c7f66bbcf068b51c91bebfbb2b3a5fc8d1792d13053621203a993c996c8e2b7da82799134532d724fa60fb845ba88bf052be8e2f8e2569c4e230e463f45aad7745d520d0c6a0d572046643360d51114a98f2ef0bfc7e821894ac9c84287581859348b24050ed37fa03524156cf08cce9c209918c9e58047362c8e861215692d1237ae52465327a0243d23b72624860ae6c35c098268694e32307e7d092ba9011ddddf6da30381851b5e96513079d5dcf6f777dcfdfb6e23afe0bafeb7b6dcf8adbf17676bb9d8ebfffa25ba821c786ea0eb1840851419747e306da5454f63c34e19b3074e9954ae96a5be074df43e96462a87801b8b4c3e97b7e7b236f57006d7d3ec5eff7a794353e45291f476c783e8993ec62316302afeac877918c121c2e0ea01cf3863d98024a75ef2d20aa9b38ecc6de9a6e3823dad9f6b60551d4f6fe4207de45597b7bbf08aed26c7f0ceab6570bb5d8bf36dd2b38730f46a0ee6ccc8d0d78e8541eafe38d0e63096f080e626c8c08b45af3fc5af6967a709abf69bd7d79dabbddda22533aeedf5ed680700b23982a10a64510a68acf48ca5719f8b8b544988f8bfc4fe3873a1bca962a957a8501a872f0d8eb877bac18d7a4ccb82625c675b296717d6094a6ff135ceb7c260a9873a9c2b43e71161f9bb0ea2a53e717892c8507070fb2fab90ca530fa87e6b47018965a12a7e2dfd352cd5ef933fb0487f36fdd0f087e1de4778e3880047b2b8ea2f200c8129ab535066d21b158db3cec2416ddf2de51cec024e532b03015372f5af5b119d6a6cae3734eafacb8d2313a809014f9fc143c9803571de1f91a1d40a8748fa45a922d7defecfabb9e940d8ff268b33c557a0ca9a22a0d3c65061abcf5d5972cfbbcd3bab128df16450a027751c697d2cd61ee34bad5da88b4029d8cd1e2723cd5e56302452a46853b9b5edc6ac5258a0229282403624920705a2025627da861f52f3cc3a47c73a2dc268204589071c19859d717aa0b297088d47444e6365bddcad4d4a08ad514ea1566a7325a1e7476bd17bba047cea09bd2085606500eda8ff60a89a93fd3334937fc89de753a5ea97795ad153db8b5a2e2d6ea717a65c5d56dad3f37347fd784afd6ee8bd25efa5e7b3f6a8c0ad5de4eca6b067b8be04ae0249b24f16d2362b78d63490c2b0f2376569407e4072b8f1aa2fa86ec5d4316489ba4b751d4f5148b512cc07517a695a671b71a3904da551a541bd2020a035053dd9aadc5731b45e4b05c9622caac4705b0c402bb3832d3799a35ae5923888cc652231e29a1875d69539e7099536cba8c52c5781541c3bb23a98044a95a346b7229e524914d06974be781eaf215b8be2e5d533953c1308047e0a2d4907664a56f361feeb594cb2017556a476dec074f2a8508f1524eb4abaf120543b3b1aec6ca1c7f8abe45f16dd4284cafccdc2ca1ab0a001257690056abdadb761b4973725f779f4efb97bd7a35823587ec8fa812f4834b238f29201902efd6291440061bbe41674f07a21e821f6b5eb6dd7b2281f1cd52c719b45a4c631d0b63dbc8e7c048d786c05c999e92ae8757026f04e9f90af54ea5b9e2301ee442ac4f11cf6849419cd163ad46c57ea6e103f256ad1adb6d5c240b1e8db5e656738b6d350da3328f7896366e273c640d0143e3edd9278df0d2461c858b46732b2470bc457d60c681777e15870f066c288fa9b73226cfcd02a617d538644f68f19d4a4949e1294a0407fab6beeb3cf95a5d3041957b755281bbf3fa7f053ce49c9e009e38e8e8615deceb45144cf9809e98c4f9cc5e9515cffc3c3fe1d3aa0654f69038f69c40faa7c4b14a0ff6617a02e6a50c6bf6194ce8c2c9c87239407dadc17269aeb88bb49b48f0770a094666b65b895e2e9d7205d4f7da9da7a8dbca90da7abadb92daf8f8f695911194880cb7f12915653ebe7d7598cb11d28c0543b7490884e49ed720421ba3172eabeb30f72c47d036beb38e8dba166a8bc09cf09133b0805aa36ab5a6385fab4eb50e89afa55ed757a57d5d1694314a14fda8365532cb5354d95843d10f6144604cbf39d99369f9314c21534451668402eb0ea0c746b6c45fd77370bbdbf0e828ad1f5afdbaa8c0f1e5aba4a2bdb6fe005e5f06f049e3638cfec386a6f2cdf710ae680c82489e6dd74c9c8943b9298da0bda7353caa37fc654c47c068ec18bbc713525119795fbba3fa3341f7a8c9918a14a477e7d835591a1226b6ba72ea20b586ab46a9acb61f22c16e1ceac1ce61ded9e910a801b858d1a3f08aec52605e5a61820155a79ed4a9b367514aef68556591e996c53cde39192c1c260e0662fcdcaf3b6c0e70e8ba0850604ec4320f51849e4340e0dae19041e5710c94b32a73967697d6ac515a3273f5d8f9a7b070495bbb6e2f79defea3dab4f5bbd0f35ed413e13d6dec5cf63fa07aaa21a6fe6e677fbb3cb14ebca4ed9d5d81520a522399e27bed6d8420e4990d81071e3e09d3bfb13114f308c3b0ae97ff23d844936dc1889ddb147191b264162b61d78ec64429a56f1eba04d3b47ea5916e631847ff9521e15f126e04a9a1495cbc3bcb268c270dbd771ab3249eb1245b58c407bc41169ce53b4cf0e302fcda3e2279babe97e5cda77bfaea4ff454d465f7b54e9af3673afcaada61d505d1a211f314adf42ac90669b576f1a5bcad957b7028dff349ed324b45e29febad192ad30a8a38e996119e5236f15e88c6b41af38edff69512ca9e1ddf69effb2f54c27e29a1eda984424d9dce6e67472578a5267401bf14df56f1ed527c47c5774af1db2a7ebb14afdbdd29c5ef5afa35263e39d8f13bbeb6dbed4475ca3ab99a4d939083c845f7166f4e3e1c5e5c7d383e37dec47daf5de8d2eeb6a79a6cb74bf17b2abe538adf57f1dba57835f8ed9d62bcef59a2293bbf1aca767116b7bd6d35bdedfd520135c6ede224eeb6b7d52077bce2ec76f47ae8f8a5043dbd9d76b92ad5b94ea79c8055753a7b7bbbf26d9208eee5c1fd3c28c1bbcf0dbce613f6f9f8d5db93abfc56d5cc5edac906b95e5443cf9669cf24b8471f4ecf3e1e9f9f1fbfbefaf8f6d5d579e7e2e8eaf5970bffeaf8cb852eb2f75091c3fa32fb4f2bd3b1cbbc785a991d516625caecec6f7b6aa076f6b7fd3cd8ce839d3f317cb39ba47efc74836bc7efecd78f174757dbafcece7ef5afde9dbed5a5fc27946a574ab51f1e90758d759e522c6f0d8772d77f515c1965e4b076b05836f0258e28f5eaf8e2c8bfc262065d389dbded177a72f6b65593e685f8d35a131323e6d3d4b5aeabfb0204440b795beb4645e6bd3a3e3cd20f673b7bfb9ede867bfbf2d0c0a0efe5413f0fb6f360270f6ee7c19d3cb89b07f7f260de9a9fb7d6ce5b6be7ad6de7b1db566c0ec3760ec3760ec3760ec3760ec3760ec3760ec3760ec34ededa4ededa4ededa0eb676f0f4690c529cc703e93da2dbd9555359adc25644d515f138baba9e156a508a66ec2011acc976bb7aba495890b8d615ca65fbe9fdf9bbb7ef8f5f5fbd7b7f71d5debedab716ad367062d11f3fa1f7ce3fb28af74e69193a1543d2bfccf333ee90fbaf6b7c7dbe4de2f9ac9967ce782e3e8dd07a746e39d4cfcd8636d113c9337c5adfcced87a2c7bb88dd364e8399b2fef947d69b6b8710cac0a14f606e8c62288395a2bd892e302915681398d4159006c37f4a9cfe1c2697a437ab36548e6a6b019365fe22d7c59fe6ac692825c72e8f66f3ec3c9e2703467a52035692a91f8345ab657de09bd0201b4c50faea486b35522cb512dcd338e1335140fc3e98b7600082dc87ee284e8e83c1c4714a14ba0d88c31e81a439e4e9208e2236c8d8b009c3200bd0f9905d4efb69d940bd7c09b0c3d643bcbe4e2c6255b7220442cb0954ca0aeca2564b299b12af71b040e0d84db378e6c8d7c867094b59942967b2513d98a9dcb22c1a3657a4648e20a04cd4981b6e48640b4192d534e13dd204962b3472e730db944b622fa81422eaf5a297c67c5ab4b545426941bc1f5dc2a01fa9473e321f536f4a87767e23295169fde8b2e7046afd7242d06181b552823fb150f88a40a01644f063eb41140df523712e16b7d59d6038ace94cd013ddc1b4bfdc993fdb939a72ebfc93941721462a4b20491c86b62312835e067d567519264df9ddaf00cde765962bae02d2b151106240c6c14644d271cda1e536c52fa4dbdbdc8a5fd540fe36e17572bb1f865ee11219c861c6f1af07b78c4154547eb366e10f74ee2aada41580e594814f697113972f623fb3eb2f1f4f832818b3a4db380aa228ce1a8349108d59c392d53752d188ba7f9d99da1abf7e6c0c04e688b2a675edf751bb623a9f050376218e5a1bb098b27cb48b79ed0b5a63f9d8e43d9768a6265392375ec994b31f8220492823e43ea9b9284c59c8065913a604d6274b14f7701e8169d7e6f863ced877f658fa23cdc84c0fb5836937da686266d9e6c9ed483a04027a1f44190f421ea4ddc835614037c422064d194ae3984a6fc498c8349a7430aa5d8d5dbe02e94de5cb4714119d0862c449200354f7b645e568aaccb9bf0e5286b9bae94a5a11f863ced2d2227162e2661316398bfabee31993ca33462ee526dc91d54a79e9913edbafe46fcf324122df51aa075407cc7681a53d49cb28d22d26567c6a6576329862c06a7c6d89a95141a7904e56062321695b58d133f4504527f2672e7fa40b6b98b9234c1a61ca0813464102434aa92cd76a8d303c0a92e5d2a99d099ceaf72c48bab2885c036ff07b1424cacf29a68c644d72b16594b9d2da264474a6a9f2dea933832c7f4fcfa9d7e32fb57bc31e477758519f5f025e0654467e56f44796ab04b1dccd564c1d4e3d08b45d811e7f1963cd419f5fda5e66642dce8671a1d2b0494b88c8fdf51adf7159d177dcd59a6c35ded3127a2d8e5ad487bb889d2b7446e1ce4aae7a5c260d82a582d7782035a6bcef6f5f3e7778dff72e9ff904d242cc16ba297078ff85083ee7fd1dc19ae0f733fd3d17dffbeadbbb84097582fe3ee60fc4f78cc69b7318d2787302239a3c779ecdb72604a674b4f96cde2b8c843b6482378c71051b2fd9ccfd631e642c89e4079e2048712741948641c6be38d3c2f76fcea8b445dc1fa8f64776564ffa688bb7467043d3ad112ce8ecd914eee870cb499e4d09dcd2c166fafc66730ca73494a11eab4ec834f8c6ce5892ce18eacb380bb8835b7c5f7e4356ce0c5d01c14c221e695eb0278d1d200d10f590f43e8cf814cdca9ec4f1cc62738ccaa83ab9521a698f4b2c3913a312107355982287285646a2aef6711fbb06a1f62a6c476c5fc6e77b2aa45e2f7cc9f5d60c355d3aa7bc1f8a651217fc3ecd95c363b9cffbe1656fa886da1d25f154de34cce5248fe2646a70e1b03a9c768172a228a09960e41126ee1d4cdc054cd465dec45c66a22384564be30c8941345464b592ae508bbc08765f767d50e9fa940e44d7c774247e0ad6bc7be356cb99daf4a99eae1b395d3851e33c039e601020313fad90add610dcd48c594d817cebd98966b7d891499c059548b97f44d5924a1de32f4299f76551e88bc960ba6151b2560f16b53db0f3dac063bc05377e5b20e3b782b63012a58134ee5625ec3779d77423a51c0bb23a6fb5ce71bf094e5d1392857d59387ccf0d01ab94cb6c8ad49255453c671a8c3d2e8751b65cdeaf882b4d5e1e3015f8ebb63321ca9b61ee40d27b0726d455ae70ac3c48deb55a2a009c1aae45d99b5e2e5500023b4d117e2255d38071a15e4d4862dd86aa4ced3aaad6b14575d55818d83523f391dcb0d74970cba3f12b63b5aa3601c242d958604ee328f6a012d36d2a53ff4d98d90547010fdf8d4e83dfe3e48c25a889150dd85170c3824cb4fd507ad1cf8f54a01dc65335bb34530b895dcfc7f47e3061836fe79360c812d4c24ebb1b5a4b359867313a22317e404d0c6a4855a35173a91aadde979a84344e32e933363571255fc0fd4b195de7813967fa83e934507c685b46c5f36c36cf8ea3413ce4d198765847c6cf268b940f82305c1cc549c206d2735f9a7b338d23762a6d44d06ad4f1dd2c4ee709ab49fa3ce119435f803a711adc9d5a2eb1e97e31fabd98ab30a5dbea11f60d8833fc1aaee014cee1182ee0104ee00c8ee003bc86f7f00ebe4bb9f03701ec1b39b5afa8079fa807bfcbcf5fe4cf5bfacc875fe9bd765b2eb7df4c19d197ae9cb457e4ee86bf82cfb2dc1ff2e78b726af455fdfe4346ffb7d15ef967aebdf213f58149840699fa8d98e52ff0bfe19f04924a0c47714320e3ff99412c43f308524c19e0df50c67e84392b334d1396f3e08a73fafde0a7aebfca920522be19a3f79297541c44971bfe31809cf78ca1baf1bb29d46eeaee00cafb368487b660770677c9513c9d059940fc624fc9e73f55de11d57014be0ce3346bc2988114c03c9c39616916274c70ddb280beef9ca223c682715c2cd7841923e51476376309178821089fe5d9887e9d214facbadac881f574037f1a788ce4764f15a052eb6711cf938612570c1b41ee79be49ba4facc86d5a8683a7289f41c47596b0014f791cbd514fa19df5895551ce7d2218f6531e757d90c1e0aeeb8b8520cb75fdd5ca32512dc765bd09f45c35aab9c5dc294b5334ee6099e51d8a257c830b7b12098e04957b1c295b0c2347e0044688517369b59c9b07aeb4e0668de995fa245bd1e3e174636fc5ce2618ca61900caf862ce137816042d2620ec5335ea10bb6ab398fac86d67afa5adb891c08e96bed9f098ecf8280738711ffd011c4d891ff2a09f084112328391f046190383f11e5449810b8cb0dc57f51de401f2e200539239c3229ccf99ec02906fe5b02710757b08077704de01ce333319b0b0292ff9a89af73917a215def8aef6319f341624aacfc10c3ef12e7bbece989f42397c099bcb14be0080369e47c873bb88094c06b8c19c8d5732d4a491f75432be6da5567414a0f4d10bebb8360165cf390679ca57401df5d7697b108ef57e80d7c7795fe9748bd82ef8adb134829a527f05dfad2a677f0dde5d128a6d72bb1c0f1741b49f49d71e73b4c89a444ee123a62f2ec93a9bf897e5ec0a264929ee4387fccd0e98520b8043a7c2d292627b7ec1dc6e3357b50e1acc6499c0af4210e51cfbaef133bf1e9957c54185755e483e8a875bfc50a9ab6f2d167f688cddd05b38cee32727f272a812b6dcd94919553b0c56db571a56daaa9a994f20211d26e2e6c6f19876ec24216d8ce72a4b8cff875a65356b892607735d8b2315d9533e5f2ddbaec6b04c1aa96519c0c984a3e89d3b4faaaab80fac2386557ea3468921e6a1c8a387d34d555ab66ed4fd4ac4ed872e5822fe5772cfc2878b59a2eff945f0dd4e563dadc9320f45b2de727caf2ab04fe9d39ff0dff14e7b9d59c88ae314994df05550dc19496b0a8251595934614dfe6267482c6af4cd0cfed46903682a8a1dd7d3409c8dd3951f7c4022aebc2a50491342c3062859b9f8327a80f1f05d17f99eb1f01a0baf1f9f56363c86ef8006da1e5d73f825870fe9b32f8278db4f6bced1b9e6dfe448c367dc169bc4840c3b609de8ba5d922d48f70d9567376d7041da99fdd626cce9c1bf993a0651944f6fc1488c5bf67b286e52affc2cc6dfe04ffdccc4fb27c161f825b4ea91eeb9f68523fdec9baf14e1e183a0b85484b693ac75f1fb75285eb466d7bdda88dd145bda006be58603e041f33c4c3aad2635a94f38b1145d3d2128683484e1073ef80b90b60ee7760eeada087b5f568e9c7f84749150b734892e801b8131bee6af63ab09335602715b07f8822ab407dc1d2ba1388b30ac0c59ce2182d253a9c51bba31f66c11f73765e9e52c6a855f945eec8ad923363f69db22514a9c27b54cc616fc0fa7247c524e58be9c8f6c5546c1999d7075bc61c95962be58e8a49eb5b46d5225abec592f74e5e2fb755ce964b465a2d2759cae72e04f2b46cb9cc541abe78b1dc272c97912e852f5ea64a972929b45f19b83cc9d9f0d030b55f2820e5536b0aa019eb52012db95a5fc497de06d7c966d7907f0f30fd8fe6aff0fd27b97b0438b3c25756f8c20a8f2c7f0a70cbb47a572d3d66968c24fae549f16e3a65432e88fea286dc9d5b7460e9686d80abfc59f82448f5ad658ac685b400bed572f20f3a5522e957ea7da4c0ca932055c2332c1861188bc9e0ba429f6e6481f90d669edfaccb88eb49e645d723981d43d512ea8e150523851e97bbe84cf10d962ad8d97eb1db86bca36269cbfbb0d74116a8e4fcee11af35a0b3e36def0b745a72dde924857a6c9fd82891648995033ab0e3b777c58af5c0ab0c683d987260d70029131f0531afa31e40995e0f1e4e5d3d68f39b3560cd6f1e054996ad07677e03ed3a50f4e2a8870657c91a8030ed51984c0df56061726590eedc351e5b1d5193a021b1ddd4d91694973b88e7514674807a4a4145f1e1bdca467fcd1336a81231d26f93d65b4135b46be50a34465774a72c9db45abc74639fb164caa320ca1cf2d283941e32ac30014e7a77aee5a1d5492096d50de886dffbd5d5026d344ec387add6af86d3a534553146b44d297536a415521347964bc7aa47d4027925a9fccc6b281787013e777312776a89f6974bf5ad769138b23e68671f1c472a25b2a8f66ce6a2540ce634722d11a8dea3bdfcd54a6839a6a294ce974bfc515328cf77639400ef9f0b4952c11b66d4ef95fbd26a39213d1678ebb38ecad7614460468dd2f66bede85da0d9093d47341e127086f43d1133f64ef4c69910028356cbd9a8928ddaf9d6c296660a5af29d96018ab5821e2df228b9f8deaac922c642f4634244d5f535c710a79935e6fa157361cb481b76285d32f1bf06e19ce5ee24d2068f1a81b131d84f2fc5a40d7ea69e8c0b29577186c90fb53a43a8701dffce8630a1a1cb3336156c57c1bd8b736b069a1071e6f368ce94fefdadc22f30a4b7d2bbe948c42d32969eb144ddf0e1237d1ccf8c25210b6ef4889a3e4980c6541a98846b3a76d32ce1430657347463f440db1bb75a637b562ad51d38153c963b9376063076a72c9d9cd9edda3aaad3e0ced47d24962e32e695585aad6673acd63ae95631e900b1701943cfd661d6019aaa9cc3f5e608ae3647eae173585d8ea685c7ba1dfe3dddae56b319fefddd16c78841234dbda7a4024c532057b9546eeb5728738b25ec055bb3587b0f0edc96077ecdd158c8e23f9ea5fd78968ec8f243a3b5e5c1360cc5b9bbbb0ddefa6cbe95cddf5d9faf6de5ebb4d7e7eb58f9b6f7f39932b845f9803da57119eb9c92f496678389736adc1e0d829435dadd6263edd18d338053d2bb4e58f0ad87793aa53c9d9a3cdba53cdbc53c0a8d9632f92ad36ab55a3d40bbacf2d3333f802a13d681895a618a1c1f69059bf0406d95ae3a30612c307b12dc7e0ca23193cf4d3667705d88c59c9b33b8d2d5040781cedaf5e0d68e5679bbfe730f4ea9714739862b0217d458361bc178eb1aaeb66ec9331f0ef37c1e5c3c3bddf2d19e8a98ac43690a52914ea47c640b9463bb1677ac34118972b9cd09139ccc1029a978c81c9f906efeb59d1bdd16ed886272ed9cd0043d926325f9fdea49abe59c50dc4b85a64f543bba92733646c9c081dd7057a79ec4f1cc4a69db1075f47a460fa4bc588727eb389f253c63ad56a11fbc4c3f1c0c15d9aa63532782533804ae3066375a4f5fac2d1c55b1b2005f66764ee1d0d82b19c4d3190fcbecb033a267124d42460812258e523f952aa24e41f48423369e48e771b3793ac12fe9306e10a4789d1ddfb65a32517e398ca006d9481a32934a2d4ea6f9eefb55afb6396d3865aa086ec2474ed152839566bc2a26d4eb252ff314adb5986c6d913cb69f5cbaf339471ba511a51b7eabe55c30a79001adbe41d4af96ba4462199785d5d083f5552bcb6b5a1122799c2b962bc3de32ad0d9babe2b312c92aedd449b53d6531593d6ccc589a3999fa2244390bc4779d24a2daccd58764c812b3e1706e3fbc96fb9aa16294b6666d9c0366a4981d354b7f6421148acb7d233bc3dc51324fb3f9f4681e866cb85c06ca5257ca0699cae9e01b95566bced6689817d599a5605066d97642a629ec0bdd1b467a4e4059be8af4608aad2cc076181aaa8960cedcefdafa8fdd03236492f27da92f46fe0288601a466da51cb6021066141108c99c3085cc6448a22aa2f898f36f3c8a24161293997e6321cbe2486a3a6f507a5df01229ddddeb3cda2d2494cb954a1178640ee5e08839fc6b93589c40fdde418f53af8225821c3908c67f2c36410a29f56040638d1ed297835eaa159b432454604e837e682a462ef2b2376fb5e6b5cb64ae67489bed0a9eb29ae413e7fcb906b27012b64919b653e64c045c1205580ab5e71662b09e92801817fd94e465808f3e941574d6e79790d2d88d71527024b4dcc128878ae3fd203603d04d602eb289f14319801e61f90e87dcff4123c3814e68a495df61463d18e6dd99bd1c4a5f8852877cd29f5df6d202e29a6ac4d56a39d55ba5a989a99c295302c7cc492183295ab69f13bd5f95f6a04a8d54aa3586c7ac2838c20d1e47afd8284ed4ee76be5b19409f9b19fcb15c46f8d4221eb2f057ce6ef53388f2fba7a8e63546f1890631124b55c79865efad6fa7d28a28b10e0fa9c93e644e041970606511162760cb9bc408e5f226f569c99b7c283f365764468146f85e2f86971693d0bb2cc46a8b7caf11e421ac628c1904a427e6e0709469b3880f4e413e9917ac78d9a345fbc0e9486a02b921ae18084c84d430912b1a04a290d1dab9434a0f51a742bbe54ac56e967920800c62e646f3a9540c561fef34ea13e523020355851cdfa3603061ff640b272510d2440f3b1a4c2d30b221610fd96f5d58876ae80e54ad1b940e08eae1580e3f649ff105ccafc6d26d4cea12682c00f18d8d6cc3b149551c96bc7bad255922df6a8e02bb433718e01db656df496140c0f48d86e8cb8a8fe2649ad2d40421715974c39318bd5b517da69d2b2d3ebd5c0f323b9b52db2f2b537f2f4540ae6f1412655122acdc87e06eb7a5a6627147f3e9b936eb5a5096f64aa65abf97d5a911bf4dfa4dabc6e6d6ecf267ea89e3775dbd5b5bab1c0e2dadad83436b677b96a1caef65dded020c32ee211854a9adad9594aae613d5932404ceba9e0a49647c0c6e8bd1a4d5da50af2c94363cbea38ce6d3a3a2e67c61b724e5cd426bf6cfb0ac7c1f330da15861a3788cde70c7a236c686a9529daf552990cbeb24985eb3242b7649245cc4f8baaa147b3689a37135babc4865cab952572bc7e54325460ae96cb9f7d0e7f69a8d58e851abe50cdd607acd111b8c2799bc7dbf09c23933484ba5c350567896c4d7ac946526e260e80e11e9f2380a42d940299f955e935bf6f381323283e0f7677156db8048b0d3ebab14c9a62e51fb61c282dafa74a2a0a405115c9b09530a39ea9bc574d3ee844d793a9bb084d5562a928b63a497c1ecb1013a0d66f525910878b4b0c8a5c6705d9385b452de9a46cac97aacd6555f4c2ce7ae69a092aefcfde527a140d29f140e72088ce9347153f6c7679e4df0bac3998a4f18e29b79954f9c8f746c7958b728e3d3aae17bebd245a08e00ad423cf5e88915591111484b6405fa21454d30c18e6d50fa99e8cb184629fd8cde4e8694d2b7bd18d920f9ba3c2ae1389011453a02a3d46a0506310cc82ad2640aba273276ec0f0c0d11eb415d2e23d1d5562b163f1b94f2e532b6fbb6416920a20a2827ae271dd2228d74702109cd8474ad862bc81f6baf9c08b470268826cb8702ad39160ee2d271bf412b1440ab95c395871c132c38aa3623a92e4361023354a2167fd092cb4d3e98702d6ffbac557a4be3fce0e423e7ce9de7cacc37baa0606c667443b0451b9ea8d643ab42c30d4adfb65ace5b79f53bc4f8d972f979435b0bc417f86af543b3fc18b809d5c7d804166e188f83846793291fbcb6cdf8166b0be3b14e7d73d484f6730725c1613c76d050c2964f9e63ccc9fb3621f05969067fa6acd48d0aad10d51fa151ed79bb6e0b8a1416dd9c0633b995cee9b53b0df4136b2d3de81942f5bcd53ab7fbf744790359397f0adc0a35a1135e05291f3cad7be59123e529e2e987249b8825349bf041131409518c56ec38fce7f443c4a5df7814f1685ce9d38d61659bb5e60ac80a650da6bcb442f161264f40670a0934af793454751078305d55da24cae24062845a62b71e6bf7fdc7ee751c31dcc10b179ff8fc8a1744da7e7151ef41e636feb24415ea1a25fd23c99cedcd0b637ce390cedd01e3e1597ccb920fa38bdbd83924f6a5cb216c4bd8e47b1af431db694b49d6e1e6e1e636e99da002ab6c54cb166419f9f4e6b7cc3981433844ef9be07bfe0ee91573d31328c04ccf8adfa8657db82a4e9495de2c66875335ea7579455dcd6af54a02509eac63595603da242b65f9d2198a73236103c66f983cfed08f682146e0d552a6729612a085b42694eb23306cb54a58b7e6c96d13bed7bdc42d8f4aed8bdc52d93c411c4c45c27f42c7e084f496d43000b6a3ad098436e15f4eaa92fc8fe5d0c471399f4d60af4f5b57da6209d626ad2b5b6201cac9154abd908100171418d2416589d6281e5b1c959438665aef2d7379fa261e1f3898ef3d0b34e39549933f18fdc68a1d0509e9aa52c77733a9573412076d94f26c61f20de5375939b7c0e5215ac1b90727ccb985485e13d6a0ea0347652849e932570c46ca6fc4124300ac6f038115875044246fc83e29d6b52258063698874169e4742cde1f4c78c423966ac6c920bd2c4f029f3ddb9686dd82a158e31a68ebdb006dc591de8ff7b397b9d7f3e94c67576193557d834c410b5e85348c011f1566523e64a6122beb267de613d19096eacaa6cc57be7e748c91005bb5e8c1b41248a1e1ba32111be3c50dbae5e0e92c0c06a879a56128c5e56bb1180fc59cc561a8a49472bfe2415a9b592454d6598150f91f5b68ff6fd5fc9fbd6a2abcba5a3810e488f44c59d63079ca8f42cef48d01303761a3102d57d918da8e0426df560ce22033194c8c9dfa319e8f27d642cc6a92402c4ac622bc991581d2ba165162364c493d157644b57eb554abed558adb290fc059aef07d616d96a26b96615d0e029592b54098a4d2fa7da0d57c212b5b6af8466a90cfa81db9520ba67ba6974ebebe4e836c10cc1e3f65a7980f0743064d4bf2f3ff218eff30c481d28ec7e7f5ff90ce70a3e3fa7f647fd0f79eb25ba34533c5d55849c6cb721624baeb055a5c4702caae2a59acb8f2489afbf647c6f1ffede5ff90e57fc22356e4942a46f1877c349aa7e503493275cc8d67c1c03eebd5b76c037413af8374c286f9fd5da58d209d9cf3ef560f550430378bb320ac4ddccadc713053d9d2c208e197dd51a9d4554bc3fce94e8a566db8c4c7e64f2558dc9dcd7f8238c7f4f1669f6d78b0a1312bbd3cf487c9a42394ca279a499d1d44b278b7503a2a66d7d2dca8d592cfa5a28a6970c1cadb666c51556d7e73618c2c5ae3a14b13b5807058a572e1df3eacda48634e426aab8dfff78e64e1dabbd5726ee540150baab1bb2d8d5da4bf496e12e6d60db3c1958f356148e5fd29734f2e8eaefc4ad6b6c9da2e666d139826ee7c16c6c1d099425cb832845b38adbbba904f7155c6f78c0d8d317a529f5d0d6cb548abe53cde7c7d4b505da36519fa8045194b9a90b83254163c9674c644c68a1a59b184ad8426b2dbdfb5b55b35dbea6c37f95dec8951ca5abf6b32fda6f9e16d9733e422a70e17b3ead88a31873ce95d9429b9db035b129ebc25211742e8ccd6778e61f338f5401b38fadc94b75bcb65d40ba42002bf55b9401032219f1d17228b9e0c0f9ef95dff890c2c2af5e1c4a0e51f3b9b1d8f573277a77c76c26e58a872c97bef80b8575756a2e83f4a9d75e7f587a95b47409e66a6a092a93039416c863f2e8c7d2cabc3df6a5dc56835cb0789c196d65460acf5ddad503398a314d7b5a82f4c375f5d430462bc0a77c52990f3d3986447743377cab220b4d3ed080bc3639afee896c55849496895e3c944a4ae71559ad024f794a9def7540f89e4c98744620e093d87075c4f4bb7b05ab835f316b01cdd54d703cb292f01cb6b80e575c0b66ba1e5f9916690d69985b4928a30c7c4886da2a729c71e3a068a938ceb38a913bad891b85aada997c8c98aa8b6a34afda84013fea77819f85fe565e03f959701c7c2fdc442fd5584568a27ab5bf690ad7c563177b65c5eb156eb0a6df61102cd793464231eb1617383668b198b478d5b1ee1cb1d59b5b62b27639f6206fc8a5106a31ab89832e4825eb40a165b4a6fd290b485a4f052d418f7e9b72f1ff230ac0d6d69d574d26d6413ed4c58797cd675352641dab8662c6a68175ae858b8e2718cd83e85a3022816aecaa33b7f064269d4266441f2287cca659a0d5552689e40d66a658238504f33f8c8d9f846ee7f4cd91f2d352bebcb0f3c0ab39d8718fbbe99f27622c0a8cb3662da6556ab555aa268aa63c4720f2f4e4608ac7ba75879a281e87ab9fc9d40c8ea5cd09415a420ab533a81c0a80b9d950ae033ad01a36b4d7f43ca68cc24883566c361806f019d213da97648bdf1f3e0bb6d809cc0d01df188a713471d7585647c791a2799c318648c40ca5aad98b9d76ccc2375816e341deb9e3bf4a6e62507970f15cb4f3575952c1a9a0a95a3b36814e3b2f8c852712ce791a86de9581b2452a9e5ed151138d2ed0f71fe12fdae6b2838833fe60c623ab404f69954d88f6f5892f0a1618b24e6486935a5a7dddfb45ae7cc09b09194406cc7c62a56bfde2a17a8cb5ef74045bef494afb07f6fb59cd3821f21d9e7533e9b0633e777023a758d777ae77734a0235f90a7d2e7005a7d6369e66c78b569a741faad9426b9f0625acab2b3385c8ce3e803dad27004af59b0cabf2a3ad85f6f465acd5eb72195f11a3c6d4471d608a28636bdd088470d5950ee69d7768c66b95f299c246fa48aa1b6a0ae5fd7dbde5a3abbfeae078cc01bdbd2dd21fa9d119cd19b7aef69afca79e584201f5393fd93ed982d9f9c9a9cbfdbeedeea722a6af277cae015cde0138d80b55a4695cc98cbbdba42736a565f5bad53b92b8bde30b591af37c0e9067a15572a68c14395f5d6faf13f70121af4b3e5d2bb14357aa49b509379cd2a3d28b764e5b3a7ab1bc017ed33cc3ce283af3a4a196224f00f6a3ec44297cbf0294625e129361ce11f94a3359b5f143bb46e5925047ea125cb960583916a1bd9261cff4180eb87776a540c97d29bdabe8514d3de7ead5aebec7abbdbd0d9f6765f6c3962fca566328ea756b48b44f4cad04ec1d09e05b4e39bd61ac28258be6814a7760d37a511e7430b46bd78ae5d337a016f501ab75a4e4ad37e7c4920d54aef1b7e2fdda0f49707c6dad8a0d22e12426a060ee6141dde4e830c2d12a19916e5b77f83d279abf5ce1dc4e2e4ce9c39d95066f7cd533da7b3b3d77961fca623a84fc26975c3db2d92920ad3f1a8f1f1edabc3469c34b858f4e8aa40d9d147f2ba21c1779bf8d66cc3f13df4dd3d592e73d02784d682be4f964bdf434fdd9356cbc9ad542d97ebadea9b34eded3a8c932b39e23a8bac76b752edc14deee4baae5c775dba6db59ffcbbc7fb5394f271c486af1619fad27c60ecc57a1123dfd9f5d027f8d4458732b6b3d02cc8e6a95c8ae420c34772d94baa8c2f3f4b5aad08e32211270d093fe3e23c12404b401dbdd9ecb508f6ec4240ba7f691c74538d51124f8be3320a7828f803ab4f385083580c4926babf1af12808c3c5fd60fd41fa0b59fdc8a1fff409ab9497c9391920d0b605cf45ac55932be65b8dfd55bce3f0f4f9873a5eb3f8d669c3b38800b70d3d672e9f0663359b9b0981a02e55ceab488e693e6f99c23ca477eae6cf87daaf9d4cda5812805fb0bb77a20a81cb77763a10410cdaf0b0c0be486fcd2331e6aabc63f75bc5adeb3324da9d5da11f2833b6212f801d69b0212dc48abd50e94a242014fce2eb200bb430792ad0eff9fcbad0b364b9f40a5d8b21050dc630c802d27dbc9c5566fdc00886a83a1ee4be043a5b33b875928dab2b5c8657af8f7fbdf8f0e1e4fceaaad5aac6957c3f47ecb671344fb3782abf9bf135fade69c2fd9065010fbb02dc8287f644f9cbc77e44829b6e36f56c8771824afaafd08582727285c29cdcb356769075db3becd94e5e25e77afd3fb152f47c5aa851797e1ad9f1d141d4f559276f27b041479b85c6f03fdaded38eb9a46dcedc45c081b634f13ceb2a6759f3341833dad9f1b6b7558464838268cce8bdb4dfd7f5409ac07ae6ab69d70fb1bcd54ff812308bc5e451c9e9ba412a90bea3bea4b55be78f2ccf48005d6564c91c5dedfe9440c1484577c35b1160fc89357f5d5b31e3a0ece9c82a8bb564560310db9514f32576be7ba325deddf06010c611eb56190c31cd0977f2892fac21b179e27f9c7f785f2da97c98ab269a8085bb793de24cff85dd3904545d5dbbe2d5aad2495e05fe31c0791570d49bd70bf349e03f04baa8ad9bd73bd25fa320b17b2031c399f418b37002bb274deba94013eec522b5d1cf8632f26f2fd6adadeae804a5d1a918a6146315479ff046f82808c3eb60f0cdeef60a52967d127ba85bf388ddda61727fae409c246bb3caad8c16a564d8b556b3a3e288bdb795a9b9c2e667da02a7ddbcfcb58038b4474c5d9e6c52ab1e883669a6c23dcb7017703b572f79c9a5d92ed3813edb4a2e69a63ea2adc4389c97ad17274be0b17a7ff49eeaa91c09e50e80e82ed42f603c08d4f8989123ea4a62c253b232d3b97616caf3ade76ea5ec12734879d997dc80e75480dc91411668a4ac6db36ab42cb12a8dd4de32865c95ade01ccf87e883f333730741184af895d74081139b457583ba73c6dfdddbdb6bfb3b443b0e9c293f7b38aeea5ad28ad2ca2f54bb57e4dfd96196b1682ea3b58b454bc897bb6254ca06a9c3c8aa6e0b73963a83c28693a7cafdd85e10c5b910c32897f86a05b8101ecf8ed96a50e1e0b1cd6e8c8d885d6f5bb42a2c15bd1532ea41444b50f6b297512fdbda222977efa816477d41e12c771726e6ab8af96e627e5331054b5a2cbfcaf9f2f537271319eeb0262c4c2a1beb4bfdce2a0d4e9f6de631721f6f592bf3522d54acf1ebdf51e3965fa8f3b7bfa5ce76a1cecf7f4b9d9dbcce717134ffec5862455fff7a455bbeaceab7bfa1aab6aceaf3df5055e752aebbaf95d3441b72a10fd7009506b7bc4b5a17ed5f2a94a95afcad5be5c0fe7d8d16a3db973429c0f2b9020cf0ff05708ad19d4bcaf5d905610d3dad28e8cfcca67eed8cf6314a435e4c2b2bbc89a3a05478b6a833ee63b78799f2030e18b1ce312d73d61a65fa104305b0d229962b7d95ce3266e974d61d6aac1c23870c0ffbb93ae961a203331d18cac004463a30e5cad7ec58e7b9d181850edce9ccd73a70a5023931718bc73e1f395f1f3cf89bb92df09893fb58d633cc7af274121f01772aefd3fbcfdc1d10ff7bf8cf7cf8f243857d8c55b9fc4b023ba417f3dc507f5f646a83076de85c129049b90df1a6f643d0047426c99d0c3a804e716a32cf6fac6c6de8489f75ea645457e131d7d3af169bcdd6a2dbd750e590da9572501dec84c5f59ff2a205c12177d3f9b57447953a0c22e206c3a1ba8d7077f20b0a27b1359e0e9c9138e083cd2177ef9e71f1b3809138e1317cb785290bd21d71e5c29f1b6f60e836e36e8b8a1a80b90b0c2d80158ffe2927abdbbfce02df0a1658ae1741d524c16210a465fa5bdddd3165a6a3d52aca15ff4bca05552d8de64759094b54fe6603b9b1461637ae59236528f98d93214b44946ab2118c031ea55923c56a52f7bf084c78d1da076ae5387a9a73fdd429378840de4b165265fec7cc3ad695d5d61dab2dcef81a3b24758d496bba58394fcf5892ce98bcda54a3896e2b0a8bb78c715aad092f5f853d9b2185a7d46c34d7656ad038ada735f094707510a70e271029d3163c7238d117f5d6f6e89d72678c9d740c3e10dd8600265cfa5c3be5ce8dccb13ec3c264a849bf93899e48b896615f84af74d8d79e5e988bb660b5cda08b8407d13864ce98c30d8705870d1fe69c68a7261b94c6cba59303f8ac1e806b0d806feefa9d071b5b607bb23142724d0551204ef89847ee503d48ba881d0151fa523e6f5a2ed39ff111d37299493bb2f73a67370534b3d09d7317d95687c0fca6fb0e95673efdeacc39987ede71b8e670c541b95d1c0503a60c59e1865762ccd55a06b851c7003b85a5536487d70924be3e7844e7c857ad27256b911f66b72a3d779b7d3ed727e1718589bee00eb9af9e795703e98851defb7bf64178f2e175b3565c24784d84f53e14a5d2ee3d8be662374a17ea80aa7addfea5208c24196174a60a6e7d0f95a455ddc96a43ef650ca96e5e2c0bce8d286e84713466492395261c5375bda2eb906a6232ae6846de56193bcaec81d7f20f4d07e4ed29ee1f6de8c443469b41960583091bda0988ad148d528a55a85026ae2efefac173210e9e930faf51da585e630f2d2e71f8f772269bb9720621a21e2434d3068aa397492fd2068a39cdfad1a5f43a150c87b8521caeec269b4dc7cde625ab82d82d9f7b5b794ed1f7babed2995923ac922837b846b3f9ba074a44a03a210ddf47464569c3c95e46fde432870c85699aaf8fdc7416f2017312f020472899c606cc2cdfe1500b0b90b53bb2b6cc3a6149615f612939b76f62f3eab23069723eacdef4d0f2bfeccacf5e2e1989a85f9a29d151f652cc91d5d1c8ea68d68f9ef9976ac2f4e4a076d31a9245349d43620171fef0c96d1df2cab3c13aec7ece959bf1ba817122e22ac0a4c9e415c88b931f1831ff01604bf6a68f7fb453e7dceeca3127cf99fb3d8ea7bdacefe961d696cfe98667c9777de0f9d4252f395eaa67f61295e2de7e924f585e930f98b5be811a6c9e3cf37309725d497f55bd6d30236ba31199a9704af572c2cb56897532dd8a8df4d163a68a979345fb97eb7731701a59a3841d500a5d623ff74a752992406ddb4027cee77c08665b0766885739821227d4e153d1f1d1fa4bb6436404f20343e06581fe4bfb4a72c8cada1a65504473f905a1ad28bca125f5c6f5c0200807f330c8983a5650119556c9ecd22164f8a3fac349ec44157432b282599c1628a0220cd22be90a8c7c5d74fe33dec1a776293dc5ca69b38653339eb673bdd4d4604e2329f535871173efa423cf2f0ebe7c5fc8afaff2ebbbfcfa4d7eddcaafcf4ea4d57efde762df471371764727b8b81cd2e31b94facfbd0356e61038e9324d55a3fb2dc894a4f8b31341d9a7b24151d6d415f694bd78aab35ca4ff72f242ef304d791c3c61eecaeba0db1cb2bf585d9e2357dfb195faed95dff814256c108f23fe9d0d1bbaa56ea3b955689afc1922dbf867584f722b42f8444b8bce542027843f7273c831ca96cbfea5da1171c4043b92224da0775dc1666045dce3ef6ee665b5854375978b6f089ef9d62697d77835dbd718a8af5486ef0854bd265117a49901565aa9af9f1bb9651b76c9064ff1c5c56d1247e386acdf6d5a5d364d14d034eeca3288667f560a4bbc8cc36ffb9938aae74424d5fd2a8e58735544c31f8bf75ae5f1ab60a9751d6082bfa9e9007b99f5983e6222b55ef26c7d76d96a45d54da1d2ea906e7510048628a354840932903e43ac2baf0274fad2cb6156623fbb24826bb23db7d601a8a110f9ff6c2b0e332f5974c8e5a998a803434ad98d9b4c25af1ed3a2f0a86c75b66b722806b7bef8900de2291e3fb9fb6560ee1f73810d22f981861b08a9928df6819477d35e147ac0ec41d2fbdf5efd5a1df971273307e28fdd99ee19ef9df0aa102d86accf2f099c70378b257e89c0dfdde464557aba6a9b7244b7e60fa1d28fdcb1bb5aee2841e644cce6abc5fb60ca1ebb8ead5d35cac94861e5f4d0e146241dfd32ad0a9bac56a01c77d4ee5b35ae9a1eb2a22c67e8e52425ae16d81f8efe3a777d24a8393122a8d884e7c9077d9ebcd681f79cf62fe19dfc3ccaf2f3e5bbd1535b235e28fae2c4f25f59f52ac1dfdd8c087aa75487e13c326a0d052753828e37ad7f7b58aba16228e6098a0dc6e920f5f3884130a3cd249e475a0622227f8f79548c2de82d7cff1b28edef626e0a4e0505ad3d468f3e09bf3b2cb3b2993b4ae2a97296571d7d799b277699a048eab9618b45b176b146069246e523e71dcfef538ad4ca3b9e5fac1428975cd267652196ffaa1e7f99203ed1bcb2eea5c3e10327f0ba068d4498f2aee0d59bbee6222667aadf7302efb9e1ec5b2de73d17ccab1e9d7743ca4146496e0a0107257dc504ab022a7050fac01c687cf6e80c28cad872095350085b11f8f6d49bd66feb6e5abff1625a8df924bae195cbff1b2e5bf38dc5f270718b311d2a6d326682d67dea1b2dfd7da5039f34b6fa5d06ae19fc2243339663acb70663f952a9bc56fe2a06a9db98e977198d3cf68cb3014bab4259fd5a37cfa99d90da42d87594a0c8df84e23d65e55a7298adbbb8cc0e32ccf18dafdefef523e12d0a5c391e0920089079861e5db5c82aadd075451ca0df0e955ca6e77ee499f4386f1fb9accef53c44b4ef5d82162549eca365246f3862bb92c2959341f2cc27f06a6d2a81a89f5cd208c54e18dea26f0a42ae579cf458e96239b4fa2faf98a34c502c8414df4fd8dc881833b76efc1cd26d1c61bc7cb81247e1a2318b539454356e7936694471f40c07890d1bc571749b45af9a667cefb56fc41b9664023bf61cbd774ccba4ef5d2a3f52725483b2e8a93a388114d0590314f493cb82e0fb09a789392092eae9c22992d1c1349563964d12964ee270d8cbd74ce45e8ba39647e37334f42db81435b6af0a090e815fb8b63d552c832985bbf104a39260c8e7e916e5a09cac16aef55255ef2f9c90fb4fdca6fe1302bf9b1be5245894dc577ee2fabe943f77e47920cdacdd6d591f0bfbe33b79de2110d36033805421b681fa0dd5ef5c6b92e048ea37d845c7c7edaeaf9d3696b6e1bd746416c93d08431ad56d3d795259d7a43373548fe84c9d6353eac1ffcfdeb730b76d2b0bff15dbd3ab21c4154dca499a8a863d79387dc5691a3b6d521d7d1e9882243414a1929423d9d27fff062f12a4445b6d73cebde7de33e3b188f7e2b5d85d2c76c778a497502708a7c7e370eae2896ae4068ffad3012cc58f1b481a39b32894211cb56f1044b5a825827de7f772435efc71c975b79c0c2298438c4e3842f3ea586f8a049dabe6fb56848adbd6abc6dbd62b7ddb1a9b7b9f875a9423da9b5a77ade24baab96cbb7a95bb588caa1ac7a17952715419c92da336dd1cb5a97bf47f66dc0a97bcc906fa5b288f3e12fdc1355e18eca647399c1e5f8bc12d96e8957a9ed9306c0bb17c1772f1fe6f1abebf74e7bfbb38f2174390fdba712fff8716477ecbeeb98bb6f1d841c9ec7dd8b5ec6bce6756b98ff7338955239b5f42f53d63b7d4708f4d6aefb6ef4979d7b5c13ffeb12b1d67137c3542ee0f43c899e1fc9f40d00df4a557959ec35df4cb3d24dbaf8d696ea0093ae5bfd8ef95b48bd4711524cc2f15f2eed72f48de9981fd6f25f3c4a06f507a7a946bf49d1a66b96725112706d684dc60f01786b24206ae117cf802ebf68359b7622bab07771f77e5843f3671c21f5935ad6e5f57eccd8fff63748e251251fac47f46d7b88a58aa3e6e2de6f937c32aff50b0ca3f1b56197edc40db5f69d4dbc4bdaa81fc02fceb47663f1db525238ea5794b49ddd685d2aefba17a8a4ba81c2a75fdb2e3c418a7507dfb416ad06534cb65b622374482b6aaf108ca3720660dc77a249b888f993edae313265f376a87c9a47ec0c750167e4796bdd2755886f4d91fe9433ddfd4dbe36bfb7e29af8d056410a1bb69f588ac256bb1aa7c2f5ece013fe5bdc0ef76f51cb1e4158b736a3d1e26a7a417f8fe133389e37a0676caac0c639ad054cca234b5935504b7c916a82186394caab0cb7e97e9a9f4bb6f2e1de583727c270549bd1cd4a3f85eb2361d50cdeaed338ad9ec6371d2de075bfa9747b47a53613de6deda5b49d9077ef7c93ec68eb517e2d358ccc313d46a057ef76b1183f249ca3f4be2ec4c49a9a42f037d21a06d8dec4de759be774df728cb2785c84a667ca532f04ae4454e9388c52aedc0588c563231d13ec6581a44c6811f7411d492bfb692bbca304275d6cabec69014435499336ae62c5f37ae29b52afda3c655999d665686dda7991081d28779034afbd558c633e7ee817a0cb16dcd0a9a6686fb3ef80318e2bb358c70ff801cc0c1f5011c440792f1ada97d2a6434c582073047782eaf9ca7e575535a5e378df1b49f0ff449ef87c9f191bc85cef0b83fea27830144f2cb49dc00fdd7d16000b3be3fd07e9058a2fcb2cffac1a0748d24a38a491df6632c8ab80770e08a8c8356cb19f6e301be938828e889548594ba3d91618dd6029a788f257b43c4450d03985b64499f2ba23018c04461c0b9b780b9b784b9778bb666ed6ecd5ab07b7a0cb7c9336e60090bb8862b38870b31de4646a2a5175502b581385d9a6c2086c45960ea8d533e9f65a8d0b27416b87f274d5a16a60c96fae1b439d514dfe5af0748df972eecfb52d765484df61576aef1a2cf0648d9c884145fb9d7c5e34f31f9f8086dcef852bf037513045119d2538ffe15331f6e99f9adf4f90d984580b62f82fb4b75b7962ae5266ac734cd2752637978546ca5fa609ee3a376ee268d609c6f87fa4216d303de58f8623bf086d36b7ce194e4ce048e6cfb229c982b8b574de84a5b904a5954e02b955c5c6164f84e54d8a320d568b25e0e594ea24f59716296dd3075c87bdaccb46e28589a8ee92f7ae7da645991b119ab9660561bfa33c05a36d4fb03e0e25f26fe45e25f8c03da796c4948f5533bf3d24eff8e34156854198e8f1aee8136c7b5b7f7ca74581eb809ffbc37e543365aee913df5faeb688f64821f4a87e50d9277601c9ee76ea0e5ef7e981ee3a454f81ce3f450a9c7a8db509c97ea1537981de6a1585763410071b5b226de0226de12266259de74e213ec9f3ad4b9e9c430861982a1fd246d0233847a22d9dd963c830942302e2b11df22d7687b25307637935525732f4a799699c8218c50699cc041906dd954918abb81b1206f8bf151c3538e8935244b9cb6a72e8385fa7503b8c64eea064887aeca90a1c1c52171854087e48151ee48f51c9158368fefd9a25c6cd16d39553f8b7c59533ef35231c99d08baf6768f48f90ab979c3f37839a1c39427f7ec2173bef6a8c0df7a23a9cb8e5e02da9c517afff68f4b681e420056d67b504001f883286057f0139cac5681d67ced0f24622899575eb3aa256837db7a588a24eab0f71d578b2ceab3814831e6098d3836a6e9cc49801d7241c6e45be327987798ac93603f24c7781212d745a2ca3e511216d26a312c28dcd812f5ca3ae6400e278abe52102980cadaba6d877718ea04b2527da363993823875d1492ffea62b1953347b63a93f21d197083417f6602f213f59ab26d94b2b9cf4c3e2f56bbc9d212b617b3a3acb84995a9a3761e26de02d37eeafa0348bca5fc0cc4e7adfcec0eace5643dc63ff65bad400a1a17ad9643faf9407c760204ca03cba2d5521fb726393dec2af7f56fbf772bef76e79628473db3c949d275a8770b1dea2dd07a7f9b5258a24f8e54ff1a19b79a8fe2990311345be4e47d223b88407d0703b9cce47777000c0177142341d1da49712acd7f6e5746d374ac245b58a1862adac9bd0566fd44b4947b4bf91988cf5bf9d91d14f6f725d6adeb7c5304aa30cebd05a8c238f796a00ae3dcbb5d3bb61fb4ba82fb67c8b11fe625509260958aebac9f0ba8a8842a1750510955ee7607fa5d899886ca14094a8e630ad69c74b8b784523ac2bd459b7b0b977bb76deedd22644fb041f109049d14ada54a62e8dc0bbc19d9eacc72fd9a3ed3bf91fe9d611f86d80f676587672efe06862e7e22ddd4d2dc61fd99e83793db46fe74075a975ea61da9c847eae7f1004152a43d51915fab9fa70371c88b34d21f8a3ac58fdc8a456457451e0dc4e169221fa94851b5913fca77e84eae7e12e40dd90d1b52bd0a8e145932c273274561ec7018ba3e501821889d0c866e1772158860e83e82044668bd464ec3baf0437a5c889ca91c19b58a89b4440189fce80e20951f62202c6fbdeaad2d2fb9171513b213ef9b568b1f7b41abe5e4c75e576e7251a18b03044919d355316919f348c6a0f5da416b67b7b39ded78b633ad918e7638e38938e34109d6b584585e188873942e940fc2cc41da9899d9b545bc85be8892c536520697344fc983a4813e46a93946f3fba980896af5210a4067bb8b89250eea07ca0a84fcabfdeb0403e877413d3b3902f175a44c4180401ab5db3dab6b0f120f9b1d2cc19c3d34863f45f9171fc2e16e43386c184231401dfd3c071a8203e88bb17b043e3c92e378048fc187c7725cbbf01802782c46168ee01104f008ba9b635c76fd6f0df1e8a121fe3ee2d9171fe3e96e63acb369f5242770cb33e63142875d4871bf13402287365123dd5121f923231a52133bb553491e8495494dc56c05819ea24016f81a7cf81a0239a93251247f2392c57489b098e040647a2232c25338826fe46c3f92bba60b4fe0089ec8f8a732e51b39ffb2f01355f6a92cfb0d3cddb6c7ac79f95b0b60fcd00278c98734fae22be066b71570f3f00a080e1360721dd87f36ea822d88adf2e14327d56b20952b428744a039c5af24742a29696d0d31e81f8999fd1a8ec47290bbfb310432f00d045f8b5fb5549ec884afe19198f6afc53f5ffc06be5c2c3e04e227102be4a95a253e045dbd2a039941263f512b50ae24b1ce02d960572405b2e053b9088f64c25308e01bf1f38d5cba4fc57f897a1e89bae53f5f622b99a297f963097920fecb4e3c96d9bf11ffe5ef2309b6044e20b1e091c66bdf6cae657b89fdadc5bc24555b3fcd87effc9aded3c68cc86b8f7c7e3d8f495a6865585cadf82071919282bca51cf6d8daf23c540aab6c7d04bbedde5e4e6634ddf42874600ca588cdb2b0baa59fa8e724198b96312f3ec1a24944bcfe2a9ed61609c577e30ee50fedcb0a44cd4204d1d50727f46f0d768ef3d5eac9232d5b00c9a23d0586d96ab51f844605431371af529a68b72699936f8e2569184bd23496a4fc56d305598316e8c4926df6073012ffa6e2dfb82204b97118ba9b61f9da55de743fcb1d7698c3cc2c8702943e1bc0dc06a0cf946c24c37e981de334cc8cc86182b3c3b4ad79b07617a6a5a5a0098231ee14668426288cbd051e4bf66dda9e7b0b88bda50c2f657809b1772bc3b7327c0b7145623852cc5dac0a8acc82e959e099b77093b6888ebc259e794b195a42e4dde299772b43b73054a523954d24a2b5c5e62b0686633fe4c779c85d17dd381c85378e7cf5cf4ef39ebfc1eea8dc5865df189eb9b7c0fc3087b9b7146304d38ac0533222b5fa321c88e2b92cae1a084403a96c402b652979a6937502e43abc23581f1d97e9302bc21c48253f0fc75a4e0309100463c32e0b8456e78e942874bc1bbb34dc915d1aedc0264daba2d0eb0d4d8f66cccbd379f663c2f35d507c3ebfa6bd7c03356cc108b31e833f7ac4c2bebc01fbd6dbefeda9db6d698aac44c4433a4b6944f2d2fb9c3455b6b780bd25ecddee55dcbcdd47e95c55cfa487306b2dfb3db8d57464f713f32f0ca77c8d1e2834eb3d3246c694f4324112f5a6765c8a0afcdb0582c96a7564614679f3d31788ab3f30f7f15b6f7c60aa7fc7c6aea231ab68749ecabd9d84aecb8d5a313f4cdaacc47532df6b672197a59496bc7616aee7073a628ae0c6be17998a2c4b8f0c87959871f5a2e406962257256e0c37229f8d0c97d5cb1483785c573be0b9aee1e52bdcc9db052ebe46708e7558a0ea6b14cebc051e790bd7b96a2fbd857bde1e7b0b04336f8947de52c52e65ec52c4dee29177ab626f65ec2d8258619399b710c544a68ddba5da1dd05c95187a0b187a4b188a12fabe941f26c5777698eafb208d21937b30e4c5160c7956c3909716867c56c390fa0eea02cee0597123750697f0ccda48af6d0a451102c5d8d2427a2546968ac9490ef33685a8cc93a190790b9cb69dae1ba1b6f7b84d8079cb2282b7bdc7c0bc5b9c967394897cb58baa6837ec1cef889de73b60e749153b7fae106bf763e63f81466a4823d9c02b2990349244da3de8f1dc06ee21e478be23d9297af2a7d1e2eefd7908293eddc4894f344e34db5d91a6c02b77e22566dc7a1d6e5f5325f246c9c282d6f61a617e98b6194c31394c2c5c28d087435d0bc74c112a0323854a1a7288e53d5268c5424ad362fb5550cac45b605aa979e22d4d8cae69e352bb8276e22d68676ed04e5a7c93c344ddbf111cd487a58e75c61a8b10977702b8313885489cd20960598d8145993fd437e163b88145712f2e9599eaf7d2d96edb3dda71bb37a2056bbbcfe576ffeaef3f28fd8a81d1b66e361dfbe7df0aaa1afff66bc19f1b5f0bfebcf95af0e75d5f0bfecc10bafbadfe5af0877b5e0bfef6b75e0bdef7da2f2b5efb453bbef6cb8ad77e31d67e33608e7de98e4fdfeecc8f27e1bcbc7d8efbf341f823b39ea54570d49e21a0c4f991c10c38a45273566255a9c37537c7a5bdb8218e8af76fe1fc7828ebdea86f6eea9bd7ea53152a2c95549f46cce5c5dda8845bd54d8933eacf079b353df430bfb0646396a7fd4c266d98028653a58c5f6cb50c88d94e9fe8327394515a621920549c39eb93be3f1854bc63735458c1b334fcbf4f46f19c26913404b4f11ce025931d20e912df89a3c6871cf3ba55a004f33e1d484326abd5459eb2645cb88ed8da92c258fe6696b2b97e32c0d49aa0cc0c851edbb0d4e56db532cb4cc3768d2cb5e9b7bd10d81b72aadccfe937f97fc54eea3fef711ce464474c3a6dc4a4390196fdc286d4f88e13f874d3f08ff5864b6a5c87547aef5b5ee424a727987adf3dfbe5eceac5fb77efcede5c5ebd7c76f9ccd8a0a95bdb592348b680bd0d503b5fe5e54d42aa692c7bc1a7b3946619352edcb03c16766b276d6a2725d53496bd20c90dc9ac36d88e6db0a63618a9a6b1cc56c5174d90e6268615532fa4a90d42803757f2aa52096faa8413c87685246baa242310ed0a49d454494420de1592b8a99298c07c5748e64d95cc094c9a2bb1db46958c954a260466bb42326baa644660b82b24c3a64a860446bb42326aaa644460ba2b24d3a64aa604c6bb42326eaa644ce06657486e9a2ab921b0dc15926553254b028b5d57eca2a99245b5126d56166f6069bbba0ddbb385596341f4e6cae083c56cca485dc84140d770bd6be7af9be0be2670b56be7af9a2ab922f07957483e3755f299c0f9ae909c3755724e94b178b2e159565eed744b75f2f2490fce5b2da3d207133c3fcdfbfea09df48cba38ccf0197128f8308104f67d242f5fa42981d96a35f312bac831c6336f96d21b630c4eb227f356cb9935f97b2d41b0f451a5dbd79ac13d8ef33e1bb453c8303b269de03497da99edb484d0891488a2c2547a41c1184712b256cb89bc2ca72ca1a938e30d4ffc3d7122a4df7678194f73e72722dfb084ecb8a0fa45f32f8913f799546f4cf02571124864c5a5b1f1b5ecd94c3e1a30209d3cf5db09ba4b31c154be28c11cd37e505aac1ce1241c1d4fc2918b13e46498f64703742c8d00e20c891ed1fec80d06e898b55a0ec31182ec84b45a0e11c9d1096fb51c8e2314c6d8576fea0acd32d24981771842a7c161dcf3cd9be567c499c150cbc46304c3757963764636e47cc0c514328cb74ca065c74ccc18709c74d2901c272171718a988b1ddae7830eed93016a3b542a85bab4cfa5521fc7c48c1d5b17959ef85ae5372f2be2f85be21010d580aa04b87e28aef2ca664f44914e6376dd146fb59e13870357b3d76a39bf10870b68740cf0524476490a4bb2fb8581431ae6ab9593635a7817c1341c729129c1fb01a4669dad56fbcf8993426a9a1233f48a38a9dc225024a014ab2f65e3958d0448290227c5395699c542d6b9af534a3e8509def7d7ebcf1316532759add27d8ccba5985b1e18362e93d848baf8e4ad1669b51a36a5ea90162b30a95fccbc5bfc8638cc5b00f39685723c93e0fd86d52f3009a3088a5f60fa4303caf6b118355d4667950f274d35ca9047dd5279fdfd210e0478da020050558aa81f8efd3009f57da5eb428a13c824dfe787f971dc6a39998c55a3f91b926fa4e4768c701c6627fe6a15093e2c0d91e6ce1c5f6091d56a3f5dad12eff618a7de2d3a75184e20c10a09fc0659a7837a0ec3695935449d0e02724acc98f42866454f0910ccc204a76b620f44dcc65d3d5afc24406b8721b137d4fd558135d428080e475426e53172fd2036123844cd45a463819cbe25451dbdd7c4a10869032c99c70e1364acfed14a2852a15f447ea01a8f42ac3f0a3b0d0ec591589e31bae3a781d4ed178b0ebf332fa3ace5d745bd2e96b7892faa3773bd67c4b9940d95990314cab5beb6745224f077c6d886eca65802a9190036725e11ad417b827dbd65f783b044552aa7ce2e874e5413ca8d714b9cdc5b40ee2d21f11690784b48bd05a4de12f4c247add62bb10bd46ad7ebbdda54b1e8758cf528fa2dd9d868aa268229f06a27d476ddda890c336f714cbcc5a9f8e5eab7c7bd458fe83051618830f396c7c45b9e8a5fae7e7bdc5bf6880e13158658d479a2eb3ca9d57962d73917759ee83a4f6a759ed8754e04c6106b552b39cf443886b9090f75f77f8391eefb6fe1b0d51a7ab72778d26a8d5aad91d86f333539c362b25aad61b1e65baddb122b116f01c45b8200934b49b79478ab491baaa11ec270dba48d9c211e1a68ac9646bbb534f21630322d8d544b23186d69698455ec6f52d45ef6f75fd0c9a287aae9daf8fe8b7abdb92b0a4ca15fccc8c3c7c80ff5f648ad5d2b4e5581345aadf7e2c39ca332e67793f4bb20011892fe2a243a6315e4965642a44075a9faaf498114534c5081d235624ed53156d83b2eed9ed7d40db489687358a9adcbad9e64fb18730bff704f60a4cc63add62741a464c818f0f84e050b2a4690a005110391084610e9e0339156c2a1d4389e891c65e43ac399ea94a17cccb1237b5776ea2752f1084bbd4527f71665facb9246caf196db0d48712e2f3016d28cf61238ee0487bea69888384e97ad16393153bc6cb5ccd7be207a0a717eea2d5c41d47a4bd4d633e42d3aa9b7408726b894a9caf60966ad5676a2081e8e33c80429234304ab7acd0486459caaa44850c39288968f4d83a7694fc7afb72c8b5c36be9f20cb078fa19f7911a9665c4e2cc438813916a7cd048bf36686c5e0a49ab090283f1435c72162628c166278162778de6a31393e0bb943c9f1e494f5381098c3044488f7c409a28f2fb10f9ca8f4b0a486f1d06172fcd0f16cb58a04f3a62a4fbc85da41295024ed5da43013ac4741a856781e64eeb1be13472f45a1cd1e5987f71bb2e9dcd5a1387874143c79fcf8eb278f5b829878faf8e937df1c3d7afc8d0c751f779f3c7a1c1ca9b4e0c9d741f08d0e1c75bf7ef275dba19d04b5195ad1e3e3a748fe3c523f5df5132024a8f54a2b79a595bcd24a6eb7929b56f24e2a5bc9552bb96a2557ade4b295e363cbd2c6f736a1226814b1de0571719c788bd52af716e6095fee2d8f13354309cea5a3177b55e5156493942ddc6e185829c6947538122067a8e350f94d3a99c0c7ad960ea7322d29f2a9b4a4c8dbd175a42acdb23e5ec70672578895980baca5ce8f32bcbfedbab3e0963c457fb1562b29ebd1e1a28aa4d6c4fb727149dd6773c6f8a1a1c60d5b648fdc7ea096aa5cd6c5472ed7f756182115bc1cc38ebc8a1448a60b448496ae4011875dc9210942685f372bbe0b7005ee4a042e63c74e627095d857627c13b9f74c4e1974e55a7052bc9f22b8af237ba9ea483925af48d567b423eaa4124b260a59a38e5879f2a1a7885b76440fca0a9e6f6078e9946421a673293f9765e6f7a4ee2e7a7fdf91352448b2d639a468b59231a98a49c42cad56059c27fe3ed601c1ef4be2412c636a5244204727d6b2fbbd0aa228ad28030a6a09a263ff54d7490bf243d62c72c8ac32aa5764926cf5b1afe1d2ac92a8a76cf5bbca8389847edefb5534cc8c7320a4df4ffe2ad806069a7540c00ace0be70ad757b60bce41450bcca0620c5f88134dcc08e652c5a4a01844c15aaa180216cdf1ed064b61e094635dac9a5387e96a346b6e6ad7079b0c31d33a13ccac8963260e58d9ae640befa855d8cc884201b2881e064de52b472316ebaf697ea4475f65905f9a49d6d9adb55a744c399460c6d4d5c2f8fb5e1a0f0a6a380b03956a508be0adf56d891e8aac76b8101b06f285ed1f04df919492063f1a8534527bd3e90460ac38a498b92e4a5c4cfbe9c05bb4a5df906547fe88503af0967ac2bcc7ed640d2c7b11f3e8d3af2ca3db9c8cfe413c018843c5aa855c7a62958e732e266446b7aa9a484b94fd0130dc1f841f24c7fd516c388a0afd7ef3b0d91bf1f48c4413e7832579d00ae32613775d946a1a1a017171dee7033300b26211a1eacef085dcdac8d237cdca8af011624628a19e9872e0ee1142a590d092547ea808020cc827dd568bf6f34e30f0e81f7312670eedfbca8fce8ccf6ce5b78f7a6b5bae8fc2a4ec57e2ba882a68a4db45e9a4b80cdad8f3b787de7c9d2df2743ebcef854c26a62beb51e0335165f6d07baf1f767befa5b335abf669c81e54eedb061fc55241c563995254a1e894f6fab4eef3af5c6d40b02f651cc66ac03157861cc4249101aa195850ab511abb292d267ad13cbd29ed7dd7c2bda00b999d3bcbe94ce492bfbd00223b714867f9e454fff602df07638f4e1e79d7f486c66709b98ee950d06b7618e6764532e572c2a24f09cd4473d588de13986d64bf60b7f4d4faeecd3b5d186e64fb6934ca687e5a09f57c186dd6570e4925dc3b8229ce3daa26fa2dc92730b60bbfffe55b652e8ea7a79550ef67125af9c894cf137989b2e515c0d665d4db5365ecd7580999d2e15ecef7e4987b07827135752b1c51316906677089f78370da6a393778ea8d697e3123111d2a75182743225dccdb7e004b3cddfa322983fd00c1422b7f5eebdf2bf58b205ead9c11f6a59e973676a0207986a91c3612e5ba398ee0357ee6c9cd006ff1336fc2632a7d92eeff413c0b553baf91bcc3788d5f7b29556a70082eb00f67f8ad59fe17c767e18534c7f5b67f31805a0de7821d1009f8bcac4201f60eff41bc3aae775ec35b042ff06bb9fdee6f4a8015f12422b9738e4a8cfa53958adccb57abadba483574d6dbbba151a98444172ccb0f109406626a163812a4bdedcab3f425bc81efe1163ec12b788e5f9b93e33d7e5718312f48c08a9048f13c584b2320c35491b552d94f92ba82b3568430cc316f73376b6730c3bc1d77b27624a6ade08667e8e4cd7c7a4d53efecedc5f7af7f7aa31a19e2f281ec1cc1c80a46edc88ddb3192bb6bd1c90e87301674b2cb0f8770831d4979c787a3ce14b5e38ea0b9dde870d419a376840e1d0d03925ab278eaf2f68d22ce53d76178ec6632bc446d26c05c1ee32eb2b4b1268e7cb9482c7096875d54ea9a2dc4a6e1b52e9d46b50869d76fdf473d7edca967adc71479b5cef138713284312e833132796071eaa4b89301c31c48650851cf49310786b36ac26117152695750f0f09b043a2d491459fbe1347c1b7d8875ff00bb34a7ec5bf7402f8037feb06e1b7c7bf84dfba2efceabaf087eba25f31c6bfb45aceafd847f0870efc2102dff5bf1de0df9d17fd6f07f0a2ffabf8f787a6503ec047f84d34f403fece6c1174df8e92e483de561f0c84bf62e7177c6e7c3afe05083f2808cf0584e702c27309e16f8a00f980e007fc8301ef831aa297d80f5f1e8fc29706a8eff1cbc311dce279a938febdd15e3fec22788367a502b99de20e6bc36c00473f3ace27fc931a383188f006216f019fbc25746eef1da6ca28fd267e5413e70d4dc89e7fd86842f6f40d9e2910c36f8f9fcb429f707cfa93f35a64ff4195e9c9c0e5a973ad941197c53b4f7fb081903e09e26e6132962f40b7665d22b852596f640681caaed5cf02c18fce95b7802b6f0957de2d42bd1f45e5127a5f8dcf471c841f8f71167ed4a3f257fbf171f77e6ccd6af7e3e39fe8477498b53faabebcc4a34e10be3c112bafd3f9ef587591fb85965d7dcdc1e569d165f7a69f097e6209fa63e1de5646c4b52d7ffd5c117c876a8a0b92b7d3f9560c17ba4bf0b7e0a4f8db4e808e7d29f6a1853f19e3cdd8078233b7db1e5946da2aae279fb71944f879db616e80424a9ddc4d5c0eb99beaff11889808d917a83f9a53545b8ea28561c0bcf84aac0e7d25f333749753793b4ba57f69ea146afb69a1c00e1c8f0bebc3977cf6fe1729c8219d23209d2e10d1b5843a5c7a96931f81f9e8dae43fa5aa4d201bad920a042a46bfe5b6e0c82c382ed890fe4ae25803c33b4f80778e8077bac03540990128330065fda38d98ae95645922a7921dd71c70ffa84d5d5f5aa1b222827a44a5b709ad9a93932a15ea7b892aefb595e65cd94f697fddf0c03e30fcbc9d872552792f97f6578ef30abfeb7f3b40fdeec065f0aa1fa81f7fe032a497d6f3b693abb586a0a1b05f292caad204c7bd0dca12b231741f64fec07ddece54f5eaa32b3fd03a1128e9db94cf670e85b2eb1d0a7efd41797d78a4c68768f467e7853491e196944303c2f8d9a00b95bdc013cd5004028a9dccdba63bbc3d62d25ed63d96b2d6bfedaa5ff85b936ae06fa49ad6a4a1f96a270dcd1f8953d7ce54c282ba10c1d3a203a0680d3fecaae0f843532f7e20d5b4bfa767fa977a21f1cecf04df55505eafae51553e98cdfb47ed64005c7db8c10032f9990e041b2c3e445c2c3fa53d0af9e106030d665f91c6043802f5298d5aabcf18e668b0864db4b705a0f26a5a8394952045fab36b20490d2412ba99feec0e6068001d15800a6e487e7607821dea1fb5c9006ed487485eeacfaee9d25ec182659d393af6fce054f79243d0b13a177466263084a033358131049d251af4fa6640ac5273bbd4c82e75a34ad9f2c41f0bb9b2bc9852d32f28faba94ab7823a65ccdd0ba2b41e3a9a69f0e42538f513298cfd9505bf2ae2651956446c512bc58929b56cb49cc02b4e3abb90ac56804d665e1570f1bd05bdc674422a78bbc47a18c7a484449f94e224a9dcd98a4928f80efd6c81b71e572773f59adf6138f65af78921b2678ab58c2ee406f4f94b73c9932259c20c99e714dbbc747fa5194a8d93b504be355ae34a371521210729a0494d2f70c0ab5c4d096a2299b17a7e6a3f7d887ba24b110074a85946a140e7cb451e082ddd232af08e1a79bb9b440b2cca823f07e20b1a76d78ad6e56705137766191357c671324eae5e72e2fc3a5ff0bcb2291b614523e119f4dd885f432908acfd7725ff518e4139a139540544027f1fb976052efc4438b71a340b3e45cf57af757f1ff8cbe170fe70b8def23b01ecae768b57a8acc7b7a91dc85babd1104965391f434ed099456716d53bcb10752758ae3db82797eca7bf65b7ca59f5a5834252e079d8cf48bdaadd64a6c334e7063de0344d80fa3639c84516904bd3f80058e0e13b8d6449e8f7124cd2193d36bec3d3ecc7b91f4da126b21d5dbef5b2de71a774452613e242fcd3a5de1ec30978ffa3bd65bfbd4bd6a33ebcd3e71176dae5ef65bb98ad85bfb557e43d9e956a32192159f555fed8fb7bcdabf517157ee35049d0582a5b6b1e4ba68ad8d872c959c448d9a1ab4d25493d5e3733ce947837e260ee60bfd3d8033f1e506f2fbb2f816448823263a5aadc8898f5a2d6d9bea1c2ee0128113ed639c7482d52a3e36135de49172fcfacbfed16e2ffba73bbeec1fef405ddf540d79a47c47f376ef5832be678fb324a1e93bb3d1f93c2f42b9debed55d5e1ac0b03637ab6c6e723f6263fc4f1941aa656f466aa2a30fa2b47f4e77252ef31e2b2b20411d09f975e45362a5a44c484e2d4498a0ded3d25692650e6426fe69b37114a6d8c93b141d3a153c58d413408a7a01aa194e9a6c310db781a838666e7498b4098cbd051e95d8828b9dbd34310233f0c202c7d85b884490e68566fa9939f810889dbfc022fd30770374d8851b6f29c24b13d6e6de6ebc854842e1c8c5d37509a765c16e89b3b6f4e312d6f18431fb84237709d798bb89f428217ebb708eb91b8471e945e2bc784425efebd0bab6c5e3ddb678a30d9eda169fedb0c587d52d4ef80e4e255e937c72aff94a65c28342561edfc5699d58a7f5033e2538dfd9a78495b579b74ab81fb607f967a0c735f221e82a5390be320559eeba14cfbd2826d39993820f45bc165dc216533c331c1ce635c36413db064f5e7a7598e2c425ed593b8531b68de3dc60cb928e6db4ac149e4a8594a1f4b6c007dea23d1647a70ac813d4c4df184b3b95d375e42d3039cc61e42d313f742c99ac59e946e17d5d429ed78c07d580d15b8e61ee9276a11bb4c0cc2d02d756406e38e606c6488e76de92559cb7b091f365ede4585b287e48060529c6b89c724d4bc802969115b579b511950b3ded67faf7d232c1c4705e0c4bfb482b8988712d15455c17a47ad085b7c0e77deefa03b8f096f253d02edeadfcec0ee04c6660aecc7226b388402002b73ad01dc0a56d92ee02ceaa64976aa1a8075f7a0b504d15d5e14b6f09aacda2567ce9ddda4e42f8030cb7e42bcb8d7ba01c5d1e602c92f968af49d9a252aeb7f793920758bcee16ebb752a7b8a22a83ee51f2a9ead43cc0e747bbf1f93adb3d0c95687d7745a44d1825e1d00d37b5dc8ccb2c5f52fd6ca40c9c6e887562875a4f4ad5a30b713216cb501c90b143fbd140035ec884b53b4ceeca57067e683b73d19236fdc4da924e4f36f44b7204333cd1fa25433cd1fa25021c09724d456486e4b3ea99a51f227b19153ef5437e1c491c14e3619f0f60dfdfac45dedb8b541cd7154d465b154d66302c70ef3d6d09c0f415756ce79fd5f36b8c3febf341a86f49a6de02a6f2d2d4dc85681a8854d2151256d58eb6563bc62301cb0d1ef7fd813b87251ef703f1b1c0e37e77e0cec3c4363e06998b8fea544cb21b6a6d14efd7dd67ecea36c37209c4cb0736bb082695de69b16e93e354aa339a0787fd6410e615e923b30593f97d8249eb61f1fca11d7d361cd3fb2c201616cc9e25e398aa3d5cf18d1c98e7d55ad747fabc2b2880b9f7f2ecdbeebb672fdbf2fd9372441ae3bb354c6a8e4837dd679e3a042b711fda86d728ea91d2f315903a5a0352689a91a8745752683ece30298c71c11013e5ee1446d88769b96146c7d370a42907b55887fd9158ac7e78737c14de48c354e3fea47f3310d84c7c3937c6d36954f177291f5346157f9732aa9016c67d8623e3ef52641c9cc67d567abb8c2c6f9722593a600e7a23f9dbeda97ad63d514676a68bf5adf41e4bf66243e388e4d26217c678a932af56c3befa0c06863018f2dc31b15d138b8e71669890597f695ca986daf1dfc25bc0c25bc242d06a568eee00b6e458ef742dc7ab5e27277cf3514de311fe62198bf61f16005ef2598f6a0beccf799ef3a9e5ba79d35e704d38c880cf6872960ce9d0080115f9ce2b5c7476ff413ddbecd94387f69622cddbdd0cc68e32d17fd190a84776923a0d69d5397bb0816f4abbf75b6c305b514cb046159144ab45eae250df5645ce4eb35ed55ae97681846fe49f89e0f06d5262e924a5c194a9b6dc3cb1f45a7db8c2f2804f4e692f877313087a9d40f35923603808d9314ea51ac9dc9cade3f6b9386b0b79830c697982f718bcc70846ae2b2b99ca4afcb2126d82981da6d2b8f05989a02f105c96ecdb050a17de025fb52fc506c5a2c985778bafda6746f651d9dd555896de027b8fdb67aef71896de527c5fb6cf454843b9f4162241c2697910b4407c8689cbe0359eba2cd423a359bad7f0da0de019ea99b01bc06b7886e05a50035149e6ddc0351483da4570e3e2eb0d050d02136356bb36394ad0a45c9d4eb01f4e8e310b27a534b62fc5b0870ccef0455b6676a9cd20a725837c89c9610acff0a51cf3d7e5283f43f0b69c81676acccfdaafe598772eda893b96c37ed67ebb75d897d2a5da6bb882b755a668561967582aa9b58cbb84a07381e05c33c8ae8bd65ac67d6eb3c969c126abce5b7d7f87a7fdc9a04f06f0427cb981fcfea9f8160cdc4b9dc70d064606f50e5ec0cb82337f013f89d0b58b9fd427cdd773e52090843469b51c7ae2b75a4b67df4790ebcf00d57d01fcf74bb0461b5752136e5deaf955b7fc5584cc939daee58c3bfa4d93cd35a49b5a48f7de9b29cbe7d406f8b33f03feeef76bffcc4e8c779122be606914ef34de9620ce6a3ea934ff8028f1667751e2cd2ea24405fceea3bd63178a0b4aeb98b544f439ea3dadcaef939e5fbf90ac9e9a16235033f46ddbf8d6f2f99275f40bc3da9a918c2b871b919a1c4785141298f4e9a99e00242e39ccdb6938af5ae11e22e9e7c4baef1bdeebe259372cad86677d3638a44a6c2f8d8467d2929989aaba15301e7183d237b62676193037005ffbdd299016df0d6935fa68ae21ad9d6586ebaf76d54dfbaa49abeb2b02943756f243c518a29db15209e59037575285246faa24e79034575255524b9a2a4938a4bb42923655927260bb42c29a2a611cc8ae9090a64a0807be2b24bca912ce21db1592aca992ac5ac9dfd4618c7993f61f456b8876ed72d4046dc4ab697f4f57f17e68e7bb423b6f8276ce61b2eb044d9a2a997098ed0ac9aca992198751732576dba892b16ae995c3b4b99259a592695325530ee35dc764dc54c998c3cdae6372d354c90d97e7e0929be2a394d25beadc5d5dc90257573df96efd5796d2915820c54d0121f0562d999445452cb7636b0f3833025bdceaf6e695e85a9909814d37b2bd991d5b2b3124b0c52b6a6f5489ae959912d8e648b337aec6d74add1028fdf017b1911d5b2b1113a8f8175caa702dd782c0a61fac6b2bb296ff4a2715119f75442ddfb918684ba9f12b15aee5a21caa2a78bddcc4d472261c6c55965eaac2b55c8cc3db9894ac432f4954442d5f9a40e5e6bc47386cb992ee710ed52bab4c47d4f2451cea2f4b7f23b0fd69f10f042ad2e5de9c83cdeef4462a5c5f361cea22bbdea48cabe59e71a812f5bdb189a92f2c0ecff9a2083ecf45b096e77dbeb6deda2eb843d1ddafb4f9326cc83f9f6b8bfa07e63636e6cadcc8735af81ec85392643392d224c7fb7e41a6fd42e239cd1cdb8cd7b56cf2178b05005ad5fe219f45bb342ddab5fca835c13ba42396d00cdf5d5c3e7bf3f2d9bb97bd8383b55deb39cd2617394986241dded7a1e0c9d75f7fdd0d1eeb7a533e1f4f946eac61707212cb08dff81b9859263a62c1e49d6f8dfa3ec96992b17c69aa22bc9a51863772d129cb327643eb236ee21b0b542bbf9e4f679b31d23d9e29a808ee6aa622ee528ca26f47aab24a913d103c859a0896cd621251c19755abb2532aedda09cf192946b618fb6a3dc50cd4462f9e4d48358a2637db2236464c1e517281bd2339e3d8fbe6a94af86c4e2fbc1fd4625eb3844a655abc2d2522337c90f279323cd892fa3b67493539fbc4928425e3a21ddb454735525ff3149137522be2d2783b35d1db37df67b97faef84efb07de7ef7f1e2fb17cf5e6fdb4b6f27cb8c45626954f7524c491a71929b492c22aa335144bf2b3658bdc0bbedd35fa4bfb96715d632556b48e928a651ce6ec412f01eebf19a509a58994a84162df1bd08edfc7e1caa068b27e33f8175b2198de631299383e0e9a3a7a673d984254c0ed9d17f70d03f19079999f8f3b826e2d36b9614f05616ddff06bcb37d335c3c78405ffef4d39b6d08e592f3e45fb645c62919b28dd5f19f8df3dfb071fe7dd7fad9c388df1c3f9565fd6f389b7f669246bc1ce22f3ee6970f8ff96b32bda669fe2770c9bfc9f1f99fb3e8cfad95670f9e45e7cf2e5f3c7bbbed343a277944667f6a0d8902369bf2ef8ec1b72cac2f3e45afe5147d624d4f0b58425f926c42eb2c7b56e900c926f25dea913edcc94c06b7b5bc68967cfe4a2b9ea59a249f0b5e4d6359554a82f7fd7ae1d9126f319a69b727336d9188c815679c96ca804a58c37573477ea9ba9a6aeac835afa6b16c43f222fa72b5eb885d353574c5ab692cdb268ca9b7f5b7c6ed1e7150d3905aa21e5a7eeb155d087d68f95d6e732afed70e0f5a7c361d217433ce3e54a8fadd7aaed05a44f5d4309d3361b479a8503bd47418d1cdb82a32a3e6ab8ed168f95dc76db4fcde86e26835bc81f04cdfaca806cc47eb314d68906ec6352046ba11555b39aa5d3b585b3f2a831dace15a5a7c568e72aa3fecc8ca445563b61fe9b41e533fe069f9dd78d2d32d910d873fdd886aa203e8665cedc0a1c5e796838756825b0e215a09aa0c35b919ad456834fbb919fb5d55eeec3e3761bfcfbc9aa6b05f5d7c26b0dfe75db0df068adc11fb6d11e695b23a5a7ed792d4e2b383b50cef2cacb919d994b956edbb8d1db3458047b7446ecd5c4114dbd2d01632985682409540f054ad42291b74caefd54a1181c8b4226351cfcadd2049a495a05e64e7bb1eb1e74d8bec9c57d3cc22b3c48e62859dffb3e99282472906468737e432b4fcfecf41fa9f837493c3a576e8af9c9286e9a5e6ebe15dff9f63f3a163730d17bb22ab8b266475c1ab690a59d9f25f81ab2efe7d70952d4da676e83fa8ec3fa8ec4fa2b2ffab68e56c57b472d68456ce78354da195aa045e2096b32f8558feb3e4ab4bfe4b2ddd7fe632bbdc75995d362db34b5e4d53cbac76e920d6d9e53ffd00fbbf4832ff8744fc9f8fcb9fedbac99e356db267bc9aa63659f55246ecb1675f5c605cbf12ba67f3e591de7f793101b51df99f13a27a4234eece7fe66a7cddbc1a3f317b35be6e5a8daf79358d659b17536235bede6535da6d36adc64c8f77668db1b9e4a2c5a7663ef46d17355faadb523dffed43eaf9d5ababde82c3c52c65392d6262061bb742bd6ba9396dc7fc9283321e53c47c64b04dced9fbcc61dbed4fef8ac386c8aa77ae226dd6b077a1e2aa745def4cc5d68ee1dea58a7e4967f9a488fc90aa48a62cf09620abf8e724635111f907854dd4d37bc6617309f45eabd86a059f1814dfbfd23582771cdf49735417318b68cd2c76b14cde718f6562670f0bb766d29cb1bd3005cf3abf9675393954de2f1aab2b08f5a8f662276a5f43c4931b9ae6b2d286b6f7e96ab59fb45ad54d80717e4a7b0789f4c7639987f29e7fbc3cbbb87a7bf6eeeaecf5d9f9d99b4b0968ee50d453a661cae52e0151eb9da235d81ddce656502628fd758f65bf30fad9a1a8d5da7768613e998ff65e929c8834b48631cd7fa44b79dafd940e69fab0674401aa1a60e965db972e8ef3d0755394f4d3014e0b87b75ec6d3dc718a1aedc9a2fd7cd0a1fd64b096d6ae4164ddec971ae3d26c7701867295599dda141526c8f83ec669e8ba0495cebb933e19b47390a6a134c411627deeba034cfb991b0d4a6f85308a499ed3e4878b9fde6c58612f016238008269df1f84b64189c2880ae9a78310891ccc752dfb2a229bb1e32ef3d8291cb19153b510c4111af2bb2287a34a590ed28997b32945a06c227964368b974e22ed269bd6b5435a0b006532abd2b49773d9e28ecd15f9a55b5fb37d1e6cf2cff4c5b9bf0feb3564f3eb2866b3add6fb1966abd5915ff8c7d4768142e22582c6cc2ddf98f265b21f66c7c4cb53127d2adc5bba6e56ce78844d723f1b408c236fac75252e94b505691744db48f6c3d971247b63553633af93754a7f3650bec2f69de171b25a0d4f708ad09d36f150662a6d148db01f8e8ee3d075476862b2dd487d8dfeac1dbba3015aafc5f0cc75abad96a907bfe39e8dce9c391800ad9d84c0d4b7917f5224550be877cd11426b334058bd779b4aa7e8a535d36dc33b3db14655f7d81fb45ace146f4b400f546797c9266c943b9da03d2d9e61122fa519cd5fce53a21e7102b1dd09bcb09edd4b72a178aef9563fc4ce8ce7daab8844133a948fb74b4db16c1eeb975ed5f7f012c757305661a08c4c6731552a37c619ee8d5954d8f205f09305db0bdb1c8389d5707d969613dea6f40677345c575cbaa0acc6a97c6fe822afe7d37165d32f1f6ada7216bf7bd6efadacb6f9298af249ca3f4b977267b6af0073585d8a19eeedc989de139b798f657bf3443125c30354316695af56caf0be4651bbd59df0bd4f3a26db6389d5d670efc0a5faf1be44247a3d6cdf637a422fd954bf3ebb540fd88b59de2ca2394eb92236ca487301394d673c560b385dad64c24b3a22f3b89a688df52d3707eaf71b936265fb644dc966c6caecbdda3debf3ddd7c4fbdd6bfd7df7acdfed9ef55b5e71545d996185daf4fc0c350aa91aa3ea682dbaf99c0df1bcf046f1fefdf72f1d542d78ecb75a066bd818c9f2d52dd5fd2a5b436afafda9fd210a949b03f6229248a71a339266f440998ccc2b9c57f699e5d1c4a15ece5ff3cf347d41a471c9bb8864f42093aee80e7a3230e4f3eb98eac028e624d7df9aec550196e4742c42c60b3c0f65fc8d34e5aa33a940b7123aaa841e15157ca72b90f28522f6938efd632ef88784f1a4487aaf93ae398f759de2939232cbadce92e5294bc645f4ef7cbddb60bf4fb2f96c26095939e46fc894f624aa583b7ad6c2da4c0a8451f3ef1dbee39e457e3ad4fb449799a4680e24ba3840a04be204a84121e97ad3038d9cdf53fd2bb80bcd66c8256d2a29aa00eab12aead09c30c9a49fd01716af0e7754142279d5b9b95a480da72628b7d2955313529cf7930130f1d3090621eddde53d658e2b4c7a77694f5246f458d04425b196b8dd30ac6e0b7580d06386ae534a3eed956c4881f7b71cda7a2393514ed3b36478e5249d00283069a839c1821a97d589796338057aec08885d371920dd50be26450ba18a4a44697a820d2c543b51cffba287c759abe524b80b0c67c6be6ad2d9e810333e731a498d6b3ae22995167cae1c1f28a4727dd5c04e31037a821d31c49d8e18641bf20412ec4b3b3561724c423585114e5c7272721284f438ef47835382a35e82233758cb0ae59415803a66f2d05f85d89ac4bf3c690ca87654b12daf5cd837247e3121c9988a22c004ceb7012e173f55e902bc356434cf5932ce94f8479fb1173af2aa772779e8326cd906b12b37b5548feaa2d81a223e5b5e9474e0550323be41639a5d65d39062575568486098b65390e6dc0ad638ef93014efacc2583d2482cd8a360776603058a13742fe77be43a93a690f7a6349ff0e101d27558a36dd7b35e23b80fafd84ba4f7a22e1eb447088a05707f3ed1e01681a66ebd2ade7c51d150bcb388f5de4f7ccbe4d364c892b132a2d57de4fba022ce92a10cde3714b64bec4694c930ed7405ffeb06c071da67824b4dfba46aac95237d5e2bf1a6b51c1de45920aaf37baffbc80f7a0c53e0b8dbce3b89c25aa149ebf638ceddb4cf0a9bd79deea0934a43573aeb500d84ae44a2bb0298ec6160ce92a10d0ac11432dc6d279d7c03148203c870e2a6fd40c0e0d721209876448e7cad1097f7b8ed249d1c415cdb02e10667141d3a7987a34d56283a74b28ee1cd6cbe89b5e34d2689b4e3a65db34560b4b97fc996fdcbebfb37c3b4cd21c259879b9e5980c11cd7c18209ae771866b8de551862395a874e2ac66c8487ed214cf1a83d8431ee4cda53b7db9eb4479d495bba460fdc096a4f5da713788f3bddf604b547aed3f11e8be8a11bc0123b9da033937902efb13b1319bcc7ed212cf0ac3dedccda23e9f5e97a1f631ebaee3562fdeb011eb7493f76af07ee4d9bf423f1b16c937e263e166dd29fbbd796686e8de0e517d8cd2ff9bf78ceec719ee3a0138334a6a9476282587f32c0a2fb93417bee8aee4f06edb8d2ef375fa0df6f1afb5d3dafea48d4a19d006de2eeef39dc297b579b742024b822a0ad4839136d260be5c5a7b1e27f97e33b41a0f6349d2aa9d45e9d4536d4ab9257822261b7e4d2b4adcab60e8d1c795c67a2919463d3ad4cb4144e5668636cd10eeae51555dcfaa5a6fb21df3658f64167cfcaf71caae281de2bc1491d7525d85093035413b701dceb1ef901145149fe8a887696e7f2887ec9b228a535d2ddf2e1ff46db2953036cc929c0a0745be249d1bab1a5d72ca1246d6ae7e5176be762ca793e696ae7a73fdd4e5dc4b2b9b843c3219b83ecc8f77b9a3c7b68dc2b87dc911f3c544e8d62ad54f7a1526a4c2a4773e1adf3606eb1aa9585bd37e2e9de815b8a9fcc82760f0a69584d12560849aa32378945243eb220544c9a49de2ab0aa139a896d25d3deb1f7c8bc6ade466d272c559efd00f4395fe10436c0d6425949ea372c8c4266d2d47139713bad0f2378106b2a7cb898de6465a16087427ac79485ba6bd9bb62273431325afaaf9da194fb4ac7ac414adc2b1b868da403428a6a6c8cda8fcae745c141279a3f4990e0325d4c43abf535c8fbfd7aedc15facbd5daf3d4fd9b4420a94644062d79ae2a4bc89f481e0b413844cd4dd6a257d3638a621725d2699fbb013a86bc1a44f062779883a1d22768aeb12905ef2562bc993a13b7622ed5b33ec90d21b048100a14e607ce56fc1586155f65c5e944b26966c489aad0c362e646d0ea4cd2b3cf15a9cab6c5811f3189b97fb3ee4dbc1e9547c91ed63dff28744ef919f7d9fc8d6f624407b19bba585d8dd53af981150bcafc7a2362195ae14d3134a49ca8eedcb9f3d96edd1e92c5fd69a34eb80a8774ae69699952e6b329cf4b964cc36aefcb3568b656fc81b2743e86e275098bad190ae8ff7d4b0a84a3558d2a583044d9d0b525e358f63edd2e024dbad9d9fe6f91e1fedf174485381df33ab7ab174ac0608ced6360597b65a758d8b14a13baebdba2a762c2d9cfbec631c85aecbd558c538d563a5c625de715ce43a7b6860e20adc6bb3a0e91af82c67d31a7233c0d26d7b430968216fde37c808606a64448a05523527dd26b9095a79a07039071c07213f26e52049530091f47b27462a12584e7a336bb524cae3ab95888bfafe002136725294e17dbfea092bc6bc9dc01cc79d0426387613752f2d2870fb323aefc7ee4cb632dcc738efcfddd960b552df1377364077b26a3da26ce46412f1ca1d80ee689f0d1498ea7e5a3439c5acad3c26541bccfb537736c0797fe4ce066bd765b23a72e217d510e53b788489a906eea9221455182e4952f06a404f9d46b448c107762f5a1419da09423dbb125a29911bb30252a760133d362d26f0ef5d4e2259ead838c6b89b75cdee14a41688b3a954b4d942b06ca54220115cc9edae7ce4f7cd7ce42d870a79d853172b1baccafd3c8aff10e7a0b0cd4374bf767284e0d317e8d9a78d9ea93ba63582575fa0fa571bd5ebc3628de0f91760f09fffeb041bb64823c699cbc36c1fe338cc5cfc082dbc2ca6e9ec554c7287810f04b20e17ff214215a9c6fb2f30a8ef3706d5ba01fc0b1cf2fd7cebf32fcdb716ebf7f72f3016bf6f8c85becffc6fde9bdf7d81be7db7d1377d81bc216bf996c39dbcf66cb847e90fa4784adde7438a8343877aa359b65a0548d3f4050d298e15712c33a455d47ee18ea0f291d23616644f682d8f6f7979c36a2efa21476bd822286b06a8220233d5f4ec1a65ce5e0ef3391bf694b7bff583a07fcf8db44df6a0003c5dc30b39fcaf523e3d2f75c62fe81f739a6c28ddd6f08861868cbfce901f570863edf1c378c675b8cb3a01fa2f061c1cee8a2fcbdb86748ca1689777dcab2ba83a190ae5796d698c3a190482ea8beaf1918a4f572be9caabef0f562be35da46c521150c645a5f42ec89d035b73fefb6414cb61c8fa076edee703392deec1e040e233bd0e82c30415ec935909d00980a0358c58327cbe948bb6ca602a5e460a4ff6371c43eaeb211a2638f5c6da2275ab557e7b246153b920b2d52ab542eb727afc901d972bc27505ad28665f69b6609c17b7ae7d5648da053361d6c48b98cdb2868591dda3ae7b27d6e3e1ff73fafff8dc19b44f91d3ffc770e0a2af0eb5a26ee927f898972eb2324903428415a9235f8b88e9923470ab15e9422741c94a4cb0f48c18c6ab9593f627031ce3fea0f01593a1b5bc1d9a8b2568a09b08de32359ed4bee5debdcbdf9980a85776b0d833f3354814f3cc0c7a6d66c58c5254934555b89ba2a418e1dede1bbe574ca0004fecd3d79c08de6c4872e21d2010d312963289ad4aaf4adc5228e42a6d0ab53337d54b12e91e30455216410a8d51566e06410f13e008add7c635af424babd581be863bb03899d54af2321a9b1ef9825cf0268ca6248d26cbd54ae2023f8c8e33db3daf9ecaac1f0da4be8b98ecb8d51240c5a62322aaef0f2a4f5acae536570e44fd70726c4a483f65b2d4a456aaf4f7e987b3e38d74537ee6ba68dedf48eecf0603ac7df349fe494cd65cf5612446686a569a615c1a5b2878b0b1cc138ed4b88fb512f4d404adb218e3e169d0f3d13add0163f50fdca14454239822b426855670dbe1e2b093ae63250437f8c0bbe689c6715189e3c2c4f98ec38d7be095ae88623898f1ec402c9cc479af526d9a2b868394e73a5d979658522665512c920ad65cea7e18c64d2cf19e469f0c88ccb779bcdb572915edb9edbcbd0f39f60dab5e5519ce356399572ee3b50a713e0869298ca3906a2de4b422f5ec0483aa2e49a119a8df16d5248b15c8427abc052aeabac806840e3c5187610b4d03287c505c57362545767e986f6b2f775d4431d5fa8845ef3d53a353b4f4a01c65f71e997a9c5a373678eab2f2fee0813ea83d51eb8556fcafd369253f5d195441b3af150df22bc7773421d7311df6f60318b19866bdbb3590e1b086edf7837d2decd1f95b2d55bf2cd3a7039cabf73675e9f546c18a1a9529bd06e514be527a48639ad37a4669c0a9aabb63d2f1dddad675ff836faaa100c3fb81794953784255f49bac88275299c424e838714e1911094fdea67c9cd2acd066e789bccc29d4b1723a5595d8bde1aeabbc3c32f386665fa005dd9ea07af4a74395cf4186f7fd7559e35932acd4475c172af518a8545526646a2318632ee5effb41b59ce89b2a23be1c84ec4665bf2af783765199accaaaeb2c6a0aa734e3f10d7dffeef5b6378fd969e650d4a3eb42e7fbfdbbd7e77cc8468ca65b0b94a866a23cdc7f4792615cc92c96a92147b4937028e4581a28b1c6364b1ad5ce48b96dfe69e450b397e4f5462ee8b26ca6a567dd4a9d639a6fabb0647d045e8e8a3d7c9c84b98bbb664946fd5c501c513f770329a04cbd71ccaf49dc6a39a917932cd71a8648e0669ae5826c2ee40b36312b69c00f5cbe1cfb83979be0a354b196a04e4942c6f6bb0d7a4a7b1ff4dbf428e559f653cac62cc10724e1c972cae759e16c319fe08383726ae76944dfaac89a1eedc7cad9157332ace8c7418d6d155119cd5f94ad372b6d58109ad590d15c80d15846026e657e67c1de58a8d2415d5823ccdf38beb330cc0f72703f5614ee2df5f69fef4ffef1fee4afee4f96f66b9b93f3fb9393fb93d3cc20566578f7c53cbda17afe491a29579a2fd90dcbe48ba1ae6fbda561d9a677ee346b72c61f0bee8b56eaff80e96a658c0e7f94ef5b5460f14e3afa54ceb065cc52c7a4458cf2f9295df763565673962877fe98ac5685eb4e9df622e6d1a7cf2ca398af56c63e3179c77345e464ab95d53b52e91dba63d9c66b0b9366f7f3591aa93e9635f1ac10a71bfacd974f4ecb91748a01a498418e3924b873d466ee519b74ba6ddec920c5dd36eb74dbc4e5aeb9e7bf6309cb5f907c3a8fe3777cbaf97850c0ed884fd276920e45e237ede4486ab7b2fc0d4fe6091bf1747a6f250a327515a69c48938eaceed0212e47ae92a096ea61bc231b3974b89b21d7493b093acc420548d4c61ce236e6680d1189a3b23966583cd6660591e6e66de6266de2a66d87b4195aafd73fec2a81fbd82c81fb8143156315e2a0f25943abe5507c7080ca43b4c03432a908b914810e6acc6b9d8ae28429c5d440f0af5218e4d88f28e41b5083ec8b3a0aeac2a148a0b44b36a57c6ebf44467779ab953b0441b5d45932140734021f01a9a8b3fcc6fb7460deec1a99c4e1ff136c79cff1daa7c809af49469f3c42a7e0786df4d5a104b3b8c9e3fd40f0bdfbfbbcdf1d408c79ff6810c67848233ea4efdf7dff824f673ca149eec408a256cb8931c9f9b5132314e6e952d632878936a999d26cc6934cca4157ab8303547da763949326fac18ebc6aba96825ff3f425e6d707bd920b1667e27b96e44f95e4a960b96188fd705832d443d745b3fe7080632f9a90f4051fd267b93344e11cab3a31c613f99afd79ccaf9dfecc53cd0ee04e2ca65eb6463d136729341d0c79349fd2243fe8291e5aaa87fd74fe561c856938c723f586e555caa717529aedc49021bb86df339e1cf4e658fade540f5e625453169ee3787ddf7a98dfb31ed6919cf21cdd35d420a83c27dfa841137df754ac3870b9c00477233f147576a708ce5e0e25b5da4b409392bd541fb953395c1fce5f7f97e7b377f48f39cdca97cde33d96ec4d3d3ea38973f0edd9e50150d8f7114c058978764393fc35cb729ad0d439103bfb00ac07fb463a59597490aadd206f8b150322c3d0f50bc5af2c27f93cd3cf2ecb0874578b68b5b6e968bd62315572afdede7797976ff72e64e63d7f2fa511653774e81d20f8958b2e3814125b3b43b02de9865cd1515af3a820e60dcbe22468bd756ae4a4681ff85bab94fb3ab42ad6a47ec1ec38f946d5f72e863582fd60fbc4ccf4e4d726a79403aa0948a537ec42d49b1eb33035a0129cf4d341482a6c901d12e0de0382945b6e5d1c6a31d82b212c45c095db88f49894007105102f478effd5916b869a5cf334ff1f0d75f58cb4117babe54c2b119b59eac53fb37cf222a5439ae48cc499aca116b735a3183c7e43d3940de9399beae637e39c6a73531d7d5a09f50e72bac80f673161c94161385a62a5efa8d8d468ea4946c38a72c65bf2f5c703148abcc950ea361522b686a37ebafe53b8d3b03bc568dec7ee949360f14abf5647b1b17c7d0aac2accc8369635a35ae5d1ac51ba076a2b57c9a5c1cf5f800cfcb9990cb44936712efdc09d62be50483ccd903a4c92800888276a72a8b549053b2ed3c5296e1de81421b16de46bed3a9bbc7999ea87c97171c394980d9ce26fb9a9ae9f0c50a82f462d857e31483f7e8141fa71b741921733d21d3f09b9c7a6644c31d12f46f500da24b2e58b3672227497e9f1eb4783ea102a3c6786519efa21e947037c270de5f5124f19cc9bc8e740bdc4531f20b81a22c2ea03a66c3625b3ac9778fa6b0d4f30c64eece200b55a4e803136692ff83cc95b2d877b5396bc62714e531cf8fe13045c57878b7ab997503accdecf862457b2694183f1728ad9c8c98ae552300d0832afb6719d0a858b60e31ab5d486f3618e7d9894578ff3e349e8ba731439736d9e26dbba20b78d261b3989c7b217f36b3a2533549e1fc550193de9caf86843336998894549fad900df9941ee0fd696faa41f46c795a2f2ae4c94281a50374026d8cfda95fc6e344020f3d7475f462a338a6621c828b508b0590d920edad3cbb296dfc4d68a0037d094e3107ee945a2d7886177b9d8b35f7d813dfbd5ee88edb75cefdb8d0d6a807a689df26dab9befb2fc5098b45af66b2a3913a744a30f1dee591904a7da6a3964eb4c92869934f1a2b0ae4320eccf29995d60ab721971aa7f7b81ef073ad7653dd7a5ce7569724dc9582f012b6711796a7d8b124f448962d1d8254ce4a9f56d4a9084653c4ff96c691729634fed40cf12fe9b652807aeb634919d2d57f41a51b22c15ae64d0fb40e6d9d81d954e05beff14c1b6fd4236f60bd9ba3b0824051205227606cdfefecea0d9fd929f7f5b318f22eb8d04428fc4592c0d71beb9700e26793eeb1d1e7efefcd9fb7ce4f1747c187cf3cd37878b493e8d0fe0804dc707d6999c39e88eeb7b94adec7526c9fe862c9acb8a649e82c1d53261d117f5b9b53b1659907f3118fe8a54a3407f4d1206d37c2397a9da3e90d2b503a9d49dcdafb33c757c788caccbc1faad873c54ec5b907a863ac4c5fae15e964698823c48f22fb05df2e6ed2257bb383896893e4a68563b4124996c5df9389b1d215b0e0fbd967d7b3926e8ce90d8fda446223285dfb37e32c0545275ae2baf40b7e21526b18abef64dd1ba4aa7d052a525429953d3f24dbec090263b0ce9b469440be36f7f6960b7712949317e3829de156794a4d1c439fc87f7fb8c9e8e9daf56ff3845870c9df84a1856e690b2e37ff46405ff38fc7d46c7872864e694494f03bfdbed057ef7083666a35cff6a5a0cae679b8a3269665f368e692e8dce6e79dcb74d0e27ef637a7b9e29e620f9ee864d670a3b2a399cd21434799ee55bf51bcd4df0fb9c5f4ec96cc692717985bc6752552b4a5bd604ab6c75ed96e17129fab3b83e4c25bf975baa2065e587b45403c995f1961989e8f09fd0d8b3adcda9abc1cd1723a6a84acf2c859b7ef94a68605591d535496af036dc451a1bf9249ad0672635d38a3fb558ddaea8d20d5aad7da53053aec68aaa4aad6c58cf8cf783505b06308a84d5b9f1a5055739c85ab54dbe8609ca51262e7672bc6546bda1b64d7cc91d86401717273fcec37b80c429a46b984bf8cad80de5993a3aac4f959c156b6d6fdb03e691a25dce3c1f2dc414385fad683bed934e500a24b9e01821c2a41384d9318e42c4468e23edc160ebad65e63a512743875d34e824e8d84719666ea06c2a48335afcc447e82ec24c3fe48a30eb28934e7d86a38120390b32ebd021e6d5692c0dcfe8517498eb249d181d3aca224c274648e59563a09d016eb10a463b01ed3c8244ac24da7914e6c77eabe5e4584cf149204d62e9f6d2da04e74d780219bd2e411e3829d2a6dba542990dcdb36df0ec8691740d4e2e0d414f67f39cbe4a6942f357d22ee4f67906a64fa1cfa00dcb6a05788875f444febe93335c4123294e0e29707120d74078963b2992297637c3acef0f74a551f119aa5bbd37ea61e4f9b30f57bf3c7bfdfe0c866ab990ebcce17d7fe02d108c6a514b04d35ad4adc27bc3633c6bb59c191eaa23d209c0071f21189984914e503afc08a632c1c4f9102088d559fb8b7cb6a1ea07529938103dda922b46b2835b52a44dd82a9e90144d26ad9299350291888baa711be0885439c8224d6d4a079de8813c7b7bf1fdeb9fdeb45a4e5c8158ef4212f1cc997b514ca6335d9537e4b9a3aaeb041020d1bb64a00c349f933c658b47cec49b924fd428533c5bb0cc898121a420de007020ab90dcd1be32ea2026671b0872200500599f9600b04341e69aa4da00646a3ce900a1135feac275d896a17db003124ef984f2fe4e686d8c5cbb10ed7150e39af532b866e63b5a6f5109d5e8489a34ac3f9454ae1c24afa42cab350ac9b7a8ead02d91469fadf682c71cdd77539a13c9addcddd05494e83df21e83bcf2369a41da0e284f758c7e8773b05e17e7fc36681aa004655012170a3440d7304af974e389d15feeed1a01db42b56b3add262cab192b36f059564d6399adcf24ced24ab2c1edb8d1088372243a915a3d464949d311850a53a7aee704a444690c1d57b773c88efd103117a7ca5e033b4943c43a380dd9f1c6c667989cfabd14c17ec17f96da51ab1559ad1c86314e4f19eea43d514bc5728305934bdb0cccfc7e706df52dd531b19539824867f9e8dafa5c2a4bc612874b54504263f6a1795251d4554b86392eeaa827cd70a6c7f0030c71a4bf3f86199eb5e3ceb03d774d6a8467edb93b6cc73ae6e3bab4fe4f732783487a2dd8c1cb475acfb4c5cb07f920d6eb8742f18d7ae46355f18d9aafaaf61b355f9b2a70b4b2506aba70b4fcde5085a356a0ae1147cb6f8d3a2a63a0b63edec023e966264b2bd0c2131fccba012a1500d57840d17b6c0f0a14bdc7f6a040a5e71beb13acbed7f617d85daf6f02b0fa5e5b92024755c6c120ac07d783c9f8bf6b4d9066f4ca2ae89534a1579255d35866d428f1be727b9065863a541f3c83b8f89a9baf526034c94ab14aa34e6aa9f428db3a324ad09285c6543ef2528772cc333a1458db688d46a280bcd04e56ab83882679ca663427b1ae43ba2ee3094e572bef7129d39c65f61337a5d0e23d563a99c0e527eb2448be4d37467d9c6e3be974dba94b5c8eda0e6d67c8753a47edc43d6aa79d6e9b74386a672e6953d7b2b13fb407402dc56d028da053d80e4ada493b5fcb4477abb27db7ed041d8ada54654b1ab25193c136463eaa747c77809a40dac87c24333f00da51d18302c4e63ee82ccceac574a75535bf66d1737acb686a6b3bdff86245a9535f45042519a022ba38a9461c89f523234a18c67f0586a30d203ed781f85c07e2731d88cf251037991eae26005eb3a4a2eb7d13d47bdf2d7a5f56bbdcb9daa38d7a3fd7ebb5c05d6485a3a3a69a7f9e93614af2bf3d7365a3d77fadd1bf345565ab5752dfbfb1c58b595c9b191bdbad27bb52ca9326543ec9aa692cab6359412d4f76a0962d2904f0b2ebfaf45760cbe7d5fad57e8c9da8e358f8fad4ef0508b5a921119578294630c171672ec84d3bf3dcc5f313ffd4ef3956e682dc9ea3c308b9016a473dc1ad4e5aad39c638ea04ad9633c751a70b131c20fbb458ad447509cefacebc13a0ff8a063d27cbbc6c7e5de352830192176486ffcf320429cefaf3ff8a06c064795796afd5ee768fa353a2d2bbdbeb8f3a816821ea748b36441402225ba99c5b85b14373b289736dc2d3e1b634353b33dc9ce3d47bdcf3ba8f8dac66c63f3b8925ddbcf8634e523a745204b3427a2332a55b323199695a66625b321191291c1d07b4f3a8d57246623a862634c4230453139a8a5094794d4f209cc45b40ea2d80790b20de0286f2d931c4f7165942faffa97b13ee34726c71fcab60cefc992a2397c14e7a01ab7db27667a6d3c98b93cea4699e8f5c08a849211195b04d6cbefbff68976ac13849ff66dee99998d27a75255d5d5ddd2559832c590394ac4d95d5d62a9f014b3e832cf90c50f2595791aa2aed5415637451456da71369e0b780ec732116f22df086e55735e5436083f2a1ae88802e45791acd65c7e6e7cafe8c01dd942948f936b5c3354a532ecf1b8232aec13a27b4c5b38a73267bc4b525a82eadf4e7ac8d6de84a53318058ff28f380d8fd0ed93f6c7e695679fe0dae4fb871e0fe68eac7ee959036e1a5b19b38686ef4d8f2be0e0dc01b6e6969023b60e8e341dc98e677df9876bc2afd15f32e057057b1ecd67a01fc4b96c062d72376d174c42e8a304faaee053c84386217bb1eb1be304a731e461475d937aeb42e8fac03ade361201b919cbd4f79a894c7ab54475f68b256211217df4a8a72d933a16e2f7b26a96f93cc617c7964938e4cd2b14d3a8e6b66e5abe51a973d8348b7a300960c9c8632483e32280e938f0dbefde412a4df42f270d9f3567d88cc20ddc36890eea13548b7b89dedbae2674d2b7e568479d5152fb9cad97d97fcd55fbee44daa3b3869f2596d84d97fe54698fd9fd908b3ff731be172d78d70d9b4112e8b304f05a4b634fff2de34dfcc551f42884f897b7112c31944a504f940ad711203922c5639cf96f9fa4c86528bb0ba6498027295d782f4a80c54edc338960a34e506f43b32aceafed865eebda61b58c237f5cb6fb6f576d967a5febe7a53dd67f794fafe26dbe47edb6103d6bb2efb75d3b25f17619eb7ec25e15fdf9bf0ffe5ebbe16a4fbacfbf5ffe335bafe0faed1f57f7c8d5eefba46af9bd6e87511e665459d744facd6eb6fcc9987ccc9a4c49cc46052624cd402bdfe4fb31f2510fe1b788d1248ff454cc5065cecba422f9a56e84511e6d5af5049502fbe31277def256a522cdfac16edc57f7ed15efcf72dda8bffda457bbeeba23d6f5ab4e745989715de138658aae75f4c4df5134206231b21b01fef5b2d1bf50290c580c2ec00c980853d08213a45037420dda0b0111a835cfcf9c9c5183c758d0d50b73f06abb0c07158e0681cee8d6511515024d7204dae419e5c8395d81f3a750dd2640df2640d56868c9fff1f12a396a0fd3f21ff2cc1fcdf29b89c6f115caa60715785d97e5386f1671cdd9c9f4b98cfcf554458a37031400528bfd80de605280b5c068b6adaf16056005f316e9015c072ea834befe378b02e40ddf133b8ae4f3f1e5c14c0dbfa83f362e3d9abbd2ca2adcfe1ec527a796b7b625ba9ce2c3fd18ad327392d30dcebbb97d433f992fab2a9cdb0398689a63c8ac4180fa405e6cf195d28ab8cc0bced996cfeaca859275b42aeeb57dc395a9af7db39cde5505ccb6ff52bfa87c647f4d99c1bd0694e9984f9318e4cff1991226bbe0e23c26bd517edbce66c8e26f44a97709d3fb2afde6f4387692480e117bcc88ae51c331c40830a1eb46bf68df2d7ab0ee30f265adabba5c197b468507abc065133465764f2c41f1ef7b0ff6b61bd25a6688119324e3f2f32549838cf4c6958e9712fd0f22cfb8cd504470ffb47e061df887c1668a9022a99afd7a8288214019bd2965729e753b62af84a393dfa27b78968819f5d732ce884eaa80fcc297b7e99e1ab25655c5ad21ab06c6a0147a2c64ce9a8837eec2d89d7627bfcea4f88741fc9a387a268f2103cecf5620f3d6f4aceef4a73c94b3a0594fbb3f825d3c5954f6801d50763fba502fdbf66748919579771d05ed22bccdad206ac29b69b5dbe46b3567a1b09b4894bcb1c1f9a921b0d8f795ff62cad4fc9c03819940a74ce41ea291be8fa87c71a0598ac16170cb942d96966aa4f708abcad25180a3d97855afb020baf0b371b4f9a66ef477ff69a97d003e3cab4bc84be6b5a424762018985675654f0791c7ef6cbb9bd3057af46dd57babac04f3386e5d0748757da0803a88f83e04b9b5cb88f03efabef9713f5827ede2d6d07a5a23b7e547bf636d52b4f136beb0691d45fef902f5fdb0ff6bf7875470f4ce178b7155e5aa262855797e8136f893e2d118cf7bce1f079c5f89cce185aceb3f489a4bc9a6a7ca67461689a588f1ef5ccf19487ce6c0fcc59241d3dd49d529c2ec391e9f40bca395d844333ad118c58b863139d33f533c4863dc2c73e317bcde8bfd58a3664cda1e6b7daddfbb4880e1e02f1dfc1c31a02fc429fe15bd795dd4628ffa6f4b73cd1bf7913fd7917c01e2d2e324cf8d6a3dd35f971d77df406a7fc11c3c86f57790009675a2f62ed06245cc55ebfcfeb5ce39ac7fb6bbe62cad1f8cb5d6dbec31b6d60f3fdb228b95a37bc876444b513eb589a0715259fc5815dad2a3fea8d036b531e64fa0d5b7b5b57be2f6e50f8d30ae545c4e3dbdb0a1c62c62f8b88031c7bf6cb0d2eaab0224ad61834f203094ab6db198932d81b3217c245dafa92111bff6422fa66d22bdd013772233d20360614a2a08f028aab383ded0dfa07d9217566f19ecd72116f58b71bf8cedec56e3904bac178f98b2c6da5cdae31d875d4add2a704d34ff25bb75a8b5e63bed173c5e2b9ba1caad6cec6d4b91c9fc0c49dad343124274cd98b7783a922e3609a4c1483b86abb6cf0202dbeee61bdfea0f795b6f2c185afd33135a4f2256fb2d7c710dfdef68f5ccf8088be95a74a0f0143769259878bdd6eec1c7a667a19773aa8643d767ab48f07daa9917bd7babd0d3e8fe3d3fe4057f66ec1a7781f85c28301060574fb40db5e6d0b5433e4020b9a22e4f1ed6d44144e724159f2500bcac31cb1118c3a9d3d32221eb1d18d1181545150d115a5df5a67c9b88394ca5ed92bb2937061566427862a6ad9894fe91a94fd9c3800bbdf5aa0d9643a79a7ccca351af66194e99ac4595b471790fdf1109746a743a405d2ac7ae3ca5d8d941a31f397cc8f52ca93516ad64b3c8e2d681519d7260667bb1ed32f9b8fe9b30204029bea81bda097f82d8db0343b0758999a7b43eecb2197c6aa98d88ca89a5cd5e4b266201d558d0f9a9f887d419394167b812f54fbb55e4bcc895e69c2d88fab6ba2a851a2d43e5b1057855d65183e19c19d244e2568ca3e6eae778348ff14959b81cb9a80930e651470174e98580399bab668dfb8f8aab5b83774faa768a71950da04a88d23b00185a4ef6fe76c55e3ef4174725e44a346e0c6494a498a6400914630781d18eaa9cb67740c4488a55b11566debdad86904a9ebf014be28104b23dca580778b309ac206a8dc866e4bcd60759c46356119364067d6b6e44736a81b44becb206cefdd14f06e1eb4ed06b32b1862826b226b3873159f9cfed4332779eadf0886b9e5f0cbe01b8e5f93a35cbe32ade34d6589a4cae27be5b7dcafaca8d2ea59d970d20dde0a5eee76d497176538843bcee2973b3ebe0662fb6acfc113eb369f042f773c3d83d6fdf7d29ac16d62f06cd703edacf9407b563886f6179ae362aba761c3eacb27850aa76f9db9c86ccdeadb870dcf3914bee60ca5756cb4f69351ccd1120f02265d340164c3a57409b5f42b5f5d53673b2c26f33c52614b824156b8123546c394a8b25b5f369b16e3d95d8ca17cec517299553601b809e2eaccd43183166e1c02bd332b78b6e36296602be8ff1a444be6efacd8cef4bdddd91f5fe316795b0071cf9acdf960afd748b73eec40b6684e99a557e2a3f29c86ddef061a66cff90f5b960df0b65b42f538e54b9707c80cf35fb094ef99220e8e10ac92f77defe5acd3896c6dff41ad5cce7656f6e46f84cc7e4356f01c9428d7946f2c7e35e47970103f2b5de114ad837ea40cdbe55502f9e8371abf8e7db7094a946b2ad1a85f4f0b4bbd5cb7e380f4c4fe68d795fab6999a3f124bb5f472ba6dd1bedd813efab3a8d7ae97e44ea310e45f037f8ce74b46ff7d96328cb5f87ba01e3acf7301e16b2d8e7e4f593e192865b1f39cd28f2ac4ab4e9961febbff36d5f4b817be604979cd73f592da5843bfb41aa99d04312d1d859e3335f51e6c28ae7ab935276365a446fce30dc8482f6b46af1ca2cae0ccb2b6c98cb0ee4796125b3694e14bd7bf4d3595e8bedc8080e7119717a340e02f0b4431605689d9e023e2624e83670c1034fb825c6256e0387cc0b62a0ee52710712392579be421e8811e907fdc3ff28ffea59ed92c44359094b26ba0daf84ba8d175947bea94314667da039e7e2fddb2845ca13b5c71197502fdc3de1965a6d42ec0f24fa06280f58f40d3c0ec47fd6959eb2f7621d6e8f7cbfaeeb2244e40d8e9440a549714031be555012ccb30cf2b8ffa1d8387fd23237c36c3b9ee746a52d7b7b76e8c619653c702069dfe16352476af1f6b3a0c74201c8b7cbd7bb1a060af77a5c0bf3653e0d782025b7d07f59e2528f03d29cbd1fe2a79f3e8e9d1d3673fef63759c190a63c62edfb50e8324edcd3e83d89e9ab7b73c9922362402abc9945e763a4cfe44c512a7bcd3c9540662b7b7912c000930b990019905334b23aaef9831f0d19184030d834a6e62f0e61b9c726f021c7fedf966b90d87345f89c3603f38ef21b63ffde770acfe060fa696fc06db5cb303d8f0027ea640d3936fb0149f083439cd821dd6a214089ad714aebd960e3dc7c67a7db2e0e4cb1a4f3377d0b9b38f369c93c3e6f32b38b848e9e4cb6280d42f972392acbd4d499f64c4c7a291d5d233e031aa203a4f9f8c4895ab3d19d147fc962152e4d2cd55749025d7e0204bd6e29fcf31a0d5b39354cf4ef215672755c1e2bfc16e7a152e93bf6c3bd56c91bb76c1d35d87f79e370eefa9185e55a7a466989e2cdd6faf3250ab7320b54eb0fce32b9b60f5d7699988736a19289760fdc3d32ac1f28f5326c1e25f4ff105cb3f25ed17e9685d7c9d8aaf4188a29b0d5099566cacd89f57d369a80fe4cb4d75abb61b13dc5d76e922c4f7c07495e7ef657ca5befcfd8b8aaed4075436ffaf414ffffa30e8812b5d508760ea1b1523d1aa89066f5fc165a26ddea85dda54d59109b82e93759726eaba97f601322f4da982645e8ad6004177a8eaa850f375c85318db6bc0981b5b3fbeab8bfa9c2a2f16b9a5766097617c181deddbc51203ae8b71ba3cf0165eb918f15beb7aad1d01e65ae8062d1c810c92030c10245d0c28645d0e0ac80eb80c1355414605172e4e70ed386a96c0a18518e44de3aa5b23aede10c128ebc274bfb266e2ae9fa8a2041530a20730af14fe101ff8893a7094620c4ad3264f089fea98f8cd6ec7dbad6e74ff4b4de803219961ae7f46b5e56ad8f62f9611494ae3b06dd325a5b393e4d215c17313e97204dd3333e55235f9f366cee5492ae861c7a44f4db2a087759bcd149424aa42026d512367f9ed1bb056bf8943a5ac5cb713b37f1f5ef9c53738dd5fd441fab567fc57b1b69fbfc1a83e8b51f93a8483bdde26061fbf41d31f45d3811ee1d7624b9d3afac216281eda1b1bdf2eea7dbbed89a06e1fab2e5def6e37e99e3d28d4ae78beb39cbc396ecdf33be2d6f0ff44b04cef766d74369d51903f95eee233c2e3fa78cd2f11c72c43b989d9fc8e282ded494b37dd96933ec2e38d8e8f88af5aafe948f9301f0781bed4cb48a71331ffa5c41324e384a0059605c40ffd1d144895089e69817ea164ecf66dc12bc9e86a3627321672c4dc979f13945f608e725bde7ef93941f9628e319165e52f18298b9ad8c124d3e3a0125e6445915d623102f3db553029613f4b9cae7224076d7e7b7de894126819c9ec50ec979f132255b07a2995c1f098fbf273eacbbf09705c4dae2d1b3435a53359774a67ea2bcccd913c6332a24bb9ef3037a875916362ab980f2fbdb4a0161719518b4eff76a92156b3892a267ee8efa0005da234e36b5946ff76a941492e2ed24bc4305128f7bec3dca016ca9773f41617aa8efdf27382f213bce4735bde7ef939d5f2ef59c6b1ab203f83bcea767455dc679017a291639266b9abe42794f21b2bbe44c5c74a65915853aeae91e72b92faf5c577985b57eb0d9efa95dee06990d7d451195893562d55db02caf2a036caf230b7aed61fe56a7f84f5fe68acf81a19bae12594f2838a5719c3f22d40d6b25f7e4e7df95f3382e5591d56b4c9b5659b9b4ad1b2da508a9635e59a1bf937cd48b515915a57b274e0280ff0fabcb1aee1998dbdd097e5f260d8b937dabc76901354cccfb2cf7a53ea0f2f3d283c5372715956ff76a9e17ca728d71b50fc3229419925cdd7334a940440960d52ca259aeb3e47825daab6a0d2eb4b37b7f68e64bca83626936bcb8603ff9811628e07f3e1a5875c0165cbb992e36ac6c04b28e5572bfea6a2dcb88a3aa1941f4e77c6e79819f8ec979f1394bfc48ce36bed014c75152655ca84d5b322bbd00b41ff76a9e1a145097e89964bac5838f719e405555605664f557462663fbcf49a81c82776318c3691015ada100a4e924e5b618953167c96eaffd41b6ccd0fa1545e880b6b9990b532d2f2d27550029732cac6c3e22ae3e95c8ccb25c29b0d508182e39b1415b8cddb83a0407289f215862442ea57acc2b50d65e1b4be7099b1acab7a79b4a56ee009a1b6f6f196da5777d67eb0a5f6ecaeda8b6d7d2f6b6bab7adb7a7db3a5d789b2fcabadac8b6e36e1b5455d790acd15c9df2eb5660d0ba614336f2baa84527ec8e932345b60c2bdaa6152a54c78afb8d60e75dd22a66a117b39ccfb18d171506d44cb77b5a281efee432fb7c4207f360cf267acbf2b051e718ec9ca1d94a5b46aa990aaea335efa16504fe471a9004f6d19f15317133fe32a37fd5297351fb2b4f908cb5fac164b535cff96a5f5ef6ae1337bc0da2f3f27bcf7ca83c0346fbf6407f62baeafa2dd9fb330a55ca2a6ae024312b7224c1cee895996db47c69d11dba8883b9da880a30214e31830bf780d9929ac5a6270b415cb1ca532c0ac196b294d8eb8941697ce4797e9505c49ad2bd9d8ce63a5d9c12a8935e5ea850c66387e821c8b9f10d70b1c4c5d3f412d5b2fa15e8e60aa7adfb2a6f75d5ff18551740caabff0b4322b69b552090380f72d01f0be4b00904b0bb4fca9e0953feb4a96000dd3aaa5c2d9c1d31ca73cbb34d5fd84527eb92243525ef646d02053d74fab960a5a909a0166a0e6430ed57cc4b5e5c3e15652eb4a86548d5a92462d3da395ee6452d85798542913de32189a64de26f6be658fde775c2f393235fd0459d54f68a8fba6bce96a73c2d6de346e435be4b780065793c3067faba7caa57c47a0ea326ae8667d0b710c987ccc7eabe5b98d9a76d6481f9bd707a9ccf2b88037139cd209162d94834bb75746aadbde33dcb628f754d660b1a74ce72727aac508fbc67eedb6b69ac03566d1675c5c5fe4709fcc117b226bcb68a19cadcd3854abefdebc7842174b4a30e1112e52b4c4118fe34d8a04d7ed8d7a638d2bdeb1fc31aa9585e32447057f4126f8fad5346a1fb6cdfbc18138e7f8693b396c0f7052ac2e0acea21ee0dd7ebcd938a1f9bb228a6f264dee3b5e10a5f43179bc9a4e31fb19d305e66cdd368a8bd7b680f23053f6f5f06fcfd743e5d623b9244800817b7d6024f49831ca8c88bed4fd23ce5976b1e278d07a3bc72defb5a245e8550b5f2f71ca8b96f5fd3c69a1a2c5e758ac1f366921365b89a32e69c731f880432d10ebb06a818bf96baf2fc86e6f3d3761bfd47991d8bcdbf5c165d2acdbf2ae0059d180f06daf56936dea2d71d34ce16ada5fa6701a40b8c542ab0a653df000278d98827b3da5fff9ef9ddfc070e394fcbb664adc22dc663f82779893f242c395a43b2cdf825eb6e1b5dc536dff755875550c5a7ff9064f8bbffcf73e2d6e5959a7029e77853460987069eb34411c2599a0bdc10d93187b2751f4e76244d48b614412244ec278286d8025cd96bbea038e18e8c7f1460d5fb78b0cee9da30e242ebe9931c3cd46680c0a18d97ea8ee87ea7e00c15711dd32aba7ff2e061f701c3140938ce3c559f61903ea9ce74fe278684745cd1366a19e30a97ec29483b14d4608146a20a9198894073e72a3c9a6511a07434a9d71620e5331ac151c8dc11cf6c0129a88e6c3f9c97238ef76e31b0af3d15c0cdd20af11014dc3ba7b542b659656c41b5e1ec0088de16ae30f4e4b49dfe01c71f9041af1da0cb8a73570270637334657cbe2f6567f4e18ba123bd8a52865a522585f93f8660e7b76554ce1c4a2680fc2e9b0db9dab35b28093d17c3ce4099a4c7e163d458ba4e08871b04852494917c9423f83cbe5186fe4d4cd0c78177425df15cfa4055200c44c75716962f7dbf424c58463d6e95c7acc9f4915cb256c54d65fe2e812cc8c35818b46a5e786878fe681f495d74b5fb9e10f7f2ee0cd0bc27f90700cec2ff02eb389eea74a7d92a3c5124f54661d075929755aade735fa82f0fe77b67ffd53766592bddfa2f4f1912dad7fcad226d9fb0d9ee714d90cff43e57cf7c0cbd11f1ef7f77b2d37f3fb37a0f1bfef46e3db36de9da0e7a78f8b24e478231c0f6cb6321a65b8a02b964abf59b092727b8b86cead43787c507b7cd8260589a89c20c488c5c92acf25ff8ea0779010c3aaf392bac91e84acd36191792daae369b55aaf513a7982c8df794bb6db6a7771b79db401174773816658d1510a516222f57b74abd3f168189782b2f6ccf0e73631e1f4577a85d91381cbf8d41c8b08f07850cb72d781271024a06b3e3e3dafdb0ab3acc0d26badd415414b2c835cba3c7da666b810576afb2198f0cc2bf6628166b248267f7853644c1bf6a46983f4fe15c7c64241d635f7c908db9b2390debd5d11a301542839aafa0d506c838e8a420a21113636470c503fa639c91652965bc823c47d7a2d3cb289915f21bc5dab11763afe97a6eab7b7e5b182424f81c4710d1b73b30945def6b86db8c0ea4d29b99167be11b6bec28e32a9d03486d9c619fe9766b276393402a2ceec5f0a90c11e400ea2ec040d3303110505c4de8b54e13f40bdce11c1f6463a7069a5bbea409182351d159a3d307a7456694e279c61f90851d80c93103ceb3ca6d7a55e1fd3eb729f32fdc9ea02df0f0ca98b722738a6602d784f3296e665bca8c41d10a3ed128ba4707df139e62ab2bcf950dedcc26ed7b960842b28d0c93b77fd962e81f9fd5829157bf811e928df8618bac4e41999e0c9ce80d3ca2a1249f7c1d55f099e62924a00aac4fb8078e7825ace3303ca729e29407685f1299de014cdf184515282d4cfaadd232f525ad457f5726a6bbe4a797d4597515bef2de6acbea297731fdc4e3047591e60e44d4666a5c645d20ead668460f6c6344d57dcfb529311ced93db7e95bca564579d822ed3e03e6ab0b5cb7daf9ea629523e6a5209656bbff27a1bc0e0491fe0560547bad002648caa710908034dba43bbb373eea14f75871546798ca26a856b5e0a910b3017cbf223e2f0328d37640900e7412d0f0baed1d74f89ae6ebda4de13276e8fa12339ea558f4989189fe55da28e17125399832791369e5de0ce390c2d118e4b00756b0d0bca5e11df293d53037bcc31cf2912930cac7e361aa6ef4f37853013c05da1956ed89faec9ab3d5a40ca44ead03731710b780a762ad8bb342f289f246b49ac8db8de3ff9792dfac2902cd125d5656e73216fc6fcdd87533219b534bad1bde030614327db5085bf1ea07b78dbfd7dd36c4df8ccc5aae562b2b5a84f256b15a2e29e378d24264bda00c277f2f2bbd042afeb5cdbf23ae1973536a0924b4da7fef2a7474ffdefe7b3c4c29e11959e10d55dafcda5793c57d61e4124a58a4bf63b027bd14275989987a37b5c2975c5027b9283cc90519159ad9a6d69bb166b6ed85a581d706acca707b2e189f17ca2edb5e8db87bde42b007a863c3d1091d22b39504138ea4124dfbe52ae7990143dcdd0d4b5ede9ec3fca470972abbfc4d936267d8dc513e1e5a830d325aa9e1773a91fd0dcdc57515c720350e667566bc611665a98ca7dff25a2bbcd68a526be20ee6eadafc8dc13bd3787737b8ad0ed586e4c4ddac3caf5723320619fc99ea5e99277e64c670445db0f4b77409a31c5d96ef5bea4adc78f5562bc0ca7732ef4d8218418892898ad320c2b512f4f8262cfb8c4c2279f957606f2b29373796ee5b6a1a8843edb34e07971c1b2aa13f2e240dfb44231e6ba1ff13468be215cb6619d14e0e5d825bc414f6c48dd1cc013d2986d4cc430af1888aa599262b968bc51c2a01e5717cc346a95e0b9e63b315ec81b99342af4ee6c395697409f3d16a0c26f0f07fa33f0fff3c8c6fa3113af83cee0ed4e7697c98251c173c5ac6a7cb01094455dde5d076a8a73b9ac4f1462ee19b1dda9423894fe59f72db6a946e40a2e94d6561d73cba8bf5e49b543943faaadaea291e4475a6553edd0da43183d6132a8f10de2ae674954f5a17b8959116592d30cbd2d694b24562edae626d78d52844d84976606941a1c42a256bb0daa3e237da6acbc2ed56b1c46936cdf04400f7775004965dd2c04cb7db6066563e838c91996a1ee8ca318868492bcd351ccba7a735f193e433d4c24f89cb5ee8ef797a79051668b9540a92d4fc8624b2e9e05320bc2af42345a743f52f5f5b4e2705e5195e6224cbab5f4179951494372f0a54ff0aca9b8705bf7d67af409dbd42e1d92b7885af98d48ba1f2c7991ca7f835ea8dc1bf8a18a8f4b72ebd2fd38326c4b295266654ffb469413125a58d9464d69c9c7e014c523a3188371f5e7a384919799ee5122f629acc979a28f3053e94405da0995fcb7ce9e99d35d442242b286774b996d5dc679017e224cf961f144ac42f93129459326c5cab3cca9773c51495136bca058dacc812a51f1fe5d98c2c94d5192da7554bf9e73e2d5345b5654b4f17fa34af3f5b3d6a705f3a6065f6d6dad4f680b41293cfcd55ce2d1c97181115a5c012457692c9d80446d37fc402660bdd135cc3b4b5a5c765c389a1b1c7a8947142ee8d13d7896025044e365a028c7d09f0598a096e0f9428f98f404919a51f955fc34ee737796ac957708e6798457e76acb498edb78d8de797a931eb6c3fa7b336d4df12a65365e929fd3967914a97768240fd967e10d4cf2962f140b4f0ec7a7914b6622d46453bacae9d89565a8cc3eb3b66d2c95776897598258d964f5cb67109b0760306b005a5645b3ba5e9aad000a4d24b9dfc1b94f94ce94216f1dcd8848d64f9e267b49ae991982f3fa752de33c2729f415ec9ae47ba8a600d3e22b49b9c003d3561a8347e9e169176fa633cfd28073fd6a94f23baee44c517c0194452d2107e2e8c1138f01cca8602d87264285df5c5dd55bd6065bad2abda4ac0f300a5dd3e8512cf2058936eea635353eae1c3784c2809bc6908cf9b1de0515edd3c3f6e7520968350eaf61ff9ed7bce501b5176f63123044f5ee262de1eecc6feea47c4b835a1389068b4bcc65a6bcc93b6360252ad2b089ff088c2ccbd94ae635040e43d5a868bc80a69541b5a59685b75904aa3e615e120975e8b5503da979bd6aff99c451414208de35201a38623450c9e0642941b359cfe77a170f3d55333b4b7599091397afe731685308710e3644127a1bd95a8fd2ba54bd3c2bfb6b650a96a647f9672ee5e5d6ea227395d4dacd034f35afadbee2d9d2d59c62d0eaeb2a8b9a854e831257156b60153b3222edc814f8a7bb9a4501eed4e95c511cbae036dee85f6d45a29ff68c5a9ba851863a520b1a69cf2c257ae6b7b9de0942e96b4c0d22c567905042cf9b4127821ea4359f8c68328b0ac55654553d6cfa03f04e762b0d6d8d9d93a07b56a6e11d80346d4735f414d975c67afac0711d4d0c30af4f06d683da57def22edf97925a30f2f86af36f9f0a3fa964a88dd659d5e97ece6e8957116cbfcef30b7e4b243a65b07b22c4c2997a8abbb30a6dfac9412e22ac8aa6b4779bcf461f0ddcc86ea1e418138fe42cb62edf9f1c92acfb5717190522e519a3532c1ec15335693de7798fbe586c9395a63a62645fd4c16ca7b83fa0ad7dd3ccb270c93d809c65c2298c3de707eb2b28a88dd6ecc9cdb4e1fb5abd17c2c2f5432c8893c0c240bac187bdf9227a423c8a720eec349ff96f2d27389f3024c606f3839591a6826e6fe3385cbd1640c1650fab057003d5edbb8ac6d4121db60aa757d3c39ed42ac3d3499fc2ada8f1660ea3cd97b4235ad72f8be009f0a78f3eef7974a5e3238eef5c093d5057ea3adb22871397d93a30dae5cce1178f66925393b4466ab1cb1baeac735852a2d3d005263204b515ed7c64309c2bbdfebf2be73799566bfdf807f15f0e68d14d8bc673abd8f8f81d4847c4b9f4d66d8a5f77a7df032638c323c29d7e9f58e36e043016f7ec388e1822b3984483f063ae965b65ca06525ff41982f4e72c45cf643504ef94ea734b4f77d905daefc83275cff432a4f7afaa15630aad423a5a8fe71c6a5656f1d9fe8153077e04acd280e1fc092760ceaba9c629ece77ee4696ae6bba363caa7e1eac58f7fca330f12fbd38f57ea07c2f1cbb7627b7ba10f92e16bf898583f85c6a5bbac6ffc7856c57ad3fa7c444819d4892e6cafed30ba064041d5932cbd7cb7931c2e3db5bfbd13e6dcb872c6485c4200539588139588209982aad51a96e8d126a49dd02a2e45c06b29cbc5af13c23f8f6362a274194d0a458e6198fdaad761c8319ec814bb83054687672398c6fb42063319a75bb632dc858b40714aa947dde25a0701f0c4c4d143a1917ca6300f3edb574c8a772ad4fed41ead7cafd5a2b3f671eb6578ef61609a4a520547cb9f8b2d6977ece24ec3708e4169999121d1bca7b63bcd4a2648ef63958ca88ba9b4ded93b3584683563a47829c61d66affbd8bbb7f6fbb9b19bece0a5eb432d29a52c25b53b4c8f275ebefdd2c513f7f430ba9a7eb856ffe5bad1af51fdf408dfa0f19a2f0d5b2faf8e89b469a0d6a0c869a34af8d444ec5566db72b31529074dd83dd5717c7c0bae9570f7a0c1734bfc4efdefc1a6175de596deef7541cab22d9975a22138136ab7f812c307f9b2d305df1c87f5994baae321446ed5b642f0668a8e8188e133ec7248a6af083938b9c5e44f126de52c8222633a83cad12621c0f6a1281ad52d705896fde53c9066169602886449a8614274aaddc55e7f18d5128cfeadf591b5a02f5a8ae4676f94710d965e78894925ccb804d215df7e2f17a45e30aadb78135ef0868d9d0b78dae79af58944d8d55089ba9718f48924d6d87c4cbafb23dfa63537bae78845d603c79f06e7bc4ad0dfed6a4052ef515d44bfcb362884cacd74cff30527fe489fc6d5f4cf76dd5cdb9ee0430b8d797cea6fb00c1de109d906106ad8a09857c948d4101f9088d410a8be4fa80ca888c45b23ea0c95a5094970203e8a288f2f8272dd57ff6faecc5afaf7e93ef22f949afd389a869e22095cd656390c30329315a9fd0647d7b8b93f54f45b28e8d9a8f681a276ba9bbb3962de1e45a7e5d6bcab5d7536ff2ead693ef8b0202bcf82015bf258092e6091ab2b29544caeaa4e73a62708fe9e77dd5e79eead387a448ae4fa08c9e82c52f9a5cdfded230adf00173b70f357b9f5092154f729a7e7c9f15d89844980d6a80446170f091648aa4fe1237d49a44489177cd244155a85faddd2a201af5c6204aa13120d06bc6c49804b9893209721d67722f8b901fd9be88e278b882f8746f3558c932f2a017cb752afe59887f66b0379c8e6663cd8a8285f8ede96a5cc21e585bf0869727ebe165b71b539845731809302fc771d02588a8e8930e687c1aedad3a1dd17ca733eb7681ece846197c3e2bc07230dfc8b4a4a80c6fa56a6870e281f8a1467c331fc8aaa3de782397c8de74d41b0738cea6d1d406d7767be75a6c980b31ea73d80357d094199e9f5c0dcfbbdd78323ab7836f2862da7a0917a3f3313883bde1d9c94b53ea4cec3e53e4197c393a1b83b770af071ec1def0d1896ded91b8cc47cf9225988e1e8d9365dce944e77b103eea742ef428a78c2e8ac139e0b4183c92911d07679b18bc3d8dde8a614c643d51f2591c0faea51de4db4e478cc0246f2eac2e50a7135ddfde460b3889e3cda567e9f8ab1be1e5c9af726a6f52381d5d8e136f89d9e2af610fbc8191602ec5b4eb9aaf4fde0c5f77bb71ea871f5c8e5e8f93b9a56879f5a4fc9fe0a4cc0ac947eef5c00c13cc10c7b534d8bd0bcbf82bfd9e17ce5e87942fbf323b0319f5ce2b307bea7e0a3644f99a106c8fbe6db4a5d9d4a15201ca57523e8a6044aca9e5637a9dac5fa2eb83725246ba2411d749a6ce952cfd281dd9ee67800af80ad80329ec698d3e56a3c7c746b9520dfc93b425f593550e201a5a923987ff2ca215c8241d21f1b0e8c2b971d90fa8d67b559ad3969cd18d4488bdeec5da508895957d146a9c1dbc682d41cb65be8e0860a36c9c98f3317211928998dfbf7d03fefc6ff73265f7f968df9add3347ac376897eb455a22121898b43b4bc4ba9bbf58a3e6ca2f809fa21427ff2eece35356b42e704666ad095e329c228e2749eb5d81fdc294b43252708ca47c20ec5ebb15118bf1bb87c046923e8a8de656664d268792f765db2cf0cddce02b75f937e2349cc29b19e64f28e18187972afbfebee874a2f7d22e3cbacac8845e258f56938ceaaab7b73af10a5f7cccb89f15c7e0bd0aaa52e906c737ef0b887da7293cadbbef39862b35729194e2e9344b33e9acd23ba730ec0df1c98f436cc2c5fb05b552857450e87156a922296ffdd002fa18e4d65b3f74f2d3532c4f2e92ba36b2d4501996565b210add2c70cb282f19610a8ff58abe8a58c2004b6680251746b5fc2aca1206b2640632915840c9b5159f1857fcdbeb17b1e0eff65d72f2fdc378a8e10f1021d8031d1051dea1686c23319da528472c2aecc0c38a7d57b1585dd4544c3dcc228dd93a9c701331ab849346786514fa840192cc00492e2a1d1fed57f1116f78faf5a488a7db49512d0d92fae06f70b1a4a4c06fd74b1cb5e59bed85d4606feb4094652295351329889322cf521cf5e22196b1c4f5868a8c5325b9ed9e228e2252f6daa174843585a89cc0240d4f602bd3fe05b10525595a1c8b03390c87e4df7c7a437ef2a38c475cd973233e3601f1f938087bbe019f31a33ed5d969138fb05a0b32de65a9c119e68f78ad0a374eaee5c56c2d35b83e1beedd6fd88587502b5c7093e545961cfd70d4fbf1610ca4e707e9676bf23b16ab2442a3fe18240f7ef8e1bbdef13eab2f71e44a64f5258e5d09525fe2c118907db6df4f7a3f1e3d7cf0437da18763c0f6b33b0a7d3706c971ffe1f18f47fbd1f17eb69f1df4e3fa92df8b3eef6aee8731481e3ef8eee8fb07fb11d927076c9fc9603262565e30699b4552fc17cfcf0f3f7c7774f47de3fcf493ded1f1f1d10f5b26c816699e215ba4798a921f1efed0fbe1bb7dd2d4d343578635752526e8fb07c7fda387727692a307df7fdf6bc0fef77e9f0ded89197a70f463efc1716986d064f2653b5b0ae0caa9a54d69e138fba52c4871b6f34372f2a3f2f856e9868c2b43c1e512e238093a95cffb5f36a6d292c2a59673cc965f3a0e517707e0f1a755688a540fbdb8f3d68e40d5af991823dce80fad94637b105e792607cdc45fe3c7cc2a15dc194dd3937395470818ec0dd9c98f52f9968cd8d8d75500bc2ba86f884f1dffb6a95325b41f8d7ddb832f82c3c4d92d4381eb8e5c2058efc7a8c88add48e2908f7a63a80f20c047fd31b4a70de0a323f799013e3a769f04f0d1833134c45b9024c0470fbd1426ab7c378695e300f0d1f7415551f08731ac107a3142b62bafb525ae144b4156482dc2d78c5e6c7505b74b5029c9472e950e8b4eca3c77a54ee9b131b4545d6735b1a5c4f8b35dc7ef23aa34fe2cad86a6bf13137e7b0d98d836b6a07ac3d8d037181b4a4be1c8fe0b06a6e4b04abcfa0614fa87bb90a669e9259e6386a9d674d601905510e8befac26b7c869730e97df7403fcec8b2bf6a9df120cda806a9908f91097e69722bfa7d7b7dbfc09b9a26df949a3c8ac3dcc626d5833bbc918ae903b2ca7330a597ea871aa0fa4d30623adbfcf84ce942fd526397bf37ee1698a756df00ad38954f66d011dfdb5ba3c22032de660b0c7584539a4ffc4f9ca365818324b6528138f6fa9b704da6c18d4605106c8a77a6863ecca632b077ba2a9ccebe0c0b4e2f75c2a5f854c8506a54f2e7beb70844018121a5048a11d371c55503ea53a0cbaab98b048535f352acbee21b1eda0a0015745c591cd8c0e37530001e46caf5c3e4863172cd5af5fa557772c0e4915389d66962142268ea1e1e010ad1beeaf250c30c0aa812d48d9c2312ad92a7cf7e3e7af3e8e9be1cc77ef2303e54d00c8b34c1b9f4945e8cfa47637880002d252140e041b16f86dda580c1e03373e57b637864e089d8817c13b6993f8c61c4ba24d639c16eab8e56c7cd0efa3e08fb3ef8167dbf69ec7b53430f64186c73aaf931bf2de31a1569edb6dfa1264d6bc40379b099e436f5b9bfd2e68dea94a8969849b33d92e2d3a7622f7a097142e895098b69f67cd8e8dd04a0b70105a7cb0a5c33cc9fb96aa617473740892eedf5e57dd5ab532316352d3fc53947a64d0f3ad984ccacba96956f9761a79dce9e0f551c30e052c12006ae9a29a549d897a27b8861a4230a6b9cc7877d7c5c9a85cad0ba106f3cae563d39aa53f30accd58f6bb0342913fdc31da85371a07e68f08a2d2558bf6605c70433abeb26a55cb024f35299339459ce5c666836e4679411bf8cc82638e5515076820b9e11ad722e73a6da66539c660aae6c81e54c9a15779ee634fd2847957b02e085125c6f1b971e4fae87672276dbf1995f5f38321d0279b9e2511cbb65bdccd1daae73257cf48637c17c45ec6eca295ddab2e243ed092ff71999d8d3591993e9afc98a295b6023de9532cd1cad2f50faf18de03474b359f13a476b7ff3cd914c1205c5ec329adb18e7caec5e862669e3c5921bffe8e7725be0c923dbfff912ad0a3f41cd640147e3cd7467197023eb3a4d81c16e233d4019d9008617f4126bb5d66a493f30f3d4580bbbb99c6445b0505591606d56ca342fe62f5cf886af9e61de380eaf8e7cdb2917c45b467cfa170c58fb32ad6df3ce41e32674d541b35bd3127b2f51c131fb9de6ab2da788e854fea3a2480964d6d7c34d150bcc9537e447f2ac8c42ba62949ce4319af4fa063e2fa8b6e202829e3ed487df362c841f54d9e3a44d9786c4014dc1564b7b7a397aea51d3ca59eaf32bce46699582790a96690c26a97d0238e8c7ea51fa7fac0950344fa505b5b641fa977117d384966e08d9d0ab2af5e1107b2395ee7f1733a491bc4a936ba9c866cb7ed856761d96fd635bd9cfaaec94b22bc426cd204c2c08ba683304130b812eda0cc0c402b05a36f74d4cd7ab6573afc474ba5a36f7476477cab9907478fe5ae348a158e24e2045bb437fc5324c94959842801c9a045ac024ba24c967c9c42ebe9eec2f24d97fb5e277d2fd02f3dfe8049fc903ab71d3d61d75fdea518704bb209a6bfb791ec32029905574c4fc259e64e899ba697c1b1016a2c52a08350c49b56fa340d908e91967182dbe21a0aac1ddc1f501d806ad7237d608a266a770152afdca1bb2619d8ee58a6c27e2a31c5aa72498eec560cf2a925bf64996dceb9bf42ab6f405c863951ae91fae23e20a5d0a031a535e047d3d740f0d802bfed1f28a3a41f190214ba9b30437e9b3968027946032c13a992a8faec945462686a9d637a2d2d84a4c60d7e35043fe34ae70a1bd70c5e82f712009d638f2d8e4d8e6bdf618dba8c2ea96d7d3a64e83485e0906721db5e4efd61c152d425ba6a556aae631696beab8a515d54056b450ce309aac6523199989ba4022c5a75e772d1cf33604cb6bcef0aa0ecf4a076581aea3a6c575509ea95ebc5fc1983f0589b8c71b4640279955e12e2efe3542951d7e35962b1284dd10d5aabf807ce968bed560f4f22b8dc7bf1b792ee27cf06a58e062d41bc79e8e551f7058d3d2109f70a7b461aae203a93454d3281e6b751f9350d366a5b23d90a3d8b00d4dc0fb45c317417747b83f7eeaef2c5f8fa2a67677c552b9fe76446d2b5d51aa51d7bb62fb45b0f06e82b51655f8f656bfb3d6d0167d2bf4c08ac38b7c99fbd157be305b82a02877f954f50839c425f32c831345e6b7d0bf6ae9caf5cbeb67a78bd8ac0a70885dd5d60ef7713751513cea8defb8989bb3cc54c1a7233c1e8cc6b1ace79f70654cee4c1303f90fae9bf510a37ef97abc560f8dadd8fd066474d6848b10913e601ba019978a34daa7f3b2e95f6978e218fd0cd888e0d35abf90f71913d8ebebbd23d82e39db2118f79c65c9f535cc6ee44f6fc81e7ebb535bc17f16be4b9416bae3443d42f1ab623bb756123c2a765bf5fed29cbf568ea345f0332370bf3422f8b549b9ae88e02fa4ac7a91d6e84b2c1121b82c29911781d732270acac93f1999bda4139cc3f62f6fde3e6f07f9e1098332e229079f6be560754522285f17d2fd46d8ed239d613a360593e9949f659fb153cbe6a77c70d47bf08367c82ee3cad9685151a901863fad3049d78f3322831fc600fba76008bca9e60de0caea7cab5b5026ad3fcc39251780849028e56f90413f569489bcc2b5a5baf360d31ee809382f72cc96be11b83209d0ae902e28cddb834c59b3005b07e738e5159f452a53b4b7f1ee6ccaa95ef460dfdc8bce17998eb8f206cf324a203316a68b958ab4f65e3a16334ceeaac02a9ea4798fc353cc30494deae6625721cca2596fe46207298c5a70728bbec1d3a7da85c8f6d2025a53526ed5da9af8aeaa3e797843f39c4ea7cf917a35d8debb5f56f55f5fbb0102bfb00f83814beeca3b6098f86515f3545fbb1e86a0ba0fc34b74bde31c2c5c492dfcaea959dfbb573560ff9ccfbe2781a2a2b1d0a8b69452825f885f8fc82cb782362ff3d58a9b4c5e9ff933ca08243b09d7b369b4bb7cdd93fd54cfe1db5b774a7b9221f95d2f439fa5e03205eb3406d74e865e2342bf4c03c9be1aadd29129c9d5cbaf9465b9ba790cb8a7807d9626d7d2b27f0701fb2c4dd661d96679f34c8a8a4559ea44c9cd605c5b30bce2cd905c5b48bce2cdc05c2b60eaa4df72fc7260b37ae9b7844cf6275a893755bd8df3406f43dc0ecc91f71485aa09fe96b007e40cf3c76b8e834a913d5c6377ce2abb8b4bccd0cc956eb0eb30b7e2323451acfdfc73dfcf3fee423e2263ab477b6872ab83bd0a068b527d626d89a5a7c596fa6cb4e735c820de675d664d104a479f35f476e3a2b037a47b10b261b74b6332caba740cc9888e87087267e05e407e18a12ee4fa3e5f3e6c230232d003056046f1a77ceaa20d901bb54995cd0da23c46bccfbbdc84002cb76b86aa5918fb585773ea67277de357e0789f378e83010afa0719e0f1c620a9801ca49077f9b0d883301d76bb459c4d23322ac67b329c44978fe31b69ba29b78868457bc0d96c40812eb10a4a80f2335eba88a9b5e50fc12c333d7e52460f83c7fb6428f93dd519179d39eff70420c886d91e8468d8ed66311f6563c847ac9bfd7f643c6c40ce06305c70caee02f4783f8466e843eec6ef0f00c71ba059bb1a3f19f248613fc1e461ec451d19a23d08b361b78b623ce25d34867844ba682c5aaa1831287bb6eb44e63ccf119789eaffcaacf4bcb68ee8dcf5d93f60c06c864c6e06b3f0bb7488478500a118efa3ae80848ef7d9c65c605e6acd5b3c7b76bd8cdaa33fff1cfdf9e7f8cf3f93c19f7f1e8edba03d6bc7e02c85edd1ffb6bbed20b79d30bccc518aa3f69f7f266dd06ec7ddf6b80d9ea5f0308a4e07ef9f74477f1e0ec6f17e7c68aea2b6c6fb276dd01efd6fa9bb18bc1595df3f79f5b41b9fd6d57af5b40dced2183c12e54e077f26d1fb27dd58fc1a454937fe731c9fd657acefeed7141ed6b5b17b0baf4304fe6fbbfb2cedbe4dbb8fd2eeaf69b7fdb7760cdea470d4761ec0edcfa20dda1794e0a23d7697c42769e09d1d92dbdb57a90e39c150faf137b4c091a5645c5e5ca5e354c33d9deb052dfd50ae2e8a946517f85c6e3477877a15dea19632f2ac61b0588127ca214e7ddfaa1ca1130c5fa5c9342393dfe8c4de9b5d7d5944d489adae31a354bed7fabece9e5a556fe9d57595180704efdebd786aee9fe7ca816101cbd6f1d23653716e88cd562ad89586f0897266a66a9ec39e32be86371b8d3d1dd1ebf15af404f1d033f60104dae6ccc9c805bd1c76bb3cc6239b39e263ed75df50e565e00feedce1c34bb4735449796160923370b3193a1d0a6da2cb112fe08dc6c740f0172d4e39ca1d3fc12cbaccb12d38855646de15b8c475c89a07ac8cab8daa61807a8d9971f8ecf561722d6fe0e6f4b7707d8993ca3dd89ea779b634cbed3ca729cadf50cac57293f1899dc3089e70b1ee0a90593709da525b491664f8db1bac826f4b39d4d1835e0fa8846764223f37a0803d79f865f2f0d3c173d8a818eb4bf00bc2315bd21c111e494dac21123433059255e772a2e8c6ac195bf6cce6814a5e0191997fed8bf3b199f2007c8d10817c19afdc7b9c3abf583fc9b3e593da3cc1d44bd33c0f763fff4a9e8df599521e7874d4ebdb19a04b253738e8fb7a7e52153554c934f206dbbd512f3cc7d3a9f2d6ffb69ca540a9167c1fa433bcc45cb2e005ec1f1a4546f9b667f50f9471c5c4be1da7395a2cdfcf31799e91ac987b253f6346cf72bac48fb8d62fee55329e11d1925bb32f9cbdc4b9a05376b96624e32ff182b2f54b65656e89926077d5d4f4b6e2c875f2597662044a2ef050a7532b5f7e47b229658b41ebed7a895b4bc4d00273cc5414b9564ec90cb316c178a29c5d6247b446fd71ec49c47c82fbd16e4e94f9775eeb7561818bf96bcc1e71ceb28b15c762677a63789e3ace45cd1d5acb557d819d0333650c416e6f8d5e286290dddedaa9d57e8abd55290d68643bbfd993042d0a78f31217f3c1cd46ba311ddcf039c3c59ce693417f037e7df554e428e747a53ce5797c70b3d9982b8bd2d7d6ce71335c445e37e0c6f93c9744b5e69e5637436fd03a957a8303353d45e2da91e2f30b8c498b61821678d2e234285588499340a84fc196393c3f4e039f712e3ec001b73f5de977deac485f5cda224906d6e2c6ff71a783c574099023b104d4f301f30250792e905508bdac1c42ef5d1a6523245d1e83bd9e07f0bfd33a598ff68a1df8f1d0db7439cf4241b2d93a73cc91cb21a744e7b8be7eb96f5fa536bdded6b53d85d7dc27e53bbdbc2b942eb9f63e1119271b152ead7cd05af9b1394cc5b53b08beefee4aa20ff5b451d377c960d6b6673bd8064406898daea3cf49a64c6b8bb073d16abd84a1d42bdfa157e21cf6f9ac151f6b1c6ec08afc3fea507514d518e1bc4ac1cd1329c413c4e4490a14cbd024dd942100b3c2c657548d497064ccb35769625bd355072a5d7f892b37c978f619ffa6b9e7da277d7b3139fcb3389c81f6793bb6492f5371173301f10ce35e23bb789d26f81aa7dabde91e8ff99cd12be9af48f9e36cbf0e999741eb092284f2966cbac56ddbad76179b357f63d8fe011f1d8d81e244f5f7b1f996a7e6808f1e8c8161907491872ec514fa6ebc010c127b9fe874dcef2447856aedd5346a27edd0532beb740efae2aff519e32a3a574facdb8f87b2dc9b34c9745b59dce944ae787dcd1e603120891b23cc64484871ac410849e20feef6b65749337e07efc67c8a48cba1de6fa335657451990c1769d5dcd04a14434ef9ed6dbb0d21147f13fde3a0affe7268426a98df3250a05981cac964f111e79853e239cbd129528e49097ebc3657567f62887518b891ed585ffcfada5be783a12920a972f0299acf54e00f09be8e3feaf97fcc864a5ac2a2ccf5a77c67eb1268e3594f6cc4adc3074df6601b0b8ad6900dffbc383734fc7c45d025ca72c1c7fa644d4a99ee2aa2978260050737eab565d003cf08cf18568e16fa40fed55ac18323f00b2a9e33ba78ab1d311c6fc0ef981519256249ddfc46091ef4c06f2ecae2a00fbc07113fe368037ec69c63f678edc3310ad79420a6d08a0794c694bf54c71bb0f5d8d2ae982766f5ebd86f35a7131ef16e770cc521556ed301516e2e0448528d4aedda8abe8b897833066755543c22130fb7a3514dabea6c520ba5063750005e0bce2e1541a564297ce6b76c7951bb4844276330fa46332ca616aa69fe66abc66b73785f7cfd459dde03953bafe9e695b473ed2f5b4e5fd3fcd72222744713efb6afc33adf66d07737ba65a86370f7e50298a7bc1dee05956a7770f41e732d4838e0b024d50504728fe111f78b806680cc4b90332e3905a983ea8b8b037930e0beb0b89465a5cdb83472cdf2d71daee158ad8e4e4d41a518404c940d333605b956162226ac8595dc0f04f7e40532f31d7786511ab49ca08e9396fc9c988016a73644684baadc4db08bdf304797b8856c8144e97a299edd81e0a2cf7f43605ca3062c9bd2085fd1920e172d983a3e5aa9bd20c6867c04d128b51ce5d78f42b6db884fcba8fa80da44597718bc343bd6932a2f607844c786e344f10d8254bf9b865a608169d1888cbfc1c8dcfe6bd1a91a9e7547e08f6744c69b30724568e834425f02cd5bb6cec84c62388047ee190190471e5a172be996b70c1ec00a4034de6cd45ba50ce4eb036b45f572f73ae62a117c6bf524f5b5cbb14fb74f6b5af038db4ab8bf325dee74a26a0bf56cb2ba03e7aab4c71c268a5d0f86a79e8fdb0bca9673a580fa824cf31526292eda522877a376840db3f80df6755d67ad0b9ca25581ebb789e9dd273b0ea6242b940ac2cf06c812d089ecd28a92bf0971fa8a4194a0b183121b5d6d727bdc340ec1855e2c9183bb6b7804434cbf251836844205736a9cff1568d3a0dc0367a6c6763ce9528db8d9d4ec27ff9e0b6ab930a823b904ac08cc94ce971fd6dd306b9d8e1fd95eddf74ea39abec34b7553eff1200c6b5ec4b58d79d7f7e6962a1733c886359c50cd057d948feb58a1bbeeafa37c3c4ac77e8c10c7a00def7b4828454b2bb26a4d2953d2aa41abdd5d75db49bbcbba6d7550f0d6152ac8df796b4a57449c1538de846698f7ec55aeeba047cdcff279539fb58267c785ba27ab663e54c624b88b079585ee233a9215067ebe0501541a0ecb99dc4a6f4f4b3ea8eb24d783bd5ee8aab62a87d7fa06805b11bb51fe6a7af008942f8c869c529e307a71beee04a065897f01a9e92a35ee6f72d803abaae646be07e16ad8ede6b10edfe09e49f33158c2b98a243c816cb4f4781008e124be9940deed0291032700ebe00e4e696d0a7b60018be1740fc2c5b0db9dc674341d3b97f7afd2680eb2d1740cd0683a362681d9349a9c886b05c4a3c958d992c08303022e211ecdc64336bad46a2513204ac04b05c10c886c3897dd57bb96c35b430101b886ebd16c0c2ee05af420fe81d7ced3ea45a7135dc03a0081a8062ff4b6139def4198ba488cc106ac5d2eada7d954da2370cd0916adab8ccf5b7c8e5b85e059c594b72698e35406687892634464ae5484285a94b518560f2dad355db15646a60c29c38415c3adabb97c53cd29124ba155a49888b35cab6f96f57eac7ba0dd1670edaa25b5abb6fc7817eaa9f400ad2e45b4072195ca815a45cf2d451d274a2ec51c92511ab2c379a793ff04b909532216e51ce2d16a3c24a3b95e2c3910141fce81a80d574064c3c20b28db0313980d977b104e86ddeed20491156b0b2ce074b41a83199c8ef2f150fc03174024c1d966538f5a2e48a59cb4ff17c4c1a219d9476940610f14553453718a3b4dc8d443331d831ca60acd2eda8b45f34ab02813710bc42d91095627c4900db14197108fe663308178b48607075cecd5a546bf46f812b0d14427cd8128ae28075d4665ba81ca9b7706a36b2876632c7ab984d7a3f578782d27015c8b962ec1b56a69e38ee7f5908d2207511c8213f6ddd0eff5d0f6bb1acb5e5d3f8ddbcae91736ab7bd76bb60106c9088f2b531bbeded9c7167135d4f219ef98a035c744515a736247e9a592d7afb995a79195c643e6d696801032801431c7b109ed23a317ca5f2b379f739883a5ed6c38df837039ec76e70a1913588ce6e3e14acca026ba13a971639e91566227d5e233749a5a8f4d02f9088f4b2f6cbefb258db1ac0663a8bcbba88d3776d0177b6b44c7433ec2233a1e4302d0888c612190221d2c64e233139b2ad3294ca43091c2ec022a731dbf055c47e88c25d4e850aa83c9394a797689387ea40a71ebeaafea3ea2aefa04373620386ecca358aa91d7eafd688e71ab2e9aaff9b5ab469d00fcb93cc2a2587ebc476c29bf36202bde2887934df068008c134b055ea763ad96acfa59a7a35fa34b80681b7083a1ac7824d5f27cfc0830cec46659e5a155751d8aeb1b90dd3d6a3610f61053b210de1239539b3eebd9738a83dcb5f02c54336cec5f6b27e206ed441fd5a7d8680cf913a7fc9636f5561a6ca9f90d98a2097e41b66047635ff786a5d598aaf66ab50dabe57a7dd08b372065b4289ea3091617d88a0e8bbc9beba6ad9eb782507c96284a9a674bebdf473a2e2e2521981d3240213bcc8652696e19f501b22f22328182be4704d5ec59202bc1493dfd9760244a8151abcfd8b96978d6a8eac60e439f89d8fadbd9a6456b963d471ff163671ae8eb12e338ae59905641b671f69ce66865593aed5a6fd79ff606d82d4c8f88ccb677dbb4386d5165d7a9e77307706b16c6613d64c59aa4ef333edfda28c4f24f599d16bbdfb56dcf51be65bf8b55d7345ed093163fa24c65e5f94b5f4ebd64f6257ce604ad53ca364c8acd1b6a6a8c3a9d0841969ce7984c6a164fbc4dd35b07322d204aac52b03161143c0f4a0ab458e658def96d041fe9293b03c5a83f86599780547ce3430a5291c20fa977a06a7c36eda13aa81ab7d15dcaeaf7d94933cc5f8ae2db4f2359ee499e35f30562916ad371da4cafad71827e9434a0324af9069c571cdc7b0ab8fec9e1074ff44ebca1d614538f018abf8df04116ef13a99674d2d32a639a0f1ed6b31290eca30ddfd7ad2b98ec923621cd69255b90f4224855879256072c7eea59ade0d45ecb9c818361a72b060e60057b600e53c309aff6209c0fbbdd559c8e56e3045fa27c85388e680c7291e06c4623060adf6552192c8bf19a33dd04e9a9605e9fe18a94076ab9d573c0cd87b3bf7200e378d41b0ff93e6400ff446a36dea83fb6ae573c0e0148156b936319c77eec828336301fc02db2fa53c31bb5cf06da513baa13e823d76d5e7fec7cbf32eedd866ca9b01c333f0d38e7dea07c5cc40de3f74eb9120a9aee455cfa53b4629a9011619e7344b3092d8b0e103c3aea1d89293226c6c61595d484cc4ef900753a7d08a37e278b4fc9011f486c1d1df594eefc8d2a67c99de3fecd7d401cff6a73447b3d20fed78fe3211e483af19340382443fb0414f1935e6cf4b3a43b78f512d2c21b0e7bda44b96cfa528b6ab7d6bc4b0a0fa8ee242b9688a7f3679798f0e8465cc806eda96eb40d9044b66c0d4c8c8387013ee99d1ef407fd4dec5eae2c12f04fb0771a650d83b7de8a3cbe1d20e355cc2f5c5b72af270a0381b4db5b81276d142dfd214e734a59c40f493ce40790ec5390694f89e8a288a83933cb8d1e6492de9dc05efc85b885f8a79eb51cf87658fea977da1f1cf437b15d1b02c7f6591c9ff48615aca5602f0528a0a2fe04f4c15e1f20633eea566a763fd045c5106c91a2422f50b32a5afe0a16e799db4556fbf780bb98fbc083742bfb5563833724a7114b3c4b4078f4a0d70726e91999c88478502a85d5dc96edc54e4561693d28fe390adae1952acfc8a454419a8d0757b02fe127ab07d43d79c7eafdc544c0af671c8b06c6911ac6b137861c50c53f62c5486adf2b9b18bcd8d5e75073c8d7172990722825436808cf56e5ca043b2663b629c25f67348a6b18152a52039ea680440986d39250ecf15af4f7884ca4524b0ed35161ec74a014cd4739bcd900910c7327145cc19ee47f32c9ff6829321badd4a313116d4d601e3c3aed4138899194dbda6d6f73a2091459717ca357c2c4371eed74a26e77527206654c1527931744cac0b01e7f34010558c6f130a584676485374a2ccd3b1d5e4596e0d48cab04273d1c76bbd144f9394ba357a999600296601a83792297d1dbf5523e1c83b97dae3ccb3ee3288ee37bc20a145e365440c370b1cab5ab6838d11e1b361b50121556fceb691a124aab70acd4001556b18f551bf1a569e52971bbb42e52eb4f7e9abdad8864f1581af38e8c170b6f954718483baf8f845e1195249d9a569161cb13dfc14756bbb6cbb67be567a76c84c6c31e84ce9758b7eb38184c2606f3450c8aa4e206248af5639b2c6b9128d05f16b5d63a04adc3bf33bfaf1b10813da96b6aac3fb4df1762ef5602b73d080f0e323ba44e27ca923ae720ee76adef9c66b4991d97c909c6563105aea80898f97696fdc41f6861d9a2605d08da11129c4a7d6b3fde035b48936b28ad1c0bd536ab474761bd24f0b2c7010d70adc7016cc7b3cde3002e2363a3f48fe581dfd06cd9c9c0f6760d9236d20f73796c4d7dd414ddadbb1afc6d36729d04abbbe6d212509892e04410e093bab523685b991a6ce52bf49cd84b4fb0e60082d98887ea0e2846f0c6274483111e6b3e4fad33694f8d6b9c13f480680da2a17d95144c86dfd6b0ae9ad5e1a0e6956d13e0c69de1cc3ec3a1c4876844c6106fc0b97ae36fc44ef88c663043201f71e7cc5933116e6648080be02326591efdd6852bbe1b869624bba300d5a29f4234cac6528dc5c712486131f2fc4b831cd6e06d98d6e03207c5281fc314140ebc7a2712fa7d9b8688bce3841bcbcb9b01add3d18dc851e8b2c11498cdf89c324744cbf35429d4107ef96b8f8490d1306f5fb5b04499a4f5ee60db6115050bc19efde1f6ed76c5461cb1f110d7ad2a0cb2703501b9b4b30d289d455f00cec1411d405f0a4e953fdb4a85ea79e80cb2111f575e9f1d539d89d35b9c67a21cccf453332eed3964597c4b3f1a96d89d4fea126fc6911983c49aa0a85d9c4122d5062b2087e312db9a896d1d1296b4445842af2f29e0a3740c0b4b58cc06157b4b20435fa03ee27511d1b8ba05d958afd87b0d76cb9a359beceb17ed5740545ab68f9d9ad51741547f5b6e7ae2a8e10aac9781e6f3bfdb15e310e7aaafb12da5f89d4e141179597a4aa56aa0f44b7c7ca4544f8e625097d66f66e7de7817a0384ecefd517320ad60490c883715db065f0ece5b337a39415b67a80621de6435cd56c374dd31e441055dfd188843778bf0a02c3120666b573df29cfe4ca5b19ab65f2700c7030c94c71a71a33f5506e6036cd590c29b1e1234407204fe05deeaa3958ede92e94b6a0464e9b0cc1f8c7a63a0afa98a426a71b7ef77c05aa95b8e24578e7552f5529e011e049b08aea339289aef9e394080c520df007c9d153c23b3bf16db3ba039dc6802c79d4e05bbcab5987ada7c94e765a0c39d6fce515e7b8c8346172b253235dc7affab5ceb3c37983de902934b179878948d8d8a922c62b299cc2622dbb9030f4388d404e0c6fbe59721c7635558e3bad133efc1456c5f256097523e1c7bacaef68cf5bfb06f5d5312a590c947746cdef6220630c8008a379e6cde61366dc0ac353dd12e4d692ccd47a493d6089502a91498579e8e9c68bae7bbfd1b9a8b57789b1d721339c6648cf8d854f7f7911e148eef7e5a564fc85a7b367caadec2d6358b96244345c6651333e724340baf195a71b6596156aafdc97e2aca73a9b1734b83037b15f23cc3b4ead9aeeeda22335641d91c70719359597e68b7fb451a6face62e196f2c7ac389f02ee15a7057834ee785b0959196bd5248a748016de19ebf26f706584159563f069bab36c056d632b8ac4b634e6b9e2a60741ae562e68aed72affa8b4f113b9c6da3ebf2fd2ba0ff327b681e909bd140b6a281c4d203d367df724506bf87d55d24ceb3cfa9135dc866a5af3b55e5d4250cca79511c6fc0c75d9f2b50d6f85ef1310559f182285f6c13c9a9e4185de2896651f67a20a5cb759d3692dfaa0c0e5f1316a4e2880f5792eceb4b3882e761ec78ccebdc0230b496bee8ad0381e78c2e9e48c77ce5e29d0e4fb2e2356632fcbee0f464311d3d4a3444e53a4b742bca3cd67a550f5c1e18b55bb44eec63a78223b906385983e4619cac880ece1ff138295617e58ee28450b640b97c48085c0af278a0c17dc5f89cce185aceb3740bbcb6df884baf855d9e4c118b0ff5e781fa0c416a1a82098dcb1922c594b2858d8a508b030772ad758de75cf01d2956cb25651c4f5aaa564bae9c76bc01f209abc0a936846eb88c93dbdb91659694b740b1d618e031604941198f1ea7316095f69a1e6355833264118430b476c4f68977abd3c4a4d295b518ca94252a224a353f69c780f92c927cd3d3875776828699f24c888d344a0e6c68bdd57ae3ab6c967f6fdd2c0d3e06b17361c87d0f832616852434d5d35f5efcd4dc3b3a124b026054a69b2846d0bbfee180c0e25f1f10acfe6a7016e8233e43d3e6b020f3cc0595ece383ef80faca48247fbc7e7120534d615fb5556cf8dfb118c8f1d6886792ba308e8b0c912794b24961b71e4e3efb242828b4cb6c2826f413e311dec75dbecfbb649fc49eb6892ca6b7bfc24fcfe1ae170ffc1ca532c211398a3030279645104a6911ad949648c40fbde6c1411ff4e3386ea0c9bf7cc532538071e3b0f23fb1c8aaab2a59433177ffbdeb80d8004b5b26766dcc06b44bfc9f9547f7b9f3c9febb1f326b9191d0bfa82c1cf50f7ba07fd8b381d4af4357a3aad0812825fe894bee457fbfe3b8f647ba90e1f2976b1b407981aef5d496f6a4768b5bb9f7085af06cb1e46bcf1c4df93c77fe314f88bbf4e0eb25125773d95e24f8d0ea0d4bce1726325ccfe42cfb5c1f00e4e7d4409a2c5639cf96f95a5c42118b9287a144c21ba53cfe4979b0384ed06412d9c0ff7fd1567070889f1520c4cfd823b112ad4d3456b4750dedcfb573742d1a3439e83a59c30393b50159b1bd5151f5c4b5af652eb21997bc561ad17282eac61ac4beae3bb21fd3eba3412bb18d44714b395f5107f5558be14fab8ce18974432d97bb8df9acd7da29362c523cc062f214add06e981719b1b8a85b1d7200a585f525e02bd593af04be585d84c0a36b6046116f40b061b62e2d71befafb589cbed82c28d38cea6a6b3b628bf8ed88ad51694721736b3b6832d1283f2835a7936da329251c65a4681ae39ea0e9c1bac4c9f54f6ec98a6f7f81ca6f97bf8e5d178fe9f556a0af4f20563f3a1dac3784db4cd7fab14ff6624aae4dc9b557526d92d7462fae9e06bb0be79d4bcdb6b46dbd71bbdee40213583b702313b7103b103f1d443859bb84b55f3048f7ef070d98dc8b700d19d1282d4d5999ae9872e5a913dc5179697c01165d3b3be2d09c0d9a3dab501619835a5ed7dfd2c6ed698ea92dede81da7cfcbc8c7f2f60d2f3678e9289144c03f4956649bbd95a51be56654d3ae197909cdcb12e09a2dbf85747c5aa1bc3eaab4acacf22d7e62b3ad82748176cd5cbd37e1513f55c2a3fecbe7b2a48d4b95cfba32c6b7932a7b75e59cc37f9051163e38898a1d9ef23ee76c47c904335fb8b4293166ffba076326610e59334c2625d6ec2f6253fcbed54719022c7e7a56545fc10bfc9a117c7c3f66e02a06d5235fc269c1ac3ff42752a7fc6ba0942dec0861f95cc7d68b8f44a9231e679f9af83135138ec89c7d5a218627b63daf915d9bf0eba22f25a8061d68074a7a65a20c4ad4559975cd7b079849735ae0824b9aaa496bd349fa3ef5118d7d0c834fe95d93a04d993ea5c984f2e8531a03663edea7f121b1d7884e2762d05cd499b49c96e2ad1a48b7e9af6c1b98127bd7bdf46f9b829a16b7cd09a99913529913563327f23d4c89621fdc413afca201f9aacbd87e2ea806fd1340c123ce06d1a29f2317f526061f6a84f15afcfec197be7f089e061ca9841fd2302f2b5e2c167892218edf482aaf9d44ee29fdd63f2ac7cf3ff4f1533d3572df4380fca8c68e8ddc09c3b2ebd095a49ff368c5a9f1f6ab553b529a5306f9d0f99716904d386070d403e6bfbef7d7fc3ef03fc42ff7fba00ffa63a0c4a4fd6176727c34ccba5d808ccf7c0ab3c3e3a37d2ddadb3f02054441c250ab5bca849416118d817ee925e2771fd89cc2cb2962d08f3752166e9f28a2b6717fd8962a2e84470c1cc76a23ab79f8984537533a1b089c50825fa2e5124f067bfd8db6544a295154fa531611909aa0e466bd8b6c9da65f60e3cd3f765c51ff685a51ff48c3bc49562c69113c45d9ce9d47435dcabe49884cebfdd6666ec2a615d095961bd79aa7a2ad0b99c3e2b4266dd0c7c78043ac269723e59b4317426496630fcb4991a25cdd7539e000c7e08fb4e951c7b5a26857dd03876832a7f4e3231efd91c6ce43ab5bfaa7358892190a085b4e9b08d615b46c9206479557b1f3fec7709cffd4911ac1dff40fb7f7711e2a9bba8cc88aae46e3a17e567a4c890c41a27d0179f1ea7a4376c26dc008eb09bedb8d5569ada040008e5cb1111bc75eb80e41637d122076f168acc3de3dc63a7034a0eebb0f7ab18a71e7a2f81666a3a7908f8af1508671c484773ae6971d48a477ba241c3108bfb49f23943080921940c9854da309033499019a5cc4bb6e79502e2667ca96c92c59c82d59b8c48ce3eb27a25c31d8eb81095ef2f95b5c70412ce4c77b19e7ab4c3ad4ed478d75b0d7dbc4c34f7eb4330272f388e7c57a935e9f8d98fd5eb4dc5d3e781ec43ebccfe9a18e02a2633e4aa4d0888307e0280699a27f38bab9ca189e0a0644a0a3816a3ee1de5819c8c2e3c98365f773ca52569c3752d64fc153b95f3020ad380ff3b2e24cfbddfe05e74bcce05e2f2c50c1186c5096911368343a0c5196aa67b3fae5190fff9626d225eea5b8bd3bb7f401312b3d3cf68699db6a993b53f9281b0fa9dd6ab4b2d5fe995ab64d0e26c545f4b714d09072fe4f13c5fd672a9f6a31ffd7873f2224ca5d8b7fd6e29fcf31686c5d83f1259d74fb956e50171e890ddf84d152cc04b07bd0fd0de0cd6beb09f7d7166f5a5b3c0ff39a8eeda613bbeeb0e6d5b5e8b7d778a8ed729edde32823b93eca58aea93fc8cc2f7798214b7ffe43acac4fbf26e2fa386409a31c71fc214a1e1a16b32c92b9077503a1d28fecd5a81c5974fae706dcebc5da3087352e5b7dc4061ac5c7fb5992d2159163683cb93ee008c9d3cd72a522f58938f30298e2328f6ae78ce6ce770c86f8f6b62f23f6cbbfc49cf44194c2070fbe3ffef1e881b8fc96b3d9291bfcf0e383ef7f78f0834fb8f8e11140101f7240213e141cff680c52f18ff29adb0373784087f909e4c3bcdb05f32e44f14da10efb030a7a600ee4bf31d0897371d1a040fcd1ce159650aa1f9f92011b2e6dd0a414ac62b0eac263f015691be546513146c3c95dec462127a45c2c643752cb6e4c1bd98df2c11a30111330f526b1c85d747680ca13f99d98c8dbdb1f808c83fadd037da0fb13979d666e5e51251b9d2237aff2c0010548410e56600e966022a6722af85431e739ecd9a98c53981ff2fde8c8ed3d0aed952d8df731d02fe7e23a27bf270117a8bfc4ec173158c27e273fcd06084c55fa32616099ccc052708735693e40440224125c3373880ff021d9cf81b4973f61c395047a75c8b6003d2f013d2f8159075c0aa355b71f7feb76e56c2cccda5cdcb53627726d968b856b736ad7e6eccbd6e602cce20d6a3e4e834b306a3a4d511ee6355e82cd65a6376ebe0b7b65ea4e5974c729ebeebc5e4b8146ac77b8ee70fe3a4b550ebd1bfcac6656e221cb1b8e66905573668caec8e489eac50b5f28ad15e579322427cc8f60484ed8e1d129cb07593ee486f922204b18c89219c8928b78530946656fd624bffb8aee337f09c1336dc40f68cd12a95583fdd4ac064bf3c6d7894f3ba8b95ad4eb870a1bf004946751ab5ce8e3f46b9f5436312876bdcb144d3ba4500636a9e1cd72f3639597458cf3ff3867068267020efbb1cfabf10a9353215da3030e38e801f3ef81f873e0fe72d01b5bca95ed24db93837d9d232de1fb398bdc7dd54af85ca1184406dcf84e683df9e9d871684a5af56bb6b54757a8ccb5cd7724aaf3a62533cfc3bc26a2ea06dd4853bd2255925a1e6d632b5e913ac23cdf4e98d37b521f90ef50a14ea2b8cafdb7a13c07695e45832689795e2f6c2c2fa73bce8866fcd416377aa4cded371c227774535fab5acd1b7c394bc9753fc355ee741614cf6e08d644fd78cf1dc59ae64ebea24592c46e6a09c4a0ffddf7df7f7fd47f08eee04e0259e6cdc60930fbdf7dfff0e1514fca305d52bfffdd0f3dc1b0e9a407c7df7fff3006b95744761b6bffed8f71747cfcf0e18307c7b147700dbd5d2a7dcfa58c79ef38f6a57e42ad1379f284019ecc00177ca3739031c2e34e27127fe0681c03f14395377e2a0e8f0ffaf1661eb549bf0ddae4a80d680cc4e791f87c603f1f88cf63fb792c3efbe6732aea4e6d5df1ab3db575c5aff6d4d615bf640ddd543ffc3c0a9a921db9ba120cd7f2524351b8afa3e0eb38f87a60be56a2cfd5511ba4ea53f4b93ab69fa24f51447da66dd0e66d90db76d2b6b8e4891c097b2afa3409c732e1814d909849a7ae841c7d3a5525f86e52e872b11a29340898696eb585b5c506f6bf344d7cadac43324a1459d37a675bcb7cc591bea419e12fd112a226a9c222b890021adf2c25e58dd49767d0c2ac6fc4721881c27302db2cf2d322041770e764a52e9e8695558176f2e45afcb316ff7c8e37d35d99af69d3493acdc3bcadb7062b0efeffb9fb1bbeb671a6511cfe2a29674f8e4d14374e80761d043f4a69b7bba5ed16da7d61f3700b5b8975d5b1bdb61c1220dffdf9e9c5b6643b214077aff33ff77d6d8967a4d168248d46a39194bf692a0538f43809ad5da43b5851bcb219572434c134e03d9b020cbc40eec10a28d5a012c87aba84766df13f89e817081d3e503328f01d257d091e57e9e7f00af91c5ca19e8375e2129a95b4ad17c0b6ca52b3927ab78a1a2862e817605767b4908fab31aa80553225ffaec269afe4d40d2bd48b62439d7c09afd02f117a010c8e3775818b89762226af40f1d5ce0225e62dd29fb12c8df4bd172ff67edcebe5912f8cc81712527b4fb8c82ec4d67f1ff4c1000c400fec805db00bf6c01e78015e801d0eb1c12ee8833d30002f46b9d350bf6b6227df63f2e890b071cb8fe21ad2c119f2e819b256bffe81a57ed5742701bac140ab9681b9e9c65321b6852a36ae3db65e45f381d83cdacab7f2e610e7be3721c0ef2dbf7cc1d420a8fb1752b61caef99fae0628415de57ff2efa82ee46443212b4bed699c51fc2acac46da8b18f134dc6737d1b5348999bb49a9863be70cb63b8c80d8665ef3db41d2ad7979aef3a6f8f4a7fbb475cdd4679ad17a2adc6ce08b1915555076fd7f5daa42650f92091ac017a6c83d739177ca2957c56771910c8f74e7256a318b9842e1cab5fd9055fb761be344d7339db744a9ead9a9267818eab4ec9d8d46e34c5e5c37295f06fd1cd9c5631fe5b3e7fcab91544e10427adf2cdafadea524f68d2767b522c3445550c056b826793a03cdf91af7226018ff30ef90f545c8b548c1b547fd4955f34cbdfbc1e928bde0886d61c107e35aeb500e4a2cf7edc0072311841ca513b396a3747ede5a817ec0743bdcc513f16047b39ceb673a4dd2fb0839ca8bdc3d271ec6e4ed6de2bb02f0aeccb02fb634eb9dfcbb17d3ba7dcef17d881c026d51ddecd54cb52ef185acbc055d189c5a4a84d05d2f357e984f1a289cc261ec8bc14f9a3917cf33d041b046e2f361d538b55636a11e8b8078443cc87b4ece477770655a2b6a5152c7a315b15e5c7a38432775190cb47380feaf1d90fd8db379760be5a106f3541cc5709621ee8b84d04d12de729410b857458dc0a4fcd7d1b775f0a430b775f6a15666b256b77bb98db80f641d7ed6ba4c4c390eef70eedfc5a78e99b51b81137183c4488c290bc0ac06500ae6bfee5d3ca06a4e665d6e2e565c8bb0c2633ab166789eca9c8b0dd3642682b9084c75817062aa85cde67f5b743d579c2af2db7fadb44015e05edb6615c050ff6e9daf98c6e5c8acc7164f480b5cb4d35db947730f077457aa06bedf2ba685d5e3b9a61058a3ff82ab877fa2f33adb65c15f775e1462e42598fa97119d4a6eee662f2a0c77b8a51e260534ccbab2714e07be1fb0bc5a54b45d739531c7d52c262fb1af494ffc7fad7a808541cde1bfe473708ffbbc8cd356bafb0dbac3d2df4997d961b0cc9e3b646439098cbd30dbdf8a7ab74d169a0e3548957cd1d6c2d0eac1fd9ff898dc9bf33a62742f5d610361087f9dbc0d85aec77d7649022915b98d781bcc6e486ad59b135d72e47198a562def2ec0d6426ebde854d96c7c3427e9513809b0711d00cae6ec6a1d450782b50313ba06b1fadbb8a639acfeb63ad814252ba3c9e5dd133b0077a9c9d6f0655a552f6ac1d525915075d3315431ce1785bf2eaa91aad790f722583b351fac70ffe3c6506f15bfac76a26643e58f35760a78a64943ee8456d44a0e2ed540b5e447db30679bda3067ab86cb99d8273d09c079008e02f03e009f02d12be3e8dae8839726f81cc00bcbeeef02ab6fef026bb00bac9d9d3d60edf6d93f2ffb23701cc0ddcee77c0b037c0ce0ed000f9c1e18f47ab663b33f7da7cffeec3803f667d7d9617ff69c5df6e785b3b704afc574f13a051f02689c04b0df03e741dd23721298e0282826431e666dbc1780abc8b8f5f0988438756e43e724e08736c751324d9d5b1cce4e51ecdc8acba7e4c583fc598d3407da4b201ee72820e7c1120488129a792444410e7e662f8177ee638a72486f09a6247e175205104701664337071d054b40c238a327a11bf1db5725e2637031c083d11244195d835ecadd9c331f79387192cc30c1384113b6de92b0fff92b8c13ec92947b9ab147b269dc1a33f90d9b302464f01912eff3cfb03b68cd3e721e0aa539fc2b94326c096925fdd72d214b0545422ad1a902e505b7a4482fc29182ba8aa2a0a548b6964b88b706164256c09ce95cd2c3bfc2bfc21f6e4966984bf6f37f89ded03af9f0f5f4e8d3e5f91f9f4e2e8fbfbc3ab9fcf2f5aff07f91d00d320fb7f6ddec0a5f66b3cb048f0351ebcb5cae078c0c2f8399e1bc8686e044dcb822ca4773929aaddbbfc2bfa840ba51caf96f41f6d3e0694dc61d7dfebcf539f21232c970fa7f78c62e3fedd1e2c198240a59224e54c8b3688816acb54d6bbb2888e5fa8b765afc054e839105b5e4666bbb9592507293e760695bdb2d2fa26bb219b6d56b758bd24455a486bc224ce3a1e438bbc25fbe1aa26f802afb40361dcbcadb864f43534442434aae90640baa3da37558346fcb91f5cb010dcc72cec8b8653035cd0fb5e5d5c2eec0e8593dd33465dd65591c51a563dd8056cfea8156b75684351785c8ece5a4ce7b01474d82cb37099af0394b94b0c38bae21ad6472d5eac0628cf446ad6da5a7710e4ab2e32869196ca891166cd9c31669edb7c2618b743a5284a2e6a47500f3d128abfa17e58f950dc597d2815b508eb4d6b61861063165aa757c129dcf2eeb1edbf99028197e10915aee65832845573b8f449b9ce3390e0c3549debde85ff47fc055201e8872d61d5059b24509f7a3729f087151f01665694a50f82ac8922df03e30c1bb405c887923ffde5e0691c7fdaea9f32d00976ce9f93ef252e70dff984c51eabc0a96eaac5ebebf7f310294fd13b27f12f812f0cb63f78f83f2d40252e7e0c41c5279e2277f28ca7e8e86e460e730829f830bd27dd9d9e9da23a727967811ec31a35e844796a16e29b49f1ba86b9bc085ddf4791f04d0eeb0bf19bc7079c82afb8ffd9bff0d46c0afcfc076efa509e23afc45df045e43b4f69e09c6b0371cefef0dc779fda670fcbf07dbfde783ae0d26707cd03fec395d1bcce0c5144c400f4c3bfde703f5578719d7d32608fb3b1afadcaa9b01fbe5f6d80431ffca80dddf1e0b912de0c51814ff3f12a1cac602ec6d8fc5259ff37cd134bf6f37c5e78ba66ab26c56248841bf21c118b9e21ed5229dc757f95834d4dc04c9c14ebb9d74bbf2f135b58f61a58bd1a28785cba561822fb24ffe47fefd49fe7d1b40c3ee94776fed9ae6f33ef81a40fbf9db00fc16c00b6144c93d44f1d1d5bef2bd4b05577ef6c0db007c0db4cf6ef9fd35000c5464ae7cf3bccc7893e8fc7b547a4efee6cbdfff0410833f03e343a0ac8c7f5756c6b753347943028a13c7eef506604a42f57382439cb0a50589a7284eb9877d1163071f623eee59aa1f01b32510e540f9d3eef50700e7a61843141fcc9e154a24bf51d40629c5a14b8202b00421fc3930ca83e8a1a5e480cf306b379e0084ca1d19bc5e5fd470b1fff075a4382e7dce23878c9f027e2d824bd2344a985283cf6cc05749dc5188ad6be2511f60cbe79a5691db9f95d0a13f8754ddb4f816f047454d5eaa1b4d63c2f43278ad8afee70a899931d8fe1400fe0f2eaf0bb3289ed32c618baf3826e1040e7a7ba08486688ae1d6a7d3cf27a71633bfbeccb600d5abd403b42cf557c58b66de626b46f0751c25549e8915f052281ab8a4f28bc2fb7f020b65343a0e304a86ea077c662be1c1f630649a994705ffc09808bb36084139ac5e0517e1689bffdb65ff766df1d5b54726f82db830c2ae6dfeefdff2d5d1c85c6a852975fc41af6366b03e22015b8a45b4c5ab9a195f02804128d1513851f125554e478b37d1683de31e403dbf80552e3fbd0ab2a455dcabda9a66296d5de11626d4c78966b045494b25f76c2b8f63113d2eadf4b864043e04c5c1f30f8195afd94000df70b1da2083247d434242b141cc437946e0b9d1df0e4ca73833f07cf023f021799e81584b2e95a0788874b0ed9b4ebf378c0ffabdca2ed7ff70b5fa197904852968fd704b96a045d2168da256c0465e0b855eeb9a0441cb0d480c5a286d11ca2f85c029c55eeb87db78991b5ead6b1f87cc226a4dd19c4cb329a394f297ae5afddeff94d3b23c21d20353d81b4ef7fbbd61a733159d7402a7cf7d3013b6009ec74677b23d79de3787f2ecc38cdfa5393d1c77e0cc99eec7edb631eec0fef64cbc4327087a79f8cfb4d331bd8be908b27f9e8f87ae254c75710733c4f9d804ae7c6e52dece0c63e0ca979a7388075c4b697109d5fa15841081a8dd365c2bb7d665b2c804ae258c4e09c9806b89d58104bcec86c0b5b4b5b2c47c0c2e0a460b853c02aea52f9dd7a69606c11bd6f586bf0606051338d82e7c5d3df029e8f6b71726e0afdd26873da7bffd29303bfdedc5b6911cec1c26cce0727a26186c2f004fd9a0a429878acb8c8c54d7a1342b82a072bfc57a470565862ebf672f078bfb2d816dfe3feb539861b7df2a2abe6a69fff9e4f8dda7cf1f8f8fde5f7e7ad7ea5903fbe5a0f7e3cb977bf6cb1589faad9e65effe68efeefcb8d3b8105dbb7ae3158a2aeb707515d8bc22e595c966fc7736b3162dd842fc6813bf07a742cf5a80165b528196cdd6abaded4a2d3bad9eb59b939a33521485352237a0caa735afd1ea2bc4388fe3166c8d13e452239bb59e97f26f75593a5396daeac2d698adf8d4e611b2a1410bcac6e4cbb3f3e83d5fb319721cf65f172e826c669a6c515856a5034b92d65c219a3c9ae84227ba28895e3d9ee89c09a091d3ab47565f5473da82ad29991b34002d9a80d638773608da39fa2a00ad2b155d5b664b3253d0ba9ab2748b46c7c43fb19a1e16570e8955f509bf32c9a5289c64012b4cf889b6002ef561f8507df8ff80ca636228959ea6db1ea6911ada7e4dff63c5163d90bbbe1a5d5c75cf9ab5b869994a87fd2f7425c6fb14c58d5d8835a3dc39d97a4ceb152144b94759acfaab18a9c44b98f0a5158bfb0dfa41ee4d2e7782255da010930d9fcd5ab0d5e7ce35a674d97c50aa034f750db3966424ecbc5b9071cb60945a10b6585fc93d846aaef299849bc57c58c15b37ad6dc8e721e18d6bc97dd092ac7d2fd9f9cde2e164078fe2767e1fd99d4771bbb88fec6e13596b5ea9a5e22ff794beb06cf28357bdfc50ef2dbca3e4fdad5001f971ad5c3d143d9877895631fcb6ca2143b421a36ee568eab5b2cda32b57aebaca9d94dcc64e2f6394a4b55d941d4159574c1cce55b4792b3aaea195cf3bb029259cdfeac7920bc9e6bbf3b53c76254ffaf9edabb2505ede3d14fa150a9fdfbe3a791885419dc2a94e01b45ee4237635999d0dc8d87bf7d3d9add3795da5d3dfd509e939dea2e914d5b258fdc263bf2c9aba694668686bbd3f6dd8d8f54cd5d67e2f4b67added8567512d5e6ce49b066df9044b5bd1512a7abdbbb4ea7dae04d741a1abc4ea8dae20aa1d79bb5789e83b7fcfa166f323b38429c8c14ea4d926d5004ae66276c2dff56c31bb4a3ed7f07609c44d3331787fa9306fcbd04cb0609b47b3df3f6a700fe27b0269595797e0efaf7c0284c0c3d720624c51500f8baf537357eec015b04b22078a146b88f402400e57180114859a97a5b0097c1f2002806082a8093791ca55982412679e6fe416e3b1926f055e05110fbc830873a016883668a02a1f3030778008af3a7dbb06bcbab62b07585dc6fe2ae8421191b71bb1d5b241536dc6d6cb951c8cce73355990a817ae55335fadd23507fb486251057796012885f4134e91b9e6982aedd7f6902bbffc21cc630aec6b62a7b62ddb1995ff0618c3b2cd7f3feeeee50f86114c9c5606a02b54e7c6f64993bdf26b0379cecef0d27f9c6d40c4efef760d883707668102b8b652418ba988cc4315419301a7100e899a66357138be44ae21e10c94dd3594b946565294d13fc1a1809986d7f0ac0e4a07ff829707ae053003e058daea64475356140b88b59ed19eeaa9e1134f48c14d4a49801dfd47bcbd2c0b9d39d1ef4daed1f0283f0f0376a825f028398e00ffe2f59f2915a5904aeb8ba3cdfc7817ce386df65ae032a7b3945ac252b422e0e786497f2ad15b54e1f50c837959a14427edba4f05f63361cb22b7c2e165487e279d79ba0dd36f8f6b0619a8e80bd63b07701a40c266323abb96f02e75d300cebbb308959de8e952f8687a4e2b30515727777c42add12e2713d1ecaf71c5b648a26f9d650f92db7888664b5bbb574b392356ed6321577a9b2bec0f784b8eff45e0769c81da45cd8acff50de7fa809e812c87d28d99e7285ae6cac97f2ff33285aa0c856e979abb2bf13d9f3c6e2d781c751aadd60f241dd9613af2ab2526fea6046ed9d021e969bffbd21deff966f060d71a7637e0b2ef048b9d961a9dc1a97b15edb7414e7388852ec9dc5ccc83ace92191ef083385718872d0fb3452ea2d8b35a5f52dc9239109d6641f0998d0c9e9e8429c5c8b3b64ce0a70dc72fc49adb15d992682acf96f17bb23df8aca75c94b692cd7f9741e5d6af7b382a79114f5e7e6f4692540662c2c67be173c682685234282b2a8fde349b64b5c5630556c47b26a976c7e7aa2b3e35cc048bdbce210578597916ed34559f5810858897abdeca13459a626deca2ac469f10f59d96d54440ada5d60a4c0d0a1265524b7b3d8bad6ed9df96a9b4cd50396293572d5534bae8bd9c91822ebf239f83ce62e462efc9556c22f30f57542d72e3ea3ea18aff58b5caab9e79101105e272aee2f9b3caed5cf8221c0d29bf5292b858de7e28a249883507c45a0062dddcddf54c7399cba4fefedf99d6d1c7cd0fb4ad7935538aa6cca88b254453ecb568d4aa08c064ca243ffea1c031bf000b652b07baaf0df468d384e9a60975e9a8d9c02d0989388f9024487bfaacf19d54a1699d96a5656bea355be21db1e328a4491408493cb08cc6ecabca4a702cde8a48c80d7eb5384a5c717e62f3e256515851e2d2d46e742bce33a4f0be12df26c4cbcfdc16b99ae707d08a519ab6a88fa72d22420f14ddaf0cb465d335cef772a25f06edb48a03c0e5e15f7e009575f62bdc62b3a414b7dea5fe88d42e85e734412efd9204af50daf82452e39b1d11b7e25a969ebd592eead42e327ea12448eb799569fe550d2d06e61f91f5130abd002729bc459e776f8fc939cd73713b7f95e2648949383945219ae0842595d934e6f8587978c17ca5b359c1134c1b0bae36e5d7b4f20e935c85709db861530a8a4583ea44d6e8d2cf388db2c495c9546daa6144b3ad7bd7d35df9e4d2ba17d0f217961ad9539e602a182b616c818a573c1eb9a6482c4e0b3797581c262eca2b204bfe18ba7c058d44e18a77fbd6945ccbbf920bf5493b95170dceea9fae7832720d17a978227295c0c50b92aab8452c6443fb07f849ed3ff8f7db7ff05f6bffc13fd3fe3a497119c193b8caef33b88fb13c5d036f12f588ee397862f7fc85d66f601027219b4e243631f126c9529a4d9d969efd3e5bb476ef59cd2aada660d2f95d7b9c8777ea4df92c1edb7ae2f8d10774066e13147ad1d4dedb704c9d0aab3dcfb5ce70e04e679150b71134c412841825fcfdb06b9c7c1c9f5f479b7620c94b2dff2ae9f0385635196326ab8131e769fe1486e61b70e36212d499a9409bb470acadbb0244290ecfc5fdf21fc7e3958f3aae6038217c1436d159d7b8c58df65acb0aa78ec4b0c29720df8958f392fa7ace2a04569a62338e571f781b182d71c980b65a06584f238f04578ad96c15b592cbb5ab285efc79240e3414075d1e2e99663a2b055484de3c5a46b2c0478aa821f7ea559fdee53f37ac7cf2b88d87c96da75cfb14f7f4ae1aa051bc28d314dd5b03f33d93ef300477fec921c87d7a55616dc894927765c7922dbae216e4c6fe25dc4da69ee5380ab2a9b836190c4cfe0eff6779b69725fab5b8dee1e14dbe92d4aac69fa26f78558e42cc6b126145a5c8166d1a2acddc5632aed2234f52ad3b4f52ad3b1ba88d9d66d5daf874e743f8dcf977f87c907e6b90e67a471a7f4088df71709f1fb92ca0cc74ef50e497058da3645a46bfad1044434a290e7e627cf563fdeb795532ff53cdd5f01ef8bd6d545ea2b4b6617e7f004999633dc13f1e4cf08ff504ff7c30c13fd7137cb5d07be3865445b67fd2d2d9f94e96ce83fad6e32d9d9d07593a804d21f91ab41a4a25ae3ddb4c439664564a8527fa84933466e37c868d5680c714b41232f12968d12806adab88d2680a5a6c4d055a6394b4eac645950ce33601f20aaea509ceb0fe70b1e26ce08f546cba3f1420b10952a370bfb342a46a705570049b9be70a8f15c5bd29838a3db2f9542adfc356559f6235b4ca2bac1a7ba992547654dd4ebed21c748f765f7d468b7fc37b255af8093c7102f773259335f025304ff5ab35b1f65ddd6ab5f5d03bad9d5182d18686fd7942f8a5394c492518adf1231d71b4ea45129025b842c9c28da2c42b765f375fed28e5d7c9ace1e6559e5867a9044b6703f1e20a439bb293675dc3c4699144e5a18072bf113fcdf888e245c635857f9009d4a2258c151c3f642c29e5c6eb86105bfc55c64e016aee96e0f69ede911fd2ffe7fbc83b5ceb21f9b506f566ca6397ff81c6127ce44d250baacbee246df0711c05c1c3822ace7c14e3d2c551e45f6d1414ce1099ac3adbeb78be0533a749e66ddcd95496326fb5d17622f04a908cc20a0f2045e5c3bacc06698cc4d9801135ef4a6e78e2d5bca451c14bad25fd6a5c4c93e12bae995cc3ad3024fa32426685cdabf8b693685a338f8b466cc20a1678bc267f57ff3c3a45a18f28451bfb574a1e1b88acf6acc804af8b3c9a4ba58e650d2e22991a38dc90c14afe7b99cba352ea8ce5987ac35f5736f54fb200274c73e53e2261afdfbb90c8fd39dc6db582c8ea61c4d2e77eb55a1e35184225dee45b7b1077ab3c6aab38d3d257423472d761e9197c58871ce87ecb8d77f52a8ecbda9e5e058f05b7672e0af01359add0d8884f9e6715930289f3f0b0209b364bf31e734d63b24a66232ea54f77059bb9c797eb74bec229f74d1f2ec80a81d5735ec52bd0b0c6d552e407239ea0c707ff1fd0e383ffdbf5f8e05fd2e393ef3881effcf30dff1491eefc4b227d43b5c821f1a4c6390a2758336e57c572e6965ecbaa645de55693c9de9310e71df031c568f957ea93324263553e75825354cba6e353614cc9bdaaa134dd65ae5469b536fa436d22a6ef7d1278af161fd074635b5f101cbc9613464960cd5a49e4c993a90b4d0d8379f871e8e1e4358e9b238e5770a2e45a352188241f130f27406bac863d86fbe64ca5e4b5bb0d720f374ff231e48ef496b87337d7c30d53533587983c2798f2f735728befdeceae379596f79e8e9ee72cf2a90e4cf1446bebc95d5e61ef9fe8f2e27aab4f4914e384129cea9d1f334b95f706e7b61232bc19cb2581dce16be5b7545b1103172cea606e94dfbb23f81d0a8278b904598a15bbbf5ad37b4ad63237f497731fb7027295a064c1f9ca529c2aeeedb475b56879788cb280e6ab91ff5ee97565784c2b8bb9d709ba3e8dbc0d361b71ea8bc5519ea5713c310e85dac109671105d76891b6509a66539cb674a7539ad3b25ae7f9866d6b1165492b7fa7aa3523a8254c847cba10d1fa34aa116133d2b8156217a7294a167ac84d6d68e8a2f07239dc33329a6492e7fd8ee2d832416f65e7f99778f8a79a644d9b9c13b54dc4335fe94394d5fb8f6c18c98ccd4a35c0331ca48502119f2bb95a189f559eb6b2147fe5b785c953095b601305939f95715ad5fccd76de065ae38124972638529f582321a1afa210df7fe2e8ec1b0943ec897e56645b65a136cb503d8d0ab62e2f517e3eea3599f1cbb7d2ba1cd7b4323f83e8b4ac2642c58451479513680db5d90cf5fdcb65139609fea6b5d77bd2ca41e1c6ade472b7fa58bc7b2cf3325e6a617529a66f22170582037e75ad3526c1f42dca26b8358e92166ac57e44a34982629fb8ad14d32cd69f6d6cb7c51356453e4815ff47495d8dc9ae0f726d4b200a83c5998fbce8dab9dda0dbbf27139fb2215e646beeee20e548219737d1ac427c4503e7d42b998bb615f0fc95e971342bfd3f550c3745543aeff1983e9e0b967b051b011ed3157c30548d91cf9cfca339e1d957b0c2632e56f0c2713566cea3f8f1ac9c47f10a466814af608346718d89573c3ce4f17c88fc2b5811b1272bb811c81a431f304a1ecf0ecbbd829910a364052b0c5563e4cd53f878b3928df14a2ec60d4c7c2529b90af083f44343fe7b4fa78bd4e23cabd10a785fd6b86b554e3f0ae42b82d2c70889e5abcae78aa0b42a19065364f21a25df429c568bdca4c43ceb5a95798ae2df8847fdc75429cf5badd614c5fc021a7ed94cb57e1a52a9e8298a7fc28fd55545e655ac887b6e56f122b08c99758b6b2d5c45f81b1f62ac56e307739fe59ad87837caf8758c15b77e92a085ccbc5c026f11a229719fc68a24b286972c4513acf232d8ededbc84f275678eddc892fd2e65e746c817863038274deb5fbdc9d86256ca6ad3c37d355e4b1a6b0f3514acd53d5f05ea197ff8f59033efb07f77f2f701dd285ebc0b3de2e20def41a8f35925b1ca804f317d6c1179d6158a565f32b6b4e770d8ca2cc171805cfc3cc129b951a25d5b573c63da7482c6d316f1c8f3f825a8f7ea0a9d15a765e539d76cfe49bcda6c02c437f93caf79376583dea4b371ef8e8af68a9060a7dda616492b0d727727e13c7e2fc06886bd4a92c32dc21f20e2ddceb89f438d3fa7e8d8b9e4c6fc56090fcf9548e59ab4e482c17472b0b6f3633a1bb051171453f0781ef345bfd162b2024affd1da4c2d4ebebb54bc517f618f40f9d11f99a668dad709ba3e464135b22a7f4ff5197f3a7553be7362da4d196916c7514253213f71488a71fd08a2c53ad4f3de265116ab8ee31c24c20add00a324cfd9b88fb4b6583dbb523247f082d47b6d3468b195b56eb36c7de90fda3113127d742932fbeafb63d8ef071f04a89556a1b34a037838c01437eda75631f871bb14f51ef66fec55783587accbfbe5433cb235ce0b322b36ea787f2c77e7f8e7720922d95f1e6c4229454b1a0f2a788d78de68b794041c29afae7f089b9fd1c24529e597ab6844d6182ffc6ea3546c05533fc1a91f055ecd8e694cb59963ed5f66ea1ebb1e695ee84758d3b5197713d3fee1e6f40a617e9fd275d3143719d3ba9c1e6e4c3731faaf98d31bdbb82b38fcb7addc9f5125868133707fe4878c3dae69a682c2ca036e9ec72385df93f4fe1da855a5a844ee2be8c985dc7be4be36ca6fdcc651bec182f58bb87db769a1aa7505b10d6545e12b3c8e122c2ebbaddea015855ff8c569f9ab349b699892853cffcae886fbb910a3629dac7ed396cdd7098a8ff8e5d91bedae9fcad7f69d9655e67cf4bed7e6d496209ae18419000f6533cff73d985c4b6b09581d3ebf7df590d9a52281cf6f5f35d1e68b9b57b9378d3f7bb4c935715b9de206dbce96f4a69170b2a26f511ff397db310ac5450f6732792520fbde39ebbb172be30b4b1cb4d96cc0c4211e663d45e9b78748bdc66149665510944cf2260b5d9eac3653e9f8474aeabbf3718f7574aaddd738c514050feabd38f53ff9513851ba3127b236388be53aa328f450e2e519d57a3cb3371b97dfbdf07b021abeea6b1a9c9019a264861fb4b21077942b2c2b744ac639db7c6d81e7148762e75949a91e7d6a406fd6fb5aff0a2f7a0f944650a8599bdc9b202e8e6f38efd6c4fa6ff8eaedfbcf320e26775fe437feaf3735f5d701c4d639cfde6c7e6ac9b1eafe30e4313980423245154fc1264ccb7c8ab385d9971c48a2f07d14c5ba875247e50727b224c1a1c6e6863db1ca4e333185bbdad30a6a20ac8ee1ac9da2f95148d2882651bce97d880d4c696454cf148ad11509081b9b0de94a5fd5fa74e2384fb1fa7e349b0589552c168fd3357356a09720c129a66fdf9fd1cac5210f604825a17630f62d906adf52a14b90fb2ff94bff320e297d241f8db41486149dc13a4eebff7c3c39bb94af195ef217f3fe8fe2f2ada4deaa25de52d8ff0905e3ef59851abd4dabe1a360fcb0ba9439d40ae5d3d66b65e6795a951a28de57a95466b95454fc7dd56acaa356ec389ac6094e53ec49d19e0dce8f9f58b5469aeb2af7dbc9abb7ef2fdd225bd118e980baeb6ab836e3da6a7efafaf9fbd793137d5445e359f2c89af29c6a555f0538f44e49788ae64fac9f42695da54e7e3fbfe40f8f5e4e493845f375d5a8a65519d7822f9f3abc7462abe6859996aa7972d0d394ecbe0bc5190cafee447a04bf156aebe47df4e1edfb934b9267b8e4510b6b1541730e7e617d88ae027ce692348d12fe5aec432da91a05dda6d210aa45a522f80d2b21a185397ccff2a3ca839a778d87ec53823f05d984349e7e596b2d2a79d7d18f52faf8028accab4a100f039ce561390f2da3927d4ddcc21be4e2e32c0848387968217aee95b20a82c89523ea4b48ee5d6ed6c455c9bfa62e32d523ea2173de4fbbfffaf1d4fbafefa77f9c5d3d817ffe2ef5eab7418e78d8f329894f51fc1ecf70f0782bbc464a5fbf14e86981d6ae0faaa3d73904f4556c11ab76c2b551dd9faabedd532496ba6bc3bdb59a882b655602e414fa95e03805a347e99d2fe295e7662af959b59fc8362bad81671e3b5f6798bf6fa371cbc6381beb1b39855772915369701c9d61dacab5bacc70463cbcda27faaf16bd046e143223ec211ea89aef449058e570948fefe0396d7090a8c8e512cc1e7418b1cac82c69de5e9f277971f364b90413349da277619c3da9d6259515a2a73e6ee5cf1ef2682869eca6fcc894546cc5c3888ff05ffe7b1ce542138f353f596a82cc0a26b51c951725d70a6943d5f1fd38e03daaf23c6abecddcebd9ce000fd6ba83ff4c341fe677d14496fbdf53454f2c3b3ffafe19cf70926286de6c4b7135437582ff0db17c2f2e72019d9170127c47f928f4fe7be2793213eb46daacba617df6481d26fde362aff5ac303ca41e15d0f2120315fa6065f5f8a2b885c37e9d7f8f5a9e37167dde58f4f9d36af9a0a2782d8b47a19f5ad382508d85025363a3c03cbed64f2a5648207f05fbc912c809d559c931755672cc1324f09462b90450b945f4441194946acc94a81a3725eaf152786ac95c1022c4f4a94210546a6c444514bac682003fbee28f298d5736c131464faeaca0522b5e806bc50bf0e32bfb98d27865c751327d7a6505955af1025c2b5e801f5fd9c794c62b4bd73810362d9caa6e81bc0ccd29a0021f5fc98795c3ab37c1214e10954ea207857e347150215763a682aff155c13f5e14df99917be28ea67afc7b84bc5ac8e40ade8f328f444ecb627956077a2869c5eba3cd2f6ccbe7b4f94b3fd435395103034365825a29a62254d5c0e6d2cc232c414a5142cfc974b3b3cc39df45ae42c271801646cbc3015af0ed132eb84b577fcbfd35a2086ed6cd784947210a1669ee1565b97547e89b04ff9de1d05d0894ead0a9a096e0775a7b50f838bbc2a7285eff00be7edbc695bcd7a2d805903414bef257870b6e24809f70e2cde666f0768a9349fd9643864d864d456bf7daf018b164a279a38b00a7e2681cef43f915393243f1dd07f2910efe97af69de9507bd2ab7a159243dc5a9df6e1bd412b98e321a8928df769bca1ae6a7714002f36480426ae5459a004b2ef83316e6123cec61d3aa08ea2f34de27832287f6e0430e5d2e879e784ee76342262484e22c1df0f888929e29b85968d7bb299a6071079192f9bea12e9389c16ed41ed427fcd5f9301d12fe3c77c9a9b80245615da44790e4ca209457a680a47c7dbfdd36903545714cc209a426404bbdaaac6b3fa9ba8cc07d55666936aa36fdc7ab5d0b42b8f722a24ab56b04d6c670be7e7d56d3ea2b59d1dbe291ece8edb1294b5ca641066fc563fca7594049ee061133e3bd21dc672e0e05630d63f5399ea3691ce0f4f97fd2e9f38ca57a5e66b0fec377d73d4c91bbc1ebf74f2e08d17fa7a0e5702b0b8545e16d3d836c568ac6adcb4b4efef2f5c9d7f38f1fdf9f5d5eb6db7598e5913446d4f54f6638a47cde3fce521a4dc5f756822724a538d902b74c6e24706e132cae7772b66c7b776bb934c550c932288d9b7182f10d366e2f2ff92c7979e984591080a3e393b337249812f73c0ad944c7468db30b8e3cefe4ef4c5c8069f77aecfb63cc4c2706e8b34f42c90cf3b81796a30f8e82d8476fc41ac2eef56d70c4ef7c13778ce65f6765dcb7b36bff088ea6570487545ca471936adf9f92e80a3bc8054544e9714062e76d04941053fe66fbaf0ae894cc71e2bc53720901f063c0ce6b052ea699cf11384a5c71cd164a018f299126c00f09fb8caec5f52cce690084793475816ebd5c4a80dc6472b0fc7ecf5a296413600e10fc52171ccd712ae99e05e0684ef2af0de7ca3247e36e549e282f243f9d7126de387985dc6f67c4c38e0d5ea194b8bc913e21f71b6bca41bfd713e03280a2075e9110250b4d936f7cb6b79e750dd3cc9ed3d2e6bcff20eebd7e1585d83926e095388df10b5e8c1334c5e70972bf393711781565bc4bbe8ae63591de773942356bf3e476ccf42409272dd4caf3e5e92b8f5bcc0279ee9d3f20ffd505fca5ee00f3bf92bb45c0be2aa7ccbe50062c3e5ff14f99611680ea45187f605021e0d10a4436d94f2978b5a098ef9fdb3dbb078e91eb63e7b708c84eff1b05eaa544ce3800c7289ca1b470abdfa73af5e4b5f988296191240f3849103846749a05c1e768ca47e2c0f153704c421c85aa5ada01c7247183ea91bc5924e105641281e3004de3f3e8c49be0df1299dfeef56c701c44ee372770d98f147b677140422c4b4519388e8228715e61f143ef5ddf22509b739d10d58152d8bfb0f46195dda980968fae44405977fc4ef997daf4ecfb331e07f92be8a23203561781495005d3078ad9e52c4250b3c21c9a72e097af4d94f74a5c8df60b8623ee2b7c437022f4e634adc106ce4402f981d6380a50489d8facaa62fb8ea920c72e3edf2451489dbefecdd30c0ad80736f27b409499a4e2c727447de7947db009b2988f76c1f12220ac0b56a41f4705a680f9392c212e0a9c9f5ca02821e74faa7ef65f8b73bcf350850e5e3b571a404af98708bcc66e82a738a472eefb183b2ff65e0e4a38eb9e256eb0d3dbdd03afc58dba8c0a0927a72844139c38bf336a31f5cb59764f00f269b580bf10f0bc0a0481e251521488d9f65d5a83c921ef07358cbc2ef103cb93ba09a6586dd60f11781d79d8453ef69228ac0e4fa461cb41cae0d995d88f73fae0754a850d81f843a9fdde1e03f16158805e0279547bf54398f7e8f8e6fcf75ed4567f50a038f4ddd208bf4ed03587b76a4f1dfd217c04b53ba3f23a1d47f182239cc16e6fb707aa14f989f242029f31f24af08f8069bab4106e1609c043a74025d3da9584565ab5a27f136eb366918115e700037d23c6adcb356c79c3e72175ecbd172f5ef4eddda5692ec149109038152ad9212960766820ccc81df1a15b911cc8fb2b0a27598092268d36684854536d3b80bface3bc06dcd07e2dad709c3811683e0dfe330295d7b69c3f1160ca6ae0bcc5fcc74eedb018200081686d33f08c0d0d70d42af183d6350982d6156e89859b576d86b7f2650b59de92b3c3c753ead8e00d09722df57304de94c756192e88101df41f31bcaa39ef1d583243fd41da4a65422a4da9e60c4e4805666fe7b15c2b3937e37a6fe75eae138deb5a0627915ce7f6d82e78134d1c42d89f9379dc7712f633a4ceaf29ff9b4f2b29e013246bd042551f1fffc69aae0effcde9093057b4ecb77825f7170adea2e914e57145cea0d77b018a8efc8602dd23e766e02def69f2e188bdfc5319a1bb1a4c1fa82f739c0e6664882715551400b152c304944799a474f6c04f784a52fe9aa798c48ed22a48d2414115219693c405efdc286d9ea9a6484596061a02dcf3f28ad0298a6513fc990aa0fcc4f25348ca03efa653ec1144e5e507d28ff2870bde854de640bf84d7cd815d501c79a8f69fffa4555cb9845050f54b45beb92596dfb37d43c0bb90da7b8f183d7abe7bc70e4f7eefc8f9453ad4415372e717cce08fd2507abe4db8dd403b615a725bd74d9832f8cbc731fbf241bcbebc97d53f15c156533b7f72b9e6e36d00ea1d07913ab0ccef4aac340c8fa3f293e2dc7474fa835e4f45bc2721460903db2af86c1a45d46760363c663851c6cceee0e51ef8f9ece387aa2b62c5a2b44cda1cdfff0bc6b136227b405ffbbd8bc0fb8faf9d7302de23ea57ed802812e0028018608193d4f900dee3307d13a0e6a3151a9745ca7b9d8ef2bd81e72cc798e590eecdf738952eb73effada8e64109d015f02e47e8b001100af63c058af64c5ca02e07de3364889db784ff1d38bfbbfc07771e152794be09acb0e76669f9317016e2eb354a7d5cdc73e0bc8f38f47d14c5ceef22f327825dccac16f6718627fcba44e76f813ca309899d1e10dda89ccdf0408264ec92ddebed4988da495f471228cf6354b2bcd4b01f304a704a4bf48b123d5d9b79ba26b3eae4b081ecd27f44f29798535ea5a0b21cfc9b2598bccf66ea043e004c6e1f43173bfd7eafc7bf3e9170f2290a270cd2e790cf22b0a5dfefd9e07d3625219b082a1edcdd12530277c0e9c72f67270e024573fd868bdf92f3372983f84ec6ff08f6f9ef84cc074e0cf2d7f63f83533457dccc3b804f45c794ffd57bd1df980379572e80bf270228df782ae07f08383383ea07e5d63b2babf956285d14b6c4955cea4ee39297fa1e4daf70529ed03b8f38f8145117c505f44840c56bc605f44440f50b434e73e02225ae92f85ac0abf7843897027e1ef1e74a05ec2c02a72454643d00a784a91eec89bea03ac9fae094cc4b77bf0db43da126498ad51c8410b7db068617a3e67b44353a0f91ac45522d2f7cd603d8ca37b6538801b6dc200a7143f401b6d280b8d83097bc8518993858149ea29d0254d6b8076a437590839ab5c4ae8eae65df51f00d7a62574737669fe576774f7ce80abb0f3e44459d7ae04324177aeca7aa5ed837eb72455a1b7c88a8324dbc28bef5025e800f19ebd8fab4f82602c563527fc89f520b7c4de5f759cc9d77a2a3c78e0d3ebab4d900f790822b5d76087c0c71e103b2d9d72909b3b4e6317aa1a274cfd18f05ea2c71f55cbb2a4acf35001f13eae7ef934817edeb147c3a7e536e8ed8fc331ad312d4079f4e3f9f9cbe15e14651e2fc1d804f88898d26b9f3a9a85f8a145c69527028256eb0f1edae79fa35bb2b677142c41dc9cc16bc267c4b25cfa76bdc0716aa655ec38178ffbc88b3cf7d633a27678b94e2e9e676b29eefded28b2d25226d613dff6345a0e77ebc0ca8ef9ca5a0f6d68ef337059f021462e70c8b1f958e9484025c004209908be2790078c9c74194790f106e91e711822df23e58a8b59c8f1628430a73f663aa7c49a9502995d4f981009d90f307830428513c14294b1e2c1af55780145c017519543c758d02b1857ce582fca5aa5744e8e18f2548ec615fbbe0d70c796c4ad2765be669237ce05c7144fe0ae15cf9d075f6974841d5ede15711f87cf2f5ddd9bb8f1f443401f8fcf6d551758bd8e6d0d2301cf06f46678293023c10e0cba3b3f3e34bbb37b77b97123778f1d2fe5147eeaab83d1db7a7e25ee8b8972aeea58aebeb05f67b15645f45da0a7267bea3a07a2ad15d1df5a386d2aaa096b6a7a36c0da555aeafa05eeab9061a4acbb5a3a13489ec0ad4ab4fe7c705786fe74759cec9f971fff2e4a844bdd8f951ca9edfd172d97ff5e9d357bb40efbedc19a8e89d1a5a123e1b9c1f5fbefefdbcc40d5ebc78a1e3062aeea58edb55715ccaafd5750ee7f14485f0724f2a3db2fce4e85affe4d0537b4f25c40576fa420571f1325995b5d9b3859c840415e971922b85672bd8baec789769161d2bace49b25ac55c6069fd175e5babcab087c460be70a83f2c6eb372ef88c5d7a946024d4e2b7147cc65e29ab97ecb34abeff23f88c49e8a3c4530dca3ea82e20f0808102e462cda36283fc7462764513e4526535d2079f4938a9685312716839bd45e0ecf3db572f2f8fde7ffae9e865b352d9b59b13a90369e765731a7544edfcd89c461d5abbbda63415a5b3db5f9148553ebb838644ba12da692a4c57463b4d75d795d24e1337ba72da69e24557523b3b0d497465b5b3db9844a3b2d7984495f0ce0bc003eb9c3f411960e7041910bdfcd8cfc26f0e0ae5e77b72e544f9473102be52901be612328f80b802fa24153f2a1dcf95f8d24297006e9afd2c33095efe46e0cc8f92c2676a83e299cccfa4f82d6d071c00f56dcb2302848f33df79eb8333be61e1c458feaa701646125e40a884f0c885ffb8e5c74f2899462171d381132ae0a6cdd15d20a2609c34034a3c8c7399022d3c2662e8489a529fd3f24356ef67b7044917e127968a2d399c6b227f15cd1010505b8bed14a03344b304d162dd67f7406d79d60767949941dace39eb561caa6f9cef48a8be6fbe0bce284e70242d6cd7056734c168aa53ec4ba84eb127a13a459b414938d16daeff44a041edd905508da51c80f38f5f8e7f726e3f7f3c3f3a3f717ae0d3d107c706af3fbe7fffc725fbdd97bf6582c112c847492a4bed1e38c734695e6bfb48459681030c3ca795c438e2d0e2fb07912a4bb033057ac84b9882f328c9d20a855324c005e05a027e09a36a69970aaa005e2190bff5ebbcc3c5ef37282c1e94ee1750ee122ee036a8bd12cc44935d5587d71c7168f1bd40e0cbd7729cf4c017f2c83db24ac67bb77244fa7b37737ec837731ad33b3f608e78d43e5925e3461c6fb05346a9c2717dab8c528e78cc5e999e6f237eefdf2dfb5915706dbbec6721df973cd8103fe63daec6ec9bf12e73dd5b855fb52a34e7727ec5e04be8fa28a1d8ebabe6dd00e417ffdfb8f9cf944db43fd0e253cc846f19202593107b4a8869efc702fa2ea4fd9d9712deefa9f07cf6dc29807c52ddd9d9d9c9512f74d4eeeeae9da35e56507bbb39e6471d9383fbe0ebd969e9ad1b80af98cd287dc797bf06ceb5fcb5e34ce42f5da1ff1401717162ed8cd79ad61639d60656c9f2ab8d782da92f65a9d2bbdb075f8987a35c175304f8a9491117aa9c9cfc830a047775a77c1f51c32f40fdb4e5ac0ed3ef57bbbfbe8d048c167f7613b4c48b97a015c5943f675d1cb16bac83d14ac90d5652175e1ea6519864f4db3f422200a273fe9280df48827903969bb4a8043e3450ae92716d9bd64a5e113087d0a302e67e2b1ea538918731767a7df0fb4f9f1f16a65f6458e3672b83c60a0529a2f2ffc449c4ac4466b4e1928d1e4714f69af83c0ba25849630b60b154ec81942de495d5b7bd348779255a7e96773c3236b0455261ba359f5b7b9da0c97114d2240a52a7751c85294d32c64ce5fd3eb99d0e5ae2d55dd0f2a2e949c0e3715aa63ca696403cc490020a9365796ced0c03c47fbc7141c47ff820e57faf812bff06909fb5c9c49f581cea2d2ae419e66d6821cfe34187f99911636b1a6529ef4b5b600a9ed9265899c88baec32d30599f288bb7c06c7d121ed3b12e158d32d7172c2dd627e20788b7c07c7d2a1c7a5be08aa55916e2187371885174bf4456a7d385b23a9d2a97d5a92aa2694cd8209dd5e92a025a9db049465323316f132b4e308f5315c1e286e8a63e0cad09a6f95996e380f0bbf25d86276323b2e6d0482c97837feffafcc176f3b92fde42deee776d10590bd82dd2fcd1f52d1ac52c8950d8dbfd8e0df8c3ff6f92682a469f11016a82a0dd2eee6b34a5a6415682161609294e52ec52be1d6110e09aed7660c5d22dce9f8a355c2bcdae8cd494cfffc7956370b7fcce862d2f41932d2006ac132ccd61132b5c121e4465c1622b3235309782279f273be88933d963e85df44696a02acea1328a622575147ac7511ca010257c7bc0a04cc0bf4549e015419606b1429ed804e3a25a26c89e41386eb78d1575f1a3194ea2b0a8ce78c9fa424a1701b6dc2c49a3046ec511afc316c8e0d85ce280198259103c8330bb8ff0785c50ce1a28a38c465b522b299d6bd2dcb91a9b5c1c325c21e7ac1072bb6d04302b250cd6f48a54760693f786401166957f31d4d6741339c6cabea2d472c666435caf65b05aa88c241f8d2541a9da57c8b62c6db1a2340cb1e5fa6cedee9df3c19e5ef44672b6b97f18e3621827721827b5618c8b619c88619cfcdf398c4b59cd57f4bf04262b6495ad915545df655250d91a7d97094165f7094aaadbe6ceefeb9ddf573affd3d48b3a22fefbc3e8eadf18469e91dfd62eef027ed6934fbdba94cc10c5d0cb1fa32d20630921691ca55a58d0d83097c5ddeab2c5ee3d7aaf1b9265c655f7458b6b3bc3cad523f79ba851b8ee65a09a19a52df6e3ba992516fe8299f1f8e1dc8cc7ebd869325a2a1c352551980a234ac60bd8749dce1af18b5ceb38d33b5e85a7a65e8997e6b2ecd571a65fd85220882140fc440d4ce4180729ec0117f640007bc371941804f686643f1a763ac44c3bd04030b92023d39adfddf580db81c85ab05f01fb7573772732a5307d1e753170a1fb3cea5210c0e079d40d814a4c100229bfe362de85a9095cfe7bd185ae1875c8bae9c2c05c4ac5cdc6551e96d73381f8a4edb641cbcfb0dd3642f649f8fb000405e4066b8d9240bc04c49a97c072755c3c5f2ea5716860d8a180980ecfa3b7eeca3c147630cb43599e9bcdf284324fb804a46c3c4f5d2092f403fa6050339fc7b0985cc5912890021704105b9749145190c15b0f51c4c8f90c38ef8198ffb5d98cfb2c286888f430039837dc30901c0d4d32368c08d203681068f89dd87cde37cd431f12278604243000cf8c00061729ec44a382a9e4221d716a646c5008597fe9b0722d170581c1178d81c558338b2c9915e2398501480e456e47e5ca8b6e1328316c09ca032a8dbe592452816035c7cb6b9f04d83018bb2684860b3b063a80c4348beb56920b77c4d8905550d6714533c891ee6188e505d93db68ce6bf6c182acb9a4c696e7cd11b2946692674166bbd90b33fcb0cd9990fa79943c107f481fd5730263bfe61e8f0e5e751c0af3e28ed3f9dbdcb79cedc65c9dd25634ffee462133e18c5ace30cb33e206eeb12fd07f3b65a8210d22133f0584b0dcd1086a2cdb444c5ad354b3f2befafca2fed1007fb0ce5f94313a8e92cb7f468403fe37d7b9ec1894a6aa67c948aec2a2b2ffc5186c9dd9df81556068c325c40067c1003af18366359a36409a672d84cd8df450fccc4f0010bfe2d8691571d46e37c1879da300a78a744d0987666a2534e21726610012383e1013422684c3a0b819ac0c859c00810e881678607bd0b1f66fbfbf65d508e3272e18f786164cc3a746580796280019763160d183632d3763b8410ba39cdb168520f904341de516be545b7044a4c39e2769a86e18e091e55e37c84e6d565a33486867b00239301d20388cac14a2ee21163564aa2ecc89759793875ed805df4f21131b76122613654d4eff5ea417caaa36c0575a6cfb85c3227e508bf66235c4e5687a79913e6c37de5b04f9ca469d89f64ea29dcfae05f9463bfa8e9e5a2975795690492436d88d62987f3efa81ce61937e755339511e555c9b5a164b060bfe0985fd856f0c907619277e0507cca91574065951699919820e4c313c38bdb34ca12173b09a0628b206c984e96a36102b11547b1610ecdbcfac288e97323c6a030b104296615f15be7e4948ead384b7d232f88e6052596f87141f4096d696aa845c6a6faa22b2cc13c639d40b326446374a47094718e8b8c9e14a61bcd706250135080cd9cd85110d4e9b10e05716e0e1285c7c40408dacf7b20825dfbb9b0f428ec0de97e32ec74a829f56d23431774649a777706b9a0231882701f31fb0eb235dc41d46e1b110c4d93538c24aa68fb0896adafd40599f247c4f459c985ac316025897287ca6b2abcea3c9f56f362dec0b0830b35cb9ddbe5e5959c9bb0e066a8da642134283c45d4b7c641c4ba986976ec210e52cc683f33e801bebbc307619d361fbd30ecd2a2a2bc6ba7d784babe4160c7c0fb06ed845c57deba28c5ad9ee345b746a2751f93759a8859f2528fe2032384b463a06dd86746ce5582d1b721cf6f6f92dfa030eccadc07d85c96bcb5dbe56fd94f58c72fd5475498ecabcd10de105ee5924dae08e0c5486d316b4652420d4335d79948f3a24d2fba95638d8ae94d568042ca1511bf4214f3f2f8136974238b5ce9691da6fa2f7a23b3fcb6f9b7239b5f56d23c147ad3b9b8c8412390ffb44723cec298845e65f1ca0d415018f2655f738bbe060278310299da41d858c9b8cb8a559d35e538333266d898c5dae890b2f1ea1829c45d0a5c883bd41c2218e42a8d77cd674606119f23d9004d20b2e63df3c0658395fdb6cdfdd46429731fa860d88746d221e6f3feb0c2c1853d023e20624b8d037a239000dfe4d679c7c007d0374d3ec4838b7cb9d1b54740fbd270dd48c776a31144c281cc7989c5c84357a981bb0dda27932b8e61bc2f968b31601289b9446210429960a9695bb1de6f5613a859eb36680ea0b4acb0399546047ed9d8b1a6589e651a2955fcdcc01c72668c1422614c29cb9dc8896104d8ea89b56c76e1c24e3a32abe49e15f48462a0176ec76edb23be7e662b76d75cf292846c9e4188797f4972ba626c6964e5e5be2447b6db1e0e30c57289079243831c26c23a208ec4896fae134c87b21494adc30a3cfb625623bde88deeeee885cda6d98c2d2dd96f06e93148511f5681c3f022600b49452765a62c425554c2fe3195e6ae4e89a5cdc3547f3e2d0ee97ec8271b4e4be4349ae71a614137bfecc599e0a952cd4b912bc2de43f560a783572b3f9ebf79bee753d0c5489f81f864dc6e236d78470d369939a410a92a05b36538d728fc7edd790f10f6c736dbed48532269a1448c1046a269f5f2429002c25407c3f79af009484d6dbe292b7b34a695795ed698d53561f30c376194892dd4882b03b5b9d6615e6be1499395e68681564fc424cbe490723900171a5127e5f54690887ae945337dc11439c7db4d7857d45bce7c72b0327354b2840dd904bc602efe5ae79c6fe8d0d25616a61c567371ddea5106cfd445fa49e322fdbdb62a6b5ca6e7bf92ca82bdb65c0763300513b122e78db3906b0db20473b96cbf92cbf64bf6f7a607aee5f2fd542cdfc119870b553bab2ee317f9327ea62de363bea88da031ef5c0b653b8791730d2360787c519b42e3aa732a505730754e610a8c314c0ea0e142e3b273265097d075cea00b109c8167c60cce2ea670bcbfdfbff3d832372e7535ba988e3833646c04b565fe4c2ee6b3da323fc7f81c73d380a110c2403800b2763b8110160ba685d0cf33800e45f98e2a162fba4550624af3f165931fe0a509beb7c872d354939709a13181867f005d93418dec00a6dc63101cc0a85c43a18bc988554b0ab55cdd7ecaaad7596de435b82996d2e54aba5c48dfd8302a8bf8bcda9370bcda93f05147f515d46bc5e95546f07c28dd0c9f5537c371e684f22339fc983949d5e7b0d2f7401cd2e47bf8501119373bd778206e0a07c4bc74402c7a8503e2a6573820e6368c4ab7449a27b0a1bbce43f1ee3b7a288eeef3509c543d148beafcb028278aa22e8ff75d9c3fd877b1b3d677b1f37d7d173b55dfc579d57771f420df05285c088b469fc695eed300a1c9bb2236f38256fa35b89d53f83622a50ec894a16ec5a7cb5d1d01ff37e30e0fe0977e8f10f686e13e1a763aa1f47b244d95a1105f84dcf3211291a69a51ee19892ec2114c40cafe1090ecbbedb6e1c2c404c941d66e1b19fb49f603be054f4c400e98a5eb4362f2200af720bbbb0b0e7ccd1e2fac1b21291704f91236033e137359072953c0b8e03c00ceb86e311cd55d2780569d27795559e3d6d74361b9e0c947c3829b87f968c91d3f0bc5bf129a26814658f3af00048d4485d2d2eb92f778ae9a20e9862050475f28fc3190dcdd2507f4ee8e1e403434a5d3258506dd4ff81482f743b66c553bbb79918e6000021801771bf6415a7865080c3b6c5a4f3aaeee6e0921e93620fa3247025157430c640e8e7888e725a87b5e36f4fcf2d6fd57fd31474ff5c700f1c3ae396680f8616fe2a129a4a3b86a0ad98c469ccd9acfa670ee37aeece7bd625dbf50d7f5c02bfa3618b325c8b4badc9ab6dbe3d2ccbfcc8c696ef3163e9df030143e9d0ce26ec80aea862086b81332f29d1084db3034872e1c579c3c53e8164e1e025deee489efee0c045d6bd1330f3ca68318dc36f7b3bb3b236570dbdcf7b9f367aaad6726d0209dc87cde07336820b192a9307e3118311b9d0947b88238b03f0204ccc04403da2c2513e34c01f6465cb6133033f97e92410fe04c0cc9033831b9721c5f8c15ff91f6a5e1ba818eed0623e82afea3056c741b4da5b13c87b4dba0b673f4155c6c2f3af3ed39535857fbb26b5c0abd94fe9d50238457e690b5d7256faf4bde5e97bcbd2e410205a1653e7213dee71ee37dca556fd43c7f6ee49d923ba2cad2775c76eb69d9ad2765b79e692abbdc15cd5d4d5e93e72ae09eab141ae3ce44d8f863983a1366fe673012e6bfb279e83a336600aed9132d1c5b9eeed832e885dfb1db03ee2af23bfde2d7a03de0564f082988a12f57d05ed5dd254b5ce7eef22aee2eef81ee2e5f7377f923b6382add5decdf3eff97f3eb09d7d74081ab6e304f7783c523e8a96e306fad1bece89f71831d6de4063bfa17dc6047f7bac1b807fe6254f8de0bddecb6dba9a6e2dc8d8c7e734861aa3bc7dc06e7d8a2c72c1f6b6e734fd1c236db6d5753b90134920e622a37cb95efd008a12b3a85ce59c807325bc972c7997bd16f4a93800c04651abb990e134996a7e935d321acbcaa13eee87b38e12ed739e156cafb516eb905df6fb1f85e0b6b0126e7a8e33289fbd0483bc14a77dda570d7a54c79ae72d9f1347c77a64cd36fa6e3b376c9d30c9ae9f84c593fc8fdb7103e40c03b576d783ed111c8486c1a1c273d033a8985f025de64f0b5ea4bfcd0e84bfca6ba451a2ec953a21fdf6425dcc6ddbd6d83cfca090abd686a985d6b57716abcd2dc2d16093d3c2fb15fb4b02dfe46a041f9daeb5968523f89aef9a9d61311ebc944df0a23da1a4759e839adad0e5516c405d1ff64cd0ae85506dc2679dacf39ff53121ae802cbd5bbe0740418442cc225c45c82007ecb8c41cf0419b49583674652ea7404d90028743adacf869d0e2a5c06cc2a906e57c82c0036f5f7c00cf686e3fd74d8e98ccd804dd6f8623c322543600a0d1fba9219d39a777c6b36ef0616fb6f36bfbb63cd02c881dd6e1b13e85b0b865f74038bfd375b083c4bd06fb78d19f4ad1b96e0a61b58ecbfd94d9e60ba0d636818b1626a4db7a79dc9f6a433db9e996637644c3d8fb7936d7a311e81c9368cc18cfdc3f981d36dc383114b2399e16cc0c9b69717ce8b853306609c774416bbebe53918bf1d3507e3afc3732831b8069fa372571d8fd42c026eb3d221e1f375e6298a8dc49aa2d8e01d0e1e5ca47ccd9198008f649004813d79564fac4a03734878bb1193b7051999a20f4002b644707af972972b9b89d9d0f227fc92193ec8bf4cb32993684d9e49fccc33c9663601ba70f52e098d1ae8eeaec757ee17aede5745520d249216f55557e159595f515d105d9011ac95f6bcce40a7560e9f3214d2c0334ce9e92b4063430daaf6f206cd074908d9345e8ca1709f70af0abd0847b0e31af8221c090f95763650234175129493a066784147b01370b34a04ef3444435f8c4ce037073cf3b3bf10332303c486b904be1590f05bba69f833cf057c1e01ed5bc4db4ccba710b33c29cf43e55da4e9667933d8e199339639a509076f96d5855b79ba2d98f75c7c889d6f99d1c1a2617dd37119654fdeb4bb19e5e01eca63413958027f79739ffff8c32afff1cd4a13e7a6c1d6295ce38ff72cbf7bb067f9e55acff2cbefeb597e59f52cbfab7a966fbe8b671914cedb9b468ff3fbaac7992963316363336762add71944a59a571dcd91298f56179f81fe9941e17966ffc6fc5f4f38a3c7e2cfb4ea938ebe9f4fbae26db8a9f9ac53e1b37685cf3a607f1048f60b7f7572e0b5db86275cd7b9bf1a908371bb6d8cd94fb41fb7db460c9109d0c1b4dd36a63cc697d5c693648a11e12971806349ad182563586eb34c25d162e4e46e8b1b3d8290fb3a72df21df55ce7de24286b2d5853b9cd591d7b0c9317ed3e418d78e6dd45de3c5c637ec34450596f526652d5159a7322ab288185bd8c5aaf546f19e27a61955fce4c27b9e4283d4bce7c0850652a161259231119ef3e8ee8e08c7797a77870ec2bbbbf0c0add7837b9460d44d0a3fa81add984123dc37105f6589bd5bba6f10ee4f94de7723e14b5d2df031d0348479918d600c6218c8357f0a49c7f0b7619f0d2dd4f1013e302298747c5372cb18ad87433e94aa91c0a8eb9b4c1a8d54fb9b502530edaee2958bb74a75f028aa0aaf8d54771e280104dd6e5daee820d4a8ee3e8a6a55ae55aa7b0f94408d572e812ad5178fa25a952ba3fa90ed9ab8be5df3a4cd71ae89fed54d9c9befb689237ff457efe6c81ffd076deb14326cdadf29e4371af1aa346cf41401162b9de47365f651e69a152e72b028543498c38b11b8aa3a1aafdaed79e9f0f994195765c81358141b41c9612236823c88bb0963a19b80290cbb099840dc4958999d042c60d84940b20d1373e8c3796553e80afac5a610823edf149af08d209f6f0acdf846906fddf4cc83c5dd9de1b234b6b9efdddd19014b639bfbe3bb3b2363696c737fca378bae342fdb25941a1e5c4323e27e34700a8db49399cffbc34a552f5e8cc025b806a742d062438823f6460071c46505b1cb72443cc7b586d819f1363be50455c44094211af35441f44519292f4345d8a28c9497a1227a23d92f38d3260f7932c203782aa7b303789d6f5a5d9adc64995fcc954d2bed4bc375631ddb8d47d05736adce9a37adaee4aed449f3a6558e3e8761b7c1accbd147f06cfbac73b27dd239df3e67a6c4d1be1c07ef15674b028fcc21eb7eef79f77bcfbbdf7bdefddef3eef79e77bff780c02b7d8f8bf0e1f64fec71e5f8b4d9a27fc01e981873ea4ed8ac1cf18b72c4cfcb117f558ef8cb72c45f6b46d9b34975c76ad2b43fe6f3fd31171ab3ce95d8049b41d7b9822eeb61d1013402682c3a9702b580817309036078303d80ccac52e2ed32e71a6680c20978664ce0e4620c3dd63763d62dfd86fdb3496dff6cdcb1db2ff81ed3b8d32f7e0d8a5f3bc5afdde2d75ef1eb45fb45b1cf368563e9aa9e54f7d9247bebf6d926957db6c903f7d9c6da3edb78048cc98a7d36f6ef0eff7797ffbbc7ffe5f59888fdb7170a7c5749bf6a5f6ea2efcb4d4770a2eecb4dd6eecbddfc33fb72371bedcbddfc0bfb72371bedcb71c7e9fde7603e6546f648478a39a4fae918cc56a0ab76ebc432cc124b304b2cbfd834d86e379c95e1e1123194cb1be0e5b3e2d0086126ba965e8750aaa1489ee9e1e9f69ad2253c9dafa6db6da64738bdb84cb7d34c8f707a4abac12afe44c37879bafe2afe10e7af4867afe20f71fe8a74bd55fca13c2e6659edd24fdf75fcb4d1aee3fd3de929fb90373dbe0f39b7596f677dcbe77d8bf520694379b90d05c6d0703bfecafdc94ff9fea42ba6b5557b943c5d2c2741255d759f52d2f338bdac4c57ddab94f43c39a916e97656f13716fd384fb7bb8abf31e7af48b7b78abf31e7af48f762157f6331e93f7c3ff546d954057ce8d714ec5377566f9ebcb3ca486c780b89ecbd1512376273f6a70cdece5090696f3f2e97e5aee2dbcc2867240cc49c542d0424f076594c50c2a584cb541774d4d9da32efee708b84ade4eeeef9c55fa9357a6e519c52039bf59d56120478828216bffba6b5d5c1e630b9c02378312a764af075eb6b6624caeecb57beef2aaa0795a300bf65da6da9d8a209991aa695c601a1c6f3ffdfdd5f69e7b92936e7aaca25845b5bfce834df55fa3836b6ac2dbe3f9c1cc01eb77ff2e7db928e2dee4b139f3d90b059b0dd7e462d1fa51fafc3fcf59cc60a67e1b730ba0eb50a7376e5f53f204453ec844bed72abbf65c58a0d2b90e8fb4d09df6f4af8419710e28b64645a8c10849096bb06bcfd4baabf17571de474575365244b8ab7ec13fe9455c460b951e8226aa892927e1a75dfeb190cdbed7c2b81579702d135c325b327beaa41046fd58f5be59a11e76b06a2d0693c8c2b2d0c4020eb121dd6b22640b06b8308e6ca9b5bcb46b583eff74ddead059fb4dd2e378e8acd54dad08dc3190a88d7628b952be47e9321035c0d753a683fe2f648080d0cc9051a9916bf4225b90847f0f7cc48b8639a8b1750937b6b5b9207266dbe3bc00754630e7e6199a6b92ac5d6cae5ddf96f8d4ab9b40a97c08de2855333186f97203f493f2c3a22638b9a98b1452fc251fec2e1501fbcd85c02261aa7167a6ed4754cb76f1ef44ca5ab6bd71884ac217b43c455103259ad14fd833afd116f58c1e72307242b1b71fd67e45de9028fcc32c642949d5ca0911853168ae360615040cc25e0bf6b97537f17a6d4bd850b3c02229020297a343f0e40cce48254190bcda59807fec8c09f19f839833df02bfbe717f6cf0fec1fec436613b17afb308f2028764b639c8ca3648a4217b7dbca871546d787cab7f31a510c92060ad724f4a2eb765bfcb512fc7786537a149229df5f7e93a0293e5c87b4ae48e8192285a95d269d627a4ea638caa88181fdc254a635e22bb145fedd9d91f806f24d56dbd067cc1b6687fa8aae452c039345098a1848489df562d900944cb1fcc917af6c1c967952bf7e8f4ce41797555909e6b719ca44202973ba9201e387ac6091f1c81a8d35d990268bdb67caf06455049dcecfd9509dbeffc88674681a1862bf4b05b7269fcaa8a885be85ca9674bc1ac36ef7e76c6998cb310951102c6e795769dc0cff2303dc8929d45c38344341f9d0480e425162bb6d2450fe6693660842f6c9178f8e41f3df205464c896c2875802a8f34706a939fc338318643e33030cde783d25a023f00b25950b0c5088bb3f64437a60e30177db772165fd5c8de2c87cd6797eceeeee8c5fb376dbf835836e805192f7a55f3336b377b17fd0df3934f0befdbc275229fdcdf501eee6a5762933577f61b47e91b4f88376331418bf64a6693ac62fac34a565d9004c312d92053eb0f1c034596bdb20f10dd7374d7319f9ca3498faabe6c4c807b2633529a086b90c2bbae77c1163a97ff2794c5c844f5ba888d4db32872134f2d30caceb399dd0ec1427177b4e87ca7d5ade8277777f66cc66f0497a7767fc991dfe99e54deb9394b7ae4f52f0a7f89be7e4c32c3f88c8075ac85adf5c829446b13a3795e98bcd199e59ec7397f9f94130df304dd5e6f57d2d665089178c75cc42891ed23137fc0af6b12f1cab9fde6d1b836ee963dd354d30f561bfb72dd1cf8d1f3b25badf67065279b79c2fe6450ae9dd5d7f981b3345d0e000889f686ed8e227bf6cdfa0a66902026d80a0d5eb3123c7163cc4d1b58180fd7cd0eb99f26e486b4fc6289ca2186430f58dd8043e7c9b195b94b8dfb6c0160ebd2d85a9d8306f79e48d501832556802c2affac92cd6220a9edfa81aaad62b6350ae94337ea1a19cae8ab79ac5b51e7639c7c5b0378cf7e9b0d389b921403ad048bbc4dc8e40608da3e404b9be6ec26383706f94b00d7c3e3f8b2e69641073d3673c3fccac790766d66cbe0d5dc760cbbbcc1acf0183c09e09121e1428b265d6787198590b9e7e21d32f3898a55fc09ec932f4d50c37879975c333dcc80c371ccc32dcb00c0d31a46365d5c5946a63241ab79464e4878c0c1427829f416a8de73c4467ce7f9a2578c1c10bfe5301df70f00dff6902b91567cdcdbb3b5efd1cb0e0807e09b831652342bbb76d2407fd43dec5dcab841aa1e92407f6a17266c67442134430dc1ef38899eda93fb42184c9216314397dfe9b738dc4d070a394df05652d72484a4223622a53492560658e54cb51d0b8694acf7ea7a6b9cc2f2fb066b54acf6ab59edd9822028af510d941a8687ed9fa54b6ed52bd15bf5c845225b08fcdbde59781791cd2aa88c0310f63bc65c3cdf1ea5abd28202b4c89d804615d4116c9e4380d9720cca6afc914872989c2b4e9558eba6f61032dc4d610caf09c9a80758b2508230f2ba5dc17b0c8ea5da582970005b18f36e395c00e66b988cc754ac2cd32229911c98cafb18b169b658d64d64e24f3cab76b368cb71499d32598e12072095d3ca06817da5d9eddeeba4b308e1277c5b34fd5ac07f661316d0796d85931b0e904568a9961caba31177fc0c3e5d9226e4c42afba32a4202c5dfc90afd2948b41f982504c0d45f92608a06ba53e1953c3bcbbeb810c1a4c7f143087af6919c6875cd5346062958488aceb8171a93b99528db761cce0436f7f3cec743cd340d0a030e81a11c417dec8b4e6e636ed1821ccba46c4ef4236cdedb06310e833c08d001093c7a4a53002314485164f977507c41a51fb964cc4442a3ecca5a23566be6a5dcbe3eedf32a33be831556a83941b312eb45e2a87010283946e682548d160ea961ef2eb6a7ddfe41a971e9e894f10fba633e090d7050478be14afe284377c312b2790c8b93512732b9f5441be7114ab56b5888d6ebc915086836bb712aad7fffdffd97bd735b7712451f0ff3e85923da503a42026a5bc5386755caeaa6ef7d85535b6abbaba654d0e444222cb14c902a1cc54a6f800fb739f605f711f613fdc4890a2d2764d779fd93d637f5f8a08dc02b74020108810c5f2398a67a9512c1f10902acde9d27a00416bbb6bf5dd9298479ecd60c44b10a9dd95e00c1738c0de2490cc4100a5982c90579bac3640a6656492e62703ac836833c00c910166c72095b6b321ca7448ce1954e8909a3093e4d8ba673f3b11c74db1879d6c10973b0875b7383bd940c4e51642dd075c9c6cb47a80c00cbaf7389577aceebdce93ba5b03da9a8ca9fb60600f7012668fc9008bbe9310d581facace58cd8025556dc289fdc28122a2a5e85250a1d36891d09137514cd94c2699cff87034977677ef87a97b8f96983f1f4da9bb1da6eed6974a34cfc753ea3e0c53f7c1f7d00ae743826e71781c0e96c7cbc1fa782d2fce8f5727c1b3ca7ccfedb3a2df07821d0cfb7d703bc020c4f2a1c87108551788b8a58e5beab8a5ee0a11b7d6716b1db786e8f659261fa1d4a3911ddf0aa2269f8384c7baa1c7ece4b6eae6dbed002fed98bab76f1f0678dd8882e8c853924433eb76bbdbe7b880f0115073499eee76d45c7eff935a2867438d807caa13cfa83d3364a34d47ac5acd5fb51bbd824689cc986281953e48d2f978412a5f89831bc70c6dc4d92df9c20701e4136afb1bc12ac8ed3aa91e04bc89d3cf2b3cc3f4988aec56cfc14649e4336f7f8afd920a59128fa8adccf7f426be574620ca90a7cb6db3bf8e5a2a3747745f80285d0ac4cb6d2f20a938c06f0ada5b92a4d86a0f633d52f4a4a78ca2576c94a0ae3e7e713c73b2d441ce3266d4414eb65c3a73ad5c6d3402949efa12d0b638934bf5f43d84dea95a0c3e0baaaa8f97310d51af88d380f662de2309a324dc4a870ab92eb2f73f9c812875e0fc0f079680426dd575ffd940d35ab92d187fb477eada8e59874484ede36e4b4394ab36e58a6e419b8211753c12a85656aba4669e7c4824787a6dfdeeb1ba266028e0f77e2caf3d50b65cfacdd5132f4175484e2bad9aae666a9bfda2ef0f35ab529d49e7ea8aa17efc21607a7b8febf155d275d7202b8e6cfd7e2c6fd3020a08aaef4ba9e00c99c576d61636547788591ad786e1f6d923b90deff18e7907f38846b09ea91d38cb8a3379dd31c92ae4b5203c73037e8f58a57640cb524ea84a9c93a598bb598aa87453c2c55f445dd13871608e194554c9d1ef9b6bd2d9a4f16f1bfa3a4e3fbe0a9d38155472b77b2ca5a98b867b9374c5481eb9f2afdf7b274e6e71baea2d59b6eedd5226ce643dcf1d9df5fec32ef23fc4dcb39c8b7c487f2a68ef3fd69b84c7b2a8ffd0fe288d87910f62fdca3fdf679cfa3d1e514645212429b29e725fd48bd35ea83ce5f4163422b771c6fcde77029334bbeb65698f9220eac9f23fa47121bd35c62165d5f457b2c11a8bde625b950864661aae64b5aa31d2572675eb0c98ba7633612d14b253491ec9ca74349257b31dd3fc0dc93b9ef35a5dde63f4b74dcc68d1fb8f3724ff0fdd8e902ee394866eefc7849282f6f22cd92ee324112469419719a3bd4d21864915e518126404695a31e5b1d4573236b6d32edb33317ea7847df2fea6454263d93ab2db6d6512f828c8089bc573eca98a33ecfc4f67d01b0c0470a2ca1a64880f6adbcd12337d07816258eec983d5b584c662d2958bc11265a26105be4701be4709be471b7c8f22fc48c2f0fb2ca4fe1291301463d72c9fc1c744bb018cf11a50b8db891301caf05a5a8d5c022e5f37e8c413add71140741749bf51881e49b9e05d043214d4472e10208784a1a336ffa0444a3f4e6270ab0312b1155a512ebfd6e6ab78996dd22e110a972a72a548270a3a982ed574a64ee9efef416b8b9ef02957ef35e5b94a1ecebf254124d1ba33215110d5bd59f7a1651b70ad7d05c682facae2ec6be98a31aa3608366d97d37ce6476b7269ce8ef215ae9c74ae2044af422c9946a65c8001e2f2ec55081181d591a02c81460649e1c3efab1265d8ae71aa2af20d4cea5f681cb2a7aa2fedcedc1f14c49ae4a26626a136838f184e6bfd4b7518a5209df1392cd182aee2f4a73c249cfa09a269a8bf37485ef1d833250110dd3545d32b40dd3894d269c90547a490586ec5573d4315ac3264b88d4004f7eedd70e466e9246a38f4aaa667e45a88e2042f50e456c8e20dbe4105ce518043240ba0c85c0f47a816cd942580289a34ce861c3e669a73115dee53a4f60fe9c59a970d517f23752a5a7738f552fa4b6e70391dacec2bad5b218d32c4a1661a99032786c4b0c6a26353c0d4339a1405802167233bc081d0d756f36f2259b18a95d40422ae855e4c5116664b73a94529b424acbeb3a91588cc3a3d322bf16864a198aae93a51a60474485e534d9a6b85d96be556d2fd5a4db216d3a100a4c851144f93c323afe556521d0e2a6414815aa8d64b7ef199d74015a586bbe382bbabfa562f4788243152c4a0ea6e7979230b65aa5150dd33eb905d228aebc4712371dc91b800f489066e9b1a3f55e7b3ddeec8206289d6ad37b60631eb20a329ad8ed11c6b5c53262a3014cdb615aa625b746fbb8d848fb65f42f8180ff0c8727103e0a398ea201e62dba8b674d01849261338dabfa48332884c02ec59f3ee4e8fef27ee74f51afaae5287689e60d4eb7edacb6e29537c9e5c6685dbfb6bb6e9e5a42868d8543f11fcb1147f14d213a6922a013839626e98a554bd7fa08019415a2542aad396f615ec22aa74818e4ccf0ee5530b6e54f1a07595a274f3f411506a7ad992453dbe93748047509f872451a99ed39b0aace13097ae515cb871686e9debe5a9fd370a82c2adfed7d9a84a39d5bf4603d5d7613ce3b6dfa19ab552f5e909a6eb94138c5bf569eb8f71882d7aa459364bcb317bc7599cae001c38ffcffffd7ffd9f3d67c02da014217c1bedbd8cab1c2c09246a140c027acea5e6cd355d2ecdf3c63be98e143be966bda0acde4de369ec8fd4f1e87dbb3e3559675afa204f7a7307637396ad0f7d0671ad9f02a1a59c3861cfd27ad932f842f7e78ccd61eb4c2bce36d424886d8da01751c36f7b8bf74e616b5955ad93876bd5e91339b1aa06b26a302adff86c2acd86881e83bef82a4b390eafeb7ee951607976e4bb1de0f8b194442c958d66a20d52c892b6b164b0d64adf8b42a46209676c3e398a77bbaa096c7e8431998a0f2c62fd5a4d0b13419c4504953faa5bebadc7eac21f5b5350604eeff38cf1c27f2c4bc45d1d82f5a76cfedb08ffd8bab9af0ae5d63e2b4897382bb726189d527f20e2be21dcde84d34a1fb8a034b4558259c53955d1d5611f9f8dafcfae2f2ec7d7e77d70ea9d8dcfafcfce2faeff1d500c9a91fb90d3d3b373ef727ce97922391d8c47e3cbebd1783c3a1b00faecd9680cfb7572f8eff4f9f3e7a36b0807a797679717a3d3eb5399ecbc916a707a7eee5d9c9e8f4617ff4e9f3d13c9cfc6e7a3ebebd3cbeb4b99feb4a3d40b88ac962330beb83a3b3d3f3b3fef53786202172535e38039aabeb529ad0ed02bb931640d9b08b52edb6ea7bd3f77099a9470785f88b62978b67e2b4bef8519558a456bc283a8de925efcf8caefa95da2b7b4f6ac755c88e3b75389f334bbdfb856565b428c88de0b68f5fa72923ef726c3610ac5162f8b4f0723b14ee41944fc91ba15d238042688030227b47af2c5019d79e21c50449be532a19d17a0da9f965527977572989a3ab9a833b66aa2c6c9158e2796400aa5163994aa521d2264dbf283187e91ee9b6cb3482880c714ee17a222316b446cd27899b1750bba229ba28849da69036712668f1c8f8ff76a1d8e507a004e313fe683f438adbc5be1d16ea7f8fdeaac7c5c8bbe8763154832c15e9f50588ad3d3cb0883b7c6fc1baabecc54456dadb045166ead1dfcb70d09bd5678d40a8f5be1532bbc264581bdfafb173bf0571348e8929b6f9ee5e67391719ead4d88c9fdd32b21fa21c2df58a7ad6f2a4dd38293e0239ecd55863ccb5f85f7b64eeaf736db623b3b90ade6e5370d1dc1b8f8769df36d874cc3d3ca79ba8a120906a64bab1ed768cdac0cf3493a05a9c120d5d5ebc727fba99505252dfa1a0c9a3537155704ff56473ff7ec57a5bae4e1d02ebb448c1694ef6907569da75893575197072fcb09957b3fe4ee3d44cc866d87dcddd672b267233abceaf799fc2dd143531a5c497fdd1523b731dfeef34ad4444dab2f5fac147d69d4915e464cf5afef5ee9e35cb50ec0e8faea0ca214bf8c10c33f4428c6af22298bd4e51b619e18028602ac8b32af323d14e1bc52dd7f8cd38232fe7516c6b443cc8552fcbdc4d07df3e2979b9f5fbcfee95bc4f64171057af5bd06917d5066bd7dc5995227e6c3e1c4b8191224d2cdb3c2bd17589bc076523c530ea30b888ae7e268194b3fd4cf98bc4d08200a9e2b6f848162821369497e89c9904d92e7cb29c16c90482beecb89683f901d00d51a4e51a4d7698c22b994198acc3a2608709c0d47eaf00a2235edd523dd1afd503ddb95e2c2b759d625528c4aa4c4135f67e1f6bb96ee8eed5cae9026eb059682a68478a40d3a8e26c9cc9be3487bae9d1813dfc96c3947b77825319b8443916180950c608b6fe5d3eddb7e7f3b050cdfaace1d52ddc9b1866c35648be479b5b08d071cb3417c1c43a53f017893e2bbe7f0e4dc43f1a188ce92508ac9f1ada4a6c754fe9c80e2b8382e20da0c707acc502e7e62e86f65a52b45854fd4af85bc02fcb519f14f6a0358a949335cc959044f8a67c1148896ad3ea76560a5b6a97e1f24f295b90aa2708047682d4eb5488146cd14a3fd14e3668af17e8ad3668a532b05842575a52a99d4984526b01de0bc44eaa6a95373904e3bb8764380e45aac42101d2272d23cbcfe362feb1f0d91244811c0a02146c82b3e3f996daaeb573a05d4def7a9bde9537bc7a7f6764f2dd6418d17a67acba7d56e4f1599a09a4850492268b5d1431f504969532430c2546c770dbfe4a1310150b872df021069f14184289c1c15aedeb5ab37c8a9b145ad042f594811c16acb956245f9652e40590bae9a13834c2c0744c45f7d880cf0a960ea14856c4e76a999a767345333fa38412196658a860e9968373c4e26995a7f58251b6c90026cb14c31085130c423cdff05cfbd7ebf858ac0542cd1602f460d66a93b87a1acea28866c47924be9c74ed080b5feda4e981a3ef53320f207313d98fa57838f973ae2af3ae2af26623d5134d543b7ba79685bf58bb4728fee5533d1a2ee9ac1bd74acf05c4cfb955859b7788b4477c86c10ad9f2f548cc8bd400b6c322ae1d60dfe281ab882939ba96eee0d22d007e0c6daa56ed18d9c78f7e8464fc42dba319370213fc32d26e83b5916ba81b06cac9b8fcd93bce406a77acdf8232b34d21a847ad568ed41bd6cfca604f4bb4ac2d2280fa7cd1271da2c13a7aa5479dbab97a3dab8bfee66d96ad6e76c2cd6c4e3fdc8f7d056fcb91f8bafb1ef990b95c74576ef33bdd9ee9de01a3a839e25e4d56e6f9e606c2a502763d30675333713b1d67f8cd394865350e88554b839a3b73fca095de8b554c3b6d007560aac73212b85866da1ce7e6fd82515aac09a496a81b7cf3447d52c64ab1d3e1b70c95ce91598b9f7634c10934ed8c5cf18671d0cb94c2d13792a8b4ce94916e96b5af0efe9dd8f59118bd47b8c508c1922d294b054b9a395150623f42bb03729ecbbc6029201a6b3c2708f9915da4ec889e54daafe9604a5473088ddfbd12076efc762816722bc15e1ad084f14e1e46e91b3385dbdd60fa6d554bbf7c9400bbb03380c4ec668eb674d885885e8a7a84387e9b13d45c521cfecc5434cdd9091d5cb8c2e97c7dc35eae2ee3d3269b607d36ccbea76f17d04287e2d96e96395d477bd7109114733a78239738878897eed42f475843a966007f6fad5aa94334b032c3c930658f48b6b6f4a1bbde8f3dac557ac39536666b7866c35648b8286e66336105cd544ef2320c3203dc0bc1d88e82a4ed1e304074322f6c323aea4e1bb9dfeb05aa03a52c3e17172121c732d2e9f308ba13ace10ab59aacd7181e27a88456c5c8fe6e6b8680d1c17e3665738a6c333d4e8c32baf8488a1996325739063a71163cb4af4a74edaaa0d0c7866c1d936e63589acaed76cfbb5457d9d1628495782f94920f7d14960cdd7014e8e03d36664c56ced98adecfa0db673a2c80e6e916d407e73bc1944c7119ce452a5ccce86372779a31e1c9de4d2f6f271a374d2046c51a0e6de0033fdb91d6082e2412d1d60521dbc0a56aea8417c1c0fb2e30c9e144af4f0c7083f8a839eff73847ea601cfd838f4ff1221013b0dfddf0cf434f47f89ac5dfa675bd89367ea08ff172d45514045f4f723643f6ab08298a63580924bb26ec5fe62aeb7fa7dc3a5d7f78bdad4c87d9794e27e4add7b5fcbb93ae51edb2975b7be678c65759532a54f94c0a7dcb76f427fabb88d46f7fc62c0fb1dd48aaabbe897ae2efae5401755a5fc033b497b23ed4af130a5eec37fb61b0f969f4e53d1c93f47b63a26e5666f6e910cbb87dd7b234f149fb4d1fbeeb68edb625ea2bfd8e54b6601b7a577bab8ad60127efb1c74ea99f0c50835e31eeab8079c96e8972f4056f7aba78d2e742abc8bc9f5c7c8158b5f3eaefa5bd72efbadd865df4788e16d84625c6ddb0d6a7fea217b3bb812db412d5474c7c8c80c5163b7473c5ed3779ce6fed82b21d40ac5ffb621e17b46e96ef7a0c4870afc75b649c362b7fb3a92f23a05fc869195945aed763f45728f50f077121b1df36b24858d71cae94a4aea77bb3f4528b14a0eb7bbdd5f23b4c1b3398ac49f1cc78042146202368842b4c48508af71267e56f8481cc51e174a38b941bf6994fd5cf743e147a8a09ccb4f8a0ad1466bac8ef62f36f0c6dade94cd95dcb565a0600315df0e28deccf81c562cfb6e078c7cc41ce473b725d593d86b20a0d2be58646b2ea8a297264524e586c0a89906a2175c335a95143a34c9259346c250ee2d9ff13a40a4ebc585d1850dab7bb5de469d34a95448d725bee09f5d66ae1764ab70d58ac452d2da18450981b9d2f1e942be5a061b5bf743beb7e1cfbcca66cda6a1372498934d757b17568372e495b24d6a72b63416518c886edb6ed7e513e8a57ab840c250eafbf4d444ebf1ac2787be57c4eb4d2266b703277bbb8192480f47467d5794cb75c5e439f6a6c41f8e505c754fa4ba2783289347a3f71927c99bec96ae69a766aa673a71af6dcd6e8cec6e34f729cf87f275a2dd85471ef4b59366fb682686a8f378564dc8fd639c246d02fc7576df81f9aadf07d63c5ee1a31144a1bbc8ee4ba4ad2a8975d4ca2c2840599138fbb0d156c4e05350491c3147b9ab8597a01228f2d2c818ab84a526989f2c585dd6348a5539ed4225a466e1c584bb8588815b886ed5fef0e7360f7e608dfd516a68296b1f1b46adc7349b54abb0ebd596e2bfc9d5c5f0de0db9f27e25d59781a5f93d1d0d8c6ecdc9a93f2a27bc53cb58d9d17b438a424ee93a68b4bdbb1ea710fc58ea5344ea1abaac8f4cef19498b65c6d6bbddbf46934c4a562d3de9a6b248a4746905bb3d92c6475d4bef17840290a596f6dc06ea83fad10825f8b1bd0fe8934cd67ce84805929ce6004e12372105170b0f539468dd3c1167881a62989e64cfb0eb8d4c4f0647f2a10c0830934fdfea6c649150077128cf5d5a29fda9e5b402140af6a3147bd9c1c46a658bb4136e334595eda7cf79928d46f2556473c5015869ba3f513399d1b9da348d6e06cbd6be3aee4b312ecf7c71e6972d9105ca69fc9606dd3af69a56805aa97b6f67d073ec23dd1620861d1641b8b408229d2ec112c212e571dad6b0e7956a76b593e3a3235ea2586a652bc8816169e42a511817795634c48af201516326561341a70e1d4d18dbad33eaa5333a9709da34ddd21a6b3d10c37b8ebf0497cfdd389c5452f2184b9d37b960b8d603aede664d188edd38343a5f64c6e625aa76363f45ead912456659d402d6de36020944497d6add00db64e1feeb4123189aa5f38954c3c61833b756169f0226a94bbf1fe92fb9f695926ebf1f02f505a16fb4845b05080aa54bc8f5579d7d59652f334512eb372200da8fcd2b11969850da3f9379c360f2196782a4cb36602cc718c0de1d29a489401af6ee621ef58c9937addaee18f640de5ec8f5260bcd8cac787ff1cd1442b4a9f0cc2d75ddca6e076da83d2329ae931a955295b26a90d28066f6d38c232cd8f7701acf0c64ee8b6f9ebd0ae793acdf976bbbdfe7866ba975060181930ca76e370f010a584a036115a7093208dd38c41c89cec64c1aa1405d178df296a066c1d5d3e67edf3c71d611506020e741bdc63ddb96405ef7a56823d2a32c08b8c440de9ae9a79392a0a46ecdae02d6b47344e1a3ad2d5febcaab0ae299899bcb7a54ace869d9036a9d038e18aa64db9302509441e91d320ee738b35f4f541393ccc41a9f4f2c3785f6d4ac10ca1a50855adcefaf41ac7655f199c94fdd625d70d5688d226b5abba97a30365b81be7513e7087d03620cea88888ee7c102a59e88eb1551b64942f5b656b3d15dcf2d746566a2ed76409e5a14589c2a4af46f11fe9ba55bf5af11808fe59f23b7a267f8df223932ff12ed1de4ffceba63227cd60a9fb7c217adf0e517eb9e89c0df7e8f221a327ae06915902f7ebd12d11cf3bcee449e7fae825a9a3fada0c6f3ffba0a6a1af7ff450a6a2cfffd0a6a28b6610f43ee3e1c505aebf763adbc16e7ff8594d7fe25122c758e62ccf22f545edb7b2cf7695590b3837a21e70795442e3a3546ac15fb19ea23b45aab4fab9150bd28a95e8f07b54a508e230051b8e75f624fb924ffffa072095a0aa0ec8a21935df1591a279996ddaa2c83e53f5e05655da9a0ac8c0a0abad55f0f5a1965809b6a28267cbc36fa271564a5217fab20b75a81cf43a6dd4ae544a9a2dcc39331bad1aa2877962aca8d72dba43a02bdab7a73f0069e8c45b3d7cf17f0716b1404bfc5f713a99332c08be1b765bc04abe777325e5d7cbfc737931b7c87ee06f86ef85ec4df3e7f27e3cf64fc0bfc66f20e8337f81d1c8037c3174a8be335263960680b27af8d46cb6ba5d1f25a4c5eadd1728f5ecb3570835eeb35b140afcd7ab8139f6225bc41aff5d2782763a5924b268b47afa592cb3f488ff5cbd43d50b10f0a9ad6b0380e2c7d90a4d26f454b9c4855a6c4dda2154edc87c9522b702c215a6aa58d25446badefba8668ad9533d610adb4fac60aa2d5f3425a2f5ba961d0b682d6e41e90615a1bf3cb860c15c3181afbd7e9e01665980d6e5181e3c1ad24b220b7462a45b91e218272ad219b9b91cac4a718a918e57aa40a241a3b1c41f9d231b775669beab29fad118b3638431136b6dfa43eac7670ae3c4f6f66de1ce793b5eedd2ddecc5673748fb78a7ead8722bd99f50b7c2fd562effbfdc51430e96eada9167bdf528b2d34e441431e949269b2af1aaa14097ea7a2e9818883d5a06880a5cee97d53e734394e8e13088f190aa5be295a8a9f02fa0b89d8562bd46edb0ab55bad50bb6d2ad4163ae26fcd88ff2a9d00b67a6fd96a55dce4593005a66bb69fd935605b69e46e66b773ac83524d16dd4a6dda6da5916ba518eda71837538cf7539c36539ceea7386ba638db4f71de4c71be9fe2a299e2623fc56533c5a595a2a9191cd99ac161157818e0e57f2135614b9382e47f177dc7332b74e69f5ba173ffc20a5df89756e8b2a52799e5ff293dc969c58236f1c16913239c3671c2a9c2aad2b3bc347a9645f7c9e3093dcb8786b2257af85fa47159813e770bfe945ea6da872789a59799687633b1f43213cd71d6b0ad863d58b007e8032b17d625212b97866d2dd883863d405da4d1df4c8ca2a6fed09b7e0b6cf43713a3bfa93f3433d0023f3c53fc44abca87e7815c6506dcd0f6cc1ada9e829f7d184915d087310e3e5ff753e593b9be580f141587744195ad4f4b173450baa04143175487b6a8b0420f87344351f1855aa2d249b7fb20c20f95d668f269add1040e93a6d6a8863cf8451322f54883fc9fab475aa5793898e6e177eb9a265d8df9afa26b1a6b768f694e27d957171d04c781d2404d7ea706ea8188437541ad23990c098abe483d75739274aaa7464df5d4e8b8a8820f2218d8daaa51535b35b274591f4430f8472aaf6ef24f28569d8652ff20eadcd85a4aae74df9448565f54154a9d35c0fc989f2859ebc428958d8ff5d7d0d23a1b14a6938e834a81dfa4dc5a29b755ca6d95f2a14af960a57ca8523e1c0788593aa71df5c3868e6a47b51091bd048dda2a3d56c3589363024f2a0aa8ac027f4ecf7adaf98427b5bef67a39a97b79a37a39c2fc64a3fa78d3501a8e8e3795d2f0a6a1345cc76ced98073be6411b32b6cb44a11ddca2a51d7c406b6bd5e5c7f9401b318693b5d430b64bc2f9c9ba81140e9b8007bc3c592b95e34d5be5b88143d1043ca04dad83bca97590d5e7c300174fab23a3c01ee7b676b22422ad510d73bcb4a4fecb26d72ce831e0e8b1a92fe8c739b25505fdc2842b2d413f30204b41d04f7254eb06faeb5cda06ac3403fd4d5e42b4ccdd15e5e3f035d92a2f4fdcba145ae7cd8b41e796b2844a9b26b6dae134cafd3cb7ee92f2862d4463c4be6e76000c33f80de154bbf8c926c933deef27cfb137650d4f40880f1365634c7a3192ced78d8935826288088e651c84a5b6bbaf1c9f789e796260714b4439c6896bef6628b3f0d019d27eff8855a6b8763bd0460942944886af1b135454d43971a535bb866139c1fcd91e9198940e8b8c254adc65b229a276fa0335a1c3e594cdc1c57f8ed02a7743bac8366940f12a976dbdcdc5573536dbe6946c29bc299597b85046e62b33543d5a2a5b947bca56e0dd76bdc81237d6c6247a71da535a26405a83b72c17e9d1983b479fb45e5455ac0f35d248e891a08c472344b052dd90febc0cdb9a21b1cfb49099033839020ccb6757ca3a0a94d6b6a4273f7de9ae0d6ea123bedb1945ae2371ac9a882ae1a40c080fa4e5fc58a04030ad5c7c0904d86ea7e664e12a94773bf36539038b9720d697b7b53bf8b494fd68752b7cecf42a652cf911cee93ae73d9ef5425a6bb3a5593a944d5e24549ab12569401d586a1356f779b7e9249cbadae42c8a71a50dc3a6a2393e9397189cc5ab1565ca1222caea5464b72352292d4b5f4ab51114d491c5b4394f4abf981c754c9d1a59e91cb2dba396561f15d3a2477a41428aa2478a86fde8525e274a6f6cf2ce94ac69650d4c35f0679268b7e2cd26e14c014d2b70605b586ba838149c70fa2a8d394aeb96f2e9debdeb6359fa52bb4d4ceebc6876ed63293b96ba6bcaa32c2c1a5d2a6289d40527494c0a5a34fb5474a364036281c4a68e4a6c244a3f919e1c148b8ff23a59d44c16a110b7d4c1f6fcbb5a6ce1bd201b5245a0acdd31ed5d1ceed9a7f6fafd4af1b3f636e9cda776c0971e323532a428e2550a1e4b94dad3c318e29b0ac4fc143d1acbf9050dfda351099587dddaf691ed2f077031390a00515c2a751d5b87193e6e14d5899179dde25aa54b8dd902dfda7d234e8456122995d74570c4142eb08496a5efb0dbfd563c536e44e77b67b7146b37a562ba74afc323697a8cc88b916a1d26f588077beb30401b71f0ac16058aead41bb5f0377b834b8d8e536591bc3dcc6697205a69b4b64a3a8d7c5ae99accd2390e50627a2a401c11888ef6cc38a752d42d4d4a49dd1a357062072a2144f6a4cdba741855b7ceedfdd5f6ffbbe79a9934ddaaa8c7b06c520c0690cc0adb4b6a616ec5418a33e9d9543a8454bb768a6631e273e3cb9740657c49a34b53ce625a80e000c68accc8cd790c518af9cc137b1e9f8daa9bf858f4483c6373516cacaea7459f151d266d3f35dd803d0b64b7c665a34c2056c10da38ca6216582515676f86e3a0f8eb473a952df29e4a66e3fadea500de7333a2fbb74c6a92d81becbabad43bbfc327ab3e5a4badcda57077f22ed638948830652e3b3c79bb067a4f2e63c18c01493199ba3da92660a9f636fb703b1b24796ceab951eab5d5d2c145df68a726b7a2b1ea5308beaa934bf03a13dc6ca388378557c9b6ed68a49d04c16920bad6e4159b5a0eaf437ffcd2dfe6fc42d56c3fece3e187e6ad06b378cd2f5734d4c6b654c5e0b94b998bc33ae8cf8d57e1ddb334656f5d46cd9edba26cba70da3d6b3543564c9b2b5d8599af57f7ed71639a324fcac5efdd66228f7d6c69e063a3553a536c34bf504afa62ecf7e64f13ae6f1add21fadf8028bc7d76b9def768e26f9ca3fff5e85acb2833fe96cfcfffc9f5675bdf5a6e03db3eff7f20aaedc673b95b0a4de02309faa81f0d5251254dd8e4c0a43419d4236aef9e2561be5e5ea48f33edf575afb9dbce76c8ef87ede5167de919d7724f3a678df17fef37167eef11cee7676b08319797eda99f574deefdb2179df6fefb9722e4f8d507ecafd992a65eecb17970738fbc78f74fb2208685164cca7282ec4fee3b70e66663b57ec8ce046190d3741e38111aa6e1004bfcaabadb08b0b3169250d762d0cd47d9442c2e8c01194e06056ccd106dfe52040b3622e1bf36d0ee124c3092278a36e94325c0022f65d3e18558e6da6608fb9cca0f40992cd058b8e18169fd04f9f4c399b43243ed41e4020f42598c8975425448f259c749e56fa7dfbe45d699dffbed9369a308c71d5349b71e107b84a8bc1c229e0faf8e6ebacda1c7967e6869162c40623f91c0890eaa5856dc65eaa98eeb734fdfdeb6a62f656bbc5c63b8268b29fa25b92143e2fabe61816fb507b54e7bfc901172c768c9960b10966168b4d0141b38a857f978314a2593c87a6f1687fd1290773bc7a363bc21867550864336f2ec7484c228832db9e76254635c3246d6f9b8155ef12abd928923eca11f353442b56ce3ff25090a5cb78b5a9c2772ce6fabb84beb4939bda06d45ee7b692428b01fe2cb6957d926de5525b89b9cb38e194754eacce22bea145c0e29c674ce2e8d62d2da17c6927a64075e2aa1d52599ea17ffcef83c23fffa0f0f6bf0f0aff3b1e145efef741e11f7050f8a179c18653375bfcfa759c862f38674d89b27373932d7e75b4bc3e249c54e91ab265e7e646443abe12dbc7a1e1ba5080c5946596e8f0486af20768d329ead967934a1449277f2d4a5fe539da68d15d5e27db1c1637d35926455c214ea68f34e554f0a6f43ee67e6e94e266f3437ed97486d9bc4eaaf2cee6a5f210a155a1dee7d28cc4913467ff5e30052a90ed0ba26344e0a4c5641c923ceae7394d395e26e5785231664fd439251d30e37ac97704eee247b4ca993069844fd01793425e0dcc62e9877296cee77e267995ea61857af8f34e3a5f1243ad031c4ecc67cdefbccc4101d1cb1c04103ed9bc42a00c289c06e6e330c27c1f613e9d5144e7be9c14866ab112e488a262cf480b361ffb13a6b3b39b42d3541b15905e00d3593c47e24b70ef0c2226a7992b50c6eac77445747076bec8d59490c84314d6abf69bdcf610a336ed58db73f861f16b733d761cc64a75fd13ebe68a2c4f5faaa104c7126b91b4fb42889a1ba1b841421ad74286844428c47193842ceb74614d4242b4c63fe6204633a76a9d63dc85a96f8d95831cab5a073976e9ce1ca215d6b4aefdfc4a0ded68c29fb5cf107263d0bcabd8228fac8304b70f127cee3f9613fed578fa3ad71c96e0e78fbc03e703c38fcbb714f529e9107f5a7432ea823650f4a9ac2085d0b7b13a80d2e1a3c0a798e71471682f2f5a82476b28fc1cd943e12f4bb48650da3d972b176df14acfc3c94aad8c27e8019de5f3897ef92cbed1469a5001d28684f2fadafd04bfda530e169e4acb5513a9c03b5bce3145a2029c22fd663e95ad44bc04b770d270f0fc44a11a63a945a20a0de415a13ae63508e2ad24885bb1d4efab02536baffe5e33bec55d2cf8b9bdabb1c78014b4e7f90b46c9c7890c8cd41b5a46d215158d53515a3867c771c156ae492c6d01598f64cb204b0bde7b9563c5f800275ee7491cc45c5b4278c8f7de333695c74f2e764d168c1bab067c02d3199b63e70fce409b3c0117c70c5d1c0f06ac7e125b02875c04949e8e9697578bb3c5385c5e91d353e28d83e5e29a5c5fd3d3111905cb70b1bc582e97974bcf0bc8621c5e5c90d3f09a2c97cbe5f5f562747e3dbe7220fa98efb9373a6a1fdd537cf2ef1f8ac10962f8e44331f89713ad27c75d966dd2506cb2ee3a4e51217ec93d0a448c547bad8fdce22c13488e31c0c16ef75822f568d771a075ae4f6a79abb29815c545af110fad9b7155a6d625dd57b97e64be8756be8716be278e9123b10b6f920425ea67a37e227104c9f1d168b27f67d6ef03da28994a215c9e90808214390eac424c8678f63abba3ec2529a8318526cf38a2392f66740e29163f02e629f75ff112389c91b4c809a32977ac83b0853f22be8796195b13ee3b29595347f2541cffe4b2d5c2a5f734a8d9e647e64bae67e5f3d9788e163e9f9dceedf4e4733220e2f3d9599d2f2a9276b648652b54b6a4594f54247bf57465d8afe7f6e96cb7ed7a6e3f51cf6d773df4fe6abf1f7e002227442bf9359e43b4905fa7738888ff004411d08c443c5563e13ba230c72efae2cb8aee2ab051ded9a1f2068e336896ab2076f90a623741413eaf29a77f9faa0f34511f5446a5b43158fb76b396e0af80ba0cf6fbe277a57f17700a42b118d112537785d698ba0b2417fdf8fcfcf82d08d1f8fc5c60a6824b155ce8e05a06c5f1e9c8433976be12dcb1bee91095b9c5665170068623387572b65a38be23fe425f541e69240afd7b0ba720c0df4b084ae4c72d6c4abaa403458a2f8edf028a4e2f3cc134bf05291a799ea0ff6f01439552652c0e6bd24f169562ff618c32cc8ec168984254a82f729c8a5385fc164128c2098ebfba9854a3249a3a63a84019ca5080d87c96cc7587cc02c4908e9260d531339d524409b038f3bb110a5002abae8a8adb03dd9048d7f1a61f36f22369f5435379b5de1fb29644367de609c643bef04ba5de723a94dfcf462717533ab838067c48e171eaa7cfdcf329f7d367e393d3291d2830189f9c0e53787ce1d3325e028aab6ee7f82de0aadbad11d0cfb9708c094e27f6194e949e1e83d180433f1df0617acc5180c7c7e9b098309c810015880e4627a7a2a13a28464d7f0e454cd91812a6c720d69d4eaa5eded8bd9c48bff3ad13aa431ca81f1b12cde0856889d6863b20f84740207acc3efa915971921d5b13bedbe588f919189f9fa302c42e431e140ba486ac246461411612427c89239c480ee92663f12a4e49f22acd37dcd848b96178e36a6f9b372bbc7157fa7b8137ee427f13bc7189492f788717988091e71deb687832f2b435971b85340e2aec37facbd4c14818d394bfdfe61407ae1d34353c13f3c66047cc1784a6042b7e55c5afaaf88515bfa8e217557cf6116fdceca30ef1e0260e713c18d41ceaa632b72ce79fa4406afec94f35ffc4e7a45a11b830869e036cd6044a30208340db3d20180772a67af53cdd60320c269a118e71f2dc3d9f6e4ec078488601f43727323b229a25a63ec3800f5378b21900fe2c9d5ef89ee18565022e12a4432a128ced885444d021171167253bc11765b5e33254f8314afca4b42d91fdbd3a8020d5c6780962ac0ef29ebf3921487787ee0c7316f827b4f4b6d1d2bc7693ab48f8ec1b400085b557dbd1058448007917306d01e7d62d5f3cf3e66e1011f682030f626c874750c48f5af1a356fcb8153fb6e2a7cde207cdd206cdcc7eecfe9ac529709cb60b75d57685f4ec1bf00a30ddb2ff441f74d4b5d4269ab05202f67cbedb8d3c7dab90a8cafe5424a03e2fb9c51073495752b7c02f412a37e9c64972fd3b0a1d7caad09525ba926584b4207cc308a782e4c186e3f32fad3ea9ab4f64f549bbfaed6714fa76b5b00b65b8001e52c43f75d99080a1ace458ac507905b86aa45875a45834522cf6523491bcff1d2d1f7eaae50bfb8ed52e0489b5ee46030ebf3abdf0ea2223cc9e79d3d30b6fc07cd62aeca6965c74e1c3dd0803ee4683d195274b4509e06d9fe7fbd9518ab96b9ed1ce440c4ac063e48374301aeb820a9fbb853823b94959478fcfbaa26d87dd5f5ce3f59315560d3b80cfe527f079f7c5f85c8e9fac7074f17485df5616f531dfed2e508ad3ddee544d2ad6c421c6a717de498a089618ccd54dae1852e64643101ff3e7cf477070a98764321cf20934f18358e14194382c1104af62c36a74de9b292e90b18c5c5688dc6afb55118a71ea16f236e9d6d80e1b9d70f5c43f33b558fb0f516a41800c0af85565cc372b93a699ba6f08fbd861a54e722d2bcabf962647525a14003e1b8daf4a1417af05683fcf91cca34a045024fc99247178a8f09beca37c1dff83cd2f1e4e6ca792f9be53fceba10c8a1b94295f2479440e2624ea8d7ed5ceb66507ed69bb490fc1f8fafa98ba6c707e75794cddd560343a3b16e7ce93113d55468637eb382569b06729425b67ef2ab54771ecb213491d71ecaee417c3b1bb905fee7834be3806f41976bdd3ebf1d5949e8cc6eef5d8e76e9edd014007ae777e0e4f46e2078ddd330807eee5e87c7c0cd22a4fdacc9376e5f12ec7e363c0aa3cac9987ede791169d5bfd4cdb1d8d7f04e62dd027f8fb12c9b9bf3f149161d30d936e98f1cacd6be49f5e78c7e2c454f8d42dd0ad4fdd5b447c33d8ba68adf1f80515208e09d0654bdf9e127579986555e0b61aca91b6f27843a6e2500c9c011f38a8e70cd281f395f86503e72be8f8229274c78a5fbbb7060e7414fac93ee29b2fee99c4a76eb2d733c9a19e395cc167f54c72a06792a77a26f9d29ea1f75df32f3f843aa250676bb7bacaecfc41572593812ac35557454d51467de198fd67197ea47966a94d1cf7fb598be9cf5a4c7fd662fab316d39fb598feacc1f48bf8d356fca9156fc4ec4d2c06cd4a07cd3a06cd22abfda8e6e20f0e929e2df5605d7de6685de9e17abb5aec93ff47e6d7877eb4f2eb133e5af8f571beb540deae16fb0ba46362b3d5023883ba023587eb3a9ae1051433580a11c917663bb4147ea42ca029272b7ab8f56265beadba5df2e003e72b4776861db7b2e216adb88515d7ecaa06065fd469dd78a99677e3b51f57e3d5e8d8bf6fd1873aff7bb2a64f99fe158db5af75fc235d347926561f783d3b4cb28e3c38dfed8e4672667f27b5763a9c188885107e6a45493e1b31bc2f329b3a7fb4423ddc1ba19ee33bcea476be122bff37a9ae2a16f5c4a29258d4108be2b550c4c959b68a43ff9b5f5eadc98a560e32dc3771c0b2225bf24a3e07247d2f3861fc659664ace00cab1d80a6a105494d4f775002d50147477422ef106d76509f1d8f4655a3c9b351bfaf3f9f63cfb2bf7dc4763b790b718431edf7c5e785f57d6a7d9f59df57e65bde6388ef299097035882416a317e9ac04388d42d423b49c70a9289bbb0daedea7cd57e66529fee155d2739f274a2b3ae4457ed54574fa5126964bbdb69c48250c814c97e0186e9d0296e3b52dcd629523da6cd76fa76c5f6426b60e0ef777e8982244bbb966b0274eaaa9212dd4815e73759182fe380f0a6392f64b9a4d1aad09b2441d21e77a5bc309bdb0e4b38accf8546169d5a4b56046a59795a2d5ec36e8354ae63c53427e20c43d3c3479d36eee016558a11b0440bf6c5056c1b0584847dfca2ecf7cdec950cec0b8a58368af81d05ac1b05ac18dd160149bea4845513853cfe922e583432ab042fb3f5224ebba657a599f305f3ab44242549b6ca36c5d37859d5826f1b6805d93a4f0e39eb3a50c24da38475966641c4b235e171f0f985bc6f756d12f3df83cbbb46319cc5e4b05c622ff35d3333e5ec4b72bfb1734b2b332c5bbf1571871f1bd617dc86a03c96957448aa5153b877fbc7a49abbd41122d273cc94ced8dcff1e881f082714a7652d71465c9abca1bf6d4852e0ae4976a45cc771d8efd71261430a314ed4c9a5414913add9d3f1f2dd6a3778647e0004cf2dfe2ec4df52665ec7f77bb7c1a994fea653cf4f77bbf396a04e0a4f506ce1022022383d1979d5569e88ea40ecb22173193c2603e632b41290d590b92b0559a185802c86cc5d28c80211012143e612052102c9ffe3e4a4f72ce23cf74f4eeeeeeedcbb533763ab93f76f4fc69e7775f2f6db97c3bfbc7cf1c7b13714e1d178343af94390a59c91820f99687d48973d20d2f47ea6ac88b3b43786a2d4172949b60fb4c723da1bf702c9ebf4481aeac79c858c90e09e29b0a77da4f516dbfd221397511292459cc47cdb32ac5177a2ecbcb4126b49152dc05c5b80257ab8058003d73b8727406a767d6e7231c271f1562295d0c3d7feb881b97a8b535d5e1e8d1060fb4a8b289d700cb4a78784ded2c4775ebc7050113f50df29d624499c12ba3266b7135162befc94e7461b0ba518505724dfed74fa96be1612b98ea48d2be745f5093896a54d74a6238cd37edf49085b511d002936251a518cc2902bf4d2b2949aa612386012097543e9bc78a132fa3af44295ebc7983cc767eeb97527e934234f9b51a61c197759bf13128b2e2bf8a7070565a8d076afb03789319082f3c712ba711a249b907e47926441828f8a4997726ad920e90c4834a9a25f1bec4d36b5e7accd600001db1ff4d9660ea136d7ca5021d6b804d5e6bdeac904282a90ee55a27a352be16e77144f0b1fa4dd384a1f7a8de6038a66ce1f96d238e31f3ccf73e62885b0d42e001269a2a3c08f446caf8b64437d67e92daf447292f2f8b70dbd8b622ea0842ec24b0791df36c4773c99e0b70d591316a7d4772e97cb6578e620f2b061aa0c59e582c62b113c5f9e8781831671f19bac6249cf8233072d12127cf41d8196f84e8388862459676928d32c8250c0450ecf5baacfdb384b28f79d2b325ed0b183162cbb4b7d879c8fc9983868b161c9f62ecb42df09e9e2eaea5282525ec4344d89ef507249cf43070524a45c157dbebca6c473501011c619dd14ba399e8465419608decb09c717d723eaa020632411e85d2ecf3d194c97895852aab48bb3eb731a2a7811271f45cae595687cc0e27591a5be1306a3b35301d8925477a560324d433def6aa1203a8177b530905596843465a2798babab0bcf8019d9fa0eb916ff0d845299f7e24cb443835a893e46e463ec3b8b707179a14b1287d99413dfb95ad47864497c4b7589e7e7178bb1c63893aac3a2855781a92563411487be737d7d3a0e0205633454059a44851c64dfa1d7d7179744c328d1555c2d17c195aea2109daf7ae6ecea34341849b06af57879b63c5b36c0b405e61bf6db268b0bd9bd010d470a6ca6d2f599e785a70e0a29cdf3389543363abbd690e2e3d68ccc42cee9305eab9a2faec57f0da036200b57663e8ce8b51ce165cce882c562ba2fc6e29f839689984a667d2d9764e9396899315a70dd13e3f1d542a6dc04511113b9ae1cb422715a2c329689a924fe3b6815650537255da9f52be68a2837bc14dd6ecd9c9090f3b100c9565c79e2bf08e9197325874906b73449b23bdf21e17229065d35d3e488b2946e437aa797bb8470d38117d78b3307c5691893548e7f109e07e78102ad32df3913136ceca0f836635bd97e59849e934b8f5e5c050e4ac8adb40ae43bf4825e2c490d59249b2292f9bce5b900dfa5ba0997c1524ec784aeb33488e2e552cc35d1c1829ec803a51a1b128657f44283ccbad68d5330b900a926661254f5a3e99b255992706c62659786a7e27f0592485d7b945e7b35ac9dccf4dbe2221869905925cb25f1c42a51c06a998cbdc5985460334baf2e03baaca0f532b9bcba6e026913c8294d54090b2f380ba98657ad5c2e9754a2bf164b61a93f352aa7e3203c957d908aa098c9a25f2b6222a7ed9ab04c3447cc2f313c6b1ac69bb5bd895c5c04a168918aa9e9a118360533d46541cecf45d72968be6179427de7faf4d20b17065af7d469b038bd1c55f09aa45c2e2eae28ad22a4bdd36a1d2cc975858b4541ceaec291206c2a42d11035c12f47e757e70e5ac7615acfb1d1f5e8fa52b4364e79c02859cbdd702986681d177ccbb2426f88546098050129e2544116e70e4ac92df935ab8844484928815bbd55780eca92302181880e97e7a2df25bd56ebd4f374306464e13b178b2b3a3e75504db9c9b94c22c3b219cbe59906a9ae0ec9a5175e38282709b58808a5f44a8c9504eb297eb55c5c5f2990d5616449a9e86401b6ba2b5c5c7a82c6e624275b7217c5b96cf4323c77504e4910e59be55236992cae05886d0411b93a3f5d3ac8ac96c00b160eca93cdda77c2907861e8a03cbb0b0df55d7854ce443343ae749731baa041400cf8e2e2f4f4fa5a80450788d6b3acd86ad6426c46623b62d996e8257236bab816c35590304ca84e77b5383b1f9d0aa05eb6e4cabb1c8b701a9ab29667e4ecc27390b58ae9d5e2fc52428a882692b3589e8bfe322c0bf1cec7e35084935b4108034ffc775063c9d38583ac897d41ce25b1b3098077e50902642f7f034af51227625ab697c1f272e9208b3e9c5d5c8d056de7823686e3c599a0d39c0ae2e969e2c9a3b8e0a263c3abc532bc7210cfd68467725f383dbb7490bd9e3cea859e83cc6e4ce9d55834ff2ea2848bc512d2c5a9089a6d527f17ebeca3662d05fdaf09956702665a12499c4af41a276e44efbf971cefbe74dd1247a407c411d236019fd1593a9fe3b4167296e005ac35bb7fb41f18e39cb0827e9764443e8b05cac72685bb1d7de6ed76f4b9bc1ca178046db3196fd599b6e35168d7939de1e848daea5446171cd781ca3648a3ea1202aaaa72469ef7957ebdc53ade5d7f46155f39f2717aade391811415c0438d2a21444cd628a1af520ee8718a469e548a80882b0f88c3143e1bd1e1c574e4d3afd213ab045b2deda5d5a91918c9caa8edd9f507fb72bcaa0f8d2eac34df586946b87aa136753c67407dc7195843f0bd3d8acff0488d92e71dd38168be3d5aaf6cbd10f5440c8ccfcf8f9b9dd1b8fdae333f5899451b4ec6e7e7d2f0d447f41dfa1afd84c177d8997df850ec3e7c00f3017006e02376c0d49f0d3f7c18cca71f3e84c71f3eb81f3e8483afa670d7881010070e1c3843bb0f1f0a99fbe37ef0c387e2f8c3073875d0d7adaa3a127f6e518f2fdfbdbbf9e9fb57effd94def5ded2d5b7f739f808115b2d6c88bc471a7c27e1a41d419cc1d7104545d288888a44e6888a84b4234c8edb56c4adce71dbce71ab73d0fb53ffe4dfff3005336f784d86cb17c3efe68fa3127e2afc2f2722efc57ede712b6d4758e53dfb5df576e371f5bbf0d8c7abb4c8d9af967585a39f5c33ace68d54495d7a9f678c17d3ea0b27fe5d9c86d99dcbe3742b057c3829c11bc223f94cb72afb3bcba607f82ec78e89a9898f7a76daefef996a6b19e2e878e6de33f4abecf46fd5ef3f511d75e5c357b60978c630c615fcc87cd73a8753839b5f55280dce55cdfc3aff4798a2ae8affe97f9575a75fffff6ddde94ff93fc444c0af9f6522e0a77fb289805fffb92602aa4efe63bd36eae558198ae4fdbeea55ccbb17cabb4d4e598fdee78c16f29a401a8ba4318f28eb2d684fe4ee65acb17226d4d217d6a82beb12804b0ff926123d5a44c0d78b86dacba2bd64ca1222deefff256fb9bff8d926743fe7a65665025955f6c3725a77a305eda45deecd8dc4f2e6a632afd5cc6538be1a85bf34cc6681bf1c40a26d226bbf46cc9124708d06fe962b6fdbce26d53738354d7d4b97090df86e77a4bf6ada0acd6b58412ef662dd2222eb46920e8afd23cbeeb7269132a9a571969e380ed95cdaab0c88e4683647b6ed75492b8ebcda8256f57ab76efa2f2df20b7ec9b1e88ee95e15070c09cdc4249d4f984d9218e2e66d6c4aef80b1f2e82ee234d44928b214f05339e96241d74c83218a4b685faa5b97b615f27ffd6f0b76ff7c0b767fcbb531b1da7abd45ddded22565340d0c8913a7e95e448af47ff0de82527138addc01f486bd425040001b2904263474ea035a5df79f1b64e088ef767bd679b9cd19d5d0a944dbe77559ffd66992ad76db2ca99e1832b11ccc6cff59e901429bc19a70bcbf1ed37ac28afd591a8fe038d5335a9461cd68d3d23fabd2056daaf1fcd72f311da793fd4bbe6f818db649dc519b6d7cd296a02ef9291b6f159b689696247a7b07721b494328d24f5b99d33656aed0700427ce0f463103a72d7e575ef03620f29e50d9727e43729967b773de29074e6947cb5295b83283a7b39cfc3b98fa3fc5bb5730e560ea5fed4617bbd3310453ff6542d6390de15416f22f272ea785e4459a4dfd87d8c4733fa4afd25ec642ca44d205ed992448662002a59e5a2685e23022724b7ba4d761afb1a71caeb82d437b1aff474d3af96ec79f57c608e5a57b6d9ab07e34e521d6b09c33499ff1493a184066e84bf56c560a0d68d870c0031f050dccd694b3ade06cccb71bc6459e491500eeae09a72c2649db8270a7d567c31852e84bcd8a5c14bb2679a3c4ea1b96a02e5fc4707acf378c8a4cfab3913188e224643415f1e6dbaab2443cdcb33634a175524dca6b573a2666e6cd27d465749ddd8ab6211a024121ea93681ada4799cf36b33db503fe6389b40545a5c4dcb49fb8ffbacc533e7afe9a8314cd9c2a9b536f7bcad09bd517ea141443d4697cd925a174a6d88ae6a6e51422ae13fc296f5ae9726e6e78c4a834aa56220295f573167619663442cc692568fb98ebd77df41e4034ba803e2d51fc746695c73c6603d01f958834e6af1947b102de901c6933aab3398af12bcbd118a91dc7d081e348fb4c2bca019144e8289324353ec2f8556ec8493c918c2f205299433e35a49685c019c88623f815d3e33f3711445bc9c2ad3de1a09f9a54d35c3891c8576d916b5cd9d6623da515a74214b381e34cb83677b8db293ca93eb1025663494a4494f9aeae7e6e6334050c37b61e44a0cf0c7aa2a84dfa31cdeed2cf2b2cc65414108b8c41966f3bf4e3a83c589b62410c4bf47d5e399eabf76e444af0905b62a12cac9eb4f6fb7bbb9fdcad9e30012aa86279c8aa2495be7e422037e452cff222c45a5ef5fe4f6fbffd766a07fcc73fb26c93fb34466f6811f92fb9fc7d4dd60bcaf81b4ddbfcf719922a38fed7147dbd592e29fba3a6b57ec83544acb378b1e1d4ff2b456f0867f1fd99ff16fd4cc50e7beadfa1777944196d654f33f4729b088694b562f20cbddf2cdae9ef097a99a56de83a43afe394fa7f8ce5efd7a488830af98f31fab70d0919e171f0357d88297bb961b7f4d45f14e8e566d102ae8a1205217e5c319247febd34bb12d0443a06f4ffdc089e867e989728093110f3be08dd265a502a7d9b6e993a76c89117f475106d0e97a25490558f4e1d3b244aa9838ee494a210e561c70dd0ef3421aff828f405bb86ed6141fa66b0a52c7f14c7386eae67fe2d0731b47d8d6964275f6b4637aed905b2ef702ab3b807621c4e11e9702a3be4708a63663b9b622d65ec0c42e8dedc7c2479b149e82bcd22600acc595335d9326effaf3948a7b3bfe580c3b93f9b439449338af5c98e57fb5de3dc080e2d6243a56b56b7e584cb1c4000d76f26dae8c2199d9b8344c72922ad1e5bb433cab7177e2a1d54b0122c72f0289deff98fbf1659fa134bfc47e31fadf31585c83ea1fdfe1177979407519caefe5c64a960001b007ce421ee66e9eb8c84521319c958b9cb4634edb666ec0a1c80206b1d89dae58f64f9dfc5695c44a6162a6d5e8875fd0de144995256cae5b54f38ff6854a22a8dff688c493ea659480b7f3647499c7e141f253ad01580ba32b19ea5bb1d75659e9a1d167b619650374e971970244519ca3a7b8942d541cd32064e4f0605dc2e6be0f464d011ec254d57714adf6ed2344e57f868549628ddacbf89d7342de22c2deac69c1e425d8fa21b9e4ac7b8ca1daa725d0c9c2092eaaad67a55c2e74306422b3ba67c8eaa6fe7d6310b8743b1919569bf9fba0567b241803e1f4f87179e3f3cf520a2cf4efb7d06783d68aa5790f3e088d8f181d8ad03cb128564f5260be9c1297b44fb7d27942fad741bbf953d28676babccdd6e367f7ab95277798fa9bbdc8a3f0f9a3316ed9388bca6b734f92656ab4c70d2a2d4b73479173fd07a5cce14fc5558839c387414f4679258e05b9238a694224b36f2e549157da5a2d49e5d679277553adb8b0dcf64fcd75b83cf0f390962bead33b897e7baeeb88895a26f1d79e4a9b8f79aafa601370559a06fef394dadf688e525a6ecbb6cc302abe94e21018e8a7d2f661ab762b904e8d843d888b8434d1671ad260bd07e93c72ae22f71c82393aaab8b2f747d1b764bc449af8ef13a288a494adf669c340b3a94bce25f3412ad7e6e810ef5f38f59118bfa74e18fdd757d13332a2734495e3096dd6937f8358eddc974677747bea5c98f994574dcf3030dddcfd839a15b497f248cc741428ba7b03489dee5945a9de37aa34fe362f2ea995037e360ca43dd61e2bb1a7656228bf45813373c754a149ecad3e3373420f61cf5c6e3abbd061ca2e96d6a4eaa12c50e58d5d15e72fbd3f28b2a50c5991a7ed68ee4db0d39fbdd95dcda25aa6aee085b6ff2f771f0b1787a7505599684d95dda4a3a3a793af1da1a9ed1393ded485c7134754afbbaa533478347f9827c66457f61455f9c4dcd4cd1575f9ce91dcff2cfcd5422edcad97f6474c9c461b4fb6a50fa7c5744af107c24adbdab02f3ae56cf95bd1b295d4a25b64aa7b493d7e1d0070762a45be32896af5f4fdfd28812fe2e5e6f92f6db4f0be58ee50146daae8e7414fb32dba45c4cb2aa014d7077b141cae50cc6a20fe40b7c1114f3541e8be4851f6d738595b99e38f8f81d6b583da89f6621f5accb492517245fabdb0c526d6dbe51782d6105f07130a8117c4eddc692dbed0c7ec316e28d946b3a057bf88f1075ede905a01c2a75209f91a9231ae6f84ec169eecc01b4928b4a008413da66ee0e7b3913bc702d39b4dc9e304ca6dc37f5ba2bcabfcf426a365bc0678a7f7f15cee12475730d77ef3173ef9105d862e66e773bcf863d60e63eec765e696cfe737c9303c5f8cbcd08a2b486540c0844ac09ad780d88e23a668f676876883a5dec774806b505ddccbdb949e2d4f4475139189c668dfe786d311fa08e1015996890b98aeb4399ab183ce8c621949e0ac9d47084beb364d9da99a38d026b56d07778e648eb3a49bfbfe9f7933ddbbaf70eecf7375de00ea3f8f1de807e4e03b869006f3420c37157030a05de6b40d6ef17fd7ed6dd80a2bb01aad305faa2844001a4117c2543d2623790b9f72853532c93b30aa2a89da670ef51a1d2143a4d8e376ea88f2bef3310411462a62bcb9f7baaba252edcfba1a8618d0b773bd4f5ac2a4196ae409adf56df0588d046b9c790461c0074d79b84c779b27d1790843010403760595100ef08e3e56e277ed6d316c61ef2d008fa7bd011f2a016d4bcb88f8b17e92aa160e5a6195b93247ea000a210ca6b843d1449181a143728826e18dfc621d5488d219c24a6db3a858960836e5164f90bdae24bef3840f77818a205be1fbc213c727f7c7532ae0bda133e820d6a35697b2cf30559011610e95011a722e4a9966ce01399ee1b99eeed4c112c05710b44cd38d117d01520dd244959824c51a008c7e2535eddbafbc78addae130ca26951df518de67e811e25b9f71feffdc4bd475b3f71b7e8c14fdc8712c9e3cbbdbf91f08d846fdc87b24419dced2235e372497e248628c445fb6accaece9bfb85bca47d1da7d2ca48e84ab59147318361585f1616947fc7b2f58f599cf202e452d3487d9f7a62b73003bac456a69525ca058e21dd0e9c2cfbfda54b943fcb0b8cb10e54b2a0ba8c5912ceadac68891be2dfba7801967ad6a76325eabc80e81442a48b9e79732c3ad30447222817a2818c05e4c1869ccef1c6ca7226828d2ce702a2b3a49486851a517ce495562f04d93adf70fa75b64905f3aa04fc402b33c8db745a4456dfcbae7f74f6c5fa82c5b0ca1589fb7d10d67b6241b95cf41e44a1cbf4bed6844a1b201234422334d27be71aabb540e3048cbc6329e03d19792763b432fdbd8f0ec8d1a987d65ad8561fdbd0d1084ec2ae7be61a88578a0688e677df6c743456cdeedb83b86e2b92d15922b845b768b48fee4822bc9d6dc27945f0f4cd0174d7e4a3b2eca45857e021f75c9a877f22bde1287e0115398376e3bb7b645b2acf452d322526ad9ea989de7616ed346296eaa9b9d1696ef0bdbd352dc488580cd6bd7b8f429bc1ba77b736e001dfbb0fd57479c03722521af572932c20c9fbec2f194b4241604337c9b28f2f3858c052fc83b0140c7acd4b758b3c1aec59b764a5e2d5b4604fb0a99fe6c12adb84b17b734344699a09ab9833328dbf9887890d0f1337789800175d3c4ca2c07b3c4cd0ef27fd7ed0cdc374f266509bba57bbd36f8cab39b526f7c043820fd8ed46101eab3ed2a252141d4a9e7426cfb1e83514622e7e96b2e3e4eed1a54f5f45565b00a0b0ecb054d63c55d676d2a57be8014867743e942ea28f9960e38d0d897b9f8b86a300258842b415c16d157c10c1071314c7610bdb066a6a0a01e8d75d3113e58ac29c07677ed0e39e4c2f0dc226333a178b690802fd85c6f262a5db23b939ef0d7809959709bc19e403b01e6e86d13087c721bac54bb03a5943b4c54b0056c31c9eace1a489d753e2f3ac5aa1333ac7db199dd71ecf7ec9414d12d0bfe69fd9dc5b55088493ac7385df439499157e0fe5fab60f4a87c4889fb7561b07c83cca7896163f2c7eedf79be18a5f414ca62c62c1b2fe29cb7f6c65e988a8f28af5c7fa7d563119f24ac5b84dd36ec6ff7ea79b02675d942150e03dca50f4fbc18163cc0182a10f3338061ca20de64f2d5afe4f5ab4050aec45ab8366d1aa60594e9ad7c2f2d6484c5826bf3a2f906a8fff4e7b8ca56d3c3375e5a9bb3abdbfdfe654b9f96ff79f54645f315a14d2749303773ba0d5db6b286653cfe727d524417b290638d9073ec723c93fb3caaf9bc1aed6c092b235a98635d9af760ff2d5a854a7efbd1844f006c49f2621b6127f4542f81c931997d78b50af6c25f6a2eb989bd5ecefe9a56aedd403ebad7a08a35814a93833493b06a66324d18132716aa8c9bb80a6549ecd52ad9cf62429d282a0b8c9328a23ba6619093e98d7e21033d39a2ee51c102382a45e452d57ca928c09e6e029dc5422c0e16e57c8bfce1f96de529955a818599106b0100450acf1d363559abe8fab65141dda48e0515eeaf909b22cb2fa471ecaf465dea6849343345376705d34c850049b2e214b5470c2e9ab34ee3057f7d890e5faab0840733d2ed077d0af1badd761dd98a3dbc8062a8fbe28b7538664f5968431491c244eded02da46c1335a49f4a4c1e3710d39723f514c2b4341e9b3beef6516d1baa53a65c646bdab999f236a1513e87150dea94d16a190044fa8993e2ccac3bd87ebf0033a7057490536dae0e72aa5b6c670efbfd2c047bc25b54f1d1562950eb4fe8e95a61d0ba055618b4802d0caa59df8581dcfd51b5165a18580ba6756f2116c66cafa19668761fa284b51afeb3982856e76868752fae019a0dae4266d96b805e6ccebc9227567d69550c51d209d7d263b4699d64a23aac1b9f5b292a140557fe58a2a5f8b336eeb42769c7081b6dc81c3668257a94ced6fdceaefddcee9c4354292677592717b9d4367c7323abd624be4495c3667f8fe7430c07827551660e2dcf4f7b7d88b54f6dcc8c38541a15388aa720c50cadf57e007d90da0451a489058f27a2997cefd9440f2bc4516a6841134f94aa8d6e2dd57079f578650352718caa769505e380b5cf54049bb0994e13a76bf7507a352d998e05c809236bca292b5c46c27853608ce34329eec476f78eaea4221bc698ec7620dcb7a729a03336ff8c4d0da203ef052aa98528489d40321c01e9aab1bd7765726b5b2e97843850ec8aaa67f4ba3a8e4390c189d3b185a9be314f07aabea9007283d3a63e41011b717a97c31807bb1d58b63b21139db09c65f3cfd8418b433b682039a6baceae0715585422992be992f15304ae75f7b40fa9089cadfcd220c0ea5b723efabb41f19ac22f0d30344e85baa5310722ed4a0feba8ec27a834530e47d96d38c4401d8eb62a37a47bd579c107d1ed53177f685bc7bea99eb1dcd7409b5a2ff698c09bbd6bc93b41ccdf883fef70c7215991f17b88beade87dbc046908deb5087bebe586be6e94868e0e11fc2f9b5eaaff3f45fc2547f7e5c41fc57825c83fc1b7fac62c16a4bf858fa27620c6714dfa8fe2dd8e4041998f6e04596e10fdfa2622c39d8ae293ac7da5f085170a5575afe39482ac7edb3925530058e3e003f5d68498fc88c51ec5708cbe357b92cf708a98ab14337e60216578e421b6b75129b6993dbd517ddbdaa8f8decd0f6fdcfcf0f6c1e846eca227234f5e611dc5e63d4d7c3246196ecbcd274fcbee597353dbedd8139bdafb2c3f92dbd5e14424311bdb11c6ea35cfd19b36598fa191f13e7d13401041239469d17ff185a2ff27d2778bfedfcce2392e4ad6b597d6402c9295a5e231b7faf5640059bd9704f5ec4ef042ccabcdde6e9b58074928f8ccc69151ecb6c9e1dd96b5775b7660b7ddc0465cbddb46bb1db86b0f4b2276dbbb59f239bbeda6b1db46cf46d5761ba190e63cfa0b8b39f5a3e77824f5efbbb65fabcb44adf25ec21c35ba37b7dd6eefe8f6d456a8a7d9fb4fdf60bc389c446d1082997f67a8fefb36f3dea2f1e63ac3799a24cb648626b7e52e9d74d978c3b20ffdfa0dc75343d6648ccada144157c558e385e86132a608d77b20b5710e5d1f3529d0de3b2769c2ba4d7dba19e688c6ab880b6a7528c51ee9a9a862b5f0daf503777c7ecca497ac0971b9a6201478889d8c9107115177b3d426129f64b449d9e67c9b4bff853c952ce4df9a00a00e96b82545aa58d3430cda67ac8d9a99d32be3f593a2af02a21f3f476ef7f6330468e8a5e0a47ec08f656325bdfec44aaa2f173eb196725bcafcfb569392813eb9324c2d9f5c1b66cb5616e6e4275914e0b5d8b905337574b4b7ebdb0fa967de1c65cd4dff47bde99f8c51f139d2d009e9f7c9d307d4ec508af601b598325ca7f4c10f9de7b41fac735ae7613543052ac466804552d444b07e882e8fa9014af0dbaeb5d2b597ca0db4b55e54fb0f6f8ba4735b9c06b88ef0c1cbce2df2e5efd922ad036954caf3b5280635b1ac3b01a5a1bc75a99e04c610b62f07ebdbccc738bcf7b9ba1a408f71f822086851645d2ba547ff5ff2defcbb6d5b791cfdfdfd15323f9faa8404d1a46c79a1c2f82476d2e67bb3f826ee92aa7a294442166b0a5448c8b66ceb7f7f071b096eb29cb6f79ef7deed3db1080c0683c16030d866ac30b86d180fea4d9d36bd24d007b5c28ec13dcef55e02b166003165c5fe5f5d4b7b3b0eacdb2e7ca35633e22d8d5af288f3376814de7e19d0d02ef01ad0908fa3c4afc2eb24bea6acddd3ddead4531d1a7a7424844b5037ce0e11b30c416976ce7b06df37df380ea7e67b706f9e79a5dbd46aa33cbb556d159a6de2e237103b8ad53d4641c29b32fac2de3e18be69b7df5861507bfaa45df95d03203854dd2b16f5dcb17a44074867241958e9b96c0d721e57586c7df3980d7c0b3a665345b8f9847d9498188cbdfb0051e462182fa93b1a0bcbd3ed397c24a07a0ccadf843c0e66048bbe945b9c10899824dc1d41cdca857b3131de85691a92cb96c0c21f34b66e423a6b8581dbca5e05860d6850198da0a0090d129c4ebd7814cab3e971fe7031d2a6c12c828fc7fd359e302eb9789d5aacffb953021f30de14dd87e44e4cbef15d3577f3a02632883c9bfb75902e3ed0b3788894ebbdd4a38cf8706af69c1dcf2399fba634dbb72f1e3b4baf0705400047e9b8a20ef3c7c62693488ab8034bc167e565e6ecc50f2de1286799e09dd66b363db7fc95cf3dcc08f62f109d69bcf76588d056ef79cb00d0b00cb00e9fa71617b576db94bfbc106293b3b9f49a5ad00ac07aadbc6171df74a9190300f537d4f1e62799f1088f3df68fa88f75620ce095a72e0ec927d2ec13fe6b51aaeb4e1cd903f85a0cd6828e7c78a89e5288aedb35af1e1e1cd0e977446f8d0c616787c480f267bca4c638eb9b4c138013ebd0758038515369bc7f5f7a4573a9ecea49bbcb7062de8d925c598c7b57bb7dd079dd31c949cf711de0ca77a96bf893f7525118258cb6a896289ec12dc42ce5cfbc246553d064d9509206a5923fe625ef3843ee9a7821b30ac5b77ab8c1a7d8e9adf79389999d3c5d797fca5f77de8ff2d0b241c96b67b04feebaeaed127ead411cb542dfbb5a9a96034a0a48e910dfb361e4856af0fbcfa261b7ebabfb71e1c81fc399b7b46e7bf4e1c1c1bd03b8f04c712912f4884c0a5812bf20d94b64d254bb2b37ebccba8bcea21b740200e79e998efc716f0a3af1c81f77f0ee74b8b4ae6fbbdeac338788293073695dafbadea23307103def8b84bbae1774e6baebb1a5708b18e63e09b256b0c6e9fe19b20394ec937af6903e23c36e97827444c75e179be1888e21852180314b11de74582638b1ddae9fe7af55a8d2aa2b37cc9d595f2dcd2e06e2ec57057eb2d5a708f2947d8a33381bc0c852dee7ee70d92da08721f2285c8ab069eac1fa76ee64fc3adfbff804bb824a861446c0f5454036bed6a8b102aa78711d5e7a42395e9ae1c50cefed76a452af8b5919cacaacb62b436419c2cadc6debae479449d6305ad75d9cbb1b69564fe6be231f93ba6e38b9ea119780ce6b667a65be041ce0f2cb14f9a38c1f3c3f104ac4dcfa1dd80f160a82f771800bafbad864b28d458c25027ea12eb3a094fdc4d198679e1f8c0ccdb18cd135fbbc7905e3f5c4305c632f30c0d8fc010051b7f7c35a69919f3d7bf8f3336c69cf60873f77bbe06cf4bef22a6ea86efc7967f5cf10d7350f07b1557c436ab2050b34b7f02db40662a700eed800064577440f0fcb259c06de2cf09a3c8ac0c4eb3930f46c883c07c61e5bceef41dfdb1f72da8501e761d192209ebf12c126bdcc0a632322887d2e81020a13348970a0de435aa99f604cbcfb084ff99be178e1da90afe95d1b8abd34d75e4b5ef12d2e7e17d47344d25d1ccf6582d517490b44448ab5271248ccb7d031f74d22127e8be3b9f6798e48f695524443ff5d7c2d575fa26d2b82e6a17f86e68b905cbe46dc7bb7aa701e12659e78b25573749b25f1d7cd2c91594edee860008ff6e0c1d15824caa519d3cf4176d57628b6e38b8970e92570e6257051ce088a097df9a2454b98978b5c7a36bc2e43adca09b79e0d279e0dbf94336e4a0943ad2db6a77da82336d935f2804c82c4d2b1a47a2150805d2e8a50cb85cae7dc79e7dd33adeb1a3e7fb46eace12795c25f3a196bf84a256012186b41e20c9180ef3c15e6197107b124c49ea7241768926a3141f50ac26bd178514ae102ac465b48084ef8f6630146087701e8479e949fc860af44947589a97af4731a8598d08fd8a7fc6d441932be213839932db0545364eeb0d222ccff7425350b74897ffd309da698f6581fb29adee229ad341bb37ff5529f4ba52ee2450d67b0f85bc70f2c7face5a0173df6ea9a7589aedcebe6df59988e30df9d1f8b50e5ea8bd99f5c6c2ee00bf8169ec38ff0147e8067f03d7c03efe095675e54c650dd45fc0bfeccc9c43da2330fec9242f3a04973001a2fb47cd136002fd66c7d53bbbbab8daaf27a836ab7a7c58b2b93f6ac41a7587d9938b30201a059a2a8dbef983ac9bd04945b05205eaf4dcd947e59604dd9e1ed0937e5f3e02e14b8d8f33ccdcd2f5b29dcef8895b59c16da6d35ab897bcdbcdbdf8629c50427a67185576c9634e04f8019e67029af71bd3409d7aea3700c31fb75cad606edf60ec994ffc9d20bdd0c0ed5c0b139e164e9a11c2aae813a47cc845d7a31d0a3c4fc59db94a53783b23928081adb02771c1dd78fb5b8b0b54830c370269c3af007f6298d17e749bc4097e23819641c597ad89a2c298d0980cb1dcf0b1f1e745e8893f1bcd53b9e178bef73441e1ecc2fdcf7a2c90c27ae0aa0f8fb19007823b2be00e09ad7cd602b9175cdc0a6e2f7eb1ab040644dd94fa5abaabc9ac7cb94cb83017f60dc7a1476b930e0cf1c92f07d6a44fd1987333fe9acfee12fb1fac96cbd696497bb6ace32331ec16646eaadfaf9af09509273b77610ea9d01b681e59d51ed89573acdbf2887a705b2c1bd8c66bc25f1d80a704491d8c0f1518a5b7df7da5af53ccbee0f3a32f7b316efb7e5a87ca79cad9ca7f0fcfe00f77204ebaa50d5b44e5bad7f7dac75345efab36c2b4bd2eeb84b2fd5fb5c428dec71d6fda5a4c2902a3564e9f943b59f5cc6d4cb931c853ca9c27daec27d1e4ebc5b6dbf83766837e9242ac8400dd5dd6a5d803f9ba8c27eaec27e06bbfd61a69e427ea1345349351da30754a8ef85a78a58435fd58ed2ad7aac2c70ff481ffd877be8a6d0435a277cfea6a160bb4b2f298edbbf36362a925218afbfd569d0aa80acb555e9299ae30479e6dbf24aeb5c25fc7b89284e481813f8b10c745a4ef8504e382b2768b6e3193705a7d66d2fe0be0556bdc05a411b40f385772619690270622e44f34979e5c5fd849844ed8dc08f026e010a0e3c4e4ba597a5fc0fc27f8872e6710a3f96cba7d91b5a49242ba427f2160078266a3ae5571a3f0000df16519fc152d52f3a1ed1b707e0b9f22e917b23790b5f0028fd44e77d619e33dd9daf316bb2e7829ab7005e7a2f80bb430a7b04edf665bb6d5e76b411e6f448ed8e01ab7ebb0ea8217f0e2fbf897c5de841be6922e5b5bc02193203d23f31b177bb3b81b7de042eca7e6230b349d8d830b1e774cd95b5ea5d5b2bd021f9660c68b7f173bbddae290b8bdc3b9126e40ab089b6ebe5e81af75dc03adbe75183ee7d79f1f6a63c5aee360c9ff782841bd1095f007c2fc7cca7af2668b7cdf7e5562cb231d521d976138077d9a8117e740a032597f2f74cc2efb868bfa919513ae00a68bd9b6d93b092772c436eb164df05c67e51ad72bf7088f7ba2fa01bf8a5e2ffa74166412636fe0cfb576a5b2bd5454759bced76be8458684c7c4ef41db14ee1abddae0e07dd27906a265c68ac296000006652c486485eef33a26fce750a5fdf5a6f8ea150af924a71f94467ce42677ca54a980ffa7c25c1d60cfab4628a4cc66296958f5f99c1394ef2116136884db56d0cb0d8af7a59f9463f2731d21c807cfaba44090e6a94d97307f70e387f8b73ec3b86a041012afef1fd709d7d6ad733137789406e36d6b5544264bb8d45152973970b9b09cbd67dd3c492a73452b651de9cd25b59debdab5d4df931a1f896ce31591af037bebcddaa1c5f8589cd861fb72f7533c33832e02fdb97e00697d87d855f9f588c3f11f9fcc4426215fa6b714be0d145ebb6e0f926c2767b52db80329c7f32c075a599d5ad8c2dfabb61ff635367578b6cece92af8e3dddc5066431f3794d03b78cb9db48d7019fb61e534203f7790476cc359d018cf31082c8efc4c0e7dacc50cd07648e741764fd19c070a074ad3f09214e37f6d1f0d540ffd998568e011c108a844ea2a5ee512f1ba084c78c06efe5c73948cb5e899a03e085abe30ba0cfe7b11e6ae032dd6e575f0df8875b90a0ab12e570d447c63accbdbe0ffb7b12e274129d6e524f0183bfed3b12e57c137c4bafc12e457356b98fb0e2d4e64742679094c5da9f81294e33d895b311e7e7830898761cff13c2fa3bbc87c02f2b8f9238268788d5b7e1ce0b101b2e0765844f01bd607c1c57f63e8db4c25f090bafc3855469a02991f0be1967ca8024f251a0b93fc3e3717853c42e375500deb98c7d36a54d0f89168bb492144b5f358ecdd55602650a903c6d39bc0bb775ce31ca54c97852a2ea022bb45e3d62c8d606b116194e2d602a5694baeb71807e7139ca42d6c5d5a0cccdc3bb061cbb60e07ecdf7dc0b94b64604001955c4eccfbd66c89dd567f3080ad14d165223c5fb322b0158597334a709aba1c516b0dacdfc9efc480fd47a9445b92894a74f29f7f07b1b0c52f91f38f9cf0bd8c70c4660e3f4e125683a29e118f5afcf5422688c586a09608f1d54a3093654cc43bca563c5505654dfbae711a2fa380cd4297cc564014b704af92cb89c2324de279ebbb14b642da12f28783d677a9c431d070f0f0752d3ac3923c81c06a9d4be292f83a0c7400a4111b92d60cdf425633ff0741c67bc665d6052da25c708a6a0f36f72e47f278e7b20ee33dd5b707b0e5d87673af263890bd7a99604c5c5164c2c6142b9877dfe1a3946d257715d284007e3381baac69a3e4a8915a46ac742e23d46f59c83e5e4e782e64bf90fcf9631af15f8ccc1fd308c90fa1a34495c7ae511208249bce2434a578c119c5a4641e07cb08259f7c14e1d60c470bac44d7b1732c821c852269c504b7f8ad0856039626458bbbdfdc84994923cbe2235655e3b8dfab6be95c81f2dad8d04c5b1356398d0ba8209b3fb04f71a0d183e74ac6274bdaba8c69cbf82e355805df43a7ef7eff4a15c9c602e6175dd8903016b786987424bebc7e46eb344cd2a26af82e3501cc2ae12147310a2c59dbde5faa2dc57e4c822754b7ef7e5f92ae45788b23c94a9315013996a278099828bcc22dc3e94bc29cbe423da8a0e6fdf137603e708dcff152ccfeb984523c5f444c3f72010a53159656cac9a128b4c814f792a4cbc5224e18a7531cf1ad9616f7f3d580e1c835e621f9c42f9eb410095a73742bbf3829936cbcf0fe107d174ec34cd452f1288577149ae3d69284546969e758784dfc14de618e9cc6fce75fc7dcb75d43c87caa6c25445a32c2ef340bf2cb854ab84753ba2bc329837f8738e53f614b510a355255754e5e1d2babf087a46e3c0832d86c8fae71b9ae3fd8ef3f60eb0f55dd1fa2be3f44857fa81afbc51a4b55c8c6fcc53af65c631a13fa1af9b8a52a432dc298cd676d96d99ba27918ad5491fd9a22b2033811887157283b06d79a8611365320877786993b286df9f122433ca841cca15ec7720e9be0ac8f55a1839a42acc6d77132478da50e5d79bbfa07f687b133c15f9709e31ca22d366869ab2f6c855e4a63313108f646ab96f0f4a1701d6513021b78d18a712d8c306f299b77310d097a334797d804f5ea53613ade3c27262162625cd42aca4a5bc421a121b9cc9efd8a29fafb84597edf2b0bcf2e9a78fafc42e3d61fe26ada1facabfee057d0fea8d850486a52a6f4023e20156ec7352e668cd5e15c987de92c4ee88c495d4ca2558ba22b9cb68eb40bf2ad4f58086ebac07e380d7d516e1a27ad799ce05648a6bc17b91d3ba374e1eeeece036285f16e568bacbcef1a1771c9acc96052c531d9417486e76ce0729148a1e054066d8ebe174701dfc3d6f7fdf4fb316c8dbe9fc7d7fcdb49bf1f83df89aa2b532d79abebab4ac3392349bcb8aad458ac10c836ed35335450def29941c678cb55c0510b8bcdbdbf95b3fbae31e111d53ff2d71a9a9610cf37a4f8e816759ca869bc7efe56123370bfaf452ded2883c60b03b68c494c693c67bf223ca57cd234b8581b1b86d3f7708f99ea72232e9b6f321a39d58a9043d7f8b42214ddb6f8929ce9806c9db177e41a4c992c23b68621148524d596e22d3a43b4c50307b4c463ee194e851ac9511ce728d8f42b9f75fa51ccff66c5c262b17d3b2f36632d8de3d61c9155b560a9be7dc7355e44d2dae1531453e402511ef4be30ab32a64ec4cf08a719a2fedf6132efeffd474ce6fd7dd7f81b4ce6dda46a36e79c1d6c54d1b334bad8b472d96291b2dfbcc094abb88d35a8b511ab215b1d956a38fc270dbefda37fcae0db3f768d57ff39836f60e7d5fd4583eff1ba9c625d4f32f51ec7deff872cb6419df5f898c536a8b31f1fb5d80675c6e166437570e01a5148304afeba9137f81b0dc6c1df66300efe7183f1e01f34180f9c6de7e783fe3f66831cecfda336c8c1fe7fc528568d1bfc47ade27fda2c56ad3af8efdac58a8cc36fd8ae3938faabdb3507c7ffd8bedd7769691bedd0fee776edaa95391bf7ecbe4bbf6d57edb0bf69bfee9bb1eed518c602fbe9a74fad6b9484681229fd75b8ef1a7a728bc4b4358d9784b5dd58e7d717de05667e330157fcad40aab915c00012cf1e92677848ba5d404764ac5d5520e3a172354647f618226f242e2f249e334c9e65ee5792aee700249cbf50ee065a3d63af7fe11d7aa195e045847c6cee7e3742bdbbf12e3fa70330e4e7749f8a47acd259821e485f3d78e687a48b240e96eafcd65b24b1cf561f985c5bef3f9cbdfaf2eafdcf8078581cc0f24b12c60bd2c27c9116fbfe3249702006351baca9bbbb7b19d2d97262f9f17c37a5ab08073d3f9e2f62c2b8b2bb88a3309de1607712c593dd394a294e76d3c4df0d09c50941d18f7c7591eef21a526b1efc8fd1a55da3564158067878603489e7a3d9cd906ab7855ab725cf9d93a4e7b83680c87386e859c2dddf8423d473f40e44e361b1e1efd411ba74e938ba0946743cce9d0901498e3aabbde4f135d451bb87a149bd04341ee0160ee1f52b2dda61ae4779740f75a782c0646d7e094cbe6806da359c57413916937075d71f0c3afaf58e8bd22d0451b06b40a3fb2a3069f68b68655e04b9e711fd5e8cf06c711100c8bed4258d5662124820c91f5f7cb7776077f70e6cc07eec1ed81079a6d3cb9cf0f53ba4e700d0a130f65047cf09bfebb31c987a36147e4cec61f8dcb3dbedf0997362a61e82be1703377cee392cadcfd262e87b88a7f559dade89e97b0846126e8fa5edb3b41846126e9fa50d44599536606907ed36af84151e0a8729a48776b347ab89997697d0ef2e61d45d8a43f3b781778fa2d0c7fc34ce98dad3a3e9d48088d0f0eb12dfcc42ca52119e048706445f97c8356c7b3ae5305f97688e929060d7389c4ea7c1be01d1dd32116838c8048797ec73301d04be012761fa95d732c5fbfebe012711f2af18429bff26fe0c07289ac724e030133f60e9ac846db35ac5d775184798bac611ea4f70df809324be21ae81067dd447069c2c93687513c7816b047872747468401f05980a4483e93146b601fd194a688297a924dee669b11fb399d93582fec1b1830de8c7098a183187d381cd3fc9348a6f7022b01dec1f0f7020d2d330ba6290d323d6543f09e7694c5c23f09dfd3d96b04224e75d8092abbc65471391a2608e262ae5328e024c12d698c9d1d181ad9213b4720d74ccfe532918f3b207fbac2932a90474354357a16b4c82c9e181c4c4d6108422d7389ae474c451788d25c6c1e060d29714c7090f466f4ca747beaa254efc5918b8c6f1f15edff7455a8203815001a5bc575d031f1f1f1c22998691ace2683af18f6415dc87aae0ccfed15ea028e2c9a2d5fde9fe747f5a48c6a564ba4cbe2ee330e5ecf571e088642538c7fbb61dec1930c078b10809ef3567ff58a6a4572bd53313d157e15cd47c70ccfe9309584f88834b25120e3ee6923a0d133c494226df933efb9f01a711932635a6a65334b50d388d139c52c9897eff68c22197fe2c0d118312727f8942924ee2246602c5fe33e0e52c4ea9427624862d1317562838649cd784274068d06749bc214736fb8f7d49a139e23dc53f57388ae21bd740c174cafa5db4549598c504af027c2387384fa18a8707c7937d0386240811e122e007037fe08ba4cbd835f6998cf50d185ec7c98ab380a3906239b5f1c1916fc0085df3c5b06be0037c304579ca245aa6335ece9e0e58f20d914d38f4a75c22233c8f893f0ba753266e8cc74c87f0bb2da27b50101ce10399a446b76c9c48e36310cb71ca93323e2ade4cd114057d95cb591aecb1ffb2244ed4b18df1b19da795c114df2607be2393d440994e91cd068a48cc464adf9ef45196ac04f5e8d0c7d32c351f298747c7c5445c4ca4184702c3c4f6f7032cd3b3564ea753ccc99fb3d130953f25297b7d3fd8e33c20ec930933e36ba64fa6f6947d25316b0e932fd63d731c84cbb93e711c1cf8016b91c8c95522eb3691a614cc040d068c752275b14c1611768de3bd433b98a8d49c537bfe64efd0c9d273ad72383938c238cb58b0054b360ea6e838a3455322fb4781c3749bc8106a4408f8a133381a18701e06249731e7d8393e64ad0d0965a6d39ccf8053d645f330a5ab244ee524881985b1efa33424226532302041d7e8cf38d3130146014f5cc9d9c236601c05ccc0768d69301d30be73952dc6a96dcbcf204113d738981ce1fe9e0173e58d061c847ff3664ca7fb3249b03a4087767060c0058ab0a64430c647acaf78b214f1a3e9e4f84824690c43538c199359b2c6ae6072683335bb400bb44237b370c11b3d0d06065c60e4cf16cbe99437194d8e5952b2644ae468b03735a01a2dbeed4f0cb8889673d708026407810117f14da014f0c4c65c1295841c49962578827d1fa9e483bd6396c65acf9a9ec4e94a1a126c3262d35112af901c1ffbcec131ebab1405418425dcd1647fe0ecb1443966d1917dd867df2450b8a6fb68ffc036a03684f1d16470c853d2198eb871311d3066a5212604b906b207fd7ec0bea36ba6057d9bfd67c0c278c713036a527d80065cd3e9a3df3eb299f6d1c7be4a22727c232693e531303d9c1a50530efb07477da6d829538c417fb2cf9434c54c73da5273b24505655c0d8e26d3e0c880349e231af349616fffd080fa60b2b11dd80654b331c6477dd6fc9b1946948d94004ff6d8a79a26e5ef741e5f495b9229ff5c4bd9ea43c924e29a493897390fbcddfffb7f46a8377dd17b6df78ec7f707ebffdd851f2bc9472cf9b492bcc7923f5492f759f2194b4e2e27bf9bbfa71df3f7e0de817b6bf07bda818f7cff0efe773784ef6571f4e4f2fc7bd4eb8e4f468c9acec892bfba39f6370cfb2c8d32e436dc5b170175b459ce09f86e7396407f27d1a3bf1dff168dcb979157eaf18321b69eea6f527f0acc3d302c873e6d2a57b8a82d5efdbf6526ff294ab199ed7ebc656beb13e37f8c2effe5e2b589f99d6bee8adf9f99e781ba677dcfd40cbf80fa8650d330ba74e48cbb74d41f43e700482bac98bfc7f2f7453e1f85c5ec01cb3ee0d96bbdce8f01506f5278011ed8c6348b850f59e1235e78b73f18008bc6afc35b1c98fdecdefd3f4a3114b73d0977efad283f7d945b4e73dd7d8db69aba39697b556e7d08b2183acddcdacfdbf5546efd2d144b6e256b191bf62cb0f02df65530a526a685bc76bbaef690576cd7541cf23a6de9970b79ef0b75a1a6ba50735da8b12e24eb92edd33a8067ee8f2515b1f7a6404516dedd482e27a6d17d11143a2c56b414130515bb8e6d9732f6b20cd0358001fd8cc1a9f0bded17f5c83ea4306dec78bf99137e23277cc5f5b570317857686fa45cdfd6b737aa6b6fd4d4dea8d2de59d6dea568efacdade65637b67cded9d35b677b6a9e723def3eb020d03b155f53aa873a67ac87d83aa101878e48c59c2a83f661f7be2639f7f0cc4c781d0da0cb2cb20ba2cc7c5da1efbcb40f7f3ae9ef898ce41a6fc1d1eb2507a6f356ca34b5ddd895ab667c9261871f0a179ba6db72b69b4268da889e8756032823955ec5fcaff2580f757eeb13d479f6d7852ed771d3a2bc10110bf7807cadfacc794e773d50707ba67357def56f7045f08255e7263117a89da88166ee9f2ed63eea15dec63e76fb9325e2b27cacf3d7242f5c7902170459d2158af4d0c9514c0d15877dd166411ad0d2d9e86a1ef00d3a1160fd8bb622c86b157e91124022b9cc8bfae537106a86f3b2bcb6273c72be6704346e263231d99463764fdc337b843d13ff237eb1ffe93b221bcfe4b4256939605344f9e7bce4926ccae222bab1b1a5d4152c2e8789a346abfb500ea9cafaa56d67a2825134aa9cc89c8788335dee09c371219a7ac20c987606dce03f37e0d11bc171d6912cf8689e7c0d0331ddbeec45df6afa6983010ba5439cb3789fc191233812110a1d5b953e5c0fb33307f0c00fc39a83813f8426f3026a9772f5f9acbef17418083b3259316e14cd8bb5faf873feb4f9def2f317d114535b156f410003a5211dea02e78b50634c2e3357f7b291ef48135148fe44b5595885f43140485f7bb459cd625a66f02138c951be2a676164055dd05c4018e30c5ad06fcb0267b53259b82817b8d8c6482cd6556f9bfca5eee4ee3c4c4b967657c82ddaf8145e21b130c15f4737b58e44f5d6fe78fc63d7b983c23f9d96b572988020bc828198f8761bbbdc366a2503d90c7a0dd3643eb4b989e4768a59c253f3cd47191a300ebe67657e85427853bf65a9866bf04f0abf073fc7330fc2a0360793fb354eb0bc1b7f44de0d9ec43feae0a6f0ed8edae61dd23eb1447d3765bcbc9166af224b8dd5647c2b38486737c227aa0eac7b508962fe41cbcd7c1237bcc2d825d071facddbaea0421595fb34f6b81137ed6cb5dd734663172145575796200967354748a1dcfe30fbe3524eadbad3655be62667dc2a00013fd0bdedc35eb880bd6b325d7e2a2cfc3f41c2d531c64eeb5bf2cd8f7278a12eaf167d622b5e85ffc8bb89623a032ad26125f91a09cc4e13ee205461a7420dfa17a0e96cec1bf2402c42e7c9ee108ad585be4809399ab7815e74417255f96bec649a16541864921e19e33788ad6548cd2905caaa7deded7c07ac5537844589458ef63a2d8c02f072c621141542ff146cf900565197f8698845d08ad3a1a2b0613cea553144513e45f15785fcc7a1d267aab622286697d49c1f5fabcd378be600aa2a9ce78519773c9473b7d78f81a282e045e36d875812bcd636f829a694c6158c3ac0b9ba1140407e662bb099603ac218ddd5a171065992d3d5a07307f44df6e9b2599a5c243c91aaa943ab716a5325816e142e7d67a1c115788332e7367617c86ae8ab90d9b06f06671c9455e9bbfaa36eb899ad0ba0573c8cd67ba32beae571a6565ad907b76cfd346741c12e1c52a9e8a7b301c8cdb8d15503511fb31a12159e26115c41be9fa4abf06538505ebbc8b8b85daedfcf648459189fcbae4321a50d582350df6bc1da70161c7736a7088319dd7572cf3f06067777b94c0c58bc707d589a94b9eb0c99a84cfa9113ea622724e16d48770005f4e35756e0115f1215e9cea0a52ca1970455330691cf2d21672766d3536f94cd63c3015f10f0f3ba5063e3c98e5f6d9d5d931f7bb930d1617c326262aa2129c2ee75b50a57856e99fea80d786a0594b14e89589afb6c686cd8a4771bfd23b7a5fe497136d1502a138d729e3163fa343dced821a90111ecb58866bc80969e6939886944ee54a67830ece667e9c75031b43cd25a42952043fdb5c4bd95e518599a9d25c8a1b320a54d81ecdc025db44152bd8211b64abd65c5148784f34ea89a2d9923b851165e59cd35c75d9bcc159c19fca4bb34ac9927d9317fdf8482756cc9fbca8b27d3615aed847586b6dbc41364bc6932a56598466976061c223de3d2b8de7dc0d141b5ccc3ae0ebbee669bedd362b6a5883d1f5b0965ca7881bac081b40e299b8572674b768eb40e2e553a74a7c7820cf9d13c72530f1eaa49987432b990c055f4635935d71955c990821aab12286a8559e824f4a13b7b761bc980826c0ad6ef3a176db449ed1353ccf43963f43c90b6adae0e1c1e895924e42dda842c02d7c0158dd80cccc839cc2b06ba25e083a09e0f1bd4bdd5e1c3279bf17d30b482101d0e11bc6b99d2634da735b68776e9e86e9eb908414172080aa417cf67a4d464bfd0e69b58feaeca10d664f96a533b6c6e003dae251884ebc01d9704b1204f2b2ec32a878bdc14cacc3bbae4c0d1927f2f56cf15b5fa8d44d432765bb1f776be1dc26b8dca02f095951b9e642564c2f69971d7b5d425356b339a2724e1155b67926ae5d6fb038d267fe306db038526671a044894b6e4b159597da36da71b4dd3098ed0d78f7628defdebf8f49eda482d76bf8ef250a183adfbd7f533b4de30e5ec30fcbda290d77cc7e0f83357c43ea214cdcf1fae09973620d3ab883dd9e35e898bd1eee98b8d7073d07acd7f07439d9587b73fd0c11eee0aeb335011dec320a4cdcf3fa8097ed03c18464330b3691d1727a2d490a03da9a14c58f9c9a0ee30aa727248fd3f328639ecc9c1a06e54cfa1492651a87018a9ae892cf0ffc38357187ff3c7fb3db078d7c132ef14352826e229711a655218b743060d4bdba15cf66c266f2c412c47679c1457c633a767f1f6226858d3dcb8b38aeac9615eac39e637736097d56912aadf3b95a396778bf5c81c9b278cb4ec3c45f466c1c6fe4ba0c2d8039691b192e0085c86e3376b99096eb5084ebe94a6a40970fec57114a374871994b3a07320674321919f014cb014a569a9b59c65ce9bb12561de9a6f1d2dcb13dbd67b724df2d96e96d55a8ebacd7f025f2af2a5c95ee81ad43db191c0d354d619ab4eb800eeed11a8ed59512da4315ebd2069e88a27d6b70bc7f6c1f0f8625a92955ddb10645cda2e3e7fae565bc243e6e96f27cd35b405a1f965c189be5003f7376fbd6e1e0e4d01a1cf4c50c849ff50b698c1ec71af034468d75386030324587ea5b7d0dec78ef70e016720f0ad947fb7b87830da2849f5903a60f2aad7a43cc7e0773e9a86d71bfc384a46b0dd662b22f6ceb67737edda9a2ba94d07360e2910e85a1084a328de23831130051f598e0271a46a93c2c5042459fd927c8c4237b0cf1c819b3a5077deef024c29248cf1943d24b80cb92429614769de7e484b86197c1f742b0862ff15d88cb84e6d1fb6d1ebc28235892ba886f9aa97c891392521c12187bf6307ee625c3b8db05a4eb85a6d3a330e9c5a0139a14c6a08347f1b883cc04c6b97fdf353c4574be8ca28ff1fc6f66608e381b99235bdc0122e313933eb3db6db388cd231dd3e9520000646c34c39ed325e03bce61ce5333ec3af2db0cbb7dfe93b116b8ac8318fe9e997593ea2bfe4f2f013d9624fa8d91202045ef655d28ff243dc2c0c958f6e749d8735c3b23833c0bbb8eea5af1d9e79f7dd5d39c056e9d646a1e9d690f830ee9622618b21b6bfba081c1221a4988a2ac374d0c768949d93f42f56520aef94be0313ed428c26138357f094678ac2e82f08f612e9778489e3b43d2eb01daf1c85087f228a46bd0244490dfe91115218fa942d2c300c6fc67d2a300a65ed809951aed7768afdf215dd48d41c70c3b29e89abdbd0eedee7548afdf414c96d32eea845d2a15015b7a3115603847d6c0b28de14e897fdae517937af76b710d9978d40a498a13fa82f21d9ffa23ee2cd8adbca59a05489861143c3c649f975805914d5fae2ed0e57b34c7a6c1800cc0a430cc4b8a632d09cd56e0ab081b6018f298ac9e41f12dddf5d3d480dcad85b8a99358dc27c0e92c8c82934412fe124fe3049b21d473819b5868b1c024e09f66086068f13a3ecd30a627fa87e5a7e905bea51e76c342a112ad0c86471ce736a76958a98f09ee1174dd0bc9346eddff4e5a2de17cc36d0d16b743f62da255b71cdbfe8e7fb376f550145e12b7e56326cb3c997b63715bd913099e182f901fd2157747cb13b8e39834bce3de6a7905ebdfc9ef441242e338a2e142d02111aa076b95e2834a71d50ed8aac3a7c294b82d3449e36849718e52b8b2715b2922692fc549381d8a227cbbaac7e3a2a56e8bc484155a1b42f47e2d461c2f0529ff054f7e78fb91d38e139784f013a3c9fd0d9ee3245d609f86d732fe8dfb95c28f68e5f317f2ee6b1fb27e5a26f86d8c0256348532f0933b93bff6dc1bc89d4db92f317c87d3997b4ae1a7c50c27f8071ccf314d562e8d79ce4b9486fe3b4431571d5f31b7be3e8501761d580af2e0c6f0dd879f3ebd7211cc636cb9b70271e8a3c8fdd387a751ec5fb991bf869f8b9748731f6d66eeb91e8610c118a68588eab439a23a9b64374754d7228ae32cdc15cfd93650f93c243c407a0ec33ff5fcf33842090f4ca6416989d29ccde05fdc85f3259d89cc5e8e09dd1672b20cd12819892a0fc35e8abf3ed081454c77bb12175e875181e0edc680f2028e0784cfc3b69fab90f28722092d6939a67c9e2420fb3aba7fe155aae34bbdfbb7af5e5fb87b87f0a77377ef087e7cf3c38f17eede317cf9e1e2e2c33b775f85bce7d15c5ef240bea977ffe1e3cb37172eb6b8105a0c05fcedc3877759cabb3767676f5fc1f317efb3248e79ad4bc6df149f9d71b808c75244de25a69a2c544f77e6d66216ae33582902286a86a7334c51538828bf101acacf4343f9f5a1a17c3d3494af93eff9a25d79aa383f394fe23f855baa778826e1adc9ca15e33e452c49058f8181b7b0de7f78ffaa18158c197d8561197aa648c8d50950a1ff7e222155a1a9181db050d4b4a1036d663b7aa1ea182b247c7bd6645647b1a2d42bd7032b97d62adcca5c3908b6611120cfcf425f2595708321807345bf2234618cc98747bb1d789ee44ebbfdd1ec675b43dcff45c72f0f258692777fd7bb143f20971ff6b998852ad7cbeecbfa658593df9ff5cb1a47950640202d61c9a5b88443cbe0e578f939bac29fd094f17f6e0957601def3afb5dc2adf46e097396ac8a01c63f2dd4df8a315ef2389b78cc795d772000717150008e22d1c45e0634cb7b758799907e51039f9892f51dcfe9f9453d0c7937d46400f79287fab0a10d6d00af3d07aef4849d1df3f6e121ae0929579144f07cfaf070d4319d1e9b15690ef0351f37e0f914b4db66cdb88c150fca58615acad1d0c15ba6db77ec2cfc614dd436ff6921db44b0acc70b6921bc5e6f594486f0fa734b703d84d70f4f29c34378fdf294122284d7cf4f8bd1f6f22931dab60abca6454413178ac5e10d8cbc7bb61a710d7f86c82536d670a952047fd670a61258e3d770e1dd33dde5f61cf8f1c3c58b8b57ae0dcf3ebc7dfbd975f8ccdb87171f7e3afdf18bccdc939f02645f7e31c0c13a9b26e0d47370ef00cea59acec635bcaca4f0715452ef5c562785c43efc52fabe297dbf2b7d7f2a7dbf2a7d5f94be5f94bedf16bff3374ee76671837a11df98d6f100fa5ac4d8fc11cd47662b4b75d3f3b40060a72263310b5932ebc30ff0cc333f9478515c147f50aa524cdca771b49c139332fdf3a11c01952dd75732e6f01ac0f7e57bdd25a3bae6450e01f7b4b642021d00694d385c511f65ab4d00df3cb546fefe47dc46d087a3e7658bf093c2309dc4c1cad55386e134d37efa0d056c5516616a67a36a2648c30b95ec03f9a49266d17287b18c924c11c975ee34bedecd8d00e7c806f0ccec774827de65964d8809fd91fbf5cce7ac39672d80efcd7e27791c6e8da314b7ea9bf921a1b3f832418b59e88b769e986726e9e4f471bf9abd7cbec4530a760b566356ff2f6140677564261a3e1a2f726c622fa1095f437b806bfa3149e3085b372821a6f1cb8b8fefdfbcffc16d7d4826213d8d094de228b5fe4c5b98f8f1922dd1957bc72b12df9096cf5bda626aadd56b2d10690561ca979196c134bbb60a72b868e683f9cea46ce2db4a644eae773dea6ecff8a22d5e3497d8f2ae642af1a442990e05600bdbfdd6dbb1ff6e26067114ad761911b5bc14ab5347d373574f6264e73fcbc8ddff1731f2b574afc003f62b3071f3bb1ab31f626bc297d3dcc8d597d7165f5d4b4c9a092c962272bb58df7305f71311ca4e8ed65fa1faf519ac996e67b3bbb0028406e20435d5ce16f2d5ca596b6babbe78bc6a6e716c51f3f98bf7d58acf11a9adf7dde3f59ebf78bf0e76f2355ebec9da10adb6d6e66b80cd0dbeb2a1bf04408b28f9b25e28ea6542ac4845573d4900be347203dee8a1a5bfc089f209f28df3b4b650eedc58b7bb549f723abebe9505e069017895018bf9a40c3d11d3f7177d03837566263a823d5c9c9e20a12f9a79f356e7cd0b78c15256cfed933bf3dc04c07d6bad9ed9edf615ff821782bc178f90f72429fed44cdb2b9db64ff01d806fcc57d62d7c65ad007c2768f954a1457b90cff017a54e1f02ffc0caa73c1066f9f693fe905ed0a531277878a8f4e4c3833e72c56f312e1e1eeab5694ae3c579122fd0a5f0920d0aa76ed80a7044d1e767f689e84e57a53cb7db6dd1df255ed60cec9a26eaafeeeb385ef8fe175ea5a5a47344da6d9dd2f426e4f169ad2bbc3a8d030cee7dc4adc62bbc4aad9fcedd37a60d7d7d3758277c384930ba1aea45e4562e2bd67b4a39be33fcc62c1481f62385c406f21bb3b7a1d87a5d0866fc43c3b49931422cf8d58546c90fc7fd86f951621ad9636b812e311b6fa5246dfad057cf7a4bfb959a1b554fee4ea3586f2f4f721429a40af7b90af719265e7e138a7668977408185ec8fdaca44c3e57963af57b15ea1f9b61bf8169e72fdecb3a033142dd6c1f5a1fd6d501a6e9af9febc522938aad54c0370a0f53e69c4e5d06364ebcdb30e9ff0353f1f6e3a0c4423169ff57c7c88b6c8c34cefb578579ff6ef3bcbff5a82ab18219089b6c81ad44e99bac83a631990fba5f6a8d86ed26f6af629e2d8fcb75418aabd6f4633bd30df677e3b67415be794fba0afbc886744381a6dde806707d2b5a6e1757218b7bc5faf19d993f71dd1077bc7465603b37f61289b894739e05533269218c39bf4be2de5f625af362aeb806e7572cacc202dc6d5902038fde36c198b4121ee52768d1b82537ed0ca01f15afd790c44cbbfc954a0586bcd2002f12ec238a03abf5538a5b9a12cb62701800ee948ef6d730c5c58b96ff60e5956b0598b342cc567f8d1902c7a31449b0068688dc6f65c937935073934230e61c91bfc69573441ea5e79cc77caae5c73922dfca8c6fa8b97c5144f0802d32fe1a1318864769e1400d6c6079dfca876faabc72c785b122a58886febbf83a24977f85213a9e47299307d54d9c91d9dfc69cbf4a48dd8d26c6a86045d03cf4cff443f3bfc2b03a7c15652f892d9cd457882de47e1bd3fe21623cbc5eaf01a46bf3d700c0df02cf2c6e37bc8e568a88fc304d3acacb4ca6b0e09445773e267dfe61983b07d4cc34d4606a7dcbdd3d229f1c6a664b8ae90b4a9370b2a4d834289a8424c0b706ec293b8419300cb270632d89a3482458b62d6fc40509babc88dfc6f155e182daeb38b94149eec581ce17f96d91ea0da1fc06da278ae832cdaefac5d73c057bf7cb856b43662fb9368cf094ba36e4e765ae0da7a232d78613e45fb9365cb015e44f0bf5eb4c945aa19bb7a2e00add7c9465599b642afb2993d779f5c204f7ca57a2f8bd92fc6a5f18934701a5bd57f6d5bc832d14d17fe155e3ce9073e0563be59d38e00d71e2598ebe52393a748bbcb3247fbc22d85e198cbfe62fc01c0cca308cf32598a3320cef965265fd32d072518438b4cb109c570598bd4a55b2a38b60fb1554991494f055382545a404765c03f6b1a6914e851352b84a1cabe0cb24cf73d6da32e09dec6f214c666189f0b120752658af33215b2ebc2db61b1f13aa2d65cade42a6ec2d64cade46a6ec4765cade42a6eced64cade56a6eced64cade52a6ec2d65cade56a6ec6f96294d2fd769aed2acb2936f6c55679c69ec2f53be5fb7d5b65e696e01e509a2db15c1e732e116478e52b62b9d55ab012bf22314e0266ead7596b08215655e225c44a6d3297f6eab1d317529f9540457c7c95938c7240d63ee178a78d44ac33b3cb2c7bb7d98a82f67bcdb1f364858cfc472678d5af1749a623ab2c73d0276096c145e59e4735ec419f712b09b6ca36ce4f15099097f531f2b3f1bd5866e188adf2215f6e352b1710cad1f1f43f25a76cdb668a7aa852151c999c5a53fdab0b8c3e70851fcab593253acdb8e72715386fd5c815d35c2fe5681bdcb600b961cdfd0acb182acdb0ea9b38eac5543fa5d87400758244ee6280aefb2bbff95dbb2d9c536b34a4db18caa41dd92d36e2bd7a3ae2fcd632417bbb1d8ff559facf562265581661db7db3b35b276e2b8f6b0d2af5eaf66d6ecd6cd9265d3d55a55ca32655e2ebb5c540ade793d5c066314ae9b7543c53974592e2ab46483b75c939c87ebc5a882464d9f652c5265d40b5d054b366956382b67ddfc29498dd6ae794f529922b3a39f7bfe766e549e27851216d7fbeaf3c479ce188aaf260c79a32b5917f162bc7665fd72773a240427a2563da55c970dedb152fe35b7d4cbf53d7e511de55bdf4fb8ab9e3eb194d88e8f9f586ab930a0bffd8def681b508673995f0d8fbd5078fd2f5a15fc016f3983d502a05fcd582e008c0ac992260097e5e4e5020ccb1c78e4c4a6be8b365eb0aae7f4c6739efa2edd7035cbdff270257a142eeb93661dffd8da8b6f11fd1ae87b4200fe9fc09b2cccfb45122f52f75ebcddbd574773d571179353fe30a0f2ac3d4cdfa3f7c20b3ab5381a8f30136cc607673d4a799f773b9c029140caf4fb250f5a2c1eb566d88dffb16ddb761c438779334797f8a72472efd730262f8be9fccd6cc0b2d2597cf31e5dbf21d33847b863af617ab5fac89f1ee5c903bcbf866212d65247e3355cc4293d17eece4372791acf99fa49dc7b9a84979738919e16779c35943be6e2c9307fe38f78ebf5caeb7903eea9358baf71f261f2a7740b6dd1388e2ec2059349ce2eed5b32fbe2dd5bcf3098915021250a09fe91213c4fb01fa605229c1a785139b33958035182a8de099509a6e7d4552a1f5b3351c484d671885723dce09f25e852634c1d5131e14da8a5a3aefe989c46a17ff504783ee9ca4295fc359c633a8b83d4bda70ca2b2dc084948431485697619d7577781c5886db72b49fc4e5eec5fb1b9fc0c47149980af4e6b85eca429c34af8ab7213b858feccd3b078fa0eb125ae1d33f44d92993dc2584611779d60957ae8e161276f024bb80cc9a5f26441f04debd7c0ca1eae0f89c544672edcad587496e07416478187adaa3cc2cc421677ba4d2ca695f338cd491741f53d6271c253ec5371909c9a585acc29dcb145748ebaf01c0a6a0d8095c609550d2c493a18522f51118892913d761943d674c7f370362edb6d56a9104993c23c43dc06aa1b9cb4ddfeb230456e3e308049c1c3836168283c0ad65f83ea31bc7021cb7971ae9c17945d72a8f7318a693c281b93bc82788aa72d14c61e7978b8bf756db8726d78e7da3c885ba2e280c9737a94a6e12531efd730d41e13fadecc0443d6ebca19bd99028bc6dc79a725fc8e9ab9cb9fcc319ff5614981a5fc649a1190ce01012ce0f239ae1826bb7b4fc0b6ccb089fbb29189005c9ab9571caac5e8dfd03c782f1e8aba3313acb5e720917e97e896df145a71cf3e77c3822ffb1c9375eb51cd7f242966ae3ca26526c5cc3b2fd12ebe2c4d0aee350da2393ef835c8f6faa9750ba9b582d4bad3cace2a416d64a34ba56d68c39e83f740f5a9b3fe58943fe2d26481cdd94af1d43a87cad4d21a7275540fc4b39484d78388bc35545c688092b96b4827a7db418a735cfc86843513dcbd205a328bfbed5054cab4ca1316c8f5bacae64e32d66b1816d04b3348693549cbc56a816198bb3e4f4e0c9a20ff6a82a2c87013883c92b1f33426d3f012c639343ab95fbb08a61eb16e50485fc709b38094974fe8e790e9c3433ac405e301e282b718ca49e2ebcb462f3741786d00003550e18726130ecf48708418638c0254b122220cb3c7ab9180961fa1347d8fe6d8338ace5e0c0d88ad1fa49af5eee3641252d7606bd29ecf27f996b88c085befd854d3e317b876e7611044584170270fad8fe24d9c485a2062c0ac47fe2e84d368e51abfbcf874e6b6d8f205b63e3ebc765bcb45eba1c59610b0f5ef87570c7f14c1d672f1c0cf205b7c7702b6223ca50fe21cb2b54237c67a148ef994927342f4095b2d4768e5514b33864fd8ece61a2426bc87b4b96b736f14614587b0250d570e46c1e18e013674bd8684bf1995d37e51b1f5b51cebd6eb15be57e25bab60d3bad02c1f203c620f11cf0c3d0d3b77417189e94bb6c6605618bfe0fa11fb943ba2900b20be05fe81ef5868dea4d48fec08dc577b3a30d54b7edeb2e445bc80f7345eb8c8a2f1a29b8a436924f6e5e2358089777febaa0d79c2d3e1ca55dbed84955a0f0bac4df8155fbec2ebf47b4e89cf09bfd32bd66a9d7ed729098110331a2f3cc3504141126b058dc56d4560042c3f77d3816f3700f3bde1699ccc3d23db26367b7ae18c74c7b6a1f11d6cf59dc52d30440039e97b680dc43afb7181618bf282b8502bbc2471823f10ccd70927e5046fc771796415b5eddf6e534bae44cc7c55f7f0c0977518c07e05365f8594bfeb1080ad5a53d84b29b5a85863cd750f55819a74d4c82c38b4324bc614e2ae6b4394b255ae0805c8d6da31d031319bff3cbcc5d14744c3d8940320c0d7a18ff3f44dca23c394efd728707e2786e09bfb5c574f03286681cf0157b8bf054c55b2794eccd90df88c69b4323ccf0bf9ca3b33c08ad753f66c5bab58bba692f97bd1b3f51b2b3680da0cbfc3eb31389dfce3e1a150a9e6d4ca727494ba6f2b6a659b1a3a485530e41d64b366d3382bf68a5ca24bee716b0dc06674d2ab44015f0551818b6a15c9fd455506930d1ead925f8ade581fbfff5353a1b3061569fc14de61b5c10595a2e3147009b110b7f23c0991a9c21ca0f1ed7006a199f73c2c9b307b855f04d66d2977dba606d93b9cce58e12cc3ba0ed3701209575c56a419779e429541f86acb91a7abfc86508d7cc1cf9bc5b4806897d89943e9871b22af69af4c83c318e0e1a19a254a1900f0e571d92414db86f22face6cb2d40f503e26ad7e48555d7e052d748885d0dcb235dc3d85b6e48367c0cc0b8917d66ede2d2582ea50d41568e3695d387aa865c6bcc14255edf1a74b4dcc71b02b1262697d2ef9f12a4a2374053afb68e01a52d58230b7e7fc5c31817738108083bd463d09ac47340a90b4f238c125e422d3cc5c70f81e9c02a560089b6864d4cb6fc2d083c2e0bbcbdded412b5516c08f1ac669c28b20a0e1701afb4b680a678f8e23c67ff5c7a58d4c771c1f5a2793f470b97c2340cb0fb6b6029378ceb6237e64d83d86ad8dd6eb753118a325e52b3110ac09d22fbdaed84cdeec0356b2b74605d7bac395a883de93a6cf563295f6b48ced7af4a70d3aaa40ea9dcefe3084daab6ff1e1e4663604de3e415f26766a1738abb0c59dc303ec164db875b15951e6cb8377b6d6be8df81eed797753b55b1dda3905c31d2dd2ad66c779a8ce8982d202a070222f0f7088f1900a9dbdfe71bfc57eff8f6744d159aff9cdc2375e291111ec3300f33a5427c234e3b8fd96386cf1de11e99ad6c9c61fc2ce42ea8d128ee39e3bce8281e0fc58e6132a26379a9388128db754bf93e069d85a99baed7221affbf367a4b7d319f847c9e67abdabb149e858950762812696fd2dcf7e91afe6fe0fd3b308d699cf8f887042d66065c0400e269710f539226d260628e8c3fd3983095000dee53e40c5164f0e840f989ba018d005dbe8b032c7ebdc5d738caf43c34481ce08f3862f393fc7a13c81f3fa32803e03e66c398c804a156c5ef174b1af3ef972b99f24138ca5568d8980ca33ce16296602c5a514d79754bb9516430a9f8142f134e25fbb8108f9ec44701294b5014b1df458a584a4e11fbe2a785f277a1691cd132b9464c7f6adfd979a54c536a505156685029a5d020b5f32dc45f266ad2f12249e29bb75c941b32f57696f33ee2e83c4e1b334b0dd500ce79c49508d79455597c39d09cadb3b426bb816a955da08d0f8357e432245c64f75eb0d9f90cfb68c53f7fc651ccfa52a5dca064be5c5c84fe15a3de8fe328886f48f57bceb0c5442066d9dae7271a2f8c71e9e845d39de6fd1a52f8bf81a574a14979647736633c3a48133c4d703ae3c4bf8e853c077b1ff10c23fa299c2f232559781e52c591ada9118a33a7874cb92e1186cb87c99fa901ff4f0060f2289937b207a5150c2b46142ccc85d068da7832a0517fd2f7789bc8b486c3e851d28ba74a5b5753629d52f7f98d0362de33edf4164d70a41de313c464a9f6a0faea29b0cd87da0d07ebd9e236efdd9ad34813d71ea38bee7a8fae43717d343b5ad8e2445fb9a6d7ea55cb01130cb9bd9cb9b6de587b1ce0d261b95d7b985d057cf4fc5b1579458227967aea493b2ba39fb63fa9e053af01bc6553d013eb6165be89c0b74a2a9f502637d79f5a5b5ef2e9c4ae219ec2fb354ca620bbda40cc7b6e06f53ff909c6e4348e93206d3c636676e2bfb4a3479ea77440682dc402555c74150a862db6ef6f5d33b46e79b01cb956efc395db33436bd5e389427feef6d732bef00b12ce1bc3aeca4877d8420aea7582e6f823febac4297dc31d0b30432d7a51c8371b0bb0e54043165ff814a30c3f4a9bb79136ce9b2f59f6e9ca8fd4b5e3352ca5bbc5a77f4d93878a66a816de26283cbae34b2e7f99a471229bc32f074bb3d9a2a17f2518942fdeb9b66219e626de24e25789cd750d041b4f81b53a399409361f09eb1a550ad976a7d1bc48cea5c70e956b35f7e327cc3a0b335056f04b80954b04b77c7db528f6eae25fb64211936aea8ec67c16643fd6fc3d041fd0680aea0eb3b58b0bfa4933f170e93859ad5a73a9e0c7d88b00e66d71ff4f60de6b685c0a8b485cc229aa1c7833c9fd0f1e39cb90301b510d9b8e1748be3bccda6c1279030986a5895c8a1d44c5f45cb660dc38f5c779448b1d751459353120b52294d24f988aeb05bf79fa3d91c60392479998e807e95cbef8217a6f9e5e1a30291ca0f3f3644d53c4e46d8c82905c9a85d383621909625996b106c08ac9eb9084e96c8b92125edeeb296ef06703c12b50948f0f006dcfd35974db6e975256ed76e1aa8de79559dc6e6b35597cc4c93d127e4d477a922f5090df8edad85f9e73680b3749fe246128eaabe15675c6b31a4ef0d3eb2f41822eb30bbfeaf54705e5342441c3adb82f5fe4e5b0d7e12d0ecee3b4ddde61a9f272bdc2fd624a71c2ecc33500437cb209c2dbb1dd1265eaaa3e3f0a29e4c82b296bed2c5e59a2ac0b9ae73923d83378bf69ebdddcd22ed6c134d86c59c3eae6cb825fbe50b907c1ba611a461427f5a06b006008917e6838243567558ca2ca891b06f79a0e70864a49cb37405fbe0488a2e10eadeb26b326d5bb9fdebad49adec2e98afd5dc1e91dfb7bb70650c75241c0cbb2a2b790155c41568c951a19b70634560634ee8c71cd16a9169b7d644cb3e3780cc61e1de131e38ece9bf25591cb044d26acf906df8c6d62dc2347f1de8e3d5461ed0aace3d7f34a3ebc61c85a9a58b73dc25b9b58ab1ee12d4eacbb1eb1eed6c3ed1b4dca8d26233cf612d9f2827e905b31621fceb4f68088ee721a2f090de21b36d3134676822e2f658c232b5f979904861b59543a0bc5ea6e595998920d4397af44f3b11ae00853dcda5442cc8aa197546511a67a2a4bf019e353ebb69770c6a7d6aa9770c6a7d65d2f618c0fdb6d730be68b6152e07c7efe14f2f8e68af611e53da135a54c66358ba5267957b4dba6ce099158e89c57243013e883cd5d6ed7f478f3acdf6e9b9a6ab01b87913ccc288da435d3d3625b5e679c3a01a01e1ed2767ba77ab6f2e50b57921f267f32d3ce0043403d6a2d508209cdeed1ae87058b461ea09823b928d4f7ef4da7bf67eff58f1d71c5f75f8155decd379d83c3c3c3be3380d641917f63507b475b97857c7b256542104ecd1de514afe5c83be3a949454e02d49b0529b5d501cdf7d30dbe6e2b72629dad6dcd04f44293f0f9b9789dbb2aa4922ca52cf825703acaaf3c91522dd0e03b600618039ec7462cbf212e8c0171e3bca996706a921d362566d7d1a50ac8534ef29fa59af93d776edcd6c3324a040cf2c849996e9113cb9c0c7698b4dbc98ee7a1769b8e8c9864edced89c9c186c1019aef1362457063478130d3036053d003697458d656398f0fcd0958b76ed49cd5ab0525caad22589489baa38b5809a5b5ee28db7122ed6bf274dcd2bf1a94c31c7c8284ed48445804badcab610133741b77623ac44fcdf414f8e7d33511a15445cd3a9ddcb58af59e6f0fffa7f020000fffff2bfbb2bbdd00b00",
+		"b954e06655197145616cd398d91c5d94": "1f8b08000000000000ffcc595b8fdbb8f57fd7a738ff0cf2327fcb97997a67a1c13eb4db6c11a08b14cd027d580430251d59ec50a44052633bd97cf7821749d4cd49da9da26320b128f2dc2fbf436f6eff0fb8901561f423ae33a5e0f9fbf576bd83dfe0e7b7bfc05f69865c21fc0647aacb265d67a2da70cc04236a333c77bb89a2cd2dfc59644d855c4700f0c3eff6e7a9df46700bbb35fc28a4c44c832e1118e50825d263a98172208c412ac549a1546bb3fd6e0d7f93f88c5c03c9ffd9286da453200a2804d7a0e84704526894202445ae89a6824356127e446528d277ef0da14d1495ba62f029027b322e4845d925814a70a16a92e1aafffa089b5bd8994360058c9d8009ecd6bb7df8323e61fa4475acf1ac63234bec844c60b7ddbeb63befcccecfd6b8ef3133d2a99733eedfb112cf680d5b117934ea4f6dba89a254e4176b0ab72b81ed6304209e51164c9c1228699e237f74727bca3c4769291f2a42f90190a1f10564822baa3472cd2e86dddb379e89d96699e454d58c5c124899c89e42aa612404fee4792bbee07028771d330527aa4bcae1a09c2d0f66b3a1742052d38ce1c1c863dc619dff632945852bf8894a2cc4796549bf270591b40d8a5d1f1286790277583d8696597ff78095319073e25fa4686aca8f8ecf0b67ca1ff3dcda26f3764ac5d998c8b0a7bcd5aacd93f7a538d9ddad1fcd9e37f9d119b4734b29adc6a938c78e54d2aa12a7e21c46771bf5db70b10f9267aa68ca7014e573494e7989926ac233278bca08333a0cb27821fb433a22cfe180d5a13be50d3113e1b5c46fcff5200a76588dd3f71793e40c9f9181c28a704db3ff4e2a1f25b9404ab2a7a3140dcf4d52904cd3675b3d9f944b3ad86dbdeac4f9b7db1f67820999809684ab9a48e4fa71e8ab80572ab41615a4429a74ef5208f60fb177c838264db2418e9990aef6066967826f056fdface05d8d92cca41f4953f9aba69ae1071f95866feca448800b3e7090adb33daf041a53954c89ee9d756d17e4426bcce74276ac960db153d798862a4df4485791d252f0631f74279f3da96039cac7ffa9ecc8448eabe829cd57912255fd3b67cab23d9754d94491aacce2a8167fbf7d1d1aae450207d5a4b6f29b6f75d01d0a292a2045619a033fce000c43658e79631cd8d463fe0ffbd78f630c605b652d1475b1259111938b66f5194d13222c268c1e790229516883d3e8a09ad487b88bed78bbbedb9b5e63df39d65ad4f645bbbeb98537558a798ef9cbf79b4115b0e96fb2b9220e48299a2fd41b5a1dc3dc55fac2d0a7aed7e12721ab172c95269f2ce00b708411422d65cd2c4cf2dd7426b71bad055f4594d78d5e45a2d6a6aed6ab4821c34caf22536f8844f29fa5510b18bf0677f6b06d26f36671806bffc6548b30614e5df874b5f50f006267d3b0a089c23508db7c0a21ab96db0894f5f27d0ba1000105923bbf0c44b72da13b3a88ce0910a59ca494517d012d5c2041c668f6445286a02f7537572c87caaf66db0fafdce3ab0fdd8244853a78564d5a51fdcaf5be769820758d441aa513701416edcc51b6b96a64a9499e4fb161275792c495f81817226b546c0f4f24bdb2c5cb7e6547abcd74cb627d8056e6a443d85e4ba5856c133a6b549bd10d57a821bdd837b5c4672a1a05b261c3f00d2490941fa77a2ebc6f955c78dd69387c6fd5138d36399bc0ae3e7b9c017fb2ec0c705c0ab645971514596e74fd3430d2fa7e6fa691f583fbefbbbbbe55cc610b9b322749eada3319cd03630c61a1e220ef6c4b3db4d204bdb62f2af783a46d355202720396458d520191085c68c848633ab168349c4ae4e6c4053ea21466c9100358e236d3b7191e91e79379a643918371c6c360af5c0818bb01559376a0e90aed393ed15c97d3021d04ae59bd77aba7926a8c6da14ffcd54c7f68191db5c8012c72b073f5d2f86aa17437e588a344a5ac05aea28f69f5c8b1200d0b58ab4c0ac65222bb06ffff9ecda0c1f55d80345a8c62effac0daa18651130e922004163ee9b212b3a7549cc33a4a722a5e7df84ac78f3c356a9783f06fa412d2177d5100e59974b71cc6f239b64fae8c04570c43897953a5286d21f435dd56c158d594c7a31e31dd2b1a3ddc6bd56ca1c08cd1c74340df4082016ed8ab26b3832b5e5e73ca876dadad7e4864565ee956264e6cee0e2e0c1ce9581485429d407c579fe7fc30696c41544c7430d0b4225977b73792b037a65b09a6c145e1c7906032a5fd7ba8c05adaa1538b4c6b690aa2a6a80ca183af468789cd7b150aca306e6a26481e06c415b83042983335cfe1f2b75ca37457092f82cee72a9dafb53d0c7495c6d5b6610bcc5113cad4f21de217e8cf0e7a5545e465489251a563aafb99eb67aab2971b57ae483caaba55cd88c6a1b0e330fd12b53641dc95ee87456271ff274e3c788acdf11b268ec29e0d665f922ac11a6d611c00c3a29d8ebb0165b7adcf6ea19b64b6dd52df57cdcae7285a074cc6feee89c68e91ab83c1b20ceb63407fbf7ded9e3fc694e778361c2dbb1b7befe4f9797070947871bbedc4e03b69862651dc7a38b2fda15525bcf04905cb0746686de2eb5977b9b5f76adf505e7cc1b632b87ae8fb99b3ee48aadd5d2b54a0813def98294d74a3c6ecc25b8c4ef0ed58e37985a1d7d859f18610b26072a52592ea1b6480bbfa0c5bf3093938375982b6beffc3205c3f664cc2fbcb4c8c21610bf7e6df25c12d9f3103ca6d6b0b62b4bf761d5db8da97169e8c9364ecd6f6d9c7efddb677f3d5280d9d6ca54ddce4e464eec693de289e9a7397399631241323bea88e0e7025500bea526caa6627d83575fa4da5c1a7c3a4eee37172336c55d3a514cdb1b454a21b2e7254efacd23eac46710ac3186a2bdb5d5fd95a881c5f128faae7f2aab3c5dec5ddbc87279118c8f765576d6e07de4a19c99e1e3d0018505235e1574aef40d67dabe7e8b6de0ebe449598c3cd43663e0b4e9e63bef63f690c3d777fff5d9eeee74f2405954ac7594959ee8f7981ec35ea9c342d99b779f8ebe736bc87d8b74560b6c45df901221a943fe845d6447f65ad7b58ac75e01bc50a6ecce8fce95a38f932660e1c25a9cb6ccc1c86cd259c6fc7bdfaf55ce0762119ef1ea3cfff0a0000fffff894dd4d84200000",
+		"d56916144189265be125406e28195487": "1f8b08000000000000ff9c544d6fd34010bdfb570ccb395e682584c0f605aa52a136a8ada838a1cdeed8de64bfb43b0e845f8f6cc7899b860b27dbf3debe7933b3e3e2d5e7e5a7c71fdfaea0256baaac981e2854950100141649806c454c4825eba85ebc67c0f7206932585dfb87565b8b11167087f4cbc70d7cd7a91346ffc158f091359e30da6d20a22959a29dc1d4221203da052c19e16fe23225066dc4ba643c91202dfb10773eda412fef095596157c3499152baf7630a8956c25e4a689be73ea03bcbe7873f1f6e2dd47b64fadf416b42a99f18ddfc7867818a28349565d2f1fbedcdcde5edd17ab58dd5d3d3e2defbf163ccce8da36208d4869af0429caa3576d1bdef89407d73010864a76e8cee4832bbdadb2e79e9a28422b597516d4ae3e63b84fd8a5fe4838834514f619e3489964138a28dba7284238983b56e9424733da7c460c8211125b6f14c68900b58fe0bcc23ccf19888ebcf43618242c99afebf3faa3e6aa23f28e0dd9a44111196c85e970faaae0687eeccf8b5afac469e98c767828e81c387578dee7974224289d1a0e07f8469d347d866bf76fcc77743aad6335f3d724a30e345f8ab5d88a317a72ddd6895faa45eda3c4c5708772ab5dbe1e863e1ef82f4d2bb4fb79a94e840adeafdab87bfd7fe26f000000ffff1952d5963e040000",
+		"d59fc4238b094300197a337175692582": "1f8b08000000000000ffdc7c5d77db3892e8f3f5afa8a8e7b62847a164e7637aec56e6da8e93f6398ee3633bc9edcd667d20129230a6002e00dad6f4f8bfef01c00f00046525dd3d0feb879c882c14eabb0a408109a342c2c1d9c1e9af972797d797c7179f8e2fae3f5e9cc204ee084dd95d9cb10449c268bc6042c253e88d522491901ca3656f7fcb6038fbf0e6f8fae4cdf5e9f1d9bbab5f6002af5eec6f6d8d4630631c045b621092233ac7c031128c42c232c6d5db25924243e1748e05209a0265291640314e4132986248c96c8639a6328e634810c7b3227b52ce7cfce6ddf1f5d187d30f17d76f8edf1e7c3cbd8209f47e98cdfe9abe4a5e8c6b0a2db80f1fafde7d38397ba7019f3f7f954e5fce6621c093b3a30fef2bc09de4a7f4af330bf0d3f1c5d5f1ff6fcf3dbe473fa563fc2a0c78707475f2e9d8c099b9c370471fcece8e8fae8edf185033bb0f7a79f21f0ad58e1276922121e02d6754629ac26f5b00001a9a1789643c42793e281fab3fb9202246790e134079beef3d4f24b9c5672cc530817edf7b2b30e2c9e20af3a5f7366549b1547a42697a7c8ba93c2542628a79d44f3292dcf48710e1014c5e5b74a83f32836881c4916221c2b1447c8ee510fab43f1878a0ea2fc31216729995f45503f68380ca9a4e5298d423624229e6bf5cbd3fdddf6a8d20b386906ac010fa461e616a6c61c61c0b2c0f6ae945833651ea8f635970da7ef7d0a6e85b50d7b02ea411c110242fb037eaa1fef5308419ca840270b54d2891975ae3d5942595f60b4b2eb511ccb13cceb0faefe1ea248d7ac66c7a838075dce05591775987d2e22dca0a5bd7b17e104b4e96d12096ec94dd617e8484168b675b51397832815e2fa441cda616afcbe7631af3b4d5f60d3db13ba6c519c7a2c8a48009507c079758fab3cf188fb421039b351a4e45ace364881f328b682c24e2527c267261f8efb4dd9200a5958806387fe830981637641655b804f9a71238ec84261d8d20235266181628b951311e25091602b0b196b01bc3a4a654f323a2414cf1bd8c067140ccb0c61b3a1ca1adcb94883c432b354a54ac59c31e6c53ebb4fa24c388878cbea74362afc3e8d7d9e483eb870ed4373962e555bddea611feb16854922416ecce50f496e02cdd88acbe99f43347798e797f100bb9ca709c087185efa5a2b2d4c7de3463c9cd7ecf9910cb4b896421de6321d01c474b31df4c167a546fd0640598c052ccf75bd855c1f3bd73a8b19bcdb460774a9ea784de081db8874031992fa68c8b8d2633c1de9b463d54b51b10bad783a70dca9850e3acea252ba4f7961552bfb60cbd4abe4a2184266c49e8dc146f7b6099d16804d5dbfa9913c96c1206f09b1b4af4044f2740355d3f72c4f93e28d27aaad2fc79ca5f5b5335214905be166793098cd50415ce1e65e012fea467e1e8142ca19e5015424b3095505821e7ac5328d5dbc784c20ad929152d849e2f1a2dabcd4453a935281b97fecd64c30a19148eeb438192a4c85324f12f482c26a6fa6855a876256a46eddb4c3508fc54b3204232be8a39ce339460e5ba38a245960dc1fcdbffa1ffd460b463ab6be9b5cc60e2e6de5a96732ca31696d108ee16981abf4b1916b42f61816eb1857085a5c50844d65493091434c5334271eab355834d6c7a128e91c467d5bb0fd37fe0c4a9241ebc00df8a334a1b4da46927183bd65b248d4690145c2dceb215186519aeef489641c60406b332414a98f7aade99712c161bae371e5722f407fb8a0a4d2454ab5558207f0e0dd0f01c60d17af9dd91d64ea59b87928d46b59dac1a5632e1d42badea7034d272808c500c4b325f48b5b6469063aed7e134c17043b20cf327f518b3149fc001e76815cf385b967863c1b8635fa3117c56162f17d83183399602385eb25b9c0ee10eab0c576469a92e054d4ba98364ac46778b3810d1d8dcb982a7aa0ad061229c8fbe7cddef08aba14a59454415003d030c55ac0a7f9c176211f57f1639a2c6a4273d5ab2da7bddaf03f04801bcee050ae9303faa16f54a51c099c0df42c6e3f33f0402c15ac3161fa8329440548fffc1088d7af60c2a7c3d09b0e7cb7234724304aa4da3a3f60d2f771f4aa37fa8763dde981da9229105c7bf73eba332f9c06a4cbf4f18a5385131661d949d3714cc7b947b11675e55ac577a11e33a2aba9d5709c79a4fe7eced5d1841d4906af4f46c67007bf06c471934a692af8c842394dda1955091a1c483d3413d9159d382d137308d684fd7120dfaa63a7c56173415804f5a09866ee70628da8801fdf0d9ce402de3df927b9c46bbaea4509a6a0b20e9812d26328b9e585816486808dfe6ec5560a888ef1da4294e41cd60a856483af3a6994b2d955db07a963947f942017cc25ce2fb2e3053b6184abc30fa7c0c44e8c8b824942c8b25889c133a3fc5742e178ecff96a7a0dcfc79dfc1bca32b432d5dfb2c890643cb691fb08072d972b93a5f2d9904eacf129ceb0c4ebc564602c496db521bbd476610287af38f85f26eb8ec2ce9ab8f4622fb9d1bd26360d9d576a95d7f58e88e3652e57b007b3826a9f8d42f9b09cb2dc1eac7c5fffb496161318af4f42158b264098b2256174a834a9fe39f4dcbd154e94cf278c7ebbcfdb5382b821798ed3da8874187b5dfe3ab463412831b73dff389d638f8ffdf6109b0f154f141fded6e56854ae8f207512dc8c719821d1ac4e2063eca6c8bdf206aaf858af55ba626439d95979e442289104654a8bca3598b6b9d6000fb7c032d2fc1aeec266bbc1a69bbbb252d46a9b3221d797643793877f229387dfc8e4a33c1eaa2acbca2adf6fcc8f1b316c121a1fbc65c59fe4a23660992f8c1b0489b57386f631cbbdfe38bf596784754e0b0a34ac55270fb68cb76bb63210478341c7714533269868a1ed5d9dd31d7edf74be0c42cebcce6c3db3faa32c3714a3d55a806538ced8bc35af15fe8301bbb5d878a7ccf0772e321664bec8d4121ca7678fac372c50bd37e182bab0da4360029fc82d8a359de6510ba97e4a12e1c27e22f82ebec3d379f6ae7cdf5efda02c31c58c3b34518b0e941165433e55a60c72e14f4d6934633cc16f08d70b93a8216de829d02e9cf6e0f97818787bc4f06cb607e3783c1eefb8002947d6eb5df7e59ca35b22576af514ef366a0f0b972422ce08bd8922f56fe0dca62c8d82523d251447ed8685ae232577d6727fea9cb33947cb685a902c3d223cc974217eb94029e63af7748c579566a4776fbaa95686f5194fdf9d1ac491d566300cf63bac259d639a628e79c0c8aa576b546eac66cf36a196de34677b2ea343dff3252214f3bdee73273d32e97ba5b02151bbdc9edea459c3a9aa25f4e19ebfad68a29452d04772c432c6cb231dddfe3204816ef1441f465acc574d0b1f4faa2d805a877363031f4f8c1edd0d9872cc93757bc71a2436cd3713434570eb9bcc22455b3069fbb1cb1c1cbbf43cb485a0245909a10ab38f0b2261d491821281c214ccfd64a6ca0725015a64994fbc42a79c362c574dde891a1f933450659623d749574fa2c16a09e7880b6c78d68f1ecbd041a98724afedb25a37b429ee5869b53471b8523f4e52cddee3da78547c3a28ba66b981e03617dab79b6823288f364730ee7188c0994e48fe767055dfb652f26b18c3bffed5e11ee56e416bb360348224c3884291573bf7e15267ed4e6820dac7533c27f4a3d6b5938d373fd072246061188da0e6af3af7d151c525a31df66c84c350479c37cb59ebe00cd1957b781603657241e8bcec12b404efc6c56ad093c9a431c1962e1abeeac3616b79e240af3bc70e7b6e200f0c3bfafdbadabada51940ec1156ba075717dc071d86685fc3ebecd51f5bf9171976b3a0c3577ae09882197c1346d1cc6795f952a31c7e6bf812eb82af7fbe53fd6cfddfa47578227342faa516ef56211d52a330cba78c90a818fa9c4bcb39e5bd308a892c59a52c69ee314a35b1c45c186cd3f3212c206d110bea115f2c1e10fbc53de738e6f092b84b6a580d2d6c7d076379ecf6630233dee076545dd7461060cb69a3c0b4dae15b066f260da1f061aa8d792f087f84c789334ac0894a64ec1a7aa14eaa20b6d09052a97470bc9c0ece6a843035af543c3867576d1497e7d501220fad1f1de598b67ce46b6fec846fc056d245f6f601ce47946ca3689f63646c1b316c28267308182679e8c6655b7b9d993a89acf756cf0e599563b17ce616d10b4dac650d03a6856504136d3ba2940379d99e31c64f188328e51ba820afeef1e131963e919be03e7bca279f5214bcd2ba760fcbe6e26a3d350f38d2f834ab41daddc56dbd3c6ad3a8e5505026107018f747a3ed27859658a4af8c1006533dbc6b6efafe8ebbdbcfeff4d1cf03de8c353588af910fa7ae9b007738e56fdceb27fa3beceef60218cf311465a83be951d774fd4d77c4bb6a55bc65e2742bb93d7b41898cd7f1badc0f2449521b728abaa845647b82f9caaaf38cef4665e5739106eb7ef96bad3fa543166da7e1a590de1f978ecf94be19e70aa5c519e0cbd55ce7f459698bf2d680213081742e5a67a1d455e7ba1e329ec8c832c364a096c8ec7710c1c2798dce2b469b8a827790a3d6517a12e233f703903376c34d23debb56aeb2d2e47285d53eb7b0717da55089daf29cd027b68ce0430710c2ca89521bcac35ea60fa8ca7822537cd7e7a65ce1e756edbcd0d496ed86c56660abb4bd74f38a66b2b1c5aed8207ec4b127fb0c6addaae7d0e62b3553a07d87d3efaa69d714798119ca55de9c7efe4f76f0af8f1a16bb740f723e548089c02a1aa9870f725aa6b5aad6b87482c62514c85d41adb71b697aae4198ac8a1c4d915393d9369854efdbcac483ee3e9a58173e68c229ff29c33c91296999b470b2973b1d71bc0dfa17727c4de68d4833df55ff5bf41a56f5b2c25b12152624631e77ab7acfbf6482be0f76ad2c18c665381f92d4e6338cf30121838ce184a633fae54a94a8fea46d31b827bade6c177919a7a9663da84d4fff36dc4abc18ae853865242e7a05cc7275923c9099d6ba30a64aa8ee8650814aa8aed5db7ba28872a98db01a79bc344f73e87b34620be1a52079d1582c57eb33da33b28f5444a679da1b5a6696964d96535ca0fe52a37f7ec5224d197f1d7fd16847a5143949ee9b8650548d20398800d351e7a378583a30edd877e45f1c42fc6dc48f9f4e9bebfcd25ee884c161029de42993851a6dfbbeeedb5de808e6229abb71a9f019102fe51080908723b43d87f538ed18de7bdee64071d93392a2fd78ea0f764f6ccf174c785d2d10866249398032b2460ddc4455211842533b594ac0ab0c9c4d749c73d416856728155adfff7b04e301d42419b08a559106f22978ae0e032ba833ae856db510785243df44cdd95e923761f64d46952b0591dea2edb5ea8b3cc67dbe9db21e9c153bd81d2d196b6b918927fa318fc768def9484dfc4f41dc2a8feda876b0f5b5b5b2a76e9468fb20c6054a5522f01987e105545589b3051e0fb0b25357ab3532d51d414554b263457e533bc1c9a5b00676859c7b6f2345fbd8df5cb5322645c1e858ba881df77d0b6cedd4a74b7889b77e951794237be1f8fff86f14fb359e9cb7a19b4ca319b955f7650254fdf946c7df8f14770105623f4c3260e4de0858ae6a311fcc0e7532f135a27d6d565a068147df9af1fbe0e466a7dfc979dbfec943781d2c288160346c94225151517f17d82730933c285841fe2adb6368324fdad2689cfe7d329420e5dae58f4af132a4b2c756a1cc2ceab768b5270babf96d3315ecd18af99305a3b23fcfc33fc34807fc1f85e29ca9bde2f1839bb83be418cef737dbea2eaf405be2f3fd30177442e20576b145d75f57ee8c5701ccf63f8613c9ecdc6e318deb1f2a6bed9b968f51778dcb72d8616cb29e67ddb505c8e2d94f58e9736760b4c5bf5d6687b7b0bb64d3b0b0859cc66b005db23cbdeed4e1741fe59b56554939bd249b73283b9030b4ddfa243cdc396ee2bbd57a5d9129b0dc805e2a9224aaa9261999b7e13b31fc96670707ea2bb11934248b604a1bb771496dcb4f70ca150eba4e90af47151b575c9f71aea3b1a804ae2472378ab34a91c20e76449f4ad9b3b6c3eabf20290949c4c0b89c51edc0f6155f26e5685e49f38ae3dffe0eaeae2e4f0e3d5f1e5f5f9f1c5f5f9c5c9fb93f213262f9a8e19bdb47c7b0913f8e2d8555fd90b118ae0254e49b1cc61963124f7fb6eb74dff16f195b2aa5b9cbc28e5da0261248525223452ff1bc06f3e40e9c3d13cbb3e6784ca23c6781adfc33318c72f07b00d5d6f9efa6f569d63ea373fc338de7d19a602609e5dbfd54d67b6a104202b67dc0489124d341e04d1f8cf1efa5fcd3dadfe7f52bbb349ebe953404fb541a86976015ddfea93897326fcf946233847c98d673040a8646aac643c86b73acaaa04442510513796e084d1149e59266661bd2434c140645f181b51e6902bc92bbb4d100546b395720cd87d0153224132c86b4a441cb730ca45210065f90241b24094e24c11937296e7381d6ada8902d077a49010c5b2fee6d04efc887c8ceb1ed47ed4524b41890a9c06beb81609c7985eaa40d205b944f20514d792232ad4833fcb49b4450ba2c3c8c49e10b68d9159da1fd9940f613c849da005565e726902665b3e5f76bec2b63dd997f157b5be0ce0d2da87248c263cc4e4bf294c60c9d22819c2eecb57f178b0afb1a8a5218f9251f9ac73f8fcf70de71b0d2ffd663481dd972fe371373ab5c8de0900b8aebddf946865eaa8a1e759f3ff69319b61defcae36a9ac76c942924c7891a23ad8530a79beab6f0147af5ef8f1e48815fa2aabd5969b207a8bc46792cac5b0fcf10b26f3851c426d000d3411471ae40de172b56fa7756b7b56e5f3ea6f1b8e50968532a4725f5d78ab246cf2aa094df34c3783e27b6979f6f6c892084a9b6b4f2aec1f19707f3d3ccf6002f55b7769a069f9a8041968fab050baa34acdc1c41a5f5e2ea9da7dcbb83dac12ad87619ec585a8814b7cfee64aa572779e3996a7d59ba82e3fbef4ad18d01f42bfed89eaa91d1cccef5abbfdaf6d1a3145d3ac3cf336888c49d5a4c5f59cdf33d8a7d0c3617c402baf94eea17ee234d40dbfc7e0cadb26668bbb8aacc45c862f67458a560b9f8dfaffe548a9bf6ce07d6676d8962cc5992e121596fae8c15cebb54a57338fcab1485897081bb43913f00c7e5355de0324aa882114492c4c0f89a13aec12152bb65b182287ea9def18face7e7a5f7ea7e3e3494c525701da76bf2890edceb2f2ab5a473111df7ffb50780a3b6af833357ef55de377bf36d47bab976fc0f2dcc2d2ac1cd69bd705feef020b0933ce96010b43892c5096ad20e5e80e58c1cb258d0e6d72816d5456a4832b6519654f44c238564ad7a375640cabddcc6b2bbd1d021f0f37f32c9e129a962e36cfe2838b8b835faf0f3fbe7d7b7c312cdd2230463f7f83246a8fd1e21f2aa837bf9e1dbc3f39ba7e7371f039d0acede493e017d26c80e6a3123e98e2d3d466ef91e4e4fec5ecd60a374d2233e3add416d84c6a70edce2c247671d59934d7de289c6765d434814f5761988762ea1076b5f4de9e7e38b8aa89ee34e46d27efc787bf5620c7a7c7ef8fcfae86306eeb6f3d297e84fec329da856d78d1a64a798d1e2394559d7f3839bbbad4c56c53bffcbe24a0bff65308cc412428c36294235a7a9dd6a3d93c31b7bd834e6752c85565404ec8c577f5f3d649675dbaeb4aad86f37cc23377f79b23bf8b5d8e5584fb0e5695c97b5c1ed9f65fff2e5dc03f426b600debd6e0fd00a4c162839a277fb2a0a43e3a2233b56e05b940e5276ff05df30514538aa455bda0bb0882722baf1bebef1db8093974cfc72bf3f0bdc43435155319471bdbef76b94120019a72ffe90476fe0cd1781f86310971bd609ac39dc70453dd932a7930cd473657cf14575e80ad06c524859f6de01f7f8416b256dc1f8de00e833942048e4d12d7bd9f80e8ca9c2ad63c9aec1787909c5021314af52794ee505ee248ab8f6dc98546d0cb90903df3d0185408575593d21452accc4a6058227e837955145a786278476eb1004a120c1fa29d4108a3f5112995db252cd18daa38520c42f77f642bbd25aaf4be40148884447f076a8adb4749f62a88e52b6db4e7884bdb709532ba8b30dbb8d7826d68f70f1b18ba2eb596582e98de554ad6c64ec5ff02d139167a935817e3440a1b9f519288e1b3321fda977aeb8b4858605e0a59ef95518c5333d1c1f9094402e3b2da5bba1f53ddae228c75163a28091e74f8953e6739e72cc75c122c6cf72a5f569730f05d795baa92d0c3fed6c3d6ff040000ffffded3fc95605c0000",
+		"e53fd84f5bdfd14b9c7e8f95fe706d1d": "1f8b08000000000000ff9c544f8f9b3e14bce753bc9f7fe7e06c0e55d5029736daaeaadd54bbabae7a74cc039cf89fec076dfae92b2024e44f2f3d016fc6e399b145fadfe7f5a7d71fdf565093d1f92c1d1f288a7c0600901a2401b216212265aca172fe9e013f80a448637eef5e6a650c0698c313d24f1776f05dc54668f51b43ca07d6b0422bbb83803a6391f61a638d480c68ef316384bf88cb1819d401cb8cf1488294ec46dcba607abda4231cc4a20ccad374f556b462983288419e34b691b7aa155510be9e2f92bb65b2488cb2c936b23ce5c3927f5235e24a25e5437fb374e38a3df44133b611725705d7d8e203fcbf5c2cef96ef3e8e410ad5822a32a65de50eb37eeefb69df1fcbefd72f5f1e1e1f57cfe926e44fabd7b7f5f3d794fb095d990aa416311e94cecd2a53f1cac5c4db8a81d094b1e3c18d3e78a1da7c76eea9af4c76f96e80ca96370c771b367d25fe0616509833c68932ca461441d66f41787f34774a697d4313daf4fa30f05a48ac9d2e308c04285d00eb0a4c92848168c84967bc46c28cb9b2bcad3f686e1a226759bf9bd428028356e806c7af1c4ee6877eaeb2741bc7b5d5cae231d02d706c78daf3b510098a9786fd117e282e4a9fe0cafe1d730d5d9ed629cde135e5dd6dee6e35efff127f020000ffffe59390183c040000",
+		"e9d210da24854b7def3efaf55a93b7dc": "1f8b08000000000000ffecbded7adb38b230f87faf82d6798f06b04ab424dbe90e15c4eb244e4fce3a4e3671cf4c3f1a1d0f2d42123b14a006415b6a4917b03ff70af616f712f6c1074990a2ec74bfe73dbfb63b8f450085ef42a15055281c4d333691316788e24d3c452d7eff2b9dc8162172bda47cead1d5920b99b6dbad8c45741a331ab58ef2c4058fb28462f3e35b5042111ed224a59e2a2f2fbf2cd194d26e9b5f3f5c44d87ca2d118a8c9ba790885c7864d753ec62ce28f178c988fa0096696f0fb30b960c47c34c2a43499b6db8811f58181f97f8b1f42d5f6dd0e1583823782ca4c302f8ff128622041e04d11c35108991ebc23390ac7e68be92fd58b94348c81a0bf65b1a0edb6fd18aa3c59bb9d625b5f8a4238ea61151fe771b18d53a54e09a38fde95105ca0d6db90312ebd69cc223b25de5f5a9db0d3fa4b0b0fe55cf0476fea4f784449ebe3a7773f5f5fdddd7cbabd7bffe9e79b772d98ee547913a2da4e36760e83cd6e37547d18f5c6fe244c1234c9a7175c8c515925d180fdf1888e87b6a91cc90b1950bc830994392998b1db592855659eb89b72815471f1f78c1784a4370c5f093fa16c26e7c3b0d3c11c0935e845137668d30f46656b55e5a6c58250d46233112ee7be0859c4172d0c9c6c92f0f7f5d54a521605fb185066595031a32dec87cb65b246721ea7108a59b6a04ca67807a6c40f928a5072d15092f0ab20b620d150ca13b91b73d107f511946d35112dbc1b72ff271543360f54a431670ac83fb101ffd7b48541677132ebbf2d0c29157198c4bfd386de6c121e46ef055ffcc7d74f374edea9e08b5f53ce5476c905bde53500c94df26e0713caa4089358ae4da32e931917b19c2fd29332c934912fd598c59ca57ba06592ed0d6d1abf4dcc2415299d4855c0ac08b53014df5f6caa7ff2b38c93f4a492a00bdfede091decf1203f5777affd3f5898e3055ebcf0f6c99c9ab62422a604e5ade5876105f9c09c9a154134017126c1426a9af8f210b675498ba74cc492da9deb8861c7b89a6bba00722d844229cb148f065a5963cd294afc8d05542154a7ee6692c0b5c3383d9906cf2c97891b7c540ea887c78e4bb7841595a2bcc8db723499d113740f7e1e4db6328a2b77cb10c657c9f5067e477701daeb91ac7291713fa2e16742269e462b28a4f34500bc384b35486cce287c97b9247da12ff16d3c760734b573213d49d7b69a29c79b89449b88f1e3ad69dad4538a3373ca29f059f8970b18f4f350027ef75ccbe1dcae6a439399eaae8601db4a970b7a75f7fcb42b10f65a2eb7d6deea003a569593cb143a706fca4126f40ef749cc28260b30c454adff2840bb7f032d6ce5dfa306b28db8935250bca222a727cd53079940198a469518eb3a4cd6eececdd0e9c17a75e4497824e424923dffb9cd030a55e96528f2711159e25d61e9f7a0ff143a8d1d343afbc9eff03f6e2a9b7e699c7288dbc58daaea8e97a1f4e2417eb275b5105fdaf6ec8842f161953e4fdc991c8a19ea8beac4d5756ab0b3c2ebc7fcda55ca6c1c9c92c96f3ecde9ff0c549c81ec26fe1895dd069b20cff6519254dcaebf45ee4645e0da14a48e3c532a1e9c3ac85e18de08f29151fd89457884c196d3189150c31dfc1e6a96d2d387d014fed65c1e90ff0144d0f4e7f84666a1c9cbe84a7697b70d6836642169cf5e1bb686870368043e3109c9dc273a43f383b87c3143d387b018777e2e0ec07d89bb7e0ec25ecef22c1b9eee9de5a0dce0770609d07e7a77090bc04e76770808e04e7e7d044f483f317b0cf2f04e73fc001fa1f9cff0807086170feb229a946a08317bd3a5495f5085ef4a1996e072f06fb29df2a659fc293bb43f0e20c0e51fbe0851e2287ff0c5ebc80921f0b4ea1c6c3062fa1694b0efa7dd8633a837e99dd619a82fe195499dba0ff02aa7c7dd0ff016a8783e0b40735b63538ed43411582d3c16e0c83fdc346714614283ffb14074a32dd6e51c4279a77f7c328d273721da752b5f76213465110835804e12ed0814c05d21d86a9822e0adc3907d1ffd24ac4a2a18eb8ac83ee9587ead0a10b2de8823fd0a733646586788a04dedf24cc51374be9db70a996951733b5297db86ae121f54329c3c95cd7815a9cb53a6a1acae253b73d116d82154ded241cc45e6f897048bcc84fe55992ec60b31bc3e9f7a0037088418b0fb4a800a63081081258c203cc61060b58c30a1ee19e6c56410fd6416f979f6f5322ba0c2684762524441eb32e3d163023e931ef4c8ee34e020b921e879dc971d649a07744c8acdd563f8b767bf69af40859bc266717aac1019a92ac1b434478378425098fe32e3fcee0814c8f69273a669d25ccc9f45876a263d159eac21e4c61f376fb4117367f4d7ab6b035498fa3eef478023d42c8dac6aec8fa55efa2bb3e1904eb9301ac480f1ec9e478d98d8e13b8f757043dbeea5d3c7657c16367854fd6f048a6c749373d5ec2bdbfde4bbdc718ef9cf137837eb63fe8058c1fd199a094e84d3b15931313361b7d09754fe523a58cd1342d419dc83afc24e129ad42175175583ad11b7f3c89e5ba0477632defb069ae37d03473af8ae005ec7529f8010e141ffcb81bc3f973d8e98425a278331fd1f10919ec5c281debc7d198f42a54086f52a2e2214329861855e80756072d44150dbf0a2773b565a0100f27b928c7a46bf91f99f84bbe44182441fdcec3888df1c972c4c62048a47e38e90d792904ea74b859473111233e1e3e8ce271872c47f1f858eed8112169bb8de62336ee105dd6ae42a8f0e661bf3319aa0d0cdec44841e15a874d7b55ca50358d8cc690a8df6e1f548bdd3263059f8ce89810d2edb7db487f27a370dce9c3d45f66e91c518cc1829884761b2d475477271c4334a263031862bcdb1f4fae72cb31e9c152fd14c54a3c9c96e3acda1c92a99fcee3a9446a0a6c915094a6767c1a993902010cef769650a91e4ed49f887cd222637f2268282952ab1d43d218bb6c8c7d688c9d37c5e6c4afda5de1b438ef3fdb6e6dfe6f749da239ce0190c430dfa71c2ffee88298ee638bc68fd0a07eacc691a30a9e9821a7c46d588afd45b844ae503527f0233ade617f1a27928a26007aa410688741219e995590446db45136a1c8ed4e99a7c37678285ff72ea6a3704c10ebf6f1890c74a082a37b78ef60786a30fbf012d00016bbf577aa96621f328361ac11690586d4206d56606b56c5d6986405b636e1680cbcc0d11032859e6923724dbf1fb9641db90486e93efefcf087f087e5a273eacfa8543d4811536465988d98462b8124e818dd190159638be3296204b1edb675cfe5bc857dc9aff923156fc394220c269610a22062a6d86515c08284a5862666792437ba17ad06ca64eb48c5ee716057aba5969079e519d633db8ef72d669117a7811733f07826d571dcb46b2848bc3b34bc598d85cdc7a6a7b52234577fc861be3108d21b8a5739ce0f4587f4b1ec103a12635ff20f91eace453fe8e5132a6bfcebff5405ea8cf16415a1bb442ff24282de3ecefcf8df48737ac31ad5c9c961d1826258d48a1dd257b2dd469448ac0e038a3cd0ff9f3cfc79f2f0f2e9a9ce87e770b51bce4ae9993e39187d6da12b2b149b8da7a624b90f27dfbc38f568be7e25f7eea91716aacd96d12cc6848d64a1c88bb75b6462c8688c213643bfc90b0c044ce42ae03b0c74077c3aadb4d1f48a1347fd5a68f4a45a7b3c5f7a8d3d07ad165575e7d3dbd45ba3228d684225f574d33565cb9772a81b0f19e90db35761c92a66381c6546b7a93a420811ed76e8a7cb249e509441bfd052d21d4c63419d9ee55a445d9b222122ef07d543c887854ece56f85aa13a279742846b7f29b8e4aaf9b636a3602db2401fe361a90ded0d6397c58d73be4d8ce2f1302c3a60d581a13f912be04ee377b5756848de3e595747db78baf6ca13b6370d9374ed198b002f4c3d2388f1d2ccd80894ad6464a44ed0d05203d582169f4e5b63500456be6265db258ea788faf330fdf4c83e0bbea442aecd04ef37e8aba9256fcf3d35d5c7d39846e0a5319b502f965e98081a466b6f1ea6ded216e9fda5d551a56a05b8b3165d1e4a8dc5d0b45dadbf7271734698cf19509f4fa7ea733a552b3c169430fd037467d674bff7fc113f4795d6c80ea34681b1da712dc697d820f95729623633f820f5ee2e701513a48b0956e0338ac7b886f45ecc3c6ad3c37d1191c682bd8990b846528ac5aaa7c88cd050d382a2dba5ace981c791d73b22445c20aa60d47121505fbbdd3e3dec37a8e69db16b2090eef675d3bc7d5174a38e850cef6a32a87c1ad4889a761242241624377729c809bda081dea30a2b144e981a28b58de892f482cf09d75010eec751bedabe8dc4b822cc2a46e74631f38e1c0a6f1492a1d6641eb2198d5a30719a3c5519ef34b2a1562ac3fb84b6803a0013cd0cd8c936cb8cbacb2cb77250f4a915468aec12e19bba6ed74b7a8184cf7844dbedc47e294e13849fc4ec5bbbfd80cc17c641cb48c3ea05b4db45094bfb55669f17d9779f09530caeda18d3b73c63d2654e2284379f490f5865ff74176962cedaf0b943f439c7ddd3d1835354521aa3a891d6735492e9bc096a9d1b72bd476d6216cb373c5a23ec3d86a9a756208dbcc758cebd8c7d63fc9179aa935e1cd96d9213e12fad12c3a284dda46648e0212757aad637349537f451959c6b3c508c77925cf96114a9e84ba94eabd28f234241b59d4858208a618d046eb791f4e3f473cc188dc851cf15592cab4c15a89eb3f150716dea434b22c16e8b7a595c59c9a6eea6c4cee83da8a2168adfd2bc2d560dd08c744e216f4679da58d76352c7204c3fbe2e15d9d2c2dc1c0df1f057444160f86659565156372f27cba6aa016c9aaea241bc126b9a26daed05121a3fb8fae4fad3f6d8165c74da3651ba23382b47706450866abc2d8cb0d8b05c631f4339f717314316263f700f3098d3821c763a05c7638146620c31e1b61b4744cfd4c5cd288f1907ea5b8fe5306eb7638551ed36334c565c6ce2ac6cf3a26c738ee8cc5f84694aae15d2dc648b7b2afc38bd096f6c42c3d6aa86d153695e3ae75912193e90e9bc2d072fd6ee49469d060a5cdc6ea91f85326cb7cd6f91e0e45ed59a9a7766bb456ab98289c6e0f4eed1b1292b0fc6e5ee2c2ffa9d7c073c390dfa3b6d6ab7df41ada6f35229b289d611943c44c9891adcbe774cc196f3751a4f523f8d1759124a2e5a18aec8bd62f1afc9a35a590d5ba3d4c4ef6398a6ed36ba2665d0947fd3c8d87e239b1d28d2f72bb9f2532a65cc66a99f6a1cbd15214ba75c2cb65b3e8c10861499a22ec9511feec8269574e92ad2e32952dbd9678bb547bda139f15df90a12e1e19d9f84a9fcc81f28a1506e2b74d9cad7373df90c92b057c4eff5f3b1be3c224411934b2241ad4e0c7207760d16763d0d522935ed0a8f77903e016cea55b043a646a0d0071b3696c11eab7c8053862b3f660f611247a1a46fdef015c2ba995a5779b8e66ff9e2b1a3b6510b32607a5daad683e401f325d73dd1056a9cd29602fb165a86d6dbcaed1ea5c86c20601933350841551a67707c65b6b7a14be38fd80ee2548f9b8e3930c42a5f916b07519c2e794adda669ceb5c26014736fa1a396192addd24c7d192a1984502c81e0ca5a0532c891c8d141c5e80ec35d55dce0f27a8eeaa328f1e905678fa00d068cb0a9eb83fb03385c52d07fa9d8cc06a56c813ea3b3f1e8a5b670b5969c1553ca4d942d035dc67768f272fe9211b6dd729044aa1f415aa9e6e81d73ea8bfff8fae9c6d7e60288e2c01c1843c8488c70853d353c54badd3a318ab6a4fbe4cedaff263c8c3c631da318179e494f17e1852cd2dc4b6a8f6cb9f1ac8e2bf9c63037586696a54bb53dada2b169fdacd0528cd021c2ab392545c242e9c5a967d767e0dd180e4ac52de2345503838799e220f4c69e2a3626d5fb8911001546bece865bb6734aa46534cb764ef7da6936da16de6e1b12d5ce7bb81baae8fd6ef8de1b2ee79e29570fad2ac50b05cdad94a3bc579a4d9ddabd1ea67aa387a9eda05d4259ed785e9cdbebba65775158c35c674d14d60c0a611bb4a0eed9aa2e55d49ccf764b5ff5f647e283e9b4650e3c7516b488a4491808c290412a7b0ce9f6f5094414fd97203b7d0c6504ed48a09d5aa48e2af67907b8db87c131ed2ae09ad0f3cf379b11e93015aca8ac07baa23282e675b326218aaabbbf5ff7a5f4121aa6d2938fdc54ab91a390bb4db9f0267cb1d47caa9dc97c3415a35b1d4f3d9a2a2c88ecf48742c7082c8fb4c08a3b03281cd3f78abc5b16ed3d927abcb65bd9346806eba3c2fa4a37bbc0fa9bea506a094338997bcb50c8d89c6a0b6672a6991de1c979c8bc9eed9e367628ba6745ecba332acc091df257b423b51a372efa258017fd8a6b42f6ff1ac4150501ea6190a45f8cba839ddd3e38d859b557b1d294577d35ac0df870a0256a0067228e2a28508e513c457d42086db7fb46566187c06d6c7c60247b43fe4a96eaf090880e3fa643f1baa7ce1879a74210ddbe4ac0c0f7523a8877fbf89816742aae5ad1e4263a79b7b75bf127fa7e5ae9bcb58569eabef929c4ac993b0a99bba7e9eda11c05aa474185adf8ac94a0a6243ca6c712a68477e263da49877a141cc20dbcdb374918e2bdb40e8af508a9d4703f55e543a18638964dd47e6a31f88f60af1ab7fb3009d984469e149456d119b839a62ef9231a0035e8dd33c35862793fc7725eca8a6222212483e31832f557119aa23731842ea58e212bba236a22a943dda9d38e9252bc26057d68d84cca6568752d0d4b30324b704f7156958ee99278595287e1611348a90174a9ad43663b0c4487e19dc1fdef99b94912ff96512dfd52f36783b198246afae229fa4eaa61327e8d7fa70dc5e4edd6fb071864a71ad90592101f4b8bc2654fe2631ddfed97db86b311f2bad84eed82dc15b859eb3563a8f79ac806b674ce794abd7411260915debfbefdcbf73eb802fd2414b37c97a863fabfd8bf2c5e849041da7063cb7ea078bb3d1b609816c863488134a4a098f2b01ca4895926d3842bf2793250ac4844fac3e8d564d8e944b85e484650d409f1bf4b637a696964660a7c2a633c45a9cfe84abee3d97d42117e65497242c26151aaeee592184824313c90252124d96ea785e43981a5391eb4dbd352329260cb152b1ad9ede30967326619d50d1b3e0cf1f794aa6a9f133752f5cccacd74cc1c3b1d5779f2f53fdde597c0c228a22290903336012f3edfc48645a0410c39f17a13b35b416930856528e7410893584cb22414d7a620016a7b508752b54b042930ae7b1c4ce0319432fd2a059f85f2f720017721049151eef27d5e79e8f0d3da3ea838994ecda507ad99386c1c9c9b02f7cf1587fd8cf95c2e656859991a71d50b1db544de8592160c287df43862759332398f533fa534aa6adead425f553a8cb8c7c8e05843ba68a6d89503f194b063d691c772f8388f138ae86bd2df6ef5265172c4c77a7da4bf0989ba031348f80c517c422b9a95dcb8a0686aa14623b433e80f7e78d91f0cfa671d445fbdea0f70fb6cf0f2ece58b1f062fcf819232d046a7a767e7bd1f063ff47aff49ff93be7efdbaff12832ae4f487b31f5ef44f5f9eea32ce9f2882764ecfcf7b2f4ecffbfd17ff495fbdb2059c0dcefb2f5f9efef0f2075dc2e9538de89d0dce5f9e9dbf789937e205066716000d5efc78767a7e767edea6f8240fbc68d6f83824666f1e8e69dd28b97226b3e8a3982cbd924bfbae6e7fc85ef786dd2ec392c46669337d92d2ca1ed08a373a62ea8b8d8928e6c3c5ad5cfea408b8dd6d9df2a52e5f629197af4f6a5c1bbf80fae3d4c481218e8779ee769b213aea8d8dcd524cd8762b0c2fd7a0b837a537d82a64a9e48b2f7ab97911a7a9a7768b452827f3f20c75f9f943e0e9d6e1f26a7645ac908bf58c302ee090ceb3e934a181dc1d90509915de1095dfd32529704722a9aa27d95e94996312561232164fb958d462676196a671c8486c95a2cf18213a21869c002d2591bff9f77416b39f97512829794fbec16f3e65910dff443ec31b22e11311f09bd674432e71fdcd157e19eaa520861acc411f69b0f58b35044962f62da0506a0603e62a5f45155a6ded4f404f0cb42b056bb054283823234db23601a28587efada45c92a8a2344052cb5c08834f48422bd383d1c23840525fa3374661f0b5d331006114b530860f461bf713c2202bfc6631da1f2a5adda424fc51ae6acce5cb477da775cc48adacd6cb86b4c2ae6681e668fb055e203912e362efb58a2ed504f8daedc227c420d7d662dde8a35e455b68f0296f85d06ddc6e15df0e9c4488e90053cce3cf16381fc1db5c210521121063a04784b0763b448a01843728b663a6ab8d2b8a45d708c2503a77dbcb1aae98cc9b3201276febe23ba187986fb76b0d82377cbb456f1585eae572e4d6ffdeea789d8e8a1ceaa23a31b08ea3593bd086596d2a73f00b3b5981bee751d5cab9b684477d2b68e288c2adb1d37cd5abe002dce6c6460cfa0ede163a4f3d43b9aed3a2b27658a1ca94565309ec35e9b5db36e896884114d0a20a2d9aa0df20fa04feac1dbd85699955a56fb747a2a635cdf1d89cabf6c4b7325792e6c25b6344c54bcb4aaace29b921272e845a4ef9ae9651e3347c6c321cd8e98e34e81715f3d46cea42b1d9717b20c96dde68a6f9798629bad517078a02efabb89a0f8b28c6b8516758f4495e5ce7226c50e31b5c5582653d57c57690d3077bf981365c7ea0233e8690c4aea96aacc733c8e3742389441f46e118625ca80e1dedf8f51fad521be23975b6dbb68ad85a0bc4b8b1a21b843765e81bc29b771de2588f7e56315dd2d7b789deb5db5f729bba5ebb8d7eb32aad42cdf505430e407ace08fe5aee918e25d1c565e0a8af2e73273887d0a262a4a92d913ee043666ee8c3888de478ecf4b9a8e8eea98aacef1b8d86eaa4ffa128ce2d6b4709dd6e373b68654c1d80d4f1e843d48a8da67ec259ca13ea3f8682554f4281f755aae3189b6915467195bbe7f7cfbc7fb965fdab760ffb9fece7947aff5a64898c7551fff2f8d2305e2c95348cfec95ad0d27f6eb8a48127e75450554898a4dc3333a43a14d1699825d2bba7f3f021e622f0deab9630fee8f1472b55d615fc93c5a9a7ba1247541416ab8a1d0cbdb219defdba2812e9cc349ae97a4d6fb0dfc240fd3203d1fc58d14f0c25b7e140697b0727d39125d21f9afcd35494fc170d2aff60b3835b321ac35bb2d9c157d28377a4071fc9af08c3cf957a2fe6c1037c51a06fc80d7c2237f09edcc04fe4067e231b2bcc0826608fe3c112ca837ab0b0010d93e4dafa20828a30a74181fdb5d0991f04c989610919ccc031dc0a3ec29ec57570efc6058fe030a7c17b2818d3e02798243414c10aac142258abafb2f526ae503c4fd16f1818c2f0dbdedd0197ebeaf68d814ccc22bafa342d76a83c22b701d5a2c77c013b5bd75076481f5b2364cd8d165705f20af6ae16e8c39eb6e6d25f256f67c28611ad5d91c51b6b3074915b175943f8c086c9888d1b6fc9ea322dcdb535ea8d9339b549c8db24f64e9d85d96b6e7c8a70a7f5fffe3ffff7ffe5b53acc89dc53474ebf4f47af15e8df713746cf829a2cbadd224a363b0c4c935c2d33657a0e9aec557373abbd24885de35508c911df6e731a3b92e32342e26178a18fb10a22283d9f9158ad7d6dc2aa7fc05828ef9a54b3f6e0f61d3739f41c2c794a8cb84733b5264ed087cf0df1fa92bb8935110f34e1fae6a813a74dbffa7b8b80b6dbb9ecc9316d358288558358ca5f5d507f15f44ca1eb2688f505f5d7414f1d9a0e9572419f28815db0a0b77f93bc3630f6c678c3d05453cac1091b06276c1e9cbc88ff85c363207e6f82f8fd82fabfffcf0ee0c1f2e58554c35ba2e6c61a20fd8d4e24178328e0a0624ea320b671a75110ee40b84656a52116a91a2cb9d3e1af483e67fe2aa73a79daba4c5b13b6abc83b044da924ced66207c2f6b8b783f83b1a53e2cc1f6e4e35edf732ed772277107e7f53ed2cf4f29b004f5fef6992ee516064996f39da104d51bbb91fb3940af98647314dd1120f59b73bc494e86bcfaefda5b91d35b12d4518e6be916ba8497eaf52b411b18d44d4de2961e4a138d4a892173980b9115d78c7f34f92f8fec458246ae7780eb55f2d79aace88ae458af5890761c3b6306424460c36a6b46b731deeb40726fc96d3e934f89176cf6026c28758ae836edf1f809c531906fe8f1089d002f9bd81f612f655d26530e8edcce69d116659adff330ba35b41e9765b36e2b72c8ca4a0f45e3bb22b40dff08c45a906345dbdd7112dad47b230ef4438d323e98045795c0bc3a48034767375d8b48c6d618888623b249d6959a20346b3848a0f454a0b43e234335a3ba065640bc352f1880feacf9c6488619891142dd5f6b1205a90b3260aad60458e7af0487a704f36f71aaf8225fc66872a98db69488307c82d51030675235369c5469444aa0e3f9f86423431cb1149df04b3c6ed15e3c503178f149c62d61de3295be432bf0bef947829bfbbccdc3abf56b839c3258e546799735bc07650dac8d72b2a24424b977d542dd0b21d5c94e68855f499755988c767c56a552738284ce7832af128f4aada66a7c1bed91afc8551a4a5219e9942753ed234c1730d2af7363ad96e2349baf63813ea0d33774812bf26bd8b38e8f61dab9b87c22d40a879ff5b2ec3e4237fd07e9c1a0e0a8ff920eef5ad3a8c0fee30e69cf9eb6eff023d5486f0a8870373423386b80d772a9a8c6467cefd8be2ee05b516af6ff8aaa1e5ab761b3978bc52673e98f9f77cb583aa91b19b59adaf5d41bb1a5a52dc8ca21788f916905098fbe6fc9ca24d9e9bee0c7f838302706729e1b3056bb06ab126a75ba88ed9ed4a3fad0cee3184e81ec37d8dafad12c660a01d49d5a85030e8c31e650c06033840db82c12954f7966070060df432189c3fe1ffc96e4141bff784f32687f2078317bb310c1aeeeb355c0eacefdeb9929339bbb51e74d7c8c45ebcf878f98fbbbf5d5eff7c05623f8a17511f6e6c54b81735a46a5bded88d6d44c7c3acd8f52f5066b99cac647e20b3dc4d19b7c601722088cd050e848d5b639b7df5ca90051b2aa25f737d71b516bd7e25b474af56c8fa75d86ea3b088dec5feaa4f24c4fe6a4038c4feba4f84fa1990705f515fb7eb381b281663b3ea073d58ab3fab81fa1a94f6e79b7bbe0a62300b3610a0896be56a84aa5f57db338dd075f75c32f2c41d811804e9694fc3fab6a4bdd8544cbab9524cdd2bc5a243e8281bdbe10e9dd07a284e4a2f1d61f9bdd317370541cc5ff53bcc5f0df0c90042155eabf05a8587c6604dfa2e0b950fc22a101d6e54b529eea627035807613566a7fe2b0fe7a55b33b52abec349726e5ebf14f12296f183b6a36cbe57eb285684afaf9a51ecd6dd5054d0ff51b5a3c154bf6975169e33f6784fd1c0a40e19918af7ac3091bbfc0adfc6a28edb819caf5e7509f38b6cc7b43861fa2bc861d60761d6258d1588018751ab806b8d3170774c9e22676a649ebd80502a667ac015ae1bbc85ac40b3a1bd2594e56c4acf917365a5562635dafd296127e6fc3c4c9d8e77c8f438cdc7079c94b59bb21e1a232b3727446e700d09294d4c26c7934e741ce161a2afc9bbd9c8e424a9d443a29344cd343bae941e5723d6608f831d22ece7ba4362e01d536d789f2281d5022d82854e10f163de098f437c92ed0b7a064f9bd6175edd1cc15c2996cbcf9f563b61c5721385124498c0238d6773b97fbae7173ce83734a7c10ee9cfaf992602dc74f0cbd7947b7e1ba8f35be580f7637e3e8b1b97996d901e22558b2fb93a50dac179d5bb6015621794b4937033b75d996f6b36666d63d6903ad8151e879dec38c34385fea9de9f90a85a45f9e7f8e45cad9603094dc5e56ef8d36e0c13828ea899c8edd67e383d302364e3f1f1f4243da676a687325f4d1d32390e210fae5530035ed22295ca4bb23339ceaa5c5c0ca396535d0b5aeef02992137f2fc969707fa970ed3b3c64e5b445ab1ca9e6c07a41df09f58381131a04a74ee8b4a6542f7c15548a23b25a2091d5228934856af58d2e96c8461f108d4219321b2d8a9baaf402e5956af97d5ea31318b881d33c70cfa375fead6590e6e71ff6f717d2d3f7a4a7da59975ef00afd9744e594922f480f07c84837a7a05a4428864e6701b4e645ae3013d3d7069696e6f7604afa30213d6dd4aa8ddf47bd31590fa796b17c20f16832861979d04d1d4ebb0abe438cd1c282cc14773b9cb5db8b0b24c9cc2e376a979bb0316b1bb3cecdcef5fa90c7b2238e8539f972cd53d66c60f355250e253415878191e478a6c7efd80ce389a2d4c75c9371762c21533f02070b5de98319f213f3eb34de44fc524df86fea037a30f3dd7dd0d38f4ff8abf905523d7bf89e9ea107838eed368a47d198d8204c3ba40f5187f43198a87e15a2bf0f31a8420cf6214eab10a70e04c63b5ad2adb064873a24abfb54d418fae461a8888abfe77c0469c9d31881666a2499f64e201db19cff9e9481f5706a8f2c530cd3d7b1ea9bfa9cbc32e79b0986893dbc4c8c14342271574042c2aeb1918c5e271721e19d288889d0ce557bb0261261589ba52c606d17730c6bbd9c39acf3051d022369b76fed6fd0da9008d53c2be1cd90b6da5ce39a31a93e6c1452232b8a5903c5c3a3073f4eaf164bb9467858ca548cc3cc98307d831342c2cc1ad7c619ea2b3f5bc6b578eb30c21c3121547f713ea8a7c3886f72a6ce457748088a2d4ec706a78f27b024ba4cd5f36eac86021f4f86f9d1d5807592e2dcaa213a4b505468678c92a7af7bed76ad2939073bdd4b31e47a67072786ac18a81842bc2b3cb9cc4968316366bfd6c3d81068f3d309f50fc4965cdb5f1b7d3cb709bfd8845ff28499a59b3dc8bb078fc5b87456ea40776fba0957e5d074eed5c96efefab1dd460bb5b656e4111e89cd8661f6facaa4a8dc577045f28c86f5b82602c5b0c0c3eb0bdbdb6b087180ae35525e1ba45cc1b546c57bb8b6c8f908d739525ee9cf684d42e0aa28b8c678b7dbe93bcc9b1d94a2aa7d55549e74517c050abbad0caa015e275cd8dfc0ffd19e680f339ffd973f9e61981a5d8442652d70d721a322f92ac3c9372d573791e9d77051f81ab04274dbb65c54ae36d409cc896d06cc5474b19087c50331a50626086146e517ce9b049deb1dd4542e410c56f6d624aea317a8412d68dbd86ea38414210c0d90bad1ed369a13fb9d8bf50af161626585f3fcc05f1dac60a09d02d7862a18681ff37a8c83c1cb03dcdfd33afcfcb682aa460daa55ac2d3f44ab9a6fe04299a8eacbcf4686fe54ecb21db524d95842d73007da915359d90ed44a6874b6503670e464180fb57970de18db121c1c807695f49d4eb5625ef7cae124bfee15962365c1ddae5bf46e5f7c551d45ab6b1c34d81a348962ca9e17675c759060fe4a9dfa9cb87597f9ebd2c4f4559f767f6cb785fecdeb6cd06f36d4695b5cee263ae870d045b85f0b0f6ae15327ac0974affcfe871bf8250f6872d7cb8fdacbfc3367a84dc890c05c6b7bfa8cffb6efbbc503153571e1cf9055eebfb0bdfb2fecd0fd17f69fccde7f518538f75f58fdfe4bb508e6de7f61fafe8b2ac0bdffc2eaf75fd8a1fb2fb6112fb07be785b9775e726aa9b8812662e75e7f31175ea0641c1a16b244b8e6aab044e027ef91c8ffd67b2475998a3e79d96bd8ce251aa12fd108cc89691e129dbe56988ff818d41fe73a4d0c0cc54d97688a2b2bce68597eda5edc69bc1824f23ad9fec59dfc62101f3afe211d9b11fbea9ca83f62c7f325f3b4dbbec64594593f239a474911c5f58b6e996bf336ad0294c75cb28923ed9aaf107b94ea2feb8b0a3163f066c215af0da1538e31970b724b7bd096d1c6d2fe8f946dd8687da7250d466330170346e31da40a63639812b9dd86cfbb2cd7d72a3906ed19c6388c89a76b9435bc6f70faec2323f99ae156395dd8b6b22637c7ae2933cbef0d1ff2360a997ee971d8523d6d1142c20b73ef006538907e28a5d0d76277fb3e9179edf292a3c3dc6ed10389d1122bae5d9746312c6b178e543f6d8670ffd9912558d3b06583f4a8c8d6f4fe48534e47452d2a5602e1724959f4761e27913116a85f5cb2900335343507b017da0cf8881076b1f4532a2fa514f17d26e9cd57642445c070b0b48ddc4fc5b054c9b3a69cb8f972d27e13f66a4ea1b5d237b8e6824e5b876aa942d5bd2e36e8a297bea42bf99633499924d414ea44edcc8567edde77df43125edaa75dfde2e11aa371b64f47dd7c4559fe4eaca73573c5433c5537bc0fe5d41510e4a8074b8daa6402f99492292c35ea91084c4349024b9f3322d5cf744a382cf5baffca336d7708cb1ab33ae18b659cd0d274ca46141ead0a905bba5826a1dc07bd93362537a30aa3a8ab75dfddc4e26b0b43465a732997c1c9c9e3e3a3ff78ea73313b19f47abd93f461d682b429b9fff2e5cb133d85ad52af9f3730382d54f27b0d094ecfa0a919c140d1a267d4527823c5ba38fb688204218a8defabf7822fac6d3185961af293d52269e162ceed64e3dd44edd888150fc635f8332ed6eb5f568b84a5819ae7a746c9d3604f82fc45bfa4a0b90574f29faffef9d839c1152f9572d41b17fee1730a9f66f7a914a80702775a5eabc3f4df225ee0dd21531e3d285ecc9699f4d46804b9e31dd5d68b96755a1e1ba489f842c3dba70635b2f8fe49f592bb9e69ffa4159c6a6b8c4a9ee0f45c4de033caace79d92e74721730dd4e5021df2cdf0461bde54f79a7d07beb474ab4dc743e1bcd7b13bcc1a52cd5cdcae971404d1ae62b6db53f5639c271b59d730f776ac69b7be088170a1eff42745acde198d5e3f75f5fa1ca5a34c3b168ea7e8d438a43186fba0df9c32a4322d64904e9c53e4d42d32465355a4bee6b56bb08aae4e046bdc3342a0a3d45a6d7242fd8730c9a8f1ab6eef65718bc2997d49daeee6d44ff8244c6ec2058594c4a3fe18a6242decb15a7e0bbf328f234cf719eb82967a934c08ca64b22ef9eb345b2afcf3184d157f7d1fb32866b3dcedd284c8513a1e4e2eec53330207268a8cc478b7dbbb1551c52233d77f539d246c148f736bd532da99744e44a5efe590a8de8604c5b5eec2ffc6b423edf022ccdf1708425d0fd9f3616ded4e4f361be4772ef06e7762d9b3a7fd42e49b65933ffc779f3e7ed6ebf36253239001df05fab0994354fd2deecd4f01a70e32ce9ca8e9586bf983a7a8fb948b45f1b6265f5275ee4933eae94b5b87dfd0749ec2744704613b024f6b098b57989d87adde96af3f73302f893851719dde1b9a94b9ef74395c5a58f1a35179ed23b30f80552e218748e2da29c161535d06928ee4b84b2bf7703456da0e7da3eb80815e818186daeddf364414fb29172a9b7ef447627b8828c5a0e5a32afbd47c1f24385343fe9c68ceb630a22cad5a2842f5191ad7ddcfd095af5ddc843701bb28dfaab14027481e23d9ed631c0c8e9f486d72007ffa071f3fc9cd926267170e4bafd03f7fb0be5463c25188a1d1532f67faee63bb1de79fa8883c98e59d08672687fa4279d41355f0655e035fa23c0a83b09eb063ad914031b111b8dd46b12fa85e89a8f0609da75a2ab7298dde6216a916dcbc137c597367312c8ceafcdab3dc86f1ab3f0eab26e2fb9e26d15ae60cec1385a40709e9c1921cf5e181f4604ef6cde77afa666ce91066bbb56cbd662681facb7046ffb1dd9a8f5f2eb43443c769de4b47e200517f92c494490d693e7fc1fa667b91d2a99f17ee79b4f6d389e049724da7722fbdc6643aa0ba6a5bcb53c5def2e577967aabe67ec4408e7730ab5e64117823db6d85dc9b55c0ba11ac03d14d76faae00246aa52c48d5342d957cf959f06538d3af035fecc5201c507f12b2094dde64f7f709d5c6c9eb5a314ba1e7e09db935db6ed76314355f3599f569cff447fd1d3c564bdc9b5dc5d617f303e5c4ede09ed40dc2f7322f71b53aeb1c413b04f4ef3329396bb7ed79dacd68fd185910c7ff4754e20a24e504c384505f866246a542ae544cecd401d35238352d6a52d49470fd5cc38267a97191008f95b86cd9822b6c3cf7a77be757ce529ad0894c15a5816943ba5a9826f5c9bc640513179aace0a85f98c7c3d533b3c28d4fe8bd5e1491b61b4fb721adb5610a1323ae17edb6d026f6d715339be68bee19de684d63a5816c0f35eb310803f3cdcc1a4e30470f1044dfe1e044ede2da723810a3deb8cb47bdb15a59a3befaee8f77434998ff38a734794713ad952c0327a72f7a01d36fc3c6c949f72564fa598318ef767053e9d551d66eb38bd623bdff169b5ba3be7dfbfaa2e1655c33bcba9e165ceb496b827af7e9e34705f855938e1c326bb78f58bb8d0e54d624d86aacaf11b0b14a0c19613bf856d327590bc962317559fe858f1b633b45ec2f45ec2f0eac1bbb83cf75d26056bce4d9645e38aad62f55148eebf3c4516f3c5434a7a81a9c827349d1a0b138435cbe21b72c2803fdb179e141be7ab810a4db0fe4eb076d49d2c790210a425109376fd1827553f42f3b0c0fe51b1fda38fad74abff5a66a17a5ce6e56ea675c89a42c6ac1afd53843f775747d455eba3329cd18eaea2122d2a18df2cfd0c6e5768b96e4a86709e25ea3d97e9bd95e93f10eee9ab69c261cb8b8d4db4b39b88604364e70bb8dcace3e3c39cf18ef4a59ce81251cf147d6827b7df0df83d06569a2d8823b0c1bcb5b36e9c798d57defc0f0934d30d281513c64138c7061f4126e82ba519d376096d174954a4f9110a7bf8d40b52e7fef0ef33f8bdf37460ed5702ce7561a665eff2f78b2e2c17b7b6fb580b074f4039bf2aa38cd244f631659cc2fdea828f8e903650467a7f0541382b33378b686e0ec7c3786b367df182b153e4c1bc6ab651f93cd0ec2fd37c3a5afe7e01d7f64f5e7610985d05f91927e86feba08fd0236a77d741d89fc06456c1ff0c9e581ed362f8f59c5276210ea3b8fd814f373f5c15b999f7e3e56ebb0ddb1b4be56952243c5712bff426e2d1ff943fd15dc523e24493c126e798a132f8e7bf917629a352f76b6d05fc1ba08ffd20dfdf50e3f397047bddd0e43edd0566b943d183260dbad3dfdd9b827f0fbeff4fea7eb93477a3f4b3eb065e662b8c5cdc310c18bbec2ad6795b9f5970272d773233ade318571b05984ab7f04fddee00c16e1ea17f395521a05ad775452b188599cca78e2198532a369ea2dc2887a0bea455c4ba35abbdc235d8c9876b5a9b90fedf261cf46f46044611f5a8f50fcf86607d386bd4571885655eeab7e60c5263a11bfa8cd7952e381a8bf7ac5fc555fab84577d42fd95228eabd7cc5f0d4ce4208f5cbf62feda40ae15e45a47be66feda40ae073a7207d19f762a9454fa1559549a2a7a3f41360819dec1d23553319aed9acca7dd4699ead1de1867aaf50db1abc1be796ea63ab5175b557e276ab37fa8343cb50da7bb9a2ca174bbd51b32f7b65d29bbd2cf9ed9d7e850fedc9d749fbb4bac89170eecf28a46327ff66e8cad33bd43991f90492f32a7231361c433bb66057f5257f03fa888ca937f730c1b91556f1e5af330ba5447f0fa25fc5c9d69a8dc738f12658dcf0251f75920d586679f1b525535bf62b4ff1e94fc8ea797d2f23130f3ea925a6db9d343c975507b3ddc3df58454c5ed9e2e51bf49b8220c84bf2652617c124e68add985087e7fb9d10b342514d4e81ab3caa9e6ce9b0970ed1a557cd892b5c64f08b588f718883c36387bf9bdf771ce9e3105a9398b2ddc5156df3da97073e6e153b68ba78503b984cf50eb761ea7de82ca398f6a3ee172fd419652ef6ff14368ef6a239cfb846b61281fd8a65690e318d770963f706482d369253c8d052de5381bba9294450db84e15fb1ba8e220558cb22e6917e4195853eade05e4d25f49a3dcdd756975f6b4eedbc83c1ab43c46d8b1dd1e59a947fd4122163ec433e3b8217f98ccf29641ab05d6575fd0eab576d61b872da7c8e76729159733ca64ed2978464e90111fe091f7cf93311afdf3d11f77f00948728254fd214617817f6c2bc1173530414ed0228d29f6ca38aee2f8ef7192d8cc179e7808f2747c71a22f22d0159d685fb3b2fc14e5272d157113be588632be4f680bbfd2af151450a38266e403128ffae3edd6199678345011bdd6ae493375f6b4b6bb66c8428a29cbd9f78b30d8701670fdca75bcaf8f2e84657bc7c2aa2bcfb806de74aad239acaa56dbbf6749e2f077c37af7f64082b31f5597bfd34dbd91d46b25399f4e532a3f8782328923eeb10ec9238d78bc0cdff2a5f5216f45b188925a0139ad31e2ef3d1dd0d9b3feae1dff2e9b054dd3704683dc646246a5fb58119f968f3b7a13ce6418332aec422995057f8f233977a4fc7f35f7302d6e25742a831e2822d18347051a30986b909aa6c5f6e059d7765a6fa2dfb581b4c031639c469d94ed56fbe9ad40ab38a9e3582d8e69b3b53cae2464b398492a52f33877b5b1655270aa1afeb4faade0900b8ce78674f2dde1d7fe8a95f68c46a9e2bb5071d0db6deef5ac4f5811580d882c5306446cb7bdfd19386f3820a30396287513c4ca06c949e80bfa5b465379c9e285d6a6bc17e182aa7335458a7cb9ae845569a1d5b4d4e03906eede7a50c3c9b75b86ec4c151b30c2b0d1a32a41502d4309c46e573d7219ec45b9b539564cfb6dbc50243d7f94365ca11ef45f7411eb66581d9a433f35403c93c8e5fd10eb28c6a8f4ec9d11d691206a2af6d0d7de38f312a8f5e7af1f67ea414a46ad45da82d682ffde825c260d2dde1adbe7579c9defa8baf35d989fa009825ed06053363c10e0b622103b6b9e5a0af68e0ecc5869b83a25a97926bf118e84a369a7f5a529a93586e6d93579de36a4b4c6dbad9378a0d89d638fda00b0dda2438d95f84093749ec6b6f28a95aaa8ae5785ced8be353f8f53689a9359c2efc3e4c2fc34ce5a4a93e985fad3985a9df5cdce5288f3a7250f4fd9c9d8129fd98c2d5bf47d5bb105fe5fb8119f7f87d97693a465cf38f6b78bdf1caf59af492f68dd739ed0d0b910f1db76fb5b75d27f223f157ab68a321b3e914fdbad1a864dcd7703d49d3bec30bc27efb7db500117db6bf0937e96bdcec60aca222ab431480b6fb788f94e0c39ea61a3e83391c4f956f4fe6782defbda12f263c8c2998a4c31a2f0be62798c37efcd53175f7446ab162c2a69b7dfbb4184210f5bf33f78ef5316e599dd87128a5dfa1fe4933d8ab7db477f83441dbbff517b35fdcb768bbe38079a8ba94b70154bd5257da0af7a39253f2a1e5866bbf23cbf838feabcb9848fb8f21202defc7dbb45ff20477df8e2db3d02e1ca4305e6acb17fe3b21853ab433581d7bdc2913925bd217de5a40d6987f471de67f77583dc3bc227df9539e853c504fda4762244fdd5a043fd551f9f0c40a8f05a85d72a3cfcab650bff4198afb9aa934117c9e3bffae9244c685762c8217e21cc37fc96021105885013a6cf616fa96264de1a210a2a4a2e4bc0f00b39ead75e31b796ac7e4d60618d86de17af845509847ec2fc7d2e9d36008dcf0998925dc1875bb27d4b94551f0e704a3600557fffe60a216a99bbaf0efafcec5784c96a3deee999f04635c915ec208ae1936fe53888825a847f23473d982becabeba01ce1caa131fbe4a70df120fc5547faab133b7120fc7547faeb3c6c2b4d4ca555a516deb80d641ab4bfdbe1eaa30478b33f0046175440dd68ea10b3582ae4accae5d67b84a22aa67bc4d5b7088a39423f61f74d82f2729a16240e73d121734587487ba2be527f7e69b71708e3207f62630ff45a41add41f63c4b22f9cfd45514e1ce4efd7d44a68b79d228a7a2b2f20386e7792987dd3d72f6cb3a95312ae0dd02392e56d0ba7fd4fe5b9afe4295b5cc9a3cf752de302de53842bb758d536a66a97a291efdd7e7af729f03ee451de821eb56a6f36580b357b27ae2228668aa61921311899efc567247190cb7c7f550d9dbbe4ee0ee1cd0261a8d0c00f086fdeb4dbe88d63a8f786d4f0eeb62e5f8d5a70e9a4bf753dd4dba950f473c8c86615c89c34c23a900511dc59fbbfe261cfbe7f06f4a2eb0f027f50f0f1767591f7e61709b57cd486f51ff973ff2aba05c52ab41f65dbbe22bcc9b47c5ad034fe9d6a6dee0775ca40da73594b61e01b12a915f526d78e55c5c1ef7d29429626a1a45f688298bf02e6afabedd045294a8875c9c644ce94bddddaf24d0546998dea6cd35bc45ef540ea02aa2bfb0ac32dda13b2bbe3ff0ee1cdef6a2f5570aa6f99992ca7c7ffa163307cd18675a82ec4770f967b184ff1aede26175ed12e5819a84fbe15cd230cdfecb9f02339ed0dadf3052db4f819bec01bf844989f846b9e49786f5c1a2ce7f124859fd4eacff930f88d9417fdb49b61114e64fc40b7db4a1074f7152101cd54280a0b7f577ffe4a3676270d7a6077d2a0071a4b82fe0efe8370b4d915f761eb7a0b8b87bf6fb748f1623384e1066150ebe82bc2aada1e8607d70aa176d7fdbd7172f255a3afc99823757f07cb30abaa31feaeba904f922e2e5bd4012a3c938231f3d5203e4e50deaedf395f7cca9ad4296fd1510f1b800fac39bd6fbccbdeaa5530e562d100f5d71d28f279cb83fada798ab9e9d29c112ad99c2e3b2e56b3de4e73d62c9ea40d15bf37ef7668446a48fed4a82c7a67b6e9a0c90accfb0fdf46e4f627d3e941c0e9d4817c5aa5924be12b3a15ed5fc8ac82c242e3247d98e51d36961b5945d3620e3caee1476ad3b536fc245213599e320cc8b452848c1779c2a49230a3f25d217a340051b5f07de3eb27ea0d4e7f84037983d397f044bdc1d90b68686f70de83c323119c6bafbdb5f10bce4f9f70b9ebce40d0efab43ed733a9022408b0304472d7d75a43803a998590b9bcbc3adfb6c3aa582465db352d5d1175ad19a858b78a21ff1a95dc1a53bc7365d8ba672df679b1d44644f3d5e885f5b42cb486db57adf6d41bf974798cdd78d99c649d282d6bff57ae180fed8aaead3ad5d80815cb580f9abee799e73adc2ebeef99ecabb6c4c12335a342695827fa3aaae972f5faa8ae67baf1f1455f5755d454d3ab8ce83ab410ba493aa836b5cb542d7fe4ef5ce2ca8262691aa72519a0ec1daf95e39df8fa47ad065f91cb716a114f10ab53ad34e0bbc9efa67be5b9d4cff4d3b2ddc1a32db309993cb1650bcdb0d25a1d6d9fc3dd914d73b9a769bc9888e8be7889a41b4a90ab0ba12f8d0db5bf97e5018d5ed5d6c7c26e74391f329edb3b7ac825dd76bb160f302cc1175b8047a078510a31abdbf9bd468734628a484c1a322f1aeb42508c165e3dc6cc5d5badc0ce5ebdf7efacc63753cd18abe19956f6f3f2245a0f7217c8316c5e6a82fe03d50a178203ce4fae90eeeaf89006eae2d1e0406058cb8bfea86fe0a1fc77ea83322eeafbba1bf563111c43eed10eeaf20f6a7ea636defec95d819fba1839fb11f69dc54f9cceff41096667867f9a2ef1b1bdd39e1af4cf7b4afc1fd0e96a3e70e8bb9b2e814f9d1b41e97acb61a085532b6ac3f75d3ba2ab1ab52217426c83c37b64cd628c6c32909fd103212fa0a23427f6aaf6a96231556462ab42315da910aed48956605f5019b288650db54c0d4b27e5fabe3873753eb7db2a41f7d5ba3673f9eac8296559805a34eff35bfceeee621b1c2fca63b5cda645ae2064359aaafebd0763b3785cd8bda15afb139085108501ef24721731a21fcfc690a22edd39c84426eba2580991bc9d626549fff5ff72e58fe340c9d72a14f788a70a752370207acd23d8141143dd8a32ee6e4692b1cea47456b3d82c24eca5e4283fce5b9a61e26cff4d07ad79a383d3cd8d83d8a698fc9dfd1d849d15847d25bc1b15cf2e9c5cc9be0788a2675d1352d246d6a73192eb46567de197f050b6ddc5944ac6189182cc00881f02eafdabc8f77a8ea48551d1dae5adb33adab554f055ff82b5857ebd7b16b585561a55af5ab2aa4e4fe1ae688c11ad4b15c1bb4ed2a8786aa97bb272da5da6d242f28923810441de974395f1f66071ce5c9d2482ede7b69a23c0038578b2bcc7f7122089fe5dfbf8bd1dee3718b8a83d381626c9ff58b40c90451d85016de27f44d42f525f7e0a8074b45dcc4037d27c2c798cdde687e3638ea1b55e65b9ef05a48df610a3622e8c32ce8c37dd08730e8efac49ace16c234860090f308719e9597f85a33ef4ecff8d5f635891d1181ed59f7bc5085fa93fd72456077312225cb9db53da0ca2bd6b38362545a7bdfed98f2f7f7cf1e30fb87265056faeed9b29e56eb6c670d31059b9878237dfd18dcaa510bc61edb6a20011b1c2b25203ceecb9d8d877f4b1becb62f8f87d2063f4a1a0f44bbd0f317d54d888549d112418aedbedbc535fe3df298a4e06909c0c30dcb4db374d0978071f9e63ab87f269c736a83509d943983b4bb8d5dcef61d6f62ae77e0f33c8f77f8afbfdf6a7b9dfcfffa5dc6fc94b57f853fe0799e1c5eb9e9a4d91eb09672a7c53847770af359f31fb76cbdf0bcee4becdaa5a86e45ab14f1ac0bc1b8bf0f0dad7796d3e443188d76a0fb2d793e30824791c8931a83fe471c4cc977e8a13549048fda32218fe0eae7d3dea0fc664704c4fa26e1fd6a3fee998f4bb83637692c0afa899112944cd8b4e0704f9ec98800a55b1daa1f5f38b706df1518b3a058647fd06265c15fbb668e4038a0a66ba826f072a30fc002bf9811b5b5dee106d65aabb77ab3b7414c9c7a24306c7eb516fac46e464ad6f7aaa41e9eae8f3b11a9813f56146678f6b2f9a3e3866fe4a0faa3003eaaf4f92c2f2b44b746520f4c7a9ae44d52d8f51bf4bb1a9b3434411ec8d8f0905dd024255ddf0c172a72aed100f6cabbb44e6edf63b8455d69ca32da94e7057636f0be7269b9d31e36bdc87b49f81c614a392271c5495975a975e63960591faf4c099a42b895a74b5a42256542b4cbafa8a490b620c4722f7ccd07acbb32432da1c16cb384ce2dfa9a7afa4f8de574a17a997c4dfa827e7d4b3169dda8b0cfb4be94426967e6b68fc9be4061d0915d23c45a6fb59dd81b505f8bd0abccfd80409ffeb97b77797d79fff7a09c2ff747375f7f1c3cdcf5fef8a580cc2968084ffe6faeae69d562a94bb73ee2bdb8d338e66841383325f40e6cf20f3ef21f3ad5b5ed73aa1e221d4e444c27ffbe9fad397bb373fbf7f7ff5e5eecd875bbcdb5dfb090f35477c60fb29d21b77218d690d047ade6ecffff099264ebfe68e63ea1e28e9f76e64c0882ebb449d6aa811914ae9e0e1238c26ea68d125fdfc2ab0a552437b18b041b8f6cbf7b111b3cf3d13e6c7fa0d7cf96aa137b51e2164b1dd2e0821d26e66f64ed2e368311e5a4268a8d9eef059456f2d68e6b4eabeda2a1b841bbf7ca8bba955b3a255b3ed76b6dfaad568361eaedc56e922f5766a0f14314d1103519e490e1f871ca99ed19ecedcfb35ab111b0fa9bf22d23d08517fed46ac61d96e2f915407f19b225a870f1f8ae2293ad24b852f62e33ae64b2ef7c5cd8d2bbfcdcb458bf2e5223555720c9ce8cd469f8c86cc5f691910f3d7a4cbb5e4c5a44a0ed4a6d13ceda1dd7e50c76ad585ebb20b26e6bfe0a834b747a5dc6c42f09908177bcf598a769be21b424bff86564f7e53578c5b3be8f4315c7ae93c8ca8f038d304759aac7ddff77ea1d26fe90ab565ca53155eff575658c865de6a13eb5baec7ed2de7228a592869b377747fa5181bbb0bab5951fb3055fbb09e2bedbd5aefbbd86cf40a44bbafd6bb2f36dbbc82a4feea5891447dd98e507f7d8cba9a3a52a769ba49b7dcb4f03b9aa61a5629f4242fd4d6a8dad4316c425ead6a51c7300c790f3a7d7caca8b56e7cbf4bfd353e4e54b8e0e42fa569d3679ed6ef8936fa3f2efcbaeaabb2c6fff573e3af38b4f2ed42b590667a21c553c490222baabdaa8dc5aba62ad218ba38b5ed9cf7f86f31dc1ebcab6acee3e54dd48aca2ddebfd0eaa06bf54eb603e3aca1aaf6cf81f9fa5b160a5a55fe55aba18edaaf2e6e98ec5ff4aac8171afb139c19cd5b4335c18b414392dbd1e0c5691da2d6cde0c5591da2ec64f0e2a94733dd27e5cebff36648bf77d63f3b3d3d6ff6d4aa08473c4567daaea7f0b64009cdb722748246fff96f637c3283d6ffe8ff8f7e0b6378e9406346b4b3bb0feaf0947bc9ec63e8bf30c6430ae57f3872e03561fa8be6ba4a27de31f3e674e529840fa5f718cbb9b7147442154be8b5feade57b57feccf7feadd79b4e7b3ddffb894bcf386af3fed2a1c3c36d78f5eac7ede0fc5cfb0fd977026f0e790eb3b27f37e1d9fb2de60538cd2c7d374b65f248fb16b989aeb0548328878ad377b1906b72d40717d8884edc182b28a10d7d78e686cbbebfbcdc2ba3d559e87d02496c0e2666db306e748d9512cd1de35a4881e148b38826fc3914e1824a9500d47ffbe9e3e70fd757775f6f2f6f7ffe8a739d8b03ff814df9359f21819b4e0e1c03cfcd6e857bd342960a9cbce576d519dd96e264fcbf5d7db9bdfac7ddd7bf5ebebbfaa2352aba51efbf5cfef4f1eae6364f303d0da50c2773db29ae0e477b71a18a4b4a12a09a67fa6e23cace2b7ee5fac3cdff51ed79d6d473ded8f30c4396f79cbbe6e1764ee329d20ee38fe56b5a718d23f455fcf7090fe5e9e05288705dbc857a2c8f07ce513fa54604b22b2e6516d584f655ddc2f1f866079cf486fc952c6f7417a75839e2630849b76f2c14b5bfa3516fdc6eb7eecc777fac1b1c9aee1bbfa8d77c623ca03135d62121a4dbdf775e6a07b6386acec3075abc0eee156e5b03afd589f1508c623fd52f510ff09884bb9c26b5b2d69169d376dbba33dffd71c33bddea0cacaa99c6b34c508f67d25bf34c78b1f683ed7b9749e2652c56a42bf5d2b93e326b832543c6fe92ddfd45d1b269bc022f644e03530b10defda5a511ce8ec5cfa6b0ea60a8bd9a1012fed1e1b02d3b3018e53ab236619565134830976f35ca0402267cb9d6df9f4321030e8a8b2cc3b156e3db56a741081343cd025abfdc61ee8ee59864904868eca123d6d12f2bc80e1fefb9d43d94cbe29cc93cac9401e687c40d37ffce9ff15fd970fd9a6a9eebcaa5cac606ffb15c03143f8ee8d80169bc0eb61ed1f1d09891da3bfa7aa9d843a64a057534868536073432ef1cb237cc0d4f8b141064821678b8440264eed9653dba1f2dc6a567170b5c9407f7a3fc734c14a8b92051bbf766733fd67cacda68d5d2ca836796cd5d37e8c61852d0962fb0e7655a10b90f8b70464190c5503fa5a5764f9ea69f443c8b1969858cb3f58267690ba4cf59c2c3c815c9a8864f91be68897720fd544c888b7769f906387df462343f9ee1e1a3f112ec5aed4fab6e09268a1af2dcae32a0bba1d0cee533418d838cd7e4b1609b52946bfb1f4735b0f13056fbbd1f89f051f7539debfd094f8e67207cc11f8f6730831986fb111d13a69a0feb91fe1deb67b70b6cea81da02dd770b4a33f613faea550f0461ff4ed531f964ae823111ff5e3c345d69542041f0c780c38427951b5811c29b2bb7ca15e9c103a9beed99a8116db7919dbdca75c3070c2b3587260f86d5eb7eef22423878c85924e776630467bd5ee5fa8e23d47d1cd1da485a7e0704791cb1bd34b902aead6ad5c8c68499b11d0a67e4a5e657543a2d471e38c466061a6a7446a2a1ce32559bb23dc0dc7938926eb7fddee00cab999891392c481fd66aeb54436a557b234308b85a22e6d87e1b2734f5965478b6ae7c63b9a7de923faa43fbd4938fdc6f6984bb221bdb88423369420c8c8cca38f5b83565a58100cd6b9607e610d47a0ab2e2307855bb4eeab81246b44dbb7dec3ab3b78ddcbb4f676ed339a9c1f90b45779fbd5c5cdc5dbeb399831edcd935d88334fe9d068d2f3a9d0e201593803510fb17cfbe14e5107b6b0dc842193f50e3b5a7dd5ef88638db6144d5f45c00b8b0ac670e85870bdf186ee7318b51ebf6ea1fb73f7fb96a75d818c342df8529527d9b7837780752a54abad2883b78574decc1c2fff2d39bcbf2e7e79baf1f7ebab97a77f7e697db2ba076a5d8320a4634ae1653063e5efe74f7fec3f5edd51758284ef5eaf2cbf7e7fd7053cf7bf7f1c3e78f979fefd4f7d5d75b55d48c322a42493fc6cb45b8ac94a5922db3d28fd1e3a895868b6542851a2373c670479bc8ea35ee788ae6f942b4841e2499fb0ed623232f31dbb574b7eb23e9ecd7edb60eb9956db70ca948a07838f7cbe585dc6b4d42d1e10561b022196218e6d6fd15c53023abda79e457f8acfb9b16318af09095ef72506806a35678f740859a019eb6a015de9927b18a6704546476974e04a5ecabbe00d1caee1c9b2a9568c6b1e706fa6e60e0064e4d098afe7ca6c28e5d6beccece143dfa3500a00ac0e861fea6db6b5a68ce1a8f7ed187a7c1ea9dc3b02ed693d172b9f779d2aaf7f3383afe36bc1b49b57daebad4575402ee46b2d31f932ed34f1d17518331393ba6be25293aea54e7eb384067fbf9ce2bf93a7d1df962afc61f4c4eb7b01fab39073af2e57e5b7bfb59fbfda6bcfdc15e83fba7fb2dee9f3535b97fbe9ff94543cd3f54339fd65e58ba232bdf3921a03bb8846f182ef367a899598115a9a56269f0905d14a516dc6880cab81ecc8d9a4cc34341b83559ae67dce10a3f44f1e6522b712ebba4af08471cbdba6cb74d9c2eafdd9e5be58d6d0facfccad906dd814128b83cfe06df70f579268575ac6845d19edaa34a378a5db826748fb1b92714ae080305e05e45c69b3a45303b83c5fc857ff9e5cbe52f56d9086b9dac93de8532ac27dfc1c27ff7cbcde5c70f6fefde7db9fcbb367b4137eac052ac6463887a367d500b3aa71970d4876b67b90fd4722f090cdcc31556c90fcefad546b254b80b1d06b0f0df5f7fbabc55059e1ebbc2075f6d4f5fef3e5f7db9bbbabefa7875730bbdc345d68902f4ff50c93f62904895ae18400d94aa7de7cb87cb9b9faeafbe420f5e1c5f1a6e660e335868e3ba47d54db8861bf846fa3fc267c211865fb5e595f6c8ad5d245e921edced4b565e9c1537ac34532520d743052994d612c1144afd6130813dcd5f1041cdfa2a485c0382a555c9050f357f2ed65f4f6b29e8244ef5ed6f1ac5d962e94d553b872d683d84621db399f7402767de84275cd4624fbd074bdaf5e255a9161fbc7cd778e7957bcb33e9fd67d207cfa49fead6f138f21661ccf47b78d8dbb4a0e5795e3cf550a5adfeef1e215ecf2f203c6f96dcbd17e1ccc89c49ce530fdea1b20750edb0bf5ae3a1c9bef3ac52adb19efe1faba7ff67eb19fcb17a067fb69ed33f56cfe9b3f56ceaa5289c438549781f0fbd5d0b5abbd6d8ff95c70cb5fec95a15ff1e254217923355c6c0735823556599aad1dcdbe7955c2cd325b89c939bb808e599e7f0516e9a297c8f457a7efd1cc0df597297dfbef7885ba9776c86cae9e689dbe07cf85ad0326d9a70c1a81ae1058fd07eefc13bf31d68d5fe0f2ca22b9bc1bcf3ba9fcd3b51f960bfc7b5b254ca17fee8114f9f7b9f03573df0d4f23971325741def2245b30dbbca2b9e0d6562bd4d46f5faccd339cd4e1b56b4433548a4ef4f2a9a823b2c1d5012a86b958394efefef3f9fb4fe51f7c57fd3d37ffb3b5596885732e90774c8aa11fd613fd95d721eeb01f3f01bbce61d5803f05f87b311d4fa3d74933bad48882e3c4476b4d2f651256ae8d9ae8036288222d38d74fa8578b08ce7fdc8de1c533ee946b12e1554d24a6c5bb2b97e513cf59967cce459070597b31f7a95cdf9a7285cfe5ba69ca953d97ebba2957fa5caeaba65cd3e772dd37e59a3c97ebb12957e468c5b4fd9a3ad5949acd9c27034e4c52a9035b75f92bd66eb357c25f7578bb2dfc7597bf92edb67c25fc7527573ebacc7b52be22e6156e3f1c2b10c420aa4a38fffc4b40ce89c131c7b68ffa148973e7700c424b3e8c9548e1554376481fc75324081dc9b11f2e97c9da3e350c0ce3fd4ece9cf7971d1b2ef34805e9434cca07d5c38a21fd1cddc048021d6360dad4a67ce0635d3ee5b383cc95e8ef3f4310ee3f43a0eff155ef23e8f17fc3336d4e6a66c0783ada0d0fb9142bbc47a41852d4fc2e84d38ebaf5d50a6f44a7f3ef3f1042d41153952072f3410e3139ea0f2bddeeaef553f7d5de77d7bee44be024d12fe0b4dbf288107e8164bb3d47f73092630c92a8e2e2ed768e1e750c0eac5e30876fb7910528b218097cdc6e2fb52fe4277a67de89a85bce0bd38314d526efa95e0832d2dda06310a3def802c5648eae4034bcc114eebdc19461583cf3fcd2d38f1b3d802442bf2862b133effc137d5715eff79c9728fddd533834db94ee7f4642fd90a920a370bb95f978945a93033d5800efc6afce7abd763bbb98a3cf20703047dfd400c684c31c5d83c0a65378878d1d75fd9180c263f35e8a6ea13ee89ae129d41070a5fe5cab3f37eacf37f5e7b3faf3ab5956aef124c2c319fad560f925d9e851bc5267f660023a704dc30775cc2ddeab0852b04f47041914cf3b04214c9278f22d8821ba4fdeea4f01ee5315dab7e6dee3120173dcb6d7bb482ee172f75d4f8934bcb7fbc49b1f8a4778d66977ae4bd757c5b85e75ce9b7eda52491f860e302a5580e0fc5c55fa9ca30623f2aeb8aab5cffcbd80840c8ed1e0194149e7e7981d4ec5b0247f46a270f0cce39e080bf02abf070fe4fbcf7cbadef0ae28ea4f9ff3fe6847fef4e1cd57e70abf971f972776306c1ffcf07ed6342673d28399163ae999b2b2c1fe8be34451cd3d61d40cc35ac73ab3ab225735cf0f68dee9e3e3e4f5ccbf5f4b7aedd80ed1bdca06c71528600dd6457ae3a9554bf1506a03a3b56e2aac898419a18505aa119715ed0af186911084790c941251d3a13cc052ed488ec4543f1927aa3a14daa4435103fcb4e244732a871415b1abcf780a4c57a487a2aec4286582f5559d33a871049c88e368b818712dac87c58877faea730deb11ef0cc6849a1a74cae998480b74a63e0dd07901b483f26258c5407a8530cc3ba40fa1ae7507e5658b0adc5ccbcfe7a54c7ddefeffa83b831d3761200cdffb14cd1e10a65304c9de56ee6d0f95508ad4dea21c28260b6263455936218df2ee950788c70636d9b4aad4cb6ac1662e197d1eff33633bf86e6b69e787463b17907b4285bd3d19935a4df9248015cf8cde28b366ba3be622c57b30fb0740d93e20a96a2e4d59bcc261ad9a5bc34f202dd53c751c37e59350799aad9a17a66abe627ad274e51654357f8517a6868724eec250cde5fb54f331938d63dc83b492c293e02ac95c52b95c6242f73b0430f5720609cf3f876dcbe550bb65d2f64f6e7da33ecc5d777e91a05f40820e952887c2ca79d29739d051979c8c55f4da9dbe5a3b2fdd1a707ec85a18c60a86fb2f3cba8a86d19fd1b06430e7124a5e61b6e844cb10d851f00c7678e707a47c6721f0117e3210d4fd53061f367c673230bd998162146e1bcac0b7a6b50c7ce66234915bd989dc87f9a2f2ea867af86f97c36d9f107d98a52cf179a62967466258b2b3a6824c7b5e74ce33b58cc2c1d851a38212a35bc69a73b1e3e0bb9dc5b9b2f1e71a62af869a5149851d339741fc898766051a9542d8d1fee504059730c9f48cc31a5cd67004c202d7c1715cac4f147d706d4c70ad999e345db91b0aae1c9e981a1ea20cf1019881d0e0aaaf00d798c90e5ca20fae8b66c3a9b24bc825fcf8dbd7f90f85aeb8d10f537a144393ede3f7b0e797a0f87678ac764fff3a3a7eb4a3e3d9ff1c1dfbf5612cbbd1592a64d5660de877bf3e7ad4f422582e82e5fb62ea68289ede23966d94470cca1eca2306f1f99af4268a953ac0ab7af1cf96c63a054d03273441fc3a90137e39c73f37af8617da8648f1dd789d5d1840b7bb957f63773bd064a33fbc0bfc30f0c33bace3537f60112e991bb2137bf81d0000ffffce0c5d9bfc000100",
 	})
 	if err != nil {
 		panic(err)
@@ -27,11 +30,14 @@ var _ = func() error {
 
 	func() {
 		b := packr.New("Assets", "./static")
-		b.SetResolver("css/normalize.css", packr.Pointer{ForwardBox: gk, ForwardPath: "6efea0b1a321e915a08e349981e5ecb4"})
-		b.SetResolver("img/gos.png", packr.Pointer{ForwardBox: gk, ForwardPath: "1251d44231d5c73843ec32f152a99720"})
-		b.SetResolver("index.html", packr.Pointer{ForwardBox: gk, ForwardPath: "365b40bdd0eaf3ff91befa9cf678cff5"})
-		b.SetResolver("js/main.js", packr.Pointer{ForwardBox: gk, ForwardPath: "653d997454aa41f83d7201bb5a44c823"})
-		b.SetResolver("js/vivagraph-0.12.0.min.js", packr.Pointer{ForwardBox: gk, ForwardPath: "8dc98ea9b53fc120222481e941803c10"})
+		b.SetResolver("css/normalize.css", packr.Pointer{ForwardBox: gk, ForwardPath: "b954e06655197145616cd398d91c5d94"})
+		b.SetResolver("img/gos.png", packr.Pointer{ForwardBox: gk, ForwardPath: "287120212be299bde5ff45348f42b702"})
+		b.SetResolver("index-3d.html", packr.Pointer{ForwardBox: gk, ForwardPath: "d56916144189265be125406e28195487"})
+		b.SetResolver("index.html", packr.Pointer{ForwardBox: gk, ForwardPath: "e53fd84f5bdfd14b9c7e8f95fe706d1d"})
+		b.SetResolver("js/3d-force-graph.min.js", packr.Pointer{ForwardBox: gk, ForwardPath: "a12d353e7a623119cc2a243f305e433f"})
+		b.SetResolver("js/main.js", packr.Pointer{ForwardBox: gk, ForwardPath: "d59fc4238b094300197a337175692582"})
+		b.SetResolver("js/main_3d.js", packr.Pointer{ForwardBox: gk, ForwardPath: "38b04054a71c2121a7cfd5829358f302"})
+		b.SetResolver("js/vivagraph-0.12.0.min.js", packr.Pointer{ForwardBox: gk, ForwardPath: "e9d210da24854b7def3efaf55a93b7dc"})
 	}()
 	return nil
 }()
diff --git a/plugins/analysis/webinterface/httpserver/parameters.go b/plugins/analysis/webinterface/httpserver/parameters.go
index 0bee3d52e7250dbac3afcdb00715f4965b1e7c51..c7f29c9fa1a8bb0876005491a519c5c566c09ff0 100644
--- a/plugins/analysis/webinterface/httpserver/parameters.go
+++ b/plugins/analysis/webinterface/httpserver/parameters.go
@@ -5,11 +5,11 @@ import (
 )
 
 const (
-	CFG_BIND_ADDRESS = "analysis.httpServer.bindAddress"
-	CFG_DEV          = "analysis.httpServer.dev"
+	CfgBindAddress = "analysis.httpServer.bindAddress"
+	CfgDev         = "analysis.httpServer.dev"
 )
 
 func init() {
-	flag.String(CFG_BIND_ADDRESS, "0.0.0.0:80", "the bind address for the web API")
-	flag.Bool(CFG_DEV, false, "whether the analysis server visualizer is running dev mode")
+	flag.String(CfgBindAddress, "0.0.0.0:80", "the bind address for the web API")
+	flag.Bool(CfgDev, false, "whether the analysis server visualizer is running dev mode")
 }
diff --git a/plugins/analysis/webinterface/httpserver/plugin.go b/plugins/analysis/webinterface/httpserver/plugin.go
index dba2815cbb04c8c484d38feac12e17fd631f8c18..7da249c8ad2aa99fc17f7a59a22b1cdd05a8355f 100644
--- a/plugins/analysis/webinterface/httpserver/plugin.go
+++ b/plugins/analysis/webinterface/httpserver/plugin.go
@@ -32,7 +32,7 @@ func Configure() {
 	engine.HideBanner = true
 
 	// we only need this special flag, because we always keep a packed box in the same directory
-	if config.Node.GetBool(CFG_DEV) {
+	if config.Node.GetBool(CfgDev) {
 		engine.Static("/static", "./plugins/analysis/webinterface/httpserver/static")
 		engine.File("/", "./plugins/analysis/webinterface/httpserver/static/index.html")
 	} else {
@@ -54,7 +54,7 @@ func Run() {
 
 func start(shutdownSignal <-chan struct{}) {
 	stopped := make(chan struct{})
-	bindAddr := config.Node.GetString(CFG_BIND_ADDRESS)
+	bindAddr := config.Node.GetString(CfgBindAddress)
 	go func() {
 		log.Infof("Started %s: http://%s", name, bindAddr)
 		if err := engine.Start(bindAddr); err != nil {
diff --git a/plugins/analysis/webinterface/httpserver/static/css/normalize.css b/plugins/analysis/webinterface/httpserver/static/css/normalize.css
index a0feda7664c4890b3ba635708e0e925d05319945..618f8d45403042b53f16d10aac72a8a931923cd4 100644
--- a/plugins/analysis/webinterface/httpserver/static/css/normalize.css
+++ b/plugins/analysis/webinterface/httpserver/static/css/normalize.css
@@ -365,6 +365,7 @@ template {
     margin-left: auto;
     margin-right: auto;
     width: 50%;
+    z-index: 10;
 }
 
 #title {
@@ -447,7 +448,7 @@ template {
 
 #nodesOnlineWrapper{
     position: relative;
-    height: 80px;
+    height: 200px;
     overflow-y: scroll;
     margin:0;
     padding: 5px 0;
@@ -500,5 +501,5 @@ template {
     width: 100%;
     height: 100%;
     margin:0;
-    z-index: 1;
+    z-index: -1;
 }
\ No newline at end of file
diff --git a/plugins/analysis/webinterface/httpserver/static/index-3d.html b/plugins/analysis/webinterface/httpserver/static/index-3d.html
new file mode 100644
index 0000000000000000000000000000000000000000..b30ba1943aa507e580a847f8c1947d49c36bfb04
--- /dev/null
+++ b/plugins/analysis/webinterface/httpserver/static/index-3d.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <title>GoShimmer - Network Visualizer</title>
+    <link rel="stylesheet" type="text/css" href="/static/css/normalize.css">
+
+</head>
+
+<body style="background: #202126;">
+    <div id="logo">
+        <p id="title">GOSHIMMER<br>NETWORK</p>
+        <img class="logo" src="/static/img/gos.png" alt="GoShimmer">
+    </div>
+
+    <div id="graphc"></div>
+
+    <div id="info">
+        <p id="status"></p>
+        <p id="streamstatus"></p>
+
+        <div id="searchWrapper">
+            <input id="search" type="text" placeholder="search for node..." autocomplete="off">
+            <input type="button" id="clear" value="clear"> 
+        </div>
+        <div id="nodesOnlineWrapper"><div id="nodesOnline"></div></div>
+
+        <div id="nodestats">
+            <p id="nodeId"></p>
+            <p id="in"></p>
+            <p id="out"></p>
+        </div>
+    </div>
+    <script type="text/javascript" src="/static/js/3d-force-graph.min.js"></script>
+    <script type="text/javascript" src="/static/js/main_3d.js"></script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/plugins/analysis/webinterface/httpserver/static/js/3d-force-graph.min.js b/plugins/analysis/webinterface/httpserver/static/js/3d-force-graph.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..dcba76b3025a0dcc9097dde393d5854b867e7cc2
--- /dev/null
+++ b/plugins/analysis/webinterface/httpserver/static/js/3d-force-graph.min.js
@@ -0,0 +1,5 @@
+// Version 1.60.11 3d-force-graph - https://github.com/vasturiano/3d-force-graph
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).ForceGraph3D=t()}(this,(function(){"use strict";function e(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function t(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function n(n){for(var r=1;r<arguments.length;r++){var i=null!=arguments[r]?arguments[r]:{};r%2?t(Object(i),!0).forEach((function(t){e(n,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(i)):t(Object(i)).forEach((function(e){Object.defineProperty(n,e,Object.getOwnPropertyDescriptor(i,e))}))}return n}function r(e){return function(e){if(Array.isArray(e))return i(e)}(e)||function(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return i(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return i(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}!function(e,t){void 0===t&&(t={});var n=t.insertAt;if(e&&"undefined"!=typeof document){var r=document.head||document.getElementsByTagName("head")[0],i=document.createElement("style");i.type="text/css","top"===n&&r.firstChild?r.insertBefore(i,r.firstChild):r.appendChild(i),i.styleSheet?i.styleSheet.cssText=e:i.appendChild(document.createTextNode(e))}}(".graph-info-msg {\n  top: 50%;\n  width: 100%;\n  text-align: center;\n  color: lavender;\n  opacity: 0.7;\n  font-size: 22px;\n  position: absolute;\n  font-family: Sans-serif;\n}\n\n.grabbable {\n  cursor: move;\n  cursor: grab;\n  cursor: -moz-grab;\n  cursor: -webkit-grab;\n}\n\n.grabbable:active {\n  cursor: grabbing;\n  cursor: -moz-grabbing;\n  cursor: -webkit-grabbing;\n}"),void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,-52)),void 0===Number.isInteger&&(Number.isInteger=function(e){return"number"==typeof e&&isFinite(e)&&Math.floor(e)===e}),void 0===Math.sign&&(Math.sign=function(e){return e<0?-1:e>0?1:+e}),"name"in Function.prototype==!1&&Object.defineProperty(Function.prototype,"name",{get:function(){return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1]}}),void 0===Object.assign&&(Object.assign=function(e){if(null==e)throw new TypeError("Cannot convert undefined or null to object");for(var t=Object(e),n=1;n<arguments.length;n++){var r=arguments[n];if(null!=r)for(var i in r)Object.prototype.hasOwnProperty.call(r,i)&&(t[i]=r[i])}return t});var a={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2};function o(){}Object.assign(o.prototype,{addEventListener:function(e,t){void 0===this._listeners&&(this._listeners={});var n=this._listeners;void 0===n[e]&&(n[e]=[]),-1===n[e].indexOf(t)&&n[e].push(t)},hasEventListener:function(e,t){if(void 0===this._listeners)return!1;var n=this._listeners;return void 0!==n[e]&&-1!==n[e].indexOf(t)},removeEventListener:function(e,t){if(void 0!==this._listeners){var n=this._listeners[e];if(void 0!==n){var r=n.indexOf(t);-1!==r&&n.splice(r,1)}}},dispatchEvent:function(e){if(void 0!==this._listeners){var t=this._listeners[e.type];if(void 0!==t){e.target=this;for(var n=t.slice(0),r=0,i=n.length;r<i;r++)n[r].call(this,e)}}}});for(var s=[],c=0;c<256;c++)s[c]=(c<16?"0":"")+c.toString(16);var l,u={DEG2RAD:Math.PI/180,RAD2DEG:180/Math.PI,generateUUID:function(){var e=4294967295*Math.random()|0,t=4294967295*Math.random()|0,n=4294967295*Math.random()|0,r=4294967295*Math.random()|0;return(s[255&e]+s[e>>8&255]+s[e>>16&255]+s[e>>24&255]+"-"+s[255&t]+s[t>>8&255]+"-"+s[t>>16&15|64]+s[t>>24&255]+"-"+s[63&n|128]+s[n>>8&255]+"-"+s[n>>16&255]+s[n>>24&255]+s[255&r]+s[r>>8&255]+s[r>>16&255]+s[r>>24&255]).toUpperCase()},clamp:function(e,t,n){return Math.max(t,Math.min(n,e))},euclideanModulo:function(e,t){return(e%t+t)%t},mapLinear:function(e,t,n,r,i){return r+(e-t)*(i-r)/(n-t)},lerp:function(e,t,n){return(1-n)*e+n*t},smoothstep:function(e,t,n){return e<=t?0:e>=n?1:(e=(e-t)/(n-t))*e*(3-2*e)},smootherstep:function(e,t,n){return e<=t?0:e>=n?1:(e=(e-t)/(n-t))*e*e*(e*(6*e-15)+10)},randInt:function(e,t){return e+Math.floor(Math.random()*(t-e+1))},randFloat:function(e,t){return e+Math.random()*(t-e)},randFloatSpread:function(e){return e*(.5-Math.random())},degToRad:function(e){return e*u.DEG2RAD},radToDeg:function(e){return e*u.RAD2DEG},isPowerOfTwo:function(e){return 0==(e&e-1)&&0!==e},ceilPowerOfTwo:function(e){return Math.pow(2,Math.ceil(Math.log(e)/Math.LN2))},floorPowerOfTwo:function(e){return Math.pow(2,Math.floor(Math.log(e)/Math.LN2))},setQuaternionFromProperEuler:function(e,t,n,r,i){var a=Math.cos,o=Math.sin,s=a(n/2),c=o(n/2),l=a((t+r)/2),u=o((t+r)/2),h=a((t-r)/2),p=o((t-r)/2),d=a((r-t)/2),f=o((r-t)/2);"XYX"===i?e.set(s*u,c*h,c*p,s*l):"YZY"===i?e.set(c*p,s*u,c*h,s*l):"ZXZ"===i?e.set(c*h,c*p,s*u,s*l):"XZX"===i?e.set(s*u,c*f,c*d,s*l):"YXY"===i?e.set(c*d,s*u,c*f,s*l):"ZYZ"===i?e.set(c*f,c*d,s*u,s*l):console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order.")}};function h(e,t){this.x=e||0,this.y=t||0}function p(){this.elements=[1,0,0,0,1,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}Object.defineProperties(h.prototype,{width:{get:function(){return this.x},set:function(e){this.x=e}},height:{get:function(){return this.y},set:function(e){this.y=e}}}),Object.assign(h.prototype,{isVector2:!0,set:function(e,t){return this.x=e,this.y=t,this},setScalar:function(e){return this.x=e,this.y=e,this},setX:function(e){return this.x=e,this},setY:function(e){return this.y=e,this},setComponent:function(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;default:throw new Error("index is out of range: "+e)}return this},getComponent:function(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+e)}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(e){return this.x=e.x,this.y=e.y,this},add:function(e,t){return void 0!==t?(console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,t)):(this.x+=e.x,this.y+=e.y,this)},addScalar:function(e){return this.x+=e,this.y+=e,this},addVectors:function(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this},addScaledVector:function(e,t){return this.x+=e.x*t,this.y+=e.y*t,this},sub:function(e,t){return void 0!==t?(console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,t)):(this.x-=e.x,this.y-=e.y,this)},subScalar:function(e){return this.x-=e,this.y-=e,this},subVectors:function(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this},multiply:function(e){return this.x*=e.x,this.y*=e.y,this},multiplyScalar:function(e){return this.x*=e,this.y*=e,this},divide:function(e){return this.x/=e.x,this.y/=e.y,this},divideScalar:function(e){return this.multiplyScalar(1/e)},applyMatrix3:function(e){var t=this.x,n=this.y,r=e.elements;return this.x=r[0]*t+r[3]*n+r[6],this.y=r[1]*t+r[4]*n+r[7],this},min:function(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this},max:function(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this},clamp:function(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this},clampScalar:function(e,t){return this.x=Math.max(e,Math.min(t,this.x)),this.y=Math.max(e,Math.min(t,this.y)),this},clampLength:function(e,t){var n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(e,Math.min(t,n)))},floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this},negate:function(){return this.x=-this.x,this.y=-this.y,this},dot:function(e){return this.x*e.x+this.y*e.y},cross:function(e){return this.x*e.y-this.y*e.x},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length()||1)},angle:function(){return Math.atan2(-this.y,-this.x)+Math.PI},distanceTo:function(e){return Math.sqrt(this.distanceToSquared(e))},distanceToSquared:function(e){var t=this.x-e.x,n=this.y-e.y;return t*t+n*n},manhattanDistanceTo:function(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)},setLength:function(e){return this.normalize().multiplyScalar(e)},lerp:function(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this},lerpVectors:function(e,t,n){return this.subVectors(t,e).multiplyScalar(n).add(e)},equals:function(e){return e.x===this.x&&e.y===this.y},fromArray:function(e,t){return void 0===t&&(t=0),this.x=e[t],this.y=e[t+1],this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this.x,e[t+1]=this.y,e},fromBufferAttribute:function(e,t,n){return void 0!==n&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(t),this.y=e.getY(t),this},rotateAround:function(e,t){var n=Math.cos(t),r=Math.sin(t),i=this.x-e.x,a=this.y-e.y;return this.x=i*n-a*r+e.x,this.y=i*r+a*n+e.y,this}}),Object.assign(p.prototype,{isMatrix3:!0,set:function(e,t,n,r,i,a,o,s,c){var l=this.elements;return l[0]=e,l[1]=r,l[2]=o,l[3]=t,l[4]=i,l[5]=s,l[6]=n,l[7]=a,l[8]=c,this},identity:function(){return this.set(1,0,0,0,1,0,0,0,1),this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(e){var t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],this},extractBasis:function(e,t,n){return e.setFromMatrix3Column(this,0),t.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this},setFromMatrix4:function(e){var t=e.elements;return this.set(t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]),this},multiply:function(e){return this.multiplyMatrices(this,e)},premultiply:function(e){return this.multiplyMatrices(e,this)},multiplyMatrices:function(e,t){var n=e.elements,r=t.elements,i=this.elements,a=n[0],o=n[3],s=n[6],c=n[1],l=n[4],u=n[7],h=n[2],p=n[5],d=n[8],f=r[0],m=r[3],g=r[6],v=r[1],y=r[4],x=r[7],b=r[2],_=r[5],w=r[8];return i[0]=a*f+o*v+s*b,i[3]=a*m+o*y+s*_,i[6]=a*g+o*x+s*w,i[1]=c*f+l*v+u*b,i[4]=c*m+l*y+u*_,i[7]=c*g+l*x+u*w,i[2]=h*f+p*v+d*b,i[5]=h*m+p*y+d*_,i[8]=h*g+p*x+d*w,this},multiplyScalar:function(e){var t=this.elements;return t[0]*=e,t[3]*=e,t[6]*=e,t[1]*=e,t[4]*=e,t[7]*=e,t[2]*=e,t[5]*=e,t[8]*=e,this},determinant:function(){var e=this.elements,t=e[0],n=e[1],r=e[2],i=e[3],a=e[4],o=e[5],s=e[6],c=e[7],l=e[8];return t*a*l-t*o*c-n*i*l+n*o*s+r*i*c-r*a*s},getInverse:function(e,t){void 0!==t&&console.warn("THREE.Matrix3: .getInverse() can no longer be configured to throw on degenerate.");var n=e.elements,r=this.elements,i=n[0],a=n[1],o=n[2],s=n[3],c=n[4],l=n[5],u=n[6],h=n[7],p=n[8],d=p*c-l*h,f=l*u-p*s,m=h*s-c*u,g=i*d+a*f+o*m;if(0===g)return this.set(0,0,0,0,0,0,0,0,0);var v=1/g;return r[0]=d*v,r[1]=(o*h-p*a)*v,r[2]=(l*a-o*c)*v,r[3]=f*v,r[4]=(p*i-o*u)*v,r[5]=(o*s-l*i)*v,r[6]=m*v,r[7]=(a*u-h*i)*v,r[8]=(c*i-a*s)*v,this},transpose:function(){var e,t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this},getNormalMatrix:function(e){return this.setFromMatrix4(e).getInverse(this).transpose()},transposeIntoArray:function(e){var t=this.elements;return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],this},setUvTransform:function(e,t,n,r,i,a,o){var s=Math.cos(i),c=Math.sin(i);this.set(n*s,n*c,-n*(s*a+c*o)+a+e,-r*c,r*s,-r*(-c*a+s*o)+o+t,0,0,1)},scale:function(e,t){var n=this.elements;return n[0]*=e,n[3]*=e,n[6]*=e,n[1]*=t,n[4]*=t,n[7]*=t,this},rotate:function(e){var t=Math.cos(e),n=Math.sin(e),r=this.elements,i=r[0],a=r[3],o=r[6],s=r[1],c=r[4],l=r[7];return r[0]=t*i+n*s,r[3]=t*a+n*c,r[6]=t*o+n*l,r[1]=-n*i+t*s,r[4]=-n*a+t*c,r[7]=-n*o+t*l,this},translate:function(e,t){var n=this.elements;return n[0]+=e*n[2],n[3]+=e*n[5],n[6]+=e*n[8],n[1]+=t*n[2],n[4]+=t*n[5],n[7]+=t*n[8],this},equals:function(e){for(var t=this.elements,n=e.elements,r=0;r<9;r++)if(t[r]!==n[r])return!1;return!0},fromArray:function(e,t){void 0===t&&(t=0);for(var n=0;n<9;n++)this.elements[n]=e[n+t];return this},toArray:function(e,t){void 0===e&&(e=[]),void 0===t&&(t=0);var n=this.elements;return e[t]=n[0],e[t+1]=n[1],e[t+2]=n[2],e[t+3]=n[3],e[t+4]=n[4],e[t+5]=n[5],e[t+6]=n[6],e[t+7]=n[7],e[t+8]=n[8],e}});var d={getDataURL:function(e){var t;if("undefined"==typeof HTMLCanvasElement)return e.src;if(e instanceof HTMLCanvasElement)t=e;else{void 0===l&&(l=document.createElementNS("http://www.w3.org/1999/xhtml","canvas")),l.width=e.width,l.height=e.height;var n=l.getContext("2d");e instanceof ImageData?n.putImageData(e,0,0):n.drawImage(e,0,0,e.width,e.height),t=l}return t.width>2048||t.height>2048?t.toDataURL("image/jpeg",.6):t.toDataURL("image/png")}},f=0;function m(e,t,n,r,i,a,o,s,c,l){Object.defineProperty(this,"id",{value:f++}),this.uuid=u.generateUUID(),this.name="",this.image=void 0!==e?e:m.DEFAULT_IMAGE,this.mipmaps=[],this.mapping=void 0!==t?t:m.DEFAULT_MAPPING,this.wrapS=void 0!==n?n:1001,this.wrapT=void 0!==r?r:1001,this.magFilter=void 0!==i?i:1006,this.minFilter=void 0!==a?a:1008,this.anisotropy=void 0!==c?c:1,this.format=void 0!==o?o:1023,this.internalFormat=null,this.type=void 0!==s?s:1009,this.offset=new h(0,0),this.repeat=new h(1,1),this.center=new h(0,0),this.rotation=0,this.matrixAutoUpdate=!0,this.matrix=new p,this.generateMipmaps=!0,this.premultiplyAlpha=!1,this.flipY=!0,this.unpackAlignment=4,this.encoding=void 0!==l?l:3e3,this.version=0,this.onUpdate=null}function g(e,t,n,r){this.x=e||0,this.y=t||0,this.z=n||0,this.w=void 0!==r?r:1}function v(e,t,n){this.width=e,this.height=t,this.scissor=new g(0,0,e,t),this.scissorTest=!1,this.viewport=new g(0,0,e,t),n=n||{},this.texture=new m(void 0,n.mapping,n.wrapS,n.wrapT,n.magFilter,n.minFilter,n.format,n.type,n.anisotropy,n.encoding),this.texture.image={},this.texture.image.width=e,this.texture.image.height=t,this.texture.generateMipmaps=void 0!==n.generateMipmaps&&n.generateMipmaps,this.texture.minFilter=void 0!==n.minFilter?n.minFilter:1006,this.depthBuffer=void 0===n.depthBuffer||n.depthBuffer,this.stencilBuffer=void 0===n.stencilBuffer||n.stencilBuffer,this.depthTexture=void 0!==n.depthTexture?n.depthTexture:null}function y(e,t,n){v.call(this,e,t,n),this.samples=4}function x(e,t,n,r){this._x=e||0,this._y=t||0,this._z=n||0,this._w=void 0!==r?r:1}m.DEFAULT_IMAGE=void 0,m.DEFAULT_MAPPING=300,m.prototype=Object.assign(Object.create(o.prototype),{constructor:m,isTexture:!0,updateMatrix:function(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.name=e.name,this.image=e.image,this.mipmaps=e.mipmaps.slice(0),this.mapping=e.mapping,this.wrapS=e.wrapS,this.wrapT=e.wrapT,this.magFilter=e.magFilter,this.minFilter=e.minFilter,this.anisotropy=e.anisotropy,this.format=e.format,this.internalFormat=e.internalFormat,this.type=e.type,this.offset.copy(e.offset),this.repeat.copy(e.repeat),this.center.copy(e.center),this.rotation=e.rotation,this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrix.copy(e.matrix),this.generateMipmaps=e.generateMipmaps,this.premultiplyAlpha=e.premultiplyAlpha,this.flipY=e.flipY,this.unpackAlignment=e.unpackAlignment,this.encoding=e.encoding,this},toJSON:function(e){var t=void 0===e||"string"==typeof e;if(!t&&void 0!==e.textures[this.uuid])return e.textures[this.uuid];var n={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,type:this.type,encoding:this.encoding,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};if(void 0!==this.image){var r=this.image;if(void 0===r.uuid&&(r.uuid=u.generateUUID()),!t&&void 0===e.images[r.uuid]){var i;if(Array.isArray(r)){i=[];for(var a=0,o=r.length;a<o;a++)i.push(d.getDataURL(r[a]))}else i=d.getDataURL(r);e.images[r.uuid]={uuid:r.uuid,url:i}}n.image=r.uuid}return t||(e.textures[this.uuid]=n),n},dispose:function(){this.dispatchEvent({type:"dispose"})},transformUv:function(e){if(300!==this.mapping)return e;if(e.applyMatrix3(this.matrix),e.x<0||e.x>1)switch(this.wrapS){case 1e3:e.x=e.x-Math.floor(e.x);break;case 1001:e.x=e.x<0?0:1;break;case 1002:1===Math.abs(Math.floor(e.x)%2)?e.x=Math.ceil(e.x)-e.x:e.x=e.x-Math.floor(e.x)}if(e.y<0||e.y>1)switch(this.wrapT){case 1e3:e.y=e.y-Math.floor(e.y);break;case 1001:e.y=e.y<0?0:1;break;case 1002:1===Math.abs(Math.floor(e.y)%2)?e.y=Math.ceil(e.y)-e.y:e.y=e.y-Math.floor(e.y)}return this.flipY&&(e.y=1-e.y),e}}),Object.defineProperty(m.prototype,"needsUpdate",{set:function(e){!0===e&&this.version++}}),Object.defineProperties(g.prototype,{width:{get:function(){return this.z},set:function(e){this.z=e}},height:{get:function(){return this.w},set:function(e){this.w=e}}}),Object.assign(g.prototype,{isVector4:!0,set:function(e,t,n,r){return this.x=e,this.y=t,this.z=n,this.w=r,this},setScalar:function(e){return this.x=e,this.y=e,this.z=e,this.w=e,this},setX:function(e){return this.x=e,this},setY:function(e){return this.y=e,this},setZ:function(e){return this.z=e,this},setW:function(e){return this.w=e,this},setComponent:function(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;case 3:this.w=t;break;default:throw new Error("index is out of range: "+e)}return this},getComponent:function(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+e)}},clone:function(){return new this.constructor(this.x,this.y,this.z,this.w)},copy:function(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=void 0!==e.w?e.w:1,this},add:function(e,t){return void 0!==t?(console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,t)):(this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this)},addScalar:function(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this},addVectors:function(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this.w=e.w+t.w,this},addScaledVector:function(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this.w+=e.w*t,this},sub:function(e,t){return void 0!==t?(console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,t)):(this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this)},subScalar:function(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this},subVectors:function(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this.w=e.w-t.w,this},multiplyScalar:function(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this},applyMatrix4:function(e){var t=this.x,n=this.y,r=this.z,i=this.w,a=e.elements;return this.x=a[0]*t+a[4]*n+a[8]*r+a[12]*i,this.y=a[1]*t+a[5]*n+a[9]*r+a[13]*i,this.z=a[2]*t+a[6]*n+a[10]*r+a[14]*i,this.w=a[3]*t+a[7]*n+a[11]*r+a[15]*i,this},divideScalar:function(e){return this.multiplyScalar(1/e)},setAxisAngleFromQuaternion:function(e){this.w=2*Math.acos(e.w);var t=Math.sqrt(1-e.w*e.w);return t<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/t,this.y=e.y/t,this.z=e.z/t),this},setAxisAngleFromRotationMatrix:function(e){var t,n,r,i,a=e.elements,o=a[0],s=a[4],c=a[8],l=a[1],u=a[5],h=a[9],p=a[2],d=a[6],f=a[10];if(Math.abs(s-l)<.01&&Math.abs(c-p)<.01&&Math.abs(h-d)<.01){if(Math.abs(s+l)<.1&&Math.abs(c+p)<.1&&Math.abs(h+d)<.1&&Math.abs(o+u+f-3)<.1)return this.set(1,0,0,0),this;t=Math.PI;var m=(o+1)/2,g=(u+1)/2,v=(f+1)/2,y=(s+l)/4,x=(c+p)/4,b=(h+d)/4;return m>g&&m>v?m<.01?(n=0,r=.707106781,i=.707106781):(r=y/(n=Math.sqrt(m)),i=x/n):g>v?g<.01?(n=.707106781,r=0,i=.707106781):(n=y/(r=Math.sqrt(g)),i=b/r):v<.01?(n=.707106781,r=.707106781,i=0):(n=x/(i=Math.sqrt(v)),r=b/i),this.set(n,r,i,t),this}var _=Math.sqrt((d-h)*(d-h)+(c-p)*(c-p)+(l-s)*(l-s));return Math.abs(_)<.001&&(_=1),this.x=(d-h)/_,this.y=(c-p)/_,this.z=(l-s)/_,this.w=Math.acos((o+u+f-1)/2),this},min:function(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this.w=Math.min(this.w,e.w),this},max:function(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this.w=Math.max(this.w,e.w),this},clamp:function(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this.z=Math.max(e.z,Math.min(t.z,this.z)),this.w=Math.max(e.w,Math.min(t.w,this.w)),this},clampScalar:function(e,t){return this.x=Math.max(e,Math.min(t,this.x)),this.y=Math.max(e,Math.min(t,this.y)),this.z=Math.max(e,Math.min(t,this.z)),this.w=Math.max(e,Math.min(t,this.w)),this},clampLength:function(e,t){var n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(e,Math.min(t,n)))},floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this.w=this.w<0?Math.ceil(this.w):Math.floor(this.w),this},negate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this},dot:function(e){return this.x*e.x+this.y*e.y+this.z*e.z+this.w*e.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(e){return this.normalize().multiplyScalar(e)},lerp:function(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this.w+=(e.w-this.w)*t,this},lerpVectors:function(e,t,n){return this.subVectors(t,e).multiplyScalar(n).add(e)},equals:function(e){return e.x===this.x&&e.y===this.y&&e.z===this.z&&e.w===this.w},fromArray:function(e,t){return void 0===t&&(t=0),this.x=e[t],this.y=e[t+1],this.z=e[t+2],this.w=e[t+3],this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e[t+3]=this.w,e},fromBufferAttribute:function(e,t,n){return void 0!==n&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this.w=e.getW(t),this}}),v.prototype=Object.assign(Object.create(o.prototype),{constructor:v,isWebGLRenderTarget:!0,setSize:function(e,t){this.width===e&&this.height===t||(this.width=e,this.height=t,this.texture.image.width=e,this.texture.image.height=t,this.dispose()),this.viewport.set(0,0,e,t),this.scissor.set(0,0,e,t)},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.width=e.width,this.height=e.height,this.viewport.copy(e.viewport),this.texture=e.texture.clone(),this.depthBuffer=e.depthBuffer,this.stencilBuffer=e.stencilBuffer,this.depthTexture=e.depthTexture,this},dispose:function(){this.dispatchEvent({type:"dispose"})}}),y.prototype=Object.assign(Object.create(v.prototype),{constructor:y,isWebGLMultisampleRenderTarget:!0,copy:function(e){return v.prototype.copy.call(this,e),this.samples=e.samples,this}}),Object.assign(x,{slerp:function(e,t,n,r){return n.copy(e).slerp(t,r)},slerpFlat:function(e,t,n,r,i,a,o){var s=n[r+0],c=n[r+1],l=n[r+2],u=n[r+3],h=i[a+0],p=i[a+1],d=i[a+2],f=i[a+3];if(u!==f||s!==h||c!==p||l!==d){var m=1-o,g=s*h+c*p+l*d+u*f,v=g>=0?1:-1,y=1-g*g;if(y>Number.EPSILON){var x=Math.sqrt(y),b=Math.atan2(x,g*v);m=Math.sin(m*b)/x,o=Math.sin(o*b)/x}var _=o*v;if(s=s*m+h*_,c=c*m+p*_,l=l*m+d*_,u=u*m+f*_,m===1-o){var w=1/Math.sqrt(s*s+c*c+l*l+u*u);s*=w,c*=w,l*=w,u*=w}}e[t]=s,e[t+1]=c,e[t+2]=l,e[t+3]=u}}),Object.defineProperties(x.prototype,{x:{get:function(){return this._x},set:function(e){this._x=e,this._onChangeCallback()}},y:{get:function(){return this._y},set:function(e){this._y=e,this._onChangeCallback()}},z:{get:function(){return this._z},set:function(e){this._z=e,this._onChangeCallback()}},w:{get:function(){return this._w},set:function(e){this._w=e,this._onChangeCallback()}}}),Object.assign(x.prototype,{isQuaternion:!0,set:function(e,t,n,r){return this._x=e,this._y=t,this._z=n,this._w=r,this._onChangeCallback(),this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w)},copy:function(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback(),this},setFromEuler:function(e,t){if(!e||!e.isEuler)throw new Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");var n=e._x,r=e._y,i=e._z,a=e.order,o=Math.cos,s=Math.sin,c=o(n/2),l=o(r/2),u=o(i/2),h=s(n/2),p=s(r/2),d=s(i/2);return"XYZ"===a?(this._x=h*l*u+c*p*d,this._y=c*p*u-h*l*d,this._z=c*l*d+h*p*u,this._w=c*l*u-h*p*d):"YXZ"===a?(this._x=h*l*u+c*p*d,this._y=c*p*u-h*l*d,this._z=c*l*d-h*p*u,this._w=c*l*u+h*p*d):"ZXY"===a?(this._x=h*l*u-c*p*d,this._y=c*p*u+h*l*d,this._z=c*l*d+h*p*u,this._w=c*l*u-h*p*d):"ZYX"===a?(this._x=h*l*u-c*p*d,this._y=c*p*u+h*l*d,this._z=c*l*d-h*p*u,this._w=c*l*u+h*p*d):"YZX"===a?(this._x=h*l*u+c*p*d,this._y=c*p*u+h*l*d,this._z=c*l*d-h*p*u,this._w=c*l*u-h*p*d):"XZY"===a&&(this._x=h*l*u-c*p*d,this._y=c*p*u-h*l*d,this._z=c*l*d+h*p*u,this._w=c*l*u+h*p*d),!1!==t&&this._onChangeCallback(),this},setFromAxisAngle:function(e,t){var n=t/2,r=Math.sin(n);return this._x=e.x*r,this._y=e.y*r,this._z=e.z*r,this._w=Math.cos(n),this._onChangeCallback(),this},setFromRotationMatrix:function(e){var t,n=e.elements,r=n[0],i=n[4],a=n[8],o=n[1],s=n[5],c=n[9],l=n[2],u=n[6],h=n[10],p=r+s+h;return p>0?(t=.5/Math.sqrt(p+1),this._w=.25/t,this._x=(u-c)*t,this._y=(a-l)*t,this._z=(o-i)*t):r>s&&r>h?(t=2*Math.sqrt(1+r-s-h),this._w=(u-c)/t,this._x=.25*t,this._y=(i+o)/t,this._z=(a+l)/t):s>h?(t=2*Math.sqrt(1+s-r-h),this._w=(a-l)/t,this._x=(i+o)/t,this._y=.25*t,this._z=(c+u)/t):(t=2*Math.sqrt(1+h-r-s),this._w=(o-i)/t,this._x=(a+l)/t,this._y=(c+u)/t,this._z=.25*t),this._onChangeCallback(),this},setFromUnitVectors:function(e,t){var n=e.dot(t)+1;return n<1e-6?(n=0,Math.abs(e.x)>Math.abs(e.z)?(this._x=-e.y,this._y=e.x,this._z=0,this._w=n):(this._x=0,this._y=-e.z,this._z=e.y,this._w=n)):(this._x=e.y*t.z-e.z*t.y,this._y=e.z*t.x-e.x*t.z,this._z=e.x*t.y-e.y*t.x,this._w=n),this.normalize()},angleTo:function(e){return 2*Math.acos(Math.abs(u.clamp(this.dot(e),-1,1)))},rotateTowards:function(e,t){var n=this.angleTo(e);if(0===n)return this;var r=Math.min(1,t/n);return this.slerp(e,r),this},inverse:function(){return this.conjugate()},conjugate:function(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this},dot:function(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var e=this.length();return 0===e?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x=this._x*e,this._y=this._y*e,this._z=this._z*e,this._w=this._w*e),this._onChangeCallback(),this},multiply:function(e,t){return void 0!==t?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(e,t)):this.multiplyQuaternions(this,e)},premultiply:function(e){return this.multiplyQuaternions(e,this)},multiplyQuaternions:function(e,t){var n=e._x,r=e._y,i=e._z,a=e._w,o=t._x,s=t._y,c=t._z,l=t._w;return this._x=n*l+a*o+r*c-i*s,this._y=r*l+a*s+i*o-n*c,this._z=i*l+a*c+n*s-r*o,this._w=a*l-n*o-r*s-i*c,this._onChangeCallback(),this},slerp:function(e,t){if(0===t)return this;if(1===t)return this.copy(e);var n=this._x,r=this._y,i=this._z,a=this._w,o=a*e._w+n*e._x+r*e._y+i*e._z;if(o<0?(this._w=-e._w,this._x=-e._x,this._y=-e._y,this._z=-e._z,o=-o):this.copy(e),o>=1)return this._w=a,this._x=n,this._y=r,this._z=i,this;var s=1-o*o;if(s<=Number.EPSILON){var c=1-t;return this._w=c*a+t*this._w,this._x=c*n+t*this._x,this._y=c*r+t*this._y,this._z=c*i+t*this._z,this.normalize(),this._onChangeCallback(),this}var l=Math.sqrt(s),u=Math.atan2(l,o),h=Math.sin((1-t)*u)/l,p=Math.sin(t*u)/l;return this._w=a*h+this._w*p,this._x=n*h+this._x*p,this._y=r*h+this._y*p,this._z=i*h+this._z*p,this._onChangeCallback(),this},equals:function(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w},fromArray:function(e,t){return void 0===t&&(t=0),this._x=e[t],this._y=e[t+1],this._z=e[t+2],this._w=e[t+3],this._onChangeCallback(),this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._w,e},fromBufferAttribute:function(e,t){return this._x=e.getX(t),this._y=e.getY(t),this._z=e.getZ(t),this._w=e.getW(t),this},_onChange:function(e){return this._onChangeCallback=e,this},_onChangeCallback:function(){}});var b=new w,_=new x;function w(e,t,n){this.x=e||0,this.y=t||0,this.z=n||0}Object.assign(w.prototype,{isVector3:!0,set:function(e,t,n){return this.x=e,this.y=t,this.z=n,this},setScalar:function(e){return this.x=e,this.y=e,this.z=e,this},setX:function(e){return this.x=e,this},setY:function(e){return this.y=e,this},setZ:function(e){return this.z=e,this},setComponent:function(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;default:throw new Error("index is out of range: "+e)}return this},getComponent:function(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+e)}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(e){return this.x=e.x,this.y=e.y,this.z=e.z,this},add:function(e,t){return void 0!==t?(console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,t)):(this.x+=e.x,this.y+=e.y,this.z+=e.z,this)},addScalar:function(e){return this.x+=e,this.y+=e,this.z+=e,this},addVectors:function(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this},addScaledVector:function(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this},sub:function(e,t){return void 0!==t?(console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,t)):(this.x-=e.x,this.y-=e.y,this.z-=e.z,this)},subScalar:function(e){return this.x-=e,this.y-=e,this.z-=e,this},subVectors:function(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this},multiply:function(e,t){return void 0!==t?(console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(e,t)):(this.x*=e.x,this.y*=e.y,this.z*=e.z,this)},multiplyScalar:function(e){return this.x*=e,this.y*=e,this.z*=e,this},multiplyVectors:function(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this.z=e.z*t.z,this},applyEuler:function(e){return e&&e.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."),this.applyQuaternion(_.setFromEuler(e))},applyAxisAngle:function(e,t){return this.applyQuaternion(_.setFromAxisAngle(e,t))},applyMatrix3:function(e){var t=this.x,n=this.y,r=this.z,i=e.elements;return this.x=i[0]*t+i[3]*n+i[6]*r,this.y=i[1]*t+i[4]*n+i[7]*r,this.z=i[2]*t+i[5]*n+i[8]*r,this},applyNormalMatrix:function(e){return this.applyMatrix3(e).normalize()},applyMatrix4:function(e){var t=this.x,n=this.y,r=this.z,i=e.elements,a=1/(i[3]*t+i[7]*n+i[11]*r+i[15]);return this.x=(i[0]*t+i[4]*n+i[8]*r+i[12])*a,this.y=(i[1]*t+i[5]*n+i[9]*r+i[13])*a,this.z=(i[2]*t+i[6]*n+i[10]*r+i[14])*a,this},applyQuaternion:function(e){var t=this.x,n=this.y,r=this.z,i=e.x,a=e.y,o=e.z,s=e.w,c=s*t+a*r-o*n,l=s*n+o*t-i*r,u=s*r+i*n-a*t,h=-i*t-a*n-o*r;return this.x=c*s+h*-i+l*-o-u*-a,this.y=l*s+h*-a+u*-i-c*-o,this.z=u*s+h*-o+c*-a-l*-i,this},project:function(e){return this.applyMatrix4(e.matrixWorldInverse).applyMatrix4(e.projectionMatrix)},unproject:function(e){return this.applyMatrix4(e.projectionMatrixInverse).applyMatrix4(e.matrixWorld)},transformDirection:function(e){var t=this.x,n=this.y,r=this.z,i=e.elements;return this.x=i[0]*t+i[4]*n+i[8]*r,this.y=i[1]*t+i[5]*n+i[9]*r,this.z=i[2]*t+i[6]*n+i[10]*r,this.normalize()},divide:function(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this},divideScalar:function(e){return this.multiplyScalar(1/e)},min:function(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this},max:function(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this},clamp:function(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this.z=Math.max(e.z,Math.min(t.z,this.z)),this},clampScalar:function(e,t){return this.x=Math.max(e,Math.min(t,this.x)),this.y=Math.max(e,Math.min(t,this.y)),this.z=Math.max(e,Math.min(t,this.z)),this},clampLength:function(e,t){var n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(e,Math.min(t,n)))},floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this},negate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this},dot:function(e){return this.x*e.x+this.y*e.y+this.z*e.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(e){return this.normalize().multiplyScalar(e)},lerp:function(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this},lerpVectors:function(e,t,n){return this.subVectors(t,e).multiplyScalar(n).add(e)},cross:function(e,t){return void 0!==t?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(e,t)):this.crossVectors(this,e)},crossVectors:function(e,t){var n=e.x,r=e.y,i=e.z,a=t.x,o=t.y,s=t.z;return this.x=r*s-i*o,this.y=i*a-n*s,this.z=n*o-r*a,this},projectOnVector:function(e){var t=e.lengthSq();if(0===t)return this.set(0,0,0);var n=e.dot(this)/t;return this.copy(e).multiplyScalar(n)},projectOnPlane:function(e){return b.copy(this).projectOnVector(e),this.sub(b)},reflect:function(e){return this.sub(b.copy(e).multiplyScalar(2*this.dot(e)))},angleTo:function(e){var t=Math.sqrt(this.lengthSq()*e.lengthSq());if(0===t)return Math.PI/2;var n=this.dot(e)/t;return Math.acos(u.clamp(n,-1,1))},distanceTo:function(e){return Math.sqrt(this.distanceToSquared(e))},distanceToSquared:function(e){var t=this.x-e.x,n=this.y-e.y,r=this.z-e.z;return t*t+n*n+r*r},manhattanDistanceTo:function(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)},setFromSpherical:function(e){return this.setFromSphericalCoords(e.radius,e.phi,e.theta)},setFromSphericalCoords:function(e,t,n){var r=Math.sin(t)*e;return this.x=r*Math.sin(n),this.y=Math.cos(t)*e,this.z=r*Math.cos(n),this},setFromCylindrical:function(e){return this.setFromCylindricalCoords(e.radius,e.theta,e.y)},setFromCylindricalCoords:function(e,t,n){return this.x=e*Math.sin(t),this.y=n,this.z=e*Math.cos(t),this},setFromMatrixPosition:function(e){var t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this},setFromMatrixScale:function(e){var t=this.setFromMatrixColumn(e,0).length(),n=this.setFromMatrixColumn(e,1).length(),r=this.setFromMatrixColumn(e,2).length();return this.x=t,this.y=n,this.z=r,this},setFromMatrixColumn:function(e,t){return this.fromArray(e.elements,4*t)},setFromMatrix3Column:function(e,t){return this.fromArray(e.elements,3*t)},equals:function(e){return e.x===this.x&&e.y===this.y&&e.z===this.z},fromArray:function(e,t){return void 0===t&&(t=0),this.x=e[t],this.y=e[t+1],this.z=e[t+2],this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e},fromBufferAttribute:function(e,t,n){return void 0!==n&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this}});var M=new w,S=new R,E=new w(0,0,0),T=new w(1,1,1),A=new w,L=new w,P=new w;function R(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}Object.assign(R.prototype,{isMatrix4:!0,set:function(e,t,n,r,i,a,o,s,c,l,u,h,p,d,f,m){var g=this.elements;return g[0]=e,g[4]=t,g[8]=n,g[12]=r,g[1]=i,g[5]=a,g[9]=o,g[13]=s,g[2]=c,g[6]=l,g[10]=u,g[14]=h,g[3]=p,g[7]=d,g[11]=f,g[15]=m,this},identity:function(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this},clone:function(){return(new R).fromArray(this.elements)},copy:function(e){var t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t[9]=n[9],t[10]=n[10],t[11]=n[11],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],this},copyPosition:function(e){var t=this.elements,n=e.elements;return t[12]=n[12],t[13]=n[13],t[14]=n[14],this},extractBasis:function(e,t,n){return e.setFromMatrixColumn(this,0),t.setFromMatrixColumn(this,1),n.setFromMatrixColumn(this,2),this},makeBasis:function(e,t,n){return this.set(e.x,t.x,n.x,0,e.y,t.y,n.y,0,e.z,t.z,n.z,0,0,0,0,1),this},extractRotation:function(e){var t=this.elements,n=e.elements,r=1/M.setFromMatrixColumn(e,0).length(),i=1/M.setFromMatrixColumn(e,1).length(),a=1/M.setFromMatrixColumn(e,2).length();return t[0]=n[0]*r,t[1]=n[1]*r,t[2]=n[2]*r,t[3]=0,t[4]=n[4]*i,t[5]=n[5]*i,t[6]=n[6]*i,t[7]=0,t[8]=n[8]*a,t[9]=n[9]*a,t[10]=n[10]*a,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this},makeRotationFromEuler:function(e){e&&e.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var t=this.elements,n=e.x,r=e.y,i=e.z,a=Math.cos(n),o=Math.sin(n),s=Math.cos(r),c=Math.sin(r),l=Math.cos(i),u=Math.sin(i);if("XYZ"===e.order){var h=a*l,p=a*u,d=o*l,f=o*u;t[0]=s*l,t[4]=-s*u,t[8]=c,t[1]=p+d*c,t[5]=h-f*c,t[9]=-o*s,t[2]=f-h*c,t[6]=d+p*c,t[10]=a*s}else if("YXZ"===e.order){var m=s*l,g=s*u,v=c*l,y=c*u;t[0]=m+y*o,t[4]=v*o-g,t[8]=a*c,t[1]=a*u,t[5]=a*l,t[9]=-o,t[2]=g*o-v,t[6]=y+m*o,t[10]=a*s}else if("ZXY"===e.order){m=s*l,g=s*u,v=c*l,y=c*u;t[0]=m-y*o,t[4]=-a*u,t[8]=v+g*o,t[1]=g+v*o,t[5]=a*l,t[9]=y-m*o,t[2]=-a*c,t[6]=o,t[10]=a*s}else if("ZYX"===e.order){h=a*l,p=a*u,d=o*l,f=o*u;t[0]=s*l,t[4]=d*c-p,t[8]=h*c+f,t[1]=s*u,t[5]=f*c+h,t[9]=p*c-d,t[2]=-c,t[6]=o*s,t[10]=a*s}else if("YZX"===e.order){var x=a*s,b=a*c,_=o*s,w=o*c;t[0]=s*l,t[4]=w-x*u,t[8]=_*u+b,t[1]=u,t[5]=a*l,t[9]=-o*l,t[2]=-c*l,t[6]=b*u+_,t[10]=x-w*u}else if("XZY"===e.order){x=a*s,b=a*c,_=o*s,w=o*c;t[0]=s*l,t[4]=-u,t[8]=c*l,t[1]=x*u+w,t[5]=a*l,t[9]=b*u-_,t[2]=_*u-b,t[6]=o*l,t[10]=w*u+x}return t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this},makeRotationFromQuaternion:function(e){return this.compose(E,e,T)},lookAt:function(e,t,n){var r=this.elements;return P.subVectors(e,t),0===P.lengthSq()&&(P.z=1),P.normalize(),A.crossVectors(n,P),0===A.lengthSq()&&(1===Math.abs(n.z)?P.x+=1e-4:P.z+=1e-4,P.normalize(),A.crossVectors(n,P)),A.normalize(),L.crossVectors(P,A),r[0]=A.x,r[4]=L.x,r[8]=P.x,r[1]=A.y,r[5]=L.y,r[9]=P.y,r[2]=A.z,r[6]=L.z,r[10]=P.z,this},multiply:function(e,t){return void 0!==t?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(e,t)):this.multiplyMatrices(this,e)},premultiply:function(e){return this.multiplyMatrices(e,this)},multiplyMatrices:function(e,t){var n=e.elements,r=t.elements,i=this.elements,a=n[0],o=n[4],s=n[8],c=n[12],l=n[1],u=n[5],h=n[9],p=n[13],d=n[2],f=n[6],m=n[10],g=n[14],v=n[3],y=n[7],x=n[11],b=n[15],_=r[0],w=r[4],M=r[8],S=r[12],E=r[1],T=r[5],A=r[9],L=r[13],P=r[2],R=r[6],C=r[10],O=r[14],D=r[3],N=r[7],I=r[11],z=r[15];return i[0]=a*_+o*E+s*P+c*D,i[4]=a*w+o*T+s*R+c*N,i[8]=a*M+o*A+s*C+c*I,i[12]=a*S+o*L+s*O+c*z,i[1]=l*_+u*E+h*P+p*D,i[5]=l*w+u*T+h*R+p*N,i[9]=l*M+u*A+h*C+p*I,i[13]=l*S+u*L+h*O+p*z,i[2]=d*_+f*E+m*P+g*D,i[6]=d*w+f*T+m*R+g*N,i[10]=d*M+f*A+m*C+g*I,i[14]=d*S+f*L+m*O+g*z,i[3]=v*_+y*E+x*P+b*D,i[7]=v*w+y*T+x*R+b*N,i[11]=v*M+y*A+x*C+b*I,i[15]=v*S+y*L+x*O+b*z,this},multiplyScalar:function(e){var t=this.elements;return t[0]*=e,t[4]*=e,t[8]*=e,t[12]*=e,t[1]*=e,t[5]*=e,t[9]*=e,t[13]*=e,t[2]*=e,t[6]*=e,t[10]*=e,t[14]*=e,t[3]*=e,t[7]*=e,t[11]*=e,t[15]*=e,this},determinant:function(){var e=this.elements,t=e[0],n=e[4],r=e[8],i=e[12],a=e[1],o=e[5],s=e[9],c=e[13],l=e[2],u=e[6],h=e[10],p=e[14];return e[3]*(+i*s*u-r*c*u-i*o*h+n*c*h+r*o*p-n*s*p)+e[7]*(+t*s*p-t*c*h+i*a*h-r*a*p+r*c*l-i*s*l)+e[11]*(+t*c*u-t*o*p-i*a*u+n*a*p+i*o*l-n*c*l)+e[15]*(-r*o*l-t*s*u+t*o*h+r*a*u-n*a*h+n*s*l)},transpose:function(){var e,t=this.elements;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this},setPosition:function(e,t,n){var r=this.elements;return e.isVector3?(r[12]=e.x,r[13]=e.y,r[14]=e.z):(r[12]=e,r[13]=t,r[14]=n),this},getInverse:function(e,t){void 0!==t&&console.warn("THREE.Matrix4: .getInverse() can no longer be configured to throw on degenerate.");var n=this.elements,r=e.elements,i=r[0],a=r[1],o=r[2],s=r[3],c=r[4],l=r[5],u=r[6],h=r[7],p=r[8],d=r[9],f=r[10],m=r[11],g=r[12],v=r[13],y=r[14],x=r[15],b=d*y*h-v*f*h+v*u*m-l*y*m-d*u*x+l*f*x,_=g*f*h-p*y*h-g*u*m+c*y*m+p*u*x-c*f*x,w=p*v*h-g*d*h+g*l*m-c*v*m-p*l*x+c*d*x,M=g*d*u-p*v*u-g*l*f+c*v*f+p*l*y-c*d*y,S=i*b+a*_+o*w+s*M;if(0===S)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);var E=1/S;return n[0]=b*E,n[1]=(v*f*s-d*y*s-v*o*m+a*y*m+d*o*x-a*f*x)*E,n[2]=(l*y*s-v*u*s+v*o*h-a*y*h-l*o*x+a*u*x)*E,n[3]=(d*u*s-l*f*s-d*o*h+a*f*h+l*o*m-a*u*m)*E,n[4]=_*E,n[5]=(p*y*s-g*f*s+g*o*m-i*y*m-p*o*x+i*f*x)*E,n[6]=(g*u*s-c*y*s-g*o*h+i*y*h+c*o*x-i*u*x)*E,n[7]=(c*f*s-p*u*s+p*o*h-i*f*h-c*o*m+i*u*m)*E,n[8]=w*E,n[9]=(g*d*s-p*v*s-g*a*m+i*v*m+p*a*x-i*d*x)*E,n[10]=(c*v*s-g*l*s+g*a*h-i*v*h-c*a*x+i*l*x)*E,n[11]=(p*l*s-c*d*s-p*a*h+i*d*h+c*a*m-i*l*m)*E,n[12]=M*E,n[13]=(p*v*o-g*d*o+g*a*f-i*v*f-p*a*y+i*d*y)*E,n[14]=(g*l*o-c*v*o-g*a*u+i*v*u+c*a*y-i*l*y)*E,n[15]=(c*d*o-p*l*o+p*a*u-i*d*u-c*a*f+i*l*f)*E,this},scale:function(e){var t=this.elements,n=e.x,r=e.y,i=e.z;return t[0]*=n,t[4]*=r,t[8]*=i,t[1]*=n,t[5]*=r,t[9]*=i,t[2]*=n,t[6]*=r,t[10]*=i,t[3]*=n,t[7]*=r,t[11]*=i,this},getMaxScaleOnAxis:function(){var e=this.elements,t=e[0]*e[0]+e[1]*e[1]+e[2]*e[2],n=e[4]*e[4]+e[5]*e[5]+e[6]*e[6],r=e[8]*e[8]+e[9]*e[9]+e[10]*e[10];return Math.sqrt(Math.max(t,n,r))},makeTranslation:function(e,t,n){return this.set(1,0,0,e,0,1,0,t,0,0,1,n,0,0,0,1),this},makeRotationX:function(e){var t=Math.cos(e),n=Math.sin(e);return this.set(1,0,0,0,0,t,-n,0,0,n,t,0,0,0,0,1),this},makeRotationY:function(e){var t=Math.cos(e),n=Math.sin(e);return this.set(t,0,n,0,0,1,0,0,-n,0,t,0,0,0,0,1),this},makeRotationZ:function(e){var t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,0,n,t,0,0,0,0,1,0,0,0,0,1),this},makeRotationAxis:function(e,t){var n=Math.cos(t),r=Math.sin(t),i=1-n,a=e.x,o=e.y,s=e.z,c=i*a,l=i*o;return this.set(c*a+n,c*o-r*s,c*s+r*o,0,c*o+r*s,l*o+n,l*s-r*a,0,c*s-r*o,l*s+r*a,i*s*s+n,0,0,0,0,1),this},makeScale:function(e,t,n){return this.set(e,0,0,0,0,t,0,0,0,0,n,0,0,0,0,1),this},makeShear:function(e,t,n){return this.set(1,t,n,0,e,1,n,0,e,t,1,0,0,0,0,1),this},compose:function(e,t,n){var r=this.elements,i=t._x,a=t._y,o=t._z,s=t._w,c=i+i,l=a+a,u=o+o,h=i*c,p=i*l,d=i*u,f=a*l,m=a*u,g=o*u,v=s*c,y=s*l,x=s*u,b=n.x,_=n.y,w=n.z;return r[0]=(1-(f+g))*b,r[1]=(p+x)*b,r[2]=(d-y)*b,r[3]=0,r[4]=(p-x)*_,r[5]=(1-(h+g))*_,r[6]=(m+v)*_,r[7]=0,r[8]=(d+y)*w,r[9]=(m-v)*w,r[10]=(1-(h+f))*w,r[11]=0,r[12]=e.x,r[13]=e.y,r[14]=e.z,r[15]=1,this},decompose:function(e,t,n){var r=this.elements,i=M.set(r[0],r[1],r[2]).length(),a=M.set(r[4],r[5],r[6]).length(),o=M.set(r[8],r[9],r[10]).length();this.determinant()<0&&(i=-i),e.x=r[12],e.y=r[13],e.z=r[14],S.copy(this);var s=1/i,c=1/a,l=1/o;return S.elements[0]*=s,S.elements[1]*=s,S.elements[2]*=s,S.elements[4]*=c,S.elements[5]*=c,S.elements[6]*=c,S.elements[8]*=l,S.elements[9]*=l,S.elements[10]*=l,t.setFromRotationMatrix(S),n.x=i,n.y=a,n.z=o,this},makePerspective:function(e,t,n,r,i,a){void 0===a&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");var o=this.elements,s=2*i/(t-e),c=2*i/(n-r),l=(t+e)/(t-e),u=(n+r)/(n-r),h=-(a+i)/(a-i),p=-2*a*i/(a-i);return o[0]=s,o[4]=0,o[8]=l,o[12]=0,o[1]=0,o[5]=c,o[9]=u,o[13]=0,o[2]=0,o[6]=0,o[10]=h,o[14]=p,o[3]=0,o[7]=0,o[11]=-1,o[15]=0,this},makeOrthographic:function(e,t,n,r,i,a){var o=this.elements,s=1/(t-e),c=1/(n-r),l=1/(a-i),u=(t+e)*s,h=(n+r)*c,p=(a+i)*l;return o[0]=2*s,o[4]=0,o[8]=0,o[12]=-u,o[1]=0,o[5]=2*c,o[9]=0,o[13]=-h,o[2]=0,o[6]=0,o[10]=-2*l,o[14]=-p,o[3]=0,o[7]=0,o[11]=0,o[15]=1,this},equals:function(e){for(var t=this.elements,n=e.elements,r=0;r<16;r++)if(t[r]!==n[r])return!1;return!0},fromArray:function(e,t){void 0===t&&(t=0);for(var n=0;n<16;n++)this.elements[n]=e[n+t];return this},toArray:function(e,t){void 0===e&&(e=[]),void 0===t&&(t=0);var n=this.elements;return e[t]=n[0],e[t+1]=n[1],e[t+2]=n[2],e[t+3]=n[3],e[t+4]=n[4],e[t+5]=n[5],e[t+6]=n[6],e[t+7]=n[7],e[t+8]=n[8],e[t+9]=n[9],e[t+10]=n[10],e[t+11]=n[11],e[t+12]=n[12],e[t+13]=n[13],e[t+14]=n[14],e[t+15]=n[15],e}});var C=new R,O=new x;function D(e,t,n,r){this._x=e||0,this._y=t||0,this._z=n||0,this._order=r||D.DefaultOrder}function N(){this.mask=1}D.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"],D.DefaultOrder="XYZ",Object.defineProperties(D.prototype,{x:{get:function(){return this._x},set:function(e){this._x=e,this._onChangeCallback()}},y:{get:function(){return this._y},set:function(e){this._y=e,this._onChangeCallback()}},z:{get:function(){return this._z},set:function(e){this._z=e,this._onChangeCallback()}},order:{get:function(){return this._order},set:function(e){this._order=e,this._onChangeCallback()}}}),Object.assign(D.prototype,{isEuler:!0,set:function(e,t,n,r){return this._x=e,this._y=t,this._z=n,this._order=r||this._order,this._onChangeCallback(),this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._order)},copy:function(e){return this._x=e._x,this._y=e._y,this._z=e._z,this._order=e._order,this._onChangeCallback(),this},setFromRotationMatrix:function(e,t,n){var r=u.clamp,i=e.elements,a=i[0],o=i[4],s=i[8],c=i[1],l=i[5],h=i[9],p=i[2],d=i[6],f=i[10];return"XYZ"===(t=t||this._order)?(this._y=Math.asin(r(s,-1,1)),Math.abs(s)<.9999999?(this._x=Math.atan2(-h,f),this._z=Math.atan2(-o,a)):(this._x=Math.atan2(d,l),this._z=0)):"YXZ"===t?(this._x=Math.asin(-r(h,-1,1)),Math.abs(h)<.9999999?(this._y=Math.atan2(s,f),this._z=Math.atan2(c,l)):(this._y=Math.atan2(-p,a),this._z=0)):"ZXY"===t?(this._x=Math.asin(r(d,-1,1)),Math.abs(d)<.9999999?(this._y=Math.atan2(-p,f),this._z=Math.atan2(-o,l)):(this._y=0,this._z=Math.atan2(c,a))):"ZYX"===t?(this._y=Math.asin(-r(p,-1,1)),Math.abs(p)<.9999999?(this._x=Math.atan2(d,f),this._z=Math.atan2(c,a)):(this._x=0,this._z=Math.atan2(-o,l))):"YZX"===t?(this._z=Math.asin(r(c,-1,1)),Math.abs(c)<.9999999?(this._x=Math.atan2(-h,l),this._y=Math.atan2(-p,a)):(this._x=0,this._y=Math.atan2(s,f))):"XZY"===t?(this._z=Math.asin(-r(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(d,l),this._y=Math.atan2(s,a)):(this._x=Math.atan2(-h,f),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+t),this._order=t,!1!==n&&this._onChangeCallback(),this},setFromQuaternion:function(e,t,n){return C.makeRotationFromQuaternion(e),this.setFromRotationMatrix(C,t,n)},setFromVector3:function(e,t){return this.set(e.x,e.y,e.z,t||this._order)},reorder:function(e){return O.setFromEuler(this),this.setFromQuaternion(O,e)},equals:function(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._order===this._order},fromArray:function(e){return this._x=e[0],this._y=e[1],this._z=e[2],void 0!==e[3]&&(this._order=e[3]),this._onChangeCallback(),this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._order,e},toVector3:function(e){return e?e.set(this._x,this._y,this._z):new w(this._x,this._y,this._z)},_onChange:function(e){return this._onChangeCallback=e,this},_onChangeCallback:function(){}}),Object.assign(N.prototype,{set:function(e){this.mask=1<<e|0},enable:function(e){this.mask|=1<<e|0},enableAll:function(){this.mask=-1},toggle:function(e){this.mask^=1<<e|0},disable:function(e){this.mask&=~(1<<e|0)},disableAll:function(){this.mask=0},test:function(e){return 0!=(this.mask&e.mask)}});var I=0,z=new w,k=new x,F=new R,B=new w,U=new w,j=new w,H=new x,G=new w(1,0,0),V=new w(0,1,0),W=new w(0,0,1),q={type:"added"},X={type:"removed"};function Y(){Object.defineProperty(this,"id",{value:I++}),this.uuid=u.generateUUID(),this.name="",this.type="Object3D",this.parent=null,this.children=[],this.up=Y.DefaultUp.clone();var e=new w,t=new D,n=new x,r=new w(1,1,1);t._onChange((function(){n.setFromEuler(t,!1)})),n._onChange((function(){t.setFromQuaternion(n,void 0,!1)})),Object.defineProperties(this,{position:{configurable:!0,enumerable:!0,value:e},rotation:{configurable:!0,enumerable:!0,value:t},quaternion:{configurable:!0,enumerable:!0,value:n},scale:{configurable:!0,enumerable:!0,value:r},modelViewMatrix:{value:new R},normalMatrix:{value:new p}}),this.matrix=new R,this.matrixWorld=new R,this.matrixAutoUpdate=Y.DefaultMatrixAutoUpdate,this.matrixWorldNeedsUpdate=!1,this.layers=new N,this.visible=!0,this.castShadow=!1,this.receiveShadow=!1,this.frustumCulled=!0,this.renderOrder=0,this.userData={}}function Z(){Y.call(this),this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.overrideMaterial=null,this.autoUpdate=!0,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}Y.DefaultUp=new w(0,1,0),Y.DefaultMatrixAutoUpdate=!0,Y.prototype=Object.assign(Object.create(o.prototype),{constructor:Y,isObject3D:!0,onBeforeRender:function(){},onAfterRender:function(){},applyMatrix4:function(e){this.matrixAutoUpdate&&this.updateMatrix(),this.matrix.premultiply(e),this.matrix.decompose(this.position,this.quaternion,this.scale)},applyQuaternion:function(e){return this.quaternion.premultiply(e),this},setRotationFromAxisAngle:function(e,t){this.quaternion.setFromAxisAngle(e,t)},setRotationFromEuler:function(e){this.quaternion.setFromEuler(e,!0)},setRotationFromMatrix:function(e){this.quaternion.setFromRotationMatrix(e)},setRotationFromQuaternion:function(e){this.quaternion.copy(e)},rotateOnAxis:function(e,t){return k.setFromAxisAngle(e,t),this.quaternion.multiply(k),this},rotateOnWorldAxis:function(e,t){return k.setFromAxisAngle(e,t),this.quaternion.premultiply(k),this},rotateX:function(e){return this.rotateOnAxis(G,e)},rotateY:function(e){return this.rotateOnAxis(V,e)},rotateZ:function(e){return this.rotateOnAxis(W,e)},translateOnAxis:function(e,t){return z.copy(e).applyQuaternion(this.quaternion),this.position.add(z.multiplyScalar(t)),this},translateX:function(e){return this.translateOnAxis(G,e)},translateY:function(e){return this.translateOnAxis(V,e)},translateZ:function(e){return this.translateOnAxis(W,e)},localToWorld:function(e){return e.applyMatrix4(this.matrixWorld)},worldToLocal:function(e){return e.applyMatrix4(F.getInverse(this.matrixWorld))},lookAt:function(e,t,n){e.isVector3?B.copy(e):B.set(e,t,n);var r=this.parent;this.updateWorldMatrix(!0,!1),U.setFromMatrixPosition(this.matrixWorld),this.isCamera||this.isLight?F.lookAt(U,B,this.up):F.lookAt(B,U,this.up),this.quaternion.setFromRotationMatrix(F),r&&(F.extractRotation(r.matrixWorld),k.setFromRotationMatrix(F),this.quaternion.premultiply(k.inverse()))},add:function(e){if(arguments.length>1){for(var t=0;t<arguments.length;t++)this.add(arguments[t]);return this}return e===this?(console.error("THREE.Object3D.add: object can't be added as a child of itself.",e),this):(e&&e.isObject3D?(null!==e.parent&&e.parent.remove(e),e.parent=this,this.children.push(e),e.dispatchEvent(q)):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",e),this)},remove:function(e){if(arguments.length>1){for(var t=0;t<arguments.length;t++)this.remove(arguments[t]);return this}var n=this.children.indexOf(e);return-1!==n&&(e.parent=null,this.children.splice(n,1),e.dispatchEvent(X)),this},attach:function(e){return this.updateWorldMatrix(!0,!1),F.getInverse(this.matrixWorld),null!==e.parent&&(e.parent.updateWorldMatrix(!0,!1),F.multiply(e.parent.matrixWorld)),e.applyMatrix4(F),e.updateWorldMatrix(!1,!1),this.add(e),this},getObjectById:function(e){return this.getObjectByProperty("id",e)},getObjectByName:function(e){return this.getObjectByProperty("name",e)},getObjectByProperty:function(e,t){if(this[e]===t)return this;for(var n=0,r=this.children.length;n<r;n++){var i=this.children[n].getObjectByProperty(e,t);if(void 0!==i)return i}},getWorldPosition:function(e){return void 0===e&&(console.warn("THREE.Object3D: .getWorldPosition() target is now required"),e=new w),this.updateMatrixWorld(!0),e.setFromMatrixPosition(this.matrixWorld)},getWorldQuaternion:function(e){return void 0===e&&(console.warn("THREE.Object3D: .getWorldQuaternion() target is now required"),e=new x),this.updateMatrixWorld(!0),this.matrixWorld.decompose(U,e,j),e},getWorldScale:function(e){return void 0===e&&(console.warn("THREE.Object3D: .getWorldScale() target is now required"),e=new w),this.updateMatrixWorld(!0),this.matrixWorld.decompose(U,H,e),e},getWorldDirection:function(e){void 0===e&&(console.warn("THREE.Object3D: .getWorldDirection() target is now required"),e=new w),this.updateMatrixWorld(!0);var t=this.matrixWorld.elements;return e.set(t[8],t[9],t[10]).normalize()},raycast:function(){},traverse:function(e){e(this);for(var t=this.children,n=0,r=t.length;n<r;n++)t[n].traverse(e)},traverseVisible:function(e){if(!1!==this.visible){e(this);for(var t=this.children,n=0,r=t.length;n<r;n++)t[n].traverseVisible(e)}},traverseAncestors:function(e){var t=this.parent;null!==t&&(e(t),t.traverseAncestors(e))},updateMatrix:function(){this.matrix.compose(this.position,this.quaternion,this.scale),this.matrixWorldNeedsUpdate=!0},updateMatrixWorld:function(e){this.matrixAutoUpdate&&this.updateMatrix(),(this.matrixWorldNeedsUpdate||e)&&(null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,e=!0);for(var t=this.children,n=0,r=t.length;n<r;n++)t[n].updateMatrixWorld(e)},updateWorldMatrix:function(e,t){var n=this.parent;if(!0===e&&null!==n&&n.updateWorldMatrix(!0,!1),this.matrixAutoUpdate&&this.updateMatrix(),null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),!0===t)for(var r=this.children,i=0,a=r.length;i<a;i++)r[i].updateWorldMatrix(!1,!0)},toJSON:function(e){var t=void 0===e||"string"==typeof e,n={};t&&(e={geometries:{},materials:{},textures:{},images:{},shapes:{}},n.metadata={version:4.5,type:"Object",generator:"Object3D.toJSON"});var r={};function i(t,n){return void 0===t[n.uuid]&&(t[n.uuid]=n.toJSON(e)),n.uuid}if(r.uuid=this.uuid,r.type=this.type,""!==this.name&&(r.name=this.name),!0===this.castShadow&&(r.castShadow=!0),!0===this.receiveShadow&&(r.receiveShadow=!0),!1===this.visible&&(r.visible=!1),!1===this.frustumCulled&&(r.frustumCulled=!1),0!==this.renderOrder&&(r.renderOrder=this.renderOrder),"{}"!==JSON.stringify(this.userData)&&(r.userData=this.userData),r.layers=this.layers.mask,r.matrix=this.matrix.toArray(),!1===this.matrixAutoUpdate&&(r.matrixAutoUpdate=!1),this.isInstancedMesh&&(r.type="InstancedMesh",r.count=this.count,r.instanceMatrix=this.instanceMatrix.toJSON()),this.isMesh||this.isLine||this.isPoints){r.geometry=i(e.geometries,this.geometry);var a=this.geometry.parameters;if(void 0!==a&&void 0!==a.shapes){var o=a.shapes;if(Array.isArray(o))for(var s=0,c=o.length;s<c;s++){var l=o[s];i(e.shapes,l)}else i(e.shapes,o)}}if(void 0!==this.material)if(Array.isArray(this.material)){var u=[];for(s=0,c=this.material.length;s<c;s++)u.push(i(e.materials,this.material[s]));r.material=u}else r.material=i(e.materials,this.material);if(this.children.length>0){r.children=[];for(s=0;s<this.children.length;s++)r.children.push(this.children[s].toJSON(e).object)}if(t){var h=m(e.geometries),p=m(e.materials),d=m(e.textures),f=m(e.images);o=m(e.shapes);h.length>0&&(n.geometries=h),p.length>0&&(n.materials=p),d.length>0&&(n.textures=d),f.length>0&&(n.images=f),o.length>0&&(n.shapes=o)}return n.object=r,n;function m(e){var t=[];for(var n in e){var r=e[n];delete r.metadata,t.push(r)}return t}},clone:function(e){return(new this.constructor).copy(this,e)},copy:function(e,t){if(void 0===t&&(t=!0),this.name=e.name,this.up.copy(e.up),this.position.copy(e.position),this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.userData=JSON.parse(JSON.stringify(e.userData)),!0===t)for(var n=0;n<e.children.length;n++){var r=e.children[n];this.add(r.clone())}return this}}),Z.prototype=Object.assign(Object.create(Y.prototype),{constructor:Z,isScene:!0,copy:function(e,t){return Y.prototype.copy.call(this,e,t),null!==e.background&&(this.background=e.background.clone()),null!==e.environment&&(this.environment=e.environment.clone()),null!==e.fog&&(this.fog=e.fog.clone()),null!==e.overrideMaterial&&(this.overrideMaterial=e.overrideMaterial.clone()),this.autoUpdate=e.autoUpdate,this.matrixAutoUpdate=e.matrixAutoUpdate,this},toJSON:function(e){var t=Y.prototype.toJSON.call(this,e);return null!==this.background&&(t.object.background=this.background.toJSON(e)),null!==this.environment&&(t.object.environment=this.environment.toJSON(e)),null!==this.fog&&(t.object.fog=this.fog.toJSON()),t},dispose:function(){this.dispatchEvent({type:"dispose"})}});var J=[new w,new w,new w,new w,new w,new w,new w,new w],Q=new w,K=new le,$=new w,ee=new w,te=new w,ne=new w,re=new w,ie=new w,ae=new w,oe=new w,se=new w,ce=new w;function le(e,t){this.min=void 0!==e?e:new w(1/0,1/0,1/0),this.max=void 0!==t?t:new w(-1/0,-1/0,-1/0)}function ue(e,t,n,r,i){var a,o;for(a=0,o=e.length-3;a<=o;a+=3){ce.fromArray(e,a);var s=i.x*Math.abs(ce.x)+i.y*Math.abs(ce.y)+i.z*Math.abs(ce.z),c=t.dot(ce),l=n.dot(ce),u=r.dot(ce);if(Math.max(-Math.max(c,l,u),Math.min(c,l,u))>s)return!1}return!0}Object.assign(le.prototype,{isBox3:!0,set:function(e,t){return this.min.copy(e),this.max.copy(t),this},setFromArray:function(e){for(var t=1/0,n=1/0,r=1/0,i=-1/0,a=-1/0,o=-1/0,s=0,c=e.length;s<c;s+=3){var l=e[s],u=e[s+1],h=e[s+2];l<t&&(t=l),u<n&&(n=u),h<r&&(r=h),l>i&&(i=l),u>a&&(a=u),h>o&&(o=h)}return this.min.set(t,n,r),this.max.set(i,a,o),this},setFromBufferAttribute:function(e){for(var t=1/0,n=1/0,r=1/0,i=-1/0,a=-1/0,o=-1/0,s=0,c=e.count;s<c;s++){var l=e.getX(s),u=e.getY(s),h=e.getZ(s);l<t&&(t=l),u<n&&(n=u),h<r&&(r=h),l>i&&(i=l),u>a&&(a=u),h>o&&(o=h)}return this.min.set(t,n,r),this.max.set(i,a,o),this},setFromPoints:function(e){this.makeEmpty();for(var t=0,n=e.length;t<n;t++)this.expandByPoint(e[t]);return this},setFromCenterAndSize:function(e,t){var n=Q.copy(t).multiplyScalar(.5);return this.min.copy(e).sub(n),this.max.copy(e).add(n),this},setFromObject:function(e){return this.makeEmpty(),this.expandByObject(e)},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.min.copy(e.min),this.max.copy(e.max),this},makeEmpty:function(){return this.min.x=this.min.y=this.min.z=1/0,this.max.x=this.max.y=this.max.z=-1/0,this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z},getCenter:function(e){return void 0===e&&(console.warn("THREE.Box3: .getCenter() target is now required"),e=new w),this.isEmpty()?e.set(0,0,0):e.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(e){return void 0===e&&(console.warn("THREE.Box3: .getSize() target is now required"),e=new w),this.isEmpty()?e.set(0,0,0):e.subVectors(this.max,this.min)},expandByPoint:function(e){return this.min.min(e),this.max.max(e),this},expandByVector:function(e){return this.min.sub(e),this.max.add(e),this},expandByScalar:function(e){return this.min.addScalar(-e),this.max.addScalar(e),this},expandByObject:function(e){e.updateWorldMatrix(!1,!1);var t=e.geometry;void 0!==t&&(null===t.boundingBox&&t.computeBoundingBox(),K.copy(t.boundingBox),K.applyMatrix4(e.matrixWorld),this.union(K));for(var n=e.children,r=0,i=n.length;r<i;r++)this.expandByObject(n[r]);return this},containsPoint:function(e){return!(e.x<this.min.x||e.x>this.max.x||e.y<this.min.y||e.y>this.max.y||e.z<this.min.z||e.z>this.max.z)},containsBox:function(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z},getParameter:function(e,t){return void 0===t&&(console.warn("THREE.Box3: .getParameter() target is now required"),t=new w),t.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))},intersectsBox:function(e){return!(e.max.x<this.min.x||e.min.x>this.max.x||e.max.y<this.min.y||e.min.y>this.max.y||e.max.z<this.min.z||e.min.z>this.max.z)},intersectsSphere:function(e){return this.clampPoint(e.center,Q),Q.distanceToSquared(e.center)<=e.radius*e.radius},intersectsPlane:function(e){var t,n;return e.normal.x>0?(t=e.normal.x*this.min.x,n=e.normal.x*this.max.x):(t=e.normal.x*this.max.x,n=e.normal.x*this.min.x),e.normal.y>0?(t+=e.normal.y*this.min.y,n+=e.normal.y*this.max.y):(t+=e.normal.y*this.max.y,n+=e.normal.y*this.min.y),e.normal.z>0?(t+=e.normal.z*this.min.z,n+=e.normal.z*this.max.z):(t+=e.normal.z*this.max.z,n+=e.normal.z*this.min.z),t<=-e.constant&&n>=-e.constant},intersectsTriangle:function(e){if(this.isEmpty())return!1;this.getCenter(ae),oe.subVectors(this.max,ae),$.subVectors(e.a,ae),ee.subVectors(e.b,ae),te.subVectors(e.c,ae),ne.subVectors(ee,$),re.subVectors(te,ee),ie.subVectors($,te);var t=[0,-ne.z,ne.y,0,-re.z,re.y,0,-ie.z,ie.y,ne.z,0,-ne.x,re.z,0,-re.x,ie.z,0,-ie.x,-ne.y,ne.x,0,-re.y,re.x,0,-ie.y,ie.x,0];return!!ue(t,$,ee,te,oe)&&(!!ue(t=[1,0,0,0,1,0,0,0,1],$,ee,te,oe)&&(se.crossVectors(ne,re),ue(t=[se.x,se.y,se.z],$,ee,te,oe)))},clampPoint:function(e,t){return void 0===t&&(console.warn("THREE.Box3: .clampPoint() target is now required"),t=new w),t.copy(e).clamp(this.min,this.max)},distanceToPoint:function(e){return Q.copy(e).clamp(this.min,this.max).sub(e).length()},getBoundingSphere:function(e){return void 0===e&&console.error("THREE.Box3: .getBoundingSphere() target is now required"),this.getCenter(e.center),e.radius=.5*this.getSize(Q).length(),e},intersect:function(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this},union:function(e){return this.min.min(e.min),this.max.max(e.max),this},applyMatrix4:function(e){return this.isEmpty()||(J[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(e),J[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(e),J[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(e),J[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(e),J[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(e),J[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(e),J[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(e),J[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(e),this.setFromPoints(J)),this},translate:function(e){return this.min.add(e),this.max.add(e),this},equals:function(e){return e.min.equals(this.min)&&e.max.equals(this.max)}});var he=new le;function pe(e,t){this.center=void 0!==e?e:new w,this.radius=void 0!==t?t:0}Object.assign(pe.prototype,{set:function(e,t){return this.center.copy(e),this.radius=t,this},setFromPoints:function(e,t){var n=this.center;void 0!==t?n.copy(t):he.setFromPoints(e).getCenter(n);for(var r=0,i=0,a=e.length;i<a;i++)r=Math.max(r,n.distanceToSquared(e[i]));return this.radius=Math.sqrt(r),this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.center.copy(e.center),this.radius=e.radius,this},empty:function(){return this.radius<=0},containsPoint:function(e){return e.distanceToSquared(this.center)<=this.radius*this.radius},distanceToPoint:function(e){return e.distanceTo(this.center)-this.radius},intersectsSphere:function(e){var t=this.radius+e.radius;return e.center.distanceToSquared(this.center)<=t*t},intersectsBox:function(e){return e.intersectsSphere(this)},intersectsPlane:function(e){return Math.abs(e.distanceToPoint(this.center))<=this.radius},clampPoint:function(e,t){var n=this.center.distanceToSquared(e);return void 0===t&&(console.warn("THREE.Sphere: .clampPoint() target is now required"),t=new w),t.copy(e),n>this.radius*this.radius&&(t.sub(this.center).normalize(),t.multiplyScalar(this.radius).add(this.center)),t},getBoundingBox:function(e){return void 0===e&&(console.warn("THREE.Sphere: .getBoundingBox() target is now required"),e=new le),e.set(this.center,this.center),e.expandByScalar(this.radius),e},applyMatrix4:function(e){return this.center.applyMatrix4(e),this.radius=this.radius*e.getMaxScaleOnAxis(),this},translate:function(e){return this.center.add(e),this},equals:function(e){return e.center.equals(this.center)&&e.radius===this.radius}});var de=new w,fe=new w,me=new w,ge=new w,ve=new w,ye=new w,xe=new w;function be(e,t){this.origin=void 0!==e?e:new w,this.direction=void 0!==t?t:new w(0,0,-1)}Object.assign(be.prototype,{set:function(e,t){return this.origin.copy(e),this.direction.copy(t),this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this},at:function(e,t){return void 0===t&&(console.warn("THREE.Ray: .at() target is now required"),t=new w),t.copy(this.direction).multiplyScalar(e).add(this.origin)},lookAt:function(e){return this.direction.copy(e).sub(this.origin).normalize(),this},recast:function(e){return this.origin.copy(this.at(e,de)),this},closestPointToPoint:function(e,t){void 0===t&&(console.warn("THREE.Ray: .closestPointToPoint() target is now required"),t=new w),t.subVectors(e,this.origin);var n=t.dot(this.direction);return n<0?t.copy(this.origin):t.copy(this.direction).multiplyScalar(n).add(this.origin)},distanceToPoint:function(e){return Math.sqrt(this.distanceSqToPoint(e))},distanceSqToPoint:function(e){var t=de.subVectors(e,this.origin).dot(this.direction);return t<0?this.origin.distanceToSquared(e):(de.copy(this.direction).multiplyScalar(t).add(this.origin),de.distanceToSquared(e))},distanceSqToSegment:function(e,t,n,r){fe.copy(e).add(t).multiplyScalar(.5),me.copy(t).sub(e).normalize(),ge.copy(this.origin).sub(fe);var i,a,o,s,c=.5*e.distanceTo(t),l=-this.direction.dot(me),u=ge.dot(this.direction),h=-ge.dot(me),p=ge.lengthSq(),d=Math.abs(1-l*l);if(d>0)if(a=l*u-h,s=c*d,(i=l*h-u)>=0)if(a>=-s)if(a<=s){var f=1/d;o=(i*=f)*(i+l*(a*=f)+2*u)+a*(l*i+a+2*h)+p}else a=c,o=-(i=Math.max(0,-(l*a+u)))*i+a*(a+2*h)+p;else a=-c,o=-(i=Math.max(0,-(l*a+u)))*i+a*(a+2*h)+p;else a<=-s?o=-(i=Math.max(0,-(-l*c+u)))*i+(a=i>0?-c:Math.min(Math.max(-c,-h),c))*(a+2*h)+p:a<=s?(i=0,o=(a=Math.min(Math.max(-c,-h),c))*(a+2*h)+p):o=-(i=Math.max(0,-(l*c+u)))*i+(a=i>0?c:Math.min(Math.max(-c,-h),c))*(a+2*h)+p;else a=l>0?-c:c,o=-(i=Math.max(0,-(l*a+u)))*i+a*(a+2*h)+p;return n&&n.copy(this.direction).multiplyScalar(i).add(this.origin),r&&r.copy(me).multiplyScalar(a).add(fe),o},intersectSphere:function(e,t){de.subVectors(e.center,this.origin);var n=de.dot(this.direction),r=de.dot(de)-n*n,i=e.radius*e.radius;if(r>i)return null;var a=Math.sqrt(i-r),o=n-a,s=n+a;return o<0&&s<0?null:o<0?this.at(s,t):this.at(o,t)},intersectsSphere:function(e){return this.distanceSqToPoint(e.center)<=e.radius*e.radius},distanceToPlane:function(e){var t=e.normal.dot(this.direction);if(0===t)return 0===e.distanceToPoint(this.origin)?0:null;var n=-(this.origin.dot(e.normal)+e.constant)/t;return n>=0?n:null},intersectPlane:function(e,t){var n=this.distanceToPlane(e);return null===n?null:this.at(n,t)},intersectsPlane:function(e){var t=e.distanceToPoint(this.origin);return 0===t||e.normal.dot(this.direction)*t<0},intersectBox:function(e,t){var n,r,i,a,o,s,c=1/this.direction.x,l=1/this.direction.y,u=1/this.direction.z,h=this.origin;return c>=0?(n=(e.min.x-h.x)*c,r=(e.max.x-h.x)*c):(n=(e.max.x-h.x)*c,r=(e.min.x-h.x)*c),l>=0?(i=(e.min.y-h.y)*l,a=(e.max.y-h.y)*l):(i=(e.max.y-h.y)*l,a=(e.min.y-h.y)*l),n>a||i>r?null:((i>n||n!=n)&&(n=i),(a<r||r!=r)&&(r=a),u>=0?(o=(e.min.z-h.z)*u,s=(e.max.z-h.z)*u):(o=(e.max.z-h.z)*u,s=(e.min.z-h.z)*u),n>s||o>r?null:((o>n||n!=n)&&(n=o),(s<r||r!=r)&&(r=s),r<0?null:this.at(n>=0?n:r,t)))},intersectsBox:function(e){return null!==this.intersectBox(e,de)},intersectTriangle:function(e,t,n,r,i){ve.subVectors(t,e),ye.subVectors(n,e),xe.crossVectors(ve,ye);var a,o=this.direction.dot(xe);if(o>0){if(r)return null;a=1}else{if(!(o<0))return null;a=-1,o=-o}ge.subVectors(this.origin,e);var s=a*this.direction.dot(ye.crossVectors(ge,ye));if(s<0)return null;var c=a*this.direction.dot(ve.cross(ge));if(c<0)return null;if(s+c>o)return null;var l=-a*ge.dot(xe);return l<0?null:this.at(l/o,i)},applyMatrix4:function(e){return this.origin.applyMatrix4(e),this.direction.transformDirection(e),this},equals:function(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)}});var _e=new w,we=new w,Me=new p;function Se(e,t){this.normal=void 0!==e?e:new w(1,0,0),this.constant=void 0!==t?t:0}Object.assign(Se.prototype,{isPlane:!0,set:function(e,t){return this.normal.copy(e),this.constant=t,this},setComponents:function(e,t,n,r){return this.normal.set(e,t,n),this.constant=r,this},setFromNormalAndCoplanarPoint:function(e,t){return this.normal.copy(e),this.constant=-t.dot(this.normal),this},setFromCoplanarPoints:function(e,t,n){var r=_e.subVectors(n,t).cross(we.subVectors(e,t)).normalize();return this.setFromNormalAndCoplanarPoint(r,e),this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.normal.copy(e.normal),this.constant=e.constant,this},normalize:function(){var e=1/this.normal.length();return this.normal.multiplyScalar(e),this.constant*=e,this},negate:function(){return this.constant*=-1,this.normal.negate(),this},distanceToPoint:function(e){return this.normal.dot(e)+this.constant},distanceToSphere:function(e){return this.distanceToPoint(e.center)-e.radius},projectPoint:function(e,t){return void 0===t&&(console.warn("THREE.Plane: .projectPoint() target is now required"),t=new w),t.copy(this.normal).multiplyScalar(-this.distanceToPoint(e)).add(e)},intersectLine:function(e,t){void 0===t&&(console.warn("THREE.Plane: .intersectLine() target is now required"),t=new w);var n=e.delta(_e),r=this.normal.dot(n);if(0===r)return 0===this.distanceToPoint(e.start)?t.copy(e.start):void 0;var i=-(e.start.dot(this.normal)+this.constant)/r;return i<0||i>1?void 0:t.copy(n).multiplyScalar(i).add(e.start)},intersectsLine:function(e){var t=this.distanceToPoint(e.start),n=this.distanceToPoint(e.end);return t<0&&n>0||n<0&&t>0},intersectsBox:function(e){return e.intersectsPlane(this)},intersectsSphere:function(e){return e.intersectsPlane(this)},coplanarPoint:function(e){return void 0===e&&(console.warn("THREE.Plane: .coplanarPoint() target is now required"),e=new w),e.copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(e,t){var n=t||Me.getNormalMatrix(e),r=this.coplanarPoint(_e).applyMatrix4(e),i=this.normal.applyMatrix3(n).normalize();return this.constant=-r.dot(i),this},translate:function(e){return this.constant-=e.dot(this.normal),this},equals:function(e){return e.normal.equals(this.normal)&&e.constant===this.constant}});var Ee=new w,Te=new w,Ae=new w,Le=new w,Pe=new w,Re=new w,Ce=new w,Oe=new w,De=new w,Ne=new w;function Ie(e,t,n){this.a=void 0!==e?e:new w,this.b=void 0!==t?t:new w,this.c=void 0!==n?n:new w}Object.assign(Ie,{getNormal:function(e,t,n,r){void 0===r&&(console.warn("THREE.Triangle: .getNormal() target is now required"),r=new w),r.subVectors(n,t),Ee.subVectors(e,t),r.cross(Ee);var i=r.lengthSq();return i>0?r.multiplyScalar(1/Math.sqrt(i)):r.set(0,0,0)},getBarycoord:function(e,t,n,r,i){Ee.subVectors(r,t),Te.subVectors(n,t),Ae.subVectors(e,t);var a=Ee.dot(Ee),o=Ee.dot(Te),s=Ee.dot(Ae),c=Te.dot(Te),l=Te.dot(Ae),u=a*c-o*o;if(void 0===i&&(console.warn("THREE.Triangle: .getBarycoord() target is now required"),i=new w),0===u)return i.set(-2,-1,-1);var h=1/u,p=(c*s-o*l)*h,d=(a*l-o*s)*h;return i.set(1-p-d,d,p)},containsPoint:function(e,t,n,r){return Ie.getBarycoord(e,t,n,r,Le),Le.x>=0&&Le.y>=0&&Le.x+Le.y<=1},getUV:function(e,t,n,r,i,a,o,s){return this.getBarycoord(e,t,n,r,Le),s.set(0,0),s.addScaledVector(i,Le.x),s.addScaledVector(a,Le.y),s.addScaledVector(o,Le.z),s},isFrontFacing:function(e,t,n,r){return Ee.subVectors(n,t),Te.subVectors(e,t),Ee.cross(Te).dot(r)<0}}),Object.assign(Ie.prototype,{set:function(e,t,n){return this.a.copy(e),this.b.copy(t),this.c.copy(n),this},setFromPointsAndIndices:function(e,t,n,r){return this.a.copy(e[t]),this.b.copy(e[n]),this.c.copy(e[r]),this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this},getArea:function(){return Ee.subVectors(this.c,this.b),Te.subVectors(this.a,this.b),.5*Ee.cross(Te).length()},getMidpoint:function(e){return void 0===e&&(console.warn("THREE.Triangle: .getMidpoint() target is now required"),e=new w),e.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},getNormal:function(e){return Ie.getNormal(this.a,this.b,this.c,e)},getPlane:function(e){return void 0===e&&(console.warn("THREE.Triangle: .getPlane() target is now required"),e=new Se),e.setFromCoplanarPoints(this.a,this.b,this.c)},getBarycoord:function(e,t){return Ie.getBarycoord(e,this.a,this.b,this.c,t)},getUV:function(e,t,n,r,i){return Ie.getUV(e,this.a,this.b,this.c,t,n,r,i)},containsPoint:function(e){return Ie.containsPoint(e,this.a,this.b,this.c)},isFrontFacing:function(e){return Ie.isFrontFacing(this.a,this.b,this.c,e)},intersectsBox:function(e){return e.intersectsTriangle(this)},closestPointToPoint:function(e,t){void 0===t&&(console.warn("THREE.Triangle: .closestPointToPoint() target is now required"),t=new w);var n,r,i=this.a,a=this.b,o=this.c;Pe.subVectors(a,i),Re.subVectors(o,i),Oe.subVectors(e,i);var s=Pe.dot(Oe),c=Re.dot(Oe);if(s<=0&&c<=0)return t.copy(i);De.subVectors(e,a);var l=Pe.dot(De),u=Re.dot(De);if(l>=0&&u<=l)return t.copy(a);var h=s*u-l*c;if(h<=0&&s>=0&&l<=0)return n=s/(s-l),t.copy(i).addScaledVector(Pe,n);Ne.subVectors(e,o);var p=Pe.dot(Ne),d=Re.dot(Ne);if(d>=0&&p<=d)return t.copy(o);var f=p*c-s*d;if(f<=0&&c>=0&&d<=0)return r=c/(c-d),t.copy(i).addScaledVector(Re,r);var m=l*d-p*u;if(m<=0&&u-l>=0&&p-d>=0)return Ce.subVectors(o,a),r=(u-l)/(u-l+(p-d)),t.copy(a).addScaledVector(Ce,r);var g=1/(m+f+h);return n=f*g,r=h*g,t.copy(i).addScaledVector(Pe,n).addScaledVector(Re,r)},equals:function(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)}});var ze={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},ke={h:0,s:0,l:0},Fe={h:0,s:0,l:0};function Be(e,t,n){return void 0===t&&void 0===n?this.set(e):this.setRGB(e,t,n)}function Ue(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+6*(t-e)*(2/3-n):e}function je(e){return e<.04045?.0773993808*e:Math.pow(.9478672986*e+.0521327014,2.4)}function He(e){return e<.0031308?12.92*e:1.055*Math.pow(e,.41666)-.055}function Ge(e,t,n,r,i,a){this.a=e,this.b=t,this.c=n,this.normal=r&&r.isVector3?r:new w,this.vertexNormals=Array.isArray(r)?r:[],this.color=i&&i.isColor?i:new Be,this.vertexColors=Array.isArray(i)?i:[],this.materialIndex=void 0!==a?a:0}Object.assign(Be.prototype,{isColor:!0,r:1,g:1,b:1,set:function(e){return e&&e.isColor?this.copy(e):"number"==typeof e?this.setHex(e):"string"==typeof e&&this.setStyle(e),this},setScalar:function(e){return this.r=e,this.g=e,this.b=e,this},setHex:function(e){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(255&e)/255,this},setRGB:function(e,t,n){return this.r=e,this.g=t,this.b=n,this},setHSL:function(e,t,n){if(e=u.euclideanModulo(e,1),t=u.clamp(t,0,1),n=u.clamp(n,0,1),0===t)this.r=this.g=this.b=n;else{var r=n<=.5?n*(1+t):n+t-n*t,i=2*n-r;this.r=Ue(i,r,e+1/3),this.g=Ue(i,r,e),this.b=Ue(i,r,e-1/3)}return this},setStyle:function(e){function t(t){void 0!==t&&parseFloat(t)<1&&console.warn("THREE.Color: Alpha component of "+e+" will be ignored.")}var n;if(n=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(e)){var r,i=n[1],a=n[2];switch(i){case"rgb":case"rgba":if(r=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(a))return this.r=Math.min(255,parseInt(r[1],10))/255,this.g=Math.min(255,parseInt(r[2],10))/255,this.b=Math.min(255,parseInt(r[3],10))/255,t(r[5]),this;if(r=/^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(a))return this.r=Math.min(100,parseInt(r[1],10))/100,this.g=Math.min(100,parseInt(r[2],10))/100,this.b=Math.min(100,parseInt(r[3],10))/100,t(r[5]),this;break;case"hsl":case"hsla":if(r=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(a)){var o=parseFloat(r[1])/360,s=parseInt(r[2],10)/100,c=parseInt(r[3],10)/100;return t(r[5]),this.setHSL(o,s,c)}}}else if(n=/^\#([A-Fa-f0-9]+)$/.exec(e)){var l=n[1],u=l.length;if(3===u)return this.r=parseInt(l.charAt(0)+l.charAt(0),16)/255,this.g=parseInt(l.charAt(1)+l.charAt(1),16)/255,this.b=parseInt(l.charAt(2)+l.charAt(2),16)/255,this;if(6===u)return this.r=parseInt(l.charAt(0)+l.charAt(1),16)/255,this.g=parseInt(l.charAt(2)+l.charAt(3),16)/255,this.b=parseInt(l.charAt(4)+l.charAt(5),16)/255,this}return e&&e.length>0?this.setColorName(e):this},setColorName:function(e){var t=ze[e];return void 0!==t?this.setHex(t):console.warn("THREE.Color: Unknown color "+e),this},clone:function(){return new this.constructor(this.r,this.g,this.b)},copy:function(e){return this.r=e.r,this.g=e.g,this.b=e.b,this},copyGammaToLinear:function(e,t){return void 0===t&&(t=2),this.r=Math.pow(e.r,t),this.g=Math.pow(e.g,t),this.b=Math.pow(e.b,t),this},copyLinearToGamma:function(e,t){void 0===t&&(t=2);var n=t>0?1/t:1;return this.r=Math.pow(e.r,n),this.g=Math.pow(e.g,n),this.b=Math.pow(e.b,n),this},convertGammaToLinear:function(e){return this.copyGammaToLinear(this,e),this},convertLinearToGamma:function(e){return this.copyLinearToGamma(this,e),this},copySRGBToLinear:function(e){return this.r=je(e.r),this.g=je(e.g),this.b=je(e.b),this},copyLinearToSRGB:function(e){return this.r=He(e.r),this.g=He(e.g),this.b=He(e.b),this},convertSRGBToLinear:function(){return this.copySRGBToLinear(this),this},convertLinearToSRGB:function(){return this.copyLinearToSRGB(this),this},getHex:function(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0},getHexString:function(){return("000000"+this.getHex().toString(16)).slice(-6)},getHSL:function(e){void 0===e&&(console.warn("THREE.Color: .getHSL() target is now required"),e={h:0,s:0,l:0});var t,n,r=this.r,i=this.g,a=this.b,o=Math.max(r,i,a),s=Math.min(r,i,a),c=(s+o)/2;if(s===o)t=0,n=0;else{var l=o-s;switch(n=c<=.5?l/(o+s):l/(2-o-s),o){case r:t=(i-a)/l+(i<a?6:0);break;case i:t=(a-r)/l+2;break;case a:t=(r-i)/l+4}t/=6}return e.h=t,e.s=n,e.l=c,e},getStyle:function(){return"rgb("+(255*this.r|0)+","+(255*this.g|0)+","+(255*this.b|0)+")"},offsetHSL:function(e,t,n){return this.getHSL(ke),ke.h+=e,ke.s+=t,ke.l+=n,this.setHSL(ke.h,ke.s,ke.l),this},add:function(e){return this.r+=e.r,this.g+=e.g,this.b+=e.b,this},addColors:function(e,t){return this.r=e.r+t.r,this.g=e.g+t.g,this.b=e.b+t.b,this},addScalar:function(e){return this.r+=e,this.g+=e,this.b+=e,this},sub:function(e){return this.r=Math.max(0,this.r-e.r),this.g=Math.max(0,this.g-e.g),this.b=Math.max(0,this.b-e.b),this},multiply:function(e){return this.r*=e.r,this.g*=e.g,this.b*=e.b,this},multiplyScalar:function(e){return this.r*=e,this.g*=e,this.b*=e,this},lerp:function(e,t){return this.r+=(e.r-this.r)*t,this.g+=(e.g-this.g)*t,this.b+=(e.b-this.b)*t,this},lerpHSL:function(e,t){this.getHSL(ke),e.getHSL(Fe);var n=u.lerp(ke.h,Fe.h,t),r=u.lerp(ke.s,Fe.s,t),i=u.lerp(ke.l,Fe.l,t);return this.setHSL(n,r,i),this},equals:function(e){return e.r===this.r&&e.g===this.g&&e.b===this.b},fromArray:function(e,t){return void 0===t&&(t=0),this.r=e[t],this.g=e[t+1],this.b=e[t+2],this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this.r,e[t+1]=this.g,e[t+2]=this.b,e},toJSON:function(){return this.getHex()}}),Be.NAMES=ze,Object.assign(Ge.prototype,{clone:function(){return(new this.constructor).copy(this)},copy:function(e){this.a=e.a,this.b=e.b,this.c=e.c,this.normal.copy(e.normal),this.color.copy(e.color),this.materialIndex=e.materialIndex;for(var t=0,n=e.vertexNormals.length;t<n;t++)this.vertexNormals[t]=e.vertexNormals[t].clone();for(t=0,n=e.vertexColors.length;t<n;t++)this.vertexColors[t]=e.vertexColors[t].clone();return this}});var Ve=0;function We(){Object.defineProperty(this,"id",{value:Ve++}),this.uuid=u.generateUUID(),this.name="",this.type="Material",this.fog=!0,this.blending=1,this.side=0,this.flatShading=!1,this.vertexColors=!1,this.opacity=1,this.transparent=!1,this.blendSrc=204,this.blendDst=205,this.blendEquation=100,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.depthFunc=3,this.depthTest=!0,this.depthWrite=!0,this.stencilWriteMask=255,this.stencilFunc=519,this.stencilRef=0,this.stencilFuncMask=255,this.stencilFail=7680,this.stencilZFail=7680,this.stencilZPass=7680,this.stencilWrite=!1,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaTest=0,this.premultipliedAlpha=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0}function qe(e){We.call(this),this.type="MeshBasicMaterial",this.color=new Be(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.setValues(e)}We.prototype=Object.assign(Object.create(o.prototype),{constructor:We,isMaterial:!0,onBeforeCompile:function(){},setValues:function(e){if(void 0!==e)for(var t in e){var n=e[t];if(void 0!==n)if("shading"!==t){var r=this[t];void 0!==r?r&&r.isColor?r.set(n):r&&r.isVector3&&n&&n.isVector3?r.copy(n):this[t]=n:console.warn("THREE."+this.type+": '"+t+"' is not a property of this material.")}else console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===n;else console.warn("THREE.Material: '"+t+"' parameter is undefined.")}},toJSON:function(e){var t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{}});var n={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};function r(e){var t=[];for(var n in e){var r=e[n];delete r.metadata,t.push(r)}return t}if(n.uuid=this.uuid,n.type=this.type,""!==this.name&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),void 0!==this.roughness&&(n.roughness=this.roughness),void 0!==this.metalness&&(n.metalness=this.metalness),this.sheen&&this.sheen.isColor&&(n.sheen=this.sheen.getHex()),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity&&1!==this.emissiveIntensity&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),void 0!==this.shininess&&(n.shininess=this.shininess),void 0!==this.clearcoat&&(n.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(e).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(e).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(e).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(e).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(e).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(e).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(e).uuid),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(e).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(e).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(e).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(e).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(e).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(e).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(e).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(e).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(e).uuid,n.reflectivity=this.reflectivity,n.refractionRatio=this.refractionRatio,void 0!==this.combine&&(n.combine=this.combine),void 0!==this.envMapIntensity&&(n.envMapIntensity=this.envMapIntensity)),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(e).uuid),void 0!==this.size&&(n.size=this.size),void 0!==this.sizeAttenuation&&(n.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(n.blending=this.blending),!0===this.flatShading&&(n.flatShading=this.flatShading),0!==this.side&&(n.side=this.side),this.vertexColors&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),!0===this.transparent&&(n.transparent=this.transparent),n.depthFunc=this.depthFunc,n.depthTest=this.depthTest,n.depthWrite=this.depthWrite,n.stencilWrite=this.stencilWrite,n.stencilWriteMask=this.stencilWriteMask,n.stencilFunc=this.stencilFunc,n.stencilRef=this.stencilRef,n.stencilFuncMask=this.stencilFuncMask,n.stencilFail=this.stencilFail,n.stencilZFail=this.stencilZFail,n.stencilZPass=this.stencilZPass,this.rotation&&0!==this.rotation&&(n.rotation=this.rotation),!0===this.polygonOffset&&(n.polygonOffset=!0),0!==this.polygonOffsetFactor&&(n.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(n.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth&&1!==this.linewidth&&(n.linewidth=this.linewidth),void 0!==this.dashSize&&(n.dashSize=this.dashSize),void 0!==this.gapSize&&(n.gapSize=this.gapSize),void 0!==this.scale&&(n.scale=this.scale),!0===this.dithering&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),!0===this.premultipliedAlpha&&(n.premultipliedAlpha=this.premultipliedAlpha),!0===this.wireframe&&(n.wireframe=this.wireframe),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(n.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(n.wireframeLinejoin=this.wireframeLinejoin),!0===this.morphTargets&&(n.morphTargets=!0),!0===this.morphNormals&&(n.morphNormals=!0),!0===this.skinning&&(n.skinning=!0),!1===this.visible&&(n.visible=!1),!1===this.toneMapped&&(n.toneMapped=!1),"{}"!==JSON.stringify(this.userData)&&(n.userData=this.userData),t){var i=r(e.textures),a=r(e.images);i.length>0&&(n.textures=i),a.length>0&&(n.images=a)}return n},clone:function(){return(new this.constructor).copy(this)},copy:function(e){this.name=e.name,this.fog=e.fog,this.blending=e.blending,this.side=e.side,this.flatShading=e.flatShading,this.vertexColors=e.vertexColors,this.opacity=e.opacity,this.transparent=e.transparent,this.blendSrc=e.blendSrc,this.blendDst=e.blendDst,this.blendEquation=e.blendEquation,this.blendSrcAlpha=e.blendSrcAlpha,this.blendDstAlpha=e.blendDstAlpha,this.blendEquationAlpha=e.blendEquationAlpha,this.depthFunc=e.depthFunc,this.depthTest=e.depthTest,this.depthWrite=e.depthWrite,this.stencilWriteMask=e.stencilWriteMask,this.stencilFunc=e.stencilFunc,this.stencilRef=e.stencilRef,this.stencilFuncMask=e.stencilFuncMask,this.stencilFail=e.stencilFail,this.stencilZFail=e.stencilZFail,this.stencilZPass=e.stencilZPass,this.stencilWrite=e.stencilWrite;var t=e.clippingPlanes,n=null;if(null!==t){var r=t.length;n=new Array(r);for(var i=0;i!==r;++i)n[i]=t[i].clone()}return this.clippingPlanes=n,this.clipIntersection=e.clipIntersection,this.clipShadows=e.clipShadows,this.shadowSide=e.shadowSide,this.colorWrite=e.colorWrite,this.precision=e.precision,this.polygonOffset=e.polygonOffset,this.polygonOffsetFactor=e.polygonOffsetFactor,this.polygonOffsetUnits=e.polygonOffsetUnits,this.dithering=e.dithering,this.alphaTest=e.alphaTest,this.premultipliedAlpha=e.premultipliedAlpha,this.visible=e.visible,this.toneMapped=e.toneMapped,this.userData=JSON.parse(JSON.stringify(e.userData)),this},dispose:function(){this.dispatchEvent({type:"dispose"})}}),Object.defineProperty(We.prototype,"needsUpdate",{set:function(e){!0===e&&this.version++}}),qe.prototype=Object.create(We.prototype),qe.prototype.constructor=qe,qe.prototype.isMeshBasicMaterial=!0,qe.prototype.copy=function(e){return We.prototype.copy.call(this,e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this};var Xe=new w;function Ye(e,t,n){if(Array.isArray(e))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.name="",this.array=e,this.itemSize=t,this.count=void 0!==e?e.length/t:0,this.normalized=!0===n,this.usage=35044,this.updateRange={offset:0,count:-1},this.version=0}function Ze(e,t,n){Ye.call(this,new Int8Array(e),t,n)}function Je(e,t,n){Ye.call(this,new Uint8Array(e),t,n)}function Qe(e,t,n){Ye.call(this,new Uint8ClampedArray(e),t,n)}function Ke(e,t,n){Ye.call(this,new Int16Array(e),t,n)}function $e(e,t,n){Ye.call(this,new Uint16Array(e),t,n)}function et(e,t,n){Ye.call(this,new Int32Array(e),t,n)}function tt(e,t,n){Ye.call(this,new Uint32Array(e),t,n)}function nt(e,t,n){Ye.call(this,new Float32Array(e),t,n)}function rt(e,t,n){Ye.call(this,new Float64Array(e),t,n)}function it(){this.vertices=[],this.normals=[],this.colors=[],this.uvs=[],this.uvs2=[],this.groups=[],this.morphTargets={},this.skinWeights=[],this.skinIndices=[],this.boundingBox=null,this.boundingSphere=null,this.verticesNeedUpdate=!1,this.normalsNeedUpdate=!1,this.colorsNeedUpdate=!1,this.uvsNeedUpdate=!1,this.groupsNeedUpdate=!1}function at(e){if(0===e.length)return-1/0;for(var t=e[0],n=1,r=e.length;n<r;++n)e[n]>t&&(t=e[n]);return t}Object.defineProperty(Ye.prototype,"needsUpdate",{set:function(e){!0===e&&this.version++}}),Object.assign(Ye.prototype,{isBufferAttribute:!0,onUploadCallback:function(){},setUsage:function(e){return this.usage=e,this},copy:function(e){return this.name=e.name,this.array=new e.array.constructor(e.array),this.itemSize=e.itemSize,this.count=e.count,this.normalized=e.normalized,this.usage=e.usage,this},copyAt:function(e,t,n){e*=this.itemSize,n*=t.itemSize;for(var r=0,i=this.itemSize;r<i;r++)this.array[e+r]=t.array[n+r];return this},copyArray:function(e){return this.array.set(e),this},copyColorsArray:function(e){for(var t=this.array,n=0,r=0,i=e.length;r<i;r++){var a=e[r];void 0===a&&(console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined",r),a=new Be),t[n++]=a.r,t[n++]=a.g,t[n++]=a.b}return this},copyVector2sArray:function(e){for(var t=this.array,n=0,r=0,i=e.length;r<i;r++){var a=e[r];void 0===a&&(console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined",r),a=new h),t[n++]=a.x,t[n++]=a.y}return this},copyVector3sArray:function(e){for(var t=this.array,n=0,r=0,i=e.length;r<i;r++){var a=e[r];void 0===a&&(console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined",r),a=new w),t[n++]=a.x,t[n++]=a.y,t[n++]=a.z}return this},copyVector4sArray:function(e){for(var t=this.array,n=0,r=0,i=e.length;r<i;r++){var a=e[r];void 0===a&&(console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined",r),a=new g),t[n++]=a.x,t[n++]=a.y,t[n++]=a.z,t[n++]=a.w}return this},applyMatrix3:function(e){for(var t=0,n=this.count;t<n;t++)Xe.x=this.getX(t),Xe.y=this.getY(t),Xe.z=this.getZ(t),Xe.applyMatrix3(e),this.setXYZ(t,Xe.x,Xe.y,Xe.z);return this},applyMatrix4:function(e){for(var t=0,n=this.count;t<n;t++)Xe.x=this.getX(t),Xe.y=this.getY(t),Xe.z=this.getZ(t),Xe.applyMatrix4(e),this.setXYZ(t,Xe.x,Xe.y,Xe.z);return this},applyNormalMatrix:function(e){for(var t=0,n=this.count;t<n;t++)Xe.x=this.getX(t),Xe.y=this.getY(t),Xe.z=this.getZ(t),Xe.applyNormalMatrix(e),this.setXYZ(t,Xe.x,Xe.y,Xe.z);return this},transformDirection:function(e){for(var t=0,n=this.count;t<n;t++)Xe.x=this.getX(t),Xe.y=this.getY(t),Xe.z=this.getZ(t),Xe.transformDirection(e),this.setXYZ(t,Xe.x,Xe.y,Xe.z);return this},set:function(e,t){return void 0===t&&(t=0),this.array.set(e,t),this},getX:function(e){return this.array[e*this.itemSize]},setX:function(e,t){return this.array[e*this.itemSize]=t,this},getY:function(e){return this.array[e*this.itemSize+1]},setY:function(e,t){return this.array[e*this.itemSize+1]=t,this},getZ:function(e){return this.array[e*this.itemSize+2]},setZ:function(e,t){return this.array[e*this.itemSize+2]=t,this},getW:function(e){return this.array[e*this.itemSize+3]},setW:function(e,t){return this.array[e*this.itemSize+3]=t,this},setXY:function(e,t,n){return e*=this.itemSize,this.array[e+0]=t,this.array[e+1]=n,this},setXYZ:function(e,t,n,r){return e*=this.itemSize,this.array[e+0]=t,this.array[e+1]=n,this.array[e+2]=r,this},setXYZW:function(e,t,n,r,i){return e*=this.itemSize,this.array[e+0]=t,this.array[e+1]=n,this.array[e+2]=r,this.array[e+3]=i,this},onUpload:function(e){return this.onUploadCallback=e,this},clone:function(){return new this.constructor(this.array,this.itemSize).copy(this)},toJSON:function(){return{itemSize:this.itemSize,type:this.array.constructor.name,array:Array.prototype.slice.call(this.array),normalized:this.normalized}}}),Ze.prototype=Object.create(Ye.prototype),Ze.prototype.constructor=Ze,Je.prototype=Object.create(Ye.prototype),Je.prototype.constructor=Je,Qe.prototype=Object.create(Ye.prototype),Qe.prototype.constructor=Qe,Ke.prototype=Object.create(Ye.prototype),Ke.prototype.constructor=Ke,$e.prototype=Object.create(Ye.prototype),$e.prototype.constructor=$e,et.prototype=Object.create(Ye.prototype),et.prototype.constructor=et,tt.prototype=Object.create(Ye.prototype),tt.prototype.constructor=tt,nt.prototype=Object.create(Ye.prototype),nt.prototype.constructor=nt,rt.prototype=Object.create(Ye.prototype),rt.prototype.constructor=rt,Object.assign(it.prototype,{computeGroups:function(e){for(var t,n=[],r=void 0,i=e.faces,a=0;a<i.length;a++){var o=i[a];o.materialIndex!==r&&(r=o.materialIndex,void 0!==t&&(t.count=3*a-t.start,n.push(t)),t={start:3*a,materialIndex:r})}void 0!==t&&(t.count=3*a-t.start,n.push(t)),this.groups=n},fromGeometry:function(e){var t,n=e.faces,r=e.vertices,i=e.faceVertexUvs,a=i[0]&&i[0].length>0,o=i[1]&&i[1].length>0,s=e.morphTargets,c=s.length;if(c>0){t=[];for(var l=0;l<c;l++)t[l]={name:s[l].name,data:[]};this.morphTargets.position=t}var u,p=e.morphNormals,d=p.length;if(d>0){u=[];for(l=0;l<d;l++)u[l]={name:p[l].name,data:[]};this.morphTargets.normal=u}var f=e.skinIndices,m=e.skinWeights,g=f.length===r.length,v=m.length===r.length;r.length>0&&0===n.length&&console.error("THREE.DirectGeometry: Faceless geometries are not supported.");for(l=0;l<n.length;l++){var y=n[l];this.vertices.push(r[y.a],r[y.b],r[y.c]);var x=y.vertexNormals;if(3===x.length)this.normals.push(x[0],x[1],x[2]);else{var b=y.normal;this.normals.push(b,b,b)}var _,w=y.vertexColors;if(3===w.length)this.colors.push(w[0],w[1],w[2]);else{var M=y.color;this.colors.push(M,M,M)}if(!0===a)void 0!==(_=i[0][l])?this.uvs.push(_[0],_[1],_[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ",l),this.uvs.push(new h,new h,new h));if(!0===o)void 0!==(_=i[1][l])?this.uvs2.push(_[0],_[1],_[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ",l),this.uvs2.push(new h,new h,new h));for(var S=0;S<c;S++){var E=s[S].vertices;t[S].data.push(E[y.a],E[y.b],E[y.c])}for(S=0;S<d;S++){var T=p[S].vertexNormals[l];u[S].data.push(T.a,T.b,T.c)}g&&this.skinIndices.push(f[y.a],f[y.b],f[y.c]),v&&this.skinWeights.push(m[y.a],m[y.b],m[y.c])}return this.computeGroups(e),this.verticesNeedUpdate=e.verticesNeedUpdate,this.normalsNeedUpdate=e.normalsNeedUpdate,this.colorsNeedUpdate=e.colorsNeedUpdate,this.uvsNeedUpdate=e.uvsNeedUpdate,this.groupsNeedUpdate=e.groupsNeedUpdate,null!==e.boundingSphere&&(this.boundingSphere=e.boundingSphere.clone()),null!==e.boundingBox&&(this.boundingBox=e.boundingBox.clone()),this}});var ot=1,st=new R,ct=new Y,lt=new w,ut=new le,ht=new le,pt=new w;function dt(){Object.defineProperty(this,"id",{value:ot+=2}),this.uuid=u.generateUUID(),this.name="",this.type="BufferGeometry",this.index=null,this.attributes={},this.morphAttributes={},this.morphTargetsRelative=!1,this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0},this.userData={}}dt.prototype=Object.assign(Object.create(o.prototype),{constructor:dt,isBufferGeometry:!0,getIndex:function(){return this.index},setIndex:function(e){Array.isArray(e)?this.index=new(at(e)>65535?tt:$e)(e,1):this.index=e},getAttribute:function(e){return this.attributes[e]},setAttribute:function(e,t){return this.attributes[e]=t,this},deleteAttribute:function(e){return delete this.attributes[e],this},addGroup:function(e,t,n){this.groups.push({start:e,count:t,materialIndex:void 0!==n?n:0})},clearGroups:function(){this.groups=[]},setDrawRange:function(e,t){this.drawRange.start=e,this.drawRange.count=t},applyMatrix4:function(e){var t=this.attributes.position;void 0!==t&&(t.applyMatrix4(e),t.needsUpdate=!0);var n=this.attributes.normal;if(void 0!==n){var r=(new p).getNormalMatrix(e);n.applyNormalMatrix(r),n.needsUpdate=!0}var i=this.attributes.tangent;return void 0!==i&&(i.transformDirection(e),i.needsUpdate=!0),null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this},rotateX:function(e){return st.makeRotationX(e),this.applyMatrix4(st),this},rotateY:function(e){return st.makeRotationY(e),this.applyMatrix4(st),this},rotateZ:function(e){return st.makeRotationZ(e),this.applyMatrix4(st),this},translate:function(e,t,n){return st.makeTranslation(e,t,n),this.applyMatrix4(st),this},scale:function(e,t,n){return st.makeScale(e,t,n),this.applyMatrix4(st),this},lookAt:function(e){return ct.lookAt(e),ct.updateMatrix(),this.applyMatrix4(ct.matrix),this},center:function(){return this.computeBoundingBox(),this.boundingBox.getCenter(lt).negate(),this.translate(lt.x,lt.y,lt.z),this},setFromObject:function(e){var t=e.geometry;if(e.isPoints||e.isLine){var n=new nt(3*t.vertices.length,3),r=new nt(3*t.colors.length,3);if(this.setAttribute("position",n.copyVector3sArray(t.vertices)),this.setAttribute("color",r.copyColorsArray(t.colors)),t.lineDistances&&t.lineDistances.length===t.vertices.length){var i=new nt(t.lineDistances.length,1);this.setAttribute("lineDistance",i.copyArray(t.lineDistances))}null!==t.boundingSphere&&(this.boundingSphere=t.boundingSphere.clone()),null!==t.boundingBox&&(this.boundingBox=t.boundingBox.clone())}else e.isMesh&&t&&t.isGeometry&&this.fromGeometry(t);return this},setFromPoints:function(e){for(var t=[],n=0,r=e.length;n<r;n++){var i=e[n];t.push(i.x,i.y,i.z||0)}return this.setAttribute("position",new nt(t,3)),this},updateFromObject:function(e){var t,n=e.geometry;if(e.isMesh){var r=n.__directGeometry;if(!0===n.elementsNeedUpdate&&(r=void 0,n.elementsNeedUpdate=!1),void 0===r)return this.fromGeometry(n);r.verticesNeedUpdate=n.verticesNeedUpdate,r.normalsNeedUpdate=n.normalsNeedUpdate,r.colorsNeedUpdate=n.colorsNeedUpdate,r.uvsNeedUpdate=n.uvsNeedUpdate,r.groupsNeedUpdate=n.groupsNeedUpdate,n.verticesNeedUpdate=!1,n.normalsNeedUpdate=!1,n.colorsNeedUpdate=!1,n.uvsNeedUpdate=!1,n.groupsNeedUpdate=!1,n=r}return!0===n.verticesNeedUpdate&&(void 0!==(t=this.attributes.position)&&(t.copyVector3sArray(n.vertices),t.needsUpdate=!0),n.verticesNeedUpdate=!1),!0===n.normalsNeedUpdate&&(void 0!==(t=this.attributes.normal)&&(t.copyVector3sArray(n.normals),t.needsUpdate=!0),n.normalsNeedUpdate=!1),!0===n.colorsNeedUpdate&&(void 0!==(t=this.attributes.color)&&(t.copyColorsArray(n.colors),t.needsUpdate=!0),n.colorsNeedUpdate=!1),n.uvsNeedUpdate&&(void 0!==(t=this.attributes.uv)&&(t.copyVector2sArray(n.uvs),t.needsUpdate=!0),n.uvsNeedUpdate=!1),n.lineDistancesNeedUpdate&&(void 0!==(t=this.attributes.lineDistance)&&(t.copyArray(n.lineDistances),t.needsUpdate=!0),n.lineDistancesNeedUpdate=!1),n.groupsNeedUpdate&&(n.computeGroups(e.geometry),this.groups=n.groups,n.groupsNeedUpdate=!1),this},fromGeometry:function(e){return e.__directGeometry=(new it).fromGeometry(e),this.fromDirectGeometry(e.__directGeometry)},fromDirectGeometry:function(e){var t=new Float32Array(3*e.vertices.length);if(this.setAttribute("position",new Ye(t,3).copyVector3sArray(e.vertices)),e.normals.length>0){var n=new Float32Array(3*e.normals.length);this.setAttribute("normal",new Ye(n,3).copyVector3sArray(e.normals))}if(e.colors.length>0){var r=new Float32Array(3*e.colors.length);this.setAttribute("color",new Ye(r,3).copyColorsArray(e.colors))}if(e.uvs.length>0){var i=new Float32Array(2*e.uvs.length);this.setAttribute("uv",new Ye(i,2).copyVector2sArray(e.uvs))}if(e.uvs2.length>0){var a=new Float32Array(2*e.uvs2.length);this.setAttribute("uv2",new Ye(a,2).copyVector2sArray(e.uvs2))}for(var o in this.groups=e.groups,e.morphTargets){for(var s=[],c=e.morphTargets[o],l=0,u=c.length;l<u;l++){var h=c[l],p=new nt(3*h.data.length,3);p.name=h.name,s.push(p.copyVector3sArray(h.data))}this.morphAttributes[o]=s}if(e.skinIndices.length>0){var d=new nt(4*e.skinIndices.length,4);this.setAttribute("skinIndex",d.copyVector4sArray(e.skinIndices))}if(e.skinWeights.length>0){var f=new nt(4*e.skinWeights.length,4);this.setAttribute("skinWeight",f.copyVector4sArray(e.skinWeights))}return null!==e.boundingSphere&&(this.boundingSphere=e.boundingSphere.clone()),null!==e.boundingBox&&(this.boundingBox=e.boundingBox.clone()),this},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new le);var e=this.attributes.position,t=this.morphAttributes.position;if(void 0!==e){if(this.boundingBox.setFromBufferAttribute(e),t)for(var n=0,r=t.length;n<r;n++){var i=t[n];ut.setFromBufferAttribute(i),this.morphTargetsRelative?(pt.addVectors(this.boundingBox.min,ut.min),this.boundingBox.expandByPoint(pt),pt.addVectors(this.boundingBox.max,ut.max),this.boundingBox.expandByPoint(pt)):(this.boundingBox.expandByPoint(ut.min),this.boundingBox.expandByPoint(ut.max))}}else this.boundingBox.makeEmpty();(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.',this)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new pe);var e=this.attributes.position,t=this.morphAttributes.position;if(e){var n=this.boundingSphere.center;if(ut.setFromBufferAttribute(e),t)for(var r=0,i=t.length;r<i;r++){var a=t[r];ht.setFromBufferAttribute(a),this.morphTargetsRelative?(pt.addVectors(ut.min,ht.min),ut.expandByPoint(pt),pt.addVectors(ut.max,ht.max),ut.expandByPoint(pt)):(ut.expandByPoint(ht.min),ut.expandByPoint(ht.max))}ut.getCenter(n);var o=0;for(r=0,i=e.count;r<i;r++)pt.fromBufferAttribute(e,r),o=Math.max(o,n.distanceToSquared(pt));if(t)for(r=0,i=t.length;r<i;r++){a=t[r];for(var s=this.morphTargetsRelative,c=0,l=a.count;c<l;c++)pt.fromBufferAttribute(a,c),s&&(lt.fromBufferAttribute(e,c),pt.add(lt)),o=Math.max(o,n.distanceToSquared(pt))}this.boundingSphere.radius=Math.sqrt(o),isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.',this)}},computeFaceNormals:function(){},computeVertexNormals:function(){var e=this.index,t=this.attributes;if(t.position){var n=t.position.array;if(void 0===t.normal)this.setAttribute("normal",new Ye(new Float32Array(n.length),3));else for(var r=t.normal.array,i=0,a=r.length;i<a;i++)r[i]=0;var o,s,c,l=t.normal.array,u=new w,h=new w,p=new w,d=new w,f=new w;if(e){var m=e.array;for(i=0,a=e.count;i<a;i+=3)o=3*m[i+0],s=3*m[i+1],c=3*m[i+2],u.fromArray(n,o),h.fromArray(n,s),p.fromArray(n,c),d.subVectors(p,h),f.subVectors(u,h),d.cross(f),l[o]+=d.x,l[o+1]+=d.y,l[o+2]+=d.z,l[s]+=d.x,l[s+1]+=d.y,l[s+2]+=d.z,l[c]+=d.x,l[c+1]+=d.y,l[c+2]+=d.z}else for(i=0,a=n.length;i<a;i+=9)u.fromArray(n,i),h.fromArray(n,i+3),p.fromArray(n,i+6),d.subVectors(p,h),f.subVectors(u,h),d.cross(f),l[i]=d.x,l[i+1]=d.y,l[i+2]=d.z,l[i+3]=d.x,l[i+4]=d.y,l[i+5]=d.z,l[i+6]=d.x,l[i+7]=d.y,l[i+8]=d.z;this.normalizeNormals(),t.normal.needsUpdate=!0}},merge:function(e,t){if(e&&e.isBufferGeometry){void 0===t&&(t=0,console.warn("THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge."));var n=this.attributes;for(var r in n)if(void 0!==e.attributes[r])for(var i=n[r].array,a=e.attributes[r],o=a.array,s=a.itemSize*t,c=Math.min(o.length,i.length-s),l=0,u=s;l<c;l++,u++)i[u]=o[l];return this}console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.",e)},normalizeNormals:function(){for(var e=this.attributes.normal,t=0,n=e.count;t<n;t++)pt.x=e.getX(t),pt.y=e.getY(t),pt.z=e.getZ(t),pt.normalize(),e.setXYZ(t,pt.x,pt.y,pt.z)},toNonIndexed:function(){function e(e,t){for(var n=e.array,r=e.itemSize,i=new n.constructor(t.length*r),a=0,o=0,s=0,c=t.length;s<c;s++){a=t[s]*r;for(var l=0;l<r;l++)i[o++]=n[a++]}return new Ye(i,r)}if(null===this.index)return console.warn("THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed."),this;var t=new dt,n=this.index.array,r=this.attributes;for(var i in r){var a=e(r[i],n);t.setAttribute(i,a)}var o=this.morphAttributes;for(i in o){for(var s=[],c=o[i],l=0,u=c.length;l<u;l++){a=e(c[l],n);s.push(a)}t.morphAttributes[i]=s}t.morphTargetsRelative=this.morphTargetsRelative;for(var h=this.groups,p=(l=0,h.length);l<p;l++){var d=h[l];t.addGroup(d.start,d.count,d.materialIndex)}return t},toJSON:function(){var e={metadata:{version:4.5,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}};if(e.uuid=this.uuid,e.type=this.type,""!==this.name&&(e.name=this.name),Object.keys(this.userData).length>0&&(e.userData=this.userData),void 0!==this.parameters){var t=this.parameters;for(var n in t)void 0!==t[n]&&(e[n]=t[n]);return e}e.data={attributes:{}};var r=this.index;null!==r&&(e.data.index={type:r.array.constructor.name,array:Array.prototype.slice.call(r.array)});var i=this.attributes;for(var n in i){var a=(p=i[n]).toJSON();""!==p.name&&(a.name=p.name),e.data.attributes[n]=a}var o={},s=!1;for(var n in this.morphAttributes){for(var c=this.morphAttributes[n],l=[],u=0,h=c.length;u<h;u++){var p;a=(p=c[u]).toJSON();""!==p.name&&(a.name=p.name),l.push(a)}l.length>0&&(o[n]=l,s=!0)}s&&(e.data.morphAttributes=o,e.data.morphTargetsRelative=this.morphTargetsRelative);var d=this.groups;d.length>0&&(e.data.groups=JSON.parse(JSON.stringify(d)));var f=this.boundingSphere;return null!==f&&(e.data.boundingSphere={center:f.center.toArray(),radius:f.radius}),e},clone:function(){return(new dt).copy(this)},copy:function(e){var t,n,r;this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.name=e.name;var i=e.index;null!==i&&this.setIndex(i.clone());var a=e.attributes;for(t in a){var o=a[t];this.setAttribute(t,o.clone())}var s=e.morphAttributes;for(t in s){var c=[],l=s[t];for(n=0,r=l.length;n<r;n++)c.push(l[n].clone());this.morphAttributes[t]=c}this.morphTargetsRelative=e.morphTargetsRelative;var u=e.groups;for(n=0,r=u.length;n<r;n++){var h=u[n];this.addGroup(h.start,h.count,h.materialIndex)}var p=e.boundingBox;null!==p&&(this.boundingBox=p.clone());var d=e.boundingSphere;return null!==d&&(this.boundingSphere=d.clone()),this.drawRange.start=e.drawRange.start,this.drawRange.count=e.drawRange.count,this.userData=e.userData,this},dispose:function(){this.dispatchEvent({type:"dispose"})}});var ft=new R,mt=new be,gt=new pe,vt=new w,yt=new w,xt=new w,bt=new w,_t=new w,wt=new w,Mt=new w,St=new w,Et=new w,Tt=new h,At=new h,Lt=new h,Pt=new w,Rt=new w;function Ct(e,t){Y.call(this),this.type="Mesh",this.geometry=void 0!==e?e:new dt,this.material=void 0!==t?t:new qe,this.updateMorphTargets()}function Ot(e,t,n,r,i,a,o,s){if(null===(1===t.side?r.intersectTriangle(o,a,i,!0,s):r.intersectTriangle(i,a,o,2!==t.side,s)))return null;Rt.copy(s),Rt.applyMatrix4(e.matrixWorld);var c=n.ray.origin.distanceTo(Rt);return c<n.near||c>n.far?null:{distance:c,point:Rt.clone(),object:e}}function Dt(e,t,n,r,i,a,o,s,c,l,u,p){vt.fromBufferAttribute(i,l),yt.fromBufferAttribute(i,u),xt.fromBufferAttribute(i,p);var d=e.morphTargetInfluences;if(t.morphTargets&&a&&d){Mt.set(0,0,0),St.set(0,0,0),Et.set(0,0,0);for(var f=0,m=a.length;f<m;f++){var g=d[f],v=a[f];0!==g&&(bt.fromBufferAttribute(v,l),_t.fromBufferAttribute(v,u),wt.fromBufferAttribute(v,p),o?(Mt.addScaledVector(bt,g),St.addScaledVector(_t,g),Et.addScaledVector(wt,g)):(Mt.addScaledVector(bt.sub(vt),g),St.addScaledVector(_t.sub(yt),g),Et.addScaledVector(wt.sub(xt),g)))}vt.add(Mt),yt.add(St),xt.add(Et)}var y=Ot(e,t,n,r,vt,yt,xt,Pt);if(y){s&&(Tt.fromBufferAttribute(s,l),At.fromBufferAttribute(s,u),Lt.fromBufferAttribute(s,p),y.uv=Ie.getUV(Pt,vt,yt,xt,Tt,At,Lt,new h)),c&&(Tt.fromBufferAttribute(c,l),At.fromBufferAttribute(c,u),Lt.fromBufferAttribute(c,p),y.uv2=Ie.getUV(Pt,vt,yt,xt,Tt,At,Lt,new h));var x=new Ge(l,u,p);Ie.getNormal(vt,yt,xt,x.normal),y.face=x}return y}Ct.prototype=Object.assign(Object.create(Y.prototype),{constructor:Ct,isMesh:!0,copy:function(e){return Y.prototype.copy.call(this,e),void 0!==e.morphTargetInfluences&&(this.morphTargetInfluences=e.morphTargetInfluences.slice()),void 0!==e.morphTargetDictionary&&(this.morphTargetDictionary=Object.assign({},e.morphTargetDictionary)),this},updateMorphTargets:function(){var e,t,n,r=this.geometry;if(r.isBufferGeometry){var i=r.morphAttributes,a=Object.keys(i);if(a.length>0){var o=i[a[0]];if(void 0!==o)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},e=0,t=o.length;e<t;e++)n=o[e].name||String(e),this.morphTargetInfluences.push(0),this.morphTargetDictionary[n]=e}}else{var s=r.morphTargets;void 0!==s&&s.length>0&&console.error("THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}},raycast:function(e,t){var n,r=this.geometry,i=this.material,a=this.matrixWorld;if(void 0!==i&&(null===r.boundingSphere&&r.computeBoundingSphere(),gt.copy(r.boundingSphere),gt.applyMatrix4(a),!1!==e.ray.intersectsSphere(gt)&&(ft.getInverse(a),mt.copy(e.ray).applyMatrix4(ft),null===r.boundingBox||!1!==mt.intersectsBox(r.boundingBox))))if(r.isBufferGeometry){var o,s,c,l,u,p,d,f,m,g=r.index,v=r.attributes.position,y=r.morphAttributes.position,x=r.morphTargetsRelative,b=r.attributes.uv,_=r.attributes.uv2,w=r.groups,M=r.drawRange;if(null!==g)if(Array.isArray(i))for(l=0,p=w.length;l<p;l++)for(m=i[(f=w[l]).materialIndex],u=Math.max(f.start,M.start),d=Math.min(f.start+f.count,M.start+M.count);u<d;u+=3)o=g.getX(u),s=g.getX(u+1),c=g.getX(u+2),(n=Dt(this,m,e,mt,v,y,x,b,_,o,s,c))&&(n.faceIndex=Math.floor(u/3),n.face.materialIndex=f.materialIndex,t.push(n));else for(l=Math.max(0,M.start),p=Math.min(g.count,M.start+M.count);l<p;l+=3)o=g.getX(l),s=g.getX(l+1),c=g.getX(l+2),(n=Dt(this,i,e,mt,v,y,x,b,_,o,s,c))&&(n.faceIndex=Math.floor(l/3),t.push(n));else if(void 0!==v)if(Array.isArray(i))for(l=0,p=w.length;l<p;l++)for(m=i[(f=w[l]).materialIndex],u=Math.max(f.start,M.start),d=Math.min(f.start+f.count,M.start+M.count);u<d;u+=3)(n=Dt(this,m,e,mt,v,y,x,b,_,o=u,s=u+1,c=u+2))&&(n.faceIndex=Math.floor(u/3),n.face.materialIndex=f.materialIndex,t.push(n));else for(l=Math.max(0,M.start),p=Math.min(v.count,M.start+M.count);l<p;l+=3)(n=Dt(this,i,e,mt,v,y,x,b,_,o=l,s=l+1,c=l+2))&&(n.faceIndex=Math.floor(l/3),t.push(n))}else if(r.isGeometry){var S,E,T,A,L=Array.isArray(i),P=r.vertices,R=r.faces,C=r.faceVertexUvs[0];C.length>0&&(A=C);for(var O=0,D=R.length;O<D;O++){var N=R[O],I=L?i[N.materialIndex]:i;if(void 0!==I&&(S=P[N.a],E=P[N.b],T=P[N.c],n=Ot(this,I,e,mt,S,E,T,Pt))){if(A&&A[O]){var z=A[O];Tt.copy(z[0]),At.copy(z[1]),Lt.copy(z[2]),n.uv=Ie.getUV(Pt,S,E,T,Tt,At,Lt,new h)}n.face=N,n.faceIndex=O,t.push(n)}}}},clone:function(){return new this.constructor(this.geometry,this.material).copy(this)}});var Nt=0,It=new R,zt=new Y,kt=new w;function Ft(){Object.defineProperty(this,"id",{value:Nt+=2}),this.uuid=u.generateUUID(),this.name="",this.type="Geometry",this.vertices=[],this.colors=[],this.faces=[],this.faceVertexUvs=[[]],this.morphTargets=[],this.morphNormals=[],this.skinWeights=[],this.skinIndices=[],this.lineDistances=[],this.boundingBox=null,this.boundingSphere=null,this.elementsNeedUpdate=!1,this.verticesNeedUpdate=!1,this.uvsNeedUpdate=!1,this.normalsNeedUpdate=!1,this.colorsNeedUpdate=!1,this.lineDistancesNeedUpdate=!1,this.groupsNeedUpdate=!1}Ft.prototype=Object.assign(Object.create(o.prototype),{constructor:Ft,isGeometry:!0,applyMatrix4:function(e){for(var t=(new p).getNormalMatrix(e),n=0,r=this.vertices.length;n<r;n++){this.vertices[n].applyMatrix4(e)}for(n=0,r=this.faces.length;n<r;n++){var i=this.faces[n];i.normal.applyMatrix3(t).normalize();for(var a=0,o=i.vertexNormals.length;a<o;a++)i.vertexNormals[a].applyMatrix3(t).normalize()}return null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this.verticesNeedUpdate=!0,this.normalsNeedUpdate=!0,this},rotateX:function(e){return It.makeRotationX(e),this.applyMatrix4(It),this},rotateY:function(e){return It.makeRotationY(e),this.applyMatrix4(It),this},rotateZ:function(e){return It.makeRotationZ(e),this.applyMatrix4(It),this},translate:function(e,t,n){return It.makeTranslation(e,t,n),this.applyMatrix4(It),this},scale:function(e,t,n){return It.makeScale(e,t,n),this.applyMatrix4(It),this},lookAt:function(e){return zt.lookAt(e),zt.updateMatrix(),this.applyMatrix4(zt.matrix),this},fromBufferGeometry:function(e){var t=this,n=null!==e.index?e.index.array:void 0,r=e.attributes;if(void 0===r.position)return console.error("THREE.Geometry.fromBufferGeometry(): Position attribute required for conversion."),this;var i=r.position.array,a=void 0!==r.normal?r.normal.array:void 0,o=void 0!==r.color?r.color.array:void 0,s=void 0!==r.uv?r.uv.array:void 0,c=void 0!==r.uv2?r.uv2.array:void 0;void 0!==c&&(this.faceVertexUvs[1]=[]);for(var l=0;l<i.length;l+=3)t.vertices.push((new w).fromArray(i,l)),void 0!==o&&t.colors.push((new Be).fromArray(o,l));function u(e,n,r,i){var l=void 0===o?[]:[t.colors[e].clone(),t.colors[n].clone(),t.colors[r].clone()],u=new Ge(e,n,r,void 0===a?[]:[(new w).fromArray(a,3*e),(new w).fromArray(a,3*n),(new w).fromArray(a,3*r)],l,i);t.faces.push(u),void 0!==s&&t.faceVertexUvs[0].push([(new h).fromArray(s,2*e),(new h).fromArray(s,2*n),(new h).fromArray(s,2*r)]),void 0!==c&&t.faceVertexUvs[1].push([(new h).fromArray(c,2*e),(new h).fromArray(c,2*n),(new h).fromArray(c,2*r)])}var p=e.groups;if(p.length>0)for(l=0;l<p.length;l++)for(var d=p[l],f=d.start,m=f,g=f+d.count;m<g;m+=3)void 0!==n?u(n[m],n[m+1],n[m+2],d.materialIndex):u(m,m+1,m+2,d.materialIndex);else if(void 0!==n)for(l=0;l<n.length;l+=3)u(n[l],n[l+1],n[l+2]);else for(l=0;l<i.length/3;l+=3)u(l,l+1,l+2);return this.computeFaceNormals(),null!==e.boundingBox&&(this.boundingBox=e.boundingBox.clone()),null!==e.boundingSphere&&(this.boundingSphere=e.boundingSphere.clone()),this},center:function(){return this.computeBoundingBox(),this.boundingBox.getCenter(kt).negate(),this.translate(kt.x,kt.y,kt.z),this},normalize:function(){this.computeBoundingSphere();var e=this.boundingSphere.center,t=this.boundingSphere.radius,n=0===t?1:1/t,r=new R;return r.set(n,0,0,-n*e.x,0,n,0,-n*e.y,0,0,n,-n*e.z,0,0,0,1),this.applyMatrix4(r),this},computeFaceNormals:function(){for(var e=new w,t=new w,n=0,r=this.faces.length;n<r;n++){var i=this.faces[n],a=this.vertices[i.a],o=this.vertices[i.b],s=this.vertices[i.c];e.subVectors(s,o),t.subVectors(a,o),e.cross(t),e.normalize(),i.normal.copy(e)}},computeVertexNormals:function(e){var t,n,r,i,a,o;for(void 0===e&&(e=!0),o=new Array(this.vertices.length),t=0,n=this.vertices.length;t<n;t++)o[t]=new w;if(e){var s,c,l,u=new w,h=new w;for(r=0,i=this.faces.length;r<i;r++)a=this.faces[r],s=this.vertices[a.a],c=this.vertices[a.b],l=this.vertices[a.c],u.subVectors(l,c),h.subVectors(s,c),u.cross(h),o[a.a].add(u),o[a.b].add(u),o[a.c].add(u)}else for(this.computeFaceNormals(),r=0,i=this.faces.length;r<i;r++)o[(a=this.faces[r]).a].add(a.normal),o[a.b].add(a.normal),o[a.c].add(a.normal);for(t=0,n=this.vertices.length;t<n;t++)o[t].normalize();for(r=0,i=this.faces.length;r<i;r++){var p=(a=this.faces[r]).vertexNormals;3===p.length?(p[0].copy(o[a.a]),p[1].copy(o[a.b]),p[2].copy(o[a.c])):(p[0]=o[a.a].clone(),p[1]=o[a.b].clone(),p[2]=o[a.c].clone())}this.faces.length>0&&(this.normalsNeedUpdate=!0)},computeFlatVertexNormals:function(){var e,t,n;for(this.computeFaceNormals(),e=0,t=this.faces.length;e<t;e++){var r=(n=this.faces[e]).vertexNormals;3===r.length?(r[0].copy(n.normal),r[1].copy(n.normal),r[2].copy(n.normal)):(r[0]=n.normal.clone(),r[1]=n.normal.clone(),r[2]=n.normal.clone())}this.faces.length>0&&(this.normalsNeedUpdate=!0)},computeMorphNormals:function(){var e,t,n,r,i;for(n=0,r=this.faces.length;n<r;n++)for((i=this.faces[n]).__originalFaceNormal?i.__originalFaceNormal.copy(i.normal):i.__originalFaceNormal=i.normal.clone(),i.__originalVertexNormals||(i.__originalVertexNormals=[]),e=0,t=i.vertexNormals.length;e<t;e++)i.__originalVertexNormals[e]?i.__originalVertexNormals[e].copy(i.vertexNormals[e]):i.__originalVertexNormals[e]=i.vertexNormals[e].clone();var a=new Ft;for(a.faces=this.faces,e=0,t=this.morphTargets.length;e<t;e++){if(!this.morphNormals[e]){this.morphNormals[e]={},this.morphNormals[e].faceNormals=[],this.morphNormals[e].vertexNormals=[];var o=this.morphNormals[e].faceNormals,s=this.morphNormals[e].vertexNormals;for(n=0,r=this.faces.length;n<r;n++)c=new w,l={a:new w,b:new w,c:new w},o.push(c),s.push(l)}var c,l,u=this.morphNormals[e];for(a.vertices=this.morphTargets[e].vertices,a.computeFaceNormals(),a.computeVertexNormals(),n=0,r=this.faces.length;n<r;n++)i=this.faces[n],c=u.faceNormals[n],l=u.vertexNormals[n],c.copy(i.normal),l.a.copy(i.vertexNormals[0]),l.b.copy(i.vertexNormals[1]),l.c.copy(i.vertexNormals[2])}for(n=0,r=this.faces.length;n<r;n++)(i=this.faces[n]).normal=i.__originalFaceNormal,i.vertexNormals=i.__originalVertexNormals},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new le),this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new pe),this.boundingSphere.setFromPoints(this.vertices)},merge:function(e,t,n){if(e&&e.isGeometry){var r,i=this.vertices.length,a=this.vertices,o=e.vertices,s=this.faces,c=e.faces,l=this.colors,u=e.colors;void 0===n&&(n=0),void 0!==t&&(r=(new p).getNormalMatrix(t));for(var h=0,d=o.length;h<d;h++){var f=o[h].clone();void 0!==t&&f.applyMatrix4(t),a.push(f)}for(h=0,d=u.length;h<d;h++)l.push(u[h].clone());for(h=0,d=c.length;h<d;h++){var m,g,v,y=c[h],x=y.vertexNormals,b=y.vertexColors;(m=new Ge(y.a+i,y.b+i,y.c+i)).normal.copy(y.normal),void 0!==r&&m.normal.applyMatrix3(r).normalize();for(var _=0,w=x.length;_<w;_++)g=x[_].clone(),void 0!==r&&g.applyMatrix3(r).normalize(),m.vertexNormals.push(g);m.color.copy(y.color);for(_=0,w=b.length;_<w;_++)v=b[_],m.vertexColors.push(v.clone());m.materialIndex=y.materialIndex+n,s.push(m)}for(h=0,d=e.faceVertexUvs.length;h<d;h++){var M=e.faceVertexUvs[h];void 0===this.faceVertexUvs[h]&&(this.faceVertexUvs[h]=[]);for(_=0,w=M.length;_<w;_++){for(var S=M[_],E=[],T=0,A=S.length;T<A;T++)E.push(S[T].clone());this.faceVertexUvs[h].push(E)}}}else console.error("THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.",e)},mergeMesh:function(e){e&&e.isMesh?(e.matrixAutoUpdate&&e.updateMatrix(),this.merge(e.geometry,e.matrix)):console.error("THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.",e)},mergeVertices:function(){var e,t,n,r,i,a,o,s,c={},l=[],u=[],h=Math.pow(10,4);for(n=0,r=this.vertices.length;n<r;n++)e=this.vertices[n],void 0===c[t=Math.round(e.x*h)+"_"+Math.round(e.y*h)+"_"+Math.round(e.z*h)]?(c[t]=n,l.push(this.vertices[n]),u[n]=l.length-1):u[n]=u[c[t]];var p=[];for(n=0,r=this.faces.length;n<r;n++){(i=this.faces[n]).a=u[i.a],i.b=u[i.b],i.c=u[i.c],a=[i.a,i.b,i.c];for(var d=0;d<3;d++)if(a[d]===a[(d+1)%3]){p.push(n);break}}for(n=p.length-1;n>=0;n--){var f=p[n];for(this.faces.splice(f,1),o=0,s=this.faceVertexUvs.length;o<s;o++)this.faceVertexUvs[o].splice(f,1)}var m=this.vertices.length-l.length;return this.vertices=l,m},setFromPoints:function(e){this.vertices=[];for(var t=0,n=e.length;t<n;t++){var r=e[t];this.vertices.push(new w(r.x,r.y,r.z||0))}return this},sortFacesByMaterialIndex:function(){for(var e=this.faces,t=e.length,n=0;n<t;n++)e[n]._id=n;e.sort((function(e,t){return e.materialIndex-t.materialIndex}));var r,i,a=this.faceVertexUvs[0],o=this.faceVertexUvs[1];a&&a.length===t&&(r=[]),o&&o.length===t&&(i=[]);for(n=0;n<t;n++){var s=e[n]._id;r&&r.push(a[s]),i&&i.push(o[s])}r&&(this.faceVertexUvs[0]=r),i&&(this.faceVertexUvs[1]=i)},toJSON:function(){var e={metadata:{version:4.5,type:"Geometry",generator:"Geometry.toJSON"}};if(e.uuid=this.uuid,e.type=this.type,""!==this.name&&(e.name=this.name),void 0!==this.parameters){var t=this.parameters;for(var n in t)void 0!==t[n]&&(e[n]=t[n]);return e}for(var r=[],i=0;i<this.vertices.length;i++){var a=this.vertices[i];r.push(a.x,a.y,a.z)}var o=[],s=[],c={},l=[],u={},h=[],p={};for(i=0;i<this.faces.length;i++){var d=this.faces[i],f=void 0!==this.faceVertexUvs[0][i],m=d.normal.length()>0,g=d.vertexNormals.length>0,v=1!==d.color.r||1!==d.color.g||1!==d.color.b,y=d.vertexColors.length>0,x=0;if(x=M(x,0,0),x=M(x,1,!0),x=M(x,2,!1),x=M(x,3,f),x=M(x,4,m),x=M(x,5,g),x=M(x,6,v),x=M(x,7,y),o.push(x),o.push(d.a,d.b,d.c),o.push(d.materialIndex),f){var b=this.faceVertexUvs[0][i];o.push(T(b[0]),T(b[1]),T(b[2]))}if(m&&o.push(S(d.normal)),g){var _=d.vertexNormals;o.push(S(_[0]),S(_[1]),S(_[2]))}if(v&&o.push(E(d.color)),y){var w=d.vertexColors;o.push(E(w[0]),E(w[1]),E(w[2]))}}function M(e,t,n){return n?e|1<<t:e&~(1<<t)}function S(e){var t=e.x.toString()+e.y.toString()+e.z.toString();return void 0!==c[t]||(c[t]=s.length/3,s.push(e.x,e.y,e.z)),c[t]}function E(e){var t=e.r.toString()+e.g.toString()+e.b.toString();return void 0!==u[t]||(u[t]=l.length,l.push(e.getHex())),u[t]}function T(e){var t=e.x.toString()+e.y.toString();return void 0!==p[t]||(p[t]=h.length/2,h.push(e.x,e.y)),p[t]}return e.data={},e.data.vertices=r,e.data.normals=s,l.length>0&&(e.data.colors=l),h.length>0&&(e.data.uvs=[h]),e.data.faces=o,e},clone:function(){return(new Ft).copy(this)},copy:function(e){var t,n,r,i,a,o;this.vertices=[],this.colors=[],this.faces=[],this.faceVertexUvs=[[]],this.morphTargets=[],this.morphNormals=[],this.skinWeights=[],this.skinIndices=[],this.lineDistances=[],this.boundingBox=null,this.boundingSphere=null,this.name=e.name;var s=e.vertices;for(t=0,n=s.length;t<n;t++)this.vertices.push(s[t].clone());var c=e.colors;for(t=0,n=c.length;t<n;t++)this.colors.push(c[t].clone());var l=e.faces;for(t=0,n=l.length;t<n;t++)this.faces.push(l[t].clone());for(t=0,n=e.faceVertexUvs.length;t<n;t++){var u=e.faceVertexUvs[t];for(void 0===this.faceVertexUvs[t]&&(this.faceVertexUvs[t]=[]),r=0,i=u.length;r<i;r++){var h=u[r],p=[];for(a=0,o=h.length;a<o;a++){var d=h[a];p.push(d.clone())}this.faceVertexUvs[t].push(p)}}var f=e.morphTargets;for(t=0,n=f.length;t<n;t++){var m={};if(m.name=f[t].name,void 0!==f[t].vertices)for(m.vertices=[],r=0,i=f[t].vertices.length;r<i;r++)m.vertices.push(f[t].vertices[r].clone());if(void 0!==f[t].normals)for(m.normals=[],r=0,i=f[t].normals.length;r<i;r++)m.normals.push(f[t].normals[r].clone());this.morphTargets.push(m)}var g=e.morphNormals;for(t=0,n=g.length;t<n;t++){var v={};if(void 0!==g[t].vertexNormals)for(v.vertexNormals=[],r=0,i=g[t].vertexNormals.length;r<i;r++){var y=g[t].vertexNormals[r],x={};x.a=y.a.clone(),x.b=y.b.clone(),x.c=y.c.clone(),v.vertexNormals.push(x)}if(void 0!==g[t].faceNormals)for(v.faceNormals=[],r=0,i=g[t].faceNormals.length;r<i;r++)v.faceNormals.push(g[t].faceNormals[r].clone());this.morphNormals.push(v)}var b=e.skinWeights;for(t=0,n=b.length;t<n;t++)this.skinWeights.push(b[t].clone());var _=e.skinIndices;for(t=0,n=_.length;t<n;t++)this.skinIndices.push(_[t].clone());var w=e.lineDistances;for(t=0,n=w.length;t<n;t++)this.lineDistances.push(w[t]);var M=e.boundingBox;null!==M&&(this.boundingBox=M.clone());var S=e.boundingSphere;return null!==S&&(this.boundingSphere=S.clone()),this.elementsNeedUpdate=e.elementsNeedUpdate,this.verticesNeedUpdate=e.verticesNeedUpdate,this.uvsNeedUpdate=e.uvsNeedUpdate,this.normalsNeedUpdate=e.normalsNeedUpdate,this.colorsNeedUpdate=e.colorsNeedUpdate,this.lineDistancesNeedUpdate=e.lineDistancesNeedUpdate,this.groupsNeedUpdate=e.groupsNeedUpdate,this},dispose:function(){this.dispatchEvent({type:"dispose"})}});class Bt extends Ft{constructor(e,t,n,r,i,a){super(),this.type="BoxGeometry",this.parameters={width:e,height:t,depth:n,widthSegments:r,heightSegments:i,depthSegments:a},this.fromBufferGeometry(new Ut(e,t,n,r,i,a)),this.mergeVertices()}}class Ut extends dt{constructor(e,t,n,r,i,a){super(),this.type="BoxBufferGeometry",this.parameters={width:e,height:t,depth:n,widthSegments:r,heightSegments:i,depthSegments:a};var o=this;e=e||1,t=t||1,n=n||1,r=Math.floor(r)||1,i=Math.floor(i)||1,a=Math.floor(a)||1;var s=[],c=[],l=[],u=[],h=0,p=0;function d(e,t,n,r,i,a,d,f,m,g,v){var y,x,b=a/m,_=d/g,M=a/2,S=d/2,E=f/2,T=m+1,A=g+1,L=0,P=0,R=new w;for(x=0;x<A;x++){var C=x*_-S;for(y=0;y<T;y++){var O=y*b-M;R[e]=O*r,R[t]=C*i,R[n]=E,c.push(R.x,R.y,R.z),R[e]=0,R[t]=0,R[n]=f>0?1:-1,l.push(R.x,R.y,R.z),u.push(y/m),u.push(1-x/g),L+=1}}for(x=0;x<g;x++)for(y=0;y<m;y++){var D=h+y+T*x,N=h+y+T*(x+1),I=h+(y+1)+T*(x+1),z=h+(y+1)+T*x;s.push(D,N,z),s.push(N,I,z),P+=6}o.addGroup(p,P,v),p+=P,h+=L}d("z","y","x",-1,-1,n,t,e,a,i,0),d("z","y","x",1,-1,n,t,-e,a,i,1),d("x","z","y",1,1,e,n,t,r,a,2),d("x","z","y",1,-1,e,n,-t,r,a,3),d("x","y","z",1,-1,e,t,n,r,i,4),d("x","y","z",-1,-1,e,t,-n,r,i,5),this.setIndex(s),this.setAttribute("position",new nt(c,3)),this.setAttribute("normal",new nt(l,3)),this.setAttribute("uv",new nt(u,2))}}function jt(e){var t={};for(var n in e)for(var r in t[n]={},e[n]){var i=e[n][r];i&&(i.isColor||i.isMatrix3||i.isMatrix4||i.isVector2||i.isVector3||i.isVector4||i.isTexture)?t[n][r]=i.clone():Array.isArray(i)?t[n][r]=i.slice():t[n][r]=i}return t}function Ht(e){for(var t={},n=0;n<e.length;n++){var r=jt(e[n]);for(var i in r)t[i]=r[i]}return t}var Gt={clone:jt,merge:Ht};function Vt(e){We.call(this),this.type="ShaderMaterial",this.defines={},this.uniforms={},this.vertexShader="void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",this.fragmentShader="void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}",this.linewidth=1,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.lights=!1,this.clipping=!1,this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.extensions={derivatives:!1,fragDepth:!1,drawBuffers:!1,shaderTextureLOD:!1},this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv2:[0,0]},this.index0AttributeName=void 0,this.uniformsNeedUpdate=!1,void 0!==e&&(void 0!==e.attributes&&console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."),this.setValues(e))}function Wt(){Y.call(this),this.type="Camera",this.matrixWorldInverse=new R,this.projectionMatrix=new R,this.projectionMatrixInverse=new R}function qt(e,t,n,r){Wt.call(this),this.type="PerspectiveCamera",this.fov=void 0!==e?e:50,this.zoom=1,this.near=void 0!==n?n:.1,this.far=void 0!==r?r:2e3,this.focus=10,this.aspect=void 0!==t?t:1,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}Vt.prototype=Object.create(We.prototype),Vt.prototype.constructor=Vt,Vt.prototype.isShaderMaterial=!0,Vt.prototype.copy=function(e){return We.prototype.copy.call(this,e),this.fragmentShader=e.fragmentShader,this.vertexShader=e.vertexShader,this.uniforms=jt(e.uniforms),this.defines=Object.assign({},e.defines),this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.lights=e.lights,this.clipping=e.clipping,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.morphNormals=e.morphNormals,this.extensions=e.extensions,this},Vt.prototype.toJSON=function(e){var t=We.prototype.toJSON.call(this,e);for(var n in t.uniforms={},this.uniforms){var r=this.uniforms[n].value;r&&r.isTexture?t.uniforms[n]={type:"t",value:r.toJSON(e).uuid}:r&&r.isColor?t.uniforms[n]={type:"c",value:r.getHex()}:r&&r.isVector2?t.uniforms[n]={type:"v2",value:r.toArray()}:r&&r.isVector3?t.uniforms[n]={type:"v3",value:r.toArray()}:r&&r.isVector4?t.uniforms[n]={type:"v4",value:r.toArray()}:r&&r.isMatrix3?t.uniforms[n]={type:"m3",value:r.toArray()}:r&&r.isMatrix4?t.uniforms[n]={type:"m4",value:r.toArray()}:t.uniforms[n]={value:r}}Object.keys(this.defines).length>0&&(t.defines=this.defines),t.vertexShader=this.vertexShader,t.fragmentShader=this.fragmentShader;var i={};for(var a in this.extensions)!0===this.extensions[a]&&(i[a]=!0);return Object.keys(i).length>0&&(t.extensions=i),t},Wt.prototype=Object.assign(Object.create(Y.prototype),{constructor:Wt,isCamera:!0,copy:function(e,t){return Y.prototype.copy.call(this,e,t),this.matrixWorldInverse.copy(e.matrixWorldInverse),this.projectionMatrix.copy(e.projectionMatrix),this.projectionMatrixInverse.copy(e.projectionMatrixInverse),this},getWorldDirection:function(e){void 0===e&&(console.warn("THREE.Camera: .getWorldDirection() target is now required"),e=new w),this.updateMatrixWorld(!0);var t=this.matrixWorld.elements;return e.set(-t[8],-t[9],-t[10]).normalize()},updateMatrixWorld:function(e){Y.prototype.updateMatrixWorld.call(this,e),this.matrixWorldInverse.getInverse(this.matrixWorld)},updateWorldMatrix:function(e,t){Y.prototype.updateWorldMatrix.call(this,e,t),this.matrixWorldInverse.getInverse(this.matrixWorld)},clone:function(){return(new this.constructor).copy(this)}}),qt.prototype=Object.assign(Object.create(Wt.prototype),{constructor:qt,isPerspectiveCamera:!0,copy:function(e,t){return Wt.prototype.copy.call(this,e,t),this.fov=e.fov,this.zoom=e.zoom,this.near=e.near,this.far=e.far,this.focus=e.focus,this.aspect=e.aspect,this.view=null===e.view?null:Object.assign({},e.view),this.filmGauge=e.filmGauge,this.filmOffset=e.filmOffset,this},setFocalLength:function(e){var t=.5*this.getFilmHeight()/e;this.fov=2*u.RAD2DEG*Math.atan(t),this.updateProjectionMatrix()},getFocalLength:function(){var e=Math.tan(.5*u.DEG2RAD*this.fov);return.5*this.getFilmHeight()/e},getEffectiveFOV:function(){return 2*u.RAD2DEG*Math.atan(Math.tan(.5*u.DEG2RAD*this.fov)/this.zoom)},getFilmWidth:function(){return this.filmGauge*Math.min(this.aspect,1)},getFilmHeight:function(){return this.filmGauge/Math.max(this.aspect,1)},setViewOffset:function(e,t,n,r,i,a){this.aspect=e/t,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=e,this.view.fullHeight=t,this.view.offsetX=n,this.view.offsetY=r,this.view.width=i,this.view.height=a,this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()},updateProjectionMatrix:function(){var e=this.near,t=e*Math.tan(.5*u.DEG2RAD*this.fov)/this.zoom,n=2*t,r=this.aspect*n,i=-.5*r,a=this.view;if(null!==this.view&&this.view.enabled){var o=a.fullWidth,s=a.fullHeight;i+=a.offsetX*r/o,t-=a.offsetY*n/s,r*=a.width/o,n*=a.height/s}var c=this.filmOffset;0!==c&&(i+=e*c/this.getFilmWidth()),this.projectionMatrix.makePerspective(i,i+r,t,t-n,e,this.far),this.projectionMatrixInverse.getInverse(this.projectionMatrix)},toJSON:function(e){var t=Y.prototype.toJSON.call(this,e);return t.object.fov=this.fov,t.object.zoom=this.zoom,t.object.near=this.near,t.object.far=this.far,t.object.focus=this.focus,t.object.aspect=this.aspect,null!==this.view&&(t.object.view=Object.assign({},this.view)),t.object.filmGauge=this.filmGauge,t.object.filmOffset=this.filmOffset,t}});function Xt(e,t,n,r){Y.call(this),this.type="CubeCamera";var i=new qt(90,1,e,t);i.up.set(0,-1,0),i.lookAt(new w(1,0,0)),this.add(i);var a=new qt(90,1,e,t);a.up.set(0,-1,0),a.lookAt(new w(-1,0,0)),this.add(a);var o=new qt(90,1,e,t);o.up.set(0,0,1),o.lookAt(new w(0,1,0)),this.add(o);var s=new qt(90,1,e,t);s.up.set(0,0,-1),s.lookAt(new w(0,-1,0)),this.add(s);var c=new qt(90,1,e,t);c.up.set(0,-1,0),c.lookAt(new w(0,0,1)),this.add(c);var l=new qt(90,1,e,t);l.up.set(0,-1,0),l.lookAt(new w(0,0,-1)),this.add(l),r=r||{format:1022,magFilter:1006,minFilter:1006},this.renderTarget=new Yt(n,r),this.renderTarget.texture.name="CubeCamera",this.update=function(e,t){null===this.parent&&this.updateMatrixWorld();var n=e.getRenderTarget(),r=this.renderTarget,u=r.texture.generateMipmaps;r.texture.generateMipmaps=!1,e.setRenderTarget(r,0),e.render(t,i),e.setRenderTarget(r,1),e.render(t,a),e.setRenderTarget(r,2),e.render(t,o),e.setRenderTarget(r,3),e.render(t,s),e.setRenderTarget(r,4),e.render(t,c),r.texture.generateMipmaps=u,e.setRenderTarget(r,5),e.render(t,l),e.setRenderTarget(n)},this.clear=function(e,t,n,r){for(var i=e.getRenderTarget(),a=this.renderTarget,o=0;o<6;o++)e.setRenderTarget(a,o),e.clear(t,n,r);e.setRenderTarget(i)}}function Yt(e,t,n){Number.isInteger(t)&&(console.warn("THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )"),t=n),v.call(this,e,e,t)}function Zt(e,t,n,r,i,a,o,s,c,l,u,h){m.call(this,null,a,o,s,c,l,r,i,u,h),this.image={data:e||null,width:t||1,height:n||1},this.magFilter=void 0!==c?c:1003,this.minFilter=void 0!==l?l:1003,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1,this.needsUpdate=!0}Xt.prototype=Object.create(Y.prototype),Xt.prototype.constructor=Xt,Yt.prototype=Object.create(v.prototype),Yt.prototype.constructor=Yt,Yt.prototype.isWebGLCubeRenderTarget=!0,Yt.prototype.fromEquirectangularTexture=function(e,t){this.texture.type=t.type,this.texture.format=t.format,this.texture.encoding=t.encoding;var n=new Z,r={uniforms:{tEquirect:{value:null}},vertexShader:["varying vec3 vWorldDirection;","vec3 transformDirection( in vec3 dir, in mat4 matrix ) {","\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );","}","void main() {","\tvWorldDirection = transformDirection( position, modelMatrix );","\t#include <begin_vertex>","\t#include <project_vertex>","}"].join("\n"),fragmentShader:["uniform sampler2D tEquirect;","varying vec3 vWorldDirection;","#define RECIPROCAL_PI 0.31830988618","#define RECIPROCAL_PI2 0.15915494","void main() {","\tvec3 direction = normalize( vWorldDirection );","\tvec2 sampleUV;","\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;","\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;","\tgl_FragColor = texture2D( tEquirect, sampleUV );","}"].join("\n")},i=new Vt({type:"CubemapFromEquirect",uniforms:jt(r.uniforms),vertexShader:r.vertexShader,fragmentShader:r.fragmentShader,side:1,blending:0});i.uniforms.tEquirect.value=t;var a=new Ct(new Ut(5,5,5),i);n.add(a);var o=new Xt(1,10,1);return o.renderTarget=this,o.renderTarget.texture.name="CubeCameraTexture",o.update(e,n),a.geometry.dispose(),a.material.dispose(),this},Zt.prototype=Object.create(m.prototype),Zt.prototype.constructor=Zt,Zt.prototype.isDataTexture=!0;var Jt=new pe,Qt=new w;function Kt(e,t,n,r,i,a){this.planes=[void 0!==e?e:new Se,void 0!==t?t:new Se,void 0!==n?n:new Se,void 0!==r?r:new Se,void 0!==i?i:new Se,void 0!==a?a:new Se]}Object.assign(Kt.prototype,{set:function(e,t,n,r,i,a){var o=this.planes;return o[0].copy(e),o[1].copy(t),o[2].copy(n),o[3].copy(r),o[4].copy(i),o[5].copy(a),this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){for(var t=this.planes,n=0;n<6;n++)t[n].copy(e.planes[n]);return this},setFromProjectionMatrix:function(e){var t=this.planes,n=e.elements,r=n[0],i=n[1],a=n[2],o=n[3],s=n[4],c=n[5],l=n[6],u=n[7],h=n[8],p=n[9],d=n[10],f=n[11],m=n[12],g=n[13],v=n[14],y=n[15];return t[0].setComponents(o-r,u-s,f-h,y-m).normalize(),t[1].setComponents(o+r,u+s,f+h,y+m).normalize(),t[2].setComponents(o+i,u+c,f+p,y+g).normalize(),t[3].setComponents(o-i,u-c,f-p,y-g).normalize(),t[4].setComponents(o-a,u-l,f-d,y-v).normalize(),t[5].setComponents(o+a,u+l,f+d,y+v).normalize(),this},intersectsObject:function(e){var t=e.geometry;return null===t.boundingSphere&&t.computeBoundingSphere(),Jt.copy(t.boundingSphere).applyMatrix4(e.matrixWorld),this.intersectsSphere(Jt)},intersectsSprite:function(e){return Jt.center.set(0,0,0),Jt.radius=.7071067811865476,Jt.applyMatrix4(e.matrixWorld),this.intersectsSphere(Jt)},intersectsSphere:function(e){for(var t=this.planes,n=e.center,r=-e.radius,i=0;i<6;i++){if(t[i].distanceToPoint(n)<r)return!1}return!0},intersectsBox:function(e){for(var t=this.planes,n=0;n<6;n++){var r=t[n];if(Qt.x=r.normal.x>0?e.max.x:e.min.x,Qt.y=r.normal.y>0?e.max.y:e.min.y,Qt.z=r.normal.z>0?e.max.z:e.min.z,r.distanceToPoint(Qt)<0)return!1}return!0},containsPoint:function(e){for(var t=this.planes,n=0;n<6;n++)if(t[n].distanceToPoint(e)<0)return!1;return!0}});var $t={common:{diffuse:{value:new Be(15658734)},opacity:{value:1},map:{value:null},uvTransform:{value:new p},uv2Transform:{value:new p},alphaMap:{value:null}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98},maxMipLevel:{value:0}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new h(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new Be(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}}},points:{diffuse:{value:new Be(15658734)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},uvTransform:{value:new p}},sprite:{diffuse:{value:new Be(15658734)},opacity:{value:1},center:{value:new h(.5,.5)},rotation:{value:0},map:{value:null},alphaMap:{value:null},uvTransform:{value:new p}}};function en(){var e=null,t=!1,n=null;function r(i,a){!1!==t&&(n(i,a),e.requestAnimationFrame(r))}return{start:function(){!0!==t&&null!==n&&(e.requestAnimationFrame(r),t=!0)},stop:function(){t=!1},setAnimationLoop:function(e){n=e},setContext:function(t){e=t}}}function tn(e,t){var n=t.isWebGL2,r=new WeakMap;return{get:function(e){return e.isInterleavedBufferAttribute&&(e=e.data),r.get(e)},remove:function(t){t.isInterleavedBufferAttribute&&(t=t.data);var n=r.get(t);n&&(e.deleteBuffer(n.buffer),r.delete(t))},update:function(t,i){t.isInterleavedBufferAttribute&&(t=t.data);var a=r.get(t);void 0===a?r.set(t,function(t,n){var r=t.array,i=t.usage,a=e.createBuffer();e.bindBuffer(n,a),e.bufferData(n,r,i),t.onUploadCallback();var o=5126;return r instanceof Float32Array?o=5126:r instanceof Float64Array?console.warn("THREE.WebGLAttributes: Unsupported data buffer format: Float64Array."):r instanceof Uint16Array?o=5123:r instanceof Int16Array?o=5122:r instanceof Uint32Array?o=5125:r instanceof Int32Array?o=5124:r instanceof Int8Array?o=5120:r instanceof Uint8Array&&(o=5121),{buffer:a,type:o,bytesPerElement:r.BYTES_PER_ELEMENT,version:t.version}}(t,i)):a.version<t.version&&(!function(t,r,i){var a=r.array,o=r.updateRange;e.bindBuffer(i,t),-1===o.count?e.bufferSubData(i,0,a):(n?e.bufferSubData(i,o.offset*a.BYTES_PER_ELEMENT,a,o.offset,o.count):e.bufferSubData(i,o.offset*a.BYTES_PER_ELEMENT,a.subarray(o.offset,o.offset+o.count)),o.count=-1)}(a.buffer,t,i),a.version=t.version)}}}function nn(e,t,n,r){Ft.call(this),this.type="PlaneGeometry",this.parameters={width:e,height:t,widthSegments:n,heightSegments:r},this.fromBufferGeometry(new rn(e,t,n,r)),this.mergeVertices()}function rn(e,t,n,r){dt.call(this),this.type="PlaneBufferGeometry",this.parameters={width:e,height:t,widthSegments:n,heightSegments:r};var i,a,o=(e=e||1)/2,s=(t=t||1)/2,c=Math.floor(n)||1,l=Math.floor(r)||1,u=c+1,h=l+1,p=e/c,d=t/l,f=[],m=[],g=[],v=[];for(a=0;a<h;a++){var y=a*d-s;for(i=0;i<u;i++){var x=i*p-o;m.push(x,-y,0),g.push(0,0,1),v.push(i/c),v.push(1-a/l)}}for(a=0;a<l;a++)for(i=0;i<c;i++){var b=i+u*a,_=i+u*(a+1),w=i+1+u*(a+1),M=i+1+u*a;f.push(b,_,M),f.push(_,w,M)}this.setIndex(f),this.setAttribute("position",new nt(m,3)),this.setAttribute("normal",new nt(g,3)),this.setAttribute("uv",new nt(v,2))}nn.prototype=Object.create(Ft.prototype),nn.prototype.constructor=nn,rn.prototype=Object.create(dt.prototype),rn.prototype.constructor=rn;var an={alphamap_fragment:"#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif",alphamap_pars_fragment:"#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",alphatest_fragment:"#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif",aomap_fragment:"#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif",aomap_pars_fragment:"#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif",begin_vertex:"vec3 transformed = vec3( position );",beginnormal_vertex:"vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n\tvec3 objectTangent = vec3( tangent.xyz );\n#endif",bsdfs:"vec2 integrateSpecularBRDF( const in float dotNV, const in float roughness ) {\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\treturn vec2( -1.04, 1.04 ) * a004 + r.zw;\n}\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n#else\n\tif( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t}\n\treturn 1.0;\n#endif\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nvec3 F_Schlick_RoughnessDependent( const in vec3 F0, const in float dotNV, const in float roughness ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotNV - 6.98316 ) * dotNV );\n\tvec3 Fr = max( vec3( 1.0 - roughness ), F0 ) - F0;\n\treturn Fr * fresnel + F0;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + viewDir );\n\tfloat dotNL = saturate( dot( normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE  = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS  = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\treturn specularColor * brdf.x + brdf.y;\n}\nvoid BRDF_Specular_Multiscattering_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tvec3 F = F_Schlick_RoughnessDependent( specularColor, dotNV, roughness );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\tvec3 FssEss = F * brdf.x + brdf.y;\n\tfloat Ess = brdf.x + brdf.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie(float roughness, float NoH) {\n\tfloat invAlpha  = 1.0 / roughness;\n\tfloat cos2h = NoH * NoH;\n\tfloat sin2h = max(1.0 - cos2h, 0.0078125);\treturn (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI);\n}\nfloat V_Neubelt(float NoV, float NoL) {\n\treturn saturate(1.0 / (4.0 * (NoL + NoV - NoL * NoV)));\n}\nvec3 BRDF_Specular_Sheen( const in float roughness, const in vec3 L, const in GeometricContext geometry, vec3 specularColor ) {\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 H = normalize( V + L );\n\tfloat dotNH = saturate( dot( N, H ) );\n\treturn specularColor * D_Charlie( roughness, dotNH ) * V_Neubelt( dot(N, V), dot(N, L) );\n}\n#endif",bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif",clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif",common:"#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat max3( vec3 v ) { return max( max( v.x, v.y ), v.z ); }\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n  return m[ 2 ][ 3 ] == - 1.0;\n}",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_maxMipLevel 8.0\n#define cubeUV_minMipLevel 4.0\n#define cubeUV_maxTileSize 256.0\n#define cubeUV_minTileSize 16.0\nfloat getFace(vec3 direction) {\n    vec3 absDirection = abs(direction);\n    float face = -1.0;\n    if (absDirection.x > absDirection.z) {\n      if (absDirection.x > absDirection.y)\n        face = direction.x > 0.0 ? 0.0 : 3.0;\n      else\n        face = direction.y > 0.0 ? 1.0 : 4.0;\n    } else {\n      if (absDirection.z > absDirection.y)\n        face = direction.z > 0.0 ? 2.0 : 5.0;\n      else\n        face = direction.y > 0.0 ? 1.0 : 4.0;\n    }\n    return face;\n}\nvec2 getUV(vec3 direction, float face) {\n    vec2 uv;\n    if (face == 0.0) {\n      uv = vec2(-direction.z, direction.y) / abs(direction.x);\n    } else if (face == 1.0) {\n      uv = vec2(direction.x, -direction.z) / abs(direction.y);\n    } else if (face == 2.0) {\n      uv = direction.xy / abs(direction.z);\n    } else if (face == 3.0) {\n      uv = vec2(direction.z, direction.y) / abs(direction.x);\n    } else if (face == 4.0) {\n      uv = direction.xz / abs(direction.y);\n    } else {\n      uv = vec2(-direction.x, direction.y) / abs(direction.z);\n    }\n    return 0.5 * (uv + 1.0);\n}\nvec3 bilinearCubeUV(sampler2D envMap, vec3 direction, float mipInt) {\n  float face = getFace(direction);\n  float filterInt = max(cubeUV_minMipLevel - mipInt, 0.0);\n  mipInt = max(mipInt, cubeUV_minMipLevel);\n  float faceSize = exp2(mipInt);\n  float texelSize = 1.0 / (3.0 * cubeUV_maxTileSize);\n  vec2 uv = getUV(direction, face) * (faceSize - 1.0);\n  vec2 f = fract(uv);\n  uv += 0.5 - f;\n  if (face > 2.0) {\n    uv.y += faceSize;\n    face -= 3.0;\n  }\n  uv.x += face * faceSize;\n  if(mipInt < cubeUV_maxMipLevel){\n    uv.y += 2.0 * cubeUV_maxTileSize;\n  }\n  uv.y += filterInt * 2.0 * cubeUV_minTileSize;\n  uv.x += 3.0 * max(0.0, cubeUV_maxTileSize - 2.0 * faceSize);\n  uv *= texelSize;\n  vec3 tl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n  uv.x += texelSize;\n  vec3 tr = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n  uv.y += texelSize;\n  vec3 br = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n  uv.x -= texelSize;\n  vec3 bl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n  vec3 tm = mix(tl, tr, f.x);\n  vec3 bm = mix(bl, br, f.x);\n  return mix(tm, bm, f.y);\n}\n#define r0 1.0\n#define v0 0.339\n#define m0 -2.0\n#define r1 0.8\n#define v1 0.276\n#define m1 -1.0\n#define r4 0.4\n#define v4 0.046\n#define m4 2.0\n#define r5 0.305\n#define v5 0.016\n#define m5 3.0\n#define r6 0.21\n#define v6 0.0038\n#define m6 4.0\nfloat roughnessToMip(float roughness) {\n  float mip = 0.0;\n  if (roughness >= r1) {\n    mip = (r0 - roughness) * (m1 - m0) / (r0 - r1) + m0;\n  } else if (roughness >= r4) {\n    mip = (r1 - roughness) * (m4 - m1) / (r1 - r4) + m1;\n  } else if (roughness >= r5) {\n    mip = (r4 - roughness) * (m5 - m4) / (r4 - r5) + m4;\n  } else if (roughness >= r6) {\n    mip = (r5 - roughness) * (m6 - m5) / (r5 - r6) + m5;\n  } else {\n    mip = -2.0 * log2(1.16 * roughness);  }\n  return mip;\n}\nvec4 textureCubeUV(sampler2D envMap, vec3 sampleDir, float roughness) {\n  float mip = clamp(roughnessToMip(roughness), m0, cubeUV_maxMipLevel);\n  float mipF = fract(mip);\n  float mipInt = floor(mip);\n  vec3 color0 = bilinearCubeUV(envMap, sampleDir, mipInt);\n  if (mipF == 0.0) {\n    return vec4(color0, 1.0);\n  } else {\n    vec3 color1 = bilinearCubeUV(envMap, sampleDir, mipInt + 1.0);\n    return vec4(mix(color0, color1, mipF), 1.0);\n  }\n}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",encodings_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = clamp( floor( D ) / 255.0, 0.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value )  {\n\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\n\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract( Le );\n\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\n\treturn vec4( max( vRGB, 0.0 ), 1.0 );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\t\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t}  else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifndef ENVMAP_TYPE_CUBE_UV\n\t\tenvColor = envMapTexelToLinear( envColor );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#if defined( USE_ENVMAP )\n\t#ifdef ENVMAP_MODE_REFRACTION\n\t\tuniform float refractionRatio;\n\t#endif\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float roughness, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat sigma = PI * roughness * roughness / ( 1.0 + roughness );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + log2( sigma );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t  vec3 reflectVec = reflect( -viewDir, normal );\n\t\t  reflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t#else\n\t\t  vec3 reflectVec = refract( -viewDir, normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( roughness, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) { \n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tfogDepth = -mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float fogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * fogDepth * fogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn texture2D( gradientMap, coord ).rgb;\n\t#else\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t#endif\n}",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\treflectedLight.indirectDiffuse += PI * lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n#endif",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in GeometricContext geometry ) {\n\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight  ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct ToonMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n#define Material_LightProbeLOD( material )\t(0)",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.specularRoughness = max( roughnessFactor, 0.0525 );material.specularRoughness += geometryRoughness;\nmaterial.specularRoughness = min( material.specularRoughness, 1.0 );\n#ifdef REFLECTIVITY\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#endif\n#ifdef CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheen;\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n#ifdef CLEARCOAT\n\tfloat clearcoat;\n\tfloat clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tvec3 sheenColor;\n#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearcoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3(    0, 1,    0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNL = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = ccDotNL * directLight.color;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tccIrradiance *= PI;\n\t\t#endif\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t\treflectedLight.directSpecular += ccIrradiance * material.clearcoat * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_Sheen(\n\t\t\tmaterial.specularRoughness,\n\t\t\tdirectLight.direction,\n\t\t\tgeometry,\n\t\t\tmaterial.sheenColor\n\t\t);\n\t#else\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.normal, material.specularColor, material.specularRoughness);\n\t#endif\n\treflectedLight.directDiffuse += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNV = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular += clearcoatRadiance * material.clearcoat * BRDF_Specular_GGX_Environment( geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t\tfloat ccDotNL = ccDotNV;\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\tfloat clearcoatInv = 1.0 - clearcoatDHR;\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tBRDF_Specular_Multiscattering_Environment( geometry, material.specularColor, material.specularRoughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += clearcoatInv * radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.normal, material.specularRoughness, maxMipLevel );\n\t#ifdef CLEARCOAT\n\t\tclearcoatRadiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness, maxMipLevel );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t#endif\n#endif",normal_fragment_begin:"#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t\tbitangent = bitangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;",normal_fragment_maps:"#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( -vViewPosition, normal, mapN );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\n\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\tvec3 N = normalize( surf_norm );\n\t\tmat3 tsn = mat3( S, T, N );\n\t\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN );\n\t#endif\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256.,  256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ));\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w);\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t  f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \n\t\t\t\t\t\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t  f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif",shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix  = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( ( color * ( 2.51 * color + 0.03 ) ) / ( color * ( 2.43 * color + 0.59 ) + 0.14 ) );\n}",uv_pars_fragment:"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif",uv_vertex:"#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif",uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_frag:"uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",cube_frag:"#include <envmap_common_pars_fragment>\nuniform float opacity;\nvarying vec3 vWorldDirection;\n#include <cube_uv_reflection_fragment>\nvoid main() {\n\tvec3 vReflect = vWorldDirection;\n\t#include <envmap_fragment>\n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",cube_vert:"varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}",depth_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvHighPrecisionZW = gl_Position.zw;\n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tvec4 texColor = texture2D( tEquirect, sampleUV );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",meshbasic_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}",meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\t#else\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\t#endif\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t\tmatcapColor = matcapTexelToLinear( matcapColor );\n\t#else\n\t\tvec4 matcapColor = vec4( 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <color_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#ifndef FLAT_SHADED\n\t\tvNormal = normalize( transformedNormal );\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\tvViewPosition = - mvPosition.xyz;\n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_toon_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_toon_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define REFLECTIVITY\n\t#define CLEARCOAT\n\t#define TRANSPARENCY\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef TRANSPARENCY\n\tuniform float transparency;\n#endif\n#ifdef REFLECTIVITY\n\tuniform float reflectivity;\n#endif\n#ifdef CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheen;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_physical_pars_fragment>\n#include <fog_pars_fragment>\n#include <lights_pars_begin>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <clearcoat_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <clearcoat_normal_fragment_begin>\n\t#include <clearcoat_normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#ifdef TRANSPARENCY\n\t\tdiffuseColor.a *= saturate( 1. - transparency + linearToRelativeLuminance( reflectedLight.directSpecular + reflectedLight.indirectSpecular ) );\n\t#endif\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}",normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",points_vert:"uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <fog_vertex>\n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",shadow_vert:"#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include <common>\n#include <uv_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}"},on={basic:{uniforms:Ht([$t.common,$t.specularmap,$t.envmap,$t.aomap,$t.lightmap,$t.fog]),vertexShader:an.meshbasic_vert,fragmentShader:an.meshbasic_frag},lambert:{uniforms:Ht([$t.common,$t.specularmap,$t.envmap,$t.aomap,$t.lightmap,$t.emissivemap,$t.fog,$t.lights,{emissive:{value:new Be(0)}}]),vertexShader:an.meshlambert_vert,fragmentShader:an.meshlambert_frag},phong:{uniforms:Ht([$t.common,$t.specularmap,$t.envmap,$t.aomap,$t.lightmap,$t.emissivemap,$t.bumpmap,$t.normalmap,$t.displacementmap,$t.fog,$t.lights,{emissive:{value:new Be(0)},specular:{value:new Be(1118481)},shininess:{value:30}}]),vertexShader:an.meshphong_vert,fragmentShader:an.meshphong_frag},standard:{uniforms:Ht([$t.common,$t.envmap,$t.aomap,$t.lightmap,$t.emissivemap,$t.bumpmap,$t.normalmap,$t.displacementmap,$t.roughnessmap,$t.metalnessmap,$t.fog,$t.lights,{emissive:{value:new Be(0)},roughness:{value:.5},metalness:{value:.5},envMapIntensity:{value:1}}]),vertexShader:an.meshphysical_vert,fragmentShader:an.meshphysical_frag},toon:{uniforms:Ht([$t.common,$t.specularmap,$t.aomap,$t.lightmap,$t.emissivemap,$t.bumpmap,$t.normalmap,$t.displacementmap,$t.gradientmap,$t.fog,$t.lights,{emissive:{value:new Be(0)},specular:{value:new Be(1118481)},shininess:{value:30}}]),vertexShader:an.meshtoon_vert,fragmentShader:an.meshtoon_frag},matcap:{uniforms:Ht([$t.common,$t.bumpmap,$t.normalmap,$t.displacementmap,$t.fog,{matcap:{value:null}}]),vertexShader:an.meshmatcap_vert,fragmentShader:an.meshmatcap_frag},points:{uniforms:Ht([$t.points,$t.fog]),vertexShader:an.points_vert,fragmentShader:an.points_frag},dashed:{uniforms:Ht([$t.common,$t.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:an.linedashed_vert,fragmentShader:an.linedashed_frag},depth:{uniforms:Ht([$t.common,$t.displacementmap]),vertexShader:an.depth_vert,fragmentShader:an.depth_frag},normal:{uniforms:Ht([$t.common,$t.bumpmap,$t.normalmap,$t.displacementmap,{opacity:{value:1}}]),vertexShader:an.normal_vert,fragmentShader:an.normal_frag},sprite:{uniforms:Ht([$t.sprite,$t.fog]),vertexShader:an.sprite_vert,fragmentShader:an.sprite_frag},background:{uniforms:{uvTransform:{value:new p},t2D:{value:null}},vertexShader:an.background_vert,fragmentShader:an.background_frag},cube:{uniforms:Ht([$t.envmap,{opacity:{value:1}}]),vertexShader:an.cube_vert,fragmentShader:an.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:an.equirect_vert,fragmentShader:an.equirect_frag},distanceRGBA:{uniforms:Ht([$t.common,$t.displacementmap,{referencePosition:{value:new w},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:an.distanceRGBA_vert,fragmentShader:an.distanceRGBA_frag},shadow:{uniforms:Ht([$t.lights,$t.fog,{color:{value:new Be(0)},opacity:{value:1}}]),vertexShader:an.shadow_vert,fragmentShader:an.shadow_frag}};function sn(e,t,n,r){var i,a,o=new Be(0),s=0,c=null,l=0,u=null;function h(e,n){t.buffers.color.setClear(e.r,e.g,e.b,n,r)}return{getClearColor:function(){return o},setClearColor:function(e,t){o.set(e),h(o,s=void 0!==t?t:1)},getClearAlpha:function(){return s},setClearAlpha:function(e){h(o,s=e)},render:function(t,r,p,d){var f=r.background,m=e.xr,g=m.getSession&&m.getSession();if(g&&"additive"===g.environmentBlendMode&&(f=null),null===f?h(o,s):f&&f.isColor&&(h(f,1),d=!0),(e.autoClear||d)&&e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),f&&(f.isCubeTexture||f.isWebGLCubeRenderTarget||306===f.mapping)){void 0===a&&((a=new Ct(new Ut(1,1,1),new Vt({type:"BackgroundCubeMaterial",uniforms:jt(on.cube.uniforms),vertexShader:on.cube.vertexShader,fragmentShader:on.cube.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1}))).geometry.deleteAttribute("normal"),a.geometry.deleteAttribute("uv"),a.onBeforeRender=function(e,t,n){this.matrixWorld.copyPosition(n.matrixWorld)},Object.defineProperty(a.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),n.update(a));var v=f.isWebGLCubeRenderTarget?f.texture:f;a.material.uniforms.envMap.value=v,a.material.uniforms.flipEnvMap.value=v.isCubeTexture?-1:1,c===f&&l===v.version&&u===e.toneMapping||(a.material.needsUpdate=!0,c=f,l=v.version,u=e.toneMapping),t.unshift(a,a.geometry,a.material,0,0,null)}else f&&f.isTexture&&(void 0===i&&((i=new Ct(new rn(2,2),new Vt({type:"BackgroundMaterial",uniforms:jt(on.background.uniforms),vertexShader:on.background.vertexShader,fragmentShader:on.background.fragmentShader,side:0,depthTest:!1,depthWrite:!1,fog:!1}))).geometry.deleteAttribute("normal"),Object.defineProperty(i.material,"map",{get:function(){return this.uniforms.t2D.value}}),n.update(i)),i.material.uniforms.t2D.value=f,!0===f.matrixAutoUpdate&&f.updateMatrix(),i.material.uniforms.uvTransform.value.copy(f.matrix),c===f&&l===f.version&&u===e.toneMapping||(i.material.needsUpdate=!0,c=f,l=f.version,u=e.toneMapping),t.unshift(i,i.geometry,i.material,0,0,null))}}}function cn(e,t,n,r){var i,a=r.isWebGL2;this.setMode=function(e){i=e},this.render=function(t,r){e.drawArrays(i,t,r),n.update(r,i)},this.renderInstances=function(r,o,s,c){if(0!==c){var l,u;if(a)l=e,u="drawArraysInstanced";else if(u="drawArraysInstancedANGLE",null===(l=t.get("ANGLE_instanced_arrays")))return void console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");l[u](i,o,s,c),n.update(s,i,c)}}}function ln(e,t,n){var r;function i(t){if("highp"===t){if(e.getShaderPrecisionFormat(35633,36338).precision>0&&e.getShaderPrecisionFormat(35632,36338).precision>0)return"highp";t="mediump"}return"mediump"===t&&e.getShaderPrecisionFormat(35633,36337).precision>0&&e.getShaderPrecisionFormat(35632,36337).precision>0?"mediump":"lowp"}var a="undefined"!=typeof WebGL2RenderingContext&&e instanceof WebGL2RenderingContext||"undefined"!=typeof WebGL2ComputeRenderingContext&&e instanceof WebGL2ComputeRenderingContext,o=void 0!==n.precision?n.precision:"highp",s=i(o);s!==o&&(console.warn("THREE.WebGLRenderer:",o,"not supported, using",s,"instead."),o=s);var c=!0===n.logarithmicDepthBuffer,l=e.getParameter(34930),u=e.getParameter(35660),h=e.getParameter(3379),p=e.getParameter(34076),d=e.getParameter(34921),f=e.getParameter(36347),m=e.getParameter(36348),g=e.getParameter(36349),v=u>0,y=a||!!t.get("OES_texture_float");return{isWebGL2:a,getMaxAnisotropy:function(){if(void 0!==r)return r;var n=t.get("EXT_texture_filter_anisotropic");return r=null!==n?e.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0},getMaxPrecision:i,precision:o,logarithmicDepthBuffer:c,maxTextures:l,maxVertexTextures:u,maxTextureSize:h,maxCubemapSize:p,maxAttributes:d,maxVertexUniforms:f,maxVaryings:m,maxFragmentUniforms:g,vertexTextures:v,floatFragmentTextures:y,floatVertexTextures:v&&y,maxSamples:a?e.getParameter(36183):0}}function un(){var e=this,t=null,n=0,r=!1,i=!1,a=new Se,o=new p,s={value:null,needsUpdate:!1};function c(){s.value!==t&&(s.value=t,s.needsUpdate=n>0),e.numPlanes=n,e.numIntersection=0}function l(t,n,r,i){var c=null!==t?t.length:0,l=null;if(0!==c){if(l=s.value,!0!==i||null===l){var u=r+4*c,h=n.matrixWorldInverse;o.getNormalMatrix(h),(null===l||l.length<u)&&(l=new Float32Array(u));for(var p=0,d=r;p!==c;++p,d+=4)a.copy(t[p]).applyMatrix4(h,o),a.normal.toArray(l,d),l[d+3]=a.constant}s.value=l,s.needsUpdate=!0}return e.numPlanes=c,e.numIntersection=0,l}this.uniform=s,this.numPlanes=0,this.numIntersection=0,this.init=function(e,i,a){var o=0!==e.length||i||0!==n||r;return r=i,t=l(e,a,0),n=e.length,o},this.beginShadows=function(){i=!0,l(null)},this.endShadows=function(){i=!1,c()},this.setState=function(e,a,o,u,h,p){if(!r||null===e||0===e.length||i&&!o)i?l(null):c();else{var d=i?0:n,f=4*d,m=h.clippingState||null;s.value=m,m=l(e,u,f,p);for(var g=0;g!==f;++g)m[g]=t[g];h.clippingState=m,this.numIntersection=a?this.numPlanes:0,this.numPlanes+=d}}}function hn(e){var t={};return{get:function(n){if(void 0!==t[n])return t[n];var r;switch(n){case"WEBGL_depth_texture":r=e.getExtension("WEBGL_depth_texture")||e.getExtension("MOZ_WEBGL_depth_texture")||e.getExtension("WEBKIT_WEBGL_depth_texture");break;case"EXT_texture_filter_anisotropic":r=e.getExtension("EXT_texture_filter_anisotropic")||e.getExtension("MOZ_EXT_texture_filter_anisotropic")||e.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case"WEBGL_compressed_texture_s3tc":r=e.getExtension("WEBGL_compressed_texture_s3tc")||e.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||e.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case"WEBGL_compressed_texture_pvrtc":r=e.getExtension("WEBGL_compressed_texture_pvrtc")||e.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;default:r=e.getExtension(n)}return null===r&&console.warn("THREE.WebGLRenderer: "+n+" extension not supported."),t[n]=r,r}}}function pn(e,t,n){var r=new WeakMap,i=new WeakMap;function a(e){var o=e.target,s=r.get(o);for(var c in null!==s.index&&t.remove(s.index),s.attributes)t.remove(s.attributes[c]);o.removeEventListener("dispose",a),r.delete(o);var l=i.get(s);l&&(t.remove(l),i.delete(s)),n.memory.geometries--}function o(e){var n=[],r=e.index,a=e.attributes.position,o=0;if(null!==r){var s=r.array;o=r.version;for(var c=0,l=s.length;c<l;c+=3){var u=s[c+0],h=s[c+1],p=s[c+2];n.push(u,h,h,p,p,u)}}else{s=a.array;o=a.version;for(c=0,l=s.length/3-1;c<l;c+=3){u=c+0,h=c+1,p=c+2;n.push(u,h,h,p,p,u)}}var d=new(at(n)>65535?tt:$e)(n,1);d.version=o,t.update(d,34963);var f=i.get(e);f&&t.remove(f),i.set(e,d)}return{get:function(e,t){var i=r.get(t);return i||(t.addEventListener("dispose",a),t.isBufferGeometry?i=t:t.isGeometry&&(void 0===t._bufferGeometry&&(t._bufferGeometry=(new dt).setFromObject(e)),i=t._bufferGeometry),r.set(t,i),n.memory.geometries++,i)},update:function(e){var n=e.index,r=e.attributes;for(var i in null!==n&&t.update(n,34963),r)t.update(r[i],34962);var a=e.morphAttributes;for(var i in a)for(var o=a[i],s=0,c=o.length;s<c;s++)t.update(o[s],34962)},getWireframeAttribute:function(e){var t=i.get(e);if(t){var n=e.index;null!==n&&t.version<n.version&&o(e)}else o(e);return i.get(e)}}}function dn(e,t,n,r){var i,a,o,s=r.isWebGL2;this.setMode=function(e){i=e},this.setIndex=function(e){a=e.type,o=e.bytesPerElement},this.render=function(t,r){e.drawElements(i,r,a,t*o),n.update(r,i)},this.renderInstances=function(r,c,l,u){if(0!==u){var h,p;if(s)h=e,p="drawElementsInstanced";else if(p="drawElementsInstancedANGLE",null===(h=t.get("ANGLE_instanced_arrays")))return void console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");h[p](i,l,a,c*o,u),n.update(l,i,u)}}}function fn(e){var t={frame:0,calls:0,triangles:0,points:0,lines:0};return{memory:{geometries:0,textures:0},render:t,programs:null,autoReset:!0,reset:function(){t.frame++,t.calls=0,t.triangles=0,t.points=0,t.lines=0},update:function(e,n,r){switch(r=r||1,t.calls++,n){case 4:t.triangles+=r*(e/3);break;case 1:t.lines+=r*(e/2);break;case 3:t.lines+=r*(e-1);break;case 2:t.lines+=r*e;break;case 0:t.points+=r*e;break;default:console.error("THREE.WebGLInfo: Unknown draw mode:",n)}}}}function mn(e,t){return Math.abs(t[1])-Math.abs(e[1])}function gn(e){var t={},n=new Float32Array(8);return{update:function(r,i,a,o){var s=r.morphTargetInfluences,c=void 0===s?0:s.length,l=t[i.id];if(void 0===l){l=[];for(var u=0;u<c;u++)l[u]=[u,0];t[i.id]=l}var h=a.morphTargets&&i.morphAttributes.position,p=a.morphNormals&&i.morphAttributes.normal;for(u=0;u<c;u++){0!==(f=l[u])[1]&&(h&&i.deleteAttribute("morphTarget"+u),p&&i.deleteAttribute("morphNormal"+u))}for(u=0;u<c;u++){(f=l[u])[0]=u,f[1]=s[u]}l.sort(mn);var d=0;for(u=0;u<8;u++){var f;if(f=l[u]){var m=f[0],g=f[1];if(g){h&&i.setAttribute("morphTarget"+u,h[m]),p&&i.setAttribute("morphNormal"+u,p[m]),n[u]=g,d+=g;continue}}n[u]=0}var v=i.morphTargetsRelative?1:1-d;o.getUniforms().setValue(e,"morphTargetBaseInfluence",v),o.getUniforms().setValue(e,"morphTargetInfluences",n)}}}function vn(e,t,n,r){var i=new WeakMap;return{update:function(e){var a=r.render.frame,o=e.geometry,s=t.get(e,o);return i.get(s)!==a&&(o.isGeometry&&s.updateFromObject(e),t.update(s),i.set(s,a)),e.isInstancedMesh&&n.update(e.instanceMatrix,34962),s},dispose:function(){i=new WeakMap}}}function yn(e,t,n,r,i,a,o,s,c,l){e=void 0!==e?e:[],t=void 0!==t?t:301,o=void 0!==o?o:1022,m.call(this,e,t,n,r,i,a,o,s,c,l),this.flipY=!1}function xn(e,t,n,r){m.call(this,null),this.image={data:e||null,width:t||1,height:n||1,depth:r||1},this.magFilter=1003,this.minFilter=1003,this.wrapR=1001,this.generateMipmaps=!1,this.flipY=!1,this.needsUpdate=!0}function bn(e,t,n,r){m.call(this,null),this.image={data:e||null,width:t||1,height:n||1,depth:r||1},this.magFilter=1003,this.minFilter=1003,this.wrapR=1001,this.generateMipmaps=!1,this.flipY=!1,this.needsUpdate=!0}on.physical={uniforms:Ht([on.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatNormalScale:{value:new h(1,1)},clearcoatNormalMap:{value:null},sheen:{value:new Be(0)},transparency:{value:0}}]),vertexShader:an.meshphysical_vert,fragmentShader:an.meshphysical_frag},yn.prototype=Object.create(m.prototype),yn.prototype.constructor=yn,yn.prototype.isCubeTexture=!0,Object.defineProperty(yn.prototype,"images",{get:function(){return this.image},set:function(e){this.image=e}}),xn.prototype=Object.create(m.prototype),xn.prototype.constructor=xn,xn.prototype.isDataTexture2DArray=!0,bn.prototype=Object.create(m.prototype),bn.prototype.constructor=bn,bn.prototype.isDataTexture3D=!0;var _n=new m,wn=new xn,Mn=new bn,Sn=new yn,En=[],Tn=[],An=new Float32Array(16),Ln=new Float32Array(9),Pn=new Float32Array(4);function Rn(e,t,n){var r=e[0];if(r<=0||r>0)return e;var i=t*n,a=En[i];if(void 0===a&&(a=new Float32Array(i),En[i]=a),0!==t){r.toArray(a,0);for(var o=1,s=0;o!==t;++o)s+=n,e[o].toArray(a,s)}return a}function Cn(e,t){if(e.length!==t.length)return!1;for(var n=0,r=e.length;n<r;n++)if(e[n]!==t[n])return!1;return!0}function On(e,t){for(var n=0,r=t.length;n<r;n++)e[n]=t[n]}function Dn(e,t){var n=Tn[t];void 0===n&&(n=new Int32Array(t),Tn[t]=n);for(var r=0;r!==t;++r)n[r]=e.allocateTextureUnit();return n}function Nn(e,t){var n=this.cache;n[0]!==t&&(e.uniform1f(this.addr,t),n[0]=t)}function In(e,t){var n=this.cache;if(void 0!==t.x)n[0]===t.x&&n[1]===t.y||(e.uniform2f(this.addr,t.x,t.y),n[0]=t.x,n[1]=t.y);else{if(Cn(n,t))return;e.uniform2fv(this.addr,t),On(n,t)}}function zn(e,t){var n=this.cache;if(void 0!==t.x)n[0]===t.x&&n[1]===t.y&&n[2]===t.z||(e.uniform3f(this.addr,t.x,t.y,t.z),n[0]=t.x,n[1]=t.y,n[2]=t.z);else if(void 0!==t.r)n[0]===t.r&&n[1]===t.g&&n[2]===t.b||(e.uniform3f(this.addr,t.r,t.g,t.b),n[0]=t.r,n[1]=t.g,n[2]=t.b);else{if(Cn(n,t))return;e.uniform3fv(this.addr,t),On(n,t)}}function kn(e,t){var n=this.cache;if(void 0!==t.x)n[0]===t.x&&n[1]===t.y&&n[2]===t.z&&n[3]===t.w||(e.uniform4f(this.addr,t.x,t.y,t.z,t.w),n[0]=t.x,n[1]=t.y,n[2]=t.z,n[3]=t.w);else{if(Cn(n,t))return;e.uniform4fv(this.addr,t),On(n,t)}}function Fn(e,t){var n=this.cache,r=t.elements;if(void 0===r){if(Cn(n,t))return;e.uniformMatrix2fv(this.addr,!1,t),On(n,t)}else{if(Cn(n,r))return;Pn.set(r),e.uniformMatrix2fv(this.addr,!1,Pn),On(n,r)}}function Bn(e,t){var n=this.cache,r=t.elements;if(void 0===r){if(Cn(n,t))return;e.uniformMatrix3fv(this.addr,!1,t),On(n,t)}else{if(Cn(n,r))return;Ln.set(r),e.uniformMatrix3fv(this.addr,!1,Ln),On(n,r)}}function Un(e,t){var n=this.cache,r=t.elements;if(void 0===r){if(Cn(n,t))return;e.uniformMatrix4fv(this.addr,!1,t),On(n,t)}else{if(Cn(n,r))return;An.set(r),e.uniformMatrix4fv(this.addr,!1,An),On(n,r)}}function jn(e,t,n){var r=this.cache,i=n.allocateTextureUnit();r[0]!==i&&(e.uniform1i(this.addr,i),r[0]=i),n.safeSetTexture2D(t||_n,i)}function Hn(e,t,n){var r=this.cache,i=n.allocateTextureUnit();r[0]!==i&&(e.uniform1i(this.addr,i),r[0]=i),n.setTexture2DArray(t||wn,i)}function Gn(e,t,n){var r=this.cache,i=n.allocateTextureUnit();r[0]!==i&&(e.uniform1i(this.addr,i),r[0]=i),n.setTexture3D(t||Mn,i)}function Vn(e,t,n){var r=this.cache,i=n.allocateTextureUnit();r[0]!==i&&(e.uniform1i(this.addr,i),r[0]=i),n.safeSetTextureCube(t||Sn,i)}function Wn(e,t){var n=this.cache;n[0]!==t&&(e.uniform1i(this.addr,t),n[0]=t)}function qn(e,t){var n=this.cache;Cn(n,t)||(e.uniform2iv(this.addr,t),On(n,t))}function Xn(e,t){var n=this.cache;Cn(n,t)||(e.uniform3iv(this.addr,t),On(n,t))}function Yn(e,t){var n=this.cache;Cn(n,t)||(e.uniform4iv(this.addr,t),On(n,t))}function Zn(e,t){var n=this.cache;n[0]!==t&&(e.uniform1ui(this.addr,t),n[0]=t)}function Jn(e,t){e.uniform1fv(this.addr,t)}function Qn(e,t){e.uniform1iv(this.addr,t)}function Kn(e,t){e.uniform2iv(this.addr,t)}function $n(e,t){e.uniform3iv(this.addr,t)}function er(e,t){e.uniform4iv(this.addr,t)}function tr(e,t){var n=Rn(t,this.size,2);e.uniform2fv(this.addr,n)}function nr(e,t){var n=Rn(t,this.size,3);e.uniform3fv(this.addr,n)}function rr(e,t){var n=Rn(t,this.size,4);e.uniform4fv(this.addr,n)}function ir(e,t){var n=Rn(t,this.size,4);e.uniformMatrix2fv(this.addr,!1,n)}function ar(e,t){var n=Rn(t,this.size,9);e.uniformMatrix3fv(this.addr,!1,n)}function or(e,t){var n=Rn(t,this.size,16);e.uniformMatrix4fv(this.addr,!1,n)}function sr(e,t,n){var r=t.length,i=Dn(n,r);e.uniform1iv(this.addr,i);for(var a=0;a!==r;++a)n.safeSetTexture2D(t[a]||_n,i[a])}function cr(e,t,n){var r=t.length,i=Dn(n,r);e.uniform1iv(this.addr,i);for(var a=0;a!==r;++a)n.safeSetTextureCube(t[a]||Sn,i[a])}function lr(e,t,n){this.id=e,this.addr=n,this.cache=[],this.setValue=function(e){switch(e){case 5126:return Nn;case 35664:return In;case 35665:return zn;case 35666:return kn;case 35674:return Fn;case 35675:return Bn;case 35676:return Un;case 5124:case 35670:return Wn;case 35667:case 35671:return qn;case 35668:case 35672:return Xn;case 35669:case 35673:return Yn;case 5125:return Zn;case 35678:case 36198:case 36298:case 36306:case 35682:return jn;case 35679:case 36299:case 36307:return Gn;case 35680:case 36300:case 36308:case 36293:return Vn;case 36289:case 36303:case 36311:case 36292:return Hn}}(t.type)}function ur(e,t,n){this.id=e,this.addr=n,this.cache=[],this.size=t.size,this.setValue=function(e){switch(e){case 5126:return Jn;case 35664:return tr;case 35665:return nr;case 35666:return rr;case 35674:return ir;case 35675:return ar;case 35676:return or;case 5124:case 35670:return Qn;case 35667:case 35671:return Kn;case 35668:case 35672:return $n;case 35669:case 35673:return er;case 35678:case 36198:case 36298:case 36306:case 35682:return sr;case 35680:case 36300:case 36308:case 36293:return cr}}(t.type)}function hr(e){this.id=e,this.seq=[],this.map={}}ur.prototype.updateCache=function(e){var t=this.cache;e instanceof Float32Array&&t.length!==e.length&&(this.cache=new Float32Array(e.length)),On(t,e)},hr.prototype.setValue=function(e,t,n){for(var r=this.seq,i=0,a=r.length;i!==a;++i){var o=r[i];o.setValue(e,t[o.id],n)}};var pr=/([\w\d_]+)(\])?(\[|\.)?/g;function dr(e,t){e.seq.push(t),e.map[t.id]=t}function fr(e,t,n){var r=e.name,i=r.length;for(pr.lastIndex=0;;){var a=pr.exec(r),o=pr.lastIndex,s=a[1],c="]"===a[2],l=a[3];if(c&&(s|=0),void 0===l||"["===l&&o+2===i){dr(n,void 0===l?new lr(s,e,t):new ur(s,e,t));break}var u=n.map[s];void 0===u&&dr(n,u=new hr(s)),n=u}}function mr(e,t){this.seq=[],this.map={};for(var n=e.getProgramParameter(t,35718),r=0;r<n;++r){var i=e.getActiveUniform(t,r);fr(i,e.getUniformLocation(t,i.name),this)}}function gr(e,t,n){var r=e.createShader(t);return e.shaderSource(r,n),e.compileShader(r),r}mr.prototype.setValue=function(e,t,n,r){var i=this.map[t];void 0!==i&&i.setValue(e,n,r)},mr.prototype.setOptional=function(e,t,n){var r=t[n];void 0!==r&&this.setValue(e,n,r)},mr.upload=function(e,t,n,r){for(var i=0,a=t.length;i!==a;++i){var o=t[i],s=n[o.id];!1!==s.needsUpdate&&o.setValue(e,s.value,r)}},mr.seqWithValue=function(e,t){for(var n=[],r=0,i=e.length;r!==i;++r){var a=e[r];a.id in t&&n.push(a)}return n};var vr=0;function yr(e){switch(e){case 3e3:return["Linear","( value )"];case 3001:return["sRGB","( value )"];case 3002:return["RGBE","( value )"];case 3004:return["RGBM","( value, 7.0 )"];case 3005:return["RGBM","( value, 16.0 )"];case 3006:return["RGBD","( value, 256.0 )"];case 3007:return["Gamma","( value, float( GAMMA_FACTOR ) )"];case 3003:return["LogLuv","( value )"];default:throw new Error("unsupported encoding: "+e)}}function xr(e,t,n){var r=e.getShaderParameter(t,35713),i=e.getShaderInfoLog(t).trim();return r&&""===i?"":"THREE.WebGLShader: gl.getShaderInfoLog() "+n+"\n"+i+function(e){for(var t=e.split("\n"),n=0;n<t.length;n++)t[n]=n+1+": "+t[n];return t.join("\n")}(e.getShaderSource(t))}function br(e,t){var n=yr(t);return"vec4 "+e+"( vec4 value ) { return "+n[0]+"ToLinear"+n[1]+"; }"}function _r(e,t){var n;switch(t){case 1:n="Linear";break;case 2:n="Reinhard";break;case 3:n="Uncharted2";break;case 4:n="OptimizedCineon";break;case 5:n="ACESFilmic";break;default:throw new Error("unsupported toneMapping: "+t)}return"vec3 "+e+"( vec3 color ) { return "+n+"ToneMapping( color ); }"}function wr(e){return""!==e}function Mr(e,t){return e.replace(/NUM_DIR_LIGHTS/g,t.numDirLights).replace(/NUM_SPOT_LIGHTS/g,t.numSpotLights).replace(/NUM_RECT_AREA_LIGHTS/g,t.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,t.numPointLights).replace(/NUM_HEMI_LIGHTS/g,t.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,t.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS/g,t.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,t.numPointLightShadows)}function Sr(e,t){return e.replace(/NUM_CLIPPING_PLANES/g,t.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,t.numClippingPlanes-t.numClipIntersection)}var Er=/^[ \t]*#include +<([\w\d./]+)>/gm;function Tr(e){return e.replace(Er,Ar)}function Ar(e,t){var n=an[t];if(void 0===n)throw new Error("Can not resolve #include <"+t+">");return Tr(n)}var Lr=/#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,Pr=/#pragma unroll_loop_start[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}[\s]+?#pragma unroll_loop_end/g;function Rr(e){return e.replace(Pr,Or).replace(Lr,Cr)}function Cr(e,t,n,r){return console.warn("WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead."),Or(e,t,n,r)}function Or(e,t,n,r){for(var i="",a=parseInt(t);a<parseInt(n);a++)i+=r.replace(/\[ i \]/g,"[ "+a+" ]").replace(/UNROLLED_LOOP_INDEX/g,a);return i}function Dr(e){var t="precision "+e.precision+" float;\nprecision "+e.precision+" int;";return"highp"===e.precision?t+="\n#define HIGH_PRECISION":"mediump"===e.precision?t+="\n#define MEDIUM_PRECISION":"lowp"===e.precision&&(t+="\n#define LOW_PRECISION"),t}function Nr(e,t,n){var r,i,a,o,s,c=e.getContext(),l=n.defines,u=n.vertexShader,h=n.fragmentShader,p=function(e){var t="SHADOWMAP_TYPE_BASIC";return 1===e.shadowMapType?t="SHADOWMAP_TYPE_PCF":2===e.shadowMapType?t="SHADOWMAP_TYPE_PCF_SOFT":3===e.shadowMapType&&(t="SHADOWMAP_TYPE_VSM"),t}(n),d=function(e){var t="ENVMAP_TYPE_CUBE";if(e.envMap)switch(e.envMapMode){case 301:case 302:t="ENVMAP_TYPE_CUBE";break;case 306:case 307:t="ENVMAP_TYPE_CUBE_UV";break;case 303:case 304:t="ENVMAP_TYPE_EQUIREC";break;case 305:t="ENVMAP_TYPE_SPHERE"}return t}(n),f=function(e){var t="ENVMAP_MODE_REFLECTION";if(e.envMap)switch(e.envMapMode){case 302:case 304:t="ENVMAP_MODE_REFRACTION"}return t}(n),m=function(e){var t="ENVMAP_BLENDING_NONE";if(e.envMap)switch(e.combine){case 0:t="ENVMAP_BLENDING_MULTIPLY";break;case 1:t="ENVMAP_BLENDING_MIX";break;case 2:t="ENVMAP_BLENDING_ADD"}return t}(n),g=e.gammaFactor>0?e.gammaFactor:1,v=n.isWebGL2?"":function(e){return[e.extensionDerivatives||e.envMapCubeUV||e.bumpMap||e.tangentSpaceNormalMap||e.clearcoatNormalMap||e.flatShading||"physical"===e.shaderID?"#extension GL_OES_standard_derivatives : enable":"",(e.extensionFragDepth||e.logarithmicDepthBuffer)&&e.rendererExtensionFragDepth?"#extension GL_EXT_frag_depth : enable":"",e.extensionDrawBuffers&&e.rendererExtensionDrawBuffers?"#extension GL_EXT_draw_buffers : require":"",(e.extensionShaderTextureLOD||e.envMap)&&e.rendererExtensionShaderTextureLod?"#extension GL_EXT_shader_texture_lod : enable":""].filter(wr).join("\n")}(n),y=function(e){var t=[];for(var n in e){var r=e[n];!1!==r&&t.push("#define "+n+" "+r)}return t.join("\n")}(l),x=c.createProgram();if(n.isRawShaderMaterial?((r=[y].filter(wr).join("\n")).length>0&&(r+="\n"),(i=[v,y].filter(wr).join("\n")).length>0&&(i+="\n")):(r=[Dr(n),"#define SHADER_NAME "+n.shaderName,y,n.instancing?"#define USE_INSTANCING":"",n.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+g,"#define MAX_BONES "+n.maxBones,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+f:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMap&&n.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",n.normalMap&&n.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.displacementMap&&n.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.vertexTangents?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexUvs?"#define USE_UV":"",n.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",n.flatShading?"#define FLAT_SHADED":"",n.skinning?"#define USE_SKINNING":"",n.useVertexTexture?"#define BONE_TEXTURE":"",n.morphTargets?"#define USE_MORPHTARGETS":"",n.morphNormals&&!1===n.flatShading?"#define USE_MORPHNORMALS":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+p:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.logarithmicDepthBuffer&&n.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING"," attribute mat4 instanceMatrix;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#ifdef USE_COLOR","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(wr).join("\n"),i=[v,Dr(n),"#define SHADER_NAME "+n.shaderName,y,n.alphaTest?"#define ALPHATEST "+n.alphaTest+(n.alphaTest%1?"":".0"):"","#define GAMMA_FACTOR "+g,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.matcap?"#define USE_MATCAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+d:"",n.envMap?"#define "+f:"",n.envMap?"#define "+m:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMap&&n.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",n.normalMap&&n.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.sheen?"#define USE_SHEEN":"",n.vertexTangents?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexUvs?"#define USE_UV":"",n.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",n.gradientMap?"#define USE_GRADIENTMAP":"",n.flatShading?"#define FLAT_SHADED":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+p:"",n.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",n.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.logarithmicDepthBuffer&&n.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"",(n.extensionShaderTextureLOD||n.envMap)&&n.rendererExtensionShaderTextureLod?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",0!==n.toneMapping?"#define TONE_MAPPING":"",0!==n.toneMapping?an.tonemapping_pars_fragment:"",0!==n.toneMapping?_r("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.outputEncoding||n.mapEncoding||n.matcapEncoding||n.envMapEncoding||n.emissiveMapEncoding||n.lightMapEncoding?an.encodings_pars_fragment:"",n.mapEncoding?br("mapTexelToLinear",n.mapEncoding):"",n.matcapEncoding?br("matcapTexelToLinear",n.matcapEncoding):"",n.envMapEncoding?br("envMapTexelToLinear",n.envMapEncoding):"",n.emissiveMapEncoding?br("emissiveMapTexelToLinear",n.emissiveMapEncoding):"",n.lightMapEncoding?br("lightMapTexelToLinear",n.lightMapEncoding):"",n.outputEncoding?(a="linearToOutputTexel",o=n.outputEncoding,s=yr(o),"vec4 "+a+"( vec4 value ) { return LinearTo"+s[0]+s[1]+"; }"):"",n.depthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(wr).join("\n")),u=Sr(u=Mr(u=Tr(u),n),n),h=Sr(h=Mr(h=Tr(h),n),n),u=Rr(u),h=Rr(h),n.isWebGL2&&!n.isRawShaderMaterial){var b=!1,_=/^\s*#version\s+300\s+es\s*\n/;n.isShaderMaterial&&null!==u.match(_)&&null!==h.match(_)&&(b=!0,u=u.replace(_,""),h=h.replace(_,"")),r=["#version 300 es\n","#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+r,i=["#version 300 es\n","#define varying in",b?"":"out highp vec4 pc_fragColor;",b?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+i}var w,M,S=i+h,E=gr(c,35633,r+u),T=gr(c,35632,S);if(c.attachShader(x,E),c.attachShader(x,T),void 0!==n.index0AttributeName?c.bindAttribLocation(x,0,n.index0AttributeName):!0===n.morphTargets&&c.bindAttribLocation(x,0,"position"),c.linkProgram(x),e.debug.checkShaderErrors){var A=c.getProgramInfoLog(x).trim(),L=c.getShaderInfoLog(E).trim(),P=c.getShaderInfoLog(T).trim(),R=!0,C=!0;if(!1===c.getProgramParameter(x,35714)){R=!1;var O=xr(c,E,"vertex"),D=xr(c,T,"fragment");console.error("THREE.WebGLProgram: shader error: ",c.getError(),"35715",c.getProgramParameter(x,35715),"gl.getProgramInfoLog",A,O,D)}else""!==A?console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",A):""!==L&&""!==P||(C=!1);C&&(this.diagnostics={runnable:R,programLog:A,vertexShader:{log:L,prefix:r},fragmentShader:{log:P,prefix:i}})}return c.detachShader(x,E),c.detachShader(x,T),c.deleteShader(E),c.deleteShader(T),this.getUniforms=function(){return void 0===w&&(w=new mr(c,x)),w},this.getAttributes=function(){return void 0===M&&(M=function(e,t){for(var n={},r=e.getProgramParameter(t,35721),i=0;i<r;i++){var a=e.getActiveAttrib(t,i).name;n[a]=e.getAttribLocation(t,a)}return n}(c,x)),M},this.destroy=function(){c.deleteProgram(x),this.program=void 0},this.name=n.shaderName,this.id=vr++,this.cacheKey=t,this.usedTimes=1,this.program=x,this.vertexShader=E,this.fragmentShader=T,this}function Ir(e,t,n){var r=[],i=n.isWebGL2,a=n.logarithmicDepthBuffer,o=n.floatVertexTextures,s=n.precision,c=n.maxVertexUniforms,l=n.vertexTextures,u={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"},h=["precision","isWebGL2","supportsVertexTextures","outputEncoding","instancing","map","mapEncoding","matcap","matcapEncoding","envMap","envMapMode","envMapEncoding","envMapCubeUV","lightMap","lightMapEncoding","aoMap","emissiveMap","emissiveMapEncoding","bumpMap","normalMap","objectSpaceNormalMap","tangentSpaceNormalMap","clearcoatMap","clearcoatRoughnessMap","clearcoatNormalMap","displacementMap","specularMap","roughnessMap","metalnessMap","gradientMap","alphaMap","combine","vertexColors","vertexTangents","vertexUvs","uvsVertexOnly","fog","useFog","fogExp2","flatShading","sizeAttenuation","logarithmicDepthBuffer","skinning","maxBones","useVertexTexture","morphTargets","morphNormals","maxMorphTargets","maxMorphNormals","premultipliedAlpha","numDirLights","numPointLights","numSpotLights","numHemiLights","numRectAreaLights","numDirLightShadows","numPointLightShadows","numSpotLightShadows","shadowMapEnabled","shadowMapType","toneMapping","physicallyCorrectLights","alphaTest","doubleSided","flipSided","numClippingPlanes","numClipIntersection","depthPacking","dithering","sheen"];function p(e){var t;return e?e.isTexture?t=e.encoding:e.isWebGLRenderTarget&&(console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."),t=e.texture.encoding):t=3e3,t}this.getParameters=function(r,h,d,f,m,g,v){var y=f.fog,x=r.isMeshStandardMaterial?f.environment:null,b=r.envMap||x,_=u[r.type],w=v.isSkinnedMesh?function(e){var t=e.skeleton.bones;if(o)return 1024;var n=c,r=Math.floor((n-20)/4),i=Math.min(r,t.length);return i<t.length?(console.warn("THREE.WebGLRenderer: Skeleton has "+t.length+" bones. This GPU supports "+i+"."),0):i}(v):0;null!==r.precision&&(s=n.getMaxPrecision(r.precision))!==r.precision&&console.warn("THREE.WebGLProgram.getParameters:",r.precision,"not supported, using",s,"instead.");var M=function(e,t){var n;if(t){var r=on[t];n={name:e.type,uniforms:Gt.clone(r.uniforms),vertexShader:r.vertexShader,fragmentShader:r.fragmentShader}}else n={name:e.type,uniforms:e.uniforms,vertexShader:e.vertexShader,fragmentShader:e.fragmentShader};return n}(r,_);r.onBeforeCompile(M,e);var S=e.getRenderTarget();return{isWebGL2:i,shaderID:_,shaderName:M.name,uniforms:M.uniforms,vertexShader:M.vertexShader,fragmentShader:M.fragmentShader,defines:r.defines,isRawShaderMaterial:r.isRawShaderMaterial,isShaderMaterial:r.isShaderMaterial,precision:s,instancing:!0===v.isInstancedMesh,supportsVertexTextures:l,outputEncoding:null!==S?p(S.texture):e.outputEncoding,map:!!r.map,mapEncoding:p(r.map),matcap:!!r.matcap,matcapEncoding:p(r.matcap),envMap:!!b,envMapMode:b&&b.mapping,envMapEncoding:p(b),envMapCubeUV:!!b&&(306===b.mapping||307===b.mapping),lightMap:!!r.lightMap,lightMapEncoding:p(r.lightMap),aoMap:!!r.aoMap,emissiveMap:!!r.emissiveMap,emissiveMapEncoding:p(r.emissiveMap),bumpMap:!!r.bumpMap,normalMap:!!r.normalMap,objectSpaceNormalMap:1===r.normalMapType,tangentSpaceNormalMap:0===r.normalMapType,clearcoatMap:!!r.clearcoatMap,clearcoatRoughnessMap:!!r.clearcoatRoughnessMap,clearcoatNormalMap:!!r.clearcoatNormalMap,displacementMap:!!r.displacementMap,roughnessMap:!!r.roughnessMap,metalnessMap:!!r.metalnessMap,specularMap:!!r.specularMap,alphaMap:!!r.alphaMap,gradientMap:!!r.gradientMap,sheen:!!r.sheen,combine:r.combine,vertexTangents:r.normalMap&&r.vertexTangents,vertexColors:r.vertexColors,vertexUvs:!!(r.map||r.bumpMap||r.normalMap||r.specularMap||r.alphaMap||r.emissiveMap||r.roughnessMap||r.metalnessMap||r.clearcoatMap||r.clearcoatRoughnessMap||r.clearcoatNormalMap||r.displacementMap),uvsVertexOnly:!(r.map||r.bumpMap||r.normalMap||r.specularMap||r.alphaMap||r.emissiveMap||r.roughnessMap||r.metalnessMap||r.clearcoatNormalMap||!r.displacementMap),fog:!!y,useFog:r.fog,fogExp2:y&&y.isFogExp2,flatShading:r.flatShading,sizeAttenuation:r.sizeAttenuation,logarithmicDepthBuffer:a,skinning:r.skinning&&w>0,maxBones:w,useVertexTexture:o,morphTargets:r.morphTargets,morphNormals:r.morphNormals,maxMorphTargets:e.maxMorphTargets,maxMorphNormals:e.maxMorphNormals,numDirLights:h.directional.length,numPointLights:h.point.length,numSpotLights:h.spot.length,numRectAreaLights:h.rectArea.length,numHemiLights:h.hemi.length,numDirLightShadows:h.directionalShadowMap.length,numPointLightShadows:h.pointShadowMap.length,numSpotLightShadows:h.spotShadowMap.length,numClippingPlanes:m,numClipIntersection:g,dithering:r.dithering,shadowMapEnabled:e.shadowMap.enabled&&d.length>0,shadowMapType:e.shadowMap.type,toneMapping:r.toneMapped?e.toneMapping:0,physicallyCorrectLights:e.physicallyCorrectLights,premultipliedAlpha:r.premultipliedAlpha,alphaTest:r.alphaTest,doubleSided:2===r.side,flipSided:1===r.side,depthPacking:void 0!==r.depthPacking&&r.depthPacking,index0AttributeName:r.index0AttributeName,extensionDerivatives:r.extensions&&r.extensions.derivatives,extensionFragDepth:r.extensions&&r.extensions.fragDepth,extensionDrawBuffers:r.extensions&&r.extensions.drawBuffers,extensionShaderTextureLOD:r.extensions&&r.extensions.shaderTextureLOD,rendererExtensionFragDepth:i||null!==t.get("EXT_frag_depth"),rendererExtensionDrawBuffers:i||null!==t.get("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:i||null!==t.get("EXT_shader_texture_lod"),onBeforeCompile:r.onBeforeCompile}},this.getProgramCacheKey=function(t){var n=[];if(t.shaderID?n.push(t.shaderID):(n.push(t.fragmentShader),n.push(t.vertexShader)),void 0!==t.defines)for(var r in t.defines)n.push(r),n.push(t.defines[r]);if(void 0===t.isRawShaderMaterial){for(var i=0;i<h.length;i++)n.push(t[h[i]]);n.push(e.outputEncoding),n.push(e.gammaFactor)}return n.push(t.onBeforeCompile.toString()),n.join()},this.acquireProgram=function(t,n){for(var i,a=0,o=r.length;a<o;a++){var s=r[a];if(s.cacheKey===n){++(i=s).usedTimes;break}}return void 0===i&&(i=new Nr(e,n,t),r.push(i)),i},this.releaseProgram=function(e){if(0==--e.usedTimes){var t=r.indexOf(e);r[t]=r[r.length-1],r.pop(),e.destroy()}},this.programs=r}function zr(){var e=new WeakMap;return{get:function(t){var n=e.get(t);return void 0===n&&(n={},e.set(t,n)),n},remove:function(t){e.delete(t)},update:function(t,n,r){e.get(t)[n]=r},dispose:function(){e=new WeakMap}}}function kr(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.program!==t.program?e.program.id-t.program.id:e.material.id!==t.material.id?e.material.id-t.material.id:e.z!==t.z?e.z-t.z:e.id-t.id}function Fr(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function Br(){var e=[],t=0,n=[],r=[],i={id:-1};function a(n,r,a,o,s,c){var l=e[t];return void 0===l?(l={id:n.id,object:n,geometry:r,material:a,program:a.program||i,groupOrder:o,renderOrder:n.renderOrder,z:s,group:c},e[t]=l):(l.id=n.id,l.object=n,l.geometry=r,l.material=a,l.program=a.program||i,l.groupOrder=o,l.renderOrder=n.renderOrder,l.z=s,l.group=c),t++,l}return{opaque:n,transparent:r,init:function(){t=0,n.length=0,r.length=0},push:function(e,t,i,o,s,c){var l=a(e,t,i,o,s,c);(!0===i.transparent?r:n).push(l)},unshift:function(e,t,i,o,s,c){var l=a(e,t,i,o,s,c);(!0===i.transparent?r:n).unshift(l)},finish:function(){for(var n=t,r=e.length;n<r;n++){var i=e[n];if(null===i.id)break;i.id=null,i.object=null,i.geometry=null,i.material=null,i.program=null,i.group=null}},sort:function(e,t){n.length>1&&n.sort(e||kr),r.length>1&&r.sort(t||Fr)}}}function Ur(){var e=new WeakMap;function t(n){var r=n.target;r.removeEventListener("dispose",t),e.delete(r)}return{get:function(n,r){var i,a=e.get(n);return void 0===a?(i=new Br,e.set(n,new WeakMap),e.get(n).set(r,i),n.addEventListener("dispose",t)):void 0===(i=a.get(r))&&(i=new Br,a.set(r,i)),i},dispose:function(){e=new WeakMap}}}function jr(){var e={};return{get:function(t){if(void 0!==e[t.id])return e[t.id];var n;switch(t.type){case"DirectionalLight":n={direction:new w,color:new Be};break;case"SpotLight":n={position:new w,direction:new w,color:new Be,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":n={position:new w,color:new Be,distance:0,decay:0};break;case"HemisphereLight":n={direction:new w,skyColor:new Be,groundColor:new Be};break;case"RectAreaLight":n={color:new Be,position:new w,halfWidth:new w,halfHeight:new w}}return e[t.id]=n,n}}}var Hr=0;function Gr(e,t){return(t.castShadow?1:0)-(e.castShadow?1:0)}function Vr(){for(var e,t=new jr,n=(e={},{get:function(t){if(void 0!==e[t.id])return e[t.id];var n;switch(t.type){case"DirectionalLight":case"SpotLight":n={shadowBias:0,shadowRadius:1,shadowMapSize:new h};break;case"PointLight":n={shadowBias:0,shadowRadius:1,shadowMapSize:new h,shadowCameraNear:1,shadowCameraFar:1e3}}return e[t.id]=n,n}}),r={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadow:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]},i=0;i<9;i++)r.probe.push(new w);var a=new w,o=new R,s=new R;return{setup:function(e,i,c){for(var l=0,u=0,h=0,p=0;p<9;p++)r.probe[p].set(0,0,0);var d=0,f=0,m=0,g=0,v=0,y=0,x=0,b=0,_=c.matrixWorldInverse;e.sort(Gr),p=0;for(var w=e.length;p<w;p++){var M=e[p],S=M.color,E=M.intensity,T=M.distance,A=M.shadow&&M.shadow.map?M.shadow.map.texture:null;if(M.isAmbientLight)l+=S.r*E,u+=S.g*E,h+=S.b*E;else if(M.isLightProbe)for(var L=0;L<9;L++)r.probe[L].addScaledVector(M.sh.coefficients[L],E);else if(M.isDirectionalLight){if((C=t.get(M)).color.copy(M.color).multiplyScalar(M.intensity),C.direction.setFromMatrixPosition(M.matrixWorld),a.setFromMatrixPosition(M.target.matrixWorld),C.direction.sub(a),C.direction.transformDirection(_),M.castShadow){var P=M.shadow;(R=n.get(M)).shadowBias=P.bias,R.shadowRadius=P.radius,R.shadowMapSize=P.mapSize,r.directionalShadow[d]=R,r.directionalShadowMap[d]=A,r.directionalShadowMatrix[d]=M.shadow.matrix,y++}r.directional[d]=C,d++}else if(M.isSpotLight){if((C=t.get(M)).position.setFromMatrixPosition(M.matrixWorld),C.position.applyMatrix4(_),C.color.copy(S).multiplyScalar(E),C.distance=T,C.direction.setFromMatrixPosition(M.matrixWorld),a.setFromMatrixPosition(M.target.matrixWorld),C.direction.sub(a),C.direction.transformDirection(_),C.coneCos=Math.cos(M.angle),C.penumbraCos=Math.cos(M.angle*(1-M.penumbra)),C.decay=M.decay,M.castShadow){P=M.shadow;(R=n.get(M)).shadowBias=P.bias,R.shadowRadius=P.radius,R.shadowMapSize=P.mapSize,r.spotShadow[m]=R,r.spotShadowMap[m]=A,r.spotShadowMatrix[m]=M.shadow.matrix,b++}r.spot[m]=C,m++}else if(M.isRectAreaLight){(C=t.get(M)).color.copy(S).multiplyScalar(E),C.position.setFromMatrixPosition(M.matrixWorld),C.position.applyMatrix4(_),s.identity(),o.copy(M.matrixWorld),o.premultiply(_),s.extractRotation(o),C.halfWidth.set(.5*M.width,0,0),C.halfHeight.set(0,.5*M.height,0),C.halfWidth.applyMatrix4(s),C.halfHeight.applyMatrix4(s),r.rectArea[g]=C,g++}else if(M.isPointLight){if((C=t.get(M)).position.setFromMatrixPosition(M.matrixWorld),C.position.applyMatrix4(_),C.color.copy(M.color).multiplyScalar(M.intensity),C.distance=M.distance,C.decay=M.decay,M.castShadow){var R;P=M.shadow;(R=n.get(M)).shadowBias=P.bias,R.shadowRadius=P.radius,R.shadowMapSize=P.mapSize,R.shadowCameraNear=P.camera.near,R.shadowCameraFar=P.camera.far,r.pointShadow[f]=R,r.pointShadowMap[f]=A,r.pointShadowMatrix[f]=M.shadow.matrix,x++}r.point[f]=C,f++}else if(M.isHemisphereLight){var C;(C=t.get(M)).direction.setFromMatrixPosition(M.matrixWorld),C.direction.transformDirection(_),C.direction.normalize(),C.skyColor.copy(M.color).multiplyScalar(E),C.groundColor.copy(M.groundColor).multiplyScalar(E),r.hemi[v]=C,v++}}r.ambient[0]=l,r.ambient[1]=u,r.ambient[2]=h;var O=r.hash;O.directionalLength===d&&O.pointLength===f&&O.spotLength===m&&O.rectAreaLength===g&&O.hemiLength===v&&O.numDirectionalShadows===y&&O.numPointShadows===x&&O.numSpotShadows===b||(r.directional.length=d,r.spot.length=m,r.rectArea.length=g,r.point.length=f,r.hemi.length=v,r.directionalShadow.length=y,r.directionalShadowMap.length=y,r.pointShadow.length=x,r.pointShadowMap.length=x,r.spotShadow.length=b,r.spotShadowMap.length=b,r.directionalShadowMatrix.length=y,r.pointShadowMatrix.length=x,r.spotShadowMatrix.length=b,O.directionalLength=d,O.pointLength=f,O.spotLength=m,O.rectAreaLength=g,O.hemiLength=v,O.numDirectionalShadows=y,O.numPointShadows=x,O.numSpotShadows=b,r.version=Hr++)},state:r}}function Wr(){var e=new Vr,t=[],n=[];return{init:function(){t.length=0,n.length=0},state:{lightsArray:t,shadowsArray:n,lights:e},setupLights:function(r){e.setup(t,n,r)},pushLight:function(e){t.push(e)},pushShadow:function(e){n.push(e)}}}function qr(){var e=new WeakMap;function t(n){var r=n.target;r.removeEventListener("dispose",t),e.delete(r)}return{get:function(n,r){var i;return!1===e.has(n)?(i=new Wr,e.set(n,new WeakMap),e.get(n).set(r,i),n.addEventListener("dispose",t)):!1===e.get(n).has(r)?(i=new Wr,e.get(n).set(r,i)):i=e.get(n).get(r),i},dispose:function(){e=new WeakMap}}}function Xr(e){We.call(this),this.type="MeshDepthMaterial",this.depthPacking=3200,this.skinning=!1,this.morphTargets=!1,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.setValues(e)}function Yr(e){We.call(this),this.type="MeshDistanceMaterial",this.referencePosition=new w,this.nearDistance=1,this.farDistance=1e3,this.skinning=!1,this.morphTargets=!1,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.fog=!1,this.setValues(e)}Xr.prototype=Object.create(We.prototype),Xr.prototype.constructor=Xr,Xr.prototype.isMeshDepthMaterial=!0,Xr.prototype.copy=function(e){return We.prototype.copy.call(this,e),this.depthPacking=e.depthPacking,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this},Yr.prototype=Object.create(We.prototype),Yr.prototype.constructor=Yr,Yr.prototype.isMeshDistanceMaterial=!0,Yr.prototype.copy=function(e){return We.prototype.copy.call(this,e),this.referencePosition.copy(e.referencePosition),this.nearDistance=e.nearDistance,this.farDistance=e.farDistance,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this};function Zr(e,t,n){var r=new Kt,i=new h,a=new h,o=new g,s=[],c=[],l={},u={0:1,1:0,2:2},p=new Vt({defines:{SAMPLE_RATE:2/8,HALF_SAMPLE_RATE:1/8},uniforms:{shadow_pass:{value:null},resolution:{value:new h},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include <packing>\nvoid main() {\n  float mean = 0.0;\n  float squared_mean = 0.0;\n\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy  ) / resolution ) );\n  for ( float i = -1.0; i < 1.0 ; i += SAMPLE_RATE) {\n    #ifdef HORIZONAL_PASS\n      vec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( i, 0.0 ) * radius ) / resolution ) );\n      mean += distribution.x;\n      squared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n    #else\n      float depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0,  i )  * radius ) / resolution ) );\n      mean += depth;\n      squared_mean += depth * depth;\n    #endif\n  }\n  mean = mean * HALF_SAMPLE_RATE;\n  squared_mean = squared_mean * HALF_SAMPLE_RATE;\n  float std_dev = sqrt( squared_mean - mean * mean );\n  gl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),d=p.clone();d.defines.HORIZONAL_PASS=1;var f=new dt;f.setAttribute("position",new Ye(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));var m=new Ct(f,p),y=this;function x(n,r){var i=t.update(m);p.uniforms.shadow_pass.value=n.map.texture,p.uniforms.resolution.value=n.mapSize,p.uniforms.radius.value=n.radius,e.setRenderTarget(n.mapPass),e.clear(),e.renderBufferDirect(r,null,i,p,m,null),d.uniforms.shadow_pass.value=n.mapPass.texture,d.uniforms.resolution.value=n.mapSize,d.uniforms.radius.value=n.radius,e.setRenderTarget(n.map),e.clear(),e.renderBufferDirect(r,null,i,d,m,null)}function b(e,t,n){var r=e<<0|t<<1|n<<2,i=s[r];return void 0===i&&(i=new Xr({depthPacking:3201,morphTargets:e,skinning:t}),s[r]=i),i}function _(e,t,n){var r=e<<0|t<<1|n<<2,i=c[r];return void 0===i&&(i=new Yr({morphTargets:e,skinning:t}),c[r]=i),i}function w(t,n,r,i,a,o){var s=t.geometry,c=null,h=b,p=t.customDepthMaterial;if(!0===r.isPointLight&&(h=_,p=t.customDistanceMaterial),void 0===p){var d=!1;!0===n.morphTargets&&(!0===s.isBufferGeometry?d=s.morphAttributes&&s.morphAttributes.position&&s.morphAttributes.position.length>0:!0===s.isGeometry&&(d=s.morphTargets&&s.morphTargets.length>0));var f=!1;!0===t.isSkinnedMesh&&(!0===n.skinning?f=!0:console.warn("THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:",t)),c=h(d,f,!0===t.isInstancedMesh)}else c=p;if(e.localClippingEnabled&&!0===n.clipShadows&&0!==n.clippingPlanes.length){var m=c.uuid,g=n.uuid,v=l[m];void 0===v&&(v={},l[m]=v);var y=v[g];void 0===y&&(y=c.clone(),v[g]=y),c=y}return c.visible=n.visible,c.wireframe=n.wireframe,c.side=3===o?null!==n.shadowSide?n.shadowSide:n.side:null!==n.shadowSide?n.shadowSide:u[n.side],c.clipShadows=n.clipShadows,c.clippingPlanes=n.clippingPlanes,c.clipIntersection=n.clipIntersection,c.wireframeLinewidth=n.wireframeLinewidth,c.linewidth=n.linewidth,!0===r.isPointLight&&!0===c.isMeshDistanceMaterial&&(c.referencePosition.setFromMatrixPosition(r.matrixWorld),c.nearDistance=i,c.farDistance=a),c}function M(n,i,a,o,s){if(!1!==n.visible){if(n.layers.test(i.layers)&&(n.isMesh||n.isLine||n.isPoints)&&(n.castShadow||n.receiveShadow&&3===s)&&(!n.frustumCulled||r.intersectsObject(n))){n.modelViewMatrix.multiplyMatrices(a.matrixWorldInverse,n.matrixWorld);var c=t.update(n),l=n.material;if(Array.isArray(l))for(var u=c.groups,h=0,p=u.length;h<p;h++){var d=u[h],f=l[d.materialIndex];if(f&&f.visible){var m=w(n,f,o,a.near,a.far,s);e.renderBufferDirect(a,null,c,m,n,d)}}else if(l.visible){m=w(n,l,o,a.near,a.far,s);e.renderBufferDirect(a,null,c,m,n,null)}}for(var g=n.children,v=0,y=g.length;v<y;v++)M(g[v],i,a,o,s)}}this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=1,this.render=function(t,s,c){if(!1!==y.enabled&&(!1!==y.autoUpdate||!1!==y.needsUpdate)&&0!==t.length){var l=e.getRenderTarget(),u=e.getActiveCubeFace(),h=e.getActiveMipmapLevel(),p=e.state;p.setBlending(0),p.buffers.color.setClear(1,1,1,1),p.buffers.depth.setTest(!0),p.setScissorTest(!1);for(var d=0,f=t.length;d<f;d++){var m=t[d],g=m.shadow;if(void 0!==g){i.copy(g.mapSize);var b=g.getFrameExtents();if(i.multiply(b),a.copy(g.mapSize),(i.x>n||i.y>n)&&(console.warn("THREE.WebGLShadowMap:",m,"has shadow exceeding max texture size, reducing"),i.x>n&&(a.x=Math.floor(n/b.x),i.x=a.x*b.x,g.mapSize.x=a.x),i.y>n&&(a.y=Math.floor(n/b.y),i.y=a.y*b.y,g.mapSize.y=a.y)),null===g.map&&!g.isPointLightShadow&&3===this.type){var _={minFilter:1006,magFilter:1006,format:1023};g.map=new v(i.x,i.y,_),g.map.texture.name=m.name+".shadowMap",g.mapPass=new v(i.x,i.y,_),g.camera.updateProjectionMatrix()}if(null===g.map){_={minFilter:1003,magFilter:1003,format:1023};g.map=new v(i.x,i.y,_),g.map.texture.name=m.name+".shadowMap",g.camera.updateProjectionMatrix()}e.setRenderTarget(g.map),e.clear();for(var w=g.getViewportCount(),S=0;S<w;S++){var E=g.getViewport(S);o.set(a.x*E.x,a.y*E.y,a.x*E.z,a.y*E.w),p.viewport(o),g.updateMatrices(m,S),r=g.getFrustum(),M(s,c,g.camera,m,this.type)}g.isPointLightShadow||3!==this.type||x(g,c)}else console.warn("THREE.WebGLShadowMap:",m,"has no shadow.")}y.needsUpdate=!1,e.setRenderTarget(l,u,h)}}}function Jr(e,t,n){var r=n.isWebGL2;var i=new function(){var t=!1,n=new g,r=null,i=new g(0,0,0,0);return{setMask:function(n){r===n||t||(e.colorMask(n,n,n,n),r=n)},setLocked:function(e){t=e},setClear:function(t,r,a,o,s){!0===s&&(t*=o,r*=o,a*=o),n.set(t,r,a,o),!1===i.equals(n)&&(e.clearColor(t,r,a,o),i.copy(n))},reset:function(){t=!1,r=null,i.set(-1,0,0,0)}}},a=new function(){var t=!1,n=null,r=null,i=null;return{setTest:function(e){e?B(2929):U(2929)},setMask:function(r){n===r||t||(e.depthMask(r),n=r)},setFunc:function(t){if(r!==t){if(t)switch(t){case 0:e.depthFunc(512);break;case 1:e.depthFunc(519);break;case 2:e.depthFunc(513);break;case 3:e.depthFunc(515);break;case 4:e.depthFunc(514);break;case 5:e.depthFunc(518);break;case 6:e.depthFunc(516);break;case 7:e.depthFunc(517);break;default:e.depthFunc(515)}else e.depthFunc(515);r=t}},setLocked:function(e){t=e},setClear:function(t){i!==t&&(e.clearDepth(t),i=t)},reset:function(){t=!1,n=null,r=null,i=null}}},o=new function(){var t=!1,n=null,r=null,i=null,a=null,o=null,s=null,c=null,l=null;return{setTest:function(e){t||(e?B(2960):U(2960))},setMask:function(r){n===r||t||(e.stencilMask(r),n=r)},setFunc:function(t,n,o){r===t&&i===n&&a===o||(e.stencilFunc(t,n,o),r=t,i=n,a=o)},setOp:function(t,n,r){o===t&&s===n&&c===r||(e.stencilOp(t,n,r),o=t,s=n,c=r)},setLocked:function(e){t=e},setClear:function(t){l!==t&&(e.clearStencil(t),l=t)},reset:function(){t=!1,n=null,r=null,i=null,a=null,o=null,s=null,c=null,l=null}}},s=e.getParameter(34921),c=new Uint8Array(s),l=new Uint8Array(s),u=new Uint8Array(s),h={},p=null,d=null,f=null,m=null,v=null,y=null,x=null,b=null,_=null,w=!1,M=null,S=null,E=null,T=null,A=null,L=e.getParameter(35661),P=!1,R=0,C=e.getParameter(7938);-1!==C.indexOf("WebGL")?(R=parseFloat(/^WebGL\ ([0-9])/.exec(C)[1]),P=R>=1):-1!==C.indexOf("OpenGL ES")&&(R=parseFloat(/^OpenGL\ ES\ ([0-9])/.exec(C)[1]),P=R>=2);var O=null,D={},N=new g,I=new g;function z(t,n,r){var i=new Uint8Array(4),a=e.createTexture();e.bindTexture(t,a),e.texParameteri(t,10241,9728),e.texParameteri(t,10240,9728);for(var o=0;o<r;o++)e.texImage2D(n+o,0,6408,1,1,0,6408,5121,i);return a}var k={};function F(n,i){(c[n]=1,0===l[n]&&(e.enableVertexAttribArray(n),l[n]=1),u[n]!==i)&&((r?e:t.get("ANGLE_instanced_arrays"))[r?"vertexAttribDivisor":"vertexAttribDivisorANGLE"](n,i),u[n]=i)}function B(t){!0!==h[t]&&(e.enable(t),h[t]=!0)}function U(t){!1!==h[t]&&(e.disable(t),h[t]=!1)}k[3553]=z(3553,3553,1),k[34067]=z(34067,34069,6),i.setClear(0,0,0,1),a.setClear(1),o.setClear(0),B(2929),a.setFunc(3),W(!1),q(1),B(2884),V(0);var j={100:32774,101:32778,102:32779};if(r)j[103]=32775,j[104]=32776;else{var H=t.get("EXT_blend_minmax");null!==H&&(j[103]=H.MIN_EXT,j[104]=H.MAX_EXT)}var G={200:0,201:1,202:768,204:770,210:776,208:774,206:772,203:769,205:771,209:775,207:773};function V(t,n,r,i,a,o,s,c){if(0!==t){if(d||(B(3042),d=!0),5===t)a=a||n,o=o||r,s=s||i,n===m&&a===x||(e.blendEquationSeparate(j[n],j[a]),m=n,x=a),r===v&&i===y&&o===b&&s===_||(e.blendFuncSeparate(G[r],G[i],G[o],G[s]),v=r,y=i,b=o,_=s),f=t,w=null;else if(t!==f||c!==w){if(100===m&&100===x||(e.blendEquation(32774),m=100,x=100),c)switch(t){case 1:e.blendFuncSeparate(1,771,1,771);break;case 2:e.blendFunc(1,1);break;case 3:e.blendFuncSeparate(0,0,769,771);break;case 4:e.blendFuncSeparate(0,768,0,770);break;default:console.error("THREE.WebGLState: Invalid blending: ",t)}else switch(t){case 1:e.blendFuncSeparate(770,771,1,771);break;case 2:e.blendFunc(770,1);break;case 3:e.blendFunc(0,769);break;case 4:e.blendFunc(0,768);break;default:console.error("THREE.WebGLState: Invalid blending: ",t)}v=null,y=null,b=null,_=null,f=t,w=c}}else d&&(U(3042),d=!1)}function W(t){M!==t&&(t?e.frontFace(2304):e.frontFace(2305),M=t)}function q(t){0!==t?(B(2884),t!==S&&(1===t?e.cullFace(1029):2===t?e.cullFace(1028):e.cullFace(1032))):U(2884),S=t}function X(t,n,r){t?(B(32823),T===n&&A===r||(e.polygonOffset(n,r),T=n,A=r)):U(32823)}function Y(t){void 0===t&&(t=33984+L-1),O!==t&&(e.activeTexture(t),O=t)}return{buffers:{color:i,depth:a,stencil:o},initAttributes:function(){for(var e=0,t=c.length;e<t;e++)c[e]=0},enableAttribute:function(e){F(e,0)},enableAttributeAndDivisor:F,disableUnusedAttributes:function(){for(var t=0,n=l.length;t!==n;++t)l[t]!==c[t]&&(e.disableVertexAttribArray(t),l[t]=0)},enable:B,disable:U,useProgram:function(t){return p!==t&&(e.useProgram(t),p=t,!0)},setBlending:V,setMaterial:function(e,t){2===e.side?U(2884):B(2884);var n=1===e.side;t&&(n=!n),W(n),1===e.blending&&!1===e.transparent?V(0):V(e.blending,e.blendEquation,e.blendSrc,e.blendDst,e.blendEquationAlpha,e.blendSrcAlpha,e.blendDstAlpha,e.premultipliedAlpha),a.setFunc(e.depthFunc),a.setTest(e.depthTest),a.setMask(e.depthWrite),i.setMask(e.colorWrite);var r=e.stencilWrite;o.setTest(r),r&&(o.setMask(e.stencilWriteMask),o.setFunc(e.stencilFunc,e.stencilRef,e.stencilFuncMask),o.setOp(e.stencilFail,e.stencilZFail,e.stencilZPass)),X(e.polygonOffset,e.polygonOffsetFactor,e.polygonOffsetUnits)},setFlipSided:W,setCullFace:q,setLineWidth:function(t){t!==E&&(P&&e.lineWidth(t),E=t)},setPolygonOffset:X,setScissorTest:function(e){e?B(3089):U(3089)},activeTexture:Y,bindTexture:function(t,n){null===O&&Y();var r=D[O];void 0===r&&(r={type:void 0,texture:void 0},D[O]=r),r.type===t&&r.texture===n||(e.bindTexture(t,n||k[t]),r.type=t,r.texture=n)},unbindTexture:function(){var t=D[O];void 0!==t&&void 0!==t.type&&(e.bindTexture(t.type,null),t.type=void 0,t.texture=void 0)},compressedTexImage2D:function(){try{e.compressedTexImage2D.apply(e,arguments)}catch(e){console.error("THREE.WebGLState:",e)}},texImage2D:function(){try{e.texImage2D.apply(e,arguments)}catch(e){console.error("THREE.WebGLState:",e)}},texImage3D:function(){try{e.texImage3D.apply(e,arguments)}catch(e){console.error("THREE.WebGLState:",e)}},scissor:function(t){!1===N.equals(t)&&(e.scissor(t.x,t.y,t.z,t.w),N.copy(t))},viewport:function(t){!1===I.equals(t)&&(e.viewport(t.x,t.y,t.z,t.w),I.copy(t))},reset:function(){for(var t=0;t<l.length;t++)1===l[t]&&(e.disableVertexAttribArray(t),l[t]=0);h={},O=null,D={},p=null,f=null,M=null,S=null,i.reset(),a.reset(),o.reset()}}}function Qr(e,t,n,r,i,a,o){var s,c=i.isWebGL2,l=i.maxTextures,h=i.maxCubemapSize,p=i.maxTextureSize,d=i.maxSamples,f=new WeakMap,m=!1;try{m="undefined"!=typeof OffscreenCanvas&&null!==new OffscreenCanvas(1,1).getContext("2d")}catch(e){}function g(e,t){return m?new OffscreenCanvas(e,t):document.createElementNS("http://www.w3.org/1999/xhtml","canvas")}function v(e,t,n,r){var i=1;if((e.width>r||e.height>r)&&(i=r/Math.max(e.width,e.height)),i<1||!0===t){if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap){var a=t?u.floorPowerOfTwo:Math.floor,o=a(i*e.width),c=a(i*e.height);void 0===s&&(s=g(o,c));var l=n?g(o,c):s;return l.width=o,l.height=c,l.getContext("2d").drawImage(e,0,0,o,c),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+e.width+"x"+e.height+") to ("+o+"x"+c+")."),l}return"data"in e&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+e.width+"x"+e.height+")."),e}return e}function y(e){return u.isPowerOfTwo(e.width)&&u.isPowerOfTwo(e.height)}function x(e,t){return e.generateMipmaps&&t&&1003!==e.minFilter&&1006!==e.minFilter}function b(t,n,i,a){e.generateMipmap(t),r.get(n).__maxMipLevel=Math.log(Math.max(i,a))*Math.LOG2E}function _(n,r,i){if(!1===c)return r;if(null!==n){if(void 0!==e[n])return e[n];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+n+"'")}var a=r;return 6403===r&&(5126===i&&(a=33326),5131===i&&(a=33325),5121===i&&(a=33321)),6407===r&&(5126===i&&(a=34837),5131===i&&(a=34843),5121===i&&(a=32849)),6408===r&&(5126===i&&(a=34836),5131===i&&(a=34842),5121===i&&(a=32856)),33325!==a&&33326!==a&&34842!==a&&34836!==a||t.get("EXT_color_buffer_float"),a}function w(e){return 1003===e||1004===e||1005===e?9728:9729}function M(t){var n=t.target;n.removeEventListener("dispose",M),function(t){var n=r.get(t);if(void 0===n.__webglInit)return;e.deleteTexture(n.__webglTexture),r.remove(t)}(n),n.isVideoTexture&&f.delete(n),o.memory.textures--}function S(t){var n=t.target;n.removeEventListener("dispose",S),function(t){var n=r.get(t),i=r.get(t.texture);if(!t)return;void 0!==i.__webglTexture&&e.deleteTexture(i.__webglTexture);t.depthTexture&&t.depthTexture.dispose();if(t.isWebGLCubeRenderTarget)for(var a=0;a<6;a++)e.deleteFramebuffer(n.__webglFramebuffer[a]),n.__webglDepthbuffer&&e.deleteRenderbuffer(n.__webglDepthbuffer[a]);else e.deleteFramebuffer(n.__webglFramebuffer),n.__webglDepthbuffer&&e.deleteRenderbuffer(n.__webglDepthbuffer),n.__webglMultisampledFramebuffer&&e.deleteFramebuffer(n.__webglMultisampledFramebuffer),n.__webglColorRenderbuffer&&e.deleteRenderbuffer(n.__webglColorRenderbuffer),n.__webglDepthRenderbuffer&&e.deleteRenderbuffer(n.__webglDepthRenderbuffer);r.remove(t.texture),r.remove(t)}(n),o.memory.textures--}var E=0;function T(e,t){var i=r.get(e);if(e.isVideoTexture&&function(e){var t=o.render.frame;f.get(e)!==t&&(f.set(e,t),e.update())}(e),e.version>0&&i.__version!==e.version){var a=e.image;if(void 0===a)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined");else{if(!1!==a.complete)return void D(i,e,t);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}n.activeTexture(33984+t),n.bindTexture(3553,i.__webglTexture)}function A(t,i){if(6===t.image.length){var o=r.get(t);if(t.version>0&&o.__version!==t.version){O(o,t),n.activeTexture(33984+i),n.bindTexture(34067,o.__webglTexture),e.pixelStorei(37440,t.flipY);for(var s=t&&(t.isCompressedTexture||t.image[0].isCompressedTexture),l=t.image[0]&&t.image[0].isDataTexture,u=[],p=0;p<6;p++)u[p]=s||l?l?t.image[p].image:t.image[p]:v(t.image[p],!1,!0,h);var d,f=u[0],m=y(f)||c,g=a.convert(t.format),w=a.convert(t.type),M=_(t.internalFormat,g,w);if(C(34067,t,m),s){for(p=0;p<6;p++){d=u[p].mipmaps;for(var S=0;S<d.length;S++){var E=d[S];1023!==t.format&&1022!==t.format?null!==g?n.compressedTexImage2D(34069+p,S,M,E.width,E.height,0,E.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):n.texImage2D(34069+p,S,M,E.width,E.height,0,g,w,E.data)}}o.__maxMipLevel=d.length-1}else{d=t.mipmaps;for(p=0;p<6;p++)if(l){n.texImage2D(34069+p,0,M,u[p].width,u[p].height,0,g,w,u[p].data);for(S=0;S<d.length;S++){var T=(E=d[S]).image[p].image;n.texImage2D(34069+p,S+1,M,T.width,T.height,0,g,w,T.data)}}else{n.texImage2D(34069+p,0,M,g,w,u[p]);for(S=0;S<d.length;S++){E=d[S];n.texImage2D(34069+p,S+1,M,g,w,E.image[p])}}o.__maxMipLevel=d.length}x(t,m)&&b(34067,t,f.width,f.height),o.__version=t.version,t.onUpdate&&t.onUpdate(t)}else n.activeTexture(33984+i),n.bindTexture(34067,o.__webglTexture)}}function L(e,t){n.activeTexture(33984+t),n.bindTexture(34067,r.get(e).__webglTexture)}var P={1e3:10497,1001:33071,1002:33648},R={1003:9728,1004:9984,1005:9986,1006:9729,1007:9985,1008:9987};function C(n,a,o){o?(e.texParameteri(n,10242,P[a.wrapS]),e.texParameteri(n,10243,P[a.wrapT]),32879!==n&&35866!==n||e.texParameteri(n,32882,P[a.wrapR]),e.texParameteri(n,10240,R[a.magFilter]),e.texParameteri(n,10241,R[a.minFilter])):(e.texParameteri(n,10242,33071),e.texParameteri(n,10243,33071),32879!==n&&35866!==n||e.texParameteri(n,32882,33071),1001===a.wrapS&&1001===a.wrapT||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping."),e.texParameteri(n,10240,w(a.magFilter)),e.texParameteri(n,10241,w(a.minFilter)),1003!==a.minFilter&&1006!==a.minFilter&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter."));var s=t.get("EXT_texture_filter_anisotropic");if(s){if(1015===a.type&&null===t.get("OES_texture_float_linear"))return;if(1016===a.type&&null===(c||t.get("OES_texture_half_float_linear")))return;(a.anisotropy>1||r.get(a).__currentAnisotropy)&&(e.texParameterf(n,s.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(a.anisotropy,i.getMaxAnisotropy())),r.get(a).__currentAnisotropy=a.anisotropy)}}function O(t,n){void 0===t.__webglInit&&(t.__webglInit=!0,n.addEventListener("dispose",M),t.__webglTexture=e.createTexture(),o.memory.textures++)}function D(t,r,i){var o=3553;r.isDataTexture2DArray&&(o=35866),r.isDataTexture3D&&(o=32879),O(t,r),n.activeTexture(33984+i),n.bindTexture(o,t.__webglTexture),e.pixelStorei(37440,r.flipY),e.pixelStorei(37441,r.premultiplyAlpha),e.pixelStorei(3317,r.unpackAlignment);var s=function(e){return!c&&(1001!==e.wrapS||1001!==e.wrapT||1003!==e.minFilter&&1006!==e.minFilter)}(r)&&!1===y(r.image),l=v(r.image,s,!1,p),u=y(l)||c,h=a.convert(r.format),d=a.convert(r.type),f=_(r.internalFormat,h,d);C(o,r,u);var m,g=r.mipmaps;if(r.isDepthTexture)f=6402,c?f=1015===r.type?36012:1014===r.type?33190:1020===r.type?35056:33189:1015===r.type&&console.error("WebGLRenderer: Floating point depth texture requires WebGL2."),1026===r.format&&6402===f&&1012!==r.type&&1014!==r.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),r.type=1012,d=a.convert(r.type)),1027===r.format&&6402===f&&(f=34041,1020!==r.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),r.type=1020,d=a.convert(r.type))),n.texImage2D(3553,0,f,l.width,l.height,0,h,d,null);else if(r.isDataTexture)if(g.length>0&&u){for(var w=0,M=g.length;w<M;w++)m=g[w],n.texImage2D(3553,w,f,m.width,m.height,0,h,d,m.data);r.generateMipmaps=!1,t.__maxMipLevel=g.length-1}else n.texImage2D(3553,0,f,l.width,l.height,0,h,d,l.data),t.__maxMipLevel=0;else if(r.isCompressedTexture){for(w=0,M=g.length;w<M;w++)m=g[w],1023!==r.format&&1022!==r.format?null!==h?n.compressedTexImage2D(3553,w,f,m.width,m.height,0,m.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):n.texImage2D(3553,w,f,m.width,m.height,0,h,d,m.data);t.__maxMipLevel=g.length-1}else if(r.isDataTexture2DArray)n.texImage3D(35866,0,f,l.width,l.height,l.depth,0,h,d,l.data),t.__maxMipLevel=0;else if(r.isDataTexture3D)n.texImage3D(32879,0,f,l.width,l.height,l.depth,0,h,d,l.data),t.__maxMipLevel=0;else if(g.length>0&&u){for(w=0,M=g.length;w<M;w++)m=g[w],n.texImage2D(3553,w,f,h,d,m);r.generateMipmaps=!1,t.__maxMipLevel=g.length-1}else n.texImage2D(3553,0,f,h,d,l),t.__maxMipLevel=0;x(r,u)&&b(o,r,l.width,l.height),t.__version=r.version,r.onUpdate&&r.onUpdate(r)}function N(t,i,o,s){var c=a.convert(i.texture.format),l=a.convert(i.texture.type),u=_(i.texture.internalFormat,c,l);n.texImage2D(s,0,u,i.width,i.height,0,c,l,null),e.bindFramebuffer(36160,t),e.framebufferTexture2D(36160,o,s,r.get(i.texture).__webglTexture,0),e.bindFramebuffer(36160,null)}function I(t,n,r){if(e.bindRenderbuffer(36161,t),n.depthBuffer&&!n.stencilBuffer){var i=33189;if(r){var o=n.depthTexture;o&&o.isDepthTexture&&(1015===o.type?i=36012:1014===o.type&&(i=33190));var s=k(n);e.renderbufferStorageMultisample(36161,s,i,n.width,n.height)}else e.renderbufferStorage(36161,i,n.width,n.height);e.framebufferRenderbuffer(36160,36096,36161,t)}else if(n.depthBuffer&&n.stencilBuffer){if(r){s=k(n);e.renderbufferStorageMultisample(36161,s,35056,n.width,n.height)}else e.renderbufferStorage(36161,34041,n.width,n.height);e.framebufferRenderbuffer(36160,33306,36161,t)}else{var c=a.convert(n.texture.format),l=a.convert(n.texture.type);i=_(n.texture.internalFormat,c,l);if(r){s=k(n);e.renderbufferStorageMultisample(36161,s,i,n.width,n.height)}else e.renderbufferStorage(36161,i,n.width,n.height)}e.bindRenderbuffer(36161,null)}function z(t){var n=r.get(t),i=!0===t.isWebGLCubeRenderTarget;if(t.depthTexture){if(i)throw new Error("target.depthTexture not supported in Cube render targets");!function(t,n){if(n&&n.isWebGLCubeRenderTarget)throw new Error("Depth Texture with cube render targets is not supported");if(e.bindFramebuffer(36160,t),!n.depthTexture||!n.depthTexture.isDepthTexture)throw new Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");r.get(n.depthTexture).__webglTexture&&n.depthTexture.image.width===n.width&&n.depthTexture.image.height===n.height||(n.depthTexture.image.width=n.width,n.depthTexture.image.height=n.height,n.depthTexture.needsUpdate=!0),T(n.depthTexture,0);var i=r.get(n.depthTexture).__webglTexture;if(1026===n.depthTexture.format)e.framebufferTexture2D(36160,36096,3553,i,0);else{if(1027!==n.depthTexture.format)throw new Error("Unknown depthTexture format");e.framebufferTexture2D(36160,33306,3553,i,0)}}(n.__webglFramebuffer,t)}else if(i){n.__webglDepthbuffer=[];for(var a=0;a<6;a++)e.bindFramebuffer(36160,n.__webglFramebuffer[a]),n.__webglDepthbuffer[a]=e.createRenderbuffer(),I(n.__webglDepthbuffer[a],t,!1)}else e.bindFramebuffer(36160,n.__webglFramebuffer),n.__webglDepthbuffer=e.createRenderbuffer(),I(n.__webglDepthbuffer,t,!1);e.bindFramebuffer(36160,null)}function k(e){return c&&e.isWebGLMultisampleRenderTarget?Math.min(d,e.samples):0}var F=!1,B=!1;this.allocateTextureUnit=function(){var e=E;return e>=l&&console.warn("THREE.WebGLTextures: Trying to use "+e+" texture units while this GPU supports only "+l),E+=1,e},this.resetTextureUnits=function(){E=0},this.setTexture2D=T,this.setTexture2DArray=function(e,t){var i=r.get(e);e.version>0&&i.__version!==e.version?D(i,e,t):(n.activeTexture(33984+t),n.bindTexture(35866,i.__webglTexture))},this.setTexture3D=function(e,t){var i=r.get(e);e.version>0&&i.__version!==e.version?D(i,e,t):(n.activeTexture(33984+t),n.bindTexture(32879,i.__webglTexture))},this.setTextureCube=A,this.setTextureCubeDynamic=L,this.setupRenderTarget=function(t){var i=r.get(t),s=r.get(t.texture);t.addEventListener("dispose",S),s.__webglTexture=e.createTexture(),o.memory.textures++;var l=!0===t.isWebGLCubeRenderTarget,u=!0===t.isWebGLMultisampleRenderTarget,h=y(t)||c;if(!c||1022!==t.texture.format||1015!==t.texture.type&&1016!==t.texture.type||(t.texture.format=1023,console.warn("THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead.")),l){i.__webglFramebuffer=[];for(var p=0;p<6;p++)i.__webglFramebuffer[p]=e.createFramebuffer()}else if(i.__webglFramebuffer=e.createFramebuffer(),u)if(c){i.__webglMultisampledFramebuffer=e.createFramebuffer(),i.__webglColorRenderbuffer=e.createRenderbuffer(),e.bindRenderbuffer(36161,i.__webglColorRenderbuffer);var d=a.convert(t.texture.format),f=a.convert(t.texture.type),m=_(t.texture.internalFormat,d,f),g=k(t);e.renderbufferStorageMultisample(36161,g,m,t.width,t.height),e.bindFramebuffer(36160,i.__webglMultisampledFramebuffer),e.framebufferRenderbuffer(36160,36064,36161,i.__webglColorRenderbuffer),e.bindRenderbuffer(36161,null),t.depthBuffer&&(i.__webglDepthRenderbuffer=e.createRenderbuffer(),I(i.__webglDepthRenderbuffer,t,!0)),e.bindFramebuffer(36160,null)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.");if(l){n.bindTexture(34067,s.__webglTexture),C(34067,t.texture,h);for(p=0;p<6;p++)N(i.__webglFramebuffer[p],t,36064,34069+p);x(t.texture,h)&&b(34067,t.texture,t.width,t.height),n.bindTexture(34067,null)}else n.bindTexture(3553,s.__webglTexture),C(3553,t.texture,h),N(i.__webglFramebuffer,t,36064,3553),x(t.texture,h)&&b(3553,t.texture,t.width,t.height),n.bindTexture(3553,null);t.depthBuffer&&z(t)},this.updateRenderTargetMipmap=function(e){var t=e.texture;if(x(t,y(e)||c)){var i=e.isWebGLCubeRenderTarget?34067:3553,a=r.get(t).__webglTexture;n.bindTexture(i,a),b(i,t,e.width,e.height),n.bindTexture(i,null)}},this.updateMultisampleRenderTarget=function(t){if(t.isWebGLMultisampleRenderTarget)if(c){var n=r.get(t);e.bindFramebuffer(36008,n.__webglMultisampledFramebuffer),e.bindFramebuffer(36009,n.__webglFramebuffer);var i=t.width,a=t.height,o=16384;t.depthBuffer&&(o|=256),t.stencilBuffer&&(o|=1024),e.blitFramebuffer(0,0,i,a,0,0,i,a,o,9728),e.bindFramebuffer(36160,n.__webglMultisampledFramebuffer)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.")},this.safeSetTexture2D=function(e,t){e&&e.isWebGLRenderTarget&&(!1===F&&(console.warn("THREE.WebGLTextures.safeSetTexture2D: don't use render targets as textures. Use their .texture property instead."),F=!0),e=e.texture),T(e,t)},this.safeSetTextureCube=function(e,t){e&&e.isWebGLCubeRenderTarget&&(!1===B&&(console.warn("THREE.WebGLTextures.safeSetTextureCube: don't use cube render targets as textures. Use their .texture property instead."),B=!0),e=e.texture),e&&e.isCubeTexture||Array.isArray(e.image)&&6===e.image.length?A(e,t):L(e,t)}}function Kr(e,t,n){var r=n.isWebGL2;return{convert:function(e){var n;if(1009===e)return 5121;if(1017===e)return 32819;if(1018===e)return 32820;if(1019===e)return 33635;if(1010===e)return 5120;if(1011===e)return 5122;if(1012===e)return 5123;if(1013===e)return 5124;if(1014===e)return 5125;if(1015===e)return 5126;if(1016===e)return r?5131:null!==(n=t.get("OES_texture_half_float"))?n.HALF_FLOAT_OES:null;if(1021===e)return 6406;if(1022===e)return 6407;if(1023===e)return 6408;if(1024===e)return 6409;if(1025===e)return 6410;if(1026===e)return 6402;if(1027===e)return 34041;if(1028===e)return 6403;if(1029===e)return 36244;if(1030===e)return 33319;if(1031===e)return 33320;if(1032===e)return 36248;if(1033===e)return 36249;if(33776===e||33777===e||33778===e||33779===e){if(null===(n=t.get("WEBGL_compressed_texture_s3tc")))return null;if(33776===e)return n.COMPRESSED_RGB_S3TC_DXT1_EXT;if(33777===e)return n.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(33778===e)return n.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(33779===e)return n.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(35840===e||35841===e||35842===e||35843===e){if(null===(n=t.get("WEBGL_compressed_texture_pvrtc")))return null;if(35840===e)return n.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(35841===e)return n.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(35842===e)return n.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(35843===e)return n.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(36196===e)return null!==(n=t.get("WEBGL_compressed_texture_etc1"))?n.COMPRESSED_RGB_ETC1_WEBGL:null;if((37492===e||37496===e)&&null!==(n=t.get("WEBGL_compressed_texture_etc"))){if(37492===e)return n.COMPRESSED_RGB8_ETC2;if(37496===e)return n.COMPRESSED_RGBA8_ETC2_EAC}return 37808===e||37809===e||37810===e||37811===e||37812===e||37813===e||37814===e||37815===e||37816===e||37817===e||37818===e||37819===e||37820===e||37821===e||37840===e||37841===e||37842===e||37843===e||37844===e||37845===e||37846===e||37847===e||37848===e||37849===e||37850===e||37851===e||37852===e||37853===e?null!==(n=t.get("WEBGL_compressed_texture_astc"))?e:null:36492===e?null!==(n=t.get("EXT_texture_compression_bptc"))?e:null:1020===e?r?34042:null!==(n=t.get("WEBGL_depth_texture"))?n.UNSIGNED_INT_24_8_WEBGL:null:void 0}}}function $r(e){qt.call(this),this.cameras=e||[]}function ei(){Y.call(this),this.type="Group"}function ti(e,t){var n=this,r=null,i=1,a=null,o="local-floor",s=null,c=[],l=new Map,u=new qt;u.layers.enable(1),u.viewport=new g;var h=new qt;h.layers.enable(2),h.viewport=new g;var p=new $r([u,h]);p.layers.enable(1),p.layers.enable(2);var d=null,f=null;function m(e){var t=l.get(e.inputSource);t&&(t.targetRay&&t.targetRay.dispatchEvent({type:e.type}),t.grip&&t.grip.dispatchEvent({type:e.type}))}function v(){l.forEach((function(e,t){e.targetRay&&(e.targetRay.dispatchEvent({type:"disconnected",data:t}),e.targetRay.visible=!1),e.grip&&(e.grip.dispatchEvent({type:"disconnected",data:t}),e.grip.visible=!1)})),l.clear(),e.setFramebuffer(null),e.setRenderTarget(e.getRenderTarget()),E.stop(),n.isPresenting=!1,n.dispatchEvent({type:"sessionend"})}function y(e){a=e,E.setContext(r),E.start(),n.isPresenting=!0,n.dispatchEvent({type:"sessionstart"})}function x(e){for(var t=r.inputSources,n=0;n<c.length;n++)l.set(t[n],c[n]);for(n=0;n<e.removed.length;n++){var i=e.removed[n];(a=l.get(i))&&(a.targetRay&&a.targetRay.dispatchEvent({type:"disconnected",data:i}),a.grip&&a.grip.dispatchEvent({type:"disconnected",data:i}),l.delete(i))}for(n=0;n<e.added.length;n++){var a;i=e.added[n];(a=l.get(i))&&(a.targetRay&&a.targetRay.dispatchEvent({type:"connected",data:i}),a.grip&&a.grip.dispatchEvent({type:"connected",data:i}))}}this.enabled=!1,this.isPresenting=!1,this.getController=function(e){var t=c[e];return void 0===t&&(t={},c[e]=t),void 0===t.targetRay&&(t.targetRay=new ei,t.targetRay.matrixAutoUpdate=!1,t.targetRay.visible=!1),t.targetRay},this.getControllerGrip=function(e){var t=c[e];return void 0===t&&(t={},c[e]=t),void 0===t.grip&&(t.grip=new ei,t.grip.matrixAutoUpdate=!1,t.grip.visible=!1),t.grip},this.setFramebufferScaleFactor=function(e){i=e,1==n.isPresenting&&console.warn("WebXRManager: Cannot change framebuffer scale while presenting VR content")},this.setReferenceSpaceType=function(e){o=e},this.getReferenceSpace=function(){return a},this.getSession=function(){return r},this.setSession=function(e){if(null!==(r=e)){r.addEventListener("select",m),r.addEventListener("selectstart",m),r.addEventListener("selectend",m),r.addEventListener("squeeze",m),r.addEventListener("squeezestart",m),r.addEventListener("squeezeend",m),r.addEventListener("end",v);var n=t.getContextAttributes(),a={antialias:n.antialias,alpha:n.alpha,depth:n.depth,stencil:n.stencil,framebufferScaleFactor:i},s=new XRWebGLLayer(r,t,a);r.updateRenderState({baseLayer:s}),r.requestReferenceSpace(o).then(y),r.addEventListener("inputsourceschange",x)}};var b=new w,_=new w;function M(e,t){null===t?e.matrixWorld.copy(e.matrix):e.matrixWorld.multiplyMatrices(t.matrixWorld,e.matrix),e.matrixWorldInverse.getInverse(e.matrixWorld)}this.getCamera=function(e){p.near=h.near=u.near=e.near,p.far=h.far=u.far=e.far,d===p.near&&f===p.far||(r.updateRenderState({depthNear:p.near,depthFar:p.far}),d=p.near,f=p.far);var t=e.parent,n=p.cameras;M(p,t);for(var i=0;i<n.length;i++)M(n[i],t);e.matrixWorld.copy(p.matrixWorld);for(var a=e.children,o=(i=0,a.length);i<o;i++)a[i].updateMatrixWorld(!0);return function(e,t,n){b.setFromMatrixPosition(t.matrixWorld),_.setFromMatrixPosition(n.matrixWorld);var r=b.distanceTo(_),i=t.projectionMatrix.elements,a=n.projectionMatrix.elements,o=i[14]/(i[10]-1),s=i[14]/(i[10]+1),c=(i[9]+1)/i[5],l=(i[9]-1)/i[5],u=(i[8]-1)/i[0],h=(a[8]+1)/a[0],p=o*u,d=o*h,f=r/(-u+h),m=f*-u;t.matrixWorld.decompose(e.position,e.quaternion,e.scale),e.translateX(m),e.translateZ(f),e.matrixWorld.compose(e.position,e.quaternion,e.scale),e.matrixWorldInverse.getInverse(e.matrixWorld);var g=o+f,v=s+f,y=p-m,x=d+(r-m),w=c*s/v*g,M=l*s/v*g;e.projectionMatrix.makePerspective(y,x,w,M,g,v)}(p,u,h),p};var S=null;var E=new en;E.setAnimationLoop((function(t,n){if(null!==(s=n.getViewerPose(a))){var i=s.views,o=r.renderState.baseLayer;e.setFramebuffer(o.framebuffer);for(var l=0;l<i.length;l++){var u=i[l],h=o.getViewport(u),d=p.cameras[l];d.matrix.fromArray(u.transform.matrix),d.projectionMatrix.fromArray(u.projectionMatrix),d.viewport.set(h.x,h.y,h.width,h.height),0===l&&p.matrix.copy(d.matrix)}}var f=r.inputSources;for(l=0;l<c.length;l++){var m=c[l],g=f[l],v=null,y=null;g&&(m.targetRay&&null!==(v=n.getPose(g.targetRaySpace,a))&&(m.targetRay.matrix.fromArray(v.transform.matrix),m.targetRay.matrix.decompose(m.targetRay.position,m.targetRay.rotation,m.targetRay.scale)),m.grip&&g.gripSpace&&null!==(y=n.getPose(g.gripSpace,a))&&(m.grip.matrix.fromArray(y.transform.matrix),m.grip.matrix.decompose(m.grip.position,m.grip.rotation,m.grip.scale))),m.targetRay&&(m.targetRay.visible=null!==v),m.grip&&(m.grip.visible=null!==y)}S&&S(t,n)})),this.setAnimationLoop=function(e){S=e},this.dispose=function(){}}function ni(e){var t=void 0!==(e=e||{}).canvas?e.canvas:document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),n=void 0!==e.context?e.context:null,r=void 0!==e.alpha&&e.alpha,i=void 0===e.depth||e.depth,a=void 0===e.stencil||e.stencil,o=void 0!==e.antialias&&e.antialias,s=void 0===e.premultipliedAlpha||e.premultipliedAlpha,c=void 0!==e.preserveDrawingBuffer&&e.preserveDrawingBuffer,l=void 0!==e.powerPreference?e.powerPreference:"default",p=void 0!==e.failIfMajorPerformanceCaveat&&e.failIfMajorPerformanceCaveat,d=null,f=null;this.domElement=t,this.debug={checkShaderErrors:!0},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.gammaFactor=2,this.outputEncoding=3e3,this.physicallyCorrectLights=!1,this.toneMapping=1,this.toneMappingExposure=1,this.toneMappingWhitePoint=1,this.maxMorphTargets=8,this.maxMorphNormals=4;var m,v,y,x,b,_,M,S,E,T,A,L,P,C,O,D,N,I,z=this,k=!1,F=null,B=0,U=0,j=null,H=null,G=-1,V={geometry:null,program:null,wireframe:!1},W=null,q=null,X=new g,Y=new g,J=null,Q=t.width,K=t.height,$=1,ee=null,te=null,ne=new g(0,0,Q,K),re=new g(0,0,Q,K),ie=!1,ae=new Kt,oe=new un,se=!1,ce=!1,le=new R,ue=new w;function he(){return null===j?$:1}try{var pe={alpha:r,depth:i,stencil:a,antialias:o,premultipliedAlpha:s,preserveDrawingBuffer:c,powerPreference:l,failIfMajorPerformanceCaveat:p,xrCompatible:!0};if(t.addEventListener("webglcontextlost",ge,!1),t.addEventListener("webglcontextrestored",ve,!1),null===(m=n||t.getContext("webgl",pe)||t.getContext("experimental-webgl",pe)))throw null!==t.getContext("webgl")?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.");void 0===m.getShaderPrecisionFormat&&(m.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}})}catch(e){throw console.error("THREE.WebGLRenderer: "+e.message),e}function de(){v=new hn(m),!1===(y=new ln(m,v,e)).isWebGL2&&(v.get("WEBGL_depth_texture"),v.get("OES_texture_float"),v.get("OES_texture_half_float"),v.get("OES_texture_half_float_linear"),v.get("OES_standard_derivatives"),v.get("OES_element_index_uint"),v.get("ANGLE_instanced_arrays")),v.get("OES_texture_float_linear"),I=new Kr(m,v,y),(x=new Jr(m,v,y)).scissor(Y.copy(re).multiplyScalar($).floor()),x.viewport(X.copy(ne).multiplyScalar($).floor()),b=new fn(m),_=new zr,M=new Qr(m,v,x,_,y,I,b),S=new tn(m,y),E=new pn(m,S,b),T=new vn(m,E,S,b),O=new gn(m),A=new Ir(z,v,y),L=new Ur,P=new qr,C=new sn(z,x,T,s),D=new cn(m,v,b,y),N=new dn(m,v,b,y),b.programs=A.programs,z.capabilities=y,z.extensions=v,z.properties=_,z.renderLists=L,z.state=x,z.info=b}de();var fe=new ti(z,m);this.xr=fe;var me=new Zr(z,T,y.maxTextureSize);function ge(e){e.preventDefault(),console.log("THREE.WebGLRenderer: Context Lost."),k=!0}function ve(){console.log("THREE.WebGLRenderer: Context Restored."),k=!1,de()}function ye(e){var t=e.target;t.removeEventListener("dispose",ye),function(e){xe(e),_.remove(e)}(t)}function xe(e){var t=_.get(e).program;e.program=void 0,void 0!==t&&A.releaseProgram(t)}this.shadowMap=me,this.getContext=function(){return m},this.getContextAttributes=function(){return m.getContextAttributes()},this.forceContextLoss=function(){var e=v.get("WEBGL_lose_context");e&&e.loseContext()},this.forceContextRestore=function(){var e=v.get("WEBGL_lose_context");e&&e.restoreContext()},this.getPixelRatio=function(){return $},this.setPixelRatio=function(e){void 0!==e&&($=e,this.setSize(Q,K,!1))},this.getSize=function(e){return void 0===e&&(console.warn("WebGLRenderer: .getsize() now requires a Vector2 as an argument"),e=new h),e.set(Q,K)},this.setSize=function(e,n,r){fe.isPresenting?console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting."):(Q=e,K=n,t.width=Math.floor(e*$),t.height=Math.floor(n*$),!1!==r&&(t.style.width=e+"px",t.style.height=n+"px"),this.setViewport(0,0,e,n))},this.getDrawingBufferSize=function(e){return void 0===e&&(console.warn("WebGLRenderer: .getdrawingBufferSize() now requires a Vector2 as an argument"),e=new h),e.set(Q*$,K*$).floor()},this.setDrawingBufferSize=function(e,n,r){Q=e,K=n,$=r,t.width=Math.floor(e*r),t.height=Math.floor(n*r),this.setViewport(0,0,e,n)},this.getCurrentViewport=function(e){return void 0===e&&(console.warn("WebGLRenderer: .getCurrentViewport() now requires a Vector4 as an argument"),e=new g),e.copy(X)},this.getViewport=function(e){return e.copy(ne)},this.setViewport=function(e,t,n,r){e.isVector4?ne.set(e.x,e.y,e.z,e.w):ne.set(e,t,n,r),x.viewport(X.copy(ne).multiplyScalar($).floor())},this.getScissor=function(e){return e.copy(re)},this.setScissor=function(e,t,n,r){e.isVector4?re.set(e.x,e.y,e.z,e.w):re.set(e,t,n,r),x.scissor(Y.copy(re).multiplyScalar($).floor())},this.getScissorTest=function(){return ie},this.setScissorTest=function(e){x.setScissorTest(ie=e)},this.setOpaqueSort=function(e){ee=e},this.setTransparentSort=function(e){te=e},this.getClearColor=function(){return C.getClearColor()},this.setClearColor=function(){C.setClearColor.apply(C,arguments)},this.getClearAlpha=function(){return C.getClearAlpha()},this.setClearAlpha=function(){C.setClearAlpha.apply(C,arguments)},this.clear=function(e,t,n){var r=0;(void 0===e||e)&&(r|=16384),(void 0===t||t)&&(r|=256),(void 0===n||n)&&(r|=1024),m.clear(r)},this.clearColor=function(){this.clear(!0,!1,!1)},this.clearDepth=function(){this.clear(!1,!0,!1)},this.clearStencil=function(){this.clear(!1,!1,!0)},this.dispose=function(){t.removeEventListener("webglcontextlost",ge,!1),t.removeEventListener("webglcontextrestored",ve,!1),L.dispose(),P.dispose(),_.dispose(),T.dispose(),fe.dispose(),we.stop(),this.forceContextLoss()},this.renderBufferImmediate=function(e,t){x.initAttributes();var n=_.get(e);e.hasPositions&&!n.position&&(n.position=m.createBuffer()),e.hasNormals&&!n.normal&&(n.normal=m.createBuffer()),e.hasUvs&&!n.uv&&(n.uv=m.createBuffer()),e.hasColors&&!n.color&&(n.color=m.createBuffer());var r=t.getAttributes();e.hasPositions&&(m.bindBuffer(34962,n.position),m.bufferData(34962,e.positionArray,35048),x.enableAttribute(r.position),m.vertexAttribPointer(r.position,3,5126,!1,0,0)),e.hasNormals&&(m.bindBuffer(34962,n.normal),m.bufferData(34962,e.normalArray,35048),x.enableAttribute(r.normal),m.vertexAttribPointer(r.normal,3,5126,!1,0,0)),e.hasUvs&&(m.bindBuffer(34962,n.uv),m.bufferData(34962,e.uvArray,35048),x.enableAttribute(r.uv),m.vertexAttribPointer(r.uv,2,5126,!1,0,0)),e.hasColors&&(m.bindBuffer(34962,n.color),m.bufferData(34962,e.colorArray,35048),x.enableAttribute(r.color),m.vertexAttribPointer(r.color,3,5126,!1,0,0)),x.disableUnusedAttributes(),m.drawArrays(4,0,e.count),e.count=0};var be=new Z;this.renderBufferDirect=function(e,t,n,r,i,a){null===t&&(t=be);var o=i.isMesh&&i.matrixWorld.determinant()<0,s=Ae(e,t,r,i);x.setMaterial(r,o);var c=!1;V.geometry===n.id&&V.program===s.id&&V.wireframe===(!0===r.wireframe)||(V.geometry=n.id,V.program=s.id,V.wireframe=!0===r.wireframe,c=!0),(r.morphTargets||r.morphNormals)&&(O.update(i,n,r,s),c=!0);var l=n.index,u=n.attributes.position;if(null===l){if(void 0===u||0===u.count)return}else if(0===l.count)return;var h,p=1;!0===r.wireframe&&(l=E.getWireframeAttribute(n),p=2);var d=D;null!==l&&(h=S.get(l),(d=N).setIndex(h)),c&&(!function(e,t,n,r){if(!1===y.isWebGL2&&(e.isInstancedMesh||t.isInstancedBufferGeometry)&&null===v.get("ANGLE_instanced_arrays"))return;x.initAttributes();var i=t.attributes,a=r.getAttributes(),o=n.defaultAttributeValues;for(var s in a){var c=a[s];if(c>=0){var l=i[s];if(void 0!==l){var u=l.normalized,h=l.itemSize;if(void 0===(w=S.get(l)))continue;var p=w.buffer,d=w.type,f=w.bytesPerElement;if(l.isInterleavedBufferAttribute){var g=l.data,b=g.stride,_=l.offset;g&&g.isInstancedInterleavedBuffer?(x.enableAttributeAndDivisor(c,g.meshPerAttribute),void 0===t.maxInstancedCount&&(t.maxInstancedCount=g.meshPerAttribute*g.count)):x.enableAttribute(c),m.bindBuffer(34962,p),m.vertexAttribPointer(c,h,d,u,b*f,_*f)}else l.isInstancedBufferAttribute?(x.enableAttributeAndDivisor(c,l.meshPerAttribute),void 0===t.maxInstancedCount&&(t.maxInstancedCount=l.meshPerAttribute*l.count)):x.enableAttribute(c),m.bindBuffer(34962,p),m.vertexAttribPointer(c,h,d,u,0,0)}else if("instanceMatrix"===s){var w;if(void 0===(w=S.get(e.instanceMatrix)))continue;p=w.buffer,d=w.type;x.enableAttributeAndDivisor(c+0,1),x.enableAttributeAndDivisor(c+1,1),x.enableAttributeAndDivisor(c+2,1),x.enableAttributeAndDivisor(c+3,1),m.bindBuffer(34962,p),m.vertexAttribPointer(c+0,4,d,!1,64,0),m.vertexAttribPointer(c+1,4,d,!1,64,16),m.vertexAttribPointer(c+2,4,d,!1,64,32),m.vertexAttribPointer(c+3,4,d,!1,64,48)}else if(void 0!==o){var M=o[s];if(void 0!==M)switch(M.length){case 2:m.vertexAttrib2fv(c,M);break;case 3:m.vertexAttrib3fv(c,M);break;case 4:m.vertexAttrib4fv(c,M);break;default:m.vertexAttrib1fv(c,M)}}}}x.disableUnusedAttributes()}(i,n,r,s),null!==l&&m.bindBuffer(34963,h.buffer));var f=null!==l?l.count:u.count,g=n.drawRange.start*p,b=n.drawRange.count*p,_=null!==a?a.start*p:0,w=null!==a?a.count*p:1/0,M=Math.max(g,_),T=Math.min(f,g+b,_+w)-1,A=Math.max(0,T-M+1);if(0!==A){if(i.isMesh)!0===r.wireframe?(x.setLineWidth(r.wireframeLinewidth*he()),d.setMode(1)):d.setMode(4);else if(i.isLine){var L=r.linewidth;void 0===L&&(L=1),x.setLineWidth(L*he()),i.isLineSegments?d.setMode(1):i.isLineLoop?d.setMode(2):d.setMode(3)}else i.isPoints?d.setMode(0):i.isSprite&&d.setMode(4);i.isInstancedMesh?d.renderInstances(n,M,A,i.count):n.isInstancedBufferGeometry?d.renderInstances(n,M,A,n.maxInstancedCount):d.render(M,A)}},this.compile=function(e,t){(f=P.get(e,t)).init(),e.traverse((function(e){e.isLight&&(f.pushLight(e),e.castShadow&&f.pushShadow(e))})),f.setupLights(t);var n={};e.traverse((function(t){if(t.material)if(Array.isArray(t.material))for(var r=0;r<t.material.length;r++)t.material[r].uuid in n==!1&&(Te(t.material[r],e,t),n[t.material[r].uuid]=!0);else t.material.uuid in n==!1&&(Te(t.material,e,t),n[t.material.uuid]=!0)}))};var _e=null;var we=new en;function Me(e,t,n,r){if(!1!==e.visible){if(e.layers.test(t.layers))if(e.isGroup)n=e.renderOrder;else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)f.pushLight(e),e.castShadow&&f.pushShadow(e);else if(e.isSprite){if(!e.frustumCulled||ae.intersectsSprite(e)){r&&ue.setFromMatrixPosition(e.matrixWorld).applyMatrix4(le);var i=T.update(e);(a=e.material).visible&&d.push(e,i,a,n,ue.z,null)}}else if(e.isImmediateRenderObject)r&&ue.setFromMatrixPosition(e.matrixWorld).applyMatrix4(le),d.push(e,null,e.material,n,ue.z,null);else if((e.isMesh||e.isLine||e.isPoints)&&(e.isSkinnedMesh&&e.skeleton.frame!==b.render.frame&&(e.skeleton.update(),e.skeleton.frame=b.render.frame),!e.frustumCulled||ae.intersectsObject(e))){r&&ue.setFromMatrixPosition(e.matrixWorld).applyMatrix4(le);i=T.update(e);var a=e.material;if(Array.isArray(a))for(var o=i.groups,s=0,c=o.length;s<c;s++){var l=o[s],u=a[l.materialIndex];u&&u.visible&&d.push(e,i,u,n,ue.z,l)}else a.visible&&d.push(e,i,a,n,ue.z,null)}var h=e.children;for(s=0,c=h.length;s<c;s++)Me(h[s],t,n,r)}}function Se(e,t,n,r){for(var i=0,a=e.length;i<a;i++){var o=e[i],s=o.object,c=o.geometry,l=void 0===r?o.material:r,u=o.group;if(n.isArrayCamera){q=n;for(var h=n.cameras,p=0,d=h.length;p<d;p++){var m=h[p];s.layers.test(m.layers)&&(x.viewport(X.copy(m.viewport)),f.setupLights(m),Ee(s,t,m,c,l,u))}}else q=null,Ee(s,t,n,c,l,u)}}function Ee(e,t,n,r,i,a){if(e.onBeforeRender(z,t,n,r,i,a),f=P.get(t,q||n),e.modelViewMatrix.multiplyMatrices(n.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix),e.isImmediateRenderObject){var o=Ae(n,t,i,e);x.setMaterial(i),V.geometry=null,V.program=null,V.wireframe=!1,function(e,t){e.render((function(e){z.renderBufferImmediate(e,t)}))}(e,o)}else z.renderBufferDirect(n,t,r,i,e,a);e.onAfterRender(z,t,n,r,i,a),f=P.get(t,q||n)}function Te(e,t,n){var r=_.get(e),i=f.state.lights,a=f.state.shadowsArray,o=i.state.version,s=A.getParameters(e,i.state,a,t,oe.numPlanes,oe.numIntersection,n),c=A.getProgramCacheKey(s),l=r.program,u=!0;if(void 0===l)e.addEventListener("dispose",ye);else if(l.cacheKey!==c)xe(e);else if(r.lightsStateVersion!==o)r.lightsStateVersion=o,u=!1;else{if(void 0!==s.shaderID)return;u=!1}u&&(l=A.acquireProgram(s,c),r.program=l,r.uniforms=s.uniforms,r.environment=e.isMeshStandardMaterial?t.environment:null,r.outputEncoding=z.outputEncoding,e.program=l);var h=l.getAttributes();if(e.morphTargets){e.numSupportedMorphTargets=0;for(var p=0;p<z.maxMorphTargets;p++)h["morphTarget"+p]>=0&&e.numSupportedMorphTargets++}if(e.morphNormals){e.numSupportedMorphNormals=0;for(p=0;p<z.maxMorphNormals;p++)h["morphNormal"+p]>=0&&e.numSupportedMorphNormals++}var d=r.uniforms;(e.isShaderMaterial||e.isRawShaderMaterial)&&!0!==e.clipping||(r.numClippingPlanes=oe.numPlanes,r.numIntersection=oe.numIntersection,d.clippingPlanes=oe.uniform),r.fog=t.fog,r.needsLights=function(e){return e.isMeshLambertMaterial||e.isMeshToonMaterial||e.isMeshPhongMaterial||e.isMeshStandardMaterial||e.isShadowMaterial||e.isShaderMaterial&&!0===e.lights}(e),r.lightsStateVersion=o,r.needsLights&&(d.ambientLightColor.value=i.state.ambient,d.lightProbe.value=i.state.probe,d.directionalLights.value=i.state.directional,d.directionalLightShadows.value=i.state.directionalShadow,d.spotLights.value=i.state.spot,d.spotLightShadows.value=i.state.spotShadow,d.rectAreaLights.value=i.state.rectArea,d.pointLights.value=i.state.point,d.pointLightShadows.value=i.state.pointShadow,d.hemisphereLights.value=i.state.hemi,d.directionalShadowMap.value=i.state.directionalShadowMap,d.directionalShadowMatrix.value=i.state.directionalShadowMatrix,d.spotShadowMap.value=i.state.spotShadowMap,d.spotShadowMatrix.value=i.state.spotShadowMatrix,d.pointShadowMap.value=i.state.pointShadowMap,d.pointShadowMatrix.value=i.state.pointShadowMatrix);var m=r.program.getUniforms(),g=mr.seqWithValue(m.seq,d);r.uniformsList=g}function Ae(e,t,n,r){M.resetTextureUnits();var i=t.fog,a=n.isMeshStandardMaterial?t.environment:null,o=_.get(n),s=f.state.lights;if(se&&(ce||e!==W)){var c=e===W&&n.id===G;oe.setState(n.clippingPlanes,n.clipIntersection,n.clipShadows,e,o,c)}n.version===o.__version?void 0===o.program||n.fog&&o.fog!==i||o.environment!==a||o.needsLights&&o.lightsStateVersion!==s.state.version?Te(n,t,r):void 0===o.numClippingPlanes||o.numClippingPlanes===oe.numPlanes&&o.numIntersection===oe.numIntersection?o.outputEncoding!==z.outputEncoding&&Te(n,t,r):Te(n,t,r):(Te(n,t,r),o.__version=n.version);var l,h,p=!1,d=!1,g=!1,v=o.program,b=v.getUniforms(),w=o.uniforms;if(x.useProgram(v.program)&&(p=!0,d=!0,g=!0),n.id!==G&&(G=n.id,d=!0),p||W!==e){if(b.setValue(m,"projectionMatrix",e.projectionMatrix),y.logarithmicDepthBuffer&&b.setValue(m,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),W!==e&&(W=e,d=!0,g=!0),n.isShaderMaterial||n.isMeshPhongMaterial||n.isMeshToonMaterial||n.isMeshStandardMaterial||n.envMap){var S=b.map.cameraPosition;void 0!==S&&S.setValue(m,ue.setFromMatrixPosition(e.matrixWorld))}(n.isMeshPhongMaterial||n.isMeshToonMaterial||n.isMeshLambertMaterial||n.isMeshBasicMaterial||n.isMeshStandardMaterial||n.isShaderMaterial)&&b.setValue(m,"isOrthographic",!0===e.isOrthographicCamera),(n.isMeshPhongMaterial||n.isMeshToonMaterial||n.isMeshLambertMaterial||n.isMeshBasicMaterial||n.isMeshStandardMaterial||n.isShaderMaterial||n.skinning)&&b.setValue(m,"viewMatrix",e.matrixWorldInverse)}if(n.skinning){b.setOptional(m,r,"bindMatrix"),b.setOptional(m,r,"bindMatrixInverse");var E=r.skeleton;if(E){var T=E.bones;if(y.floatVertexTextures){if(void 0===E.boneTexture){var A=Math.sqrt(4*T.length);A=u.ceilPowerOfTwo(A),A=Math.max(A,4);var L=new Float32Array(A*A*4);L.set(E.boneMatrices);var P=new Zt(L,A,A,1023,1015);E.boneMatrices=L,E.boneTexture=P,E.boneTextureSize=A}b.setValue(m,"boneTexture",E.boneTexture,M),b.setValue(m,"boneTextureSize",E.boneTextureSize)}else b.setOptional(m,E,"boneMatrices")}}return(d||o.receiveShadow!==r.receiveShadow)&&(o.receiveShadow=r.receiveShadow,b.setValue(m,"receiveShadow",r.receiveShadow)),d&&(b.setValue(m,"toneMappingExposure",z.toneMappingExposure),b.setValue(m,"toneMappingWhitePoint",z.toneMappingWhitePoint),o.needsLights&&(h=g,(l=w).ambientLightColor.needsUpdate=h,l.lightProbe.needsUpdate=h,l.directionalLights.needsUpdate=h,l.directionalLightShadows.needsUpdate=h,l.pointLights.needsUpdate=h,l.pointLightShadows.needsUpdate=h,l.spotLights.needsUpdate=h,l.spotLightShadows.needsUpdate=h,l.rectAreaLights.needsUpdate=h,l.hemisphereLights.needsUpdate=h),i&&n.fog&&function(e,t){e.fogColor.value.copy(t.color),t.isFog?(e.fogNear.value=t.near,e.fogFar.value=t.far):t.isFogExp2&&(e.fogDensity.value=t.density)}(w,i),n.isMeshBasicMaterial?Le(w,n):n.isMeshLambertMaterial?(Le(w,n),function(e,t){t.emissiveMap&&(e.emissiveMap.value=t.emissiveMap)}(w,n)):n.isMeshToonMaterial?(Le(w,n),function(e,t){e.specular.value.copy(t.specular),e.shininess.value=Math.max(t.shininess,1e-4),t.gradientMap&&(e.gradientMap.value=t.gradientMap);t.emissiveMap&&(e.emissiveMap.value=t.emissiveMap);t.bumpMap&&(e.bumpMap.value=t.bumpMap,e.bumpScale.value=t.bumpScale,1===t.side&&(e.bumpScale.value*=-1));t.normalMap&&(e.normalMap.value=t.normalMap,e.normalScale.value.copy(t.normalScale),1===t.side&&e.normalScale.value.negate());t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias)}(w,n)):n.isMeshPhongMaterial?(Le(w,n),function(e,t){e.specular.value.copy(t.specular),e.shininess.value=Math.max(t.shininess,1e-4),t.emissiveMap&&(e.emissiveMap.value=t.emissiveMap);t.bumpMap&&(e.bumpMap.value=t.bumpMap,e.bumpScale.value=t.bumpScale,1===t.side&&(e.bumpScale.value*=-1));t.normalMap&&(e.normalMap.value=t.normalMap,e.normalScale.value.copy(t.normalScale),1===t.side&&e.normalScale.value.negate());t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias)}(w,n)):n.isMeshStandardMaterial?(Le(w,n,a),n.isMeshPhysicalMaterial?function(e,t,n){Pe(e,t,n),e.reflectivity.value=t.reflectivity,e.clearcoat.value=t.clearcoat,e.clearcoatRoughness.value=t.clearcoatRoughness,t.sheen&&e.sheen.value.copy(t.sheen);t.clearcoatMap&&(e.clearcoatMap.value=t.clearcoatMap);t.clearcoatRoughnessMap&&(e.clearcoatRoughnessMap.value=t.clearcoatRoughnessMap);t.clearcoatNormalMap&&(e.clearcoatNormalScale.value.copy(t.clearcoatNormalScale),e.clearcoatNormalMap.value=t.clearcoatNormalMap,1===t.side&&e.clearcoatNormalScale.value.negate());e.transparency.value=t.transparency}(w,n,a):Pe(w,n,a)):n.isMeshMatcapMaterial?(Le(w,n),function(e,t){t.matcap&&(e.matcap.value=t.matcap);t.bumpMap&&(e.bumpMap.value=t.bumpMap,e.bumpScale.value=t.bumpScale,1===t.side&&(e.bumpScale.value*=-1));t.normalMap&&(e.normalMap.value=t.normalMap,e.normalScale.value.copy(t.normalScale),1===t.side&&e.normalScale.value.negate());t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias)}(w,n)):n.isMeshDepthMaterial?(Le(w,n),function(e,t){t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias)}(w,n)):n.isMeshDistanceMaterial?(Le(w,n),function(e,t){t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias);e.referencePosition.value.copy(t.referencePosition),e.nearDistance.value=t.nearDistance,e.farDistance.value=t.farDistance}(w,n)):n.isMeshNormalMaterial?(Le(w,n),function(e,t){t.bumpMap&&(e.bumpMap.value=t.bumpMap,e.bumpScale.value=t.bumpScale,1===t.side&&(e.bumpScale.value*=-1));t.normalMap&&(e.normalMap.value=t.normalMap,e.normalScale.value.copy(t.normalScale),1===t.side&&e.normalScale.value.negate());t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias)}(w,n)):n.isLineBasicMaterial?(function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity}(w,n),n.isLineDashedMaterial&&function(e,t){e.dashSize.value=t.dashSize,e.totalSize.value=t.dashSize+t.gapSize,e.scale.value=t.scale}(w,n)):n.isPointsMaterial?function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.size.value=t.size*$,e.scale.value=.5*K,t.map&&(e.map.value=t.map);t.alphaMap&&(e.alphaMap.value=t.alphaMap);var n;t.map?n=t.map:t.alphaMap&&(n=t.alphaMap);void 0!==n&&(!0===n.matrixAutoUpdate&&n.updateMatrix(),e.uvTransform.value.copy(n.matrix))}(w,n):n.isSpriteMaterial?function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.rotation.value=t.rotation,t.map&&(e.map.value=t.map);t.alphaMap&&(e.alphaMap.value=t.alphaMap);var n;t.map?n=t.map:t.alphaMap&&(n=t.alphaMap);void 0!==n&&(!0===n.matrixAutoUpdate&&n.updateMatrix(),e.uvTransform.value.copy(n.matrix))}(w,n):n.isShadowMaterial&&(w.color.value.copy(n.color),w.opacity.value=n.opacity),void 0!==w.ltc_1&&(w.ltc_1.value=$t.LTC_1),void 0!==w.ltc_2&&(w.ltc_2.value=$t.LTC_2),mr.upload(m,o.uniformsList,w,M),n.isShaderMaterial&&(n.uniformsNeedUpdate=!1)),n.isShaderMaterial&&!0===n.uniformsNeedUpdate&&(mr.upload(m,o.uniformsList,w,M),n.uniformsNeedUpdate=!1),n.isSpriteMaterial&&b.setValue(m,"center",r.center),b.setValue(m,"modelViewMatrix",r.modelViewMatrix),b.setValue(m,"normalMatrix",r.normalMatrix),b.setValue(m,"modelMatrix",r.matrixWorld),v}function Le(e,t,n){e.opacity.value=t.opacity,t.color&&e.diffuse.value.copy(t.color),t.emissive&&e.emissive.value.copy(t.emissive).multiplyScalar(t.emissiveIntensity),t.map&&(e.map.value=t.map),t.alphaMap&&(e.alphaMap.value=t.alphaMap),t.specularMap&&(e.specularMap.value=t.specularMap);var r,i,a=t.envMap||n;a&&(e.envMap.value=a,e.flipEnvMap.value=a.isCubeTexture?-1:1,e.reflectivity.value=t.reflectivity,e.refractionRatio.value=t.refractionRatio,e.maxMipLevel.value=_.get(a).__maxMipLevel),t.lightMap&&(e.lightMap.value=t.lightMap,e.lightMapIntensity.value=t.lightMapIntensity),t.aoMap&&(e.aoMap.value=t.aoMap,e.aoMapIntensity.value=t.aoMapIntensity),t.map?r=t.map:t.specularMap?r=t.specularMap:t.displacementMap?r=t.displacementMap:t.normalMap?r=t.normalMap:t.bumpMap?r=t.bumpMap:t.roughnessMap?r=t.roughnessMap:t.metalnessMap?r=t.metalnessMap:t.alphaMap?r=t.alphaMap:t.emissiveMap&&(r=t.emissiveMap),void 0!==r&&(r.isWebGLRenderTarget&&(r=r.texture),!0===r.matrixAutoUpdate&&r.updateMatrix(),e.uvTransform.value.copy(r.matrix)),t.aoMap?i=t.aoMap:t.lightMap&&(i=t.lightMap),void 0!==i&&(i.isWebGLRenderTarget&&(i=i.texture),!0===i.matrixAutoUpdate&&i.updateMatrix(),e.uv2Transform.value.copy(i.matrix))}function Pe(e,t,n){e.roughness.value=t.roughness,e.metalness.value=t.metalness,t.roughnessMap&&(e.roughnessMap.value=t.roughnessMap),t.metalnessMap&&(e.metalnessMap.value=t.metalnessMap),t.emissiveMap&&(e.emissiveMap.value=t.emissiveMap),t.bumpMap&&(e.bumpMap.value=t.bumpMap,e.bumpScale.value=t.bumpScale,1===t.side&&(e.bumpScale.value*=-1)),t.normalMap&&(e.normalMap.value=t.normalMap,e.normalScale.value.copy(t.normalScale),1===t.side&&e.normalScale.value.negate()),t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias),(t.envMap||n)&&(e.envMapIntensity.value=t.envMapIntensity)}we.setAnimationLoop((function(e){fe.isPresenting||_e&&_e(e)})),"undefined"!=typeof window&&we.setContext(window),this.setAnimationLoop=function(e){_e=e,fe.setAnimationLoop(e),we.start()},this.render=function(e,t){var n,r;if(void 0!==arguments[2]&&(console.warn("THREE.WebGLRenderer.render(): the renderTarget argument has been removed. Use .setRenderTarget() instead."),n=arguments[2]),void 0!==arguments[3]&&(console.warn("THREE.WebGLRenderer.render(): the forceClear argument has been removed. Use .clear() instead."),r=arguments[3]),t&&t.isCamera){if(!k){V.geometry=null,V.program=null,V.wireframe=!1,G=-1,W=null,!0===e.autoUpdate&&e.updateMatrixWorld(),null===t.parent&&t.updateMatrixWorld(),fe.enabled&&fe.isPresenting&&(t=fe.getCamera(t)),(f=P.get(e,t)).init(),e.onBeforeRender(z,e,t,n||j),le.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),ae.setFromProjectionMatrix(le),ce=this.localClippingEnabled,se=oe.init(this.clippingPlanes,ce,t),(d=L.get(e,t)).init(),Me(e,t,0,z.sortObjects),d.finish(),!0===z.sortObjects&&d.sort(ee,te),se&&oe.beginShadows();var i=f.state.shadowsArray;me.render(i,e,t),f.setupLights(t),se&&oe.endShadows(),this.info.autoReset&&this.info.reset(),void 0!==n&&this.setRenderTarget(n),C.render(d,e,t,r);var a=d.opaque,o=d.transparent;if(e.overrideMaterial){var s=e.overrideMaterial;a.length&&Se(a,e,t,s),o.length&&Se(o,e,t,s)}else a.length&&Se(a,e,t),o.length&&Se(o,e,t);e.onAfterRender(z,e,t),null!==j&&(M.updateRenderTargetMipmap(j),M.updateMultisampleRenderTarget(j)),x.buffers.depth.setTest(!0),x.buffers.depth.setMask(!0),x.buffers.color.setMask(!0),x.setPolygonOffset(!1),d=null,f=null}}else console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.")},this.setFramebuffer=function(e){F!==e&&null===j&&m.bindFramebuffer(36160,e),F=e},this.getActiveCubeFace=function(){return B},this.getActiveMipmapLevel=function(){return U},this.getRenderTarget=function(){return j},this.setRenderTarget=function(e,t,n){j=e,B=t,U=n,e&&void 0===_.get(e).__webglFramebuffer&&M.setupRenderTarget(e);var r=F,i=!1;if(e){var a=_.get(e).__webglFramebuffer;e.isWebGLCubeRenderTarget?(r=a[t||0],i=!0):r=e.isWebGLMultisampleRenderTarget?_.get(e).__webglMultisampledFramebuffer:a,X.copy(e.viewport),Y.copy(e.scissor),J=e.scissorTest}else X.copy(ne).multiplyScalar($).floor(),Y.copy(re).multiplyScalar($).floor(),J=ie;if(H!==r&&(m.bindFramebuffer(36160,r),H=r),x.viewport(X),x.scissor(Y),x.setScissorTest(J),i){var o=_.get(e.texture);m.framebufferTexture2D(36160,36064,34069+(t||0),o.__webglTexture,n||0)}},this.readRenderTargetPixels=function(e,t,n,r,i,a,o){if(e&&e.isWebGLRenderTarget){var s=_.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==o&&(s=s[o]),s){var c=!1;s!==H&&(m.bindFramebuffer(36160,s),c=!0);try{var l=e.texture,u=l.format,h=l.type;if(1023!==u&&I.convert(u)!==m.getParameter(35739))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");if(!(1009===h||I.convert(h)===m.getParameter(35738)||1015===h&&(y.isWebGL2||v.get("OES_texture_float")||v.get("WEBGL_color_buffer_float"))||1016===h&&(y.isWebGL2?v.get("EXT_color_buffer_float"):v.get("EXT_color_buffer_half_float"))))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");36053===m.checkFramebufferStatus(36160)?t>=0&&t<=e.width-r&&n>=0&&n<=e.height-i&&m.readPixels(t,n,r,i,I.convert(u),I.convert(h),a):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.")}finally{c&&m.bindFramebuffer(36160,H)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")},this.copyFramebufferToTexture=function(e,t,n){void 0===n&&(n=0);var r=Math.pow(2,-n),i=Math.floor(t.image.width*r),a=Math.floor(t.image.height*r),o=I.convert(t.format);M.setTexture2D(t,0),m.copyTexImage2D(3553,n,o,e.x,e.y,i,a,0),x.unbindTexture()},this.copyTextureToTexture=function(e,t,n,r){var i=t.image.width,a=t.image.height,o=I.convert(n.format),s=I.convert(n.type);M.setTexture2D(n,0),t.isDataTexture?m.texSubImage2D(3553,r||0,e.x,e.y,i,a,o,s,t.image.data):m.texSubImage2D(3553,r||0,e.x,e.y,o,s,t.image),x.unbindTexture()},this.initTexture=function(e){M.setTexture2D(e,0),x.unbindTexture()},"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}function ri(e,t){this.name="",this.color=new Be(e),this.density=void 0!==t?t:25e-5}function ii(e,t,n){this.name="",this.color=new Be(e),this.near=void 0!==t?t:1,this.far=void 0!==n?n:1e3}function ai(e,t){this.array=e,this.stride=t,this.count=void 0!==e?e.length/t:0,this.usage=35044,this.updateRange={offset:0,count:-1},this.version=0}$r.prototype=Object.assign(Object.create(qt.prototype),{constructor:$r,isArrayCamera:!0}),ei.prototype=Object.assign(Object.create(Y.prototype),{constructor:ei,isGroup:!0}),Object.assign(ti.prototype,o.prototype),Object.assign(ri.prototype,{isFogExp2:!0,clone:function(){return new ri(this.color,this.density)},toJSON:function(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}}}),Object.assign(ii.prototype,{isFog:!0,clone:function(){return new ii(this.color,this.near,this.far)},toJSON:function(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}}}),Object.defineProperty(ai.prototype,"needsUpdate",{set:function(e){!0===e&&this.version++}}),Object.assign(ai.prototype,{isInterleavedBuffer:!0,onUploadCallback:function(){},setUsage:function(e){return this.usage=e,this},copy:function(e){return this.array=new e.array.constructor(e.array),this.count=e.count,this.stride=e.stride,this.usage=e.usage,this},copyAt:function(e,t,n){e*=this.stride,n*=t.stride;for(var r=0,i=this.stride;r<i;r++)this.array[e+r]=t.array[n+r];return this},set:function(e,t){return void 0===t&&(t=0),this.array.set(e,t),this},clone:function(){return(new this.constructor).copy(this)},onUpload:function(e){return this.onUploadCallback=e,this}});var oi,si=new w;function ci(e,t,n,r){this.data=e,this.itemSize=t,this.offset=n,this.normalized=!0===r}function li(e){We.call(this),this.type="SpriteMaterial",this.color=new Be(16777215),this.map=null,this.alphaMap=null,this.rotation=0,this.sizeAttenuation=!0,this.transparent=!0,this.setValues(e)}Object.defineProperties(ci.prototype,{count:{get:function(){return this.data.count}},array:{get:function(){return this.data.array}}}),Object.assign(ci.prototype,{isInterleavedBufferAttribute:!0,applyMatrix4:function(e){for(var t=0,n=this.data.count;t<n;t++)si.x=this.getX(t),si.y=this.getY(t),si.z=this.getZ(t),si.applyMatrix4(e),this.setXYZ(t,si.x,si.y,si.z);return this},setX:function(e,t){return this.data.array[e*this.data.stride+this.offset]=t,this},setY:function(e,t){return this.data.array[e*this.data.stride+this.offset+1]=t,this},setZ:function(e,t){return this.data.array[e*this.data.stride+this.offset+2]=t,this},setW:function(e,t){return this.data.array[e*this.data.stride+this.offset+3]=t,this},getX:function(e){return this.data.array[e*this.data.stride+this.offset]},getY:function(e){return this.data.array[e*this.data.stride+this.offset+1]},getZ:function(e){return this.data.array[e*this.data.stride+this.offset+2]},getW:function(e){return this.data.array[e*this.data.stride+this.offset+3]},setXY:function(e,t,n){return e=e*this.data.stride+this.offset,this.data.array[e+0]=t,this.data.array[e+1]=n,this},setXYZ:function(e,t,n,r){return e=e*this.data.stride+this.offset,this.data.array[e+0]=t,this.data.array[e+1]=n,this.data.array[e+2]=r,this},setXYZW:function(e,t,n,r,i){return e=e*this.data.stride+this.offset,this.data.array[e+0]=t,this.data.array[e+1]=n,this.data.array[e+2]=r,this.data.array[e+3]=i,this}}),li.prototype=Object.create(We.prototype),li.prototype.constructor=li,li.prototype.isSpriteMaterial=!0,li.prototype.copy=function(e){return We.prototype.copy.call(this,e),this.color.copy(e.color),this.map=e.map,this.alphaMap=e.alphaMap,this.rotation=e.rotation,this.sizeAttenuation=e.sizeAttenuation,this};var ui=new w,hi=new w,pi=new w,di=new h,fi=new h,mi=new R,gi=new w,vi=new w,yi=new w,xi=new h,bi=new h,_i=new h;function wi(e){if(Y.call(this),this.type="Sprite",void 0===oi){oi=new dt;var t=new ai(new Float32Array([-.5,-.5,0,0,0,.5,-.5,0,1,0,.5,.5,0,1,1,-.5,.5,0,0,1]),5);oi.setIndex([0,1,2,0,2,3]),oi.setAttribute("position",new ci(t,3,0,!1)),oi.setAttribute("uv",new ci(t,2,3,!1))}this.geometry=oi,this.material=void 0!==e?e:new li,this.center=new h(.5,.5)}function Mi(e,t,n,r,i,a){di.subVectors(e,n).addScalar(.5).multiply(r),void 0!==i?(fi.x=a*di.x-i*di.y,fi.y=i*di.x+a*di.y):fi.copy(di),e.copy(t),e.x+=fi.x,e.y+=fi.y,e.applyMatrix4(mi)}wi.prototype=Object.assign(Object.create(Y.prototype),{constructor:wi,isSprite:!0,raycast:function(e,t){null===e.camera&&console.error('THREE.Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.'),hi.setFromMatrixScale(this.matrixWorld),mi.copy(e.camera.matrixWorld),this.modelViewMatrix.multiplyMatrices(e.camera.matrixWorldInverse,this.matrixWorld),pi.setFromMatrixPosition(this.modelViewMatrix),e.camera.isPerspectiveCamera&&!1===this.material.sizeAttenuation&&hi.multiplyScalar(-pi.z);var n,r,i=this.material.rotation;0!==i&&(r=Math.cos(i),n=Math.sin(i));var a=this.center;Mi(gi.set(-.5,-.5,0),pi,a,hi,n,r),Mi(vi.set(.5,-.5,0),pi,a,hi,n,r),Mi(yi.set(.5,.5,0),pi,a,hi,n,r),xi.set(0,0),bi.set(1,0),_i.set(1,1);var o=e.ray.intersectTriangle(gi,vi,yi,!1,ui);if(null!==o||(Mi(vi.set(-.5,.5,0),pi,a,hi,n,r),bi.set(0,1),null!==(o=e.ray.intersectTriangle(gi,yi,vi,!1,ui)))){var s=e.ray.origin.distanceTo(ui);s<e.near||s>e.far||t.push({distance:s,point:ui.clone(),uv:Ie.getUV(ui,gi,vi,yi,xi,bi,_i,new h),face:null,object:this})}},clone:function(){return new this.constructor(this.material).copy(this)},copy:function(e){return Y.prototype.copy.call(this,e),void 0!==e.center&&this.center.copy(e.center),this}});var Si=new w,Ei=new w;function Ti(){Y.call(this),this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]}}),this.autoUpdate=!0}function Ai(e,t){e&&e.isGeometry&&console.error("THREE.SkinnedMesh no longer supports THREE.Geometry. Use THREE.BufferGeometry instead."),Ct.call(this,e,t),this.type="SkinnedMesh",this.bindMode="attached",this.bindMatrix=new R,this.bindMatrixInverse=new R}Ti.prototype=Object.assign(Object.create(Y.prototype),{constructor:Ti,isLOD:!0,copy:function(e){Y.prototype.copy.call(this,e,!1);for(var t=e.levels,n=0,r=t.length;n<r;n++){var i=t[n];this.addLevel(i.object.clone(),i.distance)}return this.autoUpdate=e.autoUpdate,this},addLevel:function(e,t){void 0===t&&(t=0),t=Math.abs(t);for(var n=this.levels,r=0;r<n.length&&!(t<n[r].distance);r++);return n.splice(r,0,{distance:t,object:e}),this.add(e),this},getCurrentLevel:function(){return this._currentLevel},getObjectForDistance:function(e){var t=this.levels;if(t.length>0){for(var n=1,r=t.length;n<r&&!(e<t[n].distance);n++);return t[n-1].object}return null},raycast:function(e,t){if(this.levels.length>0){Si.setFromMatrixPosition(this.matrixWorld);var n=e.ray.origin.distanceTo(Si);this.getObjectForDistance(n).raycast(e,t)}},update:function(e){var t=this.levels;if(t.length>1){Si.setFromMatrixPosition(e.matrixWorld),Ei.setFromMatrixPosition(this.matrixWorld);var n=Si.distanceTo(Ei)/e.zoom;t[0].object.visible=!0;for(var r=1,i=t.length;r<i&&n>=t[r].distance;r++)t[r-1].object.visible=!1,t[r].object.visible=!0;for(this._currentLevel=r-1;r<i;r++)t[r].object.visible=!1}},toJSON:function(e){var t=Y.prototype.toJSON.call(this,e);!1===this.autoUpdate&&(t.object.autoUpdate=!1),t.object.levels=[];for(var n=this.levels,r=0,i=n.length;r<i;r++){var a=n[r];t.object.levels.push({object:a.object.uuid,distance:a.distance})}return t}}),Ai.prototype=Object.assign(Object.create(Ct.prototype),{constructor:Ai,isSkinnedMesh:!0,bind:function(e,t){this.skeleton=e,void 0===t&&(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),t=this.matrixWorld),this.bindMatrix.copy(t),this.bindMatrixInverse.getInverse(t)},pose:function(){this.skeleton.pose()},normalizeSkinWeights:function(){for(var e=new g,t=this.geometry.attributes.skinWeight,n=0,r=t.count;n<r;n++){e.x=t.getX(n),e.y=t.getY(n),e.z=t.getZ(n),e.w=t.getW(n);var i=1/e.manhattanLength();i!==1/0?e.multiplyScalar(i):e.set(1,0,0,0),t.setXYZW(n,e.x,e.y,e.z,e.w)}},updateMatrixWorld:function(e){Ct.prototype.updateMatrixWorld.call(this,e),"attached"===this.bindMode?this.bindMatrixInverse.getInverse(this.matrixWorld):"detached"===this.bindMode?this.bindMatrixInverse.getInverse(this.bindMatrix):console.warn("THREE.SkinnedMesh: Unrecognized bindMode: "+this.bindMode)},clone:function(){return new this.constructor(this.geometry,this.material).copy(this)}});var Li=new R,Pi=new R;function Ri(e,t){if(e=e||[],this.bones=e.slice(0),this.boneMatrices=new Float32Array(16*this.bones.length),this.frame=-1,void 0===t)this.calculateInverses();else if(this.bones.length===t.length)this.boneInverses=t.slice(0);else{console.warn("THREE.Skeleton boneInverses is the wrong length."),this.boneInverses=[];for(var n=0,r=this.bones.length;n<r;n++)this.boneInverses.push(new R)}}function Ci(){Y.call(this),this.type="Bone"}Object.assign(Ri.prototype,{calculateInverses:function(){this.boneInverses=[];for(var e=0,t=this.bones.length;e<t;e++){var n=new R;this.bones[e]&&n.getInverse(this.bones[e].matrixWorld),this.boneInverses.push(n)}},pose:function(){var e,t,n;for(t=0,n=this.bones.length;t<n;t++)(e=this.bones[t])&&e.matrixWorld.getInverse(this.boneInverses[t]);for(t=0,n=this.bones.length;t<n;t++)(e=this.bones[t])&&(e.parent&&e.parent.isBone?(e.matrix.getInverse(e.parent.matrixWorld),e.matrix.multiply(e.matrixWorld)):e.matrix.copy(e.matrixWorld),e.matrix.decompose(e.position,e.quaternion,e.scale))},update:function(){for(var e=this.bones,t=this.boneInverses,n=this.boneMatrices,r=this.boneTexture,i=0,a=e.length;i<a;i++){var o=e[i]?e[i].matrixWorld:Pi;Li.multiplyMatrices(o,t[i]),Li.toArray(n,16*i)}void 0!==r&&(r.needsUpdate=!0)},clone:function(){return new Ri(this.bones,this.boneInverses)},getBoneByName:function(e){for(var t=0,n=this.bones.length;t<n;t++){var r=this.bones[t];if(r.name===e)return r}},dispose:function(){this.boneTexture&&(this.boneTexture.dispose(),this.boneTexture=void 0)}}),Ci.prototype=Object.assign(Object.create(Y.prototype),{constructor:Ci,isBone:!0});var Oi=new R,Di=new R,Ni=[],Ii=new Ct;function zi(e,t,n){Ct.call(this,e,t),this.instanceMatrix=new Ye(new Float32Array(16*n),16),this.count=n,this.frustumCulled=!1}function ki(e){We.call(this),this.type="LineBasicMaterial",this.color=new Be(16777215),this.linewidth=1,this.linecap="round",this.linejoin="round",this.setValues(e)}zi.prototype=Object.assign(Object.create(Ct.prototype),{constructor:zi,isInstancedMesh:!0,getMatrixAt:function(e,t){t.fromArray(this.instanceMatrix.array,16*e)},raycast:function(e,t){var n=this.matrixWorld,r=this.count;if(Ii.geometry=this.geometry,Ii.material=this.material,void 0!==Ii.material)for(var i=0;i<r;i++)this.getMatrixAt(i,Oi),Di.multiplyMatrices(n,Oi),Ii.matrixWorld=Di,Ii.raycast(e,Ni),Ni.length>0&&(Ni[0].instanceId=i,Ni[0].object=this,t.push(Ni[0]),Ni.length=0)},setMatrixAt:function(e,t){t.toArray(this.instanceMatrix.array,16*e)},updateMorphTargets:function(){}}),ki.prototype=Object.create(We.prototype),ki.prototype.constructor=ki,ki.prototype.isLineBasicMaterial=!0,ki.prototype.copy=function(e){return We.prototype.copy.call(this,e),this.color.copy(e.color),this.linewidth=e.linewidth,this.linecap=e.linecap,this.linejoin=e.linejoin,this};var Fi=new w,Bi=new w,Ui=new R,ji=new be,Hi=new pe;function Gi(e,t,n){1===n&&console.error("THREE.Line: parameter THREE.LinePieces no longer supported. Use THREE.LineSegments instead."),Y.call(this),this.type="Line",this.geometry=void 0!==e?e:new dt,this.material=void 0!==t?t:new ki}Gi.prototype=Object.assign(Object.create(Y.prototype),{constructor:Gi,isLine:!0,computeLineDistances:function(){var e=this.geometry;if(e.isBufferGeometry)if(null===e.index){for(var t=e.attributes.position,n=[0],r=1,i=t.count;r<i;r++)Fi.fromBufferAttribute(t,r-1),Bi.fromBufferAttribute(t,r),n[r]=n[r-1],n[r]+=Fi.distanceTo(Bi);e.setAttribute("lineDistance",new nt(n,1))}else console.warn("THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");else if(e.isGeometry){var a=e.vertices;(n=e.lineDistances)[0]=0;for(r=1,i=a.length;r<i;r++)n[r]=n[r-1],n[r]+=a[r-1].distanceTo(a[r])}return this},raycast:function(e,t){var n=this.geometry,r=this.matrixWorld,i=e.params.Line.threshold;if(null===n.boundingSphere&&n.computeBoundingSphere(),Hi.copy(n.boundingSphere),Hi.applyMatrix4(r),Hi.radius+=i,!1!==e.ray.intersectsSphere(Hi)){Ui.getInverse(r),ji.copy(e.ray).applyMatrix4(Ui);var a=i/((this.scale.x+this.scale.y+this.scale.z)/3),o=a*a,s=new w,c=new w,l=new w,u=new w,h=this&&this.isLineSegments?2:1;if(n.isBufferGeometry){var p=n.index,d=n.attributes.position.array;if(null!==p)for(var f=p.array,m=0,g=f.length-1;m<g;m+=h){var v=f[m],y=f[m+1];if(s.fromArray(d,3*v),c.fromArray(d,3*y),!(ji.distanceSqToSegment(s,c,u,l)>o))u.applyMatrix4(this.matrixWorld),(_=e.ray.origin.distanceTo(u))<e.near||_>e.far||t.push({distance:_,point:l.clone().applyMatrix4(this.matrixWorld),index:m,face:null,faceIndex:null,object:this})}else for(m=0,g=d.length/3-1;m<g;m+=h){if(s.fromArray(d,3*m),c.fromArray(d,3*m+3),!(ji.distanceSqToSegment(s,c,u,l)>o))u.applyMatrix4(this.matrixWorld),(_=e.ray.origin.distanceTo(u))<e.near||_>e.far||t.push({distance:_,point:l.clone().applyMatrix4(this.matrixWorld),index:m,face:null,faceIndex:null,object:this})}}else if(n.isGeometry){var x=n.vertices,b=x.length;for(m=0;m<b-1;m+=h){var _;if(!(ji.distanceSqToSegment(x[m],x[m+1],u,l)>o))u.applyMatrix4(this.matrixWorld),(_=e.ray.origin.distanceTo(u))<e.near||_>e.far||t.push({distance:_,point:l.clone().applyMatrix4(this.matrixWorld),index:m,face:null,faceIndex:null,object:this})}}}},clone:function(){return new this.constructor(this.geometry,this.material).copy(this)}});var Vi=new w,Wi=new w;function qi(e,t){Gi.call(this,e,t),this.type="LineSegments"}function Xi(e,t){Gi.call(this,e,t),this.type="LineLoop"}function Yi(e){We.call(this),this.type="PointsMaterial",this.color=new Be(16777215),this.map=null,this.alphaMap=null,this.size=1,this.sizeAttenuation=!0,this.morphTargets=!1,this.setValues(e)}qi.prototype=Object.assign(Object.create(Gi.prototype),{constructor:qi,isLineSegments:!0,computeLineDistances:function(){var e=this.geometry;if(e.isBufferGeometry)if(null===e.index){for(var t=e.attributes.position,n=[],r=0,i=t.count;r<i;r+=2)Vi.fromBufferAttribute(t,r),Wi.fromBufferAttribute(t,r+1),n[r]=0===r?0:n[r-1],n[r+1]=n[r]+Vi.distanceTo(Wi);e.setAttribute("lineDistance",new nt(n,1))}else console.warn("THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");else if(e.isGeometry){var a=e.vertices;for(n=e.lineDistances,r=0,i=a.length;r<i;r+=2)Vi.copy(a[r]),Wi.copy(a[r+1]),n[r]=0===r?0:n[r-1],n[r+1]=n[r]+Vi.distanceTo(Wi)}return this}}),Xi.prototype=Object.assign(Object.create(Gi.prototype),{constructor:Xi,isLineLoop:!0}),Yi.prototype=Object.create(We.prototype),Yi.prototype.constructor=Yi,Yi.prototype.isPointsMaterial=!0,Yi.prototype.copy=function(e){return We.prototype.copy.call(this,e),this.color.copy(e.color),this.map=e.map,this.alphaMap=e.alphaMap,this.size=e.size,this.sizeAttenuation=e.sizeAttenuation,this.morphTargets=e.morphTargets,this};var Zi=new R,Ji=new be,Qi=new pe,Ki=new w;function $i(e,t){Y.call(this),this.type="Points",this.geometry=void 0!==e?e:new dt,this.material=void 0!==t?t:new Yi,this.updateMorphTargets()}function ea(e,t,n,r,i,a,o){var s=Ji.distanceSqToPoint(e);if(s<n){var c=new w;Ji.closestPointToPoint(e,c),c.applyMatrix4(r);var l=i.ray.origin.distanceTo(c);if(l<i.near||l>i.far)return;a.push({distance:l,distanceToRay:Math.sqrt(s),point:c,index:t,face:null,object:o})}}function ta(e,t,n,r,i,a,o,s,c){m.call(this,e,t,n,r,i,a,o,s,c),this.format=void 0!==o?o:1022,this.minFilter=void 0!==a?a:1006,this.magFilter=void 0!==i?i:1006,this.generateMipmaps=!1}function na(e,t,n,r,i,a,o,s,c,l,u,h){m.call(this,null,a,o,s,c,l,r,i,u,h),this.image={width:t,height:n},this.mipmaps=e,this.flipY=!1,this.generateMipmaps=!1}function ra(e,t,n,r,i,a,o,s,c){m.call(this,e,t,n,r,i,a,o,s,c),this.needsUpdate=!0}function ia(e,t,n,r,i,a,o,s,c,l){if(1026!==(l=void 0!==l?l:1026)&&1027!==l)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===n&&1026===l&&(n=1012),void 0===n&&1027===l&&(n=1020),m.call(this,null,r,i,a,o,s,l,n,c),this.image={width:e,height:t},this.magFilter=void 0!==o?o:1003,this.minFilter=void 0!==s?s:1003,this.flipY=!1,this.generateMipmaps=!1}function aa(e){dt.call(this),this.type="WireframeGeometry";var t,n,r,i,a,o,s,c,l,u,h=[],p=[0,0],d={},f=["a","b","c"];if(e&&e.isGeometry){var m=e.faces;for(t=0,r=m.length;t<r;t++){var g=m[t];for(n=0;n<3;n++)s=g[f[n]],c=g[f[(n+1)%3]],p[0]=Math.min(s,c),p[1]=Math.max(s,c),void 0===d[l=p[0]+","+p[1]]&&(d[l]={index1:p[0],index2:p[1]})}for(l in d)o=d[l],u=e.vertices[o.index1],h.push(u.x,u.y,u.z),u=e.vertices[o.index2],h.push(u.x,u.y,u.z)}else if(e&&e.isBufferGeometry){var v,y,x,b,_,M,S;if(u=new w,null!==e.index){for(v=e.attributes.position,y=e.index,0===(x=e.groups).length&&(x=[{start:0,count:y.count,materialIndex:0}]),i=0,a=x.length;i<a;++i)for(t=_=(b=x[i]).start,r=_+b.count;t<r;t+=3)for(n=0;n<3;n++)s=y.getX(t+n),c=y.getX(t+(n+1)%3),p[0]=Math.min(s,c),p[1]=Math.max(s,c),void 0===d[l=p[0]+","+p[1]]&&(d[l]={index1:p[0],index2:p[1]});for(l in d)o=d[l],u.fromBufferAttribute(v,o.index1),h.push(u.x,u.y,u.z),u.fromBufferAttribute(v,o.index2),h.push(u.x,u.y,u.z)}else for(t=0,r=(v=e.attributes.position).count/3;t<r;t++)for(n=0;n<3;n++)M=3*t+n,u.fromBufferAttribute(v,M),h.push(u.x,u.y,u.z),S=3*t+(n+1)%3,u.fromBufferAttribute(v,S),h.push(u.x,u.y,u.z)}this.setAttribute("position",new nt(h,3))}function oa(e,t,n){Ft.call(this),this.type="ParametricGeometry",this.parameters={func:e,slices:t,stacks:n},this.fromBufferGeometry(new sa(e,t,n)),this.mergeVertices()}function sa(e,t,n){dt.call(this),this.type="ParametricBufferGeometry",this.parameters={func:e,slices:t,stacks:n};var r,i,a=[],o=[],s=[],c=[],l=1e-5,u=new w,h=new w,p=new w,d=new w,f=new w;e.length<3&&console.error("THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.");var m=t+1;for(r=0;r<=n;r++){var g=r/n;for(i=0;i<=t;i++){var v=i/t;e(v,g,h),o.push(h.x,h.y,h.z),v-l>=0?(e(v-l,g,p),d.subVectors(h,p)):(e(v+l,g,p),d.subVectors(p,h)),g-l>=0?(e(v,g-l,p),f.subVectors(h,p)):(e(v,g+l,p),f.subVectors(p,h)),u.crossVectors(d,f).normalize(),s.push(u.x,u.y,u.z),c.push(v,g)}}for(r=0;r<n;r++)for(i=0;i<t;i++){var y=r*m+i,x=r*m+i+1,b=(r+1)*m+i+1,_=(r+1)*m+i;a.push(y,x,_),a.push(x,b,_)}this.setIndex(a),this.setAttribute("position",new nt(o,3)),this.setAttribute("normal",new nt(s,3)),this.setAttribute("uv",new nt(c,2))}function ca(e,t,n,r){Ft.call(this),this.type="PolyhedronGeometry",this.parameters={vertices:e,indices:t,radius:n,detail:r},this.fromBufferGeometry(new la(e,t,n,r)),this.mergeVertices()}function la(e,t,n,r){dt.call(this),this.type="PolyhedronBufferGeometry",this.parameters={vertices:e,indices:t,radius:n,detail:r},n=n||1;var i=[],a=[];function o(e,t,n,r){var i,a,o=Math.pow(2,r),c=[];for(i=0;i<=o;i++){c[i]=[];var l=e.clone().lerp(n,i/o),u=t.clone().lerp(n,i/o),h=o-i;for(a=0;a<=h;a++)c[i][a]=0===a&&i===o?l:l.clone().lerp(u,a/h)}for(i=0;i<o;i++)for(a=0;a<2*(o-i)-1;a++){var p=Math.floor(a/2);a%2==0?(s(c[i][p+1]),s(c[i+1][p]),s(c[i][p])):(s(c[i][p+1]),s(c[i+1][p+1]),s(c[i+1][p]))}}function s(e){i.push(e.x,e.y,e.z)}function c(t,n){var r=3*t;n.x=e[r+0],n.y=e[r+1],n.z=e[r+2]}function l(e,t,n,r){r<0&&1===e.x&&(a[t]=e.x-1),0===n.x&&0===n.z&&(a[t]=r/2/Math.PI+.5)}function u(e){return Math.atan2(e.z,-e.x)}!function(e){for(var n=new w,r=new w,i=new w,a=0;a<t.length;a+=3)c(t[a+0],n),c(t[a+1],r),c(t[a+2],i),o(n,r,i,e)}(r=r||0),function(e){for(var t=new w,n=0;n<i.length;n+=3)t.x=i[n+0],t.y=i[n+1],t.z=i[n+2],t.normalize().multiplyScalar(e),i[n+0]=t.x,i[n+1]=t.y,i[n+2]=t.z}(n),function(){for(var e=new w,t=0;t<i.length;t+=3){e.x=i[t+0],e.y=i[t+1],e.z=i[t+2];var n=u(e)/2/Math.PI+.5,r=(o=e,Math.atan2(-o.y,Math.sqrt(o.x*o.x+o.z*o.z))/Math.PI+.5);a.push(n,1-r)}var o;(function(){for(var e=new w,t=new w,n=new w,r=new w,o=new h,s=new h,c=new h,p=0,d=0;p<i.length;p+=9,d+=6){e.set(i[p+0],i[p+1],i[p+2]),t.set(i[p+3],i[p+4],i[p+5]),n.set(i[p+6],i[p+7],i[p+8]),o.set(a[d+0],a[d+1]),s.set(a[d+2],a[d+3]),c.set(a[d+4],a[d+5]),r.copy(e).add(t).add(n).divideScalar(3);var f=u(r);l(o,d+0,e,f),l(s,d+2,t,f),l(c,d+4,n,f)}})(),function(){for(var e=0;e<a.length;e+=6){var t=a[e+0],n=a[e+2],r=a[e+4],i=Math.max(t,n,r),o=Math.min(t,n,r);i>.9&&o<.1&&(t<.2&&(a[e+0]+=1),n<.2&&(a[e+2]+=1),r<.2&&(a[e+4]+=1))}}()}(),this.setAttribute("position",new nt(i,3)),this.setAttribute("normal",new nt(i.slice(),3)),this.setAttribute("uv",new nt(a,2)),0===r?this.computeVertexNormals():this.normalizeNormals()}function ua(e,t){Ft.call(this),this.type="TetrahedronGeometry",this.parameters={radius:e,detail:t},this.fromBufferGeometry(new ha(e,t)),this.mergeVertices()}function ha(e,t){la.call(this,[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],e,t),this.type="TetrahedronBufferGeometry",this.parameters={radius:e,detail:t}}function pa(e,t){Ft.call(this),this.type="OctahedronGeometry",this.parameters={radius:e,detail:t},this.fromBufferGeometry(new da(e,t)),this.mergeVertices()}function da(e,t){la.call(this,[1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],e,t),this.type="OctahedronBufferGeometry",this.parameters={radius:e,detail:t}}function fa(e,t){Ft.call(this),this.type="IcosahedronGeometry",this.parameters={radius:e,detail:t},this.fromBufferGeometry(new ma(e,t)),this.mergeVertices()}function ma(e,t){var n=(1+Math.sqrt(5))/2,r=[-1,n,0,1,n,0,-1,-n,0,1,-n,0,0,-1,n,0,1,n,0,-1,-n,0,1,-n,n,0,-1,n,0,1,-n,0,-1,-n,0,1];la.call(this,r,[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],e,t),this.type="IcosahedronBufferGeometry",this.parameters={radius:e,detail:t}}function ga(e,t){Ft.call(this),this.type="DodecahedronGeometry",this.parameters={radius:e,detail:t},this.fromBufferGeometry(new va(e,t)),this.mergeVertices()}function va(e,t){var n=(1+Math.sqrt(5))/2,r=1/n,i=[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-r,-n,0,-r,n,0,r,-n,0,r,n,-r,-n,0,-r,n,0,r,-n,0,r,n,0,-n,0,-r,n,0,-r,-n,0,r,n,0,r];la.call(this,i,[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],e,t),this.type="DodecahedronBufferGeometry",this.parameters={radius:e,detail:t}}function ya(e,t,n,r,i,a){Ft.call(this),this.type="TubeGeometry",this.parameters={path:e,tubularSegments:t,radius:n,radialSegments:r,closed:i},void 0!==a&&console.warn("THREE.TubeGeometry: taper has been removed.");var o=new xa(e,t,n,r,i);this.tangents=o.tangents,this.normals=o.normals,this.binormals=o.binormals,this.fromBufferGeometry(o),this.mergeVertices()}function xa(e,t,n,r,i){dt.call(this),this.type="TubeBufferGeometry",this.parameters={path:e,tubularSegments:t,radius:n,radialSegments:r,closed:i},t=t||64,n=n||1,r=r||8,i=i||!1;var a=e.computeFrenetFrames(t,i);this.tangents=a.tangents,this.normals=a.normals,this.binormals=a.binormals;var o,s,c=new w,l=new w,u=new h,p=new w,d=[],f=[],m=[],g=[];function v(i){p=e.getPointAt(i/t,p);var o=a.normals[i],u=a.binormals[i];for(s=0;s<=r;s++){var h=s/r*Math.PI*2,m=Math.sin(h),g=-Math.cos(h);l.x=g*o.x+m*u.x,l.y=g*o.y+m*u.y,l.z=g*o.z+m*u.z,l.normalize(),f.push(l.x,l.y,l.z),c.x=p.x+n*l.x,c.y=p.y+n*l.y,c.z=p.z+n*l.z,d.push(c.x,c.y,c.z)}}!function(){for(o=0;o<t;o++)v(o);v(!1===i?t:0),function(){for(o=0;o<=t;o++)for(s=0;s<=r;s++)u.x=o/t,u.y=s/r,m.push(u.x,u.y)}(),function(){for(s=1;s<=t;s++)for(o=1;o<=r;o++){var e=(r+1)*(s-1)+(o-1),n=(r+1)*s+(o-1),i=(r+1)*s+o,a=(r+1)*(s-1)+o;g.push(e,n,a),g.push(n,i,a)}}()}(),this.setIndex(g),this.setAttribute("position",new nt(d,3)),this.setAttribute("normal",new nt(f,3)),this.setAttribute("uv",new nt(m,2))}function ba(e,t,n,r,i,a,o){Ft.call(this),this.type="TorusKnotGeometry",this.parameters={radius:e,tube:t,tubularSegments:n,radialSegments:r,p:i,q:a},void 0!==o&&console.warn("THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead."),this.fromBufferGeometry(new _a(e,t,n,r,i,a)),this.mergeVertices()}function _a(e,t,n,r,i,a){dt.call(this),this.type="TorusKnotBufferGeometry",this.parameters={radius:e,tube:t,tubularSegments:n,radialSegments:r,p:i,q:a},e=e||1,t=t||.4,n=Math.floor(n)||64,r=Math.floor(r)||8,i=i||2,a=a||3;var o,s,c=[],l=[],u=[],h=[],p=new w,d=new w,f=new w,m=new w,g=new w,v=new w,y=new w;for(o=0;o<=n;++o){var x=o/n*i*Math.PI*2;for(L(x,i,a,e,f),L(x+.01,i,a,e,m),v.subVectors(m,f),y.addVectors(m,f),g.crossVectors(v,y),y.crossVectors(g,v),g.normalize(),y.normalize(),s=0;s<=r;++s){var b=s/r*Math.PI*2,_=-t*Math.cos(b),M=t*Math.sin(b);p.x=f.x+(_*y.x+M*g.x),p.y=f.y+(_*y.y+M*g.y),p.z=f.z+(_*y.z+M*g.z),l.push(p.x,p.y,p.z),d.subVectors(p,f).normalize(),u.push(d.x,d.y,d.z),h.push(o/n),h.push(s/r)}}for(s=1;s<=n;s++)for(o=1;o<=r;o++){var S=(r+1)*(s-1)+(o-1),E=(r+1)*s+(o-1),T=(r+1)*s+o,A=(r+1)*(s-1)+o;c.push(S,E,A),c.push(E,T,A)}function L(e,t,n,r,i){var a=Math.cos(e),o=Math.sin(e),s=n/t*e,c=Math.cos(s);i.x=r*(2+c)*.5*a,i.y=r*(2+c)*o*.5,i.z=r*Math.sin(s)*.5}this.setIndex(c),this.setAttribute("position",new nt(l,3)),this.setAttribute("normal",new nt(u,3)),this.setAttribute("uv",new nt(h,2))}function wa(e,t,n,r,i){Ft.call(this),this.type="TorusGeometry",this.parameters={radius:e,tube:t,radialSegments:n,tubularSegments:r,arc:i},this.fromBufferGeometry(new Ma(e,t,n,r,i)),this.mergeVertices()}function Ma(e,t,n,r,i){dt.call(this),this.type="TorusBufferGeometry",this.parameters={radius:e,tube:t,radialSegments:n,tubularSegments:r,arc:i},e=e||1,t=t||.4,n=Math.floor(n)||8,r=Math.floor(r)||6,i=i||2*Math.PI;var a,o,s=[],c=[],l=[],u=[],h=new w,p=new w,d=new w;for(a=0;a<=n;a++)for(o=0;o<=r;o++){var f=o/r*i,m=a/n*Math.PI*2;p.x=(e+t*Math.cos(m))*Math.cos(f),p.y=(e+t*Math.cos(m))*Math.sin(f),p.z=t*Math.sin(m),c.push(p.x,p.y,p.z),h.x=e*Math.cos(f),h.y=e*Math.sin(f),d.subVectors(p,h).normalize(),l.push(d.x,d.y,d.z),u.push(o/r),u.push(a/n)}for(a=1;a<=n;a++)for(o=1;o<=r;o++){var g=(r+1)*a+o-1,v=(r+1)*(a-1)+o-1,y=(r+1)*(a-1)+o,x=(r+1)*a+o;s.push(g,v,x),s.push(v,y,x)}this.setIndex(s),this.setAttribute("position",new nt(c,3)),this.setAttribute("normal",new nt(l,3)),this.setAttribute("uv",new nt(u,2))}$i.prototype=Object.assign(Object.create(Y.prototype),{constructor:$i,isPoints:!0,raycast:function(e,t){var n=this.geometry,r=this.matrixWorld,i=e.params.Points.threshold;if(null===n.boundingSphere&&n.computeBoundingSphere(),Qi.copy(n.boundingSphere),Qi.applyMatrix4(r),Qi.radius+=i,!1!==e.ray.intersectsSphere(Qi)){Zi.getInverse(r),Ji.copy(e.ray).applyMatrix4(Zi);var a=i/((this.scale.x+this.scale.y+this.scale.z)/3),o=a*a;if(n.isBufferGeometry){var s=n.index,c=n.attributes.position.array;if(null!==s)for(var l=s.array,u=0,h=l.length;u<h;u++){var p=l[u];Ki.fromArray(c,3*p),ea(Ki,p,o,r,e,t,this)}else{u=0;for(var d=c.length/3;u<d;u++)Ki.fromArray(c,3*u),ea(Ki,u,o,r,e,t,this)}}else{var f=n.vertices;for(u=0,d=f.length;u<d;u++)ea(f[u],u,o,r,e,t,this)}}},updateMorphTargets:function(){var e,t,n,r=this.geometry;if(r.isBufferGeometry){var i=r.morphAttributes,a=Object.keys(i);if(a.length>0){var o=i[a[0]];if(void 0!==o)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},e=0,t=o.length;e<t;e++)n=o[e].name||String(e),this.morphTargetInfluences.push(0),this.morphTargetDictionary[n]=e}}else{var s=r.morphTargets;void 0!==s&&s.length>0&&console.error("THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}},clone:function(){return new this.constructor(this.geometry,this.material).copy(this)}}),ta.prototype=Object.assign(Object.create(m.prototype),{constructor:ta,isVideoTexture:!0,update:function(){var e=this.image;e.readyState>=e.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}}),na.prototype=Object.create(m.prototype),na.prototype.constructor=na,na.prototype.isCompressedTexture=!0,ra.prototype=Object.create(m.prototype),ra.prototype.constructor=ra,ra.prototype.isCanvasTexture=!0,ia.prototype=Object.create(m.prototype),ia.prototype.constructor=ia,ia.prototype.isDepthTexture=!0,aa.prototype=Object.create(dt.prototype),aa.prototype.constructor=aa,oa.prototype=Object.create(Ft.prototype),oa.prototype.constructor=oa,sa.prototype=Object.create(dt.prototype),sa.prototype.constructor=sa,ca.prototype=Object.create(Ft.prototype),ca.prototype.constructor=ca,la.prototype=Object.create(dt.prototype),la.prototype.constructor=la,ua.prototype=Object.create(Ft.prototype),ua.prototype.constructor=ua,ha.prototype=Object.create(la.prototype),ha.prototype.constructor=ha,pa.prototype=Object.create(Ft.prototype),pa.prototype.constructor=pa,da.prototype=Object.create(la.prototype),da.prototype.constructor=da,fa.prototype=Object.create(Ft.prototype),fa.prototype.constructor=fa,ma.prototype=Object.create(la.prototype),ma.prototype.constructor=ma,ga.prototype=Object.create(Ft.prototype),ga.prototype.constructor=ga,va.prototype=Object.create(la.prototype),va.prototype.constructor=va,ya.prototype=Object.create(Ft.prototype),ya.prototype.constructor=ya,xa.prototype=Object.create(dt.prototype),xa.prototype.constructor=xa,xa.prototype.toJSON=function(){var e=dt.prototype.toJSON.call(this);return e.path=this.parameters.path.toJSON(),e},ba.prototype=Object.create(Ft.prototype),ba.prototype.constructor=ba,_a.prototype=Object.create(dt.prototype),_a.prototype.constructor=_a,wa.prototype=Object.create(Ft.prototype),wa.prototype.constructor=wa,Ma.prototype=Object.create(dt.prototype),Ma.prototype.constructor=Ma;var Sa=function(e,t,n){n=n||2;var r,i,a,o,s,c,l,u=t&&t.length,h=u?t[0]*n:e.length,p=Ea(e,0,h,n,!0),d=[];if(!p||p.next===p.prev)return d;if(u&&(p=function(e,t,n,r){var i,a,o,s,c,l=[];for(i=0,a=t.length;i<a;i++)o=t[i]*r,s=i<a-1?t[i+1]*r:e.length,(c=Ea(e,o,s,r,!1))===c.next&&(c.steiner=!0),l.push(Ia(c));for(l.sort(Oa),i=0;i<l.length;i++)Da(l[i],n),n=Ta(n,n.next);return n}(e,t,p,n)),e.length>80*n){r=a=e[0],i=o=e[1];for(var f=n;f<h;f+=n)(s=e[f])<r&&(r=s),(c=e[f+1])<i&&(i=c),s>a&&(a=s),c>o&&(o=c);l=0!==(l=Math.max(a-r,o-i))?1/l:0}return Aa(p,d,n,r,i,l),d};function Ea(e,t,n,r,i){var a,o;if(i===function(e,t,n,r){for(var i=0,a=t,o=n-r;a<n;a+=r)i+=(e[o]-e[a])*(e[a+1]+e[o+1]),o=a;return i}(e,t,n,r)>0)for(a=t;a<n;a+=r)o=Ga(a,e[a],e[a+1],o);else for(a=n-r;a>=t;a-=r)o=Ga(a,e[a],e[a+1],o);return o&&Ba(o,o.next)&&(Va(o),o=o.next),o}function Ta(e,t){if(!e)return e;t||(t=e);var n,r=e;do{if(n=!1,r.steiner||!Ba(r,r.next)&&0!==Fa(r.prev,r,r.next))r=r.next;else{if(Va(r),(r=t=r.prev)===r.next)break;n=!0}}while(n||r!==t);return t}function Aa(e,t,n,r,i,a,o){if(e){!o&&a&&function(e,t,n,r){var i=e;do{null===i.z&&(i.z=Na(i.x,i.y,t,n,r)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next}while(i!==e);i.prevZ.nextZ=null,i.prevZ=null,function(e){var t,n,r,i,a,o,s,c,l=1;do{for(n=e,e=null,a=null,o=0;n;){for(o++,r=n,s=0,t=0;t<l&&(s++,r=r.nextZ);t++);for(c=l;s>0||c>0&&r;)0!==s&&(0===c||!r||n.z<=r.z)?(i=n,n=n.nextZ,s--):(i=r,r=r.nextZ,c--),a?a.nextZ=i:e=i,i.prevZ=a,a=i;n=r}a.nextZ=null,l*=2}while(o>1)}(i)}(e,r,i,a);for(var s,c,l=e;e.prev!==e.next;)if(s=e.prev,c=e.next,a?Pa(e,r,i,a):La(e))t.push(s.i/n),t.push(e.i/n),t.push(c.i/n),Va(e),e=c.next,l=c.next;else if((e=c)===l){o?1===o?Aa(e=Ra(e,t,n),t,n,r,i,a,2):2===o&&Ca(e,t,n,r,i,a):Aa(Ta(e),t,n,r,i,a,1);break}}}function La(e){var t=e.prev,n=e,r=e.next;if(Fa(t,n,r)>=0)return!1;for(var i=e.next.next;i!==e.prev;){if(za(t.x,t.y,n.x,n.y,r.x,r.y,i.x,i.y)&&Fa(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function Pa(e,t,n,r){var i=e.prev,a=e,o=e.next;if(Fa(i,a,o)>=0)return!1;for(var s=i.x<a.x?i.x<o.x?i.x:o.x:a.x<o.x?a.x:o.x,c=i.y<a.y?i.y<o.y?i.y:o.y:a.y<o.y?a.y:o.y,l=i.x>a.x?i.x>o.x?i.x:o.x:a.x>o.x?a.x:o.x,u=i.y>a.y?i.y>o.y?i.y:o.y:a.y>o.y?a.y:o.y,h=Na(s,c,t,n,r),p=Na(l,u,t,n,r),d=e.prevZ,f=e.nextZ;d&&d.z>=h&&f&&f.z<=p;){if(d!==e.prev&&d!==e.next&&za(i.x,i.y,a.x,a.y,o.x,o.y,d.x,d.y)&&Fa(d.prev,d,d.next)>=0)return!1;if(d=d.prevZ,f!==e.prev&&f!==e.next&&za(i.x,i.y,a.x,a.y,o.x,o.y,f.x,f.y)&&Fa(f.prev,f,f.next)>=0)return!1;f=f.nextZ}for(;d&&d.z>=h;){if(d!==e.prev&&d!==e.next&&za(i.x,i.y,a.x,a.y,o.x,o.y,d.x,d.y)&&Fa(d.prev,d,d.next)>=0)return!1;d=d.prevZ}for(;f&&f.z<=p;){if(f!==e.prev&&f!==e.next&&za(i.x,i.y,a.x,a.y,o.x,o.y,f.x,f.y)&&Fa(f.prev,f,f.next)>=0)return!1;f=f.nextZ}return!0}function Ra(e,t,n){var r=e;do{var i=r.prev,a=r.next.next;!Ba(i,a)&&Ua(i,r,r.next,a)&&ja(i,a)&&ja(a,i)&&(t.push(i.i/n),t.push(r.i/n),t.push(a.i/n),Va(r),Va(r.next),r=e=a),r=r.next}while(r!==e);return r}function Ca(e,t,n,r,i,a){var o=e;do{for(var s=o.next.next;s!==o.prev;){if(o.i!==s.i&&ka(o,s)){var c=Ha(o,s);return o=Ta(o,o.next),c=Ta(c,c.next),Aa(o,t,n,r,i,a),void Aa(c,t,n,r,i,a)}s=s.next}o=o.next}while(o!==e)}function Oa(e,t){return e.x-t.x}function Da(e,t){if(t=function(e,t){var n,r=t,i=e.x,a=e.y,o=-1/0;do{if(a<=r.y&&a>=r.next.y&&r.next.y!==r.y){var s=r.x+(a-r.y)*(r.next.x-r.x)/(r.next.y-r.y);if(s<=i&&s>o){if(o=s,s===i){if(a===r.y)return r;if(a===r.next.y)return r.next}n=r.x<r.next.x?r:r.next}}r=r.next}while(r!==t);if(!n)return null;if(i===o)return n.prev;var c,l=n,u=n.x,h=n.y,p=1/0;r=n.next;for(;r!==l;)i>=r.x&&r.x>=u&&i!==r.x&&za(a<h?i:o,a,u,h,a<h?o:i,a,r.x,r.y)&&((c=Math.abs(a-r.y)/(i-r.x))<p||c===p&&r.x>n.x)&&ja(r,e)&&(n=r,p=c),r=r.next;return n}(e,t)){var n=Ha(t,e);Ta(n,n.next)}}function Na(e,t,n,r,i){return(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-n)*i)|e<<8))|e<<4))|e<<2))|e<<1))|(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-r)*i)|t<<8))|t<<4))|t<<2))|t<<1))<<1}function Ia(e){var t=e,n=e;do{(t.x<n.x||t.x===n.x&&t.y<n.y)&&(n=t),t=t.next}while(t!==e);return n}function za(e,t,n,r,i,a,o,s){return(i-o)*(t-s)-(e-o)*(a-s)>=0&&(e-o)*(r-s)-(n-o)*(t-s)>=0&&(n-o)*(a-s)-(i-o)*(r-s)>=0}function ka(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!function(e,t){var n=e;do{if(n.i!==e.i&&n.next.i!==e.i&&n.i!==t.i&&n.next.i!==t.i&&Ua(n,n.next,e,t))return!0;n=n.next}while(n!==e);return!1}(e,t)&&ja(e,t)&&ja(t,e)&&function(e,t){var n=e,r=!1,i=(e.x+t.x)/2,a=(e.y+t.y)/2;do{n.y>a!=n.next.y>a&&n.next.y!==n.y&&i<(n.next.x-n.x)*(a-n.y)/(n.next.y-n.y)+n.x&&(r=!r),n=n.next}while(n!==e);return r}(e,t)}function Fa(e,t,n){return(t.y-e.y)*(n.x-t.x)-(t.x-e.x)*(n.y-t.y)}function Ba(e,t){return e.x===t.x&&e.y===t.y}function Ua(e,t,n,r){return!!(Ba(e,n)&&Ba(t,r)||Ba(e,r)&&Ba(n,t))||Fa(e,t,n)>0!=Fa(e,t,r)>0&&Fa(n,r,e)>0!=Fa(n,r,t)>0}function ja(e,t){return Fa(e.prev,e,e.next)<0?Fa(e,t,e.next)>=0&&Fa(e,e.prev,t)>=0:Fa(e,t,e.prev)<0||Fa(e,e.next,t)<0}function Ha(e,t){var n=new Wa(e.i,e.x,e.y),r=new Wa(t.i,t.x,t.y),i=e.next,a=t.prev;return e.next=t,t.prev=e,n.next=i,i.prev=n,r.next=n,n.prev=r,a.next=r,r.prev=a,r}function Ga(e,t,n,r){var i=new Wa(e,t,n);return r?(i.next=r.next,i.prev=r,r.next.prev=i,r.next=i):(i.prev=i,i.next=i),i}function Va(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function Wa(e,t,n){this.i=e,this.x=t,this.y=n,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}var qa={area:function(e){for(var t=e.length,n=0,r=t-1,i=0;i<t;r=i++)n+=e[r].x*e[i].y-e[i].x*e[r].y;return.5*n},isClockWise:function(e){return qa.area(e)<0},triangulateShape:function(e,t){var n=[],r=[],i=[];Xa(e),Ya(n,e);var a=e.length;t.forEach(Xa);for(var o=0;o<t.length;o++)r.push(a),a+=t[o].length,Ya(n,t[o]);var s=Sa(n,r);for(o=0;o<s.length;o+=3)i.push(s.slice(o,o+3));return i}};function Xa(e){var t=e.length;t>2&&e[t-1].equals(e[0])&&e.pop()}function Ya(e,t){for(var n=0;n<t.length;n++)e.push(t[n].x),e.push(t[n].y)}function Za(e,t){Ft.call(this),this.type="ExtrudeGeometry",this.parameters={shapes:e,options:t},this.fromBufferGeometry(new Ja(e,t)),this.mergeVertices()}function Ja(e,t){dt.call(this),this.type="ExtrudeBufferGeometry",this.parameters={shapes:e,options:t},e=Array.isArray(e)?e:[e];for(var n=this,r=[],i=[],a=0,o=e.length;a<o;a++){s(e[a])}function s(e){var a=[],o=void 0!==t.curveSegments?t.curveSegments:12,s=void 0!==t.steps?t.steps:1,c=void 0!==t.depth?t.depth:100,l=void 0===t.bevelEnabled||t.bevelEnabled,u=void 0!==t.bevelThickness?t.bevelThickness:6,p=void 0!==t.bevelSize?t.bevelSize:u-2,d=void 0!==t.bevelOffset?t.bevelOffset:0,f=void 0!==t.bevelSegments?t.bevelSegments:3,m=t.extrudePath,g=void 0!==t.UVGenerator?t.UVGenerator:Qa;void 0!==t.amount&&(console.warn("THREE.ExtrudeBufferGeometry: amount has been renamed to depth."),c=t.amount);var v,y,x,b,_,M,S,E,T=!1;m&&(v=m.getSpacedPoints(s),T=!0,l=!1,y=m.computeFrenetFrames(s,!1),x=new w,b=new w,_=new w),l||(f=0,u=0,p=0,d=0);var A=e.extractPoints(o),L=A.shape,P=A.holes;if(!qa.isClockWise(L))for(L=L.reverse(),S=0,E=P.length;S<E;S++)M=P[S],qa.isClockWise(M)&&(P[S]=M.reverse());var R=qa.triangulateShape(L,P),C=L;for(S=0,E=P.length;S<E;S++)M=P[S],L=L.concat(M);function O(e,t,n){return t||console.error("THREE.ExtrudeGeometry: vec does not exist"),t.clone().multiplyScalar(n).add(e)}var D,N,I,z,k,F,B=L.length,U=R.length;function j(e,t,n){var r,i,a,o=e.x-t.x,s=e.y-t.y,c=n.x-e.x,l=n.y-e.y,u=o*o+s*s,p=o*l-s*c;if(Math.abs(p)>Number.EPSILON){var d=Math.sqrt(u),f=Math.sqrt(c*c+l*l),m=t.x-s/d,g=t.y+o/d,v=((n.x-l/f-m)*l-(n.y+c/f-g)*c)/(o*l-s*c),y=(r=m+o*v-e.x)*r+(i=g+s*v-e.y)*i;if(y<=2)return new h(r,i);a=Math.sqrt(y/2)}else{var x=!1;o>Number.EPSILON?c>Number.EPSILON&&(x=!0):o<-Number.EPSILON?c<-Number.EPSILON&&(x=!0):Math.sign(s)===Math.sign(l)&&(x=!0),x?(r=-s,i=o,a=Math.sqrt(u)):(r=o,i=s,a=Math.sqrt(u/2))}return new h(r/a,i/a)}for(var H=[],G=0,V=C.length,W=V-1,q=G+1;G<V;G++,W++,q++)W===V&&(W=0),q===V&&(q=0),H[G]=j(C[G],C[W],C[q]);var X,Y,Z=[],J=H.concat();for(S=0,E=P.length;S<E;S++){for(M=P[S],X=[],G=0,W=(V=M.length)-1,q=G+1;G<V;G++,W++,q++)W===V&&(W=0),q===V&&(q=0),X[G]=j(M[G],M[W],M[q]);Z.push(X),J=J.concat(X)}for(D=0;D<f;D++){for(I=D/f,z=u*Math.cos(I*Math.PI/2),N=p*Math.sin(I*Math.PI/2)+d,G=0,V=C.length;G<V;G++)K((k=O(C[G],H[G],N)).x,k.y,-z);for(S=0,E=P.length;S<E;S++)for(M=P[S],X=Z[S],G=0,V=M.length;G<V;G++)K((k=O(M[G],X[G],N)).x,k.y,-z)}for(N=p+d,G=0;G<B;G++)k=l?O(L[G],J[G],N):L[G],T?(b.copy(y.normals[0]).multiplyScalar(k.x),x.copy(y.binormals[0]).multiplyScalar(k.y),_.copy(v[0]).add(b).add(x),K(_.x,_.y,_.z)):K(k.x,k.y,0);for(Y=1;Y<=s;Y++)for(G=0;G<B;G++)k=l?O(L[G],J[G],N):L[G],T?(b.copy(y.normals[Y]).multiplyScalar(k.x),x.copy(y.binormals[Y]).multiplyScalar(k.y),_.copy(v[Y]).add(b).add(x),K(_.x,_.y,_.z)):K(k.x,k.y,c/s*Y);for(D=f-1;D>=0;D--){for(I=D/f,z=u*Math.cos(I*Math.PI/2),N=p*Math.sin(I*Math.PI/2)+d,G=0,V=C.length;G<V;G++)K((k=O(C[G],H[G],N)).x,k.y,c+z);for(S=0,E=P.length;S<E;S++)for(M=P[S],X=Z[S],G=0,V=M.length;G<V;G++)k=O(M[G],X[G],N),T?K(k.x,k.y+v[s-1].y,v[s-1].x+z):K(k.x,k.y,c+z)}function Q(e,t){var n,r;for(G=e.length;--G>=0;){n=G,(r=G-1)<0&&(r=e.length-1);var i=0,a=s+2*f;for(i=0;i<a;i++){var o=B*i,c=B*(i+1);ee(t+n+o,t+r+o,t+r+c,t+n+c)}}}function K(e,t,n){a.push(e),a.push(t),a.push(n)}function $(e,t,i){te(e),te(t),te(i);var a=r.length/3,o=g.generateTopUV(n,r,a-3,a-2,a-1);ne(o[0]),ne(o[1]),ne(o[2])}function ee(e,t,i,a){te(e),te(t),te(a),te(t),te(i),te(a);var o=r.length/3,s=g.generateSideWallUV(n,r,o-6,o-3,o-2,o-1);ne(s[0]),ne(s[1]),ne(s[3]),ne(s[1]),ne(s[2]),ne(s[3])}function te(e){r.push(a[3*e+0]),r.push(a[3*e+1]),r.push(a[3*e+2])}function ne(e){i.push(e.x),i.push(e.y)}!function(){var e=r.length/3;if(l){var t=0,i=B*t;for(G=0;G<U;G++)$((F=R[G])[2]+i,F[1]+i,F[0]+i);for(i=B*(t=s+2*f),G=0;G<U;G++)$((F=R[G])[0]+i,F[1]+i,F[2]+i)}else{for(G=0;G<U;G++)$((F=R[G])[2],F[1],F[0]);for(G=0;G<U;G++)$((F=R[G])[0]+B*s,F[1]+B*s,F[2]+B*s)}n.addGroup(e,r.length/3-e,0)}(),function(){var e=r.length/3,t=0;for(Q(C,t),t+=C.length,S=0,E=P.length;S<E;S++)Q(M=P[S],t),t+=M.length;n.addGroup(e,r.length/3-e,1)}()}this.setAttribute("position",new nt(r,3)),this.setAttribute("uv",new nt(i,2)),this.computeVertexNormals()}Za.prototype=Object.create(Ft.prototype),Za.prototype.constructor=Za,Za.prototype.toJSON=function(){var e=Ft.prototype.toJSON.call(this);return Ka(this.parameters.shapes,this.parameters.options,e)},Ja.prototype=Object.create(dt.prototype),Ja.prototype.constructor=Ja,Ja.prototype.toJSON=function(){var e=dt.prototype.toJSON.call(this);return Ka(this.parameters.shapes,this.parameters.options,e)};var Qa={generateTopUV:function(e,t,n,r,i){var a=t[3*n],o=t[3*n+1],s=t[3*r],c=t[3*r+1],l=t[3*i],u=t[3*i+1];return[new h(a,o),new h(s,c),new h(l,u)]},generateSideWallUV:function(e,t,n,r,i,a){var o=t[3*n],s=t[3*n+1],c=t[3*n+2],l=t[3*r],u=t[3*r+1],p=t[3*r+2],d=t[3*i],f=t[3*i+1],m=t[3*i+2],g=t[3*a],v=t[3*a+1],y=t[3*a+2];return Math.abs(s-u)<.01?[new h(o,1-c),new h(l,1-p),new h(d,1-m),new h(g,1-y)]:[new h(s,1-c),new h(u,1-p),new h(f,1-m),new h(v,1-y)]}};function Ka(e,t,n){if(n.shapes=[],Array.isArray(e))for(var r=0,i=e.length;r<i;r++){var a=e[r];n.shapes.push(a.uuid)}else n.shapes.push(e.uuid);return void 0!==t.extrudePath&&(n.options.extrudePath=t.extrudePath.toJSON()),n}function $a(e,t){Ft.call(this),this.type="TextGeometry",this.parameters={text:e,parameters:t},this.fromBufferGeometry(new eo(e,t)),this.mergeVertices()}function eo(e,t){var n=(t=t||{}).font;if(!n||!n.isFont)return console.error("THREE.TextGeometry: font parameter is not an instance of THREE.Font."),new Ft;var r=n.generateShapes(e,t.size);t.depth=void 0!==t.height?t.height:50,void 0===t.bevelThickness&&(t.bevelThickness=10),void 0===t.bevelSize&&(t.bevelSize=8),void 0===t.bevelEnabled&&(t.bevelEnabled=!1),Ja.call(this,r,t),this.type="TextBufferGeometry"}function to(e,t,n,r,i,a,o){Ft.call(this),this.type="SphereGeometry",this.parameters={radius:e,widthSegments:t,heightSegments:n,phiStart:r,phiLength:i,thetaStart:a,thetaLength:o},this.fromBufferGeometry(new no(e,t,n,r,i,a,o)),this.mergeVertices()}function no(e,t,n,r,i,a,o){dt.call(this),this.type="SphereBufferGeometry",this.parameters={radius:e,widthSegments:t,heightSegments:n,phiStart:r,phiLength:i,thetaStart:a,thetaLength:o},e=e||1,t=Math.max(3,Math.floor(t)||8),n=Math.max(2,Math.floor(n)||6),r=void 0!==r?r:0,i=void 0!==i?i:2*Math.PI,a=void 0!==a?a:0,o=void 0!==o?o:Math.PI;var s,c,l=Math.min(a+o,Math.PI),u=0,h=[],p=new w,d=new w,f=[],m=[],g=[],v=[];for(c=0;c<=n;c++){var y=[],x=c/n,b=0;for(0==c&&0==a?b=.5/t:c==n&&l==Math.PI&&(b=-.5/t),s=0;s<=t;s++){var _=s/t;p.x=-e*Math.cos(r+_*i)*Math.sin(a+x*o),p.y=e*Math.cos(a+x*o),p.z=e*Math.sin(r+_*i)*Math.sin(a+x*o),m.push(p.x,p.y,p.z),d.copy(p).normalize(),g.push(d.x,d.y,d.z),v.push(_+b,1-x),y.push(u++)}h.push(y)}for(c=0;c<n;c++)for(s=0;s<t;s++){var M=h[c][s+1],S=h[c][s],E=h[c+1][s],T=h[c+1][s+1];(0!==c||a>0)&&f.push(M,S,T),(c!==n-1||l<Math.PI)&&f.push(S,E,T)}this.setIndex(f),this.setAttribute("position",new nt(m,3)),this.setAttribute("normal",new nt(g,3)),this.setAttribute("uv",new nt(v,2))}function ro(e,t,n,r,i,a){Ft.call(this),this.type="RingGeometry",this.parameters={innerRadius:e,outerRadius:t,thetaSegments:n,phiSegments:r,thetaStart:i,thetaLength:a},this.fromBufferGeometry(new io(e,t,n,r,i,a)),this.mergeVertices()}function io(e,t,n,r,i,a){dt.call(this),this.type="RingBufferGeometry",this.parameters={innerRadius:e,outerRadius:t,thetaSegments:n,phiSegments:r,thetaStart:i,thetaLength:a},e=e||.5,t=t||1,i=void 0!==i?i:0,a=void 0!==a?a:2*Math.PI,n=void 0!==n?Math.max(3,n):8;var o,s,c,l=[],u=[],p=[],d=[],f=e,m=(t-e)/(r=void 0!==r?Math.max(1,r):1),g=new w,v=new h;for(s=0;s<=r;s++){for(c=0;c<=n;c++)o=i+c/n*a,g.x=f*Math.cos(o),g.y=f*Math.sin(o),u.push(g.x,g.y,g.z),p.push(0,0,1),v.x=(g.x/t+1)/2,v.y=(g.y/t+1)/2,d.push(v.x,v.y);f+=m}for(s=0;s<r;s++){var y=s*(n+1);for(c=0;c<n;c++){var x=o=c+y,b=o+n+1,_=o+n+2,M=o+1;l.push(x,b,M),l.push(b,_,M)}}this.setIndex(l),this.setAttribute("position",new nt(u,3)),this.setAttribute("normal",new nt(p,3)),this.setAttribute("uv",new nt(d,2))}function ao(e,t,n,r){Ft.call(this),this.type="LatheGeometry",this.parameters={points:e,segments:t,phiStart:n,phiLength:r},this.fromBufferGeometry(new oo(e,t,n,r)),this.mergeVertices()}function oo(e,t,n,r){dt.call(this),this.type="LatheBufferGeometry",this.parameters={points:e,segments:t,phiStart:n,phiLength:r},t=Math.floor(t)||12,n=n||0,r=r||2*Math.PI,r=u.clamp(r,0,2*Math.PI);var i,a,o,s=[],c=[],l=[],p=1/t,d=new w,f=new h;for(a=0;a<=t;a++){var m=n+a*p*r,g=Math.sin(m),v=Math.cos(m);for(o=0;o<=e.length-1;o++)d.x=e[o].x*g,d.y=e[o].y,d.z=e[o].x*v,c.push(d.x,d.y,d.z),f.x=a/t,f.y=o/(e.length-1),l.push(f.x,f.y)}for(a=0;a<t;a++)for(o=0;o<e.length-1;o++){var y=i=o+a*e.length,x=i+e.length,b=i+e.length+1,_=i+1;s.push(y,x,_),s.push(x,b,_)}if(this.setIndex(s),this.setAttribute("position",new nt(c,3)),this.setAttribute("uv",new nt(l,2)),this.computeVertexNormals(),r===2*Math.PI){var M=this.attributes.normal.array,S=new w,E=new w,T=new w;for(i=t*e.length*3,a=0,o=0;a<e.length;a++,o+=3)S.x=M[o+0],S.y=M[o+1],S.z=M[o+2],E.x=M[i+o+0],E.y=M[i+o+1],E.z=M[i+o+2],T.addVectors(S,E).normalize(),M[o+0]=M[i+o+0]=T.x,M[o+1]=M[i+o+1]=T.y,M[o+2]=M[i+o+2]=T.z}}function so(e,t){Ft.call(this),this.type="ShapeGeometry","object"==typeof t&&(console.warn("THREE.ShapeGeometry: Options parameter has been removed."),t=t.curveSegments),this.parameters={shapes:e,curveSegments:t},this.fromBufferGeometry(new co(e,t)),this.mergeVertices()}function co(e,t){dt.call(this),this.type="ShapeBufferGeometry",this.parameters={shapes:e,curveSegments:t},t=t||12;var n=[],r=[],i=[],a=[],o=0,s=0;if(!1===Array.isArray(e))l(e);else for(var c=0;c<e.length;c++)l(e[c]),this.addGroup(o,s,c),o+=s,s=0;function l(e){var o,c,l,u=r.length/3,h=e.extractPoints(t),p=h.shape,d=h.holes;for(!1===qa.isClockWise(p)&&(p=p.reverse()),o=0,c=d.length;o<c;o++)l=d[o],!0===qa.isClockWise(l)&&(d[o]=l.reverse());var f=qa.triangulateShape(p,d);for(o=0,c=d.length;o<c;o++)l=d[o],p=p.concat(l);for(o=0,c=p.length;o<c;o++){var m=p[o];r.push(m.x,m.y,0),i.push(0,0,1),a.push(m.x,m.y)}for(o=0,c=f.length;o<c;o++){var g=f[o],v=g[0]+u,y=g[1]+u,x=g[2]+u;n.push(v,y,x),s+=3}}this.setIndex(n),this.setAttribute("position",new nt(r,3)),this.setAttribute("normal",new nt(i,3)),this.setAttribute("uv",new nt(a,2))}function lo(e,t){if(t.shapes=[],Array.isArray(e))for(var n=0,r=e.length;n<r;n++){var i=e[n];t.shapes.push(i.uuid)}else t.shapes.push(e.uuid);return t}function uo(e,t){dt.call(this),this.type="EdgesGeometry",this.parameters={thresholdAngle:t},t=void 0!==t?t:1;var n,r,i,a,o=[],s=Math.cos(u.DEG2RAD*t),c=[0,0],l={},h=["a","b","c"];e.isBufferGeometry?(a=new Ft).fromBufferGeometry(e):a=e.clone(),a.mergeVertices(),a.computeFaceNormals();for(var p=a.vertices,d=a.faces,f=0,m=d.length;f<m;f++)for(var g=d[f],v=0;v<3;v++)n=g[h[v]],r=g[h[(v+1)%3]],c[0]=Math.min(n,r),c[1]=Math.max(n,r),void 0===l[i=c[0]+","+c[1]]?l[i]={index1:c[0],index2:c[1],face1:f,face2:void 0}:l[i].face2=f;for(i in l){var y=l[i];if(void 0===y.face2||d[y.face1].normal.dot(d[y.face2].normal)<=s){var x=p[y.index1];o.push(x.x,x.y,x.z),x=p[y.index2],o.push(x.x,x.y,x.z)}}this.setAttribute("position",new nt(o,3))}function ho(e,t,n,r,i,a,o,s){Ft.call(this),this.type="CylinderGeometry",this.parameters={radiusTop:e,radiusBottom:t,height:n,radialSegments:r,heightSegments:i,openEnded:a,thetaStart:o,thetaLength:s},this.fromBufferGeometry(new po(e,t,n,r,i,a,o,s)),this.mergeVertices()}function po(e,t,n,r,i,a,o,s){dt.call(this),this.type="CylinderBufferGeometry",this.parameters={radiusTop:e,radiusBottom:t,height:n,radialSegments:r,heightSegments:i,openEnded:a,thetaStart:o,thetaLength:s};var c=this;e=void 0!==e?e:1,t=void 0!==t?t:1,n=n||1,r=Math.floor(r)||8,i=Math.floor(i)||1,a=void 0!==a&&a,o=void 0!==o?o:0,s=void 0!==s?s:2*Math.PI;var l=[],u=[],p=[],d=[],f=0,m=[],g=n/2,v=0;function y(n){var i,a,m,y=new h,x=new w,b=0,_=!0===n?e:t,M=!0===n?1:-1;for(a=f,i=1;i<=r;i++)u.push(0,g*M,0),p.push(0,M,0),d.push(.5,.5),f++;for(m=f,i=0;i<=r;i++){var S=i/r*s+o,E=Math.cos(S),T=Math.sin(S);x.x=_*T,x.y=g*M,x.z=_*E,u.push(x.x,x.y,x.z),p.push(0,M,0),y.x=.5*E+.5,y.y=.5*T*M+.5,d.push(y.x,y.y),f++}for(i=0;i<r;i++){var A=a+i,L=m+i;!0===n?l.push(L,L+1,A):l.push(L+1,L,A),b+=3}c.addGroup(v,b,!0===n?1:2),v+=b}!function(){var a,h,y=new w,x=new w,b=0,_=(t-e)/n;for(h=0;h<=i;h++){var M=[],S=h/i,E=S*(t-e)+e;for(a=0;a<=r;a++){var T=a/r,A=T*s+o,L=Math.sin(A),P=Math.cos(A);x.x=E*L,x.y=-S*n+g,x.z=E*P,u.push(x.x,x.y,x.z),y.set(L,_,P).normalize(),p.push(y.x,y.y,y.z),d.push(T,1-S),M.push(f++)}m.push(M)}for(a=0;a<r;a++)for(h=0;h<i;h++){var R=m[h][a],C=m[h+1][a],O=m[h+1][a+1],D=m[h][a+1];l.push(R,C,D),l.push(C,O,D),b+=6}c.addGroup(v,b,0),v+=b}(),!1===a&&(e>0&&y(!0),t>0&&y(!1)),this.setIndex(l),this.setAttribute("position",new nt(u,3)),this.setAttribute("normal",new nt(p,3)),this.setAttribute("uv",new nt(d,2))}function fo(e,t,n,r,i,a,o){ho.call(this,0,e,t,n,r,i,a,o),this.type="ConeGeometry",this.parameters={radius:e,height:t,radialSegments:n,heightSegments:r,openEnded:i,thetaStart:a,thetaLength:o}}function mo(e,t,n,r,i,a,o){po.call(this,0,e,t,n,r,i,a,o),this.type="ConeBufferGeometry",this.parameters={radius:e,height:t,radialSegments:n,heightSegments:r,openEnded:i,thetaStart:a,thetaLength:o}}function go(e,t,n,r){Ft.call(this),this.type="CircleGeometry",this.parameters={radius:e,segments:t,thetaStart:n,thetaLength:r},this.fromBufferGeometry(new vo(e,t,n,r)),this.mergeVertices()}function vo(e,t,n,r){dt.call(this),this.type="CircleBufferGeometry",this.parameters={radius:e,segments:t,thetaStart:n,thetaLength:r},e=e||1,t=void 0!==t?Math.max(3,t):8,n=void 0!==n?n:0,r=void 0!==r?r:2*Math.PI;var i,a,o=[],s=[],c=[],l=[],u=new w,p=new h;for(s.push(0,0,0),c.push(0,0,1),l.push(.5,.5),a=0,i=3;a<=t;a++,i+=3){var d=n+a/t*r;u.x=e*Math.cos(d),u.y=e*Math.sin(d),s.push(u.x,u.y,u.z),c.push(0,0,1),p.x=(s[i]/e+1)/2,p.y=(s[i+1]/e+1)/2,l.push(p.x,p.y)}for(i=1;i<=t;i++)o.push(i,i+1,0);this.setIndex(o),this.setAttribute("position",new nt(s,3)),this.setAttribute("normal",new nt(c,3)),this.setAttribute("uv",new nt(l,2))}$a.prototype=Object.create(Ft.prototype),$a.prototype.constructor=$a,eo.prototype=Object.create(Ja.prototype),eo.prototype.constructor=eo,to.prototype=Object.create(Ft.prototype),to.prototype.constructor=to,no.prototype=Object.create(dt.prototype),no.prototype.constructor=no,ro.prototype=Object.create(Ft.prototype),ro.prototype.constructor=ro,io.prototype=Object.create(dt.prototype),io.prototype.constructor=io,ao.prototype=Object.create(Ft.prototype),ao.prototype.constructor=ao,oo.prototype=Object.create(dt.prototype),oo.prototype.constructor=oo,so.prototype=Object.create(Ft.prototype),so.prototype.constructor=so,so.prototype.toJSON=function(){var e=Ft.prototype.toJSON.call(this);return lo(this.parameters.shapes,e)},co.prototype=Object.create(dt.prototype),co.prototype.constructor=co,co.prototype.toJSON=function(){var e=dt.prototype.toJSON.call(this);return lo(this.parameters.shapes,e)},uo.prototype=Object.create(dt.prototype),uo.prototype.constructor=uo,ho.prototype=Object.create(Ft.prototype),ho.prototype.constructor=ho,po.prototype=Object.create(dt.prototype),po.prototype.constructor=po,fo.prototype=Object.create(ho.prototype),fo.prototype.constructor=fo,mo.prototype=Object.create(po.prototype),mo.prototype.constructor=mo,go.prototype=Object.create(Ft.prototype),go.prototype.constructor=go,vo.prototype=Object.create(dt.prototype),vo.prototype.constructor=vo;var yo=Object.freeze({__proto__:null,WireframeGeometry:aa,ParametricGeometry:oa,ParametricBufferGeometry:sa,TetrahedronGeometry:ua,TetrahedronBufferGeometry:ha,OctahedronGeometry:pa,OctahedronBufferGeometry:da,IcosahedronGeometry:fa,IcosahedronBufferGeometry:ma,DodecahedronGeometry:ga,DodecahedronBufferGeometry:va,PolyhedronGeometry:ca,PolyhedronBufferGeometry:la,TubeGeometry:ya,TubeBufferGeometry:xa,TorusKnotGeometry:ba,TorusKnotBufferGeometry:_a,TorusGeometry:wa,TorusBufferGeometry:Ma,TextGeometry:$a,TextBufferGeometry:eo,SphereGeometry:to,SphereBufferGeometry:no,RingGeometry:ro,RingBufferGeometry:io,PlaneGeometry:nn,PlaneBufferGeometry:rn,LatheGeometry:ao,LatheBufferGeometry:oo,ShapeGeometry:so,ShapeBufferGeometry:co,ExtrudeGeometry:Za,ExtrudeBufferGeometry:Ja,EdgesGeometry:uo,ConeGeometry:fo,ConeBufferGeometry:mo,CylinderGeometry:ho,CylinderBufferGeometry:po,CircleGeometry:go,CircleBufferGeometry:vo,BoxGeometry:Bt,BoxBufferGeometry:Ut});function xo(e){We.call(this),this.type="ShadowMaterial",this.color=new Be(0),this.transparent=!0,this.setValues(e)}function bo(e){Vt.call(this,e),this.type="RawShaderMaterial"}function _o(e){We.call(this),this.defines={STANDARD:""},this.type="MeshStandardMaterial",this.color=new Be(16777215),this.roughness=1,this.metalness=0,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Be(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new h(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.roughnessMap=null,this.metalnessMap=null,this.alphaMap=null,this.envMap=null,this.envMapIntensity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.vertexTangents=!1,this.setValues(e)}function wo(e){_o.call(this),this.defines={STANDARD:"",PHYSICAL:""},this.type="MeshPhysicalMaterial",this.clearcoat=0,this.clearcoatMap=null,this.clearcoatRoughness=0,this.clearcoatRoughnessMap=null,this.clearcoatNormalScale=new h(1,1),this.clearcoatNormalMap=null,this.reflectivity=.5,this.sheen=null,this.transparency=0,this.setValues(e)}function Mo(e){We.call(this),this.type="MeshPhongMaterial",this.color=new Be(16777215),this.specular=new Be(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Be(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new h(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(e)}function So(e){We.call(this),this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new Be(16777215),this.specular=new Be(1118481),this.shininess=30,this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Be(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new h(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(e)}function Eo(e){We.call(this),this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new h(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(e)}function To(e){We.call(this),this.type="MeshLambertMaterial",this.color=new Be(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Be(0),this.emissiveIntensity=1,this.emissiveMap=null,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(e)}function Ao(e){We.call(this),this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new Be(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new h(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(e)}function Lo(e){ki.call(this),this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(e)}xo.prototype=Object.create(We.prototype),xo.prototype.constructor=xo,xo.prototype.isShadowMaterial=!0,xo.prototype.copy=function(e){return We.prototype.copy.call(this,e),this.color.copy(e.color),this},bo.prototype=Object.create(Vt.prototype),bo.prototype.constructor=bo,bo.prototype.isRawShaderMaterial=!0,_o.prototype=Object.create(We.prototype),_o.prototype.constructor=_o,_o.prototype.isMeshStandardMaterial=!0,_o.prototype.copy=function(e){return We.prototype.copy.call(this,e),this.defines={STANDARD:""},this.color.copy(e.color),this.roughness=e.roughness,this.metalness=e.metalness,this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.roughnessMap=e.roughnessMap,this.metalnessMap=e.metalnessMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapIntensity=e.envMapIntensity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.morphNormals=e.morphNormals,this.vertexTangents=e.vertexTangents,this},wo.prototype=Object.create(_o.prototype),wo.prototype.constructor=wo,wo.prototype.isMeshPhysicalMaterial=!0,wo.prototype.copy=function(e){return _o.prototype.copy.call(this,e),this.defines={STANDARD:"",PHYSICAL:""},this.clearcoat=e.clearcoat,this.clearcoatMap=e.clearcoatMap,this.clearcoatRoughness=e.clearcoatRoughness,this.clearcoatRoughnessMap=e.clearcoatRoughnessMap,this.clearcoatNormalMap=e.clearcoatNormalMap,this.clearcoatNormalScale.copy(e.clearcoatNormalScale),this.reflectivity=e.reflectivity,e.sheen?this.sheen=(this.sheen||new Be).copy(e.sheen):this.sheen=null,this.transparency=e.transparency,this},Mo.prototype=Object.create(We.prototype),Mo.prototype.constructor=Mo,Mo.prototype.isMeshPhongMaterial=!0,Mo.prototype.copy=function(e){return We.prototype.copy.call(this,e),this.color.copy(e.color),this.specular.copy(e.specular),this.shininess=e.shininess,this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.morphNormals=e.morphNormals,this},So.prototype=Object.create(We.prototype),So.prototype.constructor=So,So.prototype.isMeshToonMaterial=!0,So.prototype.copy=function(e){return We.prototype.copy.call(this,e),this.color.copy(e.color),this.specular.copy(e.specular),this.shininess=e.shininess,this.map=e.map,this.gradientMap=e.gradientMap,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.morphNormals=e.morphNormals,this},Eo.prototype=Object.create(We.prototype),Eo.prototype.constructor=Eo,Eo.prototype.isMeshNormalMaterial=!0,Eo.prototype.copy=function(e){return We.prototype.copy.call(this,e),this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.morphNormals=e.morphNormals,this},To.prototype=Object.create(We.prototype),To.prototype.constructor=To,To.prototype.isMeshLambertMaterial=!0,To.prototype.copy=function(e){return We.prototype.copy.call(this,e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.morphNormals=e.morphNormals,this},Ao.prototype=Object.create(We.prototype),Ao.prototype.constructor=Ao,Ao.prototype.isMeshMatcapMaterial=!0,Ao.prototype.copy=function(e){return We.prototype.copy.call(this,e),this.defines={MATCAP:""},this.color.copy(e.color),this.matcap=e.matcap,this.map=e.map,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.alphaMap=e.alphaMap,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.morphNormals=e.morphNormals,this},Lo.prototype=Object.create(ki.prototype),Lo.prototype.constructor=Lo,Lo.prototype.isLineDashedMaterial=!0,Lo.prototype.copy=function(e){return ki.prototype.copy.call(this,e),this.scale=e.scale,this.dashSize=e.dashSize,this.gapSize=e.gapSize,this};var Po=Object.freeze({__proto__:null,ShadowMaterial:xo,SpriteMaterial:li,RawShaderMaterial:bo,ShaderMaterial:Vt,PointsMaterial:Yi,MeshPhysicalMaterial:wo,MeshStandardMaterial:_o,MeshPhongMaterial:Mo,MeshToonMaterial:So,MeshNormalMaterial:Eo,MeshLambertMaterial:To,MeshDepthMaterial:Xr,MeshDistanceMaterial:Yr,MeshBasicMaterial:qe,MeshMatcapMaterial:Ao,LineDashedMaterial:Lo,LineBasicMaterial:ki,Material:We}),Ro={arraySlice:function(e,t,n){return Ro.isTypedArray(e)?new e.constructor(e.subarray(t,void 0!==n?n:e.length)):e.slice(t,n)},convertArray:function(e,t,n){return!e||!n&&e.constructor===t?e:"number"==typeof t.BYTES_PER_ELEMENT?new t(e):Array.prototype.slice.call(e)},isTypedArray:function(e){return ArrayBuffer.isView(e)&&!(e instanceof DataView)},getKeyframeOrder:function(e){for(var t=e.length,n=new Array(t),r=0;r!==t;++r)n[r]=r;return n.sort((function(t,n){return e[t]-e[n]})),n},sortedArray:function(e,t,n){for(var r=e.length,i=new e.constructor(r),a=0,o=0;o!==r;++a)for(var s=n[a]*t,c=0;c!==t;++c)i[o++]=e[s+c];return i},flattenJSON:function(e,t,n,r){for(var i=1,a=e[0];void 0!==a&&void 0===a[r];)a=e[i++];if(void 0!==a){var o=a[r];if(void 0!==o)if(Array.isArray(o))do{void 0!==(o=a[r])&&(t.push(a.time),n.push.apply(n,o)),a=e[i++]}while(void 0!==a);else if(void 0!==o.toArray)do{void 0!==(o=a[r])&&(t.push(a.time),o.toArray(n,n.length)),a=e[i++]}while(void 0!==a);else do{void 0!==(o=a[r])&&(t.push(a.time),n.push(o)),a=e[i++]}while(void 0!==a)}},subclip:function(e,t,n,r,i){i=i||30;var a=e.clone();a.name=t;for(var o=[],s=0;s<a.tracks.length;++s){for(var c=a.tracks[s],l=c.getValueSize(),u=[],h=[],p=0;p<c.times.length;++p){var d=c.times[p]*i;if(!(d<n||d>=r)){u.push(c.times[p]);for(var f=0;f<l;++f)h.push(c.values[p*l+f])}}0!==u.length&&(c.times=Ro.convertArray(u,c.times.constructor),c.values=Ro.convertArray(h,c.values.constructor),o.push(c))}a.tracks=o;var m=1/0;for(s=0;s<a.tracks.length;++s)m>a.tracks[s].times[0]&&(m=a.tracks[s].times[0]);for(s=0;s<a.tracks.length;++s)a.tracks[s].shift(-1*m);return a.resetDuration(),a}};function Co(e,t,n,r){this.parameterPositions=e,this._cachedIndex=0,this.resultBuffer=void 0!==r?r:new t.constructor(n),this.sampleValues=t,this.valueSize=n}function Oo(e,t,n,r){Co.call(this,e,t,n,r),this._weightPrev=-0,this._offsetPrev=-0,this._weightNext=-0,this._offsetNext=-0}function Do(e,t,n,r){Co.call(this,e,t,n,r)}function No(e,t,n,r){Co.call(this,e,t,n,r)}function Io(e,t,n,r){if(void 0===e)throw new Error("THREE.KeyframeTrack: track name is undefined");if(void 0===t||0===t.length)throw new Error("THREE.KeyframeTrack: no keyframes in track named "+e);this.name=e,this.times=Ro.convertArray(t,this.TimeBufferType),this.values=Ro.convertArray(n,this.ValueBufferType),this.setInterpolation(r||this.DefaultInterpolation)}function zo(e,t,n){Io.call(this,e,t,n)}function ko(e,t,n,r){Io.call(this,e,t,n,r)}function Fo(e,t,n,r){Io.call(this,e,t,n,r)}function Bo(e,t,n,r){Co.call(this,e,t,n,r)}function Uo(e,t,n,r){Io.call(this,e,t,n,r)}function jo(e,t,n,r){Io.call(this,e,t,n,r)}function Ho(e,t,n,r){Io.call(this,e,t,n,r)}function Go(e,t,n){this.name=e,this.tracks=n,this.duration=void 0!==t?t:-1,this.uuid=u.generateUUID(),this.duration<0&&this.resetDuration()}function Vo(e){if(void 0===e.type)throw new Error("THREE.KeyframeTrack: track type undefined, can not parse");var t=function(e){switch(e.toLowerCase()){case"scalar":case"double":case"float":case"number":case"integer":return Fo;case"vector":case"vector2":case"vector3":case"vector4":return Ho;case"color":return ko;case"quaternion":return Uo;case"bool":case"boolean":return zo;case"string":return jo}throw new Error("THREE.KeyframeTrack: Unsupported typeName: "+e)}(e.type);if(void 0===e.times){var n=[],r=[];Ro.flattenJSON(e.keys,n,r,"value"),e.times=n,e.values=r}return void 0!==t.parse?t.parse(e):new t(e.name,e.times,e.values,e.interpolation)}Object.assign(Co.prototype,{evaluate:function(e){var t=this.parameterPositions,n=this._cachedIndex,r=t[n],i=t[n-1];e:{t:{var a;n:{r:if(!(e<r)){for(var o=n+2;;){if(void 0===r){if(e<i)break r;return n=t.length,this._cachedIndex=n,this.afterEnd_(n-1,e,i)}if(n===o)break;if(i=r,e<(r=t[++n]))break t}a=t.length;break n}if(e>=i)break e;var s=t[1];e<s&&(n=2,i=s);for(o=n-2;;){if(void 0===i)return this._cachedIndex=0,this.beforeStart_(0,e,r);if(n===o)break;if(r=i,e>=(i=t[--n-1]))break t}a=n,n=0}for(;n<a;){var c=n+a>>>1;e<t[c]?a=c:n=c+1}if(r=t[n],void 0===(i=t[n-1]))return this._cachedIndex=0,this.beforeStart_(0,e,r);if(void 0===r)return n=t.length,this._cachedIndex=n,this.afterEnd_(n-1,i,e)}this._cachedIndex=n,this.intervalChanged_(n,i,r)}return this.interpolate_(n,i,e,r)},settings:null,DefaultSettings_:{},getSettings_:function(){return this.settings||this.DefaultSettings_},copySampleValue_:function(e){for(var t=this.resultBuffer,n=this.sampleValues,r=this.valueSize,i=e*r,a=0;a!==r;++a)t[a]=n[i+a];return t},interpolate_:function(){throw new Error("call to abstract method")},intervalChanged_:function(){}}),Object.assign(Co.prototype,{beforeStart_:Co.prototype.copySampleValue_,afterEnd_:Co.prototype.copySampleValue_}),Oo.prototype=Object.assign(Object.create(Co.prototype),{constructor:Oo,DefaultSettings_:{endingStart:2400,endingEnd:2400},intervalChanged_:function(e,t,n){var r=this.parameterPositions,i=e-2,a=e+1,o=r[i],s=r[a];if(void 0===o)switch(this.getSettings_().endingStart){case 2401:i=e,o=2*t-n;break;case 2402:o=t+r[i=r.length-2]-r[i+1];break;default:i=e,o=n}if(void 0===s)switch(this.getSettings_().endingEnd){case 2401:a=e,s=2*n-t;break;case 2402:a=1,s=n+r[1]-r[0];break;default:a=e-1,s=t}var c=.5*(n-t),l=this.valueSize;this._weightPrev=c/(t-o),this._weightNext=c/(s-n),this._offsetPrev=i*l,this._offsetNext=a*l},interpolate_:function(e,t,n,r){for(var i=this.resultBuffer,a=this.sampleValues,o=this.valueSize,s=e*o,c=s-o,l=this._offsetPrev,u=this._offsetNext,h=this._weightPrev,p=this._weightNext,d=(n-t)/(r-t),f=d*d,m=f*d,g=-h*m+2*h*f-h*d,v=(1+h)*m+(-1.5-2*h)*f+(-.5+h)*d+1,y=(-1-p)*m+(1.5+p)*f+.5*d,x=p*m-p*f,b=0;b!==o;++b)i[b]=g*a[l+b]+v*a[c+b]+y*a[s+b]+x*a[u+b];return i}}),Do.prototype=Object.assign(Object.create(Co.prototype),{constructor:Do,interpolate_:function(e,t,n,r){for(var i=this.resultBuffer,a=this.sampleValues,o=this.valueSize,s=e*o,c=s-o,l=(n-t)/(r-t),u=1-l,h=0;h!==o;++h)i[h]=a[c+h]*u+a[s+h]*l;return i}}),No.prototype=Object.assign(Object.create(Co.prototype),{constructor:No,interpolate_:function(e){return this.copySampleValue_(e-1)}}),Object.assign(Io,{toJSON:function(e){var t,n=e.constructor;if(void 0!==n.toJSON)t=n.toJSON(e);else{t={name:e.name,times:Ro.convertArray(e.times,Array),values:Ro.convertArray(e.values,Array)};var r=e.getInterpolation();r!==e.DefaultInterpolation&&(t.interpolation=r)}return t.type=e.ValueTypeName,t}}),Object.assign(Io.prototype,{constructor:Io,TimeBufferType:Float32Array,ValueBufferType:Float32Array,DefaultInterpolation:2301,InterpolantFactoryMethodDiscrete:function(e){return new No(this.times,this.values,this.getValueSize(),e)},InterpolantFactoryMethodLinear:function(e){return new Do(this.times,this.values,this.getValueSize(),e)},InterpolantFactoryMethodSmooth:function(e){return new Oo(this.times,this.values,this.getValueSize(),e)},setInterpolation:function(e){var t;switch(e){case 2300:t=this.InterpolantFactoryMethodDiscrete;break;case 2301:t=this.InterpolantFactoryMethodLinear;break;case 2302:t=this.InterpolantFactoryMethodSmooth}if(void 0===t){var n="unsupported interpolation for "+this.ValueTypeName+" keyframe track named "+this.name;if(void 0===this.createInterpolant){if(e===this.DefaultInterpolation)throw new Error(n);this.setInterpolation(this.DefaultInterpolation)}return console.warn("THREE.KeyframeTrack:",n),this}return this.createInterpolant=t,this},getInterpolation:function(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return 2300;case this.InterpolantFactoryMethodLinear:return 2301;case this.InterpolantFactoryMethodSmooth:return 2302}},getValueSize:function(){return this.values.length/this.times.length},shift:function(e){if(0!==e)for(var t=this.times,n=0,r=t.length;n!==r;++n)t[n]+=e;return this},scale:function(e){if(1!==e)for(var t=this.times,n=0,r=t.length;n!==r;++n)t[n]*=e;return this},trim:function(e,t){for(var n=this.times,r=n.length,i=0,a=r-1;i!==r&&n[i]<e;)++i;for(;-1!==a&&n[a]>t;)--a;if(++a,0!==i||a!==r){i>=a&&(i=(a=Math.max(a,1))-1);var o=this.getValueSize();this.times=Ro.arraySlice(n,i,a),this.values=Ro.arraySlice(this.values,i*o,a*o)}return this},validate:function(){var e=!0,t=this.getValueSize();t-Math.floor(t)!=0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),e=!1);var n=this.times,r=this.values,i=n.length;0===i&&(console.error("THREE.KeyframeTrack: Track is empty.",this),e=!1);for(var a=null,o=0;o!==i;o++){var s=n[o];if("number"==typeof s&&isNaN(s)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,o,s),e=!1;break}if(null!==a&&a>s){console.error("THREE.KeyframeTrack: Out of order keys.",this,o,s,a),e=!1;break}a=s}if(void 0!==r&&Ro.isTypedArray(r)){o=0;for(var c=r.length;o!==c;++o){var l=r[o];if(isNaN(l)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,o,l),e=!1;break}}}return e},optimize:function(){for(var e=Ro.arraySlice(this.times),t=Ro.arraySlice(this.values),n=this.getValueSize(),r=2302===this.getInterpolation(),i=1,a=e.length-1,o=1;o<a;++o){var s=!1,c=e[o];if(c!==e[o+1]&&(1!==o||c!==c[0]))if(r)s=!0;else for(var l=o*n,u=l-n,h=l+n,p=0;p!==n;++p){var d=t[l+p];if(d!==t[u+p]||d!==t[h+p]){s=!0;break}}if(s){if(o!==i){e[i]=e[o];var f=o*n,m=i*n;for(p=0;p!==n;++p)t[m+p]=t[f+p]}++i}}if(a>0){e[i]=e[a];for(f=a*n,m=i*n,p=0;p!==n;++p)t[m+p]=t[f+p];++i}return i!==e.length?(this.times=Ro.arraySlice(e,0,i),this.values=Ro.arraySlice(t,0,i*n)):(this.times=e,this.values=t),this},clone:function(){var e=Ro.arraySlice(this.times,0),t=Ro.arraySlice(this.values,0),n=new(0,this.constructor)(this.name,e,t);return n.createInterpolant=this.createInterpolant,n}}),zo.prototype=Object.assign(Object.create(Io.prototype),{constructor:zo,ValueTypeName:"bool",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0}),ko.prototype=Object.assign(Object.create(Io.prototype),{constructor:ko,ValueTypeName:"color"}),Fo.prototype=Object.assign(Object.create(Io.prototype),{constructor:Fo,ValueTypeName:"number"}),Bo.prototype=Object.assign(Object.create(Co.prototype),{constructor:Bo,interpolate_:function(e,t,n,r){for(var i=this.resultBuffer,a=this.sampleValues,o=this.valueSize,s=e*o,c=(n-t)/(r-t),l=s+o;s!==l;s+=4)x.slerpFlat(i,0,a,s-o,a,s,c);return i}}),Uo.prototype=Object.assign(Object.create(Io.prototype),{constructor:Uo,ValueTypeName:"quaternion",DefaultInterpolation:2301,InterpolantFactoryMethodLinear:function(e){return new Bo(this.times,this.values,this.getValueSize(),e)},InterpolantFactoryMethodSmooth:void 0}),jo.prototype=Object.assign(Object.create(Io.prototype),{constructor:jo,ValueTypeName:"string",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0}),Ho.prototype=Object.assign(Object.create(Io.prototype),{constructor:Ho,ValueTypeName:"vector"}),Object.assign(Go,{parse:function(e){for(var t=[],n=e.tracks,r=1/(e.fps||1),i=0,a=n.length;i!==a;++i)t.push(Vo(n[i]).scale(r));return new Go(e.name,e.duration,t)},toJSON:function(e){for(var t=[],n=e.tracks,r={name:e.name,duration:e.duration,tracks:t,uuid:e.uuid},i=0,a=n.length;i!==a;++i)t.push(Io.toJSON(n[i]));return r},CreateFromMorphTargetSequence:function(e,t,n,r){for(var i=t.length,a=[],o=0;o<i;o++){var s=[],c=[];s.push((o+i-1)%i,o,(o+1)%i),c.push(0,1,0);var l=Ro.getKeyframeOrder(s);s=Ro.sortedArray(s,1,l),c=Ro.sortedArray(c,1,l),r||0!==s[0]||(s.push(i),c.push(c[0])),a.push(new Fo(".morphTargetInfluences["+t[o].name+"]",s,c).scale(1/n))}return new Go(e,-1,a)},findByName:function(e,t){var n=e;if(!Array.isArray(e)){var r=e;n=r.geometry&&r.geometry.animations||r.animations}for(var i=0;i<n.length;i++)if(n[i].name===t)return n[i];return null},CreateClipsFromMorphTargetSequences:function(e,t,n){for(var r={},i=/^([\w-]*?)([\d]+)$/,a=0,o=e.length;a<o;a++){var s=e[a],c=s.name.match(i);if(c&&c.length>1){var l=r[h=c[1]];l||(r[h]=l=[]),l.push(s)}}var u=[];for(var h in r)u.push(Go.CreateFromMorphTargetSequence(h,r[h],t,n));return u},parseAnimation:function(e,t){if(!e)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;for(var n=function(e,t,n,r,i){if(0!==n.length){var a=[],o=[];Ro.flattenJSON(n,a,o,r),0!==a.length&&i.push(new e(t,a,o))}},r=[],i=e.name||"default",a=e.length||-1,o=e.fps||30,s=e.hierarchy||[],c=0;c<s.length;c++){var l=s[c].keys;if(l&&0!==l.length)if(l[0].morphTargets){for(var u={},h=0;h<l.length;h++)if(l[h].morphTargets)for(var p=0;p<l[h].morphTargets.length;p++)u[l[h].morphTargets[p]]=-1;for(var d in u){var f=[],m=[];for(p=0;p!==l[h].morphTargets.length;++p){var g=l[h];f.push(g.time),m.push(g.morphTarget===d?1:0)}r.push(new Fo(".morphTargetInfluence["+d+"]",f,m))}a=u.length*(o||1)}else{var v=".bones["+t[c].name+"]";n(Ho,v+".position",l,"pos",r),n(Uo,v+".quaternion",l,"rot",r),n(Ho,v+".scale",l,"scl",r)}}return 0===r.length?null:new Go(i,a,r)}}),Object.assign(Go.prototype,{resetDuration:function(){for(var e=0,t=0,n=this.tracks.length;t!==n;++t){var r=this.tracks[t];e=Math.max(e,r.times[r.times.length-1])}return this.duration=e,this},trim:function(){for(var e=0;e<this.tracks.length;e++)this.tracks[e].trim(0,this.duration);return this},validate:function(){for(var e=!0,t=0;t<this.tracks.length;t++)e=e&&this.tracks[t].validate();return e},optimize:function(){for(var e=0;e<this.tracks.length;e++)this.tracks[e].optimize();return this},clone:function(){for(var e=[],t=0;t<this.tracks.length;t++)e.push(this.tracks[t].clone());return new Go(this.name,this.duration,e)}});var Wo={enabled:!1,files:{},add:function(e,t){!1!==this.enabled&&(this.files[e]=t)},get:function(e){if(!1!==this.enabled)return this.files[e]},remove:function(e){delete this.files[e]},clear:function(){this.files={}}};function qo(e,t,n){var r=this,i=!1,a=0,o=0,s=void 0,c=[];this.onStart=void 0,this.onLoad=e,this.onProgress=t,this.onError=n,this.itemStart=function(e){o++,!1===i&&void 0!==r.onStart&&r.onStart(e,a,o),i=!0},this.itemEnd=function(e){a++,void 0!==r.onProgress&&r.onProgress(e,a,o),a===o&&(i=!1,void 0!==r.onLoad&&r.onLoad())},this.itemError=function(e){void 0!==r.onError&&r.onError(e)},this.resolveURL=function(e){return s?s(e):e},this.setURLModifier=function(e){return s=e,this},this.addHandler=function(e,t){return c.push(e,t),this},this.removeHandler=function(e){var t=c.indexOf(e);return-1!==t&&c.splice(t,2),this},this.getHandler=function(e){for(var t=0,n=c.length;t<n;t+=2){var r=c[t],i=c[t+1];if(r.global&&(r.lastIndex=0),r.test(e))return i}return null}}var Xo=new qo;function Yo(e){this.manager=void 0!==e?e:Xo,this.crossOrigin="anonymous",this.path="",this.resourcePath=""}Object.assign(Yo.prototype,{load:function(){},parse:function(){},setCrossOrigin:function(e){return this.crossOrigin=e,this},setPath:function(e){return this.path=e,this},setResourcePath:function(e){return this.resourcePath=e,this}});var Zo={};function Jo(e){Yo.call(this,e)}function Qo(e){Yo.call(this,e)}function Ko(e){Yo.call(this,e)}function $o(e){Yo.call(this,e)}function es(e){Yo.call(this,e)}function ts(e){Yo.call(this,e)}function ns(e){Yo.call(this,e)}function rs(){this.type="Curve",this.arcLengthDivisions=200}function is(e,t,n,r,i,a,o,s){rs.call(this),this.type="EllipseCurve",this.aX=e||0,this.aY=t||0,this.xRadius=n||1,this.yRadius=r||1,this.aStartAngle=i||0,this.aEndAngle=a||2*Math.PI,this.aClockwise=o||!1,this.aRotation=s||0}function as(e,t,n,r,i,a){is.call(this,e,t,n,n,r,i,a),this.type="ArcCurve"}function os(){var e=0,t=0,n=0,r=0;function i(i,a,o,s){e=i,t=o,n=-3*i+3*a-2*o-s,r=2*i-2*a+o+s}return{initCatmullRom:function(e,t,n,r,a){i(t,n,a*(n-e),a*(r-t))},initNonuniformCatmullRom:function(e,t,n,r,a,o,s){var c=(t-e)/a-(n-e)/(a+o)+(n-t)/o,l=(n-t)/o-(r-t)/(o+s)+(r-n)/s;i(t,n,c*=o,l*=o)},calc:function(i){var a=i*i;return e+t*i+n*a+r*(a*i)}}}Jo.prototype=Object.assign(Object.create(Yo.prototype),{constructor:Jo,load:function(e,t,n,r){void 0===e&&(e=""),void 0!==this.path&&(e=this.path+e),e=this.manager.resolveURL(e);var i=this,a=Wo.get(e);if(void 0!==a)return i.manager.itemStart(e),setTimeout((function(){t&&t(a),i.manager.itemEnd(e)}),0),a;if(void 0===Zo[e]){var o=e.match(/^data:(.*?)(;base64)?,(.*)$/);if(o){var s=o[1],c=!!o[2],l=o[3];l=decodeURIComponent(l),c&&(l=atob(l));try{var u,h=(this.responseType||"").toLowerCase();switch(h){case"arraybuffer":case"blob":for(var p=new Uint8Array(l.length),d=0;d<l.length;d++)p[d]=l.charCodeAt(d);u="blob"===h?new Blob([p.buffer],{type:s}):p.buffer;break;case"document":var f=new DOMParser;u=f.parseFromString(l,s);break;case"json":u=JSON.parse(l);break;default:u=l}setTimeout((function(){t&&t(u),i.manager.itemEnd(e)}),0)}catch(t){setTimeout((function(){r&&r(t),i.manager.itemError(e),i.manager.itemEnd(e)}),0)}}else{Zo[e]=[],Zo[e].push({onLoad:t,onProgress:n,onError:r});var m=new XMLHttpRequest;for(var g in m.open("GET",e,!0),m.addEventListener("load",(function(t){var n=this.response,r=Zo[e];if(delete Zo[e],200===this.status||0===this.status){0===this.status&&console.warn("THREE.FileLoader: HTTP Status 0 received."),Wo.add(e,n);for(var a=0,o=r.length;a<o;a++){(s=r[a]).onLoad&&s.onLoad(n)}i.manager.itemEnd(e)}else{for(a=0,o=r.length;a<o;a++){var s;(s=r[a]).onError&&s.onError(t)}i.manager.itemError(e),i.manager.itemEnd(e)}}),!1),m.addEventListener("progress",(function(t){for(var n=Zo[e],r=0,i=n.length;r<i;r++){var a=n[r];a.onProgress&&a.onProgress(t)}}),!1),m.addEventListener("error",(function(t){var n=Zo[e];delete Zo[e];for(var r=0,a=n.length;r<a;r++){var o=n[r];o.onError&&o.onError(t)}i.manager.itemError(e),i.manager.itemEnd(e)}),!1),m.addEventListener("abort",(function(t){var n=Zo[e];delete Zo[e];for(var r=0,a=n.length;r<a;r++){var o=n[r];o.onError&&o.onError(t)}i.manager.itemError(e),i.manager.itemEnd(e)}),!1),void 0!==this.responseType&&(m.responseType=this.responseType),void 0!==this.withCredentials&&(m.withCredentials=this.withCredentials),m.overrideMimeType&&m.overrideMimeType(void 0!==this.mimeType?this.mimeType:"text/plain"),this.requestHeader)m.setRequestHeader(g,this.requestHeader[g]);m.send(null)}return i.manager.itemStart(e),m}Zo[e].push({onLoad:t,onProgress:n,onError:r})},setResponseType:function(e){return this.responseType=e,this},setWithCredentials:function(e){return this.withCredentials=e,this},setMimeType:function(e){return this.mimeType=e,this},setRequestHeader:function(e){return this.requestHeader=e,this}}),Qo.prototype=Object.assign(Object.create(Yo.prototype),{constructor:Qo,load:function(e,t,n,r){var i=this,a=new Jo(i.manager);a.setPath(i.path),a.load(e,(function(e){t(i.parse(JSON.parse(e)))}),n,r)},parse:function(e){for(var t=[],n=0;n<e.length;n++){var r=Go.parse(e[n]);t.push(r)}return t}}),Ko.prototype=Object.assign(Object.create(Yo.prototype),{constructor:Ko,load:function(e,t,n,r){var i=this,a=[],o=new na;o.image=a;var s=new Jo(this.manager);function c(c){s.load(e[c],(function(e){var n=i.parse(e,!0);a[c]={width:n.width,height:n.height,format:n.format,mipmaps:n.mipmaps},6===(l+=1)&&(1===n.mipmapCount&&(o.minFilter=1006),o.format=n.format,o.needsUpdate=!0,t&&t(o))}),n,r)}if(s.setPath(this.path),s.setResponseType("arraybuffer"),Array.isArray(e))for(var l=0,u=0,h=e.length;u<h;++u)c(u);else s.load(e,(function(e){var n=i.parse(e,!0);if(n.isCubemap)for(var r=n.mipmaps.length/n.mipmapCount,s=0;s<r;s++){a[s]={mipmaps:[]};for(var c=0;c<n.mipmapCount;c++)a[s].mipmaps.push(n.mipmaps[s*n.mipmapCount+c]),a[s].format=n.format,a[s].width=n.width,a[s].height=n.height}else o.image.width=n.width,o.image.height=n.height,o.mipmaps=n.mipmaps;1===n.mipmapCount&&(o.minFilter=1006),o.format=n.format,o.needsUpdate=!0,t&&t(o)}),n,r);return o}}),$o.prototype=Object.assign(Object.create(Yo.prototype),{constructor:$o,load:function(e,t,n,r){var i=this,a=new Zt,o=new Jo(this.manager);return o.setResponseType("arraybuffer"),o.setPath(this.path),o.load(e,(function(e){var n=i.parse(e);n&&(void 0!==n.image?a.image=n.image:void 0!==n.data&&(a.image.width=n.width,a.image.height=n.height,a.image.data=n.data),a.wrapS=void 0!==n.wrapS?n.wrapS:1001,a.wrapT=void 0!==n.wrapT?n.wrapT:1001,a.magFilter=void 0!==n.magFilter?n.magFilter:1006,a.minFilter=void 0!==n.minFilter?n.minFilter:1006,a.anisotropy=void 0!==n.anisotropy?n.anisotropy:1,void 0!==n.format&&(a.format=n.format),void 0!==n.type&&(a.type=n.type),void 0!==n.mipmaps&&(a.mipmaps=n.mipmaps,a.minFilter=1008),1===n.mipmapCount&&(a.minFilter=1006),a.needsUpdate=!0,t&&t(a,n))}),n,r),a}}),es.prototype=Object.assign(Object.create(Yo.prototype),{constructor:es,load:function(e,t,n,r){void 0!==this.path&&(e=this.path+e),e=this.manager.resolveURL(e);var i=this,a=Wo.get(e);if(void 0!==a)return i.manager.itemStart(e),setTimeout((function(){t&&t(a),i.manager.itemEnd(e)}),0),a;var o=document.createElementNS("http://www.w3.org/1999/xhtml","img");function s(){o.removeEventListener("load",s,!1),o.removeEventListener("error",c,!1),Wo.add(e,this),t&&t(this),i.manager.itemEnd(e)}function c(t){o.removeEventListener("load",s,!1),o.removeEventListener("error",c,!1),r&&r(t),i.manager.itemError(e),i.manager.itemEnd(e)}return o.addEventListener("load",s,!1),o.addEventListener("error",c,!1),"data:"!==e.substr(0,5)&&void 0!==this.crossOrigin&&(o.crossOrigin=this.crossOrigin),i.manager.itemStart(e),o.src=e,o}}),ts.prototype=Object.assign(Object.create(Yo.prototype),{constructor:ts,load:function(e,t,n,r){var i=new yn,a=new es(this.manager);a.setCrossOrigin(this.crossOrigin),a.setPath(this.path);var o=0;function s(n){a.load(e[n],(function(e){i.images[n]=e,6===++o&&(i.needsUpdate=!0,t&&t(i))}),void 0,r)}for(var c=0;c<e.length;++c)s(c);return i}}),ns.prototype=Object.assign(Object.create(Yo.prototype),{constructor:ns,load:function(e,t,n,r){var i=new m,a=new es(this.manager);return a.setCrossOrigin(this.crossOrigin),a.setPath(this.path),a.load(e,(function(n){i.image=n;var r=e.search(/\.jpe?g($|\?)/i)>0||0===e.search(/^data\:image\/jpeg/);i.format=r?1022:1023,i.needsUpdate=!0,void 0!==t&&t(i)}),n,r),i}}),Object.assign(rs.prototype,{getPoint:function(){return console.warn("THREE.Curve: .getPoint() not implemented."),null},getPointAt:function(e,t){var n=this.getUtoTmapping(e);return this.getPoint(n,t)},getPoints:function(e){void 0===e&&(e=5);for(var t=[],n=0;n<=e;n++)t.push(this.getPoint(n/e));return t},getSpacedPoints:function(e){void 0===e&&(e=5);for(var t=[],n=0;n<=e;n++)t.push(this.getPointAt(n/e));return t},getLength:function(){var e=this.getLengths();return e[e.length-1]},getLengths:function(e){if(void 0===e&&(e=this.arcLengthDivisions),this.cacheArcLengths&&this.cacheArcLengths.length===e+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var t,n,r=[],i=this.getPoint(0),a=0;for(r.push(0),n=1;n<=e;n++)a+=(t=this.getPoint(n/e)).distanceTo(i),r.push(a),i=t;return this.cacheArcLengths=r,r},updateArcLengths:function(){this.needsUpdate=!0,this.getLengths()},getUtoTmapping:function(e,t){var n,r=this.getLengths(),i=0,a=r.length;n=t||e*r[a-1];for(var o,s=0,c=a-1;s<=c;)if((o=r[i=Math.floor(s+(c-s)/2)]-n)<0)s=i+1;else{if(!(o>0)){c=i;break}c=i-1}if(r[i=c]===n)return i/(a-1);var l=r[i];return(i+(n-l)/(r[i+1]-l))/(a-1)},getTangent:function(e){var t=e-1e-4,n=e+1e-4;t<0&&(t=0),n>1&&(n=1);var r=this.getPoint(t);return this.getPoint(n).clone().sub(r).normalize()},getTangentAt:function(e){var t=this.getUtoTmapping(e);return this.getTangent(t)},computeFrenetFrames:function(e,t){var n,r,i,a=new w,o=[],s=[],c=[],l=new w,h=new R;for(n=0;n<=e;n++)r=n/e,o[n]=this.getTangentAt(r),o[n].normalize();s[0]=new w,c[0]=new w;var p=Number.MAX_VALUE,d=Math.abs(o[0].x),f=Math.abs(o[0].y),m=Math.abs(o[0].z);for(d<=p&&(p=d,a.set(1,0,0)),f<=p&&(p=f,a.set(0,1,0)),m<=p&&a.set(0,0,1),l.crossVectors(o[0],a).normalize(),s[0].crossVectors(o[0],l),c[0].crossVectors(o[0],s[0]),n=1;n<=e;n++)s[n]=s[n-1].clone(),c[n]=c[n-1].clone(),l.crossVectors(o[n-1],o[n]),l.length()>Number.EPSILON&&(l.normalize(),i=Math.acos(u.clamp(o[n-1].dot(o[n]),-1,1)),s[n].applyMatrix4(h.makeRotationAxis(l,i))),c[n].crossVectors(o[n],s[n]);if(!0===t)for(i=Math.acos(u.clamp(s[0].dot(s[e]),-1,1)),i/=e,o[0].dot(l.crossVectors(s[0],s[e]))>0&&(i=-i),n=1;n<=e;n++)s[n].applyMatrix4(h.makeRotationAxis(o[n],i*n)),c[n].crossVectors(o[n],s[n]);return{tangents:o,normals:s,binormals:c}},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.arcLengthDivisions=e.arcLengthDivisions,this},toJSON:function(){var e={metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};return e.arcLengthDivisions=this.arcLengthDivisions,e.type=this.type,e},fromJSON:function(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}}),is.prototype=Object.create(rs.prototype),is.prototype.constructor=is,is.prototype.isEllipseCurve=!0,is.prototype.getPoint=function(e,t){for(var n=t||new h,r=2*Math.PI,i=this.aEndAngle-this.aStartAngle,a=Math.abs(i)<Number.EPSILON;i<0;)i+=r;for(;i>r;)i-=r;i<Number.EPSILON&&(i=a?0:r),!0!==this.aClockwise||a||(i===r?i=-r:i-=r);var o=this.aStartAngle+e*i,s=this.aX+this.xRadius*Math.cos(o),c=this.aY+this.yRadius*Math.sin(o);if(0!==this.aRotation){var l=Math.cos(this.aRotation),u=Math.sin(this.aRotation),p=s-this.aX,d=c-this.aY;s=p*l-d*u+this.aX,c=p*u+d*l+this.aY}return n.set(s,c)},is.prototype.copy=function(e){return rs.prototype.copy.call(this,e),this.aX=e.aX,this.aY=e.aY,this.xRadius=e.xRadius,this.yRadius=e.yRadius,this.aStartAngle=e.aStartAngle,this.aEndAngle=e.aEndAngle,this.aClockwise=e.aClockwise,this.aRotation=e.aRotation,this},is.prototype.toJSON=function(){var e=rs.prototype.toJSON.call(this);return e.aX=this.aX,e.aY=this.aY,e.xRadius=this.xRadius,e.yRadius=this.yRadius,e.aStartAngle=this.aStartAngle,e.aEndAngle=this.aEndAngle,e.aClockwise=this.aClockwise,e.aRotation=this.aRotation,e},is.prototype.fromJSON=function(e){return rs.prototype.fromJSON.call(this,e),this.aX=e.aX,this.aY=e.aY,this.xRadius=e.xRadius,this.yRadius=e.yRadius,this.aStartAngle=e.aStartAngle,this.aEndAngle=e.aEndAngle,this.aClockwise=e.aClockwise,this.aRotation=e.aRotation,this},as.prototype=Object.create(is.prototype),as.prototype.constructor=as,as.prototype.isArcCurve=!0;var ss=new w,cs=new os,ls=new os,us=new os;function hs(e,t,n,r){rs.call(this),this.type="CatmullRomCurve3",this.points=e||[],this.closed=t||!1,this.curveType=n||"centripetal",this.tension=r||.5}function ps(e,t,n,r,i){var a=.5*(r-t),o=.5*(i-n),s=e*e;return(2*n-2*r+a+o)*(e*s)+(-3*n+3*r-2*a-o)*s+a*e+n}function ds(e,t,n,r){return function(e,t){var n=1-e;return n*n*t}(e,t)+function(e,t){return 2*(1-e)*e*t}(e,n)+function(e,t){return e*e*t}(e,r)}function fs(e,t,n,r,i){return function(e,t){var n=1-e;return n*n*n*t}(e,t)+function(e,t){var n=1-e;return 3*n*n*e*t}(e,n)+function(e,t){return 3*(1-e)*e*e*t}(e,r)+function(e,t){return e*e*e*t}(e,i)}function ms(e,t,n,r){rs.call(this),this.type="CubicBezierCurve",this.v0=e||new h,this.v1=t||new h,this.v2=n||new h,this.v3=r||new h}function gs(e,t,n,r){rs.call(this),this.type="CubicBezierCurve3",this.v0=e||new w,this.v1=t||new w,this.v2=n||new w,this.v3=r||new w}function vs(e,t){rs.call(this),this.type="LineCurve",this.v1=e||new h,this.v2=t||new h}function ys(e,t){rs.call(this),this.type="LineCurve3",this.v1=e||new w,this.v2=t||new w}function xs(e,t,n){rs.call(this),this.type="QuadraticBezierCurve",this.v0=e||new h,this.v1=t||new h,this.v2=n||new h}function bs(e,t,n){rs.call(this),this.type="QuadraticBezierCurve3",this.v0=e||new w,this.v1=t||new w,this.v2=n||new w}function _s(e){rs.call(this),this.type="SplineCurve",this.points=e||[]}hs.prototype=Object.create(rs.prototype),hs.prototype.constructor=hs,hs.prototype.isCatmullRomCurve3=!0,hs.prototype.getPoint=function(e,t){var n,r,i,a,o=t||new w,s=this.points,c=s.length,l=(c-(this.closed?0:1))*e,u=Math.floor(l),h=l-u;if(this.closed?u+=u>0?0:(Math.floor(Math.abs(u)/c)+1)*c:0===h&&u===c-1&&(u=c-2,h=1),this.closed||u>0?n=s[(u-1)%c]:(ss.subVectors(s[0],s[1]).add(s[0]),n=ss),r=s[u%c],i=s[(u+1)%c],this.closed||u+2<c?a=s[(u+2)%c]:(ss.subVectors(s[c-1],s[c-2]).add(s[c-1]),a=ss),"centripetal"===this.curveType||"chordal"===this.curveType){var p="chordal"===this.curveType?.5:.25,d=Math.pow(n.distanceToSquared(r),p),f=Math.pow(r.distanceToSquared(i),p),m=Math.pow(i.distanceToSquared(a),p);f<1e-4&&(f=1),d<1e-4&&(d=f),m<1e-4&&(m=f),cs.initNonuniformCatmullRom(n.x,r.x,i.x,a.x,d,f,m),ls.initNonuniformCatmullRom(n.y,r.y,i.y,a.y,d,f,m),us.initNonuniformCatmullRom(n.z,r.z,i.z,a.z,d,f,m)}else"catmullrom"===this.curveType&&(cs.initCatmullRom(n.x,r.x,i.x,a.x,this.tension),ls.initCatmullRom(n.y,r.y,i.y,a.y,this.tension),us.initCatmullRom(n.z,r.z,i.z,a.z,this.tension));return o.set(cs.calc(h),ls.calc(h),us.calc(h)),o},hs.prototype.copy=function(e){rs.prototype.copy.call(this,e),this.points=[];for(var t=0,n=e.points.length;t<n;t++){var r=e.points[t];this.points.push(r.clone())}return this.closed=e.closed,this.curveType=e.curveType,this.tension=e.tension,this},hs.prototype.toJSON=function(){var e=rs.prototype.toJSON.call(this);e.points=[];for(var t=0,n=this.points.length;t<n;t++){var r=this.points[t];e.points.push(r.toArray())}return e.closed=this.closed,e.curveType=this.curveType,e.tension=this.tension,e},hs.prototype.fromJSON=function(e){rs.prototype.fromJSON.call(this,e),this.points=[];for(var t=0,n=e.points.length;t<n;t++){var r=e.points[t];this.points.push((new w).fromArray(r))}return this.closed=e.closed,this.curveType=e.curveType,this.tension=e.tension,this},ms.prototype=Object.create(rs.prototype),ms.prototype.constructor=ms,ms.prototype.isCubicBezierCurve=!0,ms.prototype.getPoint=function(e,t){var n=t||new h,r=this.v0,i=this.v1,a=this.v2,o=this.v3;return n.set(fs(e,r.x,i.x,a.x,o.x),fs(e,r.y,i.y,a.y,o.y)),n},ms.prototype.copy=function(e){return rs.prototype.copy.call(this,e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this.v3.copy(e.v3),this},ms.prototype.toJSON=function(){var e=rs.prototype.toJSON.call(this);return e.v0=this.v0.toArray(),e.v1=this.v1.toArray(),e.v2=this.v2.toArray(),e.v3=this.v3.toArray(),e},ms.prototype.fromJSON=function(e){return rs.prototype.fromJSON.call(this,e),this.v0.fromArray(e.v0),this.v1.fromArray(e.v1),this.v2.fromArray(e.v2),this.v3.fromArray(e.v3),this},gs.prototype=Object.create(rs.prototype),gs.prototype.constructor=gs,gs.prototype.isCubicBezierCurve3=!0,gs.prototype.getPoint=function(e,t){var n=t||new w,r=this.v0,i=this.v1,a=this.v2,o=this.v3;return n.set(fs(e,r.x,i.x,a.x,o.x),fs(e,r.y,i.y,a.y,o.y),fs(e,r.z,i.z,a.z,o.z)),n},gs.prototype.copy=function(e){return rs.prototype.copy.call(this,e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this.v3.copy(e.v3),this},gs.prototype.toJSON=function(){var e=rs.prototype.toJSON.call(this);return e.v0=this.v0.toArray(),e.v1=this.v1.toArray(),e.v2=this.v2.toArray(),e.v3=this.v3.toArray(),e},gs.prototype.fromJSON=function(e){return rs.prototype.fromJSON.call(this,e),this.v0.fromArray(e.v0),this.v1.fromArray(e.v1),this.v2.fromArray(e.v2),this.v3.fromArray(e.v3),this},vs.prototype=Object.create(rs.prototype),vs.prototype.constructor=vs,vs.prototype.isLineCurve=!0,vs.prototype.getPoint=function(e,t){var n=t||new h;return 1===e?n.copy(this.v2):(n.copy(this.v2).sub(this.v1),n.multiplyScalar(e).add(this.v1)),n},vs.prototype.getPointAt=function(e,t){return this.getPoint(e,t)},vs.prototype.getTangent=function(){return this.v2.clone().sub(this.v1).normalize()},vs.prototype.copy=function(e){return rs.prototype.copy.call(this,e),this.v1.copy(e.v1),this.v2.copy(e.v2),this},vs.prototype.toJSON=function(){var e=rs.prototype.toJSON.call(this);return e.v1=this.v1.toArray(),e.v2=this.v2.toArray(),e},vs.prototype.fromJSON=function(e){return rs.prototype.fromJSON.call(this,e),this.v1.fromArray(e.v1),this.v2.fromArray(e.v2),this},ys.prototype=Object.create(rs.prototype),ys.prototype.constructor=ys,ys.prototype.isLineCurve3=!0,ys.prototype.getPoint=function(e,t){var n=t||new w;return 1===e?n.copy(this.v2):(n.copy(this.v2).sub(this.v1),n.multiplyScalar(e).add(this.v1)),n},ys.prototype.getPointAt=function(e,t){return this.getPoint(e,t)},ys.prototype.copy=function(e){return rs.prototype.copy.call(this,e),this.v1.copy(e.v1),this.v2.copy(e.v2),this},ys.prototype.toJSON=function(){var e=rs.prototype.toJSON.call(this);return e.v1=this.v1.toArray(),e.v2=this.v2.toArray(),e},ys.prototype.fromJSON=function(e){return rs.prototype.fromJSON.call(this,e),this.v1.fromArray(e.v1),this.v2.fromArray(e.v2),this},xs.prototype=Object.create(rs.prototype),xs.prototype.constructor=xs,xs.prototype.isQuadraticBezierCurve=!0,xs.prototype.getPoint=function(e,t){var n=t||new h,r=this.v0,i=this.v1,a=this.v2;return n.set(ds(e,r.x,i.x,a.x),ds(e,r.y,i.y,a.y)),n},xs.prototype.copy=function(e){return rs.prototype.copy.call(this,e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this},xs.prototype.toJSON=function(){var e=rs.prototype.toJSON.call(this);return e.v0=this.v0.toArray(),e.v1=this.v1.toArray(),e.v2=this.v2.toArray(),e},xs.prototype.fromJSON=function(e){return rs.prototype.fromJSON.call(this,e),this.v0.fromArray(e.v0),this.v1.fromArray(e.v1),this.v2.fromArray(e.v2),this},bs.prototype=Object.create(rs.prototype),bs.prototype.constructor=bs,bs.prototype.isQuadraticBezierCurve3=!0,bs.prototype.getPoint=function(e,t){var n=t||new w,r=this.v0,i=this.v1,a=this.v2;return n.set(ds(e,r.x,i.x,a.x),ds(e,r.y,i.y,a.y),ds(e,r.z,i.z,a.z)),n},bs.prototype.copy=function(e){return rs.prototype.copy.call(this,e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this},bs.prototype.toJSON=function(){var e=rs.prototype.toJSON.call(this);return e.v0=this.v0.toArray(),e.v1=this.v1.toArray(),e.v2=this.v2.toArray(),e},bs.prototype.fromJSON=function(e){return rs.prototype.fromJSON.call(this,e),this.v0.fromArray(e.v0),this.v1.fromArray(e.v1),this.v2.fromArray(e.v2),this},_s.prototype=Object.create(rs.prototype),_s.prototype.constructor=_s,_s.prototype.isSplineCurve=!0,_s.prototype.getPoint=function(e,t){var n=t||new h,r=this.points,i=(r.length-1)*e,a=Math.floor(i),o=i-a,s=r[0===a?a:a-1],c=r[a],l=r[a>r.length-2?r.length-1:a+1],u=r[a>r.length-3?r.length-1:a+2];return n.set(ps(o,s.x,c.x,l.x,u.x),ps(o,s.y,c.y,l.y,u.y)),n},_s.prototype.copy=function(e){rs.prototype.copy.call(this,e),this.points=[];for(var t=0,n=e.points.length;t<n;t++){var r=e.points[t];this.points.push(r.clone())}return this},_s.prototype.toJSON=function(){var e=rs.prototype.toJSON.call(this);e.points=[];for(var t=0,n=this.points.length;t<n;t++){var r=this.points[t];e.points.push(r.toArray())}return e},_s.prototype.fromJSON=function(e){rs.prototype.fromJSON.call(this,e),this.points=[];for(var t=0,n=e.points.length;t<n;t++){var r=e.points[t];this.points.push((new h).fromArray(r))}return this};var ws=Object.freeze({__proto__:null,ArcCurve:as,CatmullRomCurve3:hs,CubicBezierCurve:ms,CubicBezierCurve3:gs,EllipseCurve:is,LineCurve:vs,LineCurve3:ys,QuadraticBezierCurve:xs,QuadraticBezierCurve3:bs,SplineCurve:_s});function Ms(){rs.call(this),this.type="CurvePath",this.curves=[],this.autoClose=!1}function Ss(e){Ms.call(this),this.type="Path",this.currentPoint=new h,e&&this.setFromPoints(e)}function Es(e){Ss.call(this,e),this.uuid=u.generateUUID(),this.type="Shape",this.holes=[]}function Ts(e,t){Y.call(this),this.type="Light",this.color=new Be(e),this.intensity=void 0!==t?t:1,this.receiveShadow=void 0}function As(e,t,n){Ts.call(this,e,n),this.type="HemisphereLight",this.castShadow=void 0,this.position.copy(Y.DefaultUp),this.updateMatrix(),this.groundColor=new Be(t)}function Ls(e){this.camera=e,this.bias=0,this.radius=1,this.mapSize=new h(512,512),this.map=null,this.mapPass=null,this.matrix=new R,this._frustum=new Kt,this._frameExtents=new h(1,1),this._viewportCount=1,this._viewports=[new g(0,0,1,1)]}function Ps(){Ls.call(this,new qt(50,1,.5,500))}function Rs(e,t,n,r,i,a){Ts.call(this,e,t),this.type="SpotLight",this.position.copy(Y.DefaultUp),this.updateMatrix(),this.target=new Y,Object.defineProperty(this,"power",{get:function(){return this.intensity*Math.PI},set:function(e){this.intensity=e/Math.PI}}),this.distance=void 0!==n?n:0,this.angle=void 0!==r?r:Math.PI/3,this.penumbra=void 0!==i?i:0,this.decay=void 0!==a?a:1,this.shadow=new Ps}function Cs(){Ls.call(this,new qt(90,1,.5,500)),this._frameExtents=new h(4,2),this._viewportCount=6,this._viewports=[new g(2,1,1,1),new g(0,1,1,1),new g(3,1,1,1),new g(1,1,1,1),new g(3,0,1,1),new g(1,0,1,1)],this._cubeDirections=[new w(1,0,0),new w(-1,0,0),new w(0,0,1),new w(0,0,-1),new w(0,1,0),new w(0,-1,0)],this._cubeUps=[new w(0,1,0),new w(0,1,0),new w(0,1,0),new w(0,1,0),new w(0,0,1),new w(0,0,-1)]}function Os(e,t,n,r){Ts.call(this,e,t),this.type="PointLight",Object.defineProperty(this,"power",{get:function(){return 4*this.intensity*Math.PI},set:function(e){this.intensity=e/(4*Math.PI)}}),this.distance=void 0!==n?n:0,this.decay=void 0!==r?r:1,this.shadow=new Cs}function Ds(e,t,n,r,i,a){Wt.call(this),this.type="OrthographicCamera",this.zoom=1,this.view=null,this.left=void 0!==e?e:-1,this.right=void 0!==t?t:1,this.top=void 0!==n?n:1,this.bottom=void 0!==r?r:-1,this.near=void 0!==i?i:.1,this.far=void 0!==a?a:2e3,this.updateProjectionMatrix()}function Ns(){Ls.call(this,new Ds(-5,5,5,-5,.5,500))}function Is(e,t){Ts.call(this,e,t),this.type="DirectionalLight",this.position.copy(Y.DefaultUp),this.updateMatrix(),this.target=new Y,this.shadow=new Ns}function zs(e,t){Ts.call(this,e,t),this.type="AmbientLight",this.castShadow=void 0}function ks(e,t,n,r){Ts.call(this,e,t),this.type="RectAreaLight",this.width=void 0!==n?n:10,this.height=void 0!==r?r:10}function Fs(e){Yo.call(this,e),this.textures={}}Ms.prototype=Object.assign(Object.create(rs.prototype),{constructor:Ms,add:function(e){this.curves.push(e)},closePath:function(){var e=this.curves[0].getPoint(0),t=this.curves[this.curves.length-1].getPoint(1);e.equals(t)||this.curves.push(new vs(t,e))},getPoint:function(e){for(var t=e*this.getLength(),n=this.getCurveLengths(),r=0;r<n.length;){if(n[r]>=t){var i=n[r]-t,a=this.curves[r],o=a.getLength(),s=0===o?0:1-i/o;return a.getPointAt(s)}r++}return null},getLength:function(){var e=this.getCurveLengths();return e[e.length-1]},updateArcLengths:function(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()},getCurveLengths:function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var e=[],t=0,n=0,r=this.curves.length;n<r;n++)t+=this.curves[n].getLength(),e.push(t);return this.cacheLengths=e,e},getSpacedPoints:function(e){void 0===e&&(e=40);for(var t=[],n=0;n<=e;n++)t.push(this.getPoint(n/e));return this.autoClose&&t.push(t[0]),t},getPoints:function(e){e=e||12;for(var t,n=[],r=0,i=this.curves;r<i.length;r++)for(var a=i[r],o=a&&a.isEllipseCurve?2*e:a&&(a.isLineCurve||a.isLineCurve3)?1:a&&a.isSplineCurve?e*a.points.length:e,s=a.getPoints(o),c=0;c<s.length;c++){var l=s[c];t&&t.equals(l)||(n.push(l),t=l)}return this.autoClose&&n.length>1&&!n[n.length-1].equals(n[0])&&n.push(n[0]),n},copy:function(e){rs.prototype.copy.call(this,e),this.curves=[];for(var t=0,n=e.curves.length;t<n;t++){var r=e.curves[t];this.curves.push(r.clone())}return this.autoClose=e.autoClose,this},toJSON:function(){var e=rs.prototype.toJSON.call(this);e.autoClose=this.autoClose,e.curves=[];for(var t=0,n=this.curves.length;t<n;t++){var r=this.curves[t];e.curves.push(r.toJSON())}return e},fromJSON:function(e){rs.prototype.fromJSON.call(this,e),this.autoClose=e.autoClose,this.curves=[];for(var t=0,n=e.curves.length;t<n;t++){var r=e.curves[t];this.curves.push((new ws[r.type]).fromJSON(r))}return this}}),Ss.prototype=Object.assign(Object.create(Ms.prototype),{constructor:Ss,setFromPoints:function(e){this.moveTo(e[0].x,e[0].y);for(var t=1,n=e.length;t<n;t++)this.lineTo(e[t].x,e[t].y);return this},moveTo:function(e,t){return this.currentPoint.set(e,t),this},lineTo:function(e,t){var n=new vs(this.currentPoint.clone(),new h(e,t));return this.curves.push(n),this.currentPoint.set(e,t),this},quadraticCurveTo:function(e,t,n,r){var i=new xs(this.currentPoint.clone(),new h(e,t),new h(n,r));return this.curves.push(i),this.currentPoint.set(n,r),this},bezierCurveTo:function(e,t,n,r,i,a){var o=new ms(this.currentPoint.clone(),new h(e,t),new h(n,r),new h(i,a));return this.curves.push(o),this.currentPoint.set(i,a),this},splineThru:function(e){var t=new _s([this.currentPoint.clone()].concat(e));return this.curves.push(t),this.currentPoint.copy(e[e.length-1]),this},arc:function(e,t,n,r,i,a){var o=this.currentPoint.x,s=this.currentPoint.y;return this.absarc(e+o,t+s,n,r,i,a),this},absarc:function(e,t,n,r,i,a){return this.absellipse(e,t,n,n,r,i,a),this},ellipse:function(e,t,n,r,i,a,o,s){var c=this.currentPoint.x,l=this.currentPoint.y;return this.absellipse(e+c,t+l,n,r,i,a,o,s),this},absellipse:function(e,t,n,r,i,a,o,s){var c=new is(e,t,n,r,i,a,o,s);if(this.curves.length>0){var l=c.getPoint(0);l.equals(this.currentPoint)||this.lineTo(l.x,l.y)}this.curves.push(c);var u=c.getPoint(1);return this.currentPoint.copy(u),this},copy:function(e){return Ms.prototype.copy.call(this,e),this.currentPoint.copy(e.currentPoint),this},toJSON:function(){var e=Ms.prototype.toJSON.call(this);return e.currentPoint=this.currentPoint.toArray(),e},fromJSON:function(e){return Ms.prototype.fromJSON.call(this,e),this.currentPoint.fromArray(e.currentPoint),this}}),Es.prototype=Object.assign(Object.create(Ss.prototype),{constructor:Es,getPointsHoles:function(e){for(var t=[],n=0,r=this.holes.length;n<r;n++)t[n]=this.holes[n].getPoints(e);return t},extractPoints:function(e){return{shape:this.getPoints(e),holes:this.getPointsHoles(e)}},copy:function(e){Ss.prototype.copy.call(this,e),this.holes=[];for(var t=0,n=e.holes.length;t<n;t++){var r=e.holes[t];this.holes.push(r.clone())}return this},toJSON:function(){var e=Ss.prototype.toJSON.call(this);e.uuid=this.uuid,e.holes=[];for(var t=0,n=this.holes.length;t<n;t++){var r=this.holes[t];e.holes.push(r.toJSON())}return e},fromJSON:function(e){Ss.prototype.fromJSON.call(this,e),this.uuid=e.uuid,this.holes=[];for(var t=0,n=e.holes.length;t<n;t++){var r=e.holes[t];this.holes.push((new Ss).fromJSON(r))}return this}}),Ts.prototype=Object.assign(Object.create(Y.prototype),{constructor:Ts,isLight:!0,copy:function(e){return Y.prototype.copy.call(this,e),this.color.copy(e.color),this.intensity=e.intensity,this},toJSON:function(e){var t=Y.prototype.toJSON.call(this,e);return t.object.color=this.color.getHex(),t.object.intensity=this.intensity,void 0!==this.groundColor&&(t.object.groundColor=this.groundColor.getHex()),void 0!==this.distance&&(t.object.distance=this.distance),void 0!==this.angle&&(t.object.angle=this.angle),void 0!==this.decay&&(t.object.decay=this.decay),void 0!==this.penumbra&&(t.object.penumbra=this.penumbra),void 0!==this.shadow&&(t.object.shadow=this.shadow.toJSON()),t}}),As.prototype=Object.assign(Object.create(Ts.prototype),{constructor:As,isHemisphereLight:!0,copy:function(e){return Ts.prototype.copy.call(this,e),this.groundColor.copy(e.groundColor),this}}),Object.assign(Ls.prototype,{_projScreenMatrix:new R,_lightPositionWorld:new w,_lookTarget:new w,getViewportCount:function(){return this._viewportCount},getFrustum:function(){return this._frustum},updateMatrices:function(e){var t=this.camera,n=this.matrix,r=this._projScreenMatrix,i=this._lookTarget,a=this._lightPositionWorld;a.setFromMatrixPosition(e.matrixWorld),t.position.copy(a),i.setFromMatrixPosition(e.target.matrixWorld),t.lookAt(i),t.updateMatrixWorld(),r.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),this._frustum.setFromProjectionMatrix(r),n.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),n.multiply(t.projectionMatrix),n.multiply(t.matrixWorldInverse)},getViewport:function(e){return this._viewports[e]},getFrameExtents:function(){return this._frameExtents},copy:function(e){return this.camera=e.camera.clone(),this.bias=e.bias,this.radius=e.radius,this.mapSize.copy(e.mapSize),this},clone:function(){return(new this.constructor).copy(this)},toJSON:function(){var e={};return 0!==this.bias&&(e.bias=this.bias),1!==this.radius&&(e.radius=this.radius),512===this.mapSize.x&&512===this.mapSize.y||(e.mapSize=this.mapSize.toArray()),e.camera=this.camera.toJSON(!1).object,delete e.camera.matrix,e}}),Ps.prototype=Object.assign(Object.create(Ls.prototype),{constructor:Ps,isSpotLightShadow:!0,updateMatrices:function(e){var t=this.camera,n=2*u.RAD2DEG*e.angle,r=this.mapSize.width/this.mapSize.height,i=e.distance||t.far;n===t.fov&&r===t.aspect&&i===t.far||(t.fov=n,t.aspect=r,t.far=i,t.updateProjectionMatrix()),Ls.prototype.updateMatrices.call(this,e)}}),Rs.prototype=Object.assign(Object.create(Ts.prototype),{constructor:Rs,isSpotLight:!0,copy:function(e){return Ts.prototype.copy.call(this,e),this.distance=e.distance,this.angle=e.angle,this.penumbra=e.penumbra,this.decay=e.decay,this.target=e.target.clone(),this.shadow=e.shadow.clone(),this}}),Cs.prototype=Object.assign(Object.create(Ls.prototype),{constructor:Cs,isPointLightShadow:!0,updateMatrices:function(e,t){void 0===t&&(t=0);var n=this.camera,r=this.matrix,i=this._lightPositionWorld,a=this._lookTarget,o=this._projScreenMatrix;i.setFromMatrixPosition(e.matrixWorld),n.position.copy(i),a.copy(n.position),a.add(this._cubeDirections[t]),n.up.copy(this._cubeUps[t]),n.lookAt(a),n.updateMatrixWorld(),r.makeTranslation(-i.x,-i.y,-i.z),o.multiplyMatrices(n.projectionMatrix,n.matrixWorldInverse),this._frustum.setFromProjectionMatrix(o)}}),Os.prototype=Object.assign(Object.create(Ts.prototype),{constructor:Os,isPointLight:!0,copy:function(e){return Ts.prototype.copy.call(this,e),this.distance=e.distance,this.decay=e.decay,this.shadow=e.shadow.clone(),this}}),Ds.prototype=Object.assign(Object.create(Wt.prototype),{constructor:Ds,isOrthographicCamera:!0,copy:function(e,t){return Wt.prototype.copy.call(this,e,t),this.left=e.left,this.right=e.right,this.top=e.top,this.bottom=e.bottom,this.near=e.near,this.far=e.far,this.zoom=e.zoom,this.view=null===e.view?null:Object.assign({},e.view),this},setViewOffset:function(e,t,n,r,i,a){null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=e,this.view.fullHeight=t,this.view.offsetX=n,this.view.offsetY=r,this.view.width=i,this.view.height=a,this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()},updateProjectionMatrix:function(){var e=(this.right-this.left)/(2*this.zoom),t=(this.top-this.bottom)/(2*this.zoom),n=(this.right+this.left)/2,r=(this.top+this.bottom)/2,i=n-e,a=n+e,o=r+t,s=r-t;if(null!==this.view&&this.view.enabled){var c=(this.right-this.left)/this.view.fullWidth/this.zoom,l=(this.top-this.bottom)/this.view.fullHeight/this.zoom;a=(i+=c*this.view.offsetX)+c*this.view.width,s=(o-=l*this.view.offsetY)-l*this.view.height}this.projectionMatrix.makeOrthographic(i,a,o,s,this.near,this.far),this.projectionMatrixInverse.getInverse(this.projectionMatrix)},toJSON:function(e){var t=Y.prototype.toJSON.call(this,e);return t.object.zoom=this.zoom,t.object.left=this.left,t.object.right=this.right,t.object.top=this.top,t.object.bottom=this.bottom,t.object.near=this.near,t.object.far=this.far,null!==this.view&&(t.object.view=Object.assign({},this.view)),t}}),Ns.prototype=Object.assign(Object.create(Ls.prototype),{constructor:Ns,isDirectionalLightShadow:!0,updateMatrices:function(e){Ls.prototype.updateMatrices.call(this,e)}}),Is.prototype=Object.assign(Object.create(Ts.prototype),{constructor:Is,isDirectionalLight:!0,copy:function(e){return Ts.prototype.copy.call(this,e),this.target=e.target.clone(),this.shadow=e.shadow.clone(),this}}),zs.prototype=Object.assign(Object.create(Ts.prototype),{constructor:zs,isAmbientLight:!0}),ks.prototype=Object.assign(Object.create(Ts.prototype),{constructor:ks,isRectAreaLight:!0,copy:function(e){return Ts.prototype.copy.call(this,e),this.width=e.width,this.height=e.height,this},toJSON:function(e){var t=Ts.prototype.toJSON.call(this,e);return t.object.width=this.width,t.object.height=this.height,t}}),Fs.prototype=Object.assign(Object.create(Yo.prototype),{constructor:Fs,load:function(e,t,n,r){var i=this,a=new Jo(i.manager);a.setPath(i.path),a.load(e,(function(e){t(i.parse(JSON.parse(e)))}),n,r)},parse:function(e){var t=this.textures;function n(e){return void 0===t[e]&&console.warn("THREE.MaterialLoader: Undefined texture",e),t[e]}var r=new Po[e.type];if(void 0!==e.uuid&&(r.uuid=e.uuid),void 0!==e.name&&(r.name=e.name),void 0!==e.color&&r.color.setHex(e.color),void 0!==e.roughness&&(r.roughness=e.roughness),void 0!==e.metalness&&(r.metalness=e.metalness),void 0!==e.sheen&&(r.sheen=(new Be).setHex(e.sheen)),void 0!==e.emissive&&r.emissive.setHex(e.emissive),void 0!==e.specular&&r.specular.setHex(e.specular),void 0!==e.shininess&&(r.shininess=e.shininess),void 0!==e.clearcoat&&(r.clearcoat=e.clearcoat),void 0!==e.clearcoatRoughness&&(r.clearcoatRoughness=e.clearcoatRoughness),void 0!==e.fog&&(r.fog=e.fog),void 0!==e.flatShading&&(r.flatShading=e.flatShading),void 0!==e.blending&&(r.blending=e.blending),void 0!==e.combine&&(r.combine=e.combine),void 0!==e.side&&(r.side=e.side),void 0!==e.opacity&&(r.opacity=e.opacity),void 0!==e.transparent&&(r.transparent=e.transparent),void 0!==e.alphaTest&&(r.alphaTest=e.alphaTest),void 0!==e.depthTest&&(r.depthTest=e.depthTest),void 0!==e.depthWrite&&(r.depthWrite=e.depthWrite),void 0!==e.colorWrite&&(r.colorWrite=e.colorWrite),void 0!==e.stencilWrite&&(r.stencilWrite=e.stencilWrite),void 0!==e.stencilWriteMask&&(r.stencilWriteMask=e.stencilWriteMask),void 0!==e.stencilFunc&&(r.stencilFunc=e.stencilFunc),void 0!==e.stencilRef&&(r.stencilRef=e.stencilRef),void 0!==e.stencilFuncMask&&(r.stencilFuncMask=e.stencilFuncMask),void 0!==e.stencilFail&&(r.stencilFail=e.stencilFail),void 0!==e.stencilZFail&&(r.stencilZFail=e.stencilZFail),void 0!==e.stencilZPass&&(r.stencilZPass=e.stencilZPass),void 0!==e.wireframe&&(r.wireframe=e.wireframe),void 0!==e.wireframeLinewidth&&(r.wireframeLinewidth=e.wireframeLinewidth),void 0!==e.wireframeLinecap&&(r.wireframeLinecap=e.wireframeLinecap),void 0!==e.wireframeLinejoin&&(r.wireframeLinejoin=e.wireframeLinejoin),void 0!==e.rotation&&(r.rotation=e.rotation),1!==e.linewidth&&(r.linewidth=e.linewidth),void 0!==e.dashSize&&(r.dashSize=e.dashSize),void 0!==e.gapSize&&(r.gapSize=e.gapSize),void 0!==e.scale&&(r.scale=e.scale),void 0!==e.polygonOffset&&(r.polygonOffset=e.polygonOffset),void 0!==e.polygonOffsetFactor&&(r.polygonOffsetFactor=e.polygonOffsetFactor),void 0!==e.polygonOffsetUnits&&(r.polygonOffsetUnits=e.polygonOffsetUnits),void 0!==e.skinning&&(r.skinning=e.skinning),void 0!==e.morphTargets&&(r.morphTargets=e.morphTargets),void 0!==e.morphNormals&&(r.morphNormals=e.morphNormals),void 0!==e.dithering&&(r.dithering=e.dithering),void 0!==e.vertexTangents&&(r.vertexTangents=e.vertexTangents),void 0!==e.visible&&(r.visible=e.visible),void 0!==e.toneMapped&&(r.toneMapped=e.toneMapped),void 0!==e.userData&&(r.userData=e.userData),void 0!==e.vertexColors&&("number"==typeof e.vertexColors?r.vertexColors=e.vertexColors>0:r.vertexColors=e.vertexColors),void 0!==e.uniforms)for(var i in e.uniforms){var a=e.uniforms[i];switch(r.uniforms[i]={},a.type){case"t":r.uniforms[i].value=n(a.value);break;case"c":r.uniforms[i].value=(new Be).setHex(a.value);break;case"v2":r.uniforms[i].value=(new h).fromArray(a.value);break;case"v3":r.uniforms[i].value=(new w).fromArray(a.value);break;case"v4":r.uniforms[i].value=(new g).fromArray(a.value);break;case"m3":r.uniforms[i].value=(new p).fromArray(a.value);case"m4":r.uniforms[i].value=(new R).fromArray(a.value);break;default:r.uniforms[i].value=a.value}}if(void 0!==e.defines&&(r.defines=e.defines),void 0!==e.vertexShader&&(r.vertexShader=e.vertexShader),void 0!==e.fragmentShader&&(r.fragmentShader=e.fragmentShader),void 0!==e.extensions)for(var o in e.extensions)r.extensions[o]=e.extensions[o];if(void 0!==e.shading&&(r.flatShading=1===e.shading),void 0!==e.size&&(r.size=e.size),void 0!==e.sizeAttenuation&&(r.sizeAttenuation=e.sizeAttenuation),void 0!==e.map&&(r.map=n(e.map)),void 0!==e.matcap&&(r.matcap=n(e.matcap)),void 0!==e.alphaMap&&(r.alphaMap=n(e.alphaMap)),void 0!==e.bumpMap&&(r.bumpMap=n(e.bumpMap)),void 0!==e.bumpScale&&(r.bumpScale=e.bumpScale),void 0!==e.normalMap&&(r.normalMap=n(e.normalMap)),void 0!==e.normalMapType&&(r.normalMapType=e.normalMapType),void 0!==e.normalScale){var s=e.normalScale;!1===Array.isArray(s)&&(s=[s,s]),r.normalScale=(new h).fromArray(s)}return void 0!==e.displacementMap&&(r.displacementMap=n(e.displacementMap)),void 0!==e.displacementScale&&(r.displacementScale=e.displacementScale),void 0!==e.displacementBias&&(r.displacementBias=e.displacementBias),void 0!==e.roughnessMap&&(r.roughnessMap=n(e.roughnessMap)),void 0!==e.metalnessMap&&(r.metalnessMap=n(e.metalnessMap)),void 0!==e.emissiveMap&&(r.emissiveMap=n(e.emissiveMap)),void 0!==e.emissiveIntensity&&(r.emissiveIntensity=e.emissiveIntensity),void 0!==e.specularMap&&(r.specularMap=n(e.specularMap)),void 0!==e.envMap&&(r.envMap=n(e.envMap)),void 0!==e.envMapIntensity&&(r.envMapIntensity=e.envMapIntensity),void 0!==e.reflectivity&&(r.reflectivity=e.reflectivity),void 0!==e.refractionRatio&&(r.refractionRatio=e.refractionRatio),void 0!==e.lightMap&&(r.lightMap=n(e.lightMap)),void 0!==e.lightMapIntensity&&(r.lightMapIntensity=e.lightMapIntensity),void 0!==e.aoMap&&(r.aoMap=n(e.aoMap)),void 0!==e.aoMapIntensity&&(r.aoMapIntensity=e.aoMapIntensity),void 0!==e.gradientMap&&(r.gradientMap=n(e.gradientMap)),void 0!==e.clearcoatMap&&(r.clearcoatMap=n(e.clearcoatMap)),void 0!==e.clearcoatRoughnessMap&&(r.clearcoatRoughnessMap=n(e.clearcoatRoughnessMap)),void 0!==e.clearcoatNormalMap&&(r.clearcoatNormalMap=n(e.clearcoatNormalMap)),void 0!==e.clearcoatNormalScale&&(r.clearcoatNormalScale=(new h).fromArray(e.clearcoatNormalScale)),r},setTextures:function(e){return this.textures=e,this}});var Bs={decodeText:function(e){if("undefined"!=typeof TextDecoder)return(new TextDecoder).decode(e);for(var t="",n=0,r=e.length;n<r;n++)t+=String.fromCharCode(e[n]);try{return decodeURIComponent(escape(t))}catch(e){return t}},extractUrlBase:function(e){var t=e.lastIndexOf("/");return-1===t?"./":e.substr(0,t+1)}};function Us(){dt.call(this),this.type="InstancedBufferGeometry",this.maxInstancedCount=void 0}function js(e,t,n,r){"number"==typeof n&&(r=n,n=!1,console.error("THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument.")),Ye.call(this,e,t,n),this.meshPerAttribute=r||1}function Hs(e){Yo.call(this,e)}Us.prototype=Object.assign(Object.create(dt.prototype),{constructor:Us,isInstancedBufferGeometry:!0,copy:function(e){return dt.prototype.copy.call(this,e),this.maxInstancedCount=e.maxInstancedCount,this},clone:function(){return(new this.constructor).copy(this)},toJSON:function(){var e=dt.prototype.toJSON.call(this);return e.maxInstancedCount=this.maxInstancedCount,e.isInstancedBufferGeometry=!0,e}}),js.prototype=Object.assign(Object.create(Ye.prototype),{constructor:js,isInstancedBufferAttribute:!0,copy:function(e){return Ye.prototype.copy.call(this,e),this.meshPerAttribute=e.meshPerAttribute,this},toJSON:function(){var e=Ye.prototype.toJSON.call(this);return e.meshPerAttribute=this.meshPerAttribute,e.isInstancedBufferAttribute=!0,e}}),Hs.prototype=Object.assign(Object.create(Yo.prototype),{constructor:Hs,load:function(e,t,n,r){var i=this,a=new Jo(i.manager);a.setPath(i.path),a.load(e,(function(e){t(i.parse(JSON.parse(e)))}),n,r)},parse:function(e){var t=e.isInstancedBufferGeometry?new Us:new dt,n=e.data.index;if(void 0!==n){var r=new Gs[n.type](n.array);t.setIndex(new Ye(r,1))}var i=e.data.attributes;for(var a in i){var o=i[a],s=(r=new Gs[o.type](o.array),new(o.isInstancedBufferAttribute?js:Ye)(r,o.itemSize,o.normalized));void 0!==o.name&&(s.name=o.name),t.setAttribute(a,s)}var c=e.data.morphAttributes;if(c)for(var a in c){for(var l=c[a],u=[],h=0,p=l.length;h<p;h++){o=l[h],s=new Ye(r=new Gs[o.type](o.array),o.itemSize,o.normalized);void 0!==o.name&&(s.name=o.name),u.push(s)}t.morphAttributes[a]=u}e.data.morphTargetsRelative&&(t.morphTargetsRelative=!0);var d=e.data.groups||e.data.drawcalls||e.data.offsets;if(void 0!==d){h=0;for(var f=d.length;h!==f;++h){var m=d[h];t.addGroup(m.start,m.count,m.materialIndex)}}var g=e.data.boundingSphere;if(void 0!==g){var v=new w;void 0!==g.center&&v.fromArray(g.center),t.boundingSphere=new pe(v,g.radius)}return e.name&&(t.name=e.name),e.userData&&(t.userData=e.userData),t}});var Gs={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:"undefined"!=typeof Uint8ClampedArray?Uint8ClampedArray:Uint8Array,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};function Vs(e){Yo.call(this,e)}Vs.prototype=Object.assign(Object.create(Yo.prototype),{constructor:Vs,load:function(e,t,n,r){var i=this,a=""===this.path?Bs.extractUrlBase(e):this.path;this.resourcePath=this.resourcePath||a;var o=new Jo(i.manager);o.setPath(this.path),o.load(e,(function(n){var a=null;try{a=JSON.parse(n)}catch(t){return void 0!==r&&r(t),void console.error("THREE:ObjectLoader: Can't parse "+e+".",t.message)}var o=a.metadata;void 0!==o&&void 0!==o.type&&"geometry"!==o.type.toLowerCase()?i.parse(a,t):console.error("THREE.ObjectLoader: Can't load "+e)}),n,r)},parse:function(e,t){var n=this.parseShape(e.shapes),r=this.parseGeometries(e.geometries,n),i=this.parseImages(e.images,(function(){void 0!==t&&t(s)})),a=this.parseTextures(e.textures,i),o=this.parseMaterials(e.materials,a),s=this.parseObject(e.object,r,o);return e.animations&&(s.animations=this.parseAnimations(e.animations)),void 0!==e.images&&0!==e.images.length||void 0!==t&&t(s),s},parseShape:function(e){var t={};if(void 0!==e)for(var n=0,r=e.length;n<r;n++){var i=(new Es).fromJSON(e[n]);t[i.uuid]=i}return t},parseGeometries:function(e,t){var n={};if(void 0!==e)for(var r=new Hs,i=0,a=e.length;i<a;i++){var o,s=e[i];switch(s.type){case"PlaneGeometry":case"PlaneBufferGeometry":o=new yo[s.type](s.width,s.height,s.widthSegments,s.heightSegments);break;case"BoxGeometry":case"BoxBufferGeometry":case"CubeGeometry":o=new yo[s.type](s.width,s.height,s.depth,s.widthSegments,s.heightSegments,s.depthSegments);break;case"CircleGeometry":case"CircleBufferGeometry":o=new yo[s.type](s.radius,s.segments,s.thetaStart,s.thetaLength);break;case"CylinderGeometry":case"CylinderBufferGeometry":o=new yo[s.type](s.radiusTop,s.radiusBottom,s.height,s.radialSegments,s.heightSegments,s.openEnded,s.thetaStart,s.thetaLength);break;case"ConeGeometry":case"ConeBufferGeometry":o=new yo[s.type](s.radius,s.height,s.radialSegments,s.heightSegments,s.openEnded,s.thetaStart,s.thetaLength);break;case"SphereGeometry":case"SphereBufferGeometry":o=new yo[s.type](s.radius,s.widthSegments,s.heightSegments,s.phiStart,s.phiLength,s.thetaStart,s.thetaLength);break;case"DodecahedronGeometry":case"DodecahedronBufferGeometry":case"IcosahedronGeometry":case"IcosahedronBufferGeometry":case"OctahedronGeometry":case"OctahedronBufferGeometry":case"TetrahedronGeometry":case"TetrahedronBufferGeometry":o=new yo[s.type](s.radius,s.detail);break;case"RingGeometry":case"RingBufferGeometry":o=new yo[s.type](s.innerRadius,s.outerRadius,s.thetaSegments,s.phiSegments,s.thetaStart,s.thetaLength);break;case"TorusGeometry":case"TorusBufferGeometry":o=new yo[s.type](s.radius,s.tube,s.radialSegments,s.tubularSegments,s.arc);break;case"TorusKnotGeometry":case"TorusKnotBufferGeometry":o=new yo[s.type](s.radius,s.tube,s.tubularSegments,s.radialSegments,s.p,s.q);break;case"TubeGeometry":case"TubeBufferGeometry":o=new yo[s.type]((new ws[s.path.type]).fromJSON(s.path),s.tubularSegments,s.radius,s.radialSegments,s.closed);break;case"LatheGeometry":case"LatheBufferGeometry":o=new yo[s.type](s.points,s.segments,s.phiStart,s.phiLength);break;case"PolyhedronGeometry":case"PolyhedronBufferGeometry":o=new yo[s.type](s.vertices,s.indices,s.radius,s.details);break;case"ShapeGeometry":case"ShapeBufferGeometry":for(var c=[],l=0,u=s.shapes.length;l<u;l++){var h=t[s.shapes[l]];c.push(h)}o=new yo[s.type](c,s.curveSegments);break;case"ExtrudeGeometry":case"ExtrudeBufferGeometry":for(c=[],l=0,u=s.shapes.length;l<u;l++){h=t[s.shapes[l]];c.push(h)}var p=s.options.extrudePath;void 0!==p&&(s.options.extrudePath=(new ws[p.type]).fromJSON(p)),o=new yo[s.type](c,s.options);break;case"BufferGeometry":case"InstancedBufferGeometry":o=r.parse(s);break;case"Geometry":console.error('THREE.ObjectLoader: Loading "Geometry" is not supported anymore.');break;default:console.warn('THREE.ObjectLoader: Unsupported geometry type "'+s.type+'"');continue}o.uuid=s.uuid,void 0!==s.name&&(o.name=s.name),!0===o.isBufferGeometry&&void 0!==s.userData&&(o.userData=s.userData),n[s.uuid]=o}return n},parseMaterials:function(e,t){var n={},r={};if(void 0!==e){var i=new Fs;i.setTextures(t);for(var a=0,o=e.length;a<o;a++){var s=e[a];if("MultiMaterial"===s.type){for(var c=[],l=0;l<s.materials.length;l++){var u=s.materials[l];void 0===n[u.uuid]&&(n[u.uuid]=i.parse(u)),c.push(n[u.uuid])}r[s.uuid]=c}else void 0===n[s.uuid]&&(n[s.uuid]=i.parse(s)),r[s.uuid]=n[s.uuid]}}return r},parseAnimations:function(e){for(var t=[],n=0;n<e.length;n++){var r=e[n],i=Go.parse(r);void 0!==r.uuid&&(i.uuid=r.uuid),t.push(i)}return t},parseImages:function(e,t){var n=this,r={};function i(e){return n.manager.itemStart(e),a.load(e,(function(){n.manager.itemEnd(e)}),void 0,(function(){n.manager.itemError(e),n.manager.itemEnd(e)}))}if(void 0!==e&&e.length>0){var a=new es(new qo(t));a.setCrossOrigin(this.crossOrigin);for(var o=0,s=e.length;o<s;o++){var c=e[o],l=c.url;if(Array.isArray(l)){r[c.uuid]=[];for(var u=0,h=l.length;u<h;u++){var p=l[u],d=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(p)?p:n.resourcePath+p;r[c.uuid].push(i(d))}}else{d=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(c.url)?c.url:n.resourcePath+c.url;r[c.uuid]=i(d)}}}return r},parseTextures:function(e,t){function n(e,t){return"number"==typeof e?e:(console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.",e),t[e])}var r={};if(void 0!==e)for(var i=0,a=e.length;i<a;i++){var o,s=e[i];void 0===s.image&&console.warn('THREE.ObjectLoader: No "image" specified for',s.uuid),void 0===t[s.image]&&console.warn("THREE.ObjectLoader: Undefined image",s.image),(o=Array.isArray(t[s.image])?new yn(t[s.image]):new m(t[s.image])).needsUpdate=!0,o.uuid=s.uuid,void 0!==s.name&&(o.name=s.name),void 0!==s.mapping&&(o.mapping=n(s.mapping,qs)),void 0!==s.offset&&o.offset.fromArray(s.offset),void 0!==s.repeat&&o.repeat.fromArray(s.repeat),void 0!==s.center&&o.center.fromArray(s.center),void 0!==s.rotation&&(o.rotation=s.rotation),void 0!==s.wrap&&(o.wrapS=n(s.wrap[0],Xs),o.wrapT=n(s.wrap[1],Xs)),void 0!==s.format&&(o.format=s.format),void 0!==s.type&&(o.type=s.type),void 0!==s.encoding&&(o.encoding=s.encoding),void 0!==s.minFilter&&(o.minFilter=n(s.minFilter,Ys)),void 0!==s.magFilter&&(o.magFilter=n(s.magFilter,Ys)),void 0!==s.anisotropy&&(o.anisotropy=s.anisotropy),void 0!==s.flipY&&(o.flipY=s.flipY),void 0!==s.premultiplyAlpha&&(o.premultiplyAlpha=s.premultiplyAlpha),void 0!==s.unpackAlignment&&(o.unpackAlignment=s.unpackAlignment),r[s.uuid]=o}return r},parseObject:function(e,t,n){var r;function i(e){return void 0===t[e]&&console.warn("THREE.ObjectLoader: Undefined geometry",e),t[e]}function a(e){if(void 0!==e){if(Array.isArray(e)){for(var t=[],r=0,i=e.length;r<i;r++){var a=e[r];void 0===n[a]&&console.warn("THREE.ObjectLoader: Undefined material",a),t.push(n[a])}return t}return void 0===n[e]&&console.warn("THREE.ObjectLoader: Undefined material",e),n[e]}}switch(e.type){case"Scene":r=new Z,void 0!==e.background&&Number.isInteger(e.background)&&(r.background=new Be(e.background)),void 0!==e.fog&&("Fog"===e.fog.type?r.fog=new ii(e.fog.color,e.fog.near,e.fog.far):"FogExp2"===e.fog.type&&(r.fog=new ri(e.fog.color,e.fog.density)));break;case"PerspectiveCamera":r=new qt(e.fov,e.aspect,e.near,e.far),void 0!==e.focus&&(r.focus=e.focus),void 0!==e.zoom&&(r.zoom=e.zoom),void 0!==e.filmGauge&&(r.filmGauge=e.filmGauge),void 0!==e.filmOffset&&(r.filmOffset=e.filmOffset),void 0!==e.view&&(r.view=Object.assign({},e.view));break;case"OrthographicCamera":r=new Ds(e.left,e.right,e.top,e.bottom,e.near,e.far),void 0!==e.zoom&&(r.zoom=e.zoom),void 0!==e.view&&(r.view=Object.assign({},e.view));break;case"AmbientLight":r=new zs(e.color,e.intensity);break;case"DirectionalLight":r=new Is(e.color,e.intensity);break;case"PointLight":r=new Os(e.color,e.intensity,e.distance,e.decay);break;case"RectAreaLight":r=new ks(e.color,e.intensity,e.width,e.height);break;case"SpotLight":r=new Rs(e.color,e.intensity,e.distance,e.angle,e.penumbra,e.decay);break;case"HemisphereLight":r=new As(e.color,e.groundColor,e.intensity);break;case"SkinnedMesh":console.warn("THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.");case"Mesh":r=new Ct(o=i(e.geometry),s=a(e.material));break;case"InstancedMesh":var o=i(e.geometry),s=a(e.material),c=e.count,l=e.instanceMatrix;(r=new zi(o,s,c)).instanceMatrix=new Ye(new Float32Array(l.array),16);break;case"LOD":r=new Ti;break;case"Line":r=new Gi(i(e.geometry),a(e.material),e.mode);break;case"LineLoop":r=new Xi(i(e.geometry),a(e.material));break;case"LineSegments":r=new qi(i(e.geometry),a(e.material));break;case"PointCloud":case"Points":r=new $i(i(e.geometry),a(e.material));break;case"Sprite":r=new wi(a(e.material));break;case"Group":r=new ei;break;default:r=new Y}if(r.uuid=e.uuid,void 0!==e.name&&(r.name=e.name),void 0!==e.matrix?(r.matrix.fromArray(e.matrix),void 0!==e.matrixAutoUpdate&&(r.matrixAutoUpdate=e.matrixAutoUpdate),r.matrixAutoUpdate&&r.matrix.decompose(r.position,r.quaternion,r.scale)):(void 0!==e.position&&r.position.fromArray(e.position),void 0!==e.rotation&&r.rotation.fromArray(e.rotation),void 0!==e.quaternion&&r.quaternion.fromArray(e.quaternion),void 0!==e.scale&&r.scale.fromArray(e.scale)),void 0!==e.castShadow&&(r.castShadow=e.castShadow),void 0!==e.receiveShadow&&(r.receiveShadow=e.receiveShadow),e.shadow&&(void 0!==e.shadow.bias&&(r.shadow.bias=e.shadow.bias),void 0!==e.shadow.radius&&(r.shadow.radius=e.shadow.radius),void 0!==e.shadow.mapSize&&r.shadow.mapSize.fromArray(e.shadow.mapSize),void 0!==e.shadow.camera&&(r.shadow.camera=this.parseObject(e.shadow.camera))),void 0!==e.visible&&(r.visible=e.visible),void 0!==e.frustumCulled&&(r.frustumCulled=e.frustumCulled),void 0!==e.renderOrder&&(r.renderOrder=e.renderOrder),void 0!==e.userData&&(r.userData=e.userData),void 0!==e.layers&&(r.layers.mask=e.layers),void 0!==e.children)for(var u=e.children,h=0;h<u.length;h++)r.add(this.parseObject(u[h],t,n));if("LOD"===e.type){void 0!==e.autoUpdate&&(r.autoUpdate=e.autoUpdate);for(var p=e.levels,d=0;d<p.length;d++){var f=p[d],m=r.getObjectByProperty("uuid",f.object);void 0!==m&&r.addLevel(m,f.distance)}}return r}});var Ws,qs={UVMapping:300,CubeReflectionMapping:301,CubeRefractionMapping:302,EquirectangularReflectionMapping:303,EquirectangularRefractionMapping:304,SphericalReflectionMapping:305,CubeUVReflectionMapping:306,CubeUVRefractionMapping:307},Xs={RepeatWrapping:1e3,ClampToEdgeWrapping:1001,MirroredRepeatWrapping:1002},Ys={NearestFilter:1003,NearestMipmapNearestFilter:1004,NearestMipmapLinearFilter:1005,LinearFilter:1006,LinearMipmapNearestFilter:1007,LinearMipmapLinearFilter:1008};function Zs(e){"undefined"==typeof createImageBitmap&&console.warn("THREE.ImageBitmapLoader: createImageBitmap() not supported."),"undefined"==typeof fetch&&console.warn("THREE.ImageBitmapLoader: fetch() not supported."),Yo.call(this,e),this.options=void 0}function Js(){this.type="ShapePath",this.color=new Be,this.subPaths=[],this.currentPath=null}function Qs(e){this.type="Font",this.data=e}function Ks(e,t,n,r,i){var a=i.glyphs[e]||i.glyphs["?"];if(a){var o,s,c,l,u,h,p,d,f=new Js;if(a.o)for(var m=a._cachedOutline||(a._cachedOutline=a.o.split(" ")),g=0,v=m.length;g<v;){switch(m[g++]){case"m":o=m[g++]*t+n,s=m[g++]*t+r,f.moveTo(o,s);break;case"l":o=m[g++]*t+n,s=m[g++]*t+r,f.lineTo(o,s);break;case"q":c=m[g++]*t+n,l=m[g++]*t+r,u=m[g++]*t+n,h=m[g++]*t+r,f.quadraticCurveTo(u,h,c,l);break;case"b":c=m[g++]*t+n,l=m[g++]*t+r,u=m[g++]*t+n,h=m[g++]*t+r,p=m[g++]*t+n,d=m[g++]*t+r,f.bezierCurveTo(u,h,p,d,c,l)}}return{offsetX:a.ha*t,path:f}}console.error('THREE.Font: character "'+e+'" does not exists in font family '+i.familyName+".")}function $s(e){Yo.call(this,e)}Zs.prototype=Object.assign(Object.create(Yo.prototype),{constructor:Zs,setOptions:function(e){return this.options=e,this},load:function(e,t,n,r){void 0===e&&(e=""),void 0!==this.path&&(e=this.path+e),e=this.manager.resolveURL(e);var i=this,a=Wo.get(e);if(void 0!==a)return i.manager.itemStart(e),setTimeout((function(){t&&t(a),i.manager.itemEnd(e)}),0),a;fetch(e).then((function(e){return e.blob()})).then((function(e){return void 0===i.options?createImageBitmap(e):createImageBitmap(e,i.options)})).then((function(n){Wo.add(e,n),t&&t(n),i.manager.itemEnd(e)})).catch((function(t){r&&r(t),i.manager.itemError(e),i.manager.itemEnd(e)})),i.manager.itemStart(e)}}),Object.assign(Js.prototype,{moveTo:function(e,t){return this.currentPath=new Ss,this.subPaths.push(this.currentPath),this.currentPath.moveTo(e,t),this},lineTo:function(e,t){return this.currentPath.lineTo(e,t),this},quadraticCurveTo:function(e,t,n,r){return this.currentPath.quadraticCurveTo(e,t,n,r),this},bezierCurveTo:function(e,t,n,r,i,a){return this.currentPath.bezierCurveTo(e,t,n,r,i,a),this},splineThru:function(e){return this.currentPath.splineThru(e),this},toShapes:function(e,t){function n(e){for(var t=[],n=0,r=e.length;n<r;n++){var i=e[n],a=new Es;a.curves=i.curves,t.push(a)}return t}function r(e,t){for(var n=t.length,r=!1,i=n-1,a=0;a<n;i=a++){var o=t[i],s=t[a],c=s.x-o.x,l=s.y-o.y;if(Math.abs(l)>Number.EPSILON){if(l<0&&(o=t[a],c=-c,s=t[i],l=-l),e.y<o.y||e.y>s.y)continue;if(e.y===o.y){if(e.x===o.x)return!0}else{var u=l*(e.x-o.x)-c*(e.y-o.y);if(0===u)return!0;if(u<0)continue;r=!r}}else{if(e.y!==o.y)continue;if(s.x<=e.x&&e.x<=o.x||o.x<=e.x&&e.x<=s.x)return!0}}return r}var i=qa.isClockWise,a=this.subPaths;if(0===a.length)return[];if(!0===t)return n(a);var o,s,c,l=[];if(1===a.length)return s=a[0],(c=new Es).curves=s.curves,l.push(c),l;var u=!i(a[0].getPoints());u=e?!u:u;var h,p,d=[],f=[],m=[],g=0;f[g]=void 0,m[g]=[];for(var v=0,y=a.length;v<y;v++)o=i(h=(s=a[v]).getPoints()),(o=e?!o:o)?(!u&&f[g]&&g++,f[g]={s:new Es,p:h},f[g].s.curves=s.curves,u&&g++,m[g]=[]):m[g].push({h:s,p:h[0]});if(!f[0])return n(a);if(f.length>1){for(var x=!1,b=[],_=0,w=f.length;_<w;_++)d[_]=[];for(_=0,w=f.length;_<w;_++)for(var M=m[_],S=0;S<M.length;S++){for(var E=M[S],T=!0,A=0;A<f.length;A++)r(E.p,f[A].p)&&(_!==A&&b.push({froms:_,tos:A,hole:S}),T?(T=!1,d[A].push(E)):x=!0);T&&d[_].push(E)}b.length>0&&(x||(m=d))}v=0;for(var L=f.length;v<L;v++){c=f[v].s,l.push(c);for(var P=0,R=(p=m[v]).length;P<R;P++)c.holes.push(p[P].h)}return l}}),Object.assign(Qs.prototype,{isFont:!0,generateShapes:function(e,t){void 0===t&&(t=100);for(var n=[],r=function(e,t,n){for(var r=Array.from?Array.from(e):String(e).split(""),i=t/n.resolution,a=(n.boundingBox.yMax-n.boundingBox.yMin+n.underlineThickness)*i,o=[],s=0,c=0,l=0;l<r.length;l++){var u=r[l];if("\n"===u)s=0,c-=a;else{var h=Ks(u,i,s,c,n);s+=h.offsetX,o.push(h.path)}}return o}(e,t,this.data),i=0,a=r.length;i<a;i++)Array.prototype.push.apply(n,r[i].toShapes());return n}}),$s.prototype=Object.assign(Object.create(Yo.prototype),{constructor:$s,load:function(e,t,n,r){var i=this,a=new Jo(this.manager);a.setPath(this.path),a.load(e,(function(e){var n;try{n=JSON.parse(e)}catch(t){console.warn("THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead."),n=JSON.parse(e.substring(65,e.length-2))}var r=i.parse(n);t&&t(r)}),n,r)},parse:function(e){return new Qs(e)}});var ec={getContext:function(){return void 0===Ws&&(Ws=new(window.AudioContext||window.webkitAudioContext)),Ws},setContext:function(e){Ws=e}};function tc(e){Yo.call(this,e)}function nc(){this.coefficients=[];for(var e=0;e<9;e++)this.coefficients.push(new w)}function rc(e,t){Ts.call(this,void 0,t),this.sh=void 0!==e?e:new nc}function ic(e,t,n){rc.call(this,void 0,n);var r=(new Be).set(e),i=(new Be).set(t),a=new w(r.r,r.g,r.b),o=new w(i.r,i.g,i.b),s=Math.sqrt(Math.PI),c=s*Math.sqrt(.75);this.sh.coefficients[0].copy(a).add(o).multiplyScalar(s),this.sh.coefficients[1].copy(a).sub(o).multiplyScalar(c)}function ac(e,t){rc.call(this,void 0,t);var n=(new Be).set(e);this.sh.coefficients[0].set(n.r,n.g,n.b).multiplyScalar(2*Math.sqrt(Math.PI))}tc.prototype=Object.assign(Object.create(Yo.prototype),{constructor:tc,load:function(e,t,n,r){var i=new Jo(this.manager);i.setResponseType("arraybuffer"),i.setPath(this.path),i.load(e,(function(e){var n=e.slice(0);ec.getContext().decodeAudioData(n,(function(e){t(e)}))}),n,r)}}),Object.assign(nc.prototype,{isSphericalHarmonics3:!0,set:function(e){for(var t=0;t<9;t++)this.coefficients[t].copy(e[t]);return this},zero:function(){for(var e=0;e<9;e++)this.coefficients[e].set(0,0,0);return this},getAt:function(e,t){var n=e.x,r=e.y,i=e.z,a=this.coefficients;return t.copy(a[0]).multiplyScalar(.282095),t.addScaledVector(a[1],.488603*r),t.addScaledVector(a[2],.488603*i),t.addScaledVector(a[3],.488603*n),t.addScaledVector(a[4],n*r*1.092548),t.addScaledVector(a[5],r*i*1.092548),t.addScaledVector(a[6],.315392*(3*i*i-1)),t.addScaledVector(a[7],n*i*1.092548),t.addScaledVector(a[8],.546274*(n*n-r*r)),t},getIrradianceAt:function(e,t){var n=e.x,r=e.y,i=e.z,a=this.coefficients;return t.copy(a[0]).multiplyScalar(.886227),t.addScaledVector(a[1],1.023328*r),t.addScaledVector(a[2],1.023328*i),t.addScaledVector(a[3],1.023328*n),t.addScaledVector(a[4],.858086*n*r),t.addScaledVector(a[5],.858086*r*i),t.addScaledVector(a[6],.743125*i*i-.247708),t.addScaledVector(a[7],.858086*n*i),t.addScaledVector(a[8],.429043*(n*n-r*r)),t},add:function(e){for(var t=0;t<9;t++)this.coefficients[t].add(e.coefficients[t]);return this},addScaledSH:function(e,t){for(var n=0;n<9;n++)this.coefficients[n].addScaledVector(e.coefficients[n],t);return this},scale:function(e){for(var t=0;t<9;t++)this.coefficients[t].multiplyScalar(e);return this},lerp:function(e,t){for(var n=0;n<9;n++)this.coefficients[n].lerp(e.coefficients[n],t);return this},equals:function(e){for(var t=0;t<9;t++)if(!this.coefficients[t].equals(e.coefficients[t]))return!1;return!0},copy:function(e){return this.set(e.coefficients)},clone:function(){return(new this.constructor).copy(this)},fromArray:function(e,t){void 0===t&&(t=0);for(var n=this.coefficients,r=0;r<9;r++)n[r].fromArray(e,t+3*r);return this},toArray:function(e,t){void 0===e&&(e=[]),void 0===t&&(t=0);for(var n=this.coefficients,r=0;r<9;r++)n[r].toArray(e,t+3*r);return e}}),Object.assign(nc,{getBasisAt:function(e,t){var n=e.x,r=e.y,i=e.z;t[0]=.282095,t[1]=.488603*r,t[2]=.488603*i,t[3]=.488603*n,t[4]=1.092548*n*r,t[5]=1.092548*r*i,t[6]=.315392*(3*i*i-1),t[7]=1.092548*n*i,t[8]=.546274*(n*n-r*r)}}),rc.prototype=Object.assign(Object.create(Ts.prototype),{constructor:rc,isLightProbe:!0,copy:function(e){return Ts.prototype.copy.call(this,e),this.sh.copy(e.sh),this.intensity=e.intensity,this},toJSON:function(e){return Ts.prototype.toJSON.call(this,e)}}),ic.prototype=Object.assign(Object.create(rc.prototype),{constructor:ic,isHemisphereLightProbe:!0,copy:function(e){return rc.prototype.copy.call(this,e),this},toJSON:function(e){return rc.prototype.toJSON.call(this,e)}}),ac.prototype=Object.assign(Object.create(rc.prototype),{constructor:ac,isAmbientLightProbe:!0,copy:function(e){return rc.prototype.copy.call(this,e),this},toJSON:function(e){return rc.prototype.toJSON.call(this,e)}});var oc=new R,sc=new R;function cc(){this.type="StereoCamera",this.aspect=1,this.eyeSep=.064,this.cameraL=new qt,this.cameraL.layers.enable(1),this.cameraL.matrixAutoUpdate=!1,this.cameraR=new qt,this.cameraR.layers.enable(2),this.cameraR.matrixAutoUpdate=!1,this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}function lc(e){this.autoStart=void 0===e||e,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}Object.assign(cc.prototype,{update:function(e){var t=this._cache;if(t.focus!==e.focus||t.fov!==e.fov||t.aspect!==e.aspect*this.aspect||t.near!==e.near||t.far!==e.far||t.zoom!==e.zoom||t.eyeSep!==this.eyeSep){t.focus=e.focus,t.fov=e.fov,t.aspect=e.aspect*this.aspect,t.near=e.near,t.far=e.far,t.zoom=e.zoom,t.eyeSep=this.eyeSep;var n,r,i=e.projectionMatrix.clone(),a=t.eyeSep/2,o=a*t.near/t.focus,s=t.near*Math.tan(u.DEG2RAD*t.fov*.5)/t.zoom;sc.elements[12]=-a,oc.elements[12]=a,n=-s*t.aspect+o,r=s*t.aspect+o,i.elements[0]=2*t.near/(r-n),i.elements[8]=(r+n)/(r-n),this.cameraL.projectionMatrix.copy(i),n=-s*t.aspect-o,r=s*t.aspect-o,i.elements[0]=2*t.near/(r-n),i.elements[8]=(r+n)/(r-n),this.cameraR.projectionMatrix.copy(i)}this.cameraL.matrixWorld.copy(e.matrixWorld).multiply(sc),this.cameraR.matrixWorld.copy(e.matrixWorld).multiply(oc)}}),Object.assign(lc.prototype,{start:function(){this.startTime=("undefined"==typeof performance?Date:performance).now(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0},stop:function(){this.getElapsedTime(),this.running=!1,this.autoStart=!1},getElapsedTime:function(){return this.getDelta(),this.elapsedTime},getDelta:function(){var e=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){var t=("undefined"==typeof performance?Date:performance).now();e=(t-this.oldTime)/1e3,this.oldTime=t,this.elapsedTime+=e}return e}});var uc=new w,hc=new x,pc=new w,dc=new w;function fc(){Y.call(this),this.type="AudioListener",this.context=ec.getContext(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null,this.timeDelta=0,this._clock=new lc}function mc(e){Y.call(this),this.type="Audio",this.listener=e,this.context=e.context,this.gain=this.context.createGain(),this.gain.connect(e.getInput()),this.autoplay=!1,this.buffer=null,this.detune=0,this.loop=!1,this.loopStart=0,this.loopEnd=0,this.offset=0,this.duration=void 0,this.playbackRate=1,this.isPlaying=!1,this.hasPlaybackControl=!0,this.sourceType="empty",this._startedAt=0,this._pausedAt=0,this.filters=[]}fc.prototype=Object.assign(Object.create(Y.prototype),{constructor:fc,getInput:function(){return this.gain},removeFilter:function(){return null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null),this},getFilter:function(){return this.filter},setFilter:function(e){return null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination),this.filter=e,this.gain.connect(this.filter),this.filter.connect(this.context.destination),this},getMasterVolume:function(){return this.gain.gain.value},setMasterVolume:function(e){return this.gain.gain.setTargetAtTime(e,this.context.currentTime,.01),this},updateMatrixWorld:function(e){Y.prototype.updateMatrixWorld.call(this,e);var t=this.context.listener,n=this.up;if(this.timeDelta=this._clock.getDelta(),this.matrixWorld.decompose(uc,hc,pc),dc.set(0,0,-1).applyQuaternion(hc),t.positionX){var r=this.context.currentTime+this.timeDelta;t.positionX.linearRampToValueAtTime(uc.x,r),t.positionY.linearRampToValueAtTime(uc.y,r),t.positionZ.linearRampToValueAtTime(uc.z,r),t.forwardX.linearRampToValueAtTime(dc.x,r),t.forwardY.linearRampToValueAtTime(dc.y,r),t.forwardZ.linearRampToValueAtTime(dc.z,r),t.upX.linearRampToValueAtTime(n.x,r),t.upY.linearRampToValueAtTime(n.y,r),t.upZ.linearRampToValueAtTime(n.z,r)}else t.setPosition(uc.x,uc.y,uc.z),t.setOrientation(dc.x,dc.y,dc.z,n.x,n.y,n.z)}}),mc.prototype=Object.assign(Object.create(Y.prototype),{constructor:mc,getOutput:function(){return this.gain},setNodeSource:function(e){return this.hasPlaybackControl=!1,this.sourceType="audioNode",this.source=e,this.connect(),this},setMediaElementSource:function(e){return this.hasPlaybackControl=!1,this.sourceType="mediaNode",this.source=this.context.createMediaElementSource(e),this.connect(),this},setMediaStreamSource:function(e){return this.hasPlaybackControl=!1,this.sourceType="mediaStreamNode",this.source=this.context.createMediaStreamSource(e),this.connect(),this},setBuffer:function(e){return this.buffer=e,this.sourceType="buffer",this.autoplay&&this.play(),this},play:function(e){if(void 0===e&&(e=0),!0!==this.isPlaying){if(!1!==this.hasPlaybackControl){this._startedAt=this.context.currentTime+e;var t=this.context.createBufferSource();return t.buffer=this.buffer,t.loop=this.loop,t.loopStart=this.loopStart,t.loopEnd=this.loopEnd,t.onended=this.onEnded.bind(this),t.start(this._startedAt,this._pausedAt+this.offset,this.duration),this.isPlaying=!0,this.source=t,this.setDetune(this.detune),this.setPlaybackRate(this.playbackRate),this.connect()}console.warn("THREE.Audio: this Audio has no playback control.")}else console.warn("THREE.Audio: Audio is already playing.")},pause:function(){if(!1!==this.hasPlaybackControl)return!0===this.isPlaying&&(this._pausedAt+=Math.max(this.context.currentTime-this._startedAt,0)*this.playbackRate,this.source.stop(),this.source.onended=null,this.isPlaying=!1),this;console.warn("THREE.Audio: this Audio has no playback control.")},stop:function(){if(!1!==this.hasPlaybackControl)return this._pausedAt=0,this.source.stop(),this.source.onended=null,this.isPlaying=!1,this;console.warn("THREE.Audio: this Audio has no playback control.")},connect:function(){if(this.filters.length>0){this.source.connect(this.filters[0]);for(var e=1,t=this.filters.length;e<t;e++)this.filters[e-1].connect(this.filters[e]);this.filters[this.filters.length-1].connect(this.getOutput())}else this.source.connect(this.getOutput());return this},disconnect:function(){if(this.filters.length>0){this.source.disconnect(this.filters[0]);for(var e=1,t=this.filters.length;e<t;e++)this.filters[e-1].disconnect(this.filters[e]);this.filters[this.filters.length-1].disconnect(this.getOutput())}else this.source.disconnect(this.getOutput());return this},getFilters:function(){return this.filters},setFilters:function(e){return e||(e=[]),!0===this.isPlaying?(this.disconnect(),this.filters=e,this.connect()):this.filters=e,this},setDetune:function(e){if(this.detune=e,void 0!==this.source.detune)return!0===this.isPlaying&&this.source.detune.setTargetAtTime(this.detune,this.context.currentTime,.01),this},getDetune:function(){return this.detune},getFilter:function(){return this.getFilters()[0]},setFilter:function(e){return this.setFilters(e?[e]:[])},setPlaybackRate:function(e){if(!1!==this.hasPlaybackControl)return this.playbackRate=e,!0===this.isPlaying&&this.source.playbackRate.setTargetAtTime(this.playbackRate,this.context.currentTime,.01),this;console.warn("THREE.Audio: this Audio has no playback control.")},getPlaybackRate:function(){return this.playbackRate},onEnded:function(){this.isPlaying=!1},getLoop:function(){return!1===this.hasPlaybackControl?(console.warn("THREE.Audio: this Audio has no playback control."),!1):this.loop},setLoop:function(e){if(!1!==this.hasPlaybackControl)return this.loop=e,!0===this.isPlaying&&(this.source.loop=this.loop),this;console.warn("THREE.Audio: this Audio has no playback control.")},setLoopStart:function(e){return this.loopStart=e,this},setLoopEnd:function(e){return this.loopEnd=e,this},getVolume:function(){return this.gain.gain.value},setVolume:function(e){return this.gain.gain.setTargetAtTime(e,this.context.currentTime,.01),this}});var gc=new w,vc=new x,yc=new w,xc=new w;function bc(e){mc.call(this,e),this.panner=this.context.createPanner(),this.panner.panningModel="HRTF",this.panner.connect(this.gain)}function _c(e,t){this.analyser=e.context.createAnalyser(),this.analyser.fftSize=void 0!==t?t:2048,this.data=new Uint8Array(this.analyser.frequencyBinCount),e.getOutput().connect(this.analyser)}function wc(e,t,n){this.binding=e,this.valueSize=n;var r,i=Float64Array;switch(t){case"quaternion":r=this._slerp;break;case"string":case"bool":i=Array,r=this._select;break;default:r=this._lerp}this.buffer=new i(4*n),this._mixBufferRegion=r,this.cumulativeWeight=0,this.useCount=0,this.referenceCount=0}bc.prototype=Object.assign(Object.create(mc.prototype),{constructor:bc,getOutput:function(){return this.panner},getRefDistance:function(){return this.panner.refDistance},setRefDistance:function(e){return this.panner.refDistance=e,this},getRolloffFactor:function(){return this.panner.rolloffFactor},setRolloffFactor:function(e){return this.panner.rolloffFactor=e,this},getDistanceModel:function(){return this.panner.distanceModel},setDistanceModel:function(e){return this.panner.distanceModel=e,this},getMaxDistance:function(){return this.panner.maxDistance},setMaxDistance:function(e){return this.panner.maxDistance=e,this},setDirectionalCone:function(e,t,n){return this.panner.coneInnerAngle=e,this.panner.coneOuterAngle=t,this.panner.coneOuterGain=n,this},updateMatrixWorld:function(e){if(Y.prototype.updateMatrixWorld.call(this,e),!0!==this.hasPlaybackControl||!1!==this.isPlaying){this.matrixWorld.decompose(gc,vc,yc),xc.set(0,0,1).applyQuaternion(vc);var t=this.panner;if(t.positionX){var n=this.context.currentTime+this.listener.timeDelta;t.positionX.linearRampToValueAtTime(gc.x,n),t.positionY.linearRampToValueAtTime(gc.y,n),t.positionZ.linearRampToValueAtTime(gc.z,n),t.orientationX.linearRampToValueAtTime(xc.x,n),t.orientationY.linearRampToValueAtTime(xc.y,n),t.orientationZ.linearRampToValueAtTime(xc.z,n)}else t.setPosition(gc.x,gc.y,gc.z),t.setOrientation(xc.x,xc.y,xc.z)}}}),Object.assign(_c.prototype,{getFrequencyData:function(){return this.analyser.getByteFrequencyData(this.data),this.data},getAverageFrequency:function(){for(var e=0,t=this.getFrequencyData(),n=0;n<t.length;n++)e+=t[n];return e/t.length}}),Object.assign(wc.prototype,{accumulate:function(e,t){var n=this.buffer,r=this.valueSize,i=e*r+r,a=this.cumulativeWeight;if(0===a){for(var o=0;o!==r;++o)n[i+o]=n[o];a=t}else{var s=t/(a+=t);this._mixBufferRegion(n,i,0,s,r)}this.cumulativeWeight=a},apply:function(e){var t=this.valueSize,n=this.buffer,r=e*t+t,i=this.cumulativeWeight,a=this.binding;if(this.cumulativeWeight=0,i<1){var o=3*t;this._mixBufferRegion(n,r,o,1-i,t)}for(var s=t,c=t+t;s!==c;++s)if(n[s]!==n[s+t]){a.setValue(n,r);break}},saveOriginalState:function(){var e=this.binding,t=this.buffer,n=this.valueSize,r=3*n;e.getValue(t,r);for(var i=n,a=r;i!==a;++i)t[i]=t[r+i%n];this.cumulativeWeight=0},restoreOriginalState:function(){var e=3*this.valueSize;this.binding.setValue(this.buffer,e)},_select:function(e,t,n,r,i){if(r>=.5)for(var a=0;a!==i;++a)e[t+a]=e[n+a]},_slerp:function(e,t,n,r){x.slerpFlat(e,t,e,t,e,n,r)},_lerp:function(e,t,n,r,i){for(var a=1-r,o=0;o!==i;++o){var s=t+o;e[s]=e[s]*a+e[n+o]*r}}});var Mc=new RegExp("[\\[\\]\\.:\\/]","g"),Sc="[^"+"\\[\\]\\.:\\/".replace("\\.","")+"]",Ec=/((?:WC+[\/:])*)/.source.replace("WC","[^\\[\\]\\.:\\/]"),Tc=/(WCOD+)?/.source.replace("WCOD",Sc),Ac=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC","[^\\[\\]\\.:\\/]"),Lc=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC","[^\\[\\]\\.:\\/]"),Pc=new RegExp("^"+Ec+Tc+Ac+Lc+"$"),Rc=["material","materials","bones"];function Cc(e,t,n){var r=n||Oc.parseTrackName(t);this._targetGroup=e,this._bindings=e.subscribe_(t,r)}function Oc(e,t,n){this.path=t,this.parsedPath=n||Oc.parseTrackName(t),this.node=Oc.findNode(e,this.parsedPath.nodeName)||e,this.rootNode=e}function Dc(){this.uuid=u.generateUUID(),this._objects=Array.prototype.slice.call(arguments),this.nCachedObjects_=0;var e={};this._indicesByUUID=e;for(var t=0,n=arguments.length;t!==n;++t)e[arguments[t].uuid]=t;this._paths=[],this._parsedPaths=[],this._bindings=[],this._bindingsIndicesByPath={};var r=this;this.stats={objects:{get total(){return r._objects.length},get inUse(){return this.total-r.nCachedObjects_}},get bindingsPerObject(){return r._bindings.length}}}function Nc(e,t,n){this._mixer=e,this._clip=t,this._localRoot=n||null;for(var r=t.tracks,i=r.length,a=new Array(i),o={endingStart:2400,endingEnd:2400},s=0;s!==i;++s){var c=r[s].createInterpolant(null);a[s]=c,c.settings=o}this._interpolantSettings=o,this._interpolants=a,this._propertyBindings=new Array(i),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=2201,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}function Ic(e){this._root=e,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1}function zc(e){"string"==typeof e&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),e=arguments[1]),this.value=e}function kc(e,t,n){ai.call(this,e,t),this.meshPerAttribute=n||1}function Fc(e,t,n,r){this.ray=new be(e,t),this.near=n||0,this.far=r||1/0,this.camera=null,this.layers=new N,this.params={Mesh:{},Line:{threshold:1},LOD:{},Points:{threshold:1},Sprite:{}},Object.defineProperties(this.params,{PointCloud:{get:function(){return console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points."),this.Points}}})}function Bc(e,t){return e.distance-t.distance}function Uc(e,t,n,r){if(e.layers.test(t.layers)&&e.raycast(t,n),!0===r)for(var i=e.children,a=0,o=i.length;a<o;a++)Uc(i[a],t,n,!0)}function jc(e,t,n){return this.radius=void 0!==e?e:1,this.phi=void 0!==t?t:0,this.theta=void 0!==n?n:0,this}function Hc(e,t,n){return this.radius=void 0!==e?e:1,this.theta=void 0!==t?t:0,this.y=void 0!==n?n:0,this}Object.assign(Cc.prototype,{getValue:function(e,t){this.bind();var n=this._targetGroup.nCachedObjects_,r=this._bindings[n];void 0!==r&&r.getValue(e,t)},setValue:function(e,t){for(var n=this._bindings,r=this._targetGroup.nCachedObjects_,i=n.length;r!==i;++r)n[r].setValue(e,t)},bind:function(){for(var e=this._bindings,t=this._targetGroup.nCachedObjects_,n=e.length;t!==n;++t)e[t].bind()},unbind:function(){for(var e=this._bindings,t=this._targetGroup.nCachedObjects_,n=e.length;t!==n;++t)e[t].unbind()}}),Object.assign(Oc,{Composite:Cc,create:function(e,t,n){return e&&e.isAnimationObjectGroup?new Oc.Composite(e,t,n):new Oc(e,t,n)},sanitizeNodeName:function(e){return e.replace(/\s/g,"_").replace(Mc,"")},parseTrackName:function(e){var t=Pc.exec(e);if(!t)throw new Error("PropertyBinding: Cannot parse trackName: "+e);var n={nodeName:t[2],objectName:t[3],objectIndex:t[4],propertyName:t[5],propertyIndex:t[6]},r=n.nodeName&&n.nodeName.lastIndexOf(".");if(void 0!==r&&-1!==r){var i=n.nodeName.substring(r+1);-1!==Rc.indexOf(i)&&(n.nodeName=n.nodeName.substring(0,r),n.objectName=i)}if(null===n.propertyName||0===n.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+e);return n},findNode:function(e,t){if(!t||""===t||"."===t||-1===t||t===e.name||t===e.uuid)return e;if(e.skeleton){var n=e.skeleton.getBoneByName(t);if(void 0!==n)return n}if(e.children){var r=function(e){for(var n=0;n<e.length;n++){var i=e[n];if(i.name===t||i.uuid===t)return i;var a=r(i.children);if(a)return a}return null},i=r(e.children);if(i)return i}return null}}),Object.assign(Oc.prototype,{_getValue_unavailable:function(){},_setValue_unavailable:function(){},BindingType:{Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3},Versioning:{None:0,NeedsUpdate:1,MatrixWorldNeedsUpdate:2},GetterByBindingType:[function(e,t){e[t]=this.node[this.propertyName]},function(e,t){for(var n=this.resolvedProperty,r=0,i=n.length;r!==i;++r)e[t++]=n[r]},function(e,t){e[t]=this.resolvedProperty[this.propertyIndex]},function(e,t){this.resolvedProperty.toArray(e,t)}],SetterByBindingTypeAndVersioning:[[function(e,t){this.targetObject[this.propertyName]=e[t]},function(e,t){this.targetObject[this.propertyName]=e[t],this.targetObject.needsUpdate=!0},function(e,t){this.targetObject[this.propertyName]=e[t],this.targetObject.matrixWorldNeedsUpdate=!0}],[function(e,t){for(var n=this.resolvedProperty,r=0,i=n.length;r!==i;++r)n[r]=e[t++]},function(e,t){for(var n=this.resolvedProperty,r=0,i=n.length;r!==i;++r)n[r]=e[t++];this.targetObject.needsUpdate=!0},function(e,t){for(var n=this.resolvedProperty,r=0,i=n.length;r!==i;++r)n[r]=e[t++];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(e,t){this.resolvedProperty[this.propertyIndex]=e[t]},function(e,t){this.resolvedProperty[this.propertyIndex]=e[t],this.targetObject.needsUpdate=!0},function(e,t){this.resolvedProperty[this.propertyIndex]=e[t],this.targetObject.matrixWorldNeedsUpdate=!0}],[function(e,t){this.resolvedProperty.fromArray(e,t)},function(e,t){this.resolvedProperty.fromArray(e,t),this.targetObject.needsUpdate=!0},function(e,t){this.resolvedProperty.fromArray(e,t),this.targetObject.matrixWorldNeedsUpdate=!0}]],getValue:function(e,t){this.bind(),this.getValue(e,t)},setValue:function(e,t){this.bind(),this.setValue(e,t)},bind:function(){var e=this.node,t=this.parsedPath,n=t.objectName,r=t.propertyName,i=t.propertyIndex;if(e||(e=Oc.findNode(this.rootNode,t.nodeName)||this.rootNode,this.node=e),this.getValue=this._getValue_unavailable,this.setValue=this._setValue_unavailable,e){if(n){var a=t.objectIndex;switch(n){case"materials":if(!e.material)return void console.error("THREE.PropertyBinding: Can not bind to material as node does not have a material.",this);if(!e.material.materials)return void console.error("THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.",this);e=e.material.materials;break;case"bones":if(!e.skeleton)return void console.error("THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.",this);e=e.skeleton.bones;for(var o=0;o<e.length;o++)if(e[o].name===a){a=o;break}break;default:if(void 0===e[n])return void console.error("THREE.PropertyBinding: Can not bind to objectName of node undefined.",this);e=e[n]}if(void 0!==a){if(void 0===e[a])return void console.error("THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.",this,e);e=e[a]}}var s=e[r];if(void 0!==s){var c=this.Versioning.None;this.targetObject=e,void 0!==e.needsUpdate?c=this.Versioning.NeedsUpdate:void 0!==e.matrixWorldNeedsUpdate&&(c=this.Versioning.MatrixWorldNeedsUpdate);var l=this.BindingType.Direct;if(void 0!==i){if("morphTargetInfluences"===r){if(!e.geometry)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.",this);if(e.geometry.isBufferGeometry){if(!e.geometry.morphAttributes)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.",this);for(o=0;o<this.node.geometry.morphAttributes.position.length;o++)if(e.geometry.morphAttributes.position[o].name===i){i=o;break}}else{if(!e.geometry.morphTargets)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.",this);for(o=0;o<this.node.geometry.morphTargets.length;o++)if(e.geometry.morphTargets[o].name===i){i=o;break}}}l=this.BindingType.ArrayElement,this.resolvedProperty=s,this.propertyIndex=i}else void 0!==s.fromArray&&void 0!==s.toArray?(l=this.BindingType.HasFromToArray,this.resolvedProperty=s):Array.isArray(s)?(l=this.BindingType.EntireArray,this.resolvedProperty=s):this.propertyName=r;this.getValue=this.GetterByBindingType[l],this.setValue=this.SetterByBindingTypeAndVersioning[l][c]}else{var u=t.nodeName;console.error("THREE.PropertyBinding: Trying to update property for track: "+u+"."+r+" but it wasn't found.",e)}}else console.error("THREE.PropertyBinding: Trying to update node for track: "+this.path+" but it wasn't found.")},unbind:function(){this.node=null,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}}),Object.assign(Oc.prototype,{_getValue_unbound:Oc.prototype.getValue,_setValue_unbound:Oc.prototype.setValue}),Object.assign(Dc.prototype,{isAnimationObjectGroup:!0,add:function(){for(var e=this._objects,t=e.length,n=this.nCachedObjects_,r=this._indicesByUUID,i=this._paths,a=this._parsedPaths,o=this._bindings,s=o.length,c=void 0,l=0,u=arguments.length;l!==u;++l){var h=arguments[l],p=h.uuid,d=r[p];if(void 0===d){d=t++,r[p]=d,e.push(h);for(var f=0,m=s;f!==m;++f)o[f].push(new Oc(h,i[f],a[f]))}else if(d<n){c=e[d];var g=--n,v=e[g];r[v.uuid]=d,e[d]=v,r[p]=g,e[g]=h;for(f=0,m=s;f!==m;++f){var y=o[f],x=y[g],b=y[d];y[d]=x,void 0===b&&(b=new Oc(h,i[f],a[f])),y[g]=b}}else e[d]!==c&&console.error("THREE.AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes.")}this.nCachedObjects_=n},remove:function(){for(var e=this._objects,t=this.nCachedObjects_,n=this._indicesByUUID,r=this._bindings,i=r.length,a=0,o=arguments.length;a!==o;++a){var s=arguments[a],c=s.uuid,l=n[c];if(void 0!==l&&l>=t){var u=t++,h=e[u];n[h.uuid]=l,e[l]=h,n[c]=u,e[u]=s;for(var p=0,d=i;p!==d;++p){var f=r[p],m=f[u],g=f[l];f[l]=m,f[u]=g}}}this.nCachedObjects_=t},uncache:function(){for(var e=this._objects,t=e.length,n=this.nCachedObjects_,r=this._indicesByUUID,i=this._bindings,a=i.length,o=0,s=arguments.length;o!==s;++o){var c=arguments[o],l=c.uuid,u=r[l];if(void 0!==u)if(delete r[l],u<n){var h=--n,p=e[h],d=e[y=--t];r[p.uuid]=u,e[u]=p,r[d.uuid]=h,e[h]=d,e.pop();for(var f=0,m=a;f!==m;++f){var g=(x=i[f])[h],v=x[y];x[u]=g,x[h]=v,x.pop()}}else{var y;r[(d=e[y=--t]).uuid]=u,e[u]=d,e.pop();for(f=0,m=a;f!==m;++f){var x;(x=i[f])[u]=x[y],x.pop()}}}this.nCachedObjects_=n},subscribe_:function(e,t){var n=this._bindingsIndicesByPath,r=n[e],i=this._bindings;if(void 0!==r)return i[r];var a=this._paths,o=this._parsedPaths,s=this._objects,c=s.length,l=this.nCachedObjects_,u=new Array(c);r=i.length,n[e]=r,a.push(e),o.push(t),i.push(u);for(var h=l,p=s.length;h!==p;++h){var d=s[h];u[h]=new Oc(d,e,t)}return u},unsubscribe_:function(e){var t=this._bindingsIndicesByPath,n=t[e];if(void 0!==n){var r=this._paths,i=this._parsedPaths,a=this._bindings,o=a.length-1,s=a[o];t[e[o]]=n,a[n]=s,a.pop(),i[n]=i[o],i.pop(),r[n]=r[o],r.pop()}}}),Object.assign(Nc.prototype,{play:function(){return this._mixer._activateAction(this),this},stop:function(){return this._mixer._deactivateAction(this),this.reset()},reset:function(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()},isRunning:function(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)},isScheduled:function(){return this._mixer._isActiveAction(this)},startAt:function(e){return this._startTime=e,this},setLoop:function(e,t){return this.loop=e,this.repetitions=t,this},setEffectiveWeight:function(e){return this.weight=e,this._effectiveWeight=this.enabled?e:0,this.stopFading()},getEffectiveWeight:function(){return this._effectiveWeight},fadeIn:function(e){return this._scheduleFading(e,0,1)},fadeOut:function(e){return this._scheduleFading(e,1,0)},crossFadeFrom:function(e,t,n){if(e.fadeOut(t),this.fadeIn(t),n){var r=this._clip.duration,i=e._clip.duration,a=i/r,o=r/i;e.warp(1,a,t),this.warp(o,1,t)}return this},crossFadeTo:function(e,t,n){return e.crossFadeFrom(this,t,n)},stopFading:function(){var e=this._weightInterpolant;return null!==e&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(e)),this},setEffectiveTimeScale:function(e){return this.timeScale=e,this._effectiveTimeScale=this.paused?0:e,this.stopWarping()},getEffectiveTimeScale:function(){return this._effectiveTimeScale},setDuration:function(e){return this.timeScale=this._clip.duration/e,this.stopWarping()},syncWith:function(e){return this.time=e.time,this.timeScale=e.timeScale,this.stopWarping()},halt:function(e){return this.warp(this._effectiveTimeScale,0,e)},warp:function(e,t,n){var r=this._mixer,i=r.time,a=this._timeScaleInterpolant,o=this.timeScale;null===a&&(a=r._lendControlInterpolant(),this._timeScaleInterpolant=a);var s=a.parameterPositions,c=a.sampleValues;return s[0]=i,s[1]=i+n,c[0]=e/o,c[1]=t/o,this},stopWarping:function(){var e=this._timeScaleInterpolant;return null!==e&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(e)),this},getMixer:function(){return this._mixer},getClip:function(){return this._clip},getRoot:function(){return this._localRoot||this._mixer._root},_update:function(e,t,n,r){if(this.enabled){var i=this._startTime;if(null!==i){var a=(e-i)*n;if(a<0||0===n)return;this._startTime=null,t=n*a}t*=this._updateTimeScale(e);var o=this._updateTime(t),s=this._updateWeight(e);if(s>0)for(var c=this._interpolants,l=this._propertyBindings,u=0,h=c.length;u!==h;++u)c[u].evaluate(o),l[u].accumulate(r,s)}else this._updateWeight(e)},_updateWeight:function(e){var t=0;if(this.enabled){t=this.weight;var n=this._weightInterpolant;if(null!==n){var r=n.evaluate(e)[0];t*=r,e>n.parameterPositions[1]&&(this.stopFading(),0===r&&(this.enabled=!1))}}return this._effectiveWeight=t,t},_updateTimeScale:function(e){var t=0;if(!this.paused){t=this.timeScale;var n=this._timeScaleInterpolant;if(null!==n)t*=n.evaluate(e)[0],e>n.parameterPositions[1]&&(this.stopWarping(),0===t?this.paused=!0:this.timeScale=t)}return this._effectiveTimeScale=t,t},_updateTime:function(e){var t=this.time+e,n=this._clip.duration,r=this.loop,i=this._loopCount,a=2202===r;if(0===e)return-1===i?t:a&&1==(1&i)?n-t:t;if(2200===r){-1===i&&(this._loopCount=0,this._setEndings(!0,!0,!1));e:{if(t>=n)t=n;else{if(!(t<0)){this.time=t;break e}t=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=t,this._mixer.dispatchEvent({type:"finished",action:this,direction:e<0?-1:1})}}else{if(-1===i&&(e>=0?(i=0,this._setEndings(!0,0===this.repetitions,a)):this._setEndings(0===this.repetitions,!0,a)),t>=n||t<0){var o=Math.floor(t/n);t-=n*o,i+=Math.abs(o);var s=this.repetitions-i;if(s<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,t=e>0?n:0,this.time=t,this._mixer.dispatchEvent({type:"finished",action:this,direction:e>0?1:-1});else{if(1===s){var c=e<0;this._setEndings(c,!c,a)}else this._setEndings(!1,!1,a);this._loopCount=i,this.time=t,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:o})}}else this.time=t;if(a&&1==(1&i))return n-t}return t},_setEndings:function(e,t,n){var r=this._interpolantSettings;n?(r.endingStart=2401,r.endingEnd=2401):(r.endingStart=e?this.zeroSlopeAtStart?2401:2400:2402,r.endingEnd=t?this.zeroSlopeAtEnd?2401:2400:2402)},_scheduleFading:function(e,t,n){var r=this._mixer,i=r.time,a=this._weightInterpolant;null===a&&(a=r._lendControlInterpolant(),this._weightInterpolant=a);var o=a.parameterPositions,s=a.sampleValues;return o[0]=i,s[0]=t,o[1]=i+e,s[1]=n,this}}),Ic.prototype=Object.assign(Object.create(o.prototype),{constructor:Ic,_bindAction:function(e,t){var n=e._localRoot||this._root,r=e._clip.tracks,i=r.length,a=e._propertyBindings,o=e._interpolants,s=n.uuid,c=this._bindingsByRootAndName,l=c[s];void 0===l&&(l={},c[s]=l);for(var u=0;u!==i;++u){var h=r[u],p=h.name,d=l[p];if(void 0!==d)a[u]=d;else{if(void 0!==(d=a[u])){null===d._cacheIndex&&(++d.referenceCount,this._addInactiveBinding(d,s,p));continue}var f=t&&t._propertyBindings[u].binding.parsedPath;++(d=new wc(Oc.create(n,p,f),h.ValueTypeName,h.getValueSize())).referenceCount,this._addInactiveBinding(d,s,p),a[u]=d}o[u].resultBuffer=d.buffer}},_activateAction:function(e){if(!this._isActiveAction(e)){if(null===e._cacheIndex){var t=(e._localRoot||this._root).uuid,n=e._clip.uuid,r=this._actionsByClip[n];this._bindAction(e,r&&r.knownActions[0]),this._addInactiveAction(e,n,t)}for(var i=e._propertyBindings,a=0,o=i.length;a!==o;++a){var s=i[a];0==s.useCount++&&(this._lendBinding(s),s.saveOriginalState())}this._lendAction(e)}},_deactivateAction:function(e){if(this._isActiveAction(e)){for(var t=e._propertyBindings,n=0,r=t.length;n!==r;++n){var i=t[n];0==--i.useCount&&(i.restoreOriginalState(),this._takeBackBinding(i))}this._takeBackAction(e)}},_initMemoryManager:function(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;var e=this;this.stats={actions:{get total(){return e._actions.length},get inUse(){return e._nActiveActions}},bindings:{get total(){return e._bindings.length},get inUse(){return e._nActiveBindings}},controlInterpolants:{get total(){return e._controlInterpolants.length},get inUse(){return e._nActiveControlInterpolants}}}},_isActiveAction:function(e){var t=e._cacheIndex;return null!==t&&t<this._nActiveActions},_addInactiveAction:function(e,t,n){var r=this._actions,i=this._actionsByClip,a=i[t];if(void 0===a)a={knownActions:[e],actionByRoot:{}},e._byClipCacheIndex=0,i[t]=a;else{var o=a.knownActions;e._byClipCacheIndex=o.length,o.push(e)}e._cacheIndex=r.length,r.push(e),a.actionByRoot[n]=e},_removeInactiveAction:function(e){var t=this._actions,n=t[t.length-1],r=e._cacheIndex;n._cacheIndex=r,t[r]=n,t.pop(),e._cacheIndex=null;var i=e._clip.uuid,a=this._actionsByClip,o=a[i],s=o.knownActions,c=s[s.length-1],l=e._byClipCacheIndex;c._byClipCacheIndex=l,s[l]=c,s.pop(),e._byClipCacheIndex=null,delete o.actionByRoot[(e._localRoot||this._root).uuid],0===s.length&&delete a[i],this._removeInactiveBindingsForAction(e)},_removeInactiveBindingsForAction:function(e){for(var t=e._propertyBindings,n=0,r=t.length;n!==r;++n){var i=t[n];0==--i.referenceCount&&this._removeInactiveBinding(i)}},_lendAction:function(e){var t=this._actions,n=e._cacheIndex,r=this._nActiveActions++,i=t[r];e._cacheIndex=r,t[r]=e,i._cacheIndex=n,t[n]=i},_takeBackAction:function(e){var t=this._actions,n=e._cacheIndex,r=--this._nActiveActions,i=t[r];e._cacheIndex=r,t[r]=e,i._cacheIndex=n,t[n]=i},_addInactiveBinding:function(e,t,n){var r=this._bindingsByRootAndName,i=r[t],a=this._bindings;void 0===i&&(i={},r[t]=i),i[n]=e,e._cacheIndex=a.length,a.push(e)},_removeInactiveBinding:function(e){var t=this._bindings,n=e.binding,r=n.rootNode.uuid,i=n.path,a=this._bindingsByRootAndName,o=a[r],s=t[t.length-1],c=e._cacheIndex;s._cacheIndex=c,t[c]=s,t.pop(),delete o[i],0===Object.keys(o).length&&delete a[r]},_lendBinding:function(e){var t=this._bindings,n=e._cacheIndex,r=this._nActiveBindings++,i=t[r];e._cacheIndex=r,t[r]=e,i._cacheIndex=n,t[n]=i},_takeBackBinding:function(e){var t=this._bindings,n=e._cacheIndex,r=--this._nActiveBindings,i=t[r];e._cacheIndex=r,t[r]=e,i._cacheIndex=n,t[n]=i},_lendControlInterpolant:function(){var e=this._controlInterpolants,t=this._nActiveControlInterpolants++,n=e[t];return void 0===n&&((n=new Do(new Float32Array(2),new Float32Array(2),1,this._controlInterpolantsResultBuffer)).__cacheIndex=t,e[t]=n),n},_takeBackControlInterpolant:function(e){var t=this._controlInterpolants,n=e.__cacheIndex,r=--this._nActiveControlInterpolants,i=t[r];e.__cacheIndex=r,t[r]=e,i.__cacheIndex=n,t[n]=i},_controlInterpolantsResultBuffer:new Float32Array(1),clipAction:function(e,t){var n=t||this._root,r=n.uuid,i="string"==typeof e?Go.findByName(n,e):e,a=null!==i?i.uuid:e,o=this._actionsByClip[a],s=null;if(void 0!==o){var c=o.actionByRoot[r];if(void 0!==c)return c;s=o.knownActions[0],null===i&&(i=s._clip)}if(null===i)return null;var l=new Nc(this,i,t);return this._bindAction(l,s),this._addInactiveAction(l,a,r),l},existingAction:function(e,t){var n=t||this._root,r=n.uuid,i="string"==typeof e?Go.findByName(n,e):e,a=i?i.uuid:e,o=this._actionsByClip[a];return void 0!==o&&o.actionByRoot[r]||null},stopAllAction:function(){var e=this._actions,t=this._nActiveActions,n=this._bindings,r=this._nActiveBindings;this._nActiveActions=0,this._nActiveBindings=0;for(var i=0;i!==t;++i)e[i].reset();for(i=0;i!==r;++i)n[i].useCount=0;return this},update:function(e){e*=this.timeScale;for(var t=this._actions,n=this._nActiveActions,r=this.time+=e,i=Math.sign(e),a=this._accuIndex^=1,o=0;o!==n;++o){t[o]._update(r,e,i,a)}var s=this._bindings,c=this._nActiveBindings;for(o=0;o!==c;++o)s[o].apply(a);return this},setTime:function(e){this.time=0;for(var t=0;t<this._actions.length;t++)this._actions[t].time=0;return this.update(e)},getRoot:function(){return this._root},uncacheClip:function(e){var t=this._actions,n=e.uuid,r=this._actionsByClip,i=r[n];if(void 0!==i){for(var a=i.knownActions,o=0,s=a.length;o!==s;++o){var c=a[o];this._deactivateAction(c);var l=c._cacheIndex,u=t[t.length-1];c._cacheIndex=null,c._byClipCacheIndex=null,u._cacheIndex=l,t[l]=u,t.pop(),this._removeInactiveBindingsForAction(c)}delete r[n]}},uncacheRoot:function(e){var t=e.uuid,n=this._actionsByClip;for(var r in n){var i=n[r].actionByRoot[t];void 0!==i&&(this._deactivateAction(i),this._removeInactiveAction(i))}var a=this._bindingsByRootAndName[t];if(void 0!==a)for(var o in a){var s=a[o];s.restoreOriginalState(),this._removeInactiveBinding(s)}},uncacheAction:function(e,t){var n=this.existingAction(e,t);null!==n&&(this._deactivateAction(n),this._removeInactiveAction(n))}}),zc.prototype.clone=function(){return new zc(void 0===this.value.clone?this.value:this.value.clone())},kc.prototype=Object.assign(Object.create(ai.prototype),{constructor:kc,isInstancedInterleavedBuffer:!0,copy:function(e){return ai.prototype.copy.call(this,e),this.meshPerAttribute=e.meshPerAttribute,this}}),Object.assign(Fc.prototype,{set:function(e,t){this.ray.set(e,t)},setFromCamera:function(e,t){t&&t.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(t.matrixWorld),this.ray.direction.set(e.x,e.y,.5).unproject(t).sub(this.ray.origin).normalize(),this.camera=t):t&&t.isOrthographicCamera?(this.ray.origin.set(e.x,e.y,(t.near+t.far)/(t.near-t.far)).unproject(t),this.ray.direction.set(0,0,-1).transformDirection(t.matrixWorld),this.camera=t):console.error("THREE.Raycaster: Unsupported camera type.")},intersectObject:function(e,t,n){var r=n||[];return Uc(e,this,r,t),r.sort(Bc),r},intersectObjects:function(e,t,n){var r=n||[];if(!1===Array.isArray(e))return console.warn("THREE.Raycaster.intersectObjects: objects is not an Array."),r;for(var i=0,a=e.length;i<a;i++)Uc(e[i],this,r,t);return r.sort(Bc),r}}),Object.assign(jc.prototype,{set:function(e,t,n){return this.radius=e,this.phi=t,this.theta=n,this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.radius=e.radius,this.phi=e.phi,this.theta=e.theta,this},makeSafe:function(){return this.phi=Math.max(1e-6,Math.min(Math.PI-1e-6,this.phi)),this},setFromVector3:function(e){return this.setFromCartesianCoords(e.x,e.y,e.z)},setFromCartesianCoords:function(e,t,n){return this.radius=Math.sqrt(e*e+t*t+n*n),0===this.radius?(this.theta=0,this.phi=0):(this.theta=Math.atan2(e,n),this.phi=Math.acos(u.clamp(t/this.radius,-1,1))),this}}),Object.assign(Hc.prototype,{set:function(e,t,n){return this.radius=e,this.theta=t,this.y=n,this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.radius=e.radius,this.theta=e.theta,this.y=e.y,this},setFromVector3:function(e){return this.setFromCartesianCoords(e.x,e.y,e.z)},setFromCartesianCoords:function(e,t,n){return this.radius=Math.sqrt(e*e+n*n),this.theta=Math.atan2(e,n),this.y=t,this}});var Gc=new h;function Vc(e,t){this.min=void 0!==e?e:new h(1/0,1/0),this.max=void 0!==t?t:new h(-1/0,-1/0)}Object.assign(Vc.prototype,{set:function(e,t){return this.min.copy(e),this.max.copy(t),this},setFromPoints:function(e){this.makeEmpty();for(var t=0,n=e.length;t<n;t++)this.expandByPoint(e[t]);return this},setFromCenterAndSize:function(e,t){var n=Gc.copy(t).multiplyScalar(.5);return this.min.copy(e).sub(n),this.max.copy(e).add(n),this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.min.copy(e.min),this.max.copy(e.max),this},makeEmpty:function(){return this.min.x=this.min.y=1/0,this.max.x=this.max.y=-1/0,this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<this.min.y},getCenter:function(e){return void 0===e&&(console.warn("THREE.Box2: .getCenter() target is now required"),e=new h),this.isEmpty()?e.set(0,0):e.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(e){return void 0===e&&(console.warn("THREE.Box2: .getSize() target is now required"),e=new h),this.isEmpty()?e.set(0,0):e.subVectors(this.max,this.min)},expandByPoint:function(e){return this.min.min(e),this.max.max(e),this},expandByVector:function(e){return this.min.sub(e),this.max.add(e),this},expandByScalar:function(e){return this.min.addScalar(-e),this.max.addScalar(e),this},containsPoint:function(e){return!(e.x<this.min.x||e.x>this.max.x||e.y<this.min.y||e.y>this.max.y)},containsBox:function(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y},getParameter:function(e,t){return void 0===t&&(console.warn("THREE.Box2: .getParameter() target is now required"),t=new h),t.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y))},intersectsBox:function(e){return!(e.max.x<this.min.x||e.min.x>this.max.x||e.max.y<this.min.y||e.min.y>this.max.y)},clampPoint:function(e,t){return void 0===t&&(console.warn("THREE.Box2: .clampPoint() target is now required"),t=new h),t.copy(e).clamp(this.min,this.max)},distanceToPoint:function(e){return Gc.copy(e).clamp(this.min,this.max).sub(e).length()},intersect:function(e){return this.min.max(e.min),this.max.min(e.max),this},union:function(e){return this.min.min(e.min),this.max.max(e.max),this},translate:function(e){return this.min.add(e),this.max.add(e),this},equals:function(e){return e.min.equals(this.min)&&e.max.equals(this.max)}});var Wc=new w,qc=new w;function Xc(e,t){this.start=void 0!==e?e:new w,this.end=void 0!==t?t:new w}function Yc(e){Y.call(this),this.material=e,this.render=function(){}}Object.assign(Xc.prototype,{set:function(e,t){return this.start.copy(e),this.end.copy(t),this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.start.copy(e.start),this.end.copy(e.end),this},getCenter:function(e){return void 0===e&&(console.warn("THREE.Line3: .getCenter() target is now required"),e=new w),e.addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(e){return void 0===e&&(console.warn("THREE.Line3: .delta() target is now required"),e=new w),e.subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(e,t){return void 0===t&&(console.warn("THREE.Line3: .at() target is now required"),t=new w),this.delta(t).multiplyScalar(e).add(this.start)},closestPointToPointParameter:function(e,t){Wc.subVectors(e,this.start),qc.subVectors(this.end,this.start);var n=qc.dot(qc),r=qc.dot(Wc)/n;return t&&(r=u.clamp(r,0,1)),r},closestPointToPoint:function(e,t,n){var r=this.closestPointToPointParameter(e,t);return void 0===n&&(console.warn("THREE.Line3: .closestPointToPoint() target is now required"),n=new w),this.delta(n).multiplyScalar(r).add(this.start)},applyMatrix4:function(e){return this.start.applyMatrix4(e),this.end.applyMatrix4(e),this},equals:function(e){return e.start.equals(this.start)&&e.end.equals(this.end)}}),Yc.prototype=Object.create(Y.prototype),Yc.prototype.constructor=Yc,Yc.prototype.isImmediateRenderObject=!0;var Zc=new w;function Jc(e,t){Y.call(this),this.light=e,this.light.updateMatrixWorld(),this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1,this.color=t;for(var n=new dt,r=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1],i=0,a=1;i<32;i++,a++){var o=i/32*Math.PI*2,s=a/32*Math.PI*2;r.push(Math.cos(o),Math.sin(o),1,Math.cos(s),Math.sin(s),1)}n.setAttribute("position",new nt(r,3));var c=new ki({fog:!1,toneMapped:!1});this.cone=new qi(n,c),this.add(this.cone),this.update()}Jc.prototype=Object.create(Y.prototype),Jc.prototype.constructor=Jc,Jc.prototype.dispose=function(){this.cone.geometry.dispose(),this.cone.material.dispose()},Jc.prototype.update=function(){this.light.updateMatrixWorld();var e=this.light.distance?this.light.distance:1e3,t=e*Math.tan(this.light.angle);this.cone.scale.set(t,t,e),Zc.setFromMatrixPosition(this.light.target.matrixWorld),this.cone.lookAt(Zc),void 0!==this.color?this.cone.material.color.set(this.color):this.cone.material.color.copy(this.light.color)};var Qc=new w,Kc=new R,$c=new R;function el(e){for(var t=function e(t){var n=[];t&&t.isBone&&n.push(t);for(var r=0;r<t.children.length;r++)n.push.apply(n,e(t.children[r]));return n}(e),n=new dt,r=[],i=[],a=new Be(0,0,1),o=new Be(0,1,0),s=0;s<t.length;s++){var c=t[s];c.parent&&c.parent.isBone&&(r.push(0,0,0),r.push(0,0,0),i.push(a.r,a.g,a.b),i.push(o.r,o.g,o.b))}n.setAttribute("position",new nt(r,3)),n.setAttribute("color",new nt(i,3));var l=new ki({vertexColors:!0,depthTest:!1,depthWrite:!1,toneMapped:!1,transparent:!0});qi.call(this,n,l),this.root=e,this.bones=t,this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1}function tl(e,t,n){this.light=e,this.light.updateMatrixWorld(),this.color=n;var r=new no(t,4,2),i=new qe({wireframe:!0,fog:!1,toneMapped:!1});Ct.call(this,r,i),this.matrix=this.light.matrixWorld,this.matrixAutoUpdate=!1,this.update()}el.prototype=Object.create(qi.prototype),el.prototype.constructor=el,el.prototype.isSkeletonHelper=!0,el.prototype.updateMatrixWorld=function(e){var t=this.bones,n=this.geometry,r=n.getAttribute("position");$c.getInverse(this.root.matrixWorld);for(var i=0,a=0;i<t.length;i++){var o=t[i];o.parent&&o.parent.isBone&&(Kc.multiplyMatrices($c,o.matrixWorld),Qc.setFromMatrixPosition(Kc),r.setXYZ(a,Qc.x,Qc.y,Qc.z),Kc.multiplyMatrices($c,o.parent.matrixWorld),Qc.setFromMatrixPosition(Kc),r.setXYZ(a+1,Qc.x,Qc.y,Qc.z),a+=2)}n.getAttribute("position").needsUpdate=!0,Y.prototype.updateMatrixWorld.call(this,e)},tl.prototype=Object.create(Ct.prototype),tl.prototype.constructor=tl,tl.prototype.dispose=function(){this.geometry.dispose(),this.material.dispose()},tl.prototype.update=function(){void 0!==this.color?this.material.color.set(this.color):this.material.color.copy(this.light.color)};var nl=new w,rl=new Be,il=new Be;function al(e,t,n){Y.call(this),this.light=e,this.light.updateMatrixWorld(),this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1,this.color=n;var r=new da(t);r.rotateY(.5*Math.PI),this.material=new qe({wireframe:!0,fog:!1,toneMapped:!1}),void 0===this.color&&(this.material.vertexColors=!0);var i=r.getAttribute("position"),a=new Float32Array(3*i.count);r.setAttribute("color",new Ye(a,3)),this.add(new Ct(r,this.material)),this.update()}function ol(e,t,n,r){e=e||10,t=t||10,n=new Be(void 0!==n?n:4473924),r=new Be(void 0!==r?r:8947848);for(var i=t/2,a=e/t,o=e/2,s=[],c=[],l=0,u=0,h=-o;l<=t;l++,h+=a){s.push(-o,0,h,o,0,h),s.push(h,0,-o,h,0,o);var p=l===i?n:r;p.toArray(c,u),u+=3,p.toArray(c,u),u+=3,p.toArray(c,u),u+=3,p.toArray(c,u),u+=3}var d=new dt;d.setAttribute("position",new nt(s,3)),d.setAttribute("color",new nt(c,3));var f=new ki({vertexColors:!0,toneMapped:!1});qi.call(this,d,f)}function sl(e,t,n,r,i,a){e=e||10,t=t||16,n=n||8,r=r||64,i=new Be(void 0!==i?i:4473924),a=new Be(void 0!==a?a:8947848);var o,s,c,l,u,h,p,d=[],f=[];for(l=0;l<=t;l++)c=l/t*(2*Math.PI),o=Math.sin(c)*e,s=Math.cos(c)*e,d.push(0,0,0),d.push(o,0,s),p=1&l?i:a,f.push(p.r,p.g,p.b),f.push(p.r,p.g,p.b);for(l=0;l<=n;l++)for(p=1&l?i:a,h=e-e/n*l,u=0;u<r;u++)c=u/r*(2*Math.PI),o=Math.sin(c)*h,s=Math.cos(c)*h,d.push(o,0,s),f.push(p.r,p.g,p.b),c=(u+1)/r*(2*Math.PI),o=Math.sin(c)*h,s=Math.cos(c)*h,d.push(o,0,s),f.push(p.r,p.g,p.b);var m=new dt;m.setAttribute("position",new nt(d,3)),m.setAttribute("color",new nt(f,3));var g=new ki({vertexColors:!0,toneMapped:!1});qi.call(this,m,g)}al.prototype=Object.create(Y.prototype),al.prototype.constructor=al,al.prototype.dispose=function(){this.children[0].geometry.dispose(),this.children[0].material.dispose()},al.prototype.update=function(){var e=this.children[0];if(void 0!==this.color)this.material.color.set(this.color);else{var t=e.geometry.getAttribute("color");rl.copy(this.light.color),il.copy(this.light.groundColor);for(var n=0,r=t.count;n<r;n++){var i=n<r/2?rl:il;t.setXYZ(n,i.r,i.g,i.b)}t.needsUpdate=!0}e.lookAt(nl.setFromMatrixPosition(this.light.matrixWorld).negate())},ol.prototype=Object.assign(Object.create(qi.prototype),{constructor:ol,copy:function(e){return qi.prototype.copy.call(this,e),this.geometry.copy(e.geometry),this.material.copy(e.material),this},clone:function(){return(new this.constructor).copy(this)}}),sl.prototype=Object.create(qi.prototype),sl.prototype.constructor=sl;var cl=new w,ll=new w,ul=new w;function hl(e,t,n){Y.call(this),this.light=e,this.light.updateMatrixWorld(),this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1,this.color=n,void 0===t&&(t=1);var r=new dt;r.setAttribute("position",new nt([-t,t,0,t,t,0,t,-t,0,-t,-t,0,-t,t,0],3));var i=new ki({fog:!1,toneMapped:!1});this.lightPlane=new Gi(r,i),this.add(this.lightPlane),(r=new dt).setAttribute("position",new nt([0,0,0,0,0,1],3)),this.targetLine=new Gi(r,i),this.add(this.targetLine),this.update()}hl.prototype=Object.create(Y.prototype),hl.prototype.constructor=hl,hl.prototype.dispose=function(){this.lightPlane.geometry.dispose(),this.lightPlane.material.dispose(),this.targetLine.geometry.dispose(),this.targetLine.material.dispose()},hl.prototype.update=function(){cl.setFromMatrixPosition(this.light.matrixWorld),ll.setFromMatrixPosition(this.light.target.matrixWorld),ul.subVectors(ll,cl),this.lightPlane.lookAt(ll),void 0!==this.color?(this.lightPlane.material.color.set(this.color),this.targetLine.material.color.set(this.color)):(this.lightPlane.material.color.copy(this.light.color),this.targetLine.material.color.copy(this.light.color)),this.targetLine.lookAt(ll),this.targetLine.scale.z=ul.length()};var pl=new w,dl=new Wt;function fl(e){var t=new dt,n=new ki({color:16777215,vertexColors:!0,toneMapped:!1}),r=[],i=[],a={},o=new Be(16755200),s=new Be(16711680),c=new Be(43775),l=new Be(16777215),u=new Be(3355443);function h(e,t,n){p(e,n),p(t,n)}function p(e,t){r.push(0,0,0),i.push(t.r,t.g,t.b),void 0===a[e]&&(a[e]=[]),a[e].push(r.length/3-1)}h("n1","n2",o),h("n2","n4",o),h("n4","n3",o),h("n3","n1",o),h("f1","f2",o),h("f2","f4",o),h("f4","f3",o),h("f3","f1",o),h("n1","f1",o),h("n2","f2",o),h("n3","f3",o),h("n4","f4",o),h("p","n1",s),h("p","n2",s),h("p","n3",s),h("p","n4",s),h("u1","u2",c),h("u2","u3",c),h("u3","u1",c),h("c","t",l),h("p","c",u),h("cn1","cn2",u),h("cn3","cn4",u),h("cf1","cf2",u),h("cf3","cf4",u),t.setAttribute("position",new nt(r,3)),t.setAttribute("color",new nt(i,3)),qi.call(this,t,n),this.camera=e,this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix(),this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1,this.pointMap=a,this.update()}function ml(e,t,n,r,i,a,o){pl.set(i,a,o).unproject(r);var s=t[e];if(void 0!==s)for(var c=n.getAttribute("position"),l=0,u=s.length;l<u;l++)c.setXYZ(s[l],pl.x,pl.y,pl.z)}fl.prototype=Object.create(qi.prototype),fl.prototype.constructor=fl,fl.prototype.update=function(){var e=this.geometry,t=this.pointMap;dl.projectionMatrixInverse.copy(this.camera.projectionMatrixInverse),ml("c",t,e,dl,0,0,-1),ml("t",t,e,dl,0,0,1),ml("n1",t,e,dl,-1,-1,-1),ml("n2",t,e,dl,1,-1,-1),ml("n3",t,e,dl,-1,1,-1),ml("n4",t,e,dl,1,1,-1),ml("f1",t,e,dl,-1,-1,1),ml("f2",t,e,dl,1,-1,1),ml("f3",t,e,dl,-1,1,1),ml("f4",t,e,dl,1,1,1),ml("u1",t,e,dl,.7,1.1,-1),ml("u2",t,e,dl,-.7,1.1,-1),ml("u3",t,e,dl,0,2,-1),ml("cf1",t,e,dl,-1,0,1),ml("cf2",t,e,dl,1,0,1),ml("cf3",t,e,dl,0,-1,1),ml("cf4",t,e,dl,0,1,1),ml("cn1",t,e,dl,-1,0,-1),ml("cn2",t,e,dl,1,0,-1),ml("cn3",t,e,dl,0,-1,-1),ml("cn4",t,e,dl,0,1,-1),e.getAttribute("position").needsUpdate=!0};var gl=new le;function vl(e,t){this.object=e,void 0===t&&(t=16776960);var n=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),r=new Float32Array(24),i=new dt;i.setIndex(new Ye(n,1)),i.setAttribute("position",new Ye(r,3)),qi.call(this,i,new ki({color:t,toneMapped:!1})),this.matrixAutoUpdate=!1,this.update()}function yl(e,t){this.type="Box3Helper",this.box=e,t=t||16776960;var n=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),r=new dt;r.setIndex(new Ye(n,1)),r.setAttribute("position",new nt([1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1],3)),qi.call(this,r,new ki({color:t,toneMapped:!1})),this.geometry.computeBoundingSphere()}function xl(e,t,n){this.type="PlaneHelper",this.plane=e,this.size=void 0===t?1:t;var r=void 0!==n?n:16776960,i=new dt;i.setAttribute("position",new nt([1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,0,0,1,0,0,0],3)),i.computeBoundingSphere(),Gi.call(this,i,new ki({color:r,toneMapped:!1}));var a=new dt;a.setAttribute("position",new nt([1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1],3)),a.computeBoundingSphere(),this.add(new Ct(a,new qe({color:r,opacity:.2,transparent:!0,depthWrite:!1,toneMapped:!1})))}vl.prototype=Object.create(qi.prototype),vl.prototype.constructor=vl,vl.prototype.update=function(e){if(void 0!==e&&console.warn("THREE.BoxHelper: .update() has no longer arguments."),void 0!==this.object&&gl.setFromObject(this.object),!gl.isEmpty()){var t=gl.min,n=gl.max,r=this.geometry.attributes.position,i=r.array;i[0]=n.x,i[1]=n.y,i[2]=n.z,i[3]=t.x,i[4]=n.y,i[5]=n.z,i[6]=t.x,i[7]=t.y,i[8]=n.z,i[9]=n.x,i[10]=t.y,i[11]=n.z,i[12]=n.x,i[13]=n.y,i[14]=t.z,i[15]=t.x,i[16]=n.y,i[17]=t.z,i[18]=t.x,i[19]=t.y,i[20]=t.z,i[21]=n.x,i[22]=t.y,i[23]=t.z,r.needsUpdate=!0,this.geometry.computeBoundingSphere()}},vl.prototype.setFromObject=function(e){return this.object=e,this.update(),this},vl.prototype.copy=function(e){return qi.prototype.copy.call(this,e),this.object=e.object,this},vl.prototype.clone=function(){return(new this.constructor).copy(this)},yl.prototype=Object.create(qi.prototype),yl.prototype.constructor=yl,yl.prototype.updateMatrixWorld=function(e){var t=this.box;t.isEmpty()||(t.getCenter(this.position),t.getSize(this.scale),this.scale.multiplyScalar(.5),Y.prototype.updateMatrixWorld.call(this,e))},xl.prototype=Object.create(Gi.prototype),xl.prototype.constructor=xl,xl.prototype.updateMatrixWorld=function(e){var t=-this.plane.constant;Math.abs(t)<1e-8&&(t=1e-8),this.scale.set(.5*this.size,.5*this.size,t),this.children[0].material.side=t<0?1:0,this.lookAt(this.plane.normal),Y.prototype.updateMatrixWorld.call(this,e)};var bl,_l,wl=new w;function Ml(e,t,n,r,i,a){Y.call(this),void 0===e&&(e=new w(0,0,1)),void 0===t&&(t=new w(0,0,0)),void 0===n&&(n=1),void 0===r&&(r=16776960),void 0===i&&(i=.2*n),void 0===a&&(a=.2*i),void 0===bl&&((bl=new dt).setAttribute("position",new nt([0,0,0,0,1,0],3)),(_l=new po(0,.5,1,5,1)).translate(0,-.5,0)),this.position.copy(t),this.line=new Gi(bl,new ki({color:r,toneMapped:!1})),this.line.matrixAutoUpdate=!1,this.add(this.line),this.cone=new Ct(_l,new qe({color:r,toneMapped:!1})),this.cone.matrixAutoUpdate=!1,this.add(this.cone),this.setDirection(e),this.setLength(n,i,a)}function Sl(e){var t=[0,0,0,e=e||1,0,0,0,0,0,0,e,0,0,0,0,0,0,e],n=new dt;n.setAttribute("position",new nt(t,3)),n.setAttribute("color",new nt([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));var r=new ki({vertexColors:!0,toneMapped:!1});qi.call(this,n,r)}Ml.prototype=Object.create(Y.prototype),Ml.prototype.constructor=Ml,Ml.prototype.setDirection=function(e){if(e.y>.99999)this.quaternion.set(0,0,0,1);else if(e.y<-.99999)this.quaternion.set(1,0,0,0);else{wl.set(e.z,0,-e.x).normalize();var t=Math.acos(e.y);this.quaternion.setFromAxisAngle(wl,t)}},Ml.prototype.setLength=function(e,t,n){void 0===t&&(t=.2*e),void 0===n&&(n=.2*t),this.line.scale.set(1,Math.max(1e-4,e-t),1),this.line.updateMatrix(),this.cone.scale.set(n,t,n),this.cone.position.y=e,this.cone.updateMatrix()},Ml.prototype.setColor=function(e){this.line.material.color.set(e),this.cone.material.color.set(e)},Ml.prototype.copy=function(e){return Y.prototype.copy.call(this,e,!1),this.line.copy(e.line),this.cone.copy(e.cone),this},Ml.prototype.clone=function(){return(new this.constructor).copy(this)},Sl.prototype=Object.create(qi.prototype),Sl.prototype.constructor=Sl;var El,Tl,Al,Ll,Pl=Math.pow(2,8),Rl=[.125,.215,.35,.446,.526,.582],Cl=5+Rl.length,Ol={3e3:0,3001:1,3002:2,3004:3,3005:4,3006:5,3007:6},Dl=new Ds,Nl=(El=20,Tl=new Float32Array(El),Al=new w(0,1,0),(Ll=new bo({defines:{n:El},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:Tl},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:Al},inputEncoding:{value:Ol[3e3]},outputEncoding:{value:Ol[3e3]}},vertexShader:ru(),fragmentShader:`\nprecision mediump float;\nprecision mediump int;\nvarying vec3 vOutputDirection;\nuniform sampler2D envMap;\nuniform int samples;\nuniform float weights[n];\nuniform bool latitudinal;\nuniform float dTheta;\nuniform float mipInt;\nuniform vec3 poleAxis;\n\n${iu()}\n\n#define ENVMAP_TYPE_CUBE_UV\n#include <cube_uv_reflection_fragment>\n\nvec3 getSample(float theta, vec3 axis) {\n\tfloat cosTheta = cos(theta);\n\t// Rodrigues' axis-angle rotation\n\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t+ cross(axis, vOutputDirection) * sin(theta)\n\t\t+ axis * dot(axis, vOutputDirection) * (1.0 - cosTheta);\n\treturn bilinearCubeUV(envMap, sampleDirection, mipInt);\n}\n\nvoid main() {\n\tvec3 axis = latitudinal ? poleAxis : cross(poleAxis, vOutputDirection);\n\tif (all(equal(axis, vec3(0.0))))\n\t\taxis = vec3(vOutputDirection.z, 0.0, - vOutputDirection.x);\n\taxis = normalize(axis);\n\tgl_FragColor = vec4(0.0);\n\tgl_FragColor.rgb += weights[0] * getSample(0.0, axis);\n\tfor (int i = 1; i < n; i++) {\n\t\tif (i >= samples)\n\t\t\tbreak;\n\t\tfloat theta = dTheta * float(i);\n\t\tgl_FragColor.rgb += weights[i] * getSample(-1.0 * theta, axis);\n\t\tgl_FragColor.rgb += weights[i] * getSample(theta, axis);\n\t}\n\tgl_FragColor = linearToOutputTexel(gl_FragColor);\n}\n\t\t`,blending:0,depthTest:!1,depthWrite:!1})).type="SphericalGaussianBlur",Ll),Il=null,zl=null,{_lodPlanes:kl,_sizeLods:Fl,_sigmas:Bl}=function(){for(var e=[],t=[],n=[],r=8,i=0;i<Cl;i++){var a=Math.pow(2,r);t.push(a);var o=1/a;i>4?o=Rl[i-8+4-1]:0==i&&(o=0),n.push(o);for(var s=1/(a-1),c=-s/2,l=1+s/2,u=[c,c,l,c,l,l,c,c,l,l,c,l],h=new Float32Array(108),p=new Float32Array(72),d=new Float32Array(36),f=0;f<6;f++){var m=f%3*2/3-1,g=f>2?0:-1,v=[m,g,0,m+2/3,g,0,m+2/3,g+1,0,m,g,0,m+2/3,g+1,0,m,g+1,0];h.set(v,18*f),p.set(u,12*f);var y=[f,f,f,f,f,f];d.set(y,6*f)}var x=new dt;x.setAttribute("position",new Ye(h,3)),x.setAttribute("uv",new Ye(p,2)),x.setAttribute("faceIndex",new Ye(d,1)),e.push(x),r>4&&r--}return{_lodPlanes:e,_sizeLods:t,_sigmas:n}}(),Ul=null,jl=null,Hl=null,Gl=(1+Math.sqrt(5))/2,Vl=1/Gl,Wl=[new w(1,1,1),new w(-1,1,1),new w(1,1,-1),new w(-1,1,-1),new w(0,Gl,Vl),new w(0,Gl,-Vl),new w(Vl,0,Gl),new w(-Vl,0,Gl),new w(Gl,Vl,0),new w(-Gl,Vl,0)];function ql(e){jl=e,Zl(Nl)}function Xl(e){var t={magFilter:1003,minFilter:1003,generateMipmaps:!1,type:e?e.type:1009,format:e?e.format:1023,encoding:e?e.encoding:3002,depthBuffer:!1,stencilBuffer:!1},n=Jl(t);return n.depthBuffer=!e,Ul=Jl(t),n}function Yl(e){Ul.dispose(),jl.setRenderTarget(Hl),e.scissorTest=!1,e.setSize(e.width,e.height)}function Zl(e){var t=new Z;t.add(new Ct(kl[0],e)),jl.compile(t,Dl)}function Jl(e){var t=new v(3*Pl,3*Pl,e);return t.texture.mapping=306,t.texture.name="PMREM.cubeUv",t.scissorTest=!0,t}function Ql(e,t,n,r,i){e.viewport.set(t,n,r,i),e.scissor.set(t,n,r,i)}function Kl(e){var t=jl.autoClear;jl.autoClear=!1;for(var n=1;n<Cl;n++){$l(e,n-1,n,Math.sqrt(Bl[n]*Bl[n]-Bl[n-1]*Bl[n-1]),Wl[(n-1)%Wl.length])}jl.autoClear=t}function $l(e,t,n,r,i){eu(e,Ul,t,n,r,"latitudinal",i),eu(Ul,e,n,n,r,"longitudinal",i)}function eu(e,t,n,r,i,a,o){"latitudinal"!==a&&"longitudinal"!==a&&console.error("blur direction must be either latitudinal or longitudinal!");var s=new Z;s.add(new Ct(kl[r],Nl));var c=Nl.uniforms,l=Fl[n]-1,u=isFinite(i)?Math.PI/(2*l):2*Math.PI/39,h=i/u,p=isFinite(i)?1+Math.floor(3*h):20;p>20&&console.warn(`sigmaRadians, ${i}, is too large and will clip, as it requested ${p} samples when the maximum is set to 20`);for(var d=[],f=0,m=0;m<20;++m){var g=m/h,v=Math.exp(-g*g/2);d.push(v),0==m?f+=v:m<p&&(f+=2*v)}for(m=0;m<d.length;m++)d[m]=d[m]/f;c.envMap.value=e.texture,c.samples.value=p,c.weights.value=d,c.latitudinal.value="latitudinal"===a,o&&(c.poleAxis.value=o),c.dTheta.value=u,c.mipInt.value=8-n,c.inputEncoding.value=Ol[e.texture.encoding],c.outputEncoding.value=Ol[e.texture.encoding];var y=Fl[r];Ql(t,g=3*Math.max(0,Pl-2*y),(0===r?0:2*Pl)+2*y*(r>4?r-8+4:0),3*y,2*y),jl.setRenderTarget(t),jl.render(s,Dl)}function tu(){var e=new bo({uniforms:{envMap:{value:null},texelSize:{value:new h(1,1)},inputEncoding:{value:Ol[3e3]},outputEncoding:{value:Ol[3e3]}},vertexShader:ru(),fragmentShader:`\nprecision mediump float;\nprecision mediump int;\nvarying vec3 vOutputDirection;\nuniform sampler2D envMap;\nuniform vec2 texelSize;\n\n${iu()}\n\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n\nvoid main() {\n\tgl_FragColor = vec4(0.0);\n\tvec3 outputDirection = normalize(vOutputDirection);\n\tvec2 uv;\n\tuv.y = asin(clamp(outputDirection.y, -1.0, 1.0)) * RECIPROCAL_PI + 0.5;\n\tuv.x = atan(outputDirection.z, outputDirection.x) * RECIPROCAL_PI2 + 0.5;\n\tvec2 f = fract(uv / texelSize - 0.5);\n\tuv -= f * texelSize;\n\tvec3 tl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n\tuv.x += texelSize.x;\n\tvec3 tr = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n\tuv.y += texelSize.y;\n\tvec3 br = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n\tuv.x -= texelSize.x;\n\tvec3 bl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n\tvec3 tm = mix(tl, tr, f.x);\n\tvec3 bm = mix(bl, br, f.x);\n\tgl_FragColor.rgb = mix(tm, bm, f.y);\n\tgl_FragColor = linearToOutputTexel(gl_FragColor);\n}\n\t\t`,blending:0,depthTest:!1,depthWrite:!1});return e.type="EquirectangularToCubeUV",e}function nu(){var e=new bo({uniforms:{envMap:{value:null},inputEncoding:{value:Ol[3e3]},outputEncoding:{value:Ol[3e3]}},vertexShader:ru(),fragmentShader:`\nprecision mediump float;\nprecision mediump int;\nvarying vec3 vOutputDirection;\nuniform samplerCube envMap;\n\n${iu()}\n\nvoid main() {\n\tgl_FragColor = vec4(0.0);\n\tgl_FragColor.rgb = envMapTexelToLinear(textureCube(envMap, vec3( - vOutputDirection.x, vOutputDirection.yz ))).rgb;\n\tgl_FragColor = linearToOutputTexel(gl_FragColor);\n}\n\t\t`,blending:0,depthTest:!1,depthWrite:!1});return e.type="CubemapToCubeUV",e}function ru(){return"\nprecision mediump float;\nprecision mediump int;\nattribute vec3 position;\nattribute vec2 uv;\nattribute float faceIndex;\nvarying vec3 vOutputDirection;\nvec3 getDirection(vec2 uv, float face) {\n\tuv = 2.0 * uv - 1.0;\n\tvec3 direction = vec3(uv, 1.0);\n\tif (face == 0.0) {\n\t\tdirection = direction.zyx;\n\t\tdirection.z *= -1.0;\n\t} else if (face == 1.0) {\n\t\tdirection = direction.xzy;\n\t\tdirection.z *= -1.0;\n\t} else if (face == 3.0) {\n\t\tdirection = direction.zyx;\n\t\tdirection.x *= -1.0;\n\t} else if (face == 4.0) {\n\t\tdirection = direction.xzy;\n\t\tdirection.y *= -1.0;\n\t} else if (face == 5.0) {\n\t\tdirection.xz *= -1.0;\n\t}\n\treturn direction;\n}\nvoid main() {\n\tvOutputDirection = getDirection(uv, faceIndex);\n\tgl_Position = vec4( position, 1.0 );\n}\n\t"}function iu(){return"\nuniform int inputEncoding;\nuniform int outputEncoding;\n\n#include <encodings_pars_fragment>\n\nvec4 inputTexelToLinear(vec4 value){\n\tif(inputEncoding == 0){\n\t\treturn value;\n\t}else if(inputEncoding == 1){\n\t\treturn sRGBToLinear(value);\n\t}else if(inputEncoding == 2){\n\t\treturn RGBEToLinear(value);\n\t}else if(inputEncoding == 3){\n\t\treturn RGBMToLinear(value, 7.0);\n\t}else if(inputEncoding == 4){\n\t\treturn RGBMToLinear(value, 16.0);\n\t}else if(inputEncoding == 5){\n\t\treturn RGBDToLinear(value, 256.0);\n\t}else{\n\t\treturn GammaToLinear(value, 2.2);\n\t}\n}\n\nvec4 linearToOutputTexel(vec4 value){\n\tif(outputEncoding == 0){\n\t\treturn value;\n\t}else if(outputEncoding == 1){\n\t\treturn LinearTosRGB(value);\n\t}else if(outputEncoding == 2){\n\t\treturn LinearToRGBE(value);\n\t}else if(outputEncoding == 3){\n\t\treturn LinearToRGBM(value, 7.0);\n\t}else if(outputEncoding == 4){\n\t\treturn LinearToRGBM(value, 16.0);\n\t}else if(outputEncoding == 5){\n\t\treturn LinearToRGBD(value, 256.0);\n\t}else{\n\t\treturn LinearToGamma(value, 2.2);\n\t}\n}\n\nvec4 envMapTexelToLinear(vec4 color) {\n\treturn inputTexelToLinear(color);\n}\n\t"}ql.prototype={constructor:ql,fromScene:function(e,t=0,n=.1,r=100){Hl=jl.getRenderTarget();var i=Xl();return function(e,t,n,r){var i=new qt(90,1,t,n),a=[1,1,1,1,-1,1],o=[1,1,-1,-1,-1,1],s=jl.outputEncoding,c=jl.toneMapping,l=jl.toneMappingExposure,u=jl.getClearColor(),h=jl.getClearAlpha();jl.toneMapping=1,jl.toneMappingExposure=1,jl.outputEncoding=3e3,e.scale.z*=-1;var p=e.background;if(p&&p.isColor){p.convertSRGBToLinear();var d=Math.max(p.r,p.g,p.b),f=Math.min(Math.max(Math.ceil(Math.log2(d)),-128),127);p=p.multiplyScalar(Math.pow(2,-f));var m=(f+128)/255;jl.setClearColor(p,m),e.background=null}for(var g=0;g<6;g++){var v=g%3;0==v?(i.up.set(0,a[g],0),i.lookAt(o[g],0,0)):1==v?(i.up.set(0,0,a[g]),i.lookAt(0,o[g],0)):(i.up.set(0,a[g],0),i.lookAt(0,0,o[g])),Ql(r,v*Pl,g>2?Pl:0,Pl,Pl),jl.setRenderTarget(r),jl.render(e,i)}jl.toneMapping=c,jl.toneMappingExposure=l,jl.outputEncoding=s,jl.setClearColor(u,h),e.scale.z*=-1}(e,n,r,i),t>0&&$l(i,0,0,t),Kl(i),Yl(i),i},fromEquirectangular:function(e){return e.magFilter=1003,e.minFilter=1003,e.generateMipmaps=!1,this.fromCubemap(e)},fromCubemap:function(e){Hl=jl.getRenderTarget();var t=Xl(e);return function(e,t){var n=new Z;e.isCubeTexture?null==zl&&(zl=nu()):null==Il&&(Il=tu());var r=e.isCubeTexture?zl:Il;n.add(new Ct(kl[0],r));var i=r.uniforms;i.envMap.value=e,e.isCubeTexture||i.texelSize.value.set(1/e.image.width,1/e.image.height);i.inputEncoding.value=Ol[e.encoding],i.outputEncoding.value=Ol[e.encoding],Ql(t,0,0,3*Pl,2*Pl),jl.setRenderTarget(t),jl.render(n,Dl)}(e,t),Kl(t),Yl(t),t},compileCubemapShader:function(){null==zl&&Zl(zl=nu())},compileEquirectangularShader:function(){null==Il&&Zl(Il=tu())},dispose:function(){Nl.dispose(),null!=zl&&zl.dispose(),null!=Il&&Il.dispose();for(var e=0;e<kl.length;e++)kl[e].dispose()}};function au(e){console.warn("THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead."),hs.call(this,e),this.type="catmullrom",this.closed=!0}function ou(e){console.warn("THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead."),hs.call(this,e),this.type="catmullrom"}function su(e){console.warn("THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead."),hs.call(this,e),this.type="catmullrom"}rs.create=function(e,t){return console.log("THREE.Curve.create() has been deprecated"),e.prototype=Object.create(rs.prototype),e.prototype.constructor=e,e.prototype.getPoint=t,e},Object.assign(Ms.prototype,{createPointsGeometry:function(e){console.warn("THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");var t=this.getPoints(e);return this.createGeometry(t)},createSpacedPointsGeometry:function(e){console.warn("THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");var t=this.getSpacedPoints(e);return this.createGeometry(t)},createGeometry:function(e){console.warn("THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");for(var t=new Ft,n=0,r=e.length;n<r;n++){var i=e[n];t.vertices.push(new w(i.x,i.y,i.z||0))}return t}}),Object.assign(Ss.prototype,{fromPoints:function(e){return console.warn("THREE.Path: .fromPoints() has been renamed to .setFromPoints()."),this.setFromPoints(e)}}),au.prototype=Object.create(hs.prototype),ou.prototype=Object.create(hs.prototype),su.prototype=Object.create(hs.prototype),Object.assign(su.prototype,{initFromArray:function(){console.error("THREE.Spline: .initFromArray() has been removed.")},getControlPointsArray:function(){console.error("THREE.Spline: .getControlPointsArray() has been removed.")},reparametrizeByArcLength:function(){console.error("THREE.Spline: .reparametrizeByArcLength() has been removed.")}}),ol.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")},el.prototype.update=function(){console.error("THREE.SkeletonHelper: update() no longer needs to be called.")},Object.assign(Yo.prototype,{extractUrlBase:function(e){return console.warn("THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead."),Bs.extractUrlBase(e)}}),Yo.Handlers={add:function(){console.error("THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.")},get:function(){console.error("THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.")}},Object.assign(Vs.prototype,{setTexturePath:function(e){return console.warn("THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath()."),this.setResourcePath(e)}}),Object.assign(Vc.prototype,{center:function(e){return console.warn("THREE.Box2: .center() has been renamed to .getCenter()."),this.getCenter(e)},empty:function(){return console.warn("THREE.Box2: .empty() has been renamed to .isEmpty()."),this.isEmpty()},isIntersectionBox:function(e){return console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(e)},size:function(e){return console.warn("THREE.Box2: .size() has been renamed to .getSize()."),this.getSize(e)}}),Object.assign(le.prototype,{center:function(e){return console.warn("THREE.Box3: .center() has been renamed to .getCenter()."),this.getCenter(e)},empty:function(){return console.warn("THREE.Box3: .empty() has been renamed to .isEmpty()."),this.isEmpty()},isIntersectionBox:function(e){return console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(e)},isIntersectionSphere:function(e){return console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(e)},size:function(e){return console.warn("THREE.Box3: .size() has been renamed to .getSize()."),this.getSize(e)}}),Kt.prototype.setFromMatrix=function(e){return console.warn("THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix()."),this.setFromProjectionMatrix(e)},Xc.prototype.center=function(e){return console.warn("THREE.Line3: .center() has been renamed to .getCenter()."),this.getCenter(e)},Object.assign(u,{random16:function(){return console.warn("THREE.Math: .random16() has been deprecated. Use Math.random() instead."),Math.random()},nearestPowerOfTwo:function(e){return console.warn("THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo()."),u.floorPowerOfTwo(e)},nextPowerOfTwo:function(e){return console.warn("THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo()."),u.ceilPowerOfTwo(e)}}),Object.assign(p.prototype,{flattenToArrayOffset:function(e,t){return console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(e,t)},multiplyVector3:function(e){return console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead."),e.applyMatrix3(this)},multiplyVector3Array:function(){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")},applyToBufferAttribute:function(e){return console.warn("THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead."),e.applyMatrix3(this)},applyToVector3Array:function(){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")}}),Object.assign(R.prototype,{extractPosition:function(e){return console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."),this.copyPosition(e)},flattenToArrayOffset:function(e,t){return console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(e,t)},getPosition:function(){return console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead."),(new w).setFromMatrixColumn(this,3)},setRotationFromQuaternion:function(e){return console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."),this.makeRotationFromQuaternion(e)},multiplyToArray:function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},multiplyVector3:function(e){return console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead."),e.applyMatrix4(this)},multiplyVector4:function(e){return console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead."),e.applyMatrix4(this)},multiplyVector3Array:function(){console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")},rotateAxis:function(e){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead."),e.transformDirection(this)},crossVector:function(e){return console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead."),e.applyMatrix4(this)},translate:function(){console.error("THREE.Matrix4: .translate() has been removed.")},rotateX:function(){console.error("THREE.Matrix4: .rotateX() has been removed.")},rotateY:function(){console.error("THREE.Matrix4: .rotateY() has been removed.")},rotateZ:function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")},rotateByAxis:function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},applyToBufferAttribute:function(e){return console.warn("THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead."),e.applyMatrix4(this)},applyToVector3Array:function(){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")},makeFrustum:function(e,t,n,r,i,a){return console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead."),this.makePerspective(e,t,r,n,i,a)}}),Se.prototype.isIntersectionLine=function(e){return console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine()."),this.intersectsLine(e)},x.prototype.multiplyVector3=function(e){return console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."),e.applyQuaternion(this)},Object.assign(be.prototype,{isIntersectionBox:function(e){return console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(e)},isIntersectionPlane:function(e){return console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane()."),this.intersectsPlane(e)},isIntersectionSphere:function(e){return console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(e)}}),Object.assign(Ie.prototype,{area:function(){return console.warn("THREE.Triangle: .area() has been renamed to .getArea()."),this.getArea()},barycoordFromPoint:function(e,t){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),this.getBarycoord(e,t)},midpoint:function(e){return console.warn("THREE.Triangle: .midpoint() has been renamed to .getMidpoint()."),this.getMidpoint(e)},normal:function(e){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),this.getNormal(e)},plane:function(e){return console.warn("THREE.Triangle: .plane() has been renamed to .getPlane()."),this.getPlane(e)}}),Object.assign(Ie,{barycoordFromPoint:function(e,t,n,r,i){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),Ie.getBarycoord(e,t,n,r,i)},normal:function(e,t,n,r){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),Ie.getNormal(e,t,n,r)}}),Object.assign(Es.prototype,{extractAllPoints:function(e){return console.warn("THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead."),this.extractPoints(e)},extrude:function(e){return console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead."),new Za(this,e)},makeGeometry:function(e){return console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead."),new so(this,e)}}),Object.assign(h.prototype,{fromAttribute:function(e,t,n){return console.warn("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(e,t,n)},distanceToManhattan:function(e){return console.warn("THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(e)},lengthManhattan:function(){return console.warn("THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()}}),Object.assign(w.prototype,{setEulerFromRotationMatrix:function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},getPositionFromMatrix:function(e){return console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition()."),this.setFromMatrixPosition(e)},getScaleFromMatrix:function(e){return console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."),this.setFromMatrixScale(e)},getColumnFromMatrix:function(e,t){return console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn()."),this.setFromMatrixColumn(t,e)},applyProjection:function(e){return console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead."),this.applyMatrix4(e)},fromAttribute:function(e,t,n){return console.warn("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(e,t,n)},distanceToManhattan:function(e){return console.warn("THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(e)},lengthManhattan:function(){return console.warn("THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()}}),Object.assign(g.prototype,{fromAttribute:function(e,t,n){return console.warn("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(e,t,n)},lengthManhattan:function(){return console.warn("THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()}}),Object.assign(Ft.prototype,{computeTangents:function(){console.error("THREE.Geometry: .computeTangents() has been removed.")},computeLineDistances:function(){console.error("THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.")},applyMatrix:function(e){return console.warn("THREE.Geometry: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(e)}}),Object.assign(Y.prototype,{getChildByName:function(e){return console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName()."),this.getObjectByName(e)},renderDepth:function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},translate:function(e,t){return console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead."),this.translateOnAxis(t,e)},getWorldRotation:function(){console.error("THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.")},applyMatrix:function(e){return console.warn("THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(e)}}),Object.defineProperties(Y.prototype,{eulerOrder:{get:function(){return console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order},set:function(e){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order=e}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}}),Object.assign(Ct.prototype,{setDrawMode:function(){console.error("THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")}}),Object.defineProperties(Ct.prototype,{drawMode:{get:function(){return console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode."),0},set:function(){console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")}}}),Object.defineProperties(Ti.prototype,{objects:{get:function(){return console.warn("THREE.LOD: .objects has been renamed to .levels."),this.levels}}}),Object.defineProperty(Ri.prototype,"useVertexTexture",{get:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")},set:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")}}),Ai.prototype.initBones=function(){console.error("THREE.SkinnedMesh: initBones() has been removed.")},Object.defineProperty(rs.prototype,"__arcLengthDivisions",{get:function(){return console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions."),this.arcLengthDivisions},set:function(e){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions."),this.arcLengthDivisions=e}}),qt.prototype.setLens=function(e,t){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup."),void 0!==t&&(this.filmGauge=t),this.setFocalLength(e)},Object.defineProperties(Ts.prototype,{onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(e){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov."),this.shadow.camera.fov=e}},shadowCameraLeft:{set:function(e){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left."),this.shadow.camera.left=e}},shadowCameraRight:{set:function(e){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right."),this.shadow.camera.right=e}},shadowCameraTop:{set:function(e){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top."),this.shadow.camera.top=e}},shadowCameraBottom:{set:function(e){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom."),this.shadow.camera.bottom=e}},shadowCameraNear:{set:function(e){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near."),this.shadow.camera.near=e}},shadowCameraFar:{set:function(e){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far."),this.shadow.camera.far=e}},shadowCameraVisible:{set:function(){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(e){console.warn("THREE.Light: .shadowBias is now .shadow.bias."),this.shadow.bias=e}},shadowDarkness:{set:function(){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(e){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width."),this.shadow.mapSize.width=e}},shadowMapHeight:{set:function(e){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height."),this.shadow.mapSize.height=e}}}),Object.defineProperties(Ye.prototype,{length:{get:function(){return console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead."),this.array.length}},dynamic:{get:function(){return console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."),35048===this.usage},set:function(){console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."),this.setUsage(35048)}}}),Object.assign(Ye.prototype,{setDynamic:function(e){return console.warn("THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead."),this.setUsage(!0===e?35048:35044),this},copyIndicesArray:function(){console.error("THREE.BufferAttribute: .copyIndicesArray() has been removed.")},setArray:function(){console.error("THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")}}),Object.assign(dt.prototype,{addIndex:function(e){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex()."),this.setIndex(e)},addAttribute:function(e,t){return console.warn("THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute()."),t&&t.isBufferAttribute||t&&t.isInterleavedBufferAttribute?"index"===e?(console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(t),this):this.setAttribute(e,t):(console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.setAttribute(e,new Ye(arguments[1],arguments[2])))},addDrawCall:function(e,t,n){void 0!==n&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset."),console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup()."),this.addGroup(e,t)},clearDrawCalls:function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups()."),this.clearGroups()},computeTangents:function(){console.warn("THREE.BufferGeometry: .computeTangents() has been removed.")},computeOffsets:function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")},removeAttribute:function(e){return console.warn("THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute()."),this.deleteAttribute(e)},applyMatrix:function(e){return console.warn("THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(e)}}),Object.defineProperties(dt.prototype,{drawcalls:{get:function(){return console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups."),this.groups}},offsets:{get:function(){return console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups."),this.groups}}}),Object.defineProperties(Fc.prototype,{linePrecision:{get:function(){return console.warn("THREE.Raycaster: .linePrecision has been deprecated. Use .params.Line.threshold instead."),this.params.Line.threshold},set:function(e){console.warn("THREE.Raycaster: .linePrecision has been deprecated. Use .params.Line.threshold instead."),this.params.Line.threshold=e}}}),Object.defineProperties(ai.prototype,{dynamic:{get:function(){return console.warn("THREE.InterleavedBuffer: .length has been deprecated. Use .usage instead."),35048===this.usage},set:function(e){console.warn("THREE.InterleavedBuffer: .length has been deprecated. Use .usage instead."),this.setUsage(e)}}}),Object.assign(ai.prototype,{setDynamic:function(e){return console.warn("THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead."),this.setUsage(!0===e?35048:35044),this},setArray:function(){console.error("THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")}}),Object.assign(Ja.prototype,{getArrays:function(){console.error("THREE.ExtrudeBufferGeometry: .getArrays() has been removed.")},addShapeList:function(){console.error("THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.")},addShape:function(){console.error("THREE.ExtrudeBufferGeometry: .addShape() has been removed.")}}),Object.defineProperties(zc.prototype,{dynamic:{set:function(){console.warn("THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.")}},onUpdate:{value:function(){return console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead."),this}}}),Object.defineProperties(We.prototype,{wrapAround:{get:function(){console.warn("THREE.Material: .wrapAround has been removed.")},set:function(){console.warn("THREE.Material: .wrapAround has been removed.")}},overdraw:{get:function(){console.warn("THREE.Material: .overdraw has been removed.")},set:function(){console.warn("THREE.Material: .overdraw has been removed.")}},wrapRGB:{get:function(){return console.warn("THREE.Material: .wrapRGB has been removed."),new Be}},shading:{get:function(){console.error("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead.")},set:function(e){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===e}},stencilMask:{get:function(){return console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead."),this.stencilFuncMask},set:function(e){console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead."),this.stencilFuncMask=e}}}),Object.defineProperties(Mo.prototype,{metal:{get:function(){return console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead."),!1},set:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead")}}}),Object.defineProperties(Vt.prototype,{derivatives:{get:function(){return console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives},set:function(e){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives=e}}}),Object.assign(ni.prototype,{clearTarget:function(e,t,n,r){console.warn("THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead."),this.setRenderTarget(e),this.clear(t,n,r)},animate:function(e){console.warn("THREE.WebGLRenderer: .animate() is now .setAnimationLoop()."),this.setAnimationLoop(e)},getCurrentRenderTarget:function(){return console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget()."),this.getRenderTarget()},getMaxAnisotropy:function(){return console.warn("THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy()."),this.capabilities.getMaxAnisotropy()},getPrecision:function(){return console.warn("THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision."),this.capabilities.precision},resetGLState:function(){return console.warn("THREE.WebGLRenderer: .resetGLState() is now .state.reset()."),this.state.reset()},supportsFloatTextures:function(){return console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' )."),this.extensions.get("OES_texture_float")},supportsHalfFloatTextures:function(){return console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' )."),this.extensions.get("OES_texture_half_float")},supportsStandardDerivatives:function(){return console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' )."),this.extensions.get("OES_standard_derivatives")},supportsCompressedTextureS3TC:function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' )."),this.extensions.get("WEBGL_compressed_texture_s3tc")},supportsCompressedTexturePVRTC:function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' )."),this.extensions.get("WEBGL_compressed_texture_pvrtc")},supportsBlendMinMax:function(){return console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' )."),this.extensions.get("EXT_blend_minmax")},supportsVertexTextures:function(){return console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures."),this.capabilities.vertexTextures},supportsInstancedArrays:function(){return console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' )."),this.extensions.get("ANGLE_instanced_arrays")},enableScissorTest:function(e){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest()."),this.setScissorTest(e)},initMaterial:function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},addPrePlugin:function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},addPostPlugin:function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},updateShadowMap:function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")},setFaceCulling:function(){console.warn("THREE.WebGLRenderer: .setFaceCulling() has been removed.")},allocTextureUnit:function(){console.warn("THREE.WebGLRenderer: .allocTextureUnit() has been removed.")},setTexture:function(){console.warn("THREE.WebGLRenderer: .setTexture() has been removed.")},setTexture2D:function(){console.warn("THREE.WebGLRenderer: .setTexture2D() has been removed.")},setTextureCube:function(){console.warn("THREE.WebGLRenderer: .setTextureCube() has been removed.")},getActiveMipMapLevel:function(){return console.warn("THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel()."),this.getActiveMipmapLevel()}}),Object.defineProperties(ni.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(e){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled."),this.shadowMap.enabled=e}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(e){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type."),this.shadowMap.type=e}},shadowMapCullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")}},context:{get:function(){return console.warn("THREE.WebGLRenderer: .context has been removed. Use .getContext() instead."),this.getContext()}},vr:{get:function(){return console.warn("THREE.WebGLRenderer: .vr has been renamed to .xr"),this.xr}},gammaInput:{get:function(){return console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead."),!1},set:function(){console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.")}},gammaOutput:{get:function(){return console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead."),!1},set:function(e){console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead."),this.outputEncoding=!0===e?3001:3e3}}}),Object.defineProperties(Zr.prototype,{cullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")}},renderReverseSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")}},renderSingleSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")}}}),Object.defineProperties(v.prototype,{wrapS:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS},set:function(e){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS=e}},wrapT:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT},set:function(e){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT=e}},magFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter},set:function(e){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter=e}},minFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter},set:function(e){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter=e}},anisotropy:{get:function(){return console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy},set:function(e){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy=e}},offset:{get:function(){return console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset},set:function(e){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset=e}},repeat:{get:function(){return console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat},set:function(e){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat=e}},format:{get:function(){return console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format},set:function(e){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format=e}},type:{get:function(){return console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type},set:function(e){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type=e}},generateMipmaps:{get:function(){return console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps},set:function(e){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps=e}}}),Object.defineProperties(mc.prototype,{load:{value:function(e){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");var t=this;return(new tc).load(e,(function(e){t.setBuffer(e)})),this}},startTime:{set:function(){console.warn("THREE.Audio: .startTime is now .play( delay ).")}}}),_c.prototype.getData=function(){return console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData()."),this.getFrequencyData()},Xt.prototype.updateCubeMap=function(e,t){return console.warn("THREE.CubeCamera: .updateCubeMap() is now .update()."),this.update(e,t)};var cu={merge:function(e,t,n){var r;console.warn("THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead."),t.isMesh&&(t.matrixAutoUpdate&&t.updateMatrix(),r=t.matrix,t=t.geometry),e.merge(t,r,n)},center:function(e){return console.warn("THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead."),e.center()}};d.crossOrigin=void 0,d.loadTexture=function(e,t,n,r){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");var i=new ns;i.setCrossOrigin(this.crossOrigin);var a=i.load(e,n,void 0,r);return t&&(a.mapping=t),a},d.loadTextureCube=function(e,t,n,r){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");var i=new ts;i.setCrossOrigin(this.crossOrigin);var a=i.load(e,n,void 0,r);return t&&(a.mapping=t),a},d.loadCompressedTexture=function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")},d.loadCompressedTextureCube=function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")};var lu={createMultiMaterialObject:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")},detach:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")},attach:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")}};"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:"115"}}));var uu=Object.freeze({__proto__:null,ACESFilmicToneMapping:5,AddEquation:100,AddOperation:2,AdditiveBlending:2,AlphaFormat:1021,AlwaysDepth:1,AlwaysStencilFunc:519,AmbientLight:zs,AmbientLightProbe:ac,AnimationClip:Go,AnimationLoader:Qo,AnimationMixer:Ic,AnimationObjectGroup:Dc,AnimationUtils:Ro,ArcCurve:as,ArrayCamera:$r,ArrowHelper:Ml,Audio:mc,AudioAnalyser:_c,AudioContext:ec,AudioListener:fc,AudioLoader:tc,AxesHelper:Sl,AxisHelper:function(e){return console.warn("THREE.AxisHelper has been renamed to THREE.AxesHelper."),new Sl(e)},BackSide:1,BasicDepthPacking:3200,BasicShadowMap:0,BinaryTextureLoader:function(e){return console.warn("THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader."),new $o(e)},Bone:Ci,BooleanKeyframeTrack:zo,BoundingBoxHelper:function(e,t){return console.warn("THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead."),new vl(e,t)},Box2:Vc,Box3:le,Box3Helper:yl,BoxBufferGeometry:Ut,BoxGeometry:Bt,BoxHelper:vl,BufferAttribute:Ye,BufferGeometry:dt,BufferGeometryLoader:Hs,ByteType:1010,Cache:Wo,Camera:Wt,CameraHelper:fl,CanvasRenderer:function(){console.error("THREE.CanvasRenderer has been removed")},CanvasTexture:ra,CatmullRomCurve3:hs,CineonToneMapping:4,CircleBufferGeometry:vo,CircleGeometry:go,ClampToEdgeWrapping:1001,Clock:lc,ClosedSplineCurve3:au,Color:Be,ColorKeyframeTrack:ko,CompressedTexture:na,CompressedTextureLoader:Ko,ConeBufferGeometry:mo,ConeGeometry:fo,CubeCamera:Xt,CubeGeometry:Bt,CubeReflectionMapping:301,CubeRefractionMapping:302,CubeTexture:yn,CubeTextureLoader:ts,CubeUVReflectionMapping:306,CubeUVRefractionMapping:307,CubicBezierCurve:ms,CubicBezierCurve3:gs,CubicInterpolant:Oo,CullFaceBack:1,CullFaceFront:2,CullFaceFrontBack:3,CullFaceNone:0,Curve:rs,CurvePath:Ms,CustomBlending:5,CylinderBufferGeometry:po,CylinderGeometry:ho,Cylindrical:Hc,DataTexture:Zt,DataTexture2DArray:xn,DataTexture3D:bn,DataTextureLoader:$o,DecrementStencilOp:7683,DecrementWrapStencilOp:34056,DefaultLoadingManager:Xo,DepthFormat:1026,DepthStencilFormat:1027,DepthTexture:ia,DirectionalLight:Is,DirectionalLightHelper:hl,DirectionalLightShadow:Ns,DiscreteInterpolant:No,DodecahedronBufferGeometry:va,DodecahedronGeometry:ga,DoubleSide:2,DstAlphaFactor:206,DstColorFactor:208,DynamicBufferAttribute:function(e,t){return console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setUsage( THREE.DynamicDrawUsage ) instead."),new Ye(e,t).setUsage(35048)},DynamicCopyUsage:35050,DynamicDrawUsage:35048,DynamicReadUsage:35049,EdgesGeometry:uo,EdgesHelper:function(e,t){return console.warn("THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead."),new qi(new uo(e.geometry),new ki({color:void 0!==t?t:16777215}))},EllipseCurve:is,EqualDepth:4,EqualStencilFunc:514,EquirectangularReflectionMapping:303,EquirectangularRefractionMapping:304,Euler:D,EventDispatcher:o,ExtrudeBufferGeometry:Ja,ExtrudeGeometry:Za,Face3:Ge,Face4:function(e,t,n,r,i,a,o){return console.warn("THREE.Face4 has been removed. A THREE.Face3 will be created instead."),new Ge(e,t,n,i,a,o)},FaceColors:1,FileLoader:Jo,FlatShading:1,Float32Attribute:function(e,t){return console.warn("THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead."),new nt(e,t)},Float32BufferAttribute:nt,Float64Attribute:function(e,t){return console.warn("THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead."),new rt(e,t)},Float64BufferAttribute:rt,FloatType:1015,Fog:ii,FogExp2:ri,Font:Qs,FontLoader:$s,FrontFaceDirectionCCW:1,FrontFaceDirectionCW:0,FrontSide:0,Frustum:Kt,GammaEncoding:3007,Geometry:Ft,GeometryUtils:cu,GreaterDepth:6,GreaterEqualDepth:5,GreaterEqualStencilFunc:518,GreaterStencilFunc:516,GridHelper:ol,Group:ei,HalfFloatType:1016,HemisphereLight:As,HemisphereLightHelper:al,HemisphereLightProbe:ic,IcosahedronBufferGeometry:ma,IcosahedronGeometry:fa,ImageBitmapLoader:Zs,ImageLoader:es,ImageUtils:d,ImmediateRenderObject:Yc,IncrementStencilOp:7682,IncrementWrapStencilOp:34055,InstancedBufferAttribute:js,InstancedBufferGeometry:Us,InstancedInterleavedBuffer:kc,InstancedMesh:zi,Int16Attribute:function(e,t){return console.warn("THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead."),new Ke(e,t)},Int16BufferAttribute:Ke,Int32Attribute:function(e,t){return console.warn("THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead."),new et(e,t)},Int32BufferAttribute:et,Int8Attribute:function(e,t){return console.warn("THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead."),new Ze(e,t)},Int8BufferAttribute:Ze,IntType:1013,InterleavedBuffer:ai,InterleavedBufferAttribute:ci,Interpolant:Co,InterpolateDiscrete:2300,InterpolateLinear:2301,InterpolateSmooth:2302,InvertStencilOp:5386,JSONLoader:function(){console.error("THREE.JSONLoader has been removed.")},KeepStencilOp:7680,KeyframeTrack:Io,LOD:Ti,LatheBufferGeometry:oo,LatheGeometry:ao,Layers:N,LensFlare:function(){console.error("THREE.LensFlare has been moved to /examples/jsm/objects/Lensflare.js")},LessDepth:2,LessEqualDepth:3,LessEqualStencilFunc:515,LessStencilFunc:513,Light:Ts,LightProbe:rc,LightShadow:Ls,Line:Gi,Line3:Xc,LineBasicMaterial:ki,LineCurve:vs,LineCurve3:ys,LineDashedMaterial:Lo,LineLoop:Xi,LinePieces:1,LineSegments:qi,LineStrip:0,LinearEncoding:3e3,LinearFilter:1006,LinearInterpolant:Do,LinearMipMapLinearFilter:1008,LinearMipMapNearestFilter:1007,LinearMipmapLinearFilter:1008,LinearMipmapNearestFilter:1007,LinearToneMapping:1,Loader:Yo,LoaderUtils:Bs,LoadingManager:qo,LogLuvEncoding:3003,LoopOnce:2200,LoopPingPong:2202,LoopRepeat:2201,LuminanceAlphaFormat:1025,LuminanceFormat:1024,MOUSE:a,Material:We,MaterialLoader:Fs,Math:u,MathUtils:u,Matrix3:p,Matrix4:R,MaxEquation:104,Mesh:Ct,MeshBasicMaterial:qe,MeshDepthMaterial:Xr,MeshDistanceMaterial:Yr,MeshFaceMaterial:function(e){return console.warn("THREE.MeshFaceMaterial has been removed. Use an Array instead."),e},MeshLambertMaterial:To,MeshMatcapMaterial:Ao,MeshNormalMaterial:Eo,MeshPhongMaterial:Mo,MeshPhysicalMaterial:wo,MeshStandardMaterial:_o,MeshToonMaterial:So,MinEquation:103,MirroredRepeatWrapping:1002,MixOperation:1,MultiMaterial:function(e){return void 0===e&&(e=[]),console.warn("THREE.MultiMaterial has been removed. Use an Array instead."),e.isMultiMaterial=!0,e.materials=e,e.clone=function(){return e.slice()},e},MultiplyBlending:4,MultiplyOperation:0,NearestFilter:1003,NearestMipMapLinearFilter:1005,NearestMipMapNearestFilter:1004,NearestMipmapLinearFilter:1005,NearestMipmapNearestFilter:1004,NeverDepth:0,NeverStencilFunc:512,NoBlending:0,NoColors:0,NoToneMapping:0,NormalBlending:1,NotEqualDepth:7,NotEqualStencilFunc:517,NumberKeyframeTrack:Fo,Object3D:Y,ObjectLoader:Vs,ObjectSpaceNormalMap:1,OctahedronBufferGeometry:da,OctahedronGeometry:pa,OneFactor:201,OneMinusDstAlphaFactor:207,OneMinusDstColorFactor:209,OneMinusSrcAlphaFactor:205,OneMinusSrcColorFactor:203,OrthographicCamera:Ds,PCFShadowMap:1,PCFSoftShadowMap:2,PMREMGenerator:ql,ParametricBufferGeometry:sa,ParametricGeometry:oa,Particle:function(e){return console.warn("THREE.Particle has been renamed to THREE.Sprite."),new wi(e)},ParticleBasicMaterial:function(e){return console.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial."),new Yi(e)},ParticleSystem:function(e,t){return console.warn("THREE.ParticleSystem has been renamed to THREE.Points."),new $i(e,t)},ParticleSystemMaterial:function(e){return console.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial."),new Yi(e)},Path:Ss,PerspectiveCamera:qt,Plane:Se,PlaneBufferGeometry:rn,PlaneGeometry:nn,PlaneHelper:xl,PointCloud:function(e,t){return console.warn("THREE.PointCloud has been renamed to THREE.Points."),new $i(e,t)},PointCloudMaterial:function(e){return console.warn("THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial."),new Yi(e)},PointLight:Os,PointLightHelper:tl,Points:$i,PointsMaterial:Yi,PolarGridHelper:sl,PolyhedronBufferGeometry:la,PolyhedronGeometry:ca,PositionalAudio:bc,PropertyBinding:Oc,PropertyMixer:wc,QuadraticBezierCurve:xs,QuadraticBezierCurve3:bs,Quaternion:x,QuaternionKeyframeTrack:Uo,QuaternionLinearInterpolant:Bo,REVISION:"115",RGBADepthPacking:3201,RGBAFormat:1023,RGBAIntegerFormat:1033,RGBA_ASTC_10x10_Format:37819,RGBA_ASTC_10x5_Format:37816,RGBA_ASTC_10x6_Format:37817,RGBA_ASTC_10x8_Format:37818,RGBA_ASTC_12x10_Format:37820,RGBA_ASTC_12x12_Format:37821,RGBA_ASTC_4x4_Format:37808,RGBA_ASTC_5x4_Format:37809,RGBA_ASTC_5x5_Format:37810,RGBA_ASTC_6x5_Format:37811,RGBA_ASTC_6x6_Format:37812,RGBA_ASTC_8x5_Format:37813,RGBA_ASTC_8x6_Format:37814,RGBA_ASTC_8x8_Format:37815,RGBA_BPTC_Format:36492,RGBA_ETC2_EAC_Format:37496,RGBA_PVRTC_2BPPV1_Format:35843,RGBA_PVRTC_4BPPV1_Format:35842,RGBA_S3TC_DXT1_Format:33777,RGBA_S3TC_DXT3_Format:33778,RGBA_S3TC_DXT5_Format:33779,RGBDEncoding:3006,RGBEEncoding:3002,RGBEFormat:1023,RGBFormat:1022,RGBIntegerFormat:1032,RGBM16Encoding:3005,RGBM7Encoding:3004,RGB_ETC1_Format:36196,RGB_ETC2_Format:37492,RGB_PVRTC_2BPPV1_Format:35841,RGB_PVRTC_4BPPV1_Format:35840,RGB_S3TC_DXT1_Format:33776,RGFormat:1030,RGIntegerFormat:1031,RawShaderMaterial:bo,Ray:be,Raycaster:Fc,RectAreaLight:ks,RedFormat:1028,RedIntegerFormat:1029,ReinhardToneMapping:2,RepeatWrapping:1e3,ReplaceStencilOp:7681,ReverseSubtractEquation:102,RingBufferGeometry:io,RingGeometry:ro,SRGB8_ALPHA8_ASTC_10x10_Format:37851,SRGB8_ALPHA8_ASTC_10x5_Format:37848,SRGB8_ALPHA8_ASTC_10x6_Format:37849,SRGB8_ALPHA8_ASTC_10x8_Format:37850,SRGB8_ALPHA8_ASTC_12x10_Format:37852,SRGB8_ALPHA8_ASTC_12x12_Format:37853,SRGB8_ALPHA8_ASTC_4x4_Format:37840,SRGB8_ALPHA8_ASTC_5x4_Format:37841,SRGB8_ALPHA8_ASTC_5x5_Format:37842,SRGB8_ALPHA8_ASTC_6x5_Format:37843,SRGB8_ALPHA8_ASTC_6x6_Format:37844,SRGB8_ALPHA8_ASTC_8x5_Format:37845,SRGB8_ALPHA8_ASTC_8x6_Format:37846,SRGB8_ALPHA8_ASTC_8x8_Format:37847,Scene:Z,SceneUtils:lu,ShaderChunk:an,ShaderLib:on,ShaderMaterial:Vt,ShadowMaterial:xo,Shape:Es,ShapeBufferGeometry:co,ShapeGeometry:so,ShapePath:Js,ShapeUtils:qa,ShortType:1011,Skeleton:Ri,SkeletonHelper:el,SkinnedMesh:Ai,SmoothShading:2,Sphere:pe,SphereBufferGeometry:no,SphereGeometry:to,Spherical:jc,SphericalHarmonics3:nc,SphericalReflectionMapping:305,Spline:su,SplineCurve:_s,SplineCurve3:ou,SpotLight:Rs,SpotLightHelper:Jc,SpotLightShadow:Ps,Sprite:wi,SpriteMaterial:li,SrcAlphaFactor:204,SrcAlphaSaturateFactor:210,SrcColorFactor:202,StaticCopyUsage:35046,StaticDrawUsage:35044,StaticReadUsage:35045,StereoCamera:cc,StreamCopyUsage:35042,StreamDrawUsage:35040,StreamReadUsage:35041,StringKeyframeTrack:jo,SubtractEquation:101,SubtractiveBlending:3,TOUCH:{ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},TangentSpaceNormalMap:0,TetrahedronBufferGeometry:ha,TetrahedronGeometry:ua,TextBufferGeometry:eo,TextGeometry:$a,Texture:m,TextureLoader:ns,TorusBufferGeometry:Ma,TorusGeometry:wa,TorusKnotBufferGeometry:_a,TorusKnotGeometry:ba,Triangle:Ie,TriangleFanDrawMode:2,TriangleStripDrawMode:1,TrianglesDrawMode:0,TubeBufferGeometry:xa,TubeGeometry:ya,UVMapping:300,Uint16Attribute:function(e,t){return console.warn("THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead."),new $e(e,t)},Uint16BufferAttribute:$e,Uint32Attribute:function(e,t){return console.warn("THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead."),new tt(e,t)},Uint32BufferAttribute:tt,Uint8Attribute:function(e,t){return console.warn("THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead."),new Je(e,t)},Uint8BufferAttribute:Je,Uint8ClampedAttribute:function(e,t){return console.warn("THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead."),new Qe(e,t)},Uint8ClampedBufferAttribute:Qe,Uncharted2ToneMapping:3,Uniform:zc,UniformsLib:$t,UniformsUtils:Gt,UnsignedByteType:1009,UnsignedInt248Type:1020,UnsignedIntType:1014,UnsignedShort4444Type:1017,UnsignedShort5551Type:1018,UnsignedShort565Type:1019,UnsignedShortType:1012,VSMShadowMap:3,Vector2:h,Vector3:w,Vector4:g,VectorKeyframeTrack:Ho,Vertex:function(e,t,n){return console.warn("THREE.Vertex has been removed. Use THREE.Vector3 instead."),new w(e,t,n)},VertexColors:2,VideoTexture:ta,WebGLCubeRenderTarget:Yt,WebGLMultisampleRenderTarget:y,WebGLRenderTarget:v,WebGLRenderTargetCube:function(e,t,n){return console.warn("THREE.WebGLRenderTargetCube( width, height, options ) is now WebGLCubeRenderTarget( size, options )."),new Yt(e,n)},WebGLRenderer:ni,WebGLUtils:Kr,WireframeGeometry:aa,WireframeHelper:function(e,t){return console.warn("THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead."),new qi(new aa(e.geometry),new ki({color:void 0!==t?t:16777215}))},WrapAroundEnding:2402,XHRLoader:function(e){return console.warn("THREE.XHRLoader has been renamed to THREE.FileLoader."),new Jo(e)},ZeroCurvatureEnding:2400,ZeroFactor:200,ZeroSlopeEnding:2401,ZeroStencilOp:0,sRGBEncoding:3001});function hu(e,t,n){if(e.isCamera){console.warn("THREE.DragControls: Constructor now expects ( objects, camera, domElement )");var r=e;e=t,t=r}var i=new Se,a=new Fc,o=new h,s=new w,c=new w,l=null,u=null,p=this;function d(){n.addEventListener("mousemove",m,!1),n.addEventListener("mousedown",g,!1),n.addEventListener("mouseup",v,!1),n.addEventListener("mouseleave",v,!1),n.addEventListener("touchmove",y,!1),n.addEventListener("touchstart",x,!1),n.addEventListener("touchend",b,!1)}function f(){n.removeEventListener("mousemove",m,!1),n.removeEventListener("mousedown",g,!1),n.removeEventListener("mouseup",v,!1),n.removeEventListener("mouseleave",v,!1),n.removeEventListener("touchmove",y,!1),n.removeEventListener("touchstart",x,!1),n.removeEventListener("touchend",b,!1)}function m(r){r.preventDefault();var h=n.getBoundingClientRect();if(o.x=(r.clientX-h.left)/h.width*2-1,o.y=-(r.clientY-h.top)/h.height*2+1,a.setFromCamera(o,t),l&&p.enabled)return a.ray.intersectPlane(i,c)&&l.position.copy(c.sub(s)),void p.dispatchEvent({type:"drag",object:l});a.setFromCamera(o,t);var d=a.intersectObjects(e);if(d.length>0){var f=d[0].object;i.setFromNormalAndCoplanarPoint(t.getWorldDirection(i.normal),f.position),u!==f&&(p.dispatchEvent({type:"hoveron",object:f}),n.style.cursor="pointer",u=f)}else null!==u&&(p.dispatchEvent({type:"hoveroff",object:u}),n.style.cursor="auto",u=null)}function g(r){r.preventDefault(),a.setFromCamera(o,t);var u=a.intersectObjects(e);u.length>0&&(l=u[0].object,a.ray.intersectPlane(i,c)&&s.copy(c).sub(l.position),n.style.cursor="move",p.dispatchEvent({type:"dragstart",object:l}))}function v(e){e.preventDefault(),l&&(p.dispatchEvent({type:"dragend",object:l}),l=null),n.style.cursor="auto"}function y(e){e.preventDefault(),e=e.changedTouches[0];var r=n.getBoundingClientRect();if(o.x=(e.clientX-r.left)/r.width*2-1,o.y=-(e.clientY-r.top)/r.height*2+1,a.setFromCamera(o,t),l&&p.enabled)return a.ray.intersectPlane(i,c)&&l.position.copy(c.sub(s)),void p.dispatchEvent({type:"drag",object:l})}function x(r){r.preventDefault(),r=r.changedTouches[0];var u=n.getBoundingClientRect();o.x=(r.clientX-u.left)/u.width*2-1,o.y=-(r.clientY-u.top)/u.height*2+1,a.setFromCamera(o,t);var h=a.intersectObjects(e);h.length>0&&(l=h[0].object,i.setFromNormalAndCoplanarPoint(t.getWorldDirection(i.normal),l.position),a.ray.intersectPlane(i,c)&&s.copy(c).sub(l.position),n.style.cursor="move",p.dispatchEvent({type:"dragstart",object:l}))}function b(e){e.preventDefault(),l&&(p.dispatchEvent({type:"dragend",object:l}),l=null),n.style.cursor="auto"}d(),this.enabled=!0,this.activate=d,this.deactivate=f,this.dispose=function(){f()},this.setObjects=function(){console.error("THREE.DragControls: setObjects() has been removed.")},this.on=function(e,t){console.warn("THREE.DragControls: on() has been deprecated. Use addEventListener() instead."),p.addEventListener(e,t)},this.off=function(e,t){console.warn("THREE.DragControls: off() has been deprecated. Use removeEventListener() instead."),p.removeEventListener(e,t)},this.notify=function(e){console.error("THREE.DragControls: notify() has been deprecated. Use dispatchEvent() instead."),p.dispatchEvent({type:e})}}function pu(e,t,n){var r;function i(){var i,a,o=r.length,s=0,c=0,l=0;for(i=0;i<o;++i)s+=(a=r[i]).x||0,c+=a.y||0,l+=a.z||0;for(s=s/o-e,c=c/o-t,l=l/o-n,i=0;i<o;++i)a=r[i],s&&(a.x-=s),c&&(a.y-=c),l&&(a.z-=l)}return null==e&&(e=0),null==t&&(t=0),null==n&&(n=0),i.initialize=function(e){r=e},i.x=function(t){return arguments.length?(e=+t,i):e},i.y=function(e){return arguments.length?(t=+e,i):t},i.z=function(e){return arguments.length?(n=+e,i):n},i}function du(e,t,n){if(isNaN(t))return e;var r,i,a,o,s,c,l=e._root,u={data:n},h=e._x0,p=e._x1;if(!l)return e._root=u,e;for(;l.length;)if((o=t>=(i=(h+p)/2))?h=i:p=i,r=l,!(l=l[s=+o]))return r[s]=u,e;if(t===(a=+e._x.call(null,l.data)))return u.next=l,r?r[s]=u:e._root=u,e;do{r=r?r[s]=new Array(2):e._root=new Array(2),(o=t>=(i=(h+p)/2))?h=i:p=i}while((s=+o)==(c=+(a>=i)));return r[c]=l,r[s]=u,e}function fu(e,t,n){this.node=e,this.x0=t,this.x1=n}function mu(e){return e[0]}function gu(e,t){var n=new vu(null==t?mu:t,NaN,NaN);return null==e?n:n.addAll(e)}function vu(e,t,n){this._x=e,this._x0=t,this._x1=n,this._root=void 0}function yu(e){for(var t={data:e.data},n=t;e=e.next;)n=n.next={data:e.data};return t}hu.prototype=Object.create(o.prototype),hu.prototype.constructor=hu;var xu=gu.prototype=vu.prototype;function bu(e,t,n,r){if(isNaN(t)||isNaN(n))return e;var i,a,o,s,c,l,u,h,p,d=e._root,f={data:r},m=e._x0,g=e._y0,v=e._x1,y=e._y1;if(!d)return e._root=f,e;for(;d.length;)if((l=t>=(a=(m+v)/2))?m=a:v=a,(u=n>=(o=(g+y)/2))?g=o:y=o,i=d,!(d=d[h=u<<1|l]))return i[h]=f,e;if(s=+e._x.call(null,d.data),c=+e._y.call(null,d.data),t===s&&n===c)return f.next=d,i?i[h]=f:e._root=f,e;do{i=i?i[h]=new Array(4):e._root=new Array(4),(l=t>=(a=(m+v)/2))?m=a:v=a,(u=n>=(o=(g+y)/2))?g=o:y=o}while((h=u<<1|l)==(p=(c>=o)<<1|s>=a));return i[p]=d,i[h]=f,e}function _u(e,t,n,r,i){this.node=e,this.x0=t,this.y0=n,this.x1=r,this.y1=i}function wu(e){return e[0]}function Mu(e){return e[1]}function Su(e,t,n){var r=new Eu(null==t?wu:t,null==n?Mu:n,NaN,NaN,NaN,NaN);return null==e?r:r.addAll(e)}function Eu(e,t,n,r,i,a){this._x=e,this._y=t,this._x0=n,this._y0=r,this._x1=i,this._y1=a,this._root=void 0}function Tu(e){for(var t={data:e.data},n=t;e=e.next;)n=n.next={data:e.data};return t}xu.copy=function(){var e,t,n=new vu(this._x,this._x0,this._x1),r=this._root;if(!r)return n;if(!r.length)return n._root=yu(r),n;for(e=[{source:r,target:n._root=new Array(2)}];r=e.pop();)for(var i=0;i<2;++i)(t=r.source[i])&&(t.length?e.push({source:t,target:r.target[i]=new Array(2)}):r.target[i]=yu(t));return n},xu.add=function(e){var t=+this._x.call(null,e);return du(this.cover(t),t,e)},xu.addAll=function(e){var t,n,r=e.length,i=new Array(r),a=1/0,o=-1/0;for(t=0;t<r;++t)isNaN(n=+this._x.call(null,e[t]))||(i[t]=n,n<a&&(a=n),n>o&&(o=n));for(o<a&&(a=this._x0,o=this._x1),this.cover(a).cover(o),t=0;t<r;++t)du(this,i[t],e[t]);return this},xu.cover=function(e){if(isNaN(e=+e))return this;var t=this._x0,n=this._x1;if(isNaN(t))n=(t=Math.floor(e))+1;else{if(!(t>e||e>n))return this;var r,i,a=n-t,o=this._root;switch(i=+(e<(t+n)/2)){case 0:do{(r=new Array(2))[i]=o,o=r}while(e>(n=t+(a*=2)));break;case 1:do{(r=new Array(2))[i]=o,o=r}while((t=n-(a*=2))>e)}this._root&&this._root.length&&(this._root=o)}return this._x0=t,this._x1=n,this},xu.data=function(){var e=[];return this.visit((function(t){if(!t.length)do{e.push(t.data)}while(t=t.next)})),e},xu.extent=function(e){return arguments.length?this.cover(+e[0][0]).cover(+e[1][0]):isNaN(this._x0)?void 0:[[this._x0],[this._x1]]},xu.find=function(e,t){var n,r,i,a,o,s=this._x0,c=this._x1,l=[],u=this._root;for(u&&l.push(new fu(u,s,c)),null==t?t=1/0:(s=e-t,c=e+t);a=l.pop();)if(!(!(u=a.node)||(r=a.x0)>c||(i=a.x1)<s))if(u.length){var h=(r+i)/2;l.push(new fu(u[1],h,i),new fu(u[0],r,h)),(o=+(e>=h))&&(a=l[l.length-1],l[l.length-1]=l[l.length-1-o],l[l.length-1-o]=a)}else{var p=Math.abs(e-+this._x.call(null,u.data));p<t&&(t=p,s=e-p,c=e+p,n=u.data)}return n},xu.remove=function(e){if(isNaN(a=+this._x.call(null,e)))return this;var t,n,r,i,a,o,s,c,l,u=this._root,h=this._x0,p=this._x1;if(!u)return this;if(u.length)for(;;){if((s=a>=(o=(h+p)/2))?h=o:p=o,t=u,!(u=u[c=+s]))return this;if(!u.length)break;t[c+1&1]&&(n=t,l=c)}for(;u.data!==e;)if(r=u,!(u=u.next))return this;return(i=u.next)&&delete u.next,r?(i?r.next=i:delete r.next,this):t?(i?t[c]=i:delete t[c],(u=t[0]||t[1])&&u===(t[1]||t[0])&&!u.length&&(n?n[l]=u:this._root=u),this):(this._root=i,this)},xu.removeAll=function(e){for(var t=0,n=e.length;t<n;++t)this.remove(e[t]);return this},xu.root=function(){return this._root},xu.size=function(){var e=0;return this.visit((function(t){if(!t.length)do{++e}while(t=t.next)})),e},xu.visit=function(e){var t,n,r,i,a=[],o=this._root;for(o&&a.push(new fu(o,this._x0,this._x1));t=a.pop();)if(!e(o=t.node,r=t.x0,i=t.x1)&&o.length){var s=(r+i)/2;(n=o[1])&&a.push(new fu(n,s,i)),(n=o[0])&&a.push(new fu(n,r,s))}return this},xu.visitAfter=function(e){var t,n=[],r=[];for(this._root&&n.push(new fu(this._root,this._x0,this._x1));t=n.pop();){var i=t.node;if(i.length){var a,o=t.x0,s=t.x1,c=(o+s)/2;(a=i[0])&&n.push(new fu(a,o,c)),(a=i[1])&&n.push(new fu(a,c,s))}r.push(t)}for(;t=r.pop();)e(t.node,t.x0,t.x1);return this},xu.x=function(e){return arguments.length?(this._x=e,this):this._x};var Au=Su.prototype=Eu.prototype;function Lu(e,t,n,r,i){if(isNaN(t)||isNaN(n)||isNaN(r))return e;var a,o,s,c,l,u,h,p,d,f,m,g,v=e._root,y={data:i},x=e._x0,b=e._y0,_=e._z0,w=e._x1,M=e._y1,S=e._z1;if(!v)return e._root=y,e;for(;v.length;)if((p=t>=(o=(x+w)/2))?x=o:w=o,(d=n>=(s=(b+M)/2))?b=s:M=s,(f=r>=(c=(_+S)/2))?_=c:S=c,a=v,!(v=v[m=f<<2|d<<1|p]))return a[m]=y,e;if(l=+e._x.call(null,v.data),u=+e._y.call(null,v.data),h=+e._z.call(null,v.data),t===l&&n===u&&r===h)return y.next=v,a?a[m]=y:e._root=y,e;do{a=a?a[m]=new Array(8):e._root=new Array(8),(p=t>=(o=(x+w)/2))?x=o:w=o,(d=n>=(s=(b+M)/2))?b=s:M=s,(f=r>=(c=(_+S)/2))?_=c:S=c}while((m=f<<2|d<<1|p)==(g=(h>=c)<<2|(u>=s)<<1|l>=o));return a[g]=v,a[m]=y,e}function Pu(e,t,n,r,i,a,o){this.node=e,this.x0=t,this.y0=n,this.z0=r,this.x1=i,this.y1=a,this.z1=o}function Ru(e){return e[0]}function Cu(e){return e[1]}function Ou(e){return e[2]}function Du(e,t,n,r){var i=new Nu(null==t?Ru:t,null==n?Cu:n,null==r?Ou:r,NaN,NaN,NaN,NaN,NaN,NaN);return null==e?i:i.addAll(e)}function Nu(e,t,n,r,i,a,o,s,c){this._x=e,this._y=t,this._z=n,this._x0=r,this._y0=i,this._z0=a,this._x1=o,this._y1=s,this._z1=c,this._root=void 0}function Iu(e){for(var t={data:e.data},n=t;e=e.next;)n=n.next={data:e.data};return t}Au.copy=function(){var e,t,n=new Eu(this._x,this._y,this._x0,this._y0,this._x1,this._y1),r=this._root;if(!r)return n;if(!r.length)return n._root=Tu(r),n;for(e=[{source:r,target:n._root=new Array(4)}];r=e.pop();)for(var i=0;i<4;++i)(t=r.source[i])&&(t.length?e.push({source:t,target:r.target[i]=new Array(4)}):r.target[i]=Tu(t));return n},Au.add=function(e){var t=+this._x.call(null,e),n=+this._y.call(null,e);return bu(this.cover(t,n),t,n,e)},Au.addAll=function(e){var t,n,r,i,a=e.length,o=new Array(a),s=new Array(a),c=1/0,l=1/0,u=-1/0,h=-1/0;for(n=0;n<a;++n)isNaN(r=+this._x.call(null,t=e[n]))||isNaN(i=+this._y.call(null,t))||(o[n]=r,s[n]=i,r<c&&(c=r),r>u&&(u=r),i<l&&(l=i),i>h&&(h=i));if(c>u||l>h)return this;for(this.cover(c,l).cover(u,h),n=0;n<a;++n)bu(this,o[n],s[n],e[n]);return this},Au.cover=function(e,t){if(isNaN(e=+e)||isNaN(t=+t))return this;var n=this._x0,r=this._y0,i=this._x1,a=this._y1;if(isNaN(n))i=(n=Math.floor(e))+1,a=(r=Math.floor(t))+1;else{for(var o,s,c=i-n,l=this._root;n>e||e>=i||r>t||t>=a;)switch(s=(t<r)<<1|e<n,(o=new Array(4))[s]=l,l=o,c*=2,s){case 0:i=n+c,a=r+c;break;case 1:n=i-c,a=r+c;break;case 2:i=n+c,r=a-c;break;case 3:n=i-c,r=a-c}this._root&&this._root.length&&(this._root=l)}return this._x0=n,this._y0=r,this._x1=i,this._y1=a,this},Au.data=function(){var e=[];return this.visit((function(t){if(!t.length)do{e.push(t.data)}while(t=t.next)})),e},Au.extent=function(e){return arguments.length?this.cover(+e[0][0],+e[0][1]).cover(+e[1][0],+e[1][1]):isNaN(this._x0)?void 0:[[this._x0,this._y0],[this._x1,this._y1]]},Au.find=function(e,t,n){var r,i,a,o,s,c,l,u=this._x0,h=this._y0,p=this._x1,d=this._y1,f=[],m=this._root;for(m&&f.push(new _u(m,u,h,p,d)),null==n?n=1/0:(u=e-n,h=t-n,p=e+n,d=t+n,n*=n);c=f.pop();)if(!(!(m=c.node)||(i=c.x0)>p||(a=c.y0)>d||(o=c.x1)<u||(s=c.y1)<h))if(m.length){var g=(i+o)/2,v=(a+s)/2;f.push(new _u(m[3],g,v,o,s),new _u(m[2],i,v,g,s),new _u(m[1],g,a,o,v),new _u(m[0],i,a,g,v)),(l=(t>=v)<<1|e>=g)&&(c=f[f.length-1],f[f.length-1]=f[f.length-1-l],f[f.length-1-l]=c)}else{var y=e-+this._x.call(null,m.data),x=t-+this._y.call(null,m.data),b=y*y+x*x;if(b<n){var _=Math.sqrt(n=b);u=e-_,h=t-_,p=e+_,d=t+_,r=m.data}}return r},Au.remove=function(e){if(isNaN(a=+this._x.call(null,e))||isNaN(o=+this._y.call(null,e)))return this;var t,n,r,i,a,o,s,c,l,u,h,p,d=this._root,f=this._x0,m=this._y0,g=this._x1,v=this._y1;if(!d)return this;if(d.length)for(;;){if((l=a>=(s=(f+g)/2))?f=s:g=s,(u=o>=(c=(m+v)/2))?m=c:v=c,t=d,!(d=d[h=u<<1|l]))return this;if(!d.length)break;(t[h+1&3]||t[h+2&3]||t[h+3&3])&&(n=t,p=h)}for(;d.data!==e;)if(r=d,!(d=d.next))return this;return(i=d.next)&&delete d.next,r?(i?r.next=i:delete r.next,this):t?(i?t[h]=i:delete t[h],(d=t[0]||t[1]||t[2]||t[3])&&d===(t[3]||t[2]||t[1]||t[0])&&!d.length&&(n?n[p]=d:this._root=d),this):(this._root=i,this)},Au.removeAll=function(e){for(var t=0,n=e.length;t<n;++t)this.remove(e[t]);return this},Au.root=function(){return this._root},Au.size=function(){var e=0;return this.visit((function(t){if(!t.length)do{++e}while(t=t.next)})),e},Au.visit=function(e){var t,n,r,i,a,o,s=[],c=this._root;for(c&&s.push(new _u(c,this._x0,this._y0,this._x1,this._y1));t=s.pop();)if(!e(c=t.node,r=t.x0,i=t.y0,a=t.x1,o=t.y1)&&c.length){var l=(r+a)/2,u=(i+o)/2;(n=c[3])&&s.push(new _u(n,l,u,a,o)),(n=c[2])&&s.push(new _u(n,r,u,l,o)),(n=c[1])&&s.push(new _u(n,l,i,a,u)),(n=c[0])&&s.push(new _u(n,r,i,l,u))}return this},Au.visitAfter=function(e){var t,n=[],r=[];for(this._root&&n.push(new _u(this._root,this._x0,this._y0,this._x1,this._y1));t=n.pop();){var i=t.node;if(i.length){var a,o=t.x0,s=t.y0,c=t.x1,l=t.y1,u=(o+c)/2,h=(s+l)/2;(a=i[0])&&n.push(new _u(a,o,s,u,h)),(a=i[1])&&n.push(new _u(a,u,s,c,h)),(a=i[2])&&n.push(new _u(a,o,h,u,l)),(a=i[3])&&n.push(new _u(a,u,h,c,l))}r.push(t)}for(;t=r.pop();)e(t.node,t.x0,t.y0,t.x1,t.y1);return this},Au.x=function(e){return arguments.length?(this._x=e,this):this._x},Au.y=function(e){return arguments.length?(this._y=e,this):this._y};var zu=Du.prototype=Nu.prototype;function ku(e){return function(){return e}}function Fu(){return 1e-6*(Math.random()-.5)}function Bu(e){return e.index}function Uu(e,t){var n=e.get(t);if(!n)throw new Error("node not found: "+t);return n}function ju(e){var t,n,r,i,a,o,s=Bu,c=function(e){return 1/Math.min(a[e.source.index],a[e.target.index])},l=ku(30),u=1;function h(r){for(var a=0,s=e.length;a<u;++a)for(var c,l,h,p,d,f=0,m=0,g=0,v=0;f<s;++f)l=(c=e[f]).source,m=(h=c.target).x+h.vx-l.x-l.vx||Fu(),i>1&&(g=h.y+h.vy-l.y-l.vy||Fu()),i>2&&(v=h.z+h.vz-l.z-l.vz||Fu()),m*=p=((p=Math.sqrt(m*m+g*g+v*v))-n[f])/p*r*t[f],g*=p,v*=p,h.vx-=m*(d=o[f]),i>1&&(h.vy-=g*d),i>2&&(h.vz-=v*d),l.vx+=m*(d=1-d),i>1&&(l.vy+=g*d),i>2&&(l.vz+=v*d)}function p(){if(r){var i,c,l=r.length,u=e.length,h=new Map(r.map((e,t)=>[s(e,t,r),e]));for(i=0,a=new Array(l);i<u;++i)(c=e[i]).index=i,"object"!=typeof c.source&&(c.source=Uu(h,c.source)),"object"!=typeof c.target&&(c.target=Uu(h,c.target)),a[c.source.index]=(a[c.source.index]||0)+1,a[c.target.index]=(a[c.target.index]||0)+1;for(i=0,o=new Array(u);i<u;++i)c=e[i],o[i]=a[c.source.index]/(a[c.source.index]+a[c.target.index]);t=new Array(u),d(),n=new Array(u),f()}}function d(){if(r)for(var n=0,i=e.length;n<i;++n)t[n]=+c(e[n],n,e)}function f(){if(r)for(var t=0,i=e.length;t<i;++t)n[t]=+l(e[t],t,e)}return null==e&&(e=[]),h.initialize=function(e,t){r=e,i=t,p()},h.links=function(t){return arguments.length?(e=t,p(),h):e},h.id=function(e){return arguments.length?(s=e,h):s},h.iterations=function(e){return arguments.length?(u=+e,h):u},h.strength=function(e){return arguments.length?(c="function"==typeof e?e:ku(+e),d(),h):c},h.distance=function(e){return arguments.length?(l="function"==typeof e?e:ku(+e),f(),h):l},h}zu.copy=function(){var e,t,n=new Nu(this._x,this._y,this._z,this._x0,this._y0,this._z0,this._x1,this._y1,this._z1),r=this._root;if(!r)return n;if(!r.length)return n._root=Iu(r),n;for(e=[{source:r,target:n._root=new Array(8)}];r=e.pop();)for(var i=0;i<8;++i)(t=r.source[i])&&(t.length?e.push({source:t,target:r.target[i]=new Array(8)}):r.target[i]=Iu(t));return n},zu.add=function(e){var t=+this._x.call(null,e),n=+this._y.call(null,e),r=+this._z.call(null,e);return Lu(this.cover(t,n,r),t,n,r,e)},zu.addAll=function(e){var t,n,r,i,a,o=e.length,s=new Array(o),c=new Array(o),l=new Array(o),u=1/0,h=1/0,p=1/0,d=-1/0,f=-1/0,m=-1/0;for(n=0;n<o;++n)isNaN(r=+this._x.call(null,t=e[n]))||isNaN(i=+this._y.call(null,t))||isNaN(a=+this._z.call(null,t))||(s[n]=r,c[n]=i,l[n]=a,r<u&&(u=r),r>d&&(d=r),i<h&&(h=i),i>f&&(f=i),a<p&&(p=a),a>m&&(m=a));for(d<u&&(u=this._x0,d=this._x1),f<h&&(h=this._y0,f=this._y1),m<p&&(p=this._z0,m=this._z1),this.cover(u,h,p).cover(d,f,m),n=0;n<o;++n)Lu(this,s[n],c[n],l[n],e[n]);return this},zu.cover=function(e,t,n){if(isNaN(e=+e)||isNaN(t=+t)||isNaN(n=+n))return this;var r=this._x0,i=this._y0,a=this._z0,o=this._x1,s=this._y1,c=this._z1;if(isNaN(r))o=(r=Math.floor(e))+1,s=(i=Math.floor(t))+1,c=(a=Math.floor(n))+1;else{if(!(r>e||e>o||i>t||t>s||a>n||n>c))return this;var l,u,h=o-r,p=this._root;switch(u=(n<(a+c)/2)<<2|(t<(i+s)/2)<<1|e<(r+o)/2){case 0:do{(l=new Array(8))[u]=p,p=l}while(s=i+(h*=2),c=a+h,e>(o=r+h)||t>s||n>c);break;case 1:do{(l=new Array(8))[u]=p,p=l}while(s=i+(h*=2),c=a+h,(r=o-h)>e||t>s||n>c);break;case 2:do{(l=new Array(8))[u]=p,p=l}while(i=s-(h*=2),c=a+h,e>(o=r+h)||i>t||n>c);break;case 3:do{(l=new Array(8))[u]=p,p=l}while(i=s-(h*=2),c=a+h,(r=o-h)>e||i>t||n>c);break;case 4:do{(l=new Array(8))[u]=p,p=l}while(s=i+(h*=2),a=c-h,e>(o=r+h)||t>s||a>n);break;case 5:do{(l=new Array(8))[u]=p,p=l}while(s=i+(h*=2),a=c-h,(r=o-h)>e||t>s||a>n);break;case 6:do{(l=new Array(8))[u]=p,p=l}while(i=s-(h*=2),a=c-h,e>(o=r+h)||i>t||a>n);break;case 7:do{(l=new Array(8))[u]=p,p=l}while(i=s-(h*=2),a=c-h,(r=o-h)>e||i>t||a>n)}this._root&&this._root.length&&(this._root=p)}return this._x0=r,this._y0=i,this._z0=a,this._x1=o,this._y1=s,this._z1=c,this},zu.data=function(){var e=[];return this.visit((function(t){if(!t.length)do{e.push(t.data)}while(t=t.next)})),e},zu.extent=function(e){return arguments.length?this.cover(+e[0][0],+e[0][1],+e[0][2]).cover(+e[1][0],+e[1][1],+e[1][2]):isNaN(this._x0)?void 0:[[this._x0,this._y0,this._z0],[this._x1,this._y1,this._z1]]},zu.find=function(e,t,n,r){var i,a,o,s,c,l,u,h,p,d=this._x0,f=this._y0,m=this._z0,g=this._x1,v=this._y1,y=this._z1,x=[],b=this._root;for(b&&x.push(new Pu(b,d,f,m,g,v,y)),null==r?r=1/0:(d=e-r,f=t-r,m=n-r,g=e+r,v=t+r,y=n+r,r*=r);h=x.pop();)if(!(!(b=h.node)||(a=h.x0)>g||(o=h.y0)>v||(s=h.z0)>y||(c=h.x1)<d||(l=h.y1)<f||(u=h.z1)<m))if(b.length){var _=(a+c)/2,w=(o+l)/2,M=(s+u)/2;x.push(new Pu(b[7],_,w,M,c,l,u),new Pu(b[6],a,w,M,_,l,u),new Pu(b[5],_,o,M,c,w,u),new Pu(b[4],a,o,M,_,w,u),new Pu(b[3],_,w,s,c,l,M),new Pu(b[2],a,w,s,_,l,M),new Pu(b[1],_,o,s,c,w,M),new Pu(b[0],a,o,s,_,w,M)),(p=(n>=M)<<2|(t>=w)<<1|e>=_)&&(h=x[x.length-1],x[x.length-1]=x[x.length-1-p],x[x.length-1-p]=h)}else{var S=e-+this._x.call(null,b.data),E=t-+this._y.call(null,b.data),T=n-+this._z.call(null,b.data),A=S*S+E*E+T*T;if(A<r){var L=Math.sqrt(r=A);d=e-L,f=t-L,m=n-L,g=e+L,v=t+L,y=n+L,i=b.data}}return i},zu.remove=function(e){if(isNaN(a=+this._x.call(null,e))||isNaN(o=+this._y.call(null,e))||isNaN(s=+this._z.call(null,e)))return this;var t,n,r,i,a,o,s,c,l,u,h,p,d,f,m,g=this._root,v=this._x0,y=this._y0,x=this._z0,b=this._x1,_=this._y1,w=this._z1;if(!g)return this;if(g.length)for(;;){if((h=a>=(c=(v+b)/2))?v=c:b=c,(p=o>=(l=(y+_)/2))?y=l:_=l,(d=s>=(u=(x+w)/2))?x=u:w=u,t=g,!(g=g[f=d<<2|p<<1|h]))return this;if(!g.length)break;(t[f+1&7]||t[f+2&7]||t[f+3&7]||t[f+4&7]||t[f+5&7]||t[f+6&7]||t[f+7&7])&&(n=t,m=f)}for(;g.data!==e;)if(r=g,!(g=g.next))return this;return(i=g.next)&&delete g.next,r?(i?r.next=i:delete r.next,this):t?(i?t[f]=i:delete t[f],(g=t[0]||t[1]||t[2]||t[3]||t[4]||t[5]||t[6]||t[7])&&g===(t[7]||t[6]||t[5]||t[4]||t[3]||t[2]||t[1]||t[0])&&!g.length&&(n?n[m]=g:this._root=g),this):(this._root=i,this)},zu.removeAll=function(e){for(var t=0,n=e.length;t<n;++t)this.remove(e[t]);return this},zu.root=function(){return this._root},zu.size=function(){var e=0;return this.visit((function(t){if(!t.length)do{++e}while(t=t.next)})),e},zu.visit=function(e){var t,n,r,i,a,o,s,c,l=[],u=this._root;for(u&&l.push(new Pu(u,this._x0,this._y0,this._z0,this._x1,this._y1,this._z1));t=l.pop();)if(!e(u=t.node,r=t.x0,i=t.y0,a=t.z0,o=t.x1,s=t.y1,c=t.z1)&&u.length){var h=(r+o)/2,p=(i+s)/2,d=(a+c)/2;(n=u[7])&&l.push(new Pu(n,h,p,d,o,s,c)),(n=u[6])&&l.push(new Pu(n,r,p,d,h,s,c)),(n=u[5])&&l.push(new Pu(n,h,i,d,o,p,c)),(n=u[4])&&l.push(new Pu(n,r,i,d,h,p,c)),(n=u[3])&&l.push(new Pu(n,h,p,a,o,s,d)),(n=u[2])&&l.push(new Pu(n,r,p,a,h,s,d)),(n=u[1])&&l.push(new Pu(n,h,i,a,o,p,d)),(n=u[0])&&l.push(new Pu(n,r,i,a,h,p,d))}return this},zu.visitAfter=function(e){var t,n=[],r=[];for(this._root&&n.push(new Pu(this._root,this._x0,this._y0,this._z0,this._x1,this._y1,this._z1));t=n.pop();){var i=t.node;if(i.length){var a,o=t.x0,s=t.y0,c=t.z0,l=t.x1,u=t.y1,h=t.z1,p=(o+l)/2,d=(s+u)/2,f=(c+h)/2;(a=i[0])&&n.push(new Pu(a,o,s,c,p,d,f)),(a=i[1])&&n.push(new Pu(a,p,s,c,l,d,f)),(a=i[2])&&n.push(new Pu(a,o,d,c,p,u,f)),(a=i[3])&&n.push(new Pu(a,p,d,c,l,u,f)),(a=i[4])&&n.push(new Pu(a,o,s,f,p,d,h)),(a=i[5])&&n.push(new Pu(a,p,s,f,l,d,h)),(a=i[6])&&n.push(new Pu(a,o,d,f,p,u,h)),(a=i[7])&&n.push(new Pu(a,p,d,f,l,u,h))}r.push(t)}for(;t=r.pop();)e(t.node,t.x0,t.y0,t.z0,t.x1,t.y1,t.z1);return this},zu.x=function(e){return arguments.length?(this._x=e,this):this._x},zu.y=function(e){return arguments.length?(this._y=e,this):this._y},zu.z=function(e){return arguments.length?(this._z=e,this):this._z};var Hu={value:function(){}};function Gu(){for(var e,t=0,n=arguments.length,r={};t<n;++t){if(!(e=arguments[t]+"")||e in r||/[\s.]/.test(e))throw new Error("illegal type: "+e);r[e]=[]}return new Vu(r)}function Vu(e){this._=e}function Wu(e,t){return e.trim().split(/^|\s+/).map((function(e){var n="",r=e.indexOf(".");if(r>=0&&(n=e.slice(r+1),e=e.slice(0,r)),e&&!t.hasOwnProperty(e))throw new Error("unknown type: "+e);return{type:e,name:n}}))}function qu(e,t){for(var n,r=0,i=e.length;r<i;++r)if((n=e[r]).name===t)return n.value}function Xu(e,t,n){for(var r=0,i=e.length;r<i;++r)if(e[r].name===t){e[r]=Hu,e=e.slice(0,r).concat(e.slice(r+1));break}return null!=n&&e.push({name:t,value:n}),e}Vu.prototype=Gu.prototype={constructor:Vu,on:function(e,t){var n,r=this._,i=Wu(e+"",r),a=-1,o=i.length;if(!(arguments.length<2)){if(null!=t&&"function"!=typeof t)throw new Error("invalid callback: "+t);for(;++a<o;)if(n=(e=i[a]).type)r[n]=Xu(r[n],e.name,t);else if(null==t)for(n in r)r[n]=Xu(r[n],e.name,null);return this}for(;++a<o;)if((n=(e=i[a]).type)&&(n=qu(r[n],e.name)))return n},copy:function(){var e={},t=this._;for(var n in t)e[n]=t[n].slice();return new Vu(e)},call:function(e,t){if((n=arguments.length-2)>0)for(var n,r,i=new Array(n),a=0;a<n;++a)i[a]=arguments[a+2];if(!this._.hasOwnProperty(e))throw new Error("unknown type: "+e);for(a=0,n=(r=this._[e]).length;a<n;++a)r[a].value.apply(t,i)},apply:function(e,t,n){if(!this._.hasOwnProperty(e))throw new Error("unknown type: "+e);for(var r=this._[e],i=0,a=r.length;i<a;++i)r[i].value.apply(t,n)}};var Yu,Zu,Ju=0,Qu=0,Ku=0,$u=0,eh=0,th=0,nh="object"==typeof performance&&performance.now?performance:Date,rh="object"==typeof window&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(e){setTimeout(e,17)};function ih(){return eh||(rh(ah),eh=nh.now()+th)}function ah(){eh=0}function oh(){this._call=this._time=this._next=null}function sh(e,t,n){var r=new oh;return r.restart(e,t,n),r}function ch(){eh=($u=nh.now())+th,Ju=Qu=0;try{!function(){ih(),++Ju;for(var e,t=Yu;t;)(e=eh-t._time)>=0&&t._call.call(null,e),t=t._next;--Ju}()}finally{Ju=0,function(){var e,t,n=Yu,r=1/0;for(;n;)n._call?(r>n._time&&(r=n._time),e=n,n=n._next):(t=n._next,n._next=null,n=e?e._next=t:Yu=t);Zu=e,uh(r)}(),eh=0}}function lh(){var e=nh.now(),t=e-$u;t>1e3&&(th-=t,$u=e)}function uh(e){Ju||(Qu&&(Qu=clearTimeout(Qu)),e-eh>24?(e<1/0&&(Qu=setTimeout(ch,e-nh.now()-th)),Ku&&(Ku=clearInterval(Ku))):(Ku||($u=nh.now(),Ku=setInterval(lh,1e3)),Ju=1,rh(ch)))}oh.prototype=sh.prototype={constructor:oh,restart:function(e,t,n){if("function"!=typeof e)throw new TypeError("callback is not a function");n=(null==n?ih():+n)+(null==t?0:+t),this._next||Zu===this||(Zu?Zu._next=this:Yu=this,Zu=this),this._call=e,this._time=n,uh()},stop:function(){this._call&&(this._call=null,this._time=1/0,uh())}};function hh(e){return e.x}function ph(e){return e.y}function dh(e){return e.z}var fh=Math.PI*(3-Math.sqrt(5)),mh=20*Math.PI/(9+Math.sqrt(221));function gh(e,t){t=t||2;var n,r=Math.min(3,Math.max(1,Math.round(t))),i=1,a=.001,o=1-Math.pow(a,1/300),s=0,c=.6,l=new Map,u=sh(p),h=Gu("tick","end");function p(){d(),h.call("tick",n),i<a&&(u.stop(),h.call("end",n))}function d(t){var a,u,h=e.length;void 0===t&&(t=1);for(var p=0;p<t;++p)for(i+=(s-i)*o,l.forEach((function(e){e(i)})),a=0;a<h;++a)null==(u=e[a]).fx?u.x+=u.vx*=c:(u.x=u.fx,u.vx=0),r>1&&(null==u.fy?u.y+=u.vy*=c:(u.y=u.fy,u.vy=0)),r>2&&(null==u.fz?u.z+=u.vz*=c:(u.z=u.fz,u.vz=0));return n}function f(){for(var t,n=0,i=e.length;n<i;++n){if((t=e[n]).index=n,null!=t.fx&&(t.x=t.fx),null!=t.fy&&(t.y=t.fy),null!=t.fz&&(t.z=t.fz),isNaN(t.x)||r>1&&isNaN(t.y)||r>2&&isNaN(t.z)){var a=10*(r>2?Math.cbrt(n):r>1?Math.sqrt(n):n),o=n*fh,s=n*mh;1===r?t.x=a:2===r?(t.x=a*Math.cos(o),t.y=a*Math.sin(o)):(t.x=a*Math.sin(o)*Math.cos(s),t.y=a*Math.cos(o),t.z=a*Math.sin(o)*Math.sin(s))}(isNaN(t.vx)||r>1&&isNaN(t.vy)||r>2&&isNaN(t.vz))&&(t.vx=0,r>1&&(t.vy=0),r>2&&(t.vz=0))}}function m(t){return t.initialize&&t.initialize(e,r),t}return null==e&&(e=[]),f(),n={tick:d,restart:function(){return u.restart(p),n},stop:function(){return u.stop(),n},numDimensions:function(e){return arguments.length?(r=Math.min(3,Math.max(1,Math.round(e))),l.forEach(m),n):r},nodes:function(t){return arguments.length?(e=t,f(),l.forEach(m),n):e},alpha:function(e){return arguments.length?(i=+e,n):i},alphaMin:function(e){return arguments.length?(a=+e,n):a},alphaDecay:function(e){return arguments.length?(o=+e,n):+o},alphaTarget:function(e){return arguments.length?(s=+e,n):s},velocityDecay:function(e){return arguments.length?(c=1-e,n):1-c},force:function(e,t){return arguments.length>1?(null==t?l.delete(e):l.set(e,m(t)),n):l.get(e)},find:function(){var t,n,i,a,o,s,c=Array.prototype.slice.call(arguments),l=c.shift()||0,u=(r>1?c.shift():null)||0,h=(r>2?c.shift():null)||0,p=c.shift()||1/0,d=0,f=e.length;for(p*=p,d=0;d<f;++d)(a=(t=l-(o=e[d]).x)*t+(n=u-(o.y||0))*n+(i=h-(o.z||0))*i)<p&&(s=o,p=a);return s},on:function(e,t){return arguments.length>1?(h.on(e,t),n):h.on(e)}}}function vh(){var e,t,n,r,i,a=ku(-30),o=1,s=1/0,c=.81;function l(i){var a,o=e.length,s=(1===t?gu(e,hh):2===t?Su(e,hh,ph):3===t?Du(e,hh,ph,dh):null).visitAfter(h);for(r=i,a=0;a<o;++a)n=e[a],s.visit(p)}function u(){if(e){var t,n,r=e.length;for(i=new Array(r),t=0;t<r;++t)n=e[t],i[n.index]=+a(n,t,e)}}function h(e){var n,r,a,o,s,c,l=0,u=0,h=e.length;if(h){for(a=o=s=c=0;c<h;++c)(n=e[c])&&(r=Math.abs(n.value))&&(l+=n.value,u+=r,a+=r*(n.x||0),o+=r*(n.y||0),s+=r*(n.z||0));l*=Math.sqrt(4/h),e.x=a/u,t>1&&(e.y=o/u),t>2&&(e.z=s/u)}else{(n=e).x=n.data.x,t>1&&(n.y=n.data.y),t>2&&(n.z=n.data.z);do{l+=i[n.data.index]}while(n=n.next)}e.value=l}function p(e,a,l,u,h){if(!e.value)return!0;var p=[l,u,h][t-1],d=e.x-n.x,f=t>1?e.y-n.y:0,m=t>2?e.z-n.z:0,g=p-a,v=d*d+f*f+m*m;if(g*g/c<v)return v<s&&(0===d&&(v+=(d=Fu())*d),t>1&&0===f&&(v+=(f=Fu())*f),t>2&&0===m&&(v+=(m=Fu())*m),v<o&&(v=Math.sqrt(o*v)),n.vx+=d*e.value*r/v,t>1&&(n.vy+=f*e.value*r/v),t>2&&(n.vz+=m*e.value*r/v)),!0;if(!(e.length||v>=s)){(e.data!==n||e.next)&&(0===d&&(v+=(d=Fu())*d),t>1&&0===f&&(v+=(f=Fu())*f),t>2&&0===m&&(v+=(m=Fu())*m),v<o&&(v=Math.sqrt(o*v)));do{e.data!==n&&(g=i[e.data.index]*r/v,n.vx+=d*g,t>1&&(n.vy+=f*g),t>2&&(n.vz+=m*g))}while(e=e.next)}}return l.initialize=function(n,r){e=n,t=r,u()},l.strength=function(e){return arguments.length?(a="function"==typeof e?e:ku(+e),u(),l):a},l.distanceMin=function(e){return arguments.length?(o=e*e,l):Math.sqrt(o)},l.distanceMax=function(e){return arguments.length?(s=e*e,l):Math.sqrt(s)},l.theta=function(e){return arguments.length?(c=e*e,l):Math.sqrt(c)},l}var yh=function(e){!function(e){if(!e)throw new Error("Eventify cannot use falsy object as events subject");for(var t=["on","fire","off"],n=0;n<t.length;++n)if(e.hasOwnProperty(t[n]))throw new Error("Subject cannot be eventified, since it already has property '"+t[n]+"'")}(e);var t=function(e){var t=Object.create(null);return{on:function(n,r,i){if("function"!=typeof r)throw new Error("callback is expected to be a function");var a=t[n];return a||(a=t[n]=[]),a.push({callback:r,ctx:i}),e},off:function(n,r){if(void 0===n)return t=Object.create(null),e;if(t[n])if("function"!=typeof r)delete t[n];else for(var i=t[n],a=0;a<i.length;++a)i[a].callback===r&&i.splice(a,1);return e},fire:function(n){var r,i=t[n];if(!i)return e;arguments.length>1&&(r=Array.prototype.splice.call(arguments,1));for(var a=0;a<i.length;++a){var o=i[a];o.callback.apply(o.ctx,r)}return e}}}(e);return e.on=t.on,e.off=t.off,e.fire=t.fire,e};var xh=function(e){"uniqueLinkId"in(e=e||{})&&(console.warn("ngraph.graph: Starting from version 0.14 `uniqueLinkId` is deprecated.\nUse `multigraph` option instead\n","\n","Note: there is also change in default behavior: From now on each graph\nis considered to be not a multigraph by default (each edge is unique)."),e.multigraph=e.uniqueLinkId);void 0===e.multigraph&&(e.multigraph=!1);if("function"!=typeof Map)throw new Error("ngraph.graph requires `Map` to be defined. Please polyfill it before using ngraph");var t=new Map,n=[],r={},i=0,a=e.multigraph?function(e,t,n){var i=Sh(e,t),a=r.hasOwnProperty(i);if(a||y(e,t)){a||(r[i]=0);var o="@"+ ++r[i];i=Sh(e+o,t+o)}return new Mh(e,t,n,i)}:function(e,t,n){var r=Sh(e,t);return new Mh(e,t,n,r)},o=[],s=x,c=x,l=x,u=x,h={addNode:f,addLink:function(e,t,r){l();var i=m(e)||f(e),o=m(t)||f(t),c=a(e,t,r);n.push(c),wh(i,c),e!==t&&wh(o,c);return s(c,"add"),u(),c},removeLink:v,removeNode:g,getNode:m,getNodesCount:function(){return t.size},getLinksCount:function(){return n.length},getLinks:function(e){var t=m(e);return t?t.links:null},forEachNode:w,forEachLinkedNode:function(e,n,r){var i=m(e);if(i&&i.links&&"function"==typeof n)return r?function(e,n,r){for(var i=0;i<e.length;++i){var a=e[i];if(a.fromId===n&&r(t.get(a.toId),a))return!0}}(i.links,e,n):function(e,n,r){for(var i=0;i<e.length;++i){var a=e[i],o=a.fromId===n?a.toId:a.fromId;if(r(t.get(o),a))return!0}}(i.links,e,n)},forEachLink:function(e){var t,r;if("function"==typeof e)for(t=0,r=n.length;t<r;++t)e(n[t])},beginUpdate:l,endUpdate:u,clear:function(){l(),w((function(e){g(e.id)})),u()},hasLink:y,hasNode:m,getLink:y};return yh(h),function(){var e=h.on;h.on=function(){return h.beginUpdate=l=b,h.endUpdate=u=_,s=p,c=d,h.on=e,e.apply(h,arguments)}}(),h;function p(e,t){o.push({link:e,changeType:t})}function d(e,t){o.push({node:e,changeType:t})}function f(e,n){if(void 0===e)throw new Error("Invalid node identifier");l();var r=m(e);return r?(r.data=n,c(r,"update")):(r=new _h(e,n),c(r,"add")),t.set(e,r),u(),r}function m(e){return t.get(e)}function g(e){var n=m(e);if(!n)return!1;l();var r=n.links;if(r){n.links=null;for(var i=0;i<r.length;++i)v(r[i])}return t.delete(e),c(n,"remove"),u(),!0}function v(e){if(!e)return!1;var t=bh(e,n);if(t<0)return!1;l(),n.splice(t,1);var r=m(e.fromId),i=m(e.toId);return r&&(t=bh(e,r.links))>=0&&r.links.splice(t,1),i&&(t=bh(e,i.links))>=0&&i.links.splice(t,1),s(e,"remove"),u(),!0}function y(e,t){var n,r=m(e);if(!r||!r.links)return null;for(n=0;n<r.links.length;++n){var i=r.links[n];if(i.fromId===e&&i.toId===t)return i}return null}function x(){}function b(){i+=1}function _(){0===(i-=1)&&o.length>0&&(h.fire("changed",o),o.length=0)}function w(e){if("function"!=typeof e)throw new Error("Function is expected to iterate over graph nodes. You passed "+e);for(var n=t.values(),r=n.next();!r.done;){if(e(r.value))return!0;r=n.next()}}};function bh(e,t){if(!t)return-1;if(t.indexOf)return t.indexOf(e);var n,r=t.length;for(n=0;n<r;n+=1)if(t[n]===e)return n;return-1}function _h(e,t){this.id=e,this.links=null,this.data=t}function wh(e,t){e.links?e.links.push(t):e.links=[t]}function Mh(e,t,n,r){this.fromId=e,this.toId=t,this.data=n,this.id=r}function Sh(e,t){return e.toString()+"👉 "+t.toString()}var Eh=function(e,t,n,r,i){this.from=e,this.to=t,this.length=n,this.coeff=r,this.weight="number"==typeof i?i:1};var Th=function(e,t,n){if("[object Array]"===Object.prototype.toString.call(n))for(var r=0;r<n.length;++r)Ah(e,t,n[r]);else for(var i in e)Ah(e,t,i)};function Ah(e,t,n){if(e.hasOwnProperty(n)){if("function"==typeof t[n])return;t[n]=function(r){return void 0!==r?(e[n]=r,t):e[n]}}}var Lh=function e(t,n){var r;t||(t={});if(n)for(r in n)if(n.hasOwnProperty(r)){var i=t.hasOwnProperty(r),a=typeof n[r];!i||typeof t[r]!==a?t[r]=n[r]:"object"===a&&(t[r]=e(t[r],n[r]))}return t};function Ph(e,t){return e(t={exports:{}},t.exports),t.exports}var Rh=Ph((function(e){function t(e){return new n("number"==typeof e?e:+new Date)}function n(e){this.seed=e}function r(){var e=this.seed;return e=4294967295&(3042594569^(e=(e=4294967295&((e=(e=4294967295&(3345072700^(e=e+2127912214+(e<<12)&4294967295)^e>>>19))+374761393+(e<<5)&4294967295)+3550635116^e<<9))+4251993797+(e<<3)&4294967295)^e>>>16),this.seed=e,(268435455&e)/268435456}e.exports=t,e.exports.random=t,e.exports.randomIterator=function(e,n){var r=n||t();if("function"!=typeof r.next)throw new Error("customRandom does not match expected API: next() function is missing");return{forEach:function(t){var n,i,a;for(n=e.length-1;n>0;--n)i=r.next(n+1),a=e[i],e[i]=e[n],e[n]=a,t(a);e.length&&t(e[0])},shuffle:function(){var t,n,i;for(t=e.length-1;t>0;--t)n=r.next(t+1),i=e[n],e[n]=e[t],e[t]=i;return e}}},n.prototype.next=function(e){return Math.floor(this.nextDouble()*e)},n.prototype.nextDouble=r,n.prototype.uniform=r,n.prototype.gaussian=function(){var e,t,n;do{t=2*this.nextDouble()-1,n=2*this.nextDouble()-1,e=t*t+n*n}while(e>=1||0===e);return t*Math.sqrt(-2*Math.log(e)/e)}})),Ch=(Rh.random,Rh.randomIterator,function(){this.body=null,this.quad0=null,this.quad1=null,this.quad2=null,this.quad3=null,this.mass=0,this.massX=0,this.massY=0,this.left=0,this.top=0,this.bottom=0,this.right=0}),Oh=Dh;function Dh(){this.stack=[],this.popIdx=0}function Nh(e,t){this.node=e,this.body=t}Dh.prototype={isEmpty:function(){return 0===this.popIdx},push:function(e,t){var n=this.stack[this.popIdx];n?(n.node=e,n.body=t):this.stack[this.popIdx]=new Nh(e,t),++this.popIdx},pop:function(){if(this.popIdx>0)return this.stack[--this.popIdx]},reset:function(){this.popIdx=0}};var Ih=function(e,t){var n=Math.abs(e.x-t.x),r=Math.abs(e.y-t.y);return n<1e-8&&r<1e-8},zh=function(e){(e=e||{}).gravity="number"==typeof e.gravity?e.gravity:-1,e.theta="number"==typeof e.theta?e.theta:.8;var t=Rh.random(1984),n=Ch,r=Oh,i=Ih,a=e.gravity,o=[],s=new r,c=e.theta,l=[],u=0,h=p();return{insertBodies:function(e){var t,n=Number.MAX_VALUE,r=Number.MAX_VALUE,i=Number.MIN_VALUE,a=Number.MIN_VALUE,o=e.length;t=o;for(;t--;){var s=e[t].pos.x,c=e[t].pos.y;s<n&&(n=s),s>i&&(i=s),c<r&&(r=c),c>a&&(a=c)}var l=i-n,f=a-r;l>f?a=r+l:i=n+f;u=0,(h=p()).left=n,h.right=i,h.top=r,h.bottom=a,(t=o-1)>=0&&(h.body=e[t]);for(;t--;)d(e[t])},getRoot:function(){return h},updateBodyForce:function(e){var n,r,i,s,l=o,u=0,p=0,d=1,f=0,m=1;l[0]=h;for(;d;){var g=l[f],v=g.body;d-=1,f+=1;var y=v!==e;v&&y?(r=v.pos.x-e.pos.x,i=v.pos.y-e.pos.y,0===(s=Math.sqrt(r*r+i*i))&&(r=(t.nextDouble()-.5)/50,i=(t.nextDouble()-.5)/50,s=Math.sqrt(r*r+i*i)),n=a*v.mass*e.mass/(s*s*s),u+=n*r,p+=n*i):y&&(r=g.massX/g.mass-e.pos.x,i=g.massY/g.mass-e.pos.y,0===(s=Math.sqrt(r*r+i*i))&&(r=(t.nextDouble()-.5)/50,i=(t.nextDouble()-.5)/50,s=Math.sqrt(r*r+i*i)),(g.right-g.left)/s<c?(n=a*g.mass*e.mass/(s*s*s),u+=n*r,p+=n*i):(g.quad0&&(l[m]=g.quad0,d+=1,m+=1),g.quad1&&(l[m]=g.quad1,d+=1,m+=1),g.quad2&&(l[m]=g.quad2,d+=1,m+=1),g.quad3&&(l[m]=g.quad3,d+=1,m+=1)))}e.force.x+=u,e.force.y+=p},options:function(e){return e?("number"==typeof e.gravity&&(a=e.gravity),"number"==typeof e.theta&&(c=e.theta),this):{gravity:a,theta:c}}};function p(){var e=l[u];return e?(e.quad0=null,e.quad1=null,e.quad2=null,e.quad3=null,e.body=null,e.mass=e.massX=e.massY=0,e.left=e.right=e.top=e.bottom=0):(e=new n,l[u]=e),++u,e}function d(e){for(s.reset(),s.push(h,e);!s.isEmpty();){var n=s.pop(),r=n.node,a=n.body;if(r.body){var o=r.body;if(r.body=null,i(o.pos,a.pos)){var c=3;do{var l=t.nextDouble(),u=(r.right-r.left)*l,d=(r.bottom-r.top)*l;o.pos.x=r.left+u,o.pos.y=r.top+d,c-=1}while(c>0&&i(o.pos,a.pos));if(0===c&&i(o.pos,a.pos))return}s.push(r,o),s.push(r,a)}else{var f=a.pos.x,m=a.pos.y;r.mass=r.mass+a.mass,r.massX=r.massX+a.mass*f,r.massY=r.massY+a.mass*m;var g=0,v=r.left,y=(r.right+v)/2,x=r.top,b=(r.bottom+x)/2;f>y&&(g+=1,v=y,y=r.right),m>b&&(g+=2,x=b,b=r.bottom);var _=kh(r,g);_?s.push(_,a):((_=p()).left=v,_.top=x,_.right=y,_.bottom=b,_.body=a,Fh(r,g,_))}}}};function kh(e,t){return 0===t?e.quad0:1===t?e.quad1:2===t?e.quad2:3===t?e.quad3:null}function Fh(e,t,n){0===t?e.quad0=n:1===t?e.quad1=n:2===t?e.quad2=n:3===t&&(e.quad3=n)}var Bh=function(e,t){var n=Rh.random(42),r={x1:0,y1:0,x2:0,y2:0};return{box:r,update:function(){var t=e.length;if(0===t)return;var n=Number.MAX_VALUE,i=Number.MAX_VALUE,a=Number.MIN_VALUE,o=Number.MIN_VALUE;for(;t--;){var s=e[t];s.isPinned?(s.pos.x=s.prevPos.x,s.pos.y=s.prevPos.y):(s.prevPos.x=s.pos.x,s.prevPos.y=s.pos.y),s.pos.x<n&&(n=s.pos.x),s.pos.x>a&&(a=s.pos.x),s.pos.y<i&&(i=s.pos.y),s.pos.y>o&&(o=s.pos.y)}r.x1=n,r.x2=a,r.y1=i,r.y2=o},reset:function(){r.x1=r.y1=0,r.x2=r.y2=0},getBestNewPosition:function(e){var i=r,a=0,o=0;if(e.length){for(var s=0;s<e.length;++s)a+=e[s].pos.x,o+=e[s].pos.y;a/=e.length,o/=e.length}else a=(i.x1+i.x2)/2,o=(i.y1+i.y2)/2;var c=t.springLength;return{x:a+n.next(c)-c/2,y:o+n.next(c)-c/2}}}},Uh=function(e){var t={update:function(t){t.force.x-=e.dragCoeff*t.velocity.x,t.force.y-=e.dragCoeff*t.velocity.y}};return Th(e=Lh(e,{dragCoeff:.02}),t,["dragCoeff"]),t},jh=function(e){var t=Lh,n=Rh.random(42),r={update:function(t){var r=t.from,i=t.to,a=t.length<0?e.springLength:t.length,o=i.pos.x-r.pos.x,s=i.pos.y-r.pos.y,c=Math.sqrt(o*o+s*s);0===c&&(o=(n.nextDouble()-.5)/50,s=(n.nextDouble()-.5)/50,c=Math.sqrt(o*o+s*s));var l=c-a,u=(!t.coeff||t.coeff<0?e.springCoeff:t.coeff)*l/c*t.weight;r.force.x+=u*o,r.force.y+=u*s,i.force.x-=u*o,i.force.y-=u*s}};return Th(e=t(e,{springCoeff:2e-4,springLength:80}),r,["springCoeff","springLength"]),r},Hh=function(e,t){var n,r=0,i=0,a=0,o=0,s=e.length;if(0===s)return 0;for(n=0;n<s;++n){var c=e[n],l=t/c.mass;c.velocity.x+=l*c.force.x,c.velocity.y+=l*c.force.y;var u=c.velocity.x,h=c.velocity.y,p=Math.sqrt(u*u+h*h);p>1&&(c.velocity.x=u/p,c.velocity.y=h/p),r=t*c.velocity.x,a=t*c.velocity.y,c.pos.x+=r,c.pos.y+=a,i+=Math.abs(r),o+=Math.abs(a)}return(i*i+o*o)/s};var Gh={Body:Vh,Vector2d:Wh,Body3d:qh,Vector3d:Xh};function Vh(e,t){this.pos=new Wh(e,t),this.prevPos=new Wh(e,t),this.force=new Wh,this.velocity=new Wh,this.mass=1}function Wh(e,t){e&&"number"!=typeof e?(this.x="number"==typeof e.x?e.x:0,this.y="number"==typeof e.y?e.y:0):(this.x="number"==typeof e?e:0,this.y="number"==typeof t?t:0)}function qh(e,t,n){this.pos=new Xh(e,t,n),this.prevPos=new Xh(e,t,n),this.force=new Xh,this.velocity=new Xh,this.mass=1}function Xh(e,t,n){e&&"number"!=typeof e?(this.x="number"==typeof e.x?e.x:0,this.y="number"==typeof e.y?e.y:0,this.z="number"==typeof e.z?e.z:0):(this.x="number"==typeof e?e:0,this.y="number"==typeof t?t:0,this.z="number"==typeof n?n:0)}Vh.prototype.setPosition=function(e,t){this.prevPos.x=this.pos.x=e,this.prevPos.y=this.pos.y=t},Wh.prototype.reset=function(){this.x=this.y=0},qh.prototype.setPosition=function(e,t,n){this.prevPos.x=this.pos.x=e,this.prevPos.y=this.pos.y=t,this.prevPos.z=this.pos.z=n},Xh.prototype.reset=function(){this.x=this.y=this.z=0};var Yh=function(e){return new Gh.Body(e)},Zh=function(e){var t=Eh,n=Th,r=yh,i=(e=Lh(e,{springLength:30,springCoeff:8e-4,gravity:-1.2,theta:.8,dragCoeff:.02,timeStep:20})).createQuadTree||zh,a=e.createBounds||Bh,o=e.createDragForce||Uh,s=e.createSpringForce||jh,c=e.integrator||Hh,l=e.createBody||Yh,u=[],h=[],p=i(e),d=a(u,e),f=s(e),m=o(e),g=!0,v={bodies:u,quadTree:p,springs:h,settings:e,step:function(){!function(){var e,t=u.length;if(t)for(p.insertBodies(u);t--;)(e=u[t]).isPinned||(e.force.reset(),p.updateBodyForce(e),m.update(e));t=h.length;for(;t--;)f.update(h[t])}();var t=c(u,e.timeStep);return d.update(),t},addBody:function(e){if(!e)throw new Error("Body is required");return u.push(e),e},addBodyAt:function(e){if(!e)throw new Error("Body position is required");var t=l(e);return u.push(t),t},removeBody:function(e){if(e){var t=u.indexOf(e);if(!(t<0))return u.splice(t,1),0===u.length&&d.reset(),!0}},addSpring:function(e,n,r,i,a){if(!e||!n)throw new Error("Cannot add null spring to force simulator");"number"!=typeof r&&(r=-1);var o=new t(e,n,r,a>=0?a:-1,i);return h.push(o),o},getTotalMovement:function(){return 0},removeSpring:function(e){if(e){var t=h.indexOf(e);return t>-1?(h.splice(t,1),!0):void 0}},getBestNewBodyPosition:function(e){return d.getBestNewPosition(e)},getBBox:function(){return g&&(d.update(),g=!1),d.box},invalidateBBox:function(){g=!0},gravity:function(t){return void 0!==t?(e.gravity=t,p.options({gravity:t}),this):e.gravity},theta:function(t){return void 0!==t?(e.theta=t,p.options({theta:t}),this):e.theta}};return n(e,v),r(v),v};var Jh=function(e,t){if(!e)throw new Error("Graph structure cannot be undefined");var n=Zh(t),r=function(t){var n=e.getLinks(t);return n?1+n.length/3:1};t&&"function"==typeof t.nodeMass&&(r=t.nodeMass);var i=Object.create(null),a={},o=0,s=n.settings.springTransform||Kh;o=0,e.forEachNode((function(e){h(e.id),o+=1})),e.forEachLink(d),e.on("changed",u);var c=!1,l={step:function(){if(0===o)return!0;var e=n.step();l.lastMove=e,l.fire("step");var t,r=e/o<=.01;return c!==r&&(c=r,t=r,l.fire("stable",t)),r},getNodePosition:function(e){return g(e).pos},setNodePosition:function(e){var t=g(e);t.setPosition.apply(t,Array.prototype.slice.call(arguments,1)),n.invalidateBBox()},getLinkPosition:function(e){var t=a[e];if(t)return{from:t.from.pos,to:t.to.pos}},getGraphRect:function(){return n.getBBox()},forEachBody:function(e){Object.keys(i).forEach((function(t){e(i[t],t)}))},pinNode:function(e,t){g(e.id).isPinned=!!t},isNodePinned:function(e){return g(e.id).isPinned},dispose:function(){e.off("changed",u),l.fire("disposed")},getBody:function(e){return i[e]},getSpring:function(t,n){var r;if(void 0===n)r="object"!=typeof t?t:t.id;else{var i=e.hasLink(t,n);if(!i)return;r=i.id}return a[r]},simulator:n,graph:e,lastMove:0};return yh(l),l;function u(t){for(var n=0;n<t.length;++n){var r=t[n];"add"===r.changeType?(r.node&&h(r.node.id),r.link&&d(r.link)):"remove"===r.changeType&&(r.node&&p(r.node),r.link&&f(r.link))}o=e.getNodesCount()}function h(t){var r=i[t];if(!r){var a=e.getNode(t);if(!a)throw new Error("initBody() was called with unknown node id");var o=a.position;if(!o){var s=function(e){var t=[];if(!e.links)return t;for(var n=Math.min(e.links.length,2),r=0;r<n;++r){var a=e.links[r],o=a.fromId!==e.id?i[a.fromId]:i[a.toId];o&&o.pos&&t.push(o)}return t}(a);o=n.getBestNewBodyPosition(s)}(r=n.addBodyAt(o)).id=t,i[t]=r,m(t),function(e){return e&&(e.isPinned||e.data&&e.data.isPinned)}(a)&&(r.isPinned=!0)}}function p(e){var t=e.id,r=i[t];r&&(i[t]=null,delete i[t],n.removeBody(r))}function d(e){m(e.fromId),m(e.toId);var t=i[e.fromId],r=i[e.toId],o=n.addSpring(t,r,e.length);s(e,o),a[e.id]=o}function f(t){var r=a[t.id];if(r){var i=e.getNode(t.fromId),o=e.getNode(t.toId);i&&m(i.id),o&&m(o.id),delete a[t.id],n.removeSpring(r)}}function m(e){var t=i[e];if(t.mass=r(e),Number.isNaN(t.mass))throw new Error("Node mass should be a number")}function g(e){var t=i[e];return t||(h(e),t=i[e]),t}},Qh=Zh;function Kh(){}Jh.simulator=Qh;var $h=function(){this.body=null,this.quad0=null,this.quad1=null,this.quad2=null,this.quad3=null,this.quad4=null,this.quad5=null,this.quad6=null,this.quad7=null,this.mass=0,this.massX=0,this.massY=0,this.massZ=0,this.left=0,this.top=0,this.bottom=0,this.right=0,this.front=0,this.back=0},ep=tp;function tp(){this.stack=[],this.popIdx=0}function np(e,t){this.node=e,this.body=t}tp.prototype={isEmpty:function(){return 0===this.popIdx},push:function(e,t){var n=this.stack[this.popIdx];n?(n.node=e,n.body=t):this.stack[this.popIdx]=new np(e,t),++this.popIdx},pop:function(){if(this.popIdx>0)return this.stack[--this.popIdx]},reset:function(){this.popIdx=0}};var rp=function(e,t){var n=Math.abs(e.x-t.x),r=Math.abs(e.y-t.y),i=Math.abs(e.z-t.z);return n<1e-8&&r<1e-8&&i<1e-8},ip=function(e){(e=e||{}).gravity="number"==typeof e.gravity?e.gravity:-1,e.theta="number"==typeof e.theta?e.theta:.8;var t=Rh.random(1984),n=$h,r=ep,i=rp,a=e.gravity,o=[],s=new r,c=e.theta,l=[],u=0,h=function(){var e=l[u];return e?(e.quad0=null,e.quad4=null,e.quad1=null,e.quad5=null,e.quad2=null,e.quad6=null,e.quad3=null,e.quad7=null,e.body=null,e.mass=e.massX=e.massY=e.massZ=0,e.left=e.right=e.top=e.bottom=e.front=e.back=0):(e=new n,l[u]=e),++u,e},p=h(),d=function(e){for(s.reset(),s.push(p,e);!s.isEmpty();){var n=s.pop(),r=n.node,a=n.body;if(r.body){var o=r.body;if(r.body=null,i(o.pos,a.pos)){var c=3;do{var l=t.nextDouble(),u=(r.right-r.left)*l,d=(r.bottom-r.top)*l,f=(r.front-r.back)*l;o.pos.x=r.left+u,o.pos.y=r.top+d,o.pos.z=r.back+f,c-=1}while(c>0&&i(o.pos,a.pos));if(0===c&&i(o.pos,a.pos))return}s.push(r,o),s.push(r,a)}else{var m=a.pos.x,g=a.pos.y,v=a.pos.z;r.mass+=a.mass,r.massX+=a.mass*m,r.massY+=a.mass*g,r.massZ+=a.mass*v;var y=0,x=r.left,b=(r.right+x)/2,_=r.top,w=(r.bottom+_)/2,M=r.back,S=(r.front+M)/2;if(m>b){y+=1;var E=x;x=b,b+=b-E}if(g>w){y+=2;var T=_;_=w,w+=w-T}if(v>S){y+=4;var A=M;S=(M=S)+(M-A)}var L=ap(r,y);L?s.push(L,a):((L=h()).left=x,L.top=_,L.right=b,L.bottom=w,L.back=M,L.front=S,L.body=a,op(r,y,L))}}};return{insertBodies:function(e){var t,n=Number.MAX_VALUE,r=Number.MAX_VALUE,i=Number.MAX_VALUE,a=Number.MIN_VALUE,o=Number.MIN_VALUE,s=Number.MIN_VALUE,c=e.length;for(t=c;t--;){var l=e[t].pos,f=l.x,m=l.y,g=l.z;f<n&&(n=f),f>a&&(a=f),m<r&&(r=m),m>o&&(o=m),g<i&&(i=g),g>s&&(s=g)}var v=Math.max(a-n,Math.max(o-r,s-i));for(a=n+v,o=r+v,s=i+v,u=0,(p=h()).left=n,p.right=a,p.top=r,p.bottom=o,p.back=i,p.front=s,(t=c-1)>0&&(p.body=e[t]);t--;)d(e[t])},updateBodyForce:function(e){var n,r,i,s,l,u=o,h=0,d=0,f=0,m=1,g=0,v=1;for(u[0]=p;m;){var y=u[g],x=y.body;m-=1,g+=1;var b=x!==e;x&&b?(r=x.pos.x-e.pos.x,i=x.pos.y-e.pos.y,s=x.pos.z-e.pos.z,0===(l=Math.sqrt(r*r+i*i+s*s))&&(r=(t.nextDouble()-.5)/50,i=(t.nextDouble()-.5)/50,s=(t.nextDouble()-.5)/50,l=Math.sqrt(r*r+i*i+s*s)),h+=(n=a*x.mass*e.mass/(l*l*l))*r,d+=n*i,f+=n*s):b&&(r=y.massX/y.mass-e.pos.x,i=y.massY/y.mass-e.pos.y,s=y.massZ/y.mass-e.pos.z,0===(l=Math.sqrt(r*r+i*i+s*s))&&(r=(t.nextDouble()-.5)/50,i=(t.nextDouble()-.5)/50,s=(t.nextDouble()-.5)/50,l=Math.sqrt(r*r+i*i+s*s)),(y.right-y.left)/l<c?(h+=(n=a*y.mass*e.mass/(l*l*l))*r,d+=n*i,f+=n*s):(y.quad0&&(u[v]=y.quad0,m+=1,v+=1),y.quad1&&(u[v]=y.quad1,m+=1,v+=1),y.quad2&&(u[v]=y.quad2,m+=1,v+=1),y.quad3&&(u[v]=y.quad3,m+=1,v+=1),y.quad4&&(u[v]=y.quad4,m+=1,v+=1),y.quad5&&(u[v]=y.quad5,m+=1,v+=1),y.quad6&&(u[v]=y.quad6,m+=1,v+=1),y.quad7&&(u[v]=y.quad7,m+=1,v+=1)))}e.force.x+=h,e.force.y+=d,e.force.z+=f},options:function(e){return e?("number"==typeof e.gravity&&(a=e.gravity),"number"==typeof e.theta&&(c=e.theta),this):{gravity:a,theta:c}}}};function ap(e,t){return 0===t?e.quad0:1===t?e.quad1:2===t?e.quad2:3===t?e.quad3:4===t?e.quad4:5===t?e.quad5:6===t?e.quad6:7===t?e.quad7:null}function op(e,t,n){0===t?e.quad0=n:1===t?e.quad1=n:2===t?e.quad2=n:3===t?e.quad3=n:4===t?e.quad4=n:5===t?e.quad5=n:6===t?e.quad6=n:7===t&&(e.quad7=n)}var sp=function(e,t){var n=Rh.random(42),r={x1:0,y1:0,z1:0,x2:0,y2:0,z2:0};return{box:r,update:function(){var t=e.length;if(0===t)return;var n=Number.MAX_VALUE,i=Number.MAX_VALUE,a=Number.MAX_VALUE,o=Number.MIN_VALUE,s=Number.MIN_VALUE,c=Number.MIN_VALUE;for(;t--;){var l=e[t];l.isPinned?(l.pos.x=l.prevPos.x,l.pos.y=l.prevPos.y,l.pos.z=l.prevPos.z):(l.prevPos.x=l.pos.x,l.prevPos.y=l.pos.y,l.prevPos.z=l.pos.z),l.pos.x<n&&(n=l.pos.x),l.pos.x>o&&(o=l.pos.x),l.pos.y<i&&(i=l.pos.y),l.pos.y>s&&(s=l.pos.y),l.pos.z<a&&(a=l.pos.z),l.pos.z>c&&(c=l.pos.z)}r.x1=n,r.x2=o,r.y1=i,r.y2=s,r.z1=a,r.z2=c},reset:function(){r.x1=r.y1=0,r.x2=r.y2=0,r.z1=r.z2=0},getBestNewPosition:function(e){var i=r,a=0,o=0,s=0;if(e.length){for(var c=0;c<e.length;++c)a+=e[c].pos.x,o+=e[c].pos.y,s+=e[c].pos.z;a/=e.length,o/=e.length,s/=e.length}else a=(i.x1+i.x2)/2,o=(i.y1+i.y2)/2,s=(i.z1+i.z2)/2;var l=t.springLength;return{x:a+n.next(l)-l/2,y:o+n.next(l)-l/2,z:s+n.next(l)-l/2}}}},cp=function(e){var t={update:function(t){t.force.x-=e.dragCoeff*t.velocity.x,t.force.y-=e.dragCoeff*t.velocity.y,t.force.z-=e.dragCoeff*t.velocity.z}};return Th(e=Lh(e,{dragCoeff:.02}),t,["dragCoeff"]),t},lp=function(e){var t=Lh,n=Rh.random(42),r={update:function(t){var r=t.from,i=t.to,a=t.length<0?e.springLength:t.length,o=i.pos.x-r.pos.x,s=i.pos.y-r.pos.y,c=i.pos.z-r.pos.z,l=Math.sqrt(o*o+s*s+c*c);0===l&&(o=(n.nextDouble()-.5)/50,s=(n.nextDouble()-.5)/50,c=(n.nextDouble()-.5)/50,l=Math.sqrt(o*o+s*s+c*c));var u=l-a,h=(!t.coeff||t.coeff<0?e.springCoeff:t.coeff)*u/l*t.weight;r.force.x+=h*o,r.force.y+=h*s,r.force.z+=h*c,i.force.x-=h*o,i.force.y-=h*s,i.force.z-=h*c}};return Th(e=t(e,{springCoeff:2e-4,springLength:80}),r,["springCoeff","springLength"]),r},up=function(e){return new Gh.Body3d(e)},hp=function(e,t){var n,r=0,i=0,a=0,o=e.length;for(n=0;n<o;++n){var s=e[n],c=t*t/s.mass;s.pos.x=2*s.pos.x-s.prevPos.x+s.force.x*c,s.pos.y=2*s.pos.y-s.prevPos.y+s.force.y*c,s.pos.z=2*s.pos.z-s.prevPos.z+s.force.z*c,r+=Math.abs(s.pos.x-s.prevPos.x),i+=Math.abs(s.pos.y-s.prevPos.y),a+=Math.abs(s.pos.z-s.prevPos.z)}return(r*r+i*i+a*a)/e.length};var pp=function(e,t){var n,r=0,i=0,a=0,o=0,s=0,c=0,l=e.length;for(n=0;n<l;++n){var u=e[n],h=t/u.mass;u.velocity.x+=h*u.force.x,u.velocity.y+=h*u.force.y,u.velocity.z+=h*u.force.z;var p=u.velocity.x,d=u.velocity.y,f=u.velocity.z,m=Math.sqrt(p*p+d*d+f*f);m>1&&(u.velocity.x=p/m,u.velocity.y=d/m,u.velocity.z=f/m),r=t*u.velocity.x,a=t*u.velocity.y,s=t*u.velocity.z,u.pos.x+=r,u.pos.y+=a,u.pos.z+=s,i+=Math.abs(r),o+=Math.abs(a),c+=Math.abs(s)}return(i*i+o*o+c*c)/e.length};var dp=fp;function fp(e,t){return t=Lh(t,{createQuadTree:ip,createBounds:sp,createDragForce:cp,createSpringForce:lp,integrator:mp(t),createBody:up}),fp.get2dLayout(e,t)}function mp(e){return e&&"verlet"===e.integrator?hp:pp}function gp(e,t,n){var r,i,a,o,s;function c(){var l=Date.now()-o;l<t&&l>=0?r=setTimeout(c,t-l):(r=null,n||(s=e.apply(a,i),a=i=null))}null==t&&(t=100);var l=function(){a=this,i=arguments,o=Date.now();var l=n&&!r;return r||(r=setTimeout(c,t)),l&&(s=e.apply(a,i),a=i=null),s};return l.clear=function(){r&&(clearTimeout(r),r=null)},l.flush=function(){r&&(s=e.apply(a,i),a=i=null,clearTimeout(r),r=null)},l}fp.get2dLayout=Jh,gp.debounce=gp;var vp=gp;function yp(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if(!(Symbol.iterator in Object(e))&&"[object Arguments]"!==Object.prototype.toString.call(e))return;var n=[],r=!0,i=!1,a=void 0;try{for(var o,s=e[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!t||n.length!==t);r=!0);}catch(e){i=!0,a=e}finally{try{r||null==s.return||s.return()}finally{if(i)throw a}}return n}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}var xp=function e(t,n){var r=n.default,i=void 0===r?null:r,a=n.triggerUpdate,o=void 0===a||a,s=n.onChange,c=void 0===s?function(e,t){}:s;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.name=t,this.defaultVal=i,this.triggerUpdate=o,this.onChange=c};function bp(e){var t=e.stateInit,n=void 0===t?function(){return{}}:t,r=e.props,i=void 0===r?{}:r,a=e.methods,o=void 0===a?{}:a,s=e.aliases,c=void 0===s?{}:s,l=e.init,u=void 0===l?function(){}:l,h=e.update,p=void 0===h?function(){}:h,d=Object.keys(i).map((function(e){return new xp(e,i[e])}));return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=Object.assign({},n instanceof Function?n(e):n,{initialised:!1}),r={};function i(t){return a(t,e),s(),i}var a=function(e,n){u.call(i,e,t,n),t.initialised=!0},s=vp((function(){t.initialised&&(p.call(i,t,r),r={})}),1);return d.forEach((function(e){i[e.name]=function(e){var n=e.name,a=e.triggerUpdate,o=void 0!==a&&a,c=e.onChange,l=void 0===c?function(e,t){}:c,u=e.defaultVal,h=void 0===u?null:u;return function(e){var a=t[n];if(!arguments.length)return a;var c=void 0===e?h:e;return t[n]=c,l.call(i,c,t,a),!r.hasOwnProperty(n)&&(r[n]=a),o&&s(),i}}(e)})),Object.keys(o).forEach((function(e){i[e]=function(){for(var n,r=arguments.length,a=new Array(r),s=0;s<r;s++)a[s]=arguments[s];return(n=o[e]).call.apply(n,[i,t].concat(a))}})),Object.entries(c).forEach((function(e){var t=yp(e,2),n=t[0],r=t[1];return i[n]=i[r]})),i.resetProps=function(){return d.forEach((function(e){i[e.name](e.defaultVal)})),i},i.resetProps(),t._rerender=s,i}}var _p=function(e){return e instanceof Function?e:"string"==typeof e?function(t){return t[e]}:function(t){return e}};function wp(e,t){if(null==e)return{};var n,r,i=function(e,t){if(null==e)return{};var n,r,i={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function Mp(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if(!(Symbol.iterator in Object(e))&&"[object Arguments]"!==Object.prototype.toString.call(e))return;var n=[],r=!0,i=!1,a=void 0;try{for(var o,s=e[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!t||n.length!==t);r=!0);}catch(e){i=!0,a=e}finally{try{r||null==s.return||s.return()}finally{if(i)throw a}}return n}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function Sp(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}(e)||function(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance")}()}function Ep(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}var Tp=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],i=(t instanceof Array?t.length?t:[void 0]:[t]).map((function(e){return{keyAccessor:e,isProp:!(e instanceof Function)}})),a=e.reduce((function(e,t){var r=e,a=t;return i.forEach((function(e,t){var o,s=e.keyAccessor;if(e.isProp){var c=a,l=c[s],u=wp(c,[s].map(Ep));o=l,a=u}else o=s(a,t);t+1<i.length?(r.hasOwnProperty(o)||(r[o]={}),r=r[o]):n?(r.hasOwnProperty(o)||(r[o]=[]),r[o].push(a)):r[o]=a})),e}),{});n instanceof Function&&function e(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;r===i.length?Object.keys(t).forEach((function(e){return t[e]=n(t[e])})):Object.values(t).forEach((function(t){return e(t,r+1)}))}(a);var o=a;return r&&(o=[],function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];n.length===i.length?o.push({keys:n,vals:t}):Object.entries(t).forEach((function(t){var r=Mp(t,2),i=r[0],a=r[1];return e(a,[].concat(Sp(n),[i]))}))}(a),t instanceof Array&&0===t.length&&1===o.length&&(o[0].keys=[])),o};function Ap(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Lp(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Pp(e,t){if(null==e)return{};var n,r,i=function(e,t){if(null==e)return{};var n,r,i={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function Rp(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if(!(Symbol.iterator in Object(e))&&"[object Arguments]"!==Object.prototype.toString.call(e))return;var n=[],r=!0,i=!1,a=void 0;try{for(var o,s=e[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!t||n.length!==t);r=!0);}catch(e){i=!0,a=e}finally{try{r||null==s.return||s.return()}finally{if(i)throw a}}return n}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function Cp(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}(e)||function(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance")}()}function Op(e,t,n){var r=n.objBindAttr,i=void 0===r?"__obj":r,a=n.dataBindAttr,o=void 0===a?"__data":a,s=n.idAccessor,c=n.purge,l=void 0!==c&&c,u=function(e){return e.hasOwnProperty(o)},h=t.filter((function(e){return!u(e)})),p=t.filter(u).map((function(e){return e[o]})),d=l?{enter:e,exit:p,update:[]}:function(e,t,n){var r={enter:[],update:[],exit:[]};if(n){var i=Tp(e,n,!1),a=Tp(t,n,!1),o=Object.assign({},i,a);Object.entries(o).forEach((function(e){var t=Rp(e,2),n=t[0],o=t[1],s=i.hasOwnProperty(n)?a.hasOwnProperty(n)?"update":"exit":"enter";r[s].push("update"===s?[i[n],a[n]]:o)}))}else{var s=new Set(e),c=new Set(t);new Set([].concat(Cp(s),Cp(c))).forEach((function(e){var t=s.has(e)?c.has(e)?"update":"exit":"enter";r[t].push("update"===t?[e,e]:e)}))}return r}(p,e,s);return d.update=d.update.map((function(e){var t=Rp(e,2),n=t[0],r=t[1];return n!==r&&(r[i]=n[i],r[i][o]=r),r})),d.exit=d.exit.concat(h.map((function(e){return Ap({},i,e)}))),d}function Dp(e,t,n,r,i){var a=i.createObj,o=void 0===a?function(e){return{}}:a,s=i.updateObj,c=void 0===s?function(e,t){}:s,l=i.exitObj,u=void 0===l?function(e){}:l,h=i.objBindAttr,p=void 0===h?"__obj":h,d=i.dataBindAttr,f=void 0===d?"__data":d,m=Pp(i,["createObj","updateObj","exitObj","objBindAttr","dataBindAttr"]),g=Op(e,t,function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Lp(Object(n),!0).forEach((function(t){Ap(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Lp(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}({objBindAttr:p,dataBindAttr:f},m)),v=g.enter,y=g.update;g.exit.forEach((function(e){var t=e[p];delete e[p],u(t),r(t)}));var x=function(e){var t=[];return e.forEach((function(e){var n=o(e);n&&(n[f]=e,e[p]=n,t.push(n))})),t}(v);!function(e){e.forEach((function(e){var t=e[p];t&&(t[f]=e,c(t,e))}))}([].concat(Cp(v),Cp(y))),x.forEach(n)}function Np(e,t){switch(arguments.length){case 0:break;case 1:this.range(e);break;default:this.range(t).domain(e)}return this}const Ip=Symbol("implicit");var zp=function(e){for(var t=e.length/6|0,n=new Array(t),r=0;r<t;)n[r]="#"+e.slice(6*r,6*++r);return n}("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928"),kp=Ph((function(e){!function(t){var n=/^\s+/,r=/\s+$/,i=0,a=t.round,o=t.min,s=t.max,c=t.random;function l(e,c){if(c=c||{},(e=e||"")instanceof l)return e;if(!(this instanceof l))return new l(e,c);var u=function(e){var i={r:0,g:0,b:0},a=1,c=null,l=null,u=null,h=!1,p=!1;"string"==typeof e&&(e=function(e){e=e.replace(n,"").replace(r,"").toLowerCase();var t,i=!1;if(A[e])e=A[e],i=!0;else if("transparent"==e)return{r:0,g:0,b:0,a:0,format:"name"};if(t=U.rgb.exec(e))return{r:t[1],g:t[2],b:t[3]};if(t=U.rgba.exec(e))return{r:t[1],g:t[2],b:t[3],a:t[4]};if(t=U.hsl.exec(e))return{h:t[1],s:t[2],l:t[3]};if(t=U.hsla.exec(e))return{h:t[1],s:t[2],l:t[3],a:t[4]};if(t=U.hsv.exec(e))return{h:t[1],s:t[2],v:t[3]};if(t=U.hsva.exec(e))return{h:t[1],s:t[2],v:t[3],a:t[4]};if(t=U.hex8.exec(e))return{r:O(t[1]),g:O(t[2]),b:O(t[3]),a:z(t[4]),format:i?"name":"hex8"};if(t=U.hex6.exec(e))return{r:O(t[1]),g:O(t[2]),b:O(t[3]),format:i?"name":"hex"};if(t=U.hex4.exec(e))return{r:O(t[1]+""+t[1]),g:O(t[2]+""+t[2]),b:O(t[3]+""+t[3]),a:z(t[4]+""+t[4]),format:i?"name":"hex8"};if(t=U.hex3.exec(e))return{r:O(t[1]+""+t[1]),g:O(t[2]+""+t[2]),b:O(t[3]+""+t[3]),format:i?"name":"hex"};return!1}(e));"object"==typeof e&&(j(e.r)&&j(e.g)&&j(e.b)?(d=e.r,f=e.g,m=e.b,i={r:255*R(d,255),g:255*R(f,255),b:255*R(m,255)},h=!0,p="%"===String(e.r).substr(-1)?"prgb":"rgb"):j(e.h)&&j(e.s)&&j(e.v)?(c=N(e.s),l=N(e.v),i=function(e,n,r){e=6*R(e,360),n=R(n,100),r=R(r,100);var i=t.floor(e),a=e-i,o=r*(1-n),s=r*(1-a*n),c=r*(1-(1-a)*n),l=i%6;return{r:255*[r,s,o,o,c,r][l],g:255*[c,r,r,s,o,o][l],b:255*[o,o,c,r,r,s][l]}}(e.h,c,l),h=!0,p="hsv"):j(e.h)&&j(e.s)&&j(e.l)&&(c=N(e.s),u=N(e.l),i=function(e,t,n){var r,i,a;function o(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}if(e=R(e,360),t=R(t,100),n=R(n,100),0===t)r=i=a=n;else{var s=n<.5?n*(1+t):n+t-n*t,c=2*n-s;r=o(c,s,e+1/3),i=o(c,s,e),a=o(c,s,e-1/3)}return{r:255*r,g:255*i,b:255*a}}(e.h,c,u),h=!0,p="hsl"),e.hasOwnProperty("a")&&(a=e.a));var d,f,m;return a=P(a),{ok:h,format:e.format||p,r:o(255,s(i.r,0)),g:o(255,s(i.g,0)),b:o(255,s(i.b,0)),a:a}}(e);this._originalInput=e,this._r=u.r,this._g=u.g,this._b=u.b,this._a=u.a,this._roundA=a(100*this._a)/100,this._format=c.format||u.format,this._gradientType=c.gradientType,this._r<1&&(this._r=a(this._r)),this._g<1&&(this._g=a(this._g)),this._b<1&&(this._b=a(this._b)),this._ok=u.ok,this._tc_id=i++}function u(e,t,n){e=R(e,255),t=R(t,255),n=R(n,255);var r,i,a=s(e,t,n),c=o(e,t,n),l=(a+c)/2;if(a==c)r=i=0;else{var u=a-c;switch(i=l>.5?u/(2-a-c):u/(a+c),a){case e:r=(t-n)/u+(t<n?6:0);break;case t:r=(n-e)/u+2;break;case n:r=(e-t)/u+4}r/=6}return{h:r,s:i,l:l}}function h(e,t,n){e=R(e,255),t=R(t,255),n=R(n,255);var r,i,a=s(e,t,n),c=o(e,t,n),l=a,u=a-c;if(i=0===a?0:u/a,a==c)r=0;else{switch(a){case e:r=(t-n)/u+(t<n?6:0);break;case t:r=(n-e)/u+2;break;case n:r=(e-t)/u+4}r/=6}return{h:r,s:i,v:l}}function p(e,t,n,r){var i=[D(a(e).toString(16)),D(a(t).toString(16)),D(a(n).toString(16))];return r&&i[0].charAt(0)==i[0].charAt(1)&&i[1].charAt(0)==i[1].charAt(1)&&i[2].charAt(0)==i[2].charAt(1)?i[0].charAt(0)+i[1].charAt(0)+i[2].charAt(0):i.join("")}function d(e,t,n,r){return[D(I(r)),D(a(e).toString(16)),D(a(t).toString(16)),D(a(n).toString(16))].join("")}function f(e,t){t=0===t?0:t||10;var n=l(e).toHsl();return n.s-=t/100,n.s=C(n.s),l(n)}function m(e,t){t=0===t?0:t||10;var n=l(e).toHsl();return n.s+=t/100,n.s=C(n.s),l(n)}function g(e){return l(e).desaturate(100)}function v(e,t){t=0===t?0:t||10;var n=l(e).toHsl();return n.l+=t/100,n.l=C(n.l),l(n)}function y(e,t){t=0===t?0:t||10;var n=l(e).toRgb();return n.r=s(0,o(255,n.r-a(-t/100*255))),n.g=s(0,o(255,n.g-a(-t/100*255))),n.b=s(0,o(255,n.b-a(-t/100*255))),l(n)}function x(e,t){t=0===t?0:t||10;var n=l(e).toHsl();return n.l-=t/100,n.l=C(n.l),l(n)}function b(e,t){var n=l(e).toHsl(),r=(n.h+t)%360;return n.h=r<0?360+r:r,l(n)}function _(e){var t=l(e).toHsl();return t.h=(t.h+180)%360,l(t)}function w(e){var t=l(e).toHsl(),n=t.h;return[l(e),l({h:(n+120)%360,s:t.s,l:t.l}),l({h:(n+240)%360,s:t.s,l:t.l})]}function M(e){var t=l(e).toHsl(),n=t.h;return[l(e),l({h:(n+90)%360,s:t.s,l:t.l}),l({h:(n+180)%360,s:t.s,l:t.l}),l({h:(n+270)%360,s:t.s,l:t.l})]}function S(e){var t=l(e).toHsl(),n=t.h;return[l(e),l({h:(n+72)%360,s:t.s,l:t.l}),l({h:(n+216)%360,s:t.s,l:t.l})]}function E(e,t,n){t=t||6,n=n||30;var r=l(e).toHsl(),i=360/n,a=[l(e)];for(r.h=(r.h-(i*t>>1)+720)%360;--t;)r.h=(r.h+i)%360,a.push(l(r));return a}function T(e,t){t=t||6;for(var n=l(e).toHsv(),r=n.h,i=n.s,a=n.v,o=[],s=1/t;t--;)o.push(l({h:r,s:i,v:a})),a=(a+s)%1;return o}l.prototype={isDark:function(){return this.getBrightness()<128},isLight:function(){return!this.isDark()},isValid:function(){return this._ok},getOriginalInput:function(){return this._originalInput},getFormat:function(){return this._format},getAlpha:function(){return this._a},getBrightness:function(){var e=this.toRgb();return(299*e.r+587*e.g+114*e.b)/1e3},getLuminance:function(){var e,n,r,i=this.toRgb();return e=i.r/255,n=i.g/255,r=i.b/255,.2126*(e<=.03928?e/12.92:t.pow((e+.055)/1.055,2.4))+.7152*(n<=.03928?n/12.92:t.pow((n+.055)/1.055,2.4))+.0722*(r<=.03928?r/12.92:t.pow((r+.055)/1.055,2.4))},setAlpha:function(e){return this._a=P(e),this._roundA=a(100*this._a)/100,this},toHsv:function(){var e=h(this._r,this._g,this._b);return{h:360*e.h,s:e.s,v:e.v,a:this._a}},toHsvString:function(){var e=h(this._r,this._g,this._b),t=a(360*e.h),n=a(100*e.s),r=a(100*e.v);return 1==this._a?"hsv("+t+", "+n+"%, "+r+"%)":"hsva("+t+", "+n+"%, "+r+"%, "+this._roundA+")"},toHsl:function(){var e=u(this._r,this._g,this._b);return{h:360*e.h,s:e.s,l:e.l,a:this._a}},toHslString:function(){var e=u(this._r,this._g,this._b),t=a(360*e.h),n=a(100*e.s),r=a(100*e.l);return 1==this._a?"hsl("+t+", "+n+"%, "+r+"%)":"hsla("+t+", "+n+"%, "+r+"%, "+this._roundA+")"},toHex:function(e){return p(this._r,this._g,this._b,e)},toHexString:function(e){return"#"+this.toHex(e)},toHex8:function(e){return function(e,t,n,r,i){var o=[D(a(e).toString(16)),D(a(t).toString(16)),D(a(n).toString(16)),D(I(r))];if(i&&o[0].charAt(0)==o[0].charAt(1)&&o[1].charAt(0)==o[1].charAt(1)&&o[2].charAt(0)==o[2].charAt(1)&&o[3].charAt(0)==o[3].charAt(1))return o[0].charAt(0)+o[1].charAt(0)+o[2].charAt(0)+o[3].charAt(0);return o.join("")}(this._r,this._g,this._b,this._a,e)},toHex8String:function(e){return"#"+this.toHex8(e)},toRgb:function(){return{r:a(this._r),g:a(this._g),b:a(this._b),a:this._a}},toRgbString:function(){return 1==this._a?"rgb("+a(this._r)+", "+a(this._g)+", "+a(this._b)+")":"rgba("+a(this._r)+", "+a(this._g)+", "+a(this._b)+", "+this._roundA+")"},toPercentageRgb:function(){return{r:a(100*R(this._r,255))+"%",g:a(100*R(this._g,255))+"%",b:a(100*R(this._b,255))+"%",a:this._a}},toPercentageRgbString:function(){return 1==this._a?"rgb("+a(100*R(this._r,255))+"%, "+a(100*R(this._g,255))+"%, "+a(100*R(this._b,255))+"%)":"rgba("+a(100*R(this._r,255))+"%, "+a(100*R(this._g,255))+"%, "+a(100*R(this._b,255))+"%, "+this._roundA+")"},toName:function(){return 0===this._a?"transparent":!(this._a<1)&&(L[p(this._r,this._g,this._b,!0)]||!1)},toFilter:function(e){var t="#"+d(this._r,this._g,this._b,this._a),n=t,r=this._gradientType?"GradientType = 1, ":"";if(e){var i=l(e);n="#"+d(i._r,i._g,i._b,i._a)}return"progid:DXImageTransform.Microsoft.gradient("+r+"startColorstr="+t+",endColorstr="+n+")"},toString:function(e){var t=!!e;e=e||this._format;var n=!1,r=this._a<1&&this._a>=0;return t||!r||"hex"!==e&&"hex6"!==e&&"hex3"!==e&&"hex4"!==e&&"hex8"!==e&&"name"!==e?("rgb"===e&&(n=this.toRgbString()),"prgb"===e&&(n=this.toPercentageRgbString()),"hex"!==e&&"hex6"!==e||(n=this.toHexString()),"hex3"===e&&(n=this.toHexString(!0)),"hex4"===e&&(n=this.toHex8String(!0)),"hex8"===e&&(n=this.toHex8String()),"name"===e&&(n=this.toName()),"hsl"===e&&(n=this.toHslString()),"hsv"===e&&(n=this.toHsvString()),n||this.toHexString()):"name"===e&&0===this._a?this.toName():this.toRgbString()},clone:function(){return l(this.toString())},_applyModification:function(e,t){var n=e.apply(null,[this].concat([].slice.call(t)));return this._r=n._r,this._g=n._g,this._b=n._b,this.setAlpha(n._a),this},lighten:function(){return this._applyModification(v,arguments)},brighten:function(){return this._applyModification(y,arguments)},darken:function(){return this._applyModification(x,arguments)},desaturate:function(){return this._applyModification(f,arguments)},saturate:function(){return this._applyModification(m,arguments)},greyscale:function(){return this._applyModification(g,arguments)},spin:function(){return this._applyModification(b,arguments)},_applyCombination:function(e,t){return e.apply(null,[this].concat([].slice.call(t)))},analogous:function(){return this._applyCombination(E,arguments)},complement:function(){return this._applyCombination(_,arguments)},monochromatic:function(){return this._applyCombination(T,arguments)},splitcomplement:function(){return this._applyCombination(S,arguments)},triad:function(){return this._applyCombination(w,arguments)},tetrad:function(){return this._applyCombination(M,arguments)}},l.fromRatio=function(e,t){if("object"==typeof e){var n={};for(var r in e)e.hasOwnProperty(r)&&(n[r]="a"===r?e[r]:N(e[r]));e=n}return l(e,t)},l.equals=function(e,t){return!(!e||!t)&&l(e).toRgbString()==l(t).toRgbString()},l.random=function(){return l.fromRatio({r:c(),g:c(),b:c()})},l.mix=function(e,t,n){n=0===n?0:n||50;var r=l(e).toRgb(),i=l(t).toRgb(),a=n/100;return l({r:(i.r-r.r)*a+r.r,g:(i.g-r.g)*a+r.g,b:(i.b-r.b)*a+r.b,a:(i.a-r.a)*a+r.a})},
+// <http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef (WCAG Version 2)
+// Analyze the 2 colors and returns the color contrast defined by (WCAG Version 2)
+l.readability=function(e,n){var r=l(e),i=l(n);return(t.max(r.getLuminance(),i.getLuminance())+.05)/(t.min(r.getLuminance(),i.getLuminance())+.05)},l.isReadable=function(e,t,n){var r,i,a=l.readability(e,t);switch(i=!1,(r=function(e){var t,n;t=((e=e||{level:"AA",size:"small"}).level||"AA").toUpperCase(),n=(e.size||"small").toLowerCase(),"AA"!==t&&"AAA"!==t&&(t="AA");"small"!==n&&"large"!==n&&(n="small");return{level:t,size:n}}(n)).level+r.size){case"AAsmall":case"AAAlarge":i=a>=4.5;break;case"AAlarge":i=a>=3;break;case"AAAsmall":i=a>=7}return i},l.mostReadable=function(e,t,n){var r,i,a,o,s=null,c=0;i=(n=n||{}).includeFallbackColors,a=n.level,o=n.size;for(var u=0;u<t.length;u++)(r=l.readability(e,t[u]))>c&&(c=r,s=l(t[u]));return l.isReadable(e,s,{level:a,size:o})||!i?s:(n.includeFallbackColors=!1,l.mostReadable(e,["#fff","#000"],n))};var A=l.names={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},L=l.hexNames=function(e){var t={};for(var n in e)e.hasOwnProperty(n)&&(t[e[n]]=n);return t}(A);function P(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function R(e,n){(function(e){return"string"==typeof e&&-1!=e.indexOf(".")&&1===parseFloat(e)})(e)&&(e="100%");var r=function(e){return"string"==typeof e&&-1!=e.indexOf("%")}(e);return e=o(n,s(0,parseFloat(e))),r&&(e=parseInt(e*n,10)/100),t.abs(e-n)<1e-6?1:e%n/parseFloat(n)}function C(e){return o(1,s(0,e))}function O(e){return parseInt(e,16)}function D(e){return 1==e.length?"0"+e:""+e}function N(e){return e<=1&&(e=100*e+"%"),e}function I(e){return t.round(255*parseFloat(e)).toString(16)}function z(e){return O(e)/255}var k,F,B,U=(F="[\\s|\\(]+("+(k="(?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?)")+")[,|\\s]+("+k+")[,|\\s]+("+k+")\\s*\\)?",B="[\\s|\\(]+("+k+")[,|\\s]+("+k+")[,|\\s]+("+k+")[,|\\s]+("+k+")\\s*\\)?",{CSS_UNIT:new RegExp(k),rgb:new RegExp("rgb"+F),rgba:new RegExp("rgba"+B),hsl:new RegExp("hsl"+F),hsla:new RegExp("hsla"+B),hsv:new RegExp("hsv"+F),hsva:new RegExp("hsva"+B),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/});function j(e){return!!U.CSS_UNIT.exec(e)}e.exports?e.exports=l:window.tinycolor=l}(Math)}));function Fp(e){return(Fp="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Bp(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Up(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function jp(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Hp(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?jp(Object(n),!0).forEach((function(t){Up(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):jp(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function Gp(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&Wp(e,t)}function Vp(e){return(Vp=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function Wp(e,t){return(Wp=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function qp(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}function Xp(e,t,n){return(Xp=qp()?Reflect.construct:function(e,t,n){var r=[null];r.push.apply(r,t);var i=new(Function.bind.apply(e,r));return n&&Wp(i,n.prototype),i}).apply(null,arguments)}function Yp(e,t){if(null==e)return{};var n,r,i=function(e,t){if(null==e)return{};var n,r,i={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function Zp(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function Jp(e,t){return!t||"object"!=typeof t&&"function"!=typeof t?Zp(e):t}function Qp(e){return function(){var t,n=Vp(e);if(qp()){var r=Vp(this).constructor;t=Reflect.construct(n,arguments,r)}else t=n.apply(this,arguments);return Jp(this,t)}}function Kp(e){return function(e){if(Array.isArray(e))return $p(e)}(e)||function(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return $p(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return $p(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function $p(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var ed=function e(t){t.geometry&&t.geometry.dispose(),t.material&&function e(t){t instanceof Array?t.forEach(e):(t.map&&t.map.dispose(),t.dispose())}(t.material),t.texture&&t.texture.dispose(),t.children&&t.children.forEach(e)},td=function(e){for(;e.children.length;){var t=e.children[0];e.remove(t),ed(t)}};function nd(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.objFilter,i=void 0===r?function(){return!0}:r,a=Yp(n,["objFilter"]);return Dp(e,t.children.filter(i),(function(e){return t.add(e)}),(function(e){t.remove(e),td(e)}),Hp({objBindAttr:"__threeObj"},a))}var rd=function(e){return isNaN(e)?parseInt(kp(e).toHex(),16):e},id=function(e){return isNaN(e)?kp(e).getAlpha():1},ad=function e(){var t=new Map,n=[],r=[],i=Ip;function a(e){var a=e+"",o=t.get(a);if(!o){if(i!==Ip)return i;t.set(a,o=n.push(e))}return r[(o-1)%r.length]}return a.domain=function(e){if(!arguments.length)return n.slice();n=[],t=new Map;for(const r of e){const e=r+"";t.has(e)||t.set(e,n.push(r))}return a},a.range=function(e){return arguments.length?(r=Array.from(e),a):r.slice()},a.unknown=function(e){return arguments.length?(i=e,a):i},a.copy=function(){return e(n,r).unknown(i)},Np.apply(a,arguments),a}(zp);function od(e,t,n){t&&"string"==typeof n&&e.filter((function(e){return!e[n]})).forEach((function(e){e[n]=ad(t(e))}))}var sd=window.THREE?window.THREE:{Group:ei,Mesh:Ct,MeshLambertMaterial:To,Color:Be,BufferGeometry:dt,BufferAttribute:Ye,Matrix4:R,Vector3:w,SphereBufferGeometry:no,CylinderBufferGeometry:po,TubeBufferGeometry:xa,ConeBufferGeometry:mo,Line:Gi,LineBasicMaterial:ki,QuadraticBezierCurve3:bs,CubicBezierCurve3:gs},cd={graph:xh,forcelayout:Jh,forcelayout3d:dp},ld=(new sd.BufferGeometry).setAttribute?"setAttribute":"addAttribute",ud=(new sd.BufferGeometry).applyMatrix4?"applyMatrix4":"applyMatrix";var hd,pd=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Object,n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=function(t){Gp(i,t);var r=Qp(i);function i(){var t;Bp(this,i);for(var a=arguments.length,o=new Array(a),s=0;s<a;s++)o[s]=arguments[s];return(t=r.call.apply(r,[this].concat(o))).__kapsuleInstance=e().apply(void 0,[].concat(Kp(n?[Zp(t)]:[]),o)),t}return i}(t);return Object.keys(e()).forEach((function(e){return r.prototype[e]=function(){var t,n=(t=this.__kapsuleInstance)[e].apply(t,arguments);return n===this.__kapsuleInstance?this:n}})),r}(bp({props:{jsonUrl:{onChange:function(e,t){var n=this;e&&!t.fetchingJson&&(t.fetchingJson=!0,t.onLoading(),fetch(e).then((function(e){return e.json()})).then((function(e){t.fetchingJson=!1,t.onFinishLoading(e),n.graphData(e)})))},triggerUpdate:!1},graphData:{default:{nodes:[],links:[]},onChange:function(e,t){(e.nodes.length||e.links.length)&&console.info("force-graph loading",e.nodes.length+" nodes",e.links.length+" links"),t.engineRunning=!1}},numDimensions:{default:3,onChange:function(e,t){var n=t.d3ForceLayout.force("charge");function r(e,t){e.forEach((function(e){delete e[t],delete e["v".concat(t)]}))}n&&n.strength(e>2?-60:-30),e<3&&r(t.graphData.nodes,"z"),e<2&&r(t.graphData.nodes,"y")}},dagMode:{onChange:function(e,t){!e&&"d3"===t.forceEngine&&(t.graphData.nodes||[]).forEach((function(e){return e.fx=e.fy=e.fz=void 0}))}},dagLevelDistance:{},nodeRelSize:{default:4},nodeId:{default:"id"},nodeVal:{default:"val"},nodeResolution:{default:8},nodeColor:{default:"color"},nodeAutoColorBy:{},nodeOpacity:{default:.75},nodeVisibility:{default:!0},nodeThreeObject:{},nodeThreeObjectExtend:{default:!1},linkSource:{default:"source"},linkTarget:{default:"target"},linkVisibility:{default:!0},linkColor:{default:"color"},linkAutoColorBy:{},linkOpacity:{default:.2},linkWidth:{},linkResolution:{default:6},linkCurvature:{default:0,triggerUpdate:!1},linkCurveRotation:{default:0,triggerUpdate:!1},linkMaterial:{},linkThreeObject:{},linkThreeObjectExtend:{default:!1},linkPositionUpdate:{triggerUpdate:!1},linkDirectionalArrowLength:{default:0},linkDirectionalArrowColor:{},linkDirectionalArrowRelPos:{default:.5,triggerUpdate:!1},linkDirectionalArrowResolution:{default:8},linkDirectionalParticles:{default:0},linkDirectionalParticleSpeed:{default:.01,triggerUpdate:!1},linkDirectionalParticleWidth:{default:.5},linkDirectionalParticleColor:{},linkDirectionalParticleResolution:{default:4},forceEngine:{default:"d3"},d3AlphaDecay:{default:.0228,triggerUpdate:!1,onChange:function(e,t){t.d3ForceLayout.alphaDecay(e)}},d3AlphaTarget:{default:0,triggerUpdate:!1,onChange:function(e,t){t.d3ForceLayout.alphaTarget(e)}},d3VelocityDecay:{default:.4,triggerUpdate:!1,onChange:function(e,t){t.d3ForceLayout.velocityDecay(e)}},warmupTicks:{default:0,triggerUpdate:!1},cooldownTicks:{default:1/0,triggerUpdate:!1},cooldownTime:{default:15e3,triggerUpdate:!1},onLoading:{default:function(){},triggerUpdate:!1},onFinishLoading:{default:function(){},triggerUpdate:!1},onUpdate:{default:function(){},triggerUpdate:!1},onFinishUpdate:{default:function(){},triggerUpdate:!1},onEngineTick:{default:function(){},triggerUpdate:!1},onEngineStop:{default:function(){},triggerUpdate:!1}},methods:{refresh:function(e){return e._flushObjects=!0,e._rerender(),this},d3Force:function(e,t,n){return void 0===n?e.d3ForceLayout.force(t):(e.d3ForceLayout.force(t,n),this)},d3ReheatSimulation:function(e){return e.d3ForceLayout.alpha(1),this.resetCountdown(),this},resetCountdown:function(e){return e.cntTicks=0,e.startTickTime=new Date,e.engineRunning=!0,this},tickFrame:function(e){var t,n,r,i,a="ngraph"!==e.forceEngine;return e.engineRunning&&function(){++e.cntTicks>e.cooldownTicks||new Date-e.startTickTime>e.cooldownTime?(e.engineRunning=!1,e.onEngineStop()):(e.layout[a?"tick":"step"](),e.onEngineTick());e.graphData.nodes.forEach((function(t){var n=t.__threeObj;if(n){var r=a?t:e.layout.getNodePosition(t[e.nodeId]);n.position.x=r.x,n.position.y=r.y||0,n.position.z=r.z||0}}));var t=_p(e.linkWidth),n=_p(e.linkCurvature),r=_p(e.linkCurveRotation),i=_p(e.linkThreeObjectExtend);e.graphData.links.forEach((function(o){var s=o.__lineObj;if(s){var c=a?o:e.layout.getLinkPosition(e.layout.graph.getLink(o.source,o.target).id),l=c[a?"source":"from"],u=c[a?"target":"to"];if(l&&u&&l.hasOwnProperty("x")&&u.hasOwnProperty("x")){!function(t){var i=a?t:e.layout.getLinkPosition(e.layout.graph.getLink(t.source,t.target).id),o=i[a?"source":"from"],s=i[a?"target":"to"];if(o&&s&&o.hasOwnProperty("x")&&s.hasOwnProperty("x")){var c=n(t);if(c){var l,u=new sd.Vector3(o.x,o.y||0,o.z||0),h=new sd.Vector3(s.x,s.y||0,s.z||0),p=u.distanceTo(h),d=r(t);if(p>0){var f=s.x-o.x,m=s.y-o.y||0,g=(new sd.Vector3).subVectors(h,u),v=g.clone().multiplyScalar(c).cross(0!==f||0!==m?new sd.Vector3(0,0,1):new sd.Vector3(0,1,0)).applyAxisAngle(g.normalize(),d).add((new sd.Vector3).addVectors(u,h).divideScalar(2));l=new sd.QuadraticBezierCurve3(u,v,h)}else{var y=70*c,x=-d,b=x+Math.PI/2;l=new sd.CubicBezierCurve3(u,new sd.Vector3(y*Math.cos(b),y*Math.sin(b),0).add(u),new sd.Vector3(y*Math.cos(x),y*Math.sin(x),0).add(u),h)}t.__curve=l}else t.__curve=null}}(o);var h=i(o);if(!e.linkPositionUpdate||!e.linkPositionUpdate(h?s.children[1]:s,{start:{x:l.x,y:l.y,z:l.z},end:{x:u.x,y:u.y,z:u.z}},o)||h){var p=o.__curve,d=s.children.length?s.children[0]:s;if("Line"===d.type){if(p)d.geometry.setFromPoints(p.getPoints(30));else{var f=d.geometry.getAttribute("position");f&&f.array&&6===f.array.length||d.geometry[ld]("position",f=new sd.BufferAttribute(new Float32Array(6),3)),f.array[0]=l.x,f.array[1]=l.y||0,f.array[2]=l.z||0,f.array[3]=u.x,f.array[4]=u.y||0,f.array[5]=u.z||0,f.needsUpdate=!0}d.geometry.computeBoundingSphere()}else if("Mesh"===d.type)if(p){"TubeBufferGeometry"!==d.geometry.type&&(d.position.set(0,0,0),d.rotation.set(0,0,0),d.scale.set(1,1,1));var m=Math.ceil(10*t(o))/10/2,g=new sd.TubeBufferGeometry(p,30,m,e.linkResolution,!1);d.geometry.dispose(),d.geometry=g}else{if("CylinderBufferGeometry"!==d.geometry.type){var v=Math.ceil(10*t(o))/10/2,y=new sd.CylinderBufferGeometry(v,v,1,e.linkResolution,1,!1);y[ud]((new sd.Matrix4).makeTranslation(0,.5,0)),y[ud]((new sd.Matrix4).makeRotationX(Math.PI/2)),d.geometry.dispose(),d.geometry=y}var x=new sd.Vector3(l.x,l.y||0,l.z||0),b=new sd.Vector3(u.x,u.y||0,u.z||0),_=x.distanceTo(b);d.position.x=x.x,d.position.y=x.y,d.position.z=x.z,d.scale.z=_,d.parent.localToWorld(b),d.lookAt(b)}}}}}))}(),t=_p(e.linkDirectionalArrowRelPos),n=_p(e.linkDirectionalArrowLength),r=_p(e.nodeVal),e.graphData.links.forEach((function(i){var o=i.__arrowObj;if(o){var s=a?i:e.layout.getLinkPosition(e.layout.graph.getLink(i.source,i.target).id),c=s[a?"source":"from"],l=s[a?"target":"to"];if(c&&l&&c.hasOwnProperty("x")&&l.hasOwnProperty("x")){var u=Math.sqrt(Math.max(0,r(c)||1))*e.nodeRelSize,h=Math.sqrt(Math.max(0,r(l)||1))*e.nodeRelSize,p=n(i),d=t(i),f=i.__curve?function(e){return i.__curve.getPoint(e)}:function(e){var t=function(e,t,n,r){return t[e]+(n[e]-t[e])*r||0};return{x:t("x",c,l,e),y:t("y",c,l,e),z:t("z",c,l,e)}},m=i.__curve?i.__curve.getLength():Math.sqrt(["x","y","z"].map((function(e){return Math.pow((l[e]||0)-(c[e]||0),2)})).reduce((function(e,t){return e+t}),0)),g=u+p+(m-u-h-p)*d,v=f(g/m),y=f((g-p)/m);["x","y","z"].forEach((function(e){return o.position[e]=y[e]}));var x=Xp(sd.Vector3,Kp(["x","y","z"].map((function(e){return v[e]}))));o.parent.localToWorld(x),o.lookAt(x)}}})),i=_p(e.linkDirectionalParticleSpeed),e.graphData.links.forEach((function(t){var n=t.__photonsObj&&t.__photonsObj.children,r=t.__singleHopPhotonsObj&&t.__singleHopPhotonsObj.children;if(r&&r.length||n&&n.length){var o=a?t:e.layout.getLinkPosition(e.layout.graph.getLink(t.source,t.target).id),s=o[a?"source":"from"],c=o[a?"target":"to"];if(s&&c&&s.hasOwnProperty("x")&&c.hasOwnProperty("x")){var l=i(t),u=t.__curve?function(e){return t.__curve.getPoint(e)}:function(e){var t=function(e,t,n,r){return t[e]+(n[e]-t[e])*r||0};return{x:t("x",s,c,e),y:t("y",s,c,e),z:t("z",s,c,e)}};[].concat(Kp(n||[]),Kp(r||[])).forEach((function(e,t){var r="singleHopPhotons"===e.parent.__linkThreeObjType;if(e.hasOwnProperty("__progressRatio")||(e.__progressRatio=r?0:t/n.length),e.__progressRatio+=l,e.__progressRatio>=1){if(r)return e.parent.remove(e),void td(e);e.__progressRatio=e.__progressRatio%1}var i=e.__progressRatio,a=u(i);["x","y","z"].forEach((function(t){return e.position[t]=a[t]}))}))}}})),this},emitParticle:function(e,t){if(t){if(!t.__singleHopPhotonsObj){var n=new sd.Group;n.__linkThreeObjType="singleHopPhotons",t.__singleHopPhotonsObj=n,e.graphScene.add(n)}var r=_p(e.linkDirectionalParticleWidth),i=Math.ceil(10*r(t))/10/2,a=e.linkDirectionalParticleResolution,o=new sd.SphereBufferGeometry(i,a,a),s=_p(e.linkColor),c=_p(e.linkDirectionalParticleColor)(t)||s(t)||"#f0f0f0",l=new sd.Color(rd(c)),u=3*e.linkOpacity,h=new sd.MeshLambertMaterial({color:l,transparent:!0,opacity:u});t.__singleHopPhotonsObj.add(new sd.Mesh(o,h))}return this}},stateInit:function(){return{d3ForceLayout:gh().force("link",ju()).force("charge",vh()).force("center",pu()).force("dagRadial",null).stop(),engineRunning:!1}},init:function(e,t){t.graphScene=e},update:function(e,t){var n,r,i,a,o,s=function(e){return e.some((function(e){return t.hasOwnProperty(e)}))};if(e.engineRunning=!1,e.onUpdate(),null!==e.nodeAutoColorBy&&s(["nodeAutoColorBy","graphData","nodeColor"])&&od(e.graphData.nodes,_p(e.nodeAutoColorBy),e.nodeColor),null!==e.linkAutoColorBy&&s(["linkAutoColorBy","graphData","linkColor"])&&od(e.graphData.links,_p(e.linkAutoColorBy),e.linkColor),e._flushObjects||s(["graphData","nodeThreeObject","nodeThreeObjectExtend","nodeVal","nodeColor","nodeVisibility","nodeRelSize","nodeResolution","nodeOpacity"])){var c=_p(e.nodeThreeObject),l=_p(e.nodeThreeObjectExtend),u=_p(e.nodeVal),h=_p(e.nodeColor),p=_p(e.nodeVisibility),d={},f={},m=new Set;nd(e.graphData.nodes.filter(p),e.graphScene,{purge:e._flushObjects||s(["nodeThreeObject","nodeThreeObjectExtend"]),objFilter:function(e){return"node"===e.__graphObjType},createObj:function(t){var n,r=c(t),i=l(t);return r&&e.nodeThreeObject===r&&(r=r.clone()),r&&!i?(n=r,m.add(n)):(n=new sd.Mesh,r&&i&&n.add(r)),n.__graphObjType="node",n},updateObj:function(t,n){if(!m.has(t)){var r=u(n)||1,i=Math.cbrt(r)*e.nodeRelSize,a=e.nodeResolution;"SphereBufferGeometry"===t.geometry.type&&t.geometry.parameters.radius===i&&t.geometry.parameters.widthSegments===a||(d.hasOwnProperty(r)||(d[r]=new sd.SphereBufferGeometry(i,a,a)),t.geometry.dispose(),t.geometry=d[r]);var o=h(n),s=new sd.Color(rd(o||"#ffffaa")),c=e.nodeOpacity*id(o);"MeshLambertMaterial"===t.material.type&&t.material.color.equals(s)&&t.material.opacity===c||(f.hasOwnProperty(o)||(f[o]=new sd.MeshLambertMaterial({color:s,transparent:!0,opacity:c})),t.material.dispose(),t.material=f[o])}}})}if(e._flushObjects||s(["graphData","linkThreeObject","linkThreeObjectExtend","linkMaterial","linkColor","linkWidth","linkVisibility","linkResolution","linkOpacity","linkDirectionalArrowLength","linkDirectionalArrowColor","linkDirectionalArrowResolution","linkDirectionalParticles","linkDirectionalParticleWidth","linkDirectionalParticleColor","linkDirectionalParticleResolution"])){var g=_p(e.linkThreeObject),v=_p(e.linkThreeObjectExtend),y=_p(e.linkMaterial),x=_p(e.linkVisibility),b=_p(e.linkColor),_=_p(e.linkWidth),w={},M={},S=e.graphData.links.filter(x),E=new Set;if(nd(S,e.graphScene,{objBindAttr:"__lineObj",purge:e._flushObjects||s(["linkThreeObject","linkThreeObjectExtend","linkWidth"]),objFilter:function(e){return"link"===e.__graphObjType},createObj:function(t){var n,r,i=g(t),a=v(t);if(i&&e.linkThreeObject===i&&(i=i.clone()),!i||a)if(!!_(t))n=new sd.Mesh;else{var o=new sd.BufferGeometry;o[ld]("position",new sd.BufferAttribute(new Float32Array(6),3)),n=new sd.Line(o)}return i?a?((r=new sd.Group).add(n),r.add(i)):(r=i,E.add(r)):r=n,r.renderOrder=10,r.__graphObjType="link",r},updateObj:function(t,n){if(!E.has(t)){var r=t.children.length?t.children[0]:t,i=Math.ceil(10*_(n))/10;if(!!i){var a=i/2,o=e.linkResolution;if("CylinderBufferGeometry"!==r.geometry.type||r.geometry.parameters.radiusTop!==a||r.geometry.parameters.radialSegments!==o){if(!M.hasOwnProperty(i)){var s=new sd.CylinderBufferGeometry(a,a,1,o,1,!1);s[ud]((new sd.Matrix4).makeTranslation(0,.5,0)),s[ud]((new sd.Matrix4).makeRotationX(Math.PI/2)),M[i]=s}r.geometry.dispose(),r.geometry=M[i]}}var c=y(n);if(c)r.material=c;else{var l=b(n),u=new sd.Color(rd(l||"#f0f0f0")),h=e.linkOpacity*id(l);"MeshLambertMaterial"===r.material.type&&r.material.color.equals(u)&&r.material.opacity===h||(w.hasOwnProperty(l)||(w[l]=new sd.MeshLambertMaterial({color:u,transparent:h<1,opacity:h,depthWrite:h>=1})),r.material.dispose(),r.material=w[l])}}}}),e.linkDirectionalArrowLength||t.hasOwnProperty("linkDirectionalArrowLength")){var T=_p(e.linkDirectionalArrowLength),A=_p(e.linkDirectionalArrowColor);nd(S.filter(T),e.graphScene,{objBindAttr:"__arrowObj",objFilter:function(e){return"arrow"===e.__linkThreeObjType},createObj:function(){var e=new sd.Mesh(void 0,new sd.MeshLambertMaterial({transparent:!0}));return e.__linkThreeObjType="arrow",e},updateObj:function(t,n){var r=T(n),i=e.linkDirectionalArrowResolution;if("ConeBufferGeometry"!==t.geometry.type||t.geometry.parameters.height!==r||t.geometry.parameters.radialSegments!==i){var a=new sd.ConeBufferGeometry(.25*r,r,i);a.translate(0,r/2,0),a.rotateX(Math.PI/2),t.geometry.dispose(),t.geometry=a}t.material.color=new sd.Color(A(n)||b(n)||"#f0f0f0"),t.material.opacity=3*e.linkOpacity}})}if(e.linkDirectionalParticles||t.hasOwnProperty("linkDirectionalParticles")){var L=_p(e.linkDirectionalParticles),P=_p(e.linkDirectionalParticleWidth),R=_p(e.linkDirectionalParticleColor),C={},O={};nd(S.filter(L),e.graphScene,{objBindAttr:"__photonsObj",objFilter:function(e){return"photons"===e.__linkThreeObjType},createObj:function(){var e=new sd.Group;return e.__linkThreeObjType="photons",e},updateObj:function(t,n){var r,i=Math.round(Math.abs(L(n))),a=!!t.children.length&&t.children[0],o=Math.ceil(10*P(n))/10/2,s=e.linkDirectionalParticleResolution;a&&a.geometry.parameters.radius===o&&a.geometry.parameters.widthSegments===s?r=a.geometry:(O.hasOwnProperty(o)||(O[o]=new sd.SphereBufferGeometry(o,s,s)),r=O[o],a&&a.geometry.dispose());var c,l=R(n)||b(n)||"#f0f0f0",u=new sd.Color(rd(l)),h=3*e.linkOpacity;a&&a.material.color.equals(u)&&a.material.opacity===h?c=a.material:(C.hasOwnProperty(l)||(C[l]=new sd.MeshLambertMaterial({color:u,transparent:!0,opacity:h})),c=C[l],a&&a.material.dispose()),nd(Kp(new Array(i)).map((function(e,t){return{idx:t}})),t,{idAccessor:function(e){return e.idx},createObj:function(){return new sd.Mesh(r,c)},updateObj:function(e){e.geometry=r,e.material=c}})}})}}if(e._flushObjects=!1,s(["graphData","nodeId","linkSource","linkTarget","numDimensions","forceEngine","dagMode","dagLevelDistance"])){e.engineRunning=!1,e.graphData.links.forEach((function(t){t.source=t[e.linkSource],t.target=t[e.linkTarget]}));var D,N="ngraph"!==e.forceEngine;if(N){(D=e.d3ForceLayout).stop().alpha(1).numDimensions(e.numDimensions).nodes(e.graphData.nodes);var I=e.d3ForceLayout.force("link");I&&I.id((function(t){return t[e.nodeId]})).links(e.graphData.links);var z=e.dagMode&&(n=e.graphData,r=function(t){return t[e.nodeId]},i=n.nodes,a=n.links,o={},i.forEach((function(e){return o[r(e)]={data:e,out:[],depth:-1}})),a.forEach((function(e){var t=e.source,n=e.target,i=l(t),a=l(n);if(!o.hasOwnProperty(i))throw"Missing source node with id: ".concat(i);if(!o.hasOwnProperty(a))throw"Missing target node with id: ".concat(a);var s=o[i],c=o[a];function l(e){return"object"===Fp(e)?r(e):e}s.out.push(c)})),function e(t){for(var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],i=n.length,a=0,o=t.length;a<o;a++){var s=t[a];if(-1!==n.indexOf(s)){var c=[].concat(Kp(n.slice(n.indexOf(s))),[s]).map((function(e){return r(e.data)}));throw"Invalid DAG structure! Found cycle in node path: ".concat(c.join(" -> "),".")}i>s.depth&&(s.depth=i,e(s.out,[].concat(Kp(n),[s])))}}(Object.values(o)),Object.keys(o).forEach((function(e){return o[e]=o[e].depth})),o),k=Math.max.apply(Math,Kp(Object.values(z||[]))),F=e.dagLevelDistance||e.graphData.nodes.length/(k||1)*2*(-1!==["radialin","radialout"].indexOf(e.dagMode)?.7:1);if(e.dagMode){var B=function(t,n){return function(r){return t?(z[r[e.nodeId]]-k/2)*F*(n?-1:1):void 0}},U=B(-1!==["lr","rl"].indexOf(e.dagMode),"rl"===e.dagMode),j=B(-1!==["td","bu"].indexOf(e.dagMode),"td"===e.dagMode),H=B(-1!==["zin","zout"].indexOf(e.dagMode),"zout"===e.dagMode);e.graphData.nodes.forEach((function(e){e.fx=U(e),e.fy=j(e),e.fz=H(e)}))}e.d3ForceLayout.force("dagRadial",-1!==["radialin","radialout"].indexOf(e.dagMode)?function(e,t,n,r){var i,a,o,s,c=ku(.1);function l(e){for(var c=0,l=i.length;c<l;++c){var u=i[c],h=u.x-t||1e-6,p=(u.y||0)-n||1e-6,d=(u.z||0)-r||1e-6,f=Math.sqrt(h*h+p*p+d*d),m=(s[c]-f)*o[c]*e/f;u.vx+=h*m,a>1&&(u.vy+=p*m),a>2&&(u.vz+=d*m)}}function u(){if(i){var t,n=i.length;for(o=new Array(n),s=new Array(n),t=0;t<n;++t)s[t]=+e(i[t],t,i),o[t]=isNaN(s[t])?0:+c(i[t],t,i)}}return"function"!=typeof e&&(e=ku(+e)),null==t&&(t=0),null==n&&(n=0),null==r&&(r=0),l.initialize=function(e,t){i=e,a=t,u()},l.strength=function(e){return arguments.length?(c="function"==typeof e?e:ku(+e),u(),l):c},l.radius=function(t){return arguments.length?(e="function"==typeof t?t:ku(+t),u(),l):e},l.x=function(e){return arguments.length?(t=+e,l):t},l.y=function(e){return arguments.length?(n=+e,l):n},l.z=function(e){return arguments.length?(r=+e,l):r},l}((function(t){var n=z[t[e.nodeId]];return("radialin"===e.dagMode?k-n:n)*F})).strength(1):null)}else{var G=cd.graph();e.graphData.nodes.forEach((function(t){G.addNode(t[e.nodeId])})),e.graphData.links.forEach((function(e){G.addLink(e.source,e.target)})),(D=cd["forcelayout"+(2===e.numDimensions?"":"3d")](G)).graph=G}for(var V=0;V<e.warmupTicks;V++)D[N?"tick":"step"]();e.layout=D,this.resetCountdown()}e.engineRunning=!0,e.onFinishUpdate()}}),(window.THREE?window.THREE:{Group:ei}).Group,!0),dd=window.THREE||uu,fd=hd=function(e,t){var n=this,r=-1,i=0,a=1,o=2,s=3,c=4;this.object=e,this.domElement=void 0!==t?t:document,this.enabled=!0,this.screen={left:0,top:0,width:0,height:0},this.rotateSpeed=1,this.zoomSpeed=1.2,this.panSpeed=.3,this.noRotate=!1,this.noZoom=!1,this.noPan=!1,this.staticMoving=!1,this.dynamicDampingFactor=.2,this.minDistance=0,this.maxDistance=1/0,this.keys=[65,83,68],this.target=new dd.Vector3;var l=new dd.Vector3,u=r,h=r,p=new dd.Vector3,d=new dd.Vector2,f=new dd.Vector2,m=new dd.Vector3,g=0,v=new dd.Vector2,y=new dd.Vector2,x=0,b=0,_=new dd.Vector2,w=new dd.Vector2;this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.up0=this.object.up.clone();var M={type:"change"},S={type:"start"},E={type:"end"};this.handleResize=function(){if(this.domElement===document)this.screen.left=0,this.screen.top=0,this.screen.width=window.innerWidth,this.screen.height=window.innerHeight;else{var e=this.domElement.getBoundingClientRect(),t=this.domElement.ownerDocument.documentElement;this.screen.left=e.left+window.pageXOffset-t.clientLeft,this.screen.top=e.top+window.pageYOffset-t.clientTop,this.screen.width=e.width,this.screen.height=e.height}},this.handleEvent=function(e){"function"==typeof this[e.type]&&this[e.type](e)};var T,A,L,P,R,C,O,D,N,I,z,k=(T=new dd.Vector2,function(e,t){return T.set((e-n.screen.left)/n.screen.width,(t-n.screen.top)/n.screen.height),T}),F=function(){var e=new dd.Vector2;return function(t,r){return e.set((t-.5*n.screen.width-n.screen.left)/(.5*n.screen.width),(n.screen.height+2*(n.screen.top-r))/n.screen.width),e}}();function B(e,t){return Array.isArray(e)?-1!==e.indexOf(t):e===t}function U(e){!1!==n.enabled&&(window.removeEventListener("keydown",U),h=u,u===r&&(B(n.keys[i],e.keyCode)&&!n.noRotate?u=i:B(n.keys[a],e.keyCode)&&!n.noZoom?u=a:B(n.keys[o],e.keyCode)&&!n.noPan&&(u=o)))}function j(e){!1!==n.enabled&&(u=h,window.addEventListener("keydown",U,!1))}function H(e){!1!==n.enabled&&(e.preventDefault(),e.stopPropagation(),u===r&&(u=e.button),u!==i||n.noRotate?u!==a||n.noZoom?u!==o||n.noPan||(_.copy(k(e.pageX,e.pageY)),w.copy(_)):(v.copy(k(e.pageX,e.pageY)),y.copy(v)):(f.copy(F(e.pageX,e.pageY)),d.copy(f)),document.addEventListener("mousemove",G,!1),document.addEventListener("mouseup",V,!1),n.dispatchEvent(S))}function G(e){!1!==n.enabled&&(e.preventDefault(),e.stopPropagation(),u!==i||n.noRotate?u!==a||n.noZoom?u!==o||n.noPan||w.copy(k(e.pageX,e.pageY)):y.copy(k(e.pageX,e.pageY)):(d.copy(f),f.copy(F(e.pageX,e.pageY))))}function V(e){!1!==n.enabled&&(e.preventDefault(),e.stopPropagation(),u=r,document.removeEventListener("mousemove",G),document.removeEventListener("mouseup",V),n.dispatchEvent(E))}function W(e){if(!1!==n.enabled){switch(e.preventDefault(),e.stopPropagation(),e.deltaMode){case 2:v.y-=.025*e.deltaY;break;case 1:v.y-=.01*e.deltaY;break;default:v.y-=25e-5*e.deltaY}n.dispatchEvent(S),n.dispatchEvent(E)}}function q(e){if(!1!==n.enabled){switch(e.touches.length){case 1:u=s,f.copy(F(e.touches[0].pageX,e.touches[0].pageY)),d.copy(f);break;default:u=c;var t=e.touches[0].pageX-e.touches[1].pageX,r=e.touches[0].pageY-e.touches[1].pageY;b=x=Math.sqrt(t*t+r*r);var i=(e.touches[0].pageX+e.touches[1].pageX)/2,a=(e.touches[0].pageY+e.touches[1].pageY)/2;_.copy(k(i,a)),w.copy(_)}n.dispatchEvent(S)}}function X(e){if(!1!==n.enabled)switch(e.preventDefault(),e.stopPropagation(),e.touches.length){case 1:d.copy(f),f.copy(F(e.touches[0].pageX,e.touches[0].pageY));break;default:var t=e.touches[0].pageX-e.touches[1].pageX,r=e.touches[0].pageY-e.touches[1].pageY;b=Math.sqrt(t*t+r*r);var i=(e.touches[0].pageX+e.touches[1].pageX)/2,a=(e.touches[0].pageY+e.touches[1].pageY)/2;w.copy(k(i,a))}}function Y(e){if(!1!==n.enabled){switch(e.touches.length){case 0:u=r;break;case 1:u=s,f.copy(F(e.touches[0].pageX,e.touches[0].pageY)),d.copy(f)}n.dispatchEvent(E)}}function Z(e){!1!==n.enabled&&e.preventDefault()}this.rotateCamera=(L=new dd.Vector3,P=new dd.Quaternion,R=new dd.Vector3,C=new dd.Vector3,O=new dd.Vector3,D=new dd.Vector3,function(){D.set(f.x-d.x,f.y-d.y,0),(A=D.length())?(p.copy(n.object.position).sub(n.target),R.copy(p).normalize(),C.copy(n.object.up).normalize(),O.crossVectors(C,R).normalize(),C.setLength(f.y-d.y),O.setLength(f.x-d.x),D.copy(C.add(O)),L.crossVectors(D,p).normalize(),A*=n.rotateSpeed,P.setFromAxisAngle(L,A),p.applyQuaternion(P),n.object.up.applyQuaternion(P),m.copy(L),g=A):!n.staticMoving&&g&&(g*=Math.sqrt(1-n.dynamicDampingFactor),p.copy(n.object.position).sub(n.target),P.setFromAxisAngle(m,g),p.applyQuaternion(P),n.object.up.applyQuaternion(P)),d.copy(f)}),this.zoomCamera=function(){var e;u===c?(e=x/b,x=b,p.multiplyScalar(e)):(1!==(e=1+(y.y-v.y)*n.zoomSpeed)&&e>0&&p.multiplyScalar(e),n.staticMoving?v.copy(y):v.y+=(y.y-v.y)*this.dynamicDampingFactor)},this.panCamera=(N=new dd.Vector2,I=new dd.Vector3,z=new dd.Vector3,function(){N.copy(w).sub(_),N.lengthSq()&&(N.multiplyScalar(p.length()*n.panSpeed),z.copy(p).cross(n.object.up).setLength(N.x),z.add(I.copy(n.object.up).setLength(N.y)),n.object.position.add(z),n.target.add(z),n.staticMoving?_.copy(w):_.add(N.subVectors(w,_).multiplyScalar(n.dynamicDampingFactor)))}),this.checkDistances=function(){n.noZoom&&n.noPan||(p.lengthSq()>n.maxDistance*n.maxDistance&&(n.object.position.addVectors(n.target,p.setLength(n.maxDistance)),v.copy(y)),p.lengthSq()<n.minDistance*n.minDistance&&(n.object.position.addVectors(n.target,p.setLength(n.minDistance)),v.copy(y)))},this.update=function(){p.subVectors(n.object.position,n.target),n.noRotate||n.rotateCamera(),n.noZoom||n.zoomCamera(),n.noPan||n.panCamera(),n.object.position.addVectors(n.target,p),n.checkDistances(),n.object.lookAt(n.target),l.distanceToSquared(n.object.position)>1e-6&&(n.dispatchEvent(M),l.copy(n.object.position))},this.reset=function(){u=r,h=r,n.target.copy(n.target0),n.object.position.copy(n.position0),n.object.up.copy(n.up0),p.subVectors(n.object.position,n.target),n.object.lookAt(n.target),n.dispatchEvent(M),l.copy(n.object.position)},this.dispose=function(){this.domElement.removeEventListener("contextmenu",Z,!1),this.domElement.removeEventListener("mousedown",H,!1),this.domElement.removeEventListener("wheel",W,!1),this.domElement.removeEventListener("touchstart",q,!1),this.domElement.removeEventListener("touchend",Y,!1),this.domElement.removeEventListener("touchmove",X,!1),document.removeEventListener("mousemove",G,!1),document.removeEventListener("mouseup",V,!1),window.removeEventListener("keydown",U,!1),window.removeEventListener("keyup",j,!1)},this.domElement.addEventListener("contextmenu",Z,!1),this.domElement.addEventListener("mousedown",H,!1),this.domElement.addEventListener("wheel",W,!1),this.domElement.addEventListener("touchstart",q,!1),this.domElement.addEventListener("touchend",Y,!1),this.domElement.addEventListener("touchmove",X,!1),window.addEventListener("keydown",U,!1),window.addEventListener("keyup",j,!1),this.handleResize(),this.update()};hd.prototype=Object.create(dd.EventDispatcher.prototype);function md(){return(md=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function gd(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function vd(e){return(vd=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function yd(e,t){return(yd=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function xd(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}function bd(e,t,n){return(bd=xd()?Reflect.construct:function(e,t,n){var r=[null];r.push.apply(r,t);var i=new(Function.bind.apply(e,r));return n&&yd(i,n.prototype),i}).apply(null,arguments)}function _d(e){var t="function"==typeof Map?new Map:void 0;return(_d=function(e){if(null===e||(n=e,-1===Function.toString.call(n).indexOf("[native code]")))return e;var n;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,r)}function r(){return bd(e,arguments,vd(this).constructor)}return r.prototype=Object.create(e.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),yd(r,e)})(e)}var wd={1:"Passed invalid arguments to hsl, please pass multiple numbers e.g. hsl(360, 0.75, 0.4) or an object e.g. rgb({ hue: 255, saturation: 0.4, lightness: 0.75 }).\n\n",2:"Passed invalid arguments to hsla, please pass multiple numbers e.g. hsla(360, 0.75, 0.4, 0.7) or an object e.g. rgb({ hue: 255, saturation: 0.4, lightness: 0.75, alpha: 0.7 }).\n\n",3:"Passed an incorrect argument to a color function, please pass a string representation of a color.\n\n",4:"Couldn't generate valid rgb string from %s, it returned %s.\n\n",5:"Couldn't parse the color string. Please provide the color as a string in hex, rgb, rgba, hsl or hsla notation.\n\n",6:"Passed invalid arguments to rgb, please pass multiple numbers e.g. rgb(255, 205, 100) or an object e.g. rgb({ red: 255, green: 205, blue: 100 }).\n\n",7:"Passed invalid arguments to rgba, please pass multiple numbers e.g. rgb(255, 205, 100, 0.75) or an object e.g. rgb({ red: 255, green: 205, blue: 100, alpha: 0.75 }).\n\n",8:"Passed invalid argument to toColorString, please pass a RgbColor, RgbaColor, HslColor or HslaColor object.\n\n",9:"Please provide a number of steps to the modularScale helper.\n\n",10:"Please pass a number or one of the predefined scales to the modularScale helper as the ratio.\n\n",11:'Invalid value passed as base to modularScale, expected number or em string but got "%s"\n\n',12:'Expected a string ending in "px" or a number passed as the first argument to %s(), got "%s" instead.\n\n',13:'Expected a string ending in "px" or a number passed as the second argument to %s(), got "%s" instead.\n\n',14:'Passed invalid pixel value ("%s") to %s(), please pass a value like "12px" or 12.\n\n',15:'Passed invalid base value ("%s") to %s(), please pass a value like "12px" or 12.\n\n',16:"You must provide a template to this method.\n\n",17:"You passed an unsupported selector state to this method.\n\n",18:"minScreen and maxScreen must be provided as stringified numbers with the same units.\n\n",19:"fromSize and toSize must be provided as stringified numbers with the same units.\n\n",20:"expects either an array of objects or a single object with the properties prop, fromSize, and toSize.\n\n",21:"expects the objects in the first argument array to have the properties `prop`, `fromSize`, and `toSize`.\n\n",22:"expects the first argument object to have the properties `prop`, `fromSize`, and `toSize`.\n\n",23:"fontFace expects a name of a font-family.\n\n",24:"fontFace expects either the path to the font file(s) or a name of a local copy.\n\n",25:"fontFace expects localFonts to be an array.\n\n",26:"fontFace expects fileFormats to be an array.\n\n",27:"radialGradient requries at least 2 color-stops to properly render.\n\n",28:"Please supply a filename to retinaImage() as the first argument.\n\n",29:"Passed invalid argument to triangle, please pass correct pointingDirection e.g. 'right'.\n\n",30:"Passed an invalid value to `height` or `width`. Please provide a pixel based unit.\n\n",31:"The animation shorthand only takes 8 arguments. See the specification for more information: http://mdn.io/animation\n\n",32:"To pass multiple animations please supply them in arrays, e.g. animation(['rotate', '2s'], ['move', '1s'])\nTo pass a single animation please supply them in simple values, e.g. animation('rotate', '2s')\n\n",33:"The animation shorthand arrays can only have 8 elements. See the specification for more information: http://mdn.io/animation\n\n",34:"borderRadius expects a radius value as a string or number as the second argument.\n\n",35:'borderRadius expects one of "top", "bottom", "left" or "right" as the first argument.\n\n',36:"Property must be a string value.\n\n",37:"Syntax Error at %s.\n\n",38:"Formula contains a function that needs parentheses at %s.\n\n",39:"Formula is missing closing parenthesis at %s.\n\n",40:"Formula has too many closing parentheses at %s.\n\n",41:"All values in a formula must have the same unit or be unitless.\n\n",42:"Please provide a number of steps to the modularScale helper.\n\n",43:"Please pass a number or one of the predefined scales to the modularScale helper as the ratio.\n\n",44:"Invalid value passed as base to modularScale, expected number or em/rem string but got %s.\n\n",45:"Passed invalid argument to hslToColorString, please pass a HslColor or HslaColor object.\n\n",46:"Passed invalid argument to rgbToColorString, please pass a RgbColor or RgbaColor object.\n\n",47:"minScreen and maxScreen must be provided as stringified numbers with the same units.\n\n",48:"fromSize and toSize must be provided as stringified numbers with the same units.\n\n",49:"Expects either an array of objects or a single object with the properties prop, fromSize, and toSize.\n\n",50:"Expects the objects in the first argument array to have the properties prop, fromSize, and toSize.\n\n",51:"Expects the first argument object to have the properties prop, fromSize, and toSize.\n\n",52:"fontFace expects either the path to the font file(s) or a name of a local copy.\n\n",53:"fontFace expects localFonts to be an array.\n\n",54:"fontFace expects fileFormats to be an array.\n\n",55:"fontFace expects a name of a font-family.\n\n",56:"linearGradient requries at least 2 color-stops to properly render.\n\n",57:"radialGradient requries at least 2 color-stops to properly render.\n\n",58:"Please supply a filename to retinaImage() as the first argument.\n\n",59:"Passed invalid argument to triangle, please pass correct pointingDirection e.g. 'right'.\n\n",60:"Passed an invalid value to `height` or `width`. Please provide a pixel based unit.\n\n",61:"Property must be a string value.\n\n",62:"borderRadius expects a radius value as a string or number as the second argument.\n\n",63:'borderRadius expects one of "top", "bottom", "left" or "right" as the first argument.\n\n',64:"The animation shorthand only takes 8 arguments. See the specification for more information: http://mdn.io/animation.\n\n",65:"To pass multiple animations please supply them in arrays, e.g. animation(['rotate', '2s'], ['move', '1s'])\\nTo pass a single animation please supply them in simple values, e.g. animation('rotate', '2s').\n\n",66:"The animation shorthand arrays can only have 8 elements. See the specification for more information: http://mdn.io/animation.\n\n",67:"You must provide a template to this method.\n\n",68:"You passed an unsupported selector state to this method.\n\n",69:'Expected a string ending in "px" or a number passed as the first argument to %s(), got %s instead.\n\n',70:'Expected a string ending in "px" or a number passed as the second argument to %s(), got %s instead.\n\n',71:'Passed invalid pixel value %s to %s(), please pass a value like "12px" or 12.\n\n',72:'Passed invalid base value %s to %s(), please pass a value like "12px" or 12.\n\n',73:"Please provide a valid CSS variable.\n\n",74:"CSS variable not found.\n"};function Md(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];var r,i=t[0],a=[];for(r=1;r<t.length;r+=1)a.push(t[r]);return a.forEach((function(e){i=i.replace(/%[a-z]/,e)})),i}var Sd=function(e){var t,n;function r(t){var n;if("production"===process.env.NODE_ENV)n=e.call(this,"An error occurred. See https://github.com/styled-components/polished/blob/master/src/internalHelpers/errors.md#"+t+" for more information.")||this;else{for(var r=arguments.length,i=new Array(r>1?r-1:0),a=1;a<r;a++)i[a-1]=arguments[a];n=e.call(this,Md.apply(void 0,[wd[t]].concat(i)))||this}return gd(n)}return n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n,r}(_d(Error));function Ed(e){return Math.round(255*e)}function Td(e,t,n){return Ed(e)+","+Ed(t)+","+Ed(n)}function Ad(e,t,n,r){if(void 0===r&&(r=Td),0===t)return r(n,n,n);var i=(e%360+360)%360/60,a=(1-Math.abs(2*n-1))*t,o=a*(1-Math.abs(i%2-1)),s=0,c=0,l=0;i>=0&&i<1?(s=a,c=o):i>=1&&i<2?(s=o,c=a):i>=2&&i<3?(c=a,l=o):i>=3&&i<4?(c=o,l=a):i>=4&&i<5?(s=o,l=a):i>=5&&i<6&&(s=a,l=o);var u=n-a/2;return r(s+u,c+u,l+u)}var Ld={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"00ffff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"0000ff",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"00ffff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"639",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"};var Pd=/^#[a-fA-F0-9]{6}$/,Rd=/^#[a-fA-F0-9]{8}$/,Cd=/^#[a-fA-F0-9]{3}$/,Od=/^#[a-fA-F0-9]{4}$/,Dd=/^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/i,Nd=/^rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*([-+]?[0-9]*[.]?[0-9]+)\s*\)$/i,Id=/^hsl\(\s*(\d{0,3}[.]?[0-9]+)\s*,\s*(\d{1,3}[.]?[0-9]?)%\s*,\s*(\d{1,3}[.]?[0-9]?)%\s*\)$/i,zd=/^hsla\(\s*(\d{0,3}[.]?[0-9]+)\s*,\s*(\d{1,3}[.]?[0-9]?)%\s*,\s*(\d{1,3}[.]?[0-9]?)%\s*,\s*([-+]?[0-9]*[.]?[0-9]+)\s*\)$/i;function kd(e){if("string"!=typeof e)throw new Sd(3);var t=function(e){if("string"!=typeof e)return e;var t=e.toLowerCase();return Ld[t]?"#"+Ld[t]:e}(e);if(t.match(Pd))return{red:parseInt(""+t[1]+t[2],16),green:parseInt(""+t[3]+t[4],16),blue:parseInt(""+t[5]+t[6],16)};if(t.match(Rd)){var n=parseFloat((parseInt(""+t[7]+t[8],16)/255).toFixed(2));return{red:parseInt(""+t[1]+t[2],16),green:parseInt(""+t[3]+t[4],16),blue:parseInt(""+t[5]+t[6],16),alpha:n}}if(t.match(Cd))return{red:parseInt(""+t[1]+t[1],16),green:parseInt(""+t[2]+t[2],16),blue:parseInt(""+t[3]+t[3],16)};if(t.match(Od)){var r=parseFloat((parseInt(""+t[4]+t[4],16)/255).toFixed(2));return{red:parseInt(""+t[1]+t[1],16),green:parseInt(""+t[2]+t[2],16),blue:parseInt(""+t[3]+t[3],16),alpha:r}}var i=Dd.exec(t);if(i)return{red:parseInt(""+i[1],10),green:parseInt(""+i[2],10),blue:parseInt(""+i[3],10)};var a=Nd.exec(t);if(a)return{red:parseInt(""+a[1],10),green:parseInt(""+a[2],10),blue:parseInt(""+a[3],10),alpha:parseFloat(""+a[4])};var o=Id.exec(t);if(o){var s="rgb("+Ad(parseInt(""+o[1],10),parseInt(""+o[2],10)/100,parseInt(""+o[3],10)/100)+")",c=Dd.exec(s);if(!c)throw new Sd(4,t,s);return{red:parseInt(""+c[1],10),green:parseInt(""+c[2],10),blue:parseInt(""+c[3],10)}}var l=zd.exec(t);if(l){var u="rgb("+Ad(parseInt(""+l[1],10),parseInt(""+l[2],10)/100,parseInt(""+l[3],10)/100)+")",h=Dd.exec(u);if(!h)throw new Sd(4,t,u);return{red:parseInt(""+h[1],10),green:parseInt(""+h[2],10),blue:parseInt(""+h[3],10),alpha:parseFloat(""+l[4])}}throw new Sd(5)}var Fd=function(e){return 7===e.length&&e[1]===e[2]&&e[3]===e[4]&&e[5]===e[6]?"#"+e[1]+e[3]+e[5]:e};function Bd(e){var t=e.toString(16);return 1===t.length?"0"+t:t}function Ud(e,t,n){if("number"==typeof e&&"number"==typeof t&&"number"==typeof n)return Fd("#"+Bd(e)+Bd(t)+Bd(n));if("object"==typeof e&&void 0===t&&void 0===n)return Fd("#"+Bd(e.red)+Bd(e.green)+Bd(e.blue));throw new Sd(6)}function jd(e){return function e(t,n,r){return function(){var i=r.concat(Array.prototype.slice.call(arguments));return i.length>=n?t.apply(this,i):e(t,n,i)}}(e,e.length,[])}function Hd(e,t){if("transparent"===t)return t;var n,r,i,a=kd(t),o="number"==typeof a.alpha?a.alpha:1;return function(e,t,n,r){if("string"==typeof e&&"number"==typeof t){var i=kd(e);return"rgba("+i.red+","+i.green+","+i.blue+","+t+")"}if("number"==typeof e&&"number"==typeof t&&"number"==typeof n&&"number"==typeof r)return r>=1?Ud(e,t,n):"rgba("+e+","+t+","+n+","+r+")";if("object"==typeof e&&void 0===t&&void 0===n&&void 0===r)return e.alpha>=1?Ud(e.red,e.green,e.blue):"rgba("+e.red+","+e.green+","+e.blue+","+e.alpha+")";throw new Sd(7)}(md({},a,{alpha:(n=0,r=1,i=(100*o+100*parseFloat(e))/100,Math.max(n,Math.min(r,i)))}))}var Gd=jd(Hd),Vd=function(){this._tweens={},this._tweensAddedDuringUpdate={}};Vd.prototype={getAll:function(){return Object.keys(this._tweens).map(function(e){return this._tweens[e]}.bind(this))},removeAll:function(){this._tweens={}},add:function(e){this._tweens[e.getId()]=e,this._tweensAddedDuringUpdate[e.getId()]=e},remove:function(e){delete this._tweens[e.getId()],delete this._tweensAddedDuringUpdate[e.getId()]},update:function(e,t){var n=Object.keys(this._tweens);if(0===n.length)return!1;for(e=void 0!==e?e:qd.now();n.length>0;){this._tweensAddedDuringUpdate={};for(var r=0;r<n.length;r++){var i=this._tweens[n[r]];i&&!1===i.update(e)&&(i._isPlaying=!1,t||delete this._tweens[n[r]])}n=Object.keys(this._tweensAddedDuringUpdate)}return!0}};var Wd,qd=new Vd;qd.Group=Vd,qd._nextId=0,qd.nextId=function(){return qd._nextId++},"undefined"==typeof self&&"undefined"!=typeof process&&process.hrtime?qd.now=function(){var e=process.hrtime();return 1e3*e[0]+e[1]/1e6}:"undefined"!=typeof self&&void 0!==self.performance&&void 0!==self.performance.now?qd.now=self.performance.now.bind(self.performance):void 0!==Date.now?qd.now=Date.now:qd.now=function(){return(new Date).getTime()},qd.Tween=function(e,t){this._isPaused=!1,this._pauseStart=null,this._object=e,this._valuesStart={},this._valuesEnd={},this._valuesStartRepeat={},this._duration=1e3,this._repeat=0,this._repeatDelayTime=void 0,this._yoyo=!1,this._isPlaying=!1,this._reversed=!1,this._delayTime=0,this._startTime=null,this._easingFunction=qd.Easing.Linear.None,this._interpolationFunction=qd.Interpolation.Linear,this._chainedTweens=[],this._onStartCallback=null,this._onStartCallbackFired=!1,this._onUpdateCallback=null,this._onRepeatCallback=null,this._onCompleteCallback=null,this._onStopCallback=null,this._group=t||qd,this._id=qd.nextId()},qd.Tween.prototype={getId:function(){return this._id},isPlaying:function(){return this._isPlaying},isPaused:function(){return this._isPaused},to:function(e,t){return this._valuesEnd=Object.create(e),void 0!==t&&(this._duration=t),this},duration:function(e){return this._duration=e,this},start:function(e){for(var t in this._group.add(this),this._isPlaying=!0,this._isPaused=!1,this._onStartCallbackFired=!1,this._startTime=void 0!==e?"string"==typeof e?qd.now()+parseFloat(e):e:qd.now(),this._startTime+=this._delayTime,this._valuesEnd){if(this._valuesEnd[t]instanceof Array){if(0===this._valuesEnd[t].length)continue;this._valuesEnd[t]=[this._object[t]].concat(this._valuesEnd[t])}void 0!==this._object[t]&&(void 0===this._valuesStart[t]&&(this._valuesStart[t]=this._object[t]),this._valuesStart[t]instanceof Array==!1&&(this._valuesStart[t]*=1),this._valuesStartRepeat[t]=this._valuesStart[t]||0)}return this},stop:function(){return this._isPlaying?(this._group.remove(this),this._isPlaying=!1,this._isPaused=!1,null!==this._onStopCallback&&this._onStopCallback(this._object),this.stopChainedTweens(),this):this},end:function(){return this.update(1/0),this},pause:function(e){return this._isPaused||!this._isPlaying||(this._isPaused=!0,this._pauseStart=void 0===e?qd.now():e,this._group.remove(this)),this},resume:function(e){return this._isPaused&&this._isPlaying?(this._isPaused=!1,this._startTime+=(void 0===e?qd.now():e)-this._pauseStart,this._pauseStart=0,this._group.add(this),this):this},stopChainedTweens:function(){for(var e=0,t=this._chainedTweens.length;e<t;e++)this._chainedTweens[e].stop()},group:function(e){return this._group=e,this},delay:function(e){return this._delayTime=e,this},repeat:function(e){return this._repeat=e,this},repeatDelay:function(e){return this._repeatDelayTime=e,this},yoyo:function(e){return this._yoyo=e,this},easing:function(e){return this._easingFunction=e,this},interpolation:function(e){return this._interpolationFunction=e,this},chain:function(){return this._chainedTweens=arguments,this},onStart:function(e){return this._onStartCallback=e,this},onUpdate:function(e){return this._onUpdateCallback=e,this},onRepeat:function(e){return this._onRepeatCallback=e,this},onComplete:function(e){return this._onCompleteCallback=e,this},onStop:function(e){return this._onStopCallback=e,this},update:function(e){var t,n,r;if(e<this._startTime)return!0;for(t in!1===this._onStartCallbackFired&&(null!==this._onStartCallback&&this._onStartCallback(this._object),this._onStartCallbackFired=!0),n=(e-this._startTime)/this._duration,n=0===this._duration||n>1?1:n,r=this._easingFunction(n),this._valuesEnd)if(void 0!==this._valuesStart[t]){var i=this._valuesStart[t]||0,a=this._valuesEnd[t];a instanceof Array?this._object[t]=this._interpolationFunction(a,r):("string"==typeof a&&(a="+"===a.charAt(0)||"-"===a.charAt(0)?i+parseFloat(a):parseFloat(a)),"number"==typeof a&&(this._object[t]=i+(a-i)*r))}if(null!==this._onUpdateCallback&&this._onUpdateCallback(this._object,n),1===n){if(this._repeat>0){for(t in isFinite(this._repeat)&&this._repeat--,this._valuesStartRepeat){if("string"==typeof this._valuesEnd[t]&&(this._valuesStartRepeat[t]=this._valuesStartRepeat[t]+parseFloat(this._valuesEnd[t])),this._yoyo){var o=this._valuesStartRepeat[t];this._valuesStartRepeat[t]=this._valuesEnd[t],this._valuesEnd[t]=o}this._valuesStart[t]=this._valuesStartRepeat[t]}return this._yoyo&&(this._reversed=!this._reversed),void 0!==this._repeatDelayTime?this._startTime=e+this._repeatDelayTime:this._startTime=e+this._delayTime,null!==this._onRepeatCallback&&this._onRepeatCallback(this._object),!0}null!==this._onCompleteCallback&&this._onCompleteCallback(this._object);for(var s=0,c=this._chainedTweens.length;s<c;s++)this._chainedTweens[s].start(this._startTime+this._duration);return!1}return!0}},qd.Easing={Linear:{None:function(e){return e}},Quadratic:{In:function(e){return e*e},Out:function(e){return e*(2-e)},InOut:function(e){return(e*=2)<1?.5*e*e:-.5*(--e*(e-2)-1)}},Cubic:{In:function(e){return e*e*e},Out:function(e){return--e*e*e+1},InOut:function(e){return(e*=2)<1?.5*e*e*e:.5*((e-=2)*e*e+2)}},Quartic:{In:function(e){return e*e*e*e},Out:function(e){return 1- --e*e*e*e},InOut:function(e){return(e*=2)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2)}},Quintic:{In:function(e){return e*e*e*e*e},Out:function(e){return--e*e*e*e*e+1},InOut:function(e){return(e*=2)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2)}},Sinusoidal:{In:function(e){return 1-Math.cos(e*Math.PI/2)},Out:function(e){return Math.sin(e*Math.PI/2)},InOut:function(e){return.5*(1-Math.cos(Math.PI*e))}},Exponential:{In:function(e){return 0===e?0:Math.pow(1024,e-1)},Out:function(e){return 1===e?1:1-Math.pow(2,-10*e)},InOut:function(e){return 0===e?0:1===e?1:(e*=2)<1?.5*Math.pow(1024,e-1):.5*(2-Math.pow(2,-10*(e-1)))}},Circular:{In:function(e){return 1-Math.sqrt(1-e*e)},Out:function(e){return Math.sqrt(1- --e*e)},InOut:function(e){return(e*=2)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1)}},Elastic:{In:function(e){return 0===e?0:1===e?1:-Math.pow(2,10*(e-1))*Math.sin(5*(e-1.1)*Math.PI)},Out:function(e){return 0===e?0:1===e?1:Math.pow(2,-10*e)*Math.sin(5*(e-.1)*Math.PI)+1},InOut:function(e){return 0===e?0:1===e?1:(e*=2)<1?-.5*Math.pow(2,10*(e-1))*Math.sin(5*(e-1.1)*Math.PI):.5*Math.pow(2,-10*(e-1))*Math.sin(5*(e-1.1)*Math.PI)+1}},Back:{In:function(e){var t=1.70158;return e*e*((t+1)*e-t)},Out:function(e){var t=1.70158;return--e*e*((t+1)*e+t)+1},InOut:function(e){var t=2.5949095;return(e*=2)<1?e*e*((t+1)*e-t)*.5:.5*((e-=2)*e*((t+1)*e+t)+2)}},Bounce:{In:function(e){return 1-qd.Easing.Bounce.Out(1-e)},Out:function(e){return e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375},InOut:function(e){return e<.5?.5*qd.Easing.Bounce.In(2*e):.5*qd.Easing.Bounce.Out(2*e-1)+.5}}},qd.Interpolation={Linear:function(e,t){var n=e.length-1,r=n*t,i=Math.floor(r),a=qd.Interpolation.Utils.Linear;return t<0?a(e[0],e[1],r):t>1?a(e[n],e[n-1],n-r):a(e[i],e[i+1>n?n:i+1],r-i)},Bezier:function(e,t){for(var n=0,r=e.length-1,i=Math.pow,a=qd.Interpolation.Utils.Bernstein,o=0;o<=r;o++)n+=i(1-t,r-o)*i(t,o)*e[o]*a(r,o);return n},CatmullRom:function(e,t){var n=e.length-1,r=n*t,i=Math.floor(r),a=qd.Interpolation.Utils.CatmullRom;return e[0]===e[n]?(t<0&&(i=Math.floor(r=n*(1+t))),a(e[(i-1+n)%n],e[i],e[(i+1)%n],e[(i+2)%n],r-i)):t<0?e[0]-(a(e[0],e[0],e[1],e[1],-r)-e[0]):t>1?e[n]-(a(e[n],e[n],e[n-1],e[n-1],r-n)-e[n]):a(e[i?i-1:0],e[i],e[n<i+1?n:i+1],e[n<i+2?n:i+2],r-i)},Utils:{Linear:function(e,t,n){return(t-e)*n+e},Bernstein:function(e,t){var n=qd.Interpolation.Utils.Factorial;return n(e)/n(t)/n(e-t)},Factorial:(Wd=[1],function(e){var t=1;if(Wd[e])return Wd[e];for(var n=e;n>1;n--)t*=n;return Wd[e]=t,t}),CatmullRom:function(e,t,n,r,i){var a=.5*(n-e),o=.5*(r-t),s=i*i;return(2*t-2*n+a+o)*(i*s)+(-3*t+3*n-2*a-o)*s+a*i+t}}},qd.version="18.5.0";!function(e,t){void 0===t&&(t={});var n=t.insertAt;if(e&&"undefined"!=typeof document){var r=document.head||document.getElementsByTagName("head")[0],i=document.createElement("style");i.type="text/css","top"===n&&r.firstChild?r.insertBefore(i,r.firstChild):r.appendChild(i),i.styleSheet?i.styleSheet.cssText=e:i.appendChild(document.createTextNode(e))}}(".scene-nav-info {\n  bottom: 5px;\n  width: 100%;\n  text-align: center;\n  color: slategrey;\n  opacity: 0.7;\n  font-size: 10px;\n}\n\n.scene-tooltip {\n  color: lavender;\n  font-size: 15px;\n}\n\n.scene-nav-info, .scene-tooltip {\n  position: absolute;\n  font-family: sans-serif;\n  pointer-events: none;\n}");var Xd=window.THREE?window.THREE:{WebGLRenderer:ni,Scene:Z,PerspectiveCamera:qt,Raycaster:Fc,TextureLoader:ns,Vector2:h,Vector3:w,Color:Be,Mesh:Ct,SphereGeometry:to,MeshBasicMaterial:qe,BackSide:1,EventDispatcher:o,MOUSE:a,Quaternion:x,Spherical:jc,Clock:lc},Yd=function(e){function t(t,n){var r,i,a,o,s;this.object=t,this.domElement=void 0!==n?n:document,this.enabled=!0,this.target=new e.Vector3,this.minDistance=0,this.maxDistance=1/0,this.minZoom=0,this.maxZoom=1/0,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.enableDamping=!1,this.dampingFactor=.25,this.enableZoom=!0,this.zoomSpeed=1,this.enableRotate=!0,this.rotateSpeed=1,this.enablePan=!0,this.keyPanSpeed=7,this.autoRotate=!1,this.autoRotateSpeed=2,this.enableKeys=!0,this.keys={LEFT:37,UP:38,RIGHT:39,BOTTOM:40},this.mouseButtons={ORBIT:e.MOUSE.LEFT,ZOOM:e.MOUSE.MIDDLE,PAN:e.MOUSE.RIGHT},this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object.zoom,this.getPolarAngle=function(){return m.phi},this.getAzimuthalAngle=function(){return m.theta},this.reset=function(){c.target.copy(c.target0),c.object.position.copy(c.position0),c.object.zoom=c.zoom0,c.object.updateProjectionMatrix(),c.dispatchEvent(l),c.update(),d=p.NONE},this.update=(r=new e.Vector3,i=(new e.Quaternion).setFromUnitVectors(t.up,new e.Vector3(0,1,0)),a=i.clone().inverse(),o=new e.Vector3,s=new e.Quaternion,function(){var e=c.object.position;return r.copy(e).sub(c.target),r.applyQuaternion(i),m.setFromVector3(r),c.autoRotate&&d===p.NONE&&R(2*Math.PI/60/60*c.autoRotateSpeed),m.theta+=g.theta,m.phi+=g.phi,m.theta=Math.max(c.minAzimuthAngle,Math.min(c.maxAzimuthAngle,m.theta)),m.phi=Math.max(c.minPolarAngle,Math.min(c.maxPolarAngle,m.phi)),m.makeSafe(),m.radius*=v,m.radius=Math.max(c.minDistance,Math.min(c.maxDistance,m.radius)),c.target.add(y),r.setFromSpherical(m),r.applyQuaternion(a),e.copy(c.target).add(r),c.object.lookAt(c.target),!0===c.enableDamping?(g.theta*=1-c.dampingFactor,g.phi*=1-c.dampingFactor):g.set(0,0,0),v=1,y.set(0,0,0),!!(x||o.distanceToSquared(c.object.position)>f||8*(1-s.dot(c.object.quaternion))>f)&&(c.dispatchEvent(l),o.copy(c.object.position),s.copy(c.object.quaternion),x=!1,!0)}),this.dispose=function(){c.domElement.removeEventListener("contextmenu",q,!1),c.domElement.removeEventListener("mousedown",F,!1),c.domElement.removeEventListener("wheel",j,!1),c.domElement.removeEventListener("touchstart",G,!1),c.domElement.removeEventListener("touchend",W,!1),c.domElement.removeEventListener("touchmove",V,!1),document.removeEventListener("mousemove",B,!1),document.removeEventListener("mouseup",U,!1),window.removeEventListener("keydown",H,!1)};var c=this,l={type:"change"},u={type:"start"},h={type:"end"},p={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_DOLLY:4,TOUCH_PAN:5},d=p.NONE,f=1e-6,m=new e.Spherical,g=new e.Spherical,v=1,y=new e.Vector3,x=!1,b=new e.Vector2,_=new e.Vector2,w=new e.Vector2,M=new e.Vector2,S=new e.Vector2,E=new e.Vector2,T=new e.Vector2,A=new e.Vector2,L=new e.Vector2;function P(){return Math.pow(.95,c.zoomSpeed)}function R(e){g.theta-=e}function C(e){g.phi-=e}var O,D=(O=new e.Vector3,function(e,t){O.setFromMatrixColumn(t,0),O.multiplyScalar(-e),y.add(O)}),N=function(){var t=new e.Vector3;return function(e,n){t.setFromMatrixColumn(n,1),t.multiplyScalar(e),y.add(t)}}(),I=function(){var t=new e.Vector3;return function(n,r){var i=c.domElement===document?c.domElement.body:c.domElement;if(c.object instanceof e.PerspectiveCamera){var a=c.object.position;t.copy(a).sub(c.target);var o=t.length();o*=Math.tan(c.object.fov/2*Math.PI/180),D(2*n*o/i.clientHeight,c.object.matrix),N(2*r*o/i.clientHeight,c.object.matrix)}else c.object instanceof e.OrthographicCamera?(D(n*(c.object.right-c.object.left)/c.object.zoom/i.clientWidth,c.object.matrix),N(r*(c.object.top-c.object.bottom)/c.object.zoom/i.clientHeight,c.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),c.enablePan=!1)}}();function z(t){c.object instanceof e.PerspectiveCamera?v/=t:c.object instanceof e.OrthographicCamera?(c.object.zoom=Math.max(c.minZoom,Math.min(c.maxZoom,c.object.zoom*t)),c.object.updateProjectionMatrix(),x=!0):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),c.enableZoom=!1)}function k(t){c.object instanceof e.PerspectiveCamera?v*=t:c.object instanceof e.OrthographicCamera?(c.object.zoom=Math.max(c.minZoom,Math.min(c.maxZoom,c.object.zoom/t)),c.object.updateProjectionMatrix(),x=!0):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),c.enableZoom=!1)}function F(e){if(!1!==c.enabled){if(e.preventDefault(),e.button===c.mouseButtons.ORBIT){if(!1===c.enableRotate)return;!function(e){b.set(e.clientX,e.clientY)}(e),d=p.ROTATE}else if(e.button===c.mouseButtons.ZOOM){if(!1===c.enableZoom)return;!function(e){T.set(e.clientX,e.clientY)}(e),d=p.DOLLY}else if(e.button===c.mouseButtons.PAN){if(!1===c.enablePan)return;!function(e){M.set(e.clientX,e.clientY)}(e),d=p.PAN}d!==p.NONE&&(document.addEventListener("mousemove",B,!1),document.addEventListener("mouseup",U,!1),c.dispatchEvent(u))}}function B(e){if(!1!==c.enabled)if(e.preventDefault(),d===p.ROTATE){if(!1===c.enableRotate)return;!function(e){_.set(e.clientX,e.clientY),w.subVectors(_,b);var t=c.domElement===document?c.domElement.body:c.domElement;R(2*Math.PI*w.x/t.clientWidth*c.rotateSpeed),C(2*Math.PI*w.y/t.clientHeight*c.rotateSpeed),b.copy(_),c.update()}(e)}else if(d===p.DOLLY){if(!1===c.enableZoom)return;!function(e){A.set(e.clientX,e.clientY),L.subVectors(A,T),L.y>0?z(P()):L.y<0&&k(P()),T.copy(A),c.update()}(e)}else if(d===p.PAN){if(!1===c.enablePan)return;!function(e){S.set(e.clientX,e.clientY),E.subVectors(S,M),I(E.x,E.y),M.copy(S),c.update()}(e)}}function U(e){!1!==c.enabled&&(document.removeEventListener("mousemove",B,!1),document.removeEventListener("mouseup",U,!1),c.dispatchEvent(h),d=p.NONE)}function j(e){!1===c.enabled||!1===c.enableZoom||d!==p.NONE&&d!==p.ROTATE||(e.preventDefault(),e.stopPropagation(),function(e){e.deltaY<0?k(P()):e.deltaY>0&&z(P()),c.update()}(e),c.dispatchEvent(u),c.dispatchEvent(h))}function H(e){!1!==c.enabled&&!1!==c.enableKeys&&!1!==c.enablePan&&function(e){switch(e.keyCode){case c.keys.UP:I(0,c.keyPanSpeed),c.update();break;case c.keys.BOTTOM:I(0,-c.keyPanSpeed),c.update();break;case c.keys.LEFT:I(c.keyPanSpeed,0),c.update();break;case c.keys.RIGHT:I(-c.keyPanSpeed,0),c.update()}}(e)}function G(e){if(!1!==c.enabled){switch(e.touches.length){case 1:if(!1===c.enableRotate)return;!function(e){b.set(e.touches[0].pageX,e.touches[0].pageY)}(e),d=p.TOUCH_ROTATE;break;case 2:if(!1===c.enableZoom)return;!function(e){var t=e.touches[0].pageX-e.touches[1].pageX,n=e.touches[0].pageY-e.touches[1].pageY,r=Math.sqrt(t*t+n*n);T.set(0,r)}(e),d=p.TOUCH_DOLLY;break;case 3:if(!1===c.enablePan)return;!function(e){M.set(e.touches[0].pageX,e.touches[0].pageY)}(e),d=p.TOUCH_PAN;break;default:d=p.NONE}d!==p.NONE&&c.dispatchEvent(u)}}function V(e){if(!1!==c.enabled)switch(e.preventDefault(),e.stopPropagation(),e.touches.length){case 1:if(!1===c.enableRotate)return;if(d!==p.TOUCH_ROTATE)return;!function(e){_.set(e.touches[0].pageX,e.touches[0].pageY),w.subVectors(_,b);var t=c.domElement===document?c.domElement.body:c.domElement;R(2*Math.PI*w.x/t.clientWidth*c.rotateSpeed),C(2*Math.PI*w.y/t.clientHeight*c.rotateSpeed),b.copy(_),c.update()}(e);break;case 2:if(!1===c.enableZoom)return;if(d!==p.TOUCH_DOLLY)return;!function(e){var t=e.touches[0].pageX-e.touches[1].pageX,n=e.touches[0].pageY-e.touches[1].pageY,r=Math.sqrt(t*t+n*n);A.set(0,r),L.subVectors(A,T),L.y>0?k(P()):L.y<0&&z(P()),T.copy(A),c.update()}(e);break;case 3:if(!1===c.enablePan)return;if(d!==p.TOUCH_PAN)return;!function(e){S.set(e.touches[0].pageX,e.touches[0].pageY),E.subVectors(S,M),I(E.x,E.y),M.copy(S),c.update()}(e);break;default:d=p.NONE}}function W(e){!1!==c.enabled&&(c.dispatchEvent(h),d=p.NONE)}function q(e){e.preventDefault()}c.domElement.addEventListener("contextmenu",q,!1),c.domElement.addEventListener("mousedown",F,!1),c.domElement.addEventListener("wheel",j,!1),c.domElement.addEventListener("touchstart",G,!1),c.domElement.addEventListener("touchend",W,!1),c.domElement.addEventListener("touchmove",V,!1),window.addEventListener("keydown",H,!1),this.update()}return t.prototype=Object.create(e.EventDispatcher.prototype),t.prototype.constructor=t,Object.defineProperties(t.prototype,{center:{get:function(){return console.warn("THREE.OrbitControls: .center has been renamed to .target"),this.target}},noZoom:{get:function(){return console.warn("THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead."),!this.enableZoom},set:function(e){console.warn("THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead."),this.enableZoom=!e}},noRotate:{get:function(){return console.warn("THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead."),!this.enableRotate},set:function(e){console.warn("THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead."),this.enableRotate=!e}},noPan:{get:function(){return console.warn("THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead."),!this.enablePan},set:function(e){console.warn("THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead."),this.enablePan=!e}},noKeys:{get:function(){return console.warn("THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead."),!this.enableKeys},set:function(e){console.warn("THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead."),this.enableKeys=!e}},staticMoving:{get:function(){return console.warn("THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead."),!this.enableDamping},set:function(e){console.warn("THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead."),this.enableDamping=!e}},dynamicDampingFactor:{get:function(){return console.warn("THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead."),this.dampingFactor},set:function(e){console.warn("THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead."),this.dampingFactor=e}}}),t}(Xd),Zd=(function(e){e.FlyControls=function(t,n,r){function i(e,t){return function(){t.apply(e,arguments)}}function a(e){e.preventDefault()}this.object=t,this.domElement=void 0!==n?n:document,n&&this.domElement.setAttribute("tabindex",-1),this.movementSpeed=1,this.rollSpeed=.005,this.dragToLook=!1,this.autoForward=!1,this.tmpQuaternion=new e.Quaternion,this.mouseStatus=0,this.moveState={up:0,down:0,left:0,right:0,forward:0,back:0,pitchUp:0,pitchDown:0,yawLeft:0,yawRight:0,rollLeft:0,rollRight:0},this.moveVector=new e.Vector3(0,0,0),this.rotationVector=new e.Vector3(0,0,0),this.keydown=function(e){if(!e.altKey){switch(e.keyCode){case 16:this.movementSpeedMultiplier=.1;break;case 87:this.moveState.forward=1;break;case 83:this.moveState.back=1;break;case 65:this.moveState.left=1;break;case 68:this.moveState.right=1;break;case 82:this.moveState.up=1;break;case 70:this.moveState.down=1;break;case 38:this.moveState.pitchUp=1;break;case 40:this.moveState.pitchDown=1;break;case 37:this.moveState.yawLeft=1;break;case 39:this.moveState.yawRight=1;break;case 81:this.moveState.rollLeft=1;break;case 69:this.moveState.rollRight=1}this.updateMovementVector(),this.updateRotationVector()}},this.keyup=function(e){switch(e.keyCode){case 16:this.movementSpeedMultiplier=1;break;case 87:this.moveState.forward=0;break;case 83:this.moveState.back=0;break;case 65:this.moveState.left=0;break;case 68:this.moveState.right=0;break;case 82:this.moveState.up=0;break;case 70:this.moveState.down=0;break;case 38:this.moveState.pitchUp=0;break;case 40:this.moveState.pitchDown=0;break;case 37:this.moveState.yawLeft=0;break;case 39:this.moveState.yawRight=0;break;case 81:this.moveState.rollLeft=0;break;case 69:this.moveState.rollRight=0}this.updateMovementVector(),this.updateRotationVector()},this.mousedown=function(e){if(this.domElement!==document&&this.domElement.focus(),e.preventDefault(),e.stopPropagation(),this.dragToLook)this.mouseStatus++;else{switch(e.button){case 0:this.moveState.forward=1;break;case 2:this.moveState.back=1}this.updateMovementVector()}},this.mousemove=function(e){if(!this.dragToLook||this.mouseStatus>0){var t=this.getContainerDimensions(),n=t.size[0]/2,r=t.size[1]/2;this.moveState.yawLeft=-(e.pageX-t.offset[0]-n)/n,this.moveState.pitchDown=(e.pageY-t.offset[1]-r)/r,this.updateRotationVector()}},this.mouseup=function(e){if(e.preventDefault(),e.stopPropagation(),this.dragToLook)this.mouseStatus--,this.moveState.yawLeft=this.moveState.pitchDown=0;else{switch(e.button){case 0:this.moveState.forward=0;break;case 2:this.moveState.back=0}this.updateMovementVector()}this.updateRotationVector()},this.update=function(e){var t=e*this.movementSpeed,n=e*this.rollSpeed;this.object.translateX(this.moveVector.x*t),this.object.translateY(this.moveVector.y*t),this.object.translateZ(this.moveVector.z*t),this.tmpQuaternion.set(this.rotationVector.x*n,this.rotationVector.y*n,this.rotationVector.z*n,1).normalize(),this.object.quaternion.multiply(this.tmpQuaternion),this.object.rotation.setFromQuaternion(this.object.quaternion,this.object.rotation.order)},this.updateMovementVector=function(){var e=this.moveState.forward||this.autoForward&&!this.moveState.back?1:0;this.moveVector.x=-this.moveState.left+this.moveState.right,this.moveVector.y=-this.moveState.down+this.moveState.up,this.moveVector.z=-e+this.moveState.back},this.updateRotationVector=function(){this.rotationVector.x=-this.moveState.pitchDown+this.moveState.pitchUp,this.rotationVector.y=-this.moveState.yawRight+this.moveState.yawLeft,this.rotationVector.z=-this.moveState.rollRight+this.moveState.rollLeft},this.getContainerDimensions=function(){return this.domElement!=document?{size:[this.domElement.offsetWidth,this.domElement.offsetHeight],offset:[this.domElement.offsetLeft,this.domElement.offsetTop]}:{size:[window.innerWidth,window.innerHeight],offset:[0,0]}},this.dispose=function(){this.domElement.removeEventListener("contextmenu",a,!1),this.domElement.removeEventListener("mousedown",s,!1),this.domElement.removeEventListener("mousemove",o,!1),this.domElement.removeEventListener("mouseup",c,!1),window.removeEventListener("keydown",l,!1),window.removeEventListener("keyup",u,!1)};var o=i(this,this.mousemove),s=i(this,this.mousedown),c=i(this,this.mouseup),l=i(this,this.keydown),u=i(this,this.keyup);this.domElement.addEventListener("contextmenu",a,!1),this.domElement.addEventListener("mousemove",o,!1),this.domElement.addEventListener("mousedown",s,!1),this.domElement.addEventListener("mouseup",c,!1),window.addEventListener("keydown",l,!1),window.addEventListener("keyup",u,!1),this.updateMovementVector(),this.updateRotationVector()}}(Xd),Xd.FlyControls),Jd=bp({props:{width:{default:window.innerWidth,onChange:function(e,t,n){isNaN(e)&&(t.width=n)}},height:{default:window.innerHeight,onChange:function(e,t,n){isNaN(e)&&(t.height=n)}},backgroundColor:{default:"#000011"},backgroundImageUrl:{},onBackgroundImageLoaded:{},showNavInfo:{default:!0},skyRadius:{default:5e4},objects:{default:[]},postProcessingComposer:{triggerUpdate:!1},enablePointerInteraction:{default:!0,onChange:function(e,t){t.hoverObj=null,t.toolTipElem&&(t.toolTipElem.innerHTML="")},triggerUpdate:!1},lineHoverPrecision:{default:1,triggerUpdate:!1},hoverOrderComparator:{default:function(){return-1},triggerUpdate:!1},tooltipContent:{triggerUpdate:!1},hoverDuringDrag:{default:!1,triggerUpdate:!1},onHover:{default:function(){},triggerUpdate:!1},onClick:{default:function(){},triggerUpdate:!1},onRightClick:{triggerUpdate:!1}},methods:{tick:function(e){if(e.initialised){if(e.controls.update&&e.controls.update(e.clock.getDelta()),e.postProcessingComposer?e.postProcessingComposer.render():e.renderer.render(e.scene,e.camera),e.enablePointerInteraction){var t=null;if(e.hoverDuringDrag||!e.controlsDragging){var n=new Xd.Raycaster;n.params.Line.threshold=e.lineHoverPrecision,n.setFromCamera(e.mousePos,e.camera);var r=n.intersectObjects(e.objects,!0).map((function(e){return e.object})).sort(e.hoverOrderComparator);t=r.length?r[0]:null}t!==e.hoverObj&&(e.onHover(t,e.hoverObj),e.toolTipElem.innerHTML=t&&_p(e.tooltipContent)(t)||"",e.hoverObj=t)}qd.update()}return this},cameraPosition:function(e,t,n,r){var i=e.camera;if(t&&e.initialised){var a=t,o=n||{x:0,y:0,z:0};if(r){var s=Object.assign({},i.position),c=h();new qd.Tween(s).to(a,r).easing(qd.Easing.Quadratic.Out).onUpdate(l).start(),new qd.Tween(c).to(o,r/3).easing(qd.Easing.Quadratic.Out).onUpdate(u).start()}else l(a),u(o);return this}return Object.assign({},i.position,{lookAt:h()});function l(e){var t=e.x,n=e.y,r=e.z;void 0!==t&&(i.position.x=t),void 0!==n&&(i.position.y=n),void 0!==r&&(i.position.z=r)}function u(t){e.controls.target=new Xd.Vector3(t.x,t.y,t.z)}function h(){return Object.assign(new Xd.Vector3(0,0,-1e3).applyQuaternion(i.quaternion).add(i.position))}},renderer:function(e){return e.renderer},scene:function(e){return e.scene},camera:function(e){return e.camera},controls:function(e){return e.controls},tbControls:function(e){return e.controls}},stateInit:function(){return{scene:new Xd.Scene,camera:new Xd.PerspectiveCamera,clock:new Xd.Clock}},init:function(e,t,n){var r=n.controlType,i=void 0===r?"trackball":r,a=n.rendererConfig,o=void 0===a?{}:a,s=n.waitForLoadComplete,c=void 0===s||s;e.innerHTML="",e.appendChild(t.container=document.createElement("div")),t.container.style.position="relative",t.container.appendChild(t.navInfo=document.createElement("div")),t.navInfo.className="scene-nav-info",t.navInfo.textContent={orbit:"Left-click: rotate, Mouse-wheel/middle-click: zoom, Right-click: pan",trackball:"Left-click: rotate, Mouse-wheel/middle-click: zoom, Right-click: pan",fly:"WASD: move, R|F: up | down, Q|E: roll, up|down: pitch, left|right: yaw"}[i]||"",t.navInfo.style.display=t.showNavInfo?null:"none",t.toolTipElem=document.createElement("div"),t.toolTipElem.classList.add("scene-tooltip"),t.container.appendChild(t.toolTipElem),t.mousePos=new Xd.Vector2,t.mousePos.x=-2,t.mousePos.y=-2,t.container.addEventListener("mousemove",(function(e){if(t.enablePointerInteraction){var n=(i=t.container,a=i.getBoundingClientRect(),o=window.pageXOffset||document.documentElement.scrollLeft,s=window.pageYOffset||document.documentElement.scrollTop,{top:a.top+s,left:a.left+o}),r={x:e.pageX-n.left,y:e.pageY-n.top};t.mousePos.x=r.x/t.width*2-1,t.mousePos.y=-r.y/t.height*2+1,t.toolTipElem.style.top="".concat(r.y,"px"),t.toolTipElem.style.left="".concat(r.x,"px"),t.toolTipElem.style.transform="translate(-".concat(r.x/t.width*100,"%, 21px)")}var i,a,o,s}),!1),t.container.addEventListener("mouseup",(function(e){t.ignoreOneClick?t.ignoreOneClick=!1:(0===e.button&&t.onClick(t.hoverObj||null,e),2===e.button&&t.onRightClick&&t.onRightClick(t.hoverObj||null,e))}),!1),t.container.addEventListener("contextmenu",(function(e){t.onRightClick&&e.preventDefault()}),!1),t.renderer=new Xd.WebGLRenderer(Object.assign({antialias:!0,alpha:!0},o)),t.renderer.setPixelRatio(window.devicePixelRatio),t.container.appendChild(t.renderer.domElement),t.controls=new{trackball:fd,orbit:Yd,fly:Zd}[i](t.camera,t.renderer.domElement),"fly"===i&&(t.controls.movementSpeed=300,t.controls.rollSpeed=Math.PI/6,t.controls.dragToLook=!0),"trackball"!==i&&"orbit"!==i||(t.controls.minDistance=.1,t.controls.maxDistance=t.skyRadius,t.controls.addEventListener("start",(function(){return t.controlsEngaged=!0})),t.controls.addEventListener("change",(function(){t.controlsEngaged&&(t.controlsDragging=!0,t.ignoreOneClick=!0)})),t.controls.addEventListener("end",(function(){t.controlsEngaged=!1,t.controlsDragging=!1}))),t.renderer.setSize(t.width,t.height),t.camera.aspect=t.width/t.height,t.camera.updateProjectionMatrix(),t.camera.position.z=1e3,t.scene.add(t.skysphere=new Xd.Mesh),t.skysphere.visible=!1,t.loadComplete=t.scene.visible=!c,window.scene=t.scene},update:function(e,t){if(e.width&&e.height&&(t.hasOwnProperty("width")||t.hasOwnProperty("height"))&&(e.container.style.width=e.width,e.container.style.height=e.height,e.renderer.setSize(e.width,e.height),e.camera.aspect=e.width/e.height,e.camera.updateProjectionMatrix()),t.hasOwnProperty("skyRadius")&&e.skyRadius&&(e.controls.hasOwnProperty("maxDistance")&&t.skyRadius&&(e.controls.maxDistance=e.skyRadius),e.camera.far=2.5*e.skyRadius,e.camera.updateProjectionMatrix(),e.skysphere.geometry=new Xd.SphereGeometry(e.skyRadius)),t.hasOwnProperty("backgroundColor")){var n=kd(e.backgroundColor).alpha;void 0===n&&(n=1),e.renderer.setClearColor(new Xd.Color(Gd(1,e.backgroundColor)),n)}function r(){e.loadComplete=e.scene.visible=!0}t.hasOwnProperty("backgroundImageUrl")&&(e.backgroundImageUrl?(new Xd.TextureLoader).load(e.backgroundImageUrl,(function(t){e.skysphere.material=new Xd.MeshBasicMaterial({map:t,side:Xd.BackSide}),e.skysphere.visible=!0,e.onBackgroundImageLoaded&&setTimeout(e.onBackgroundImageLoaded),!e.loadComplete&&r()})):(e.skysphere.visible=!1,e.skysphere.material.map=null,!e.loadComplete&&r())),t.hasOwnProperty("showNavInfo")&&(e.navInfo.style.display=e.showNavInfo?null:"none"),t.hasOwnProperty("objects")&&((t.objects||[]).forEach((function(t){return e.scene.remove(t)})),e.objects.forEach((function(t){return e.scene.add(t)})))}});function Qd(e,t){var n=new t;return{linkProp:function(t){return{default:n[t](),onChange:function(n,r){r[e][t](n)},triggerUpdate:!1}},linkMethod:function(t){return function(n){for(var r=n[e],i=arguments.length,a=new Array(i>1?i-1:0),o=1;o<i;o++)a[o-1]=arguments[o];var s=r[t].apply(r,a);return s===r?this:s}}}}var Kd=window.THREE?window.THREE:{AmbientLight:zs,DirectionalLight:Is,Vector3:w},$d=Qd("forceGraph",pd),ef=Object.assign.apply(Object,r(["jsonUrl","graphData","numDimensions","dagMode","dagLevelDistance","nodeRelSize","nodeId","nodeVal","nodeResolution","nodeColor","nodeAutoColorBy","nodeOpacity","nodeVisibility","nodeThreeObject","nodeThreeObjectExtend","linkSource","linkTarget","linkVisibility","linkColor","linkAutoColorBy","linkOpacity","linkWidth","linkResolution","linkCurvature","linkCurveRotation","linkMaterial","linkThreeObject","linkThreeObjectExtend","linkPositionUpdate","linkDirectionalArrowLength","linkDirectionalArrowColor","linkDirectionalArrowRelPos","linkDirectionalArrowResolution","linkDirectionalParticles","linkDirectionalParticleSpeed","linkDirectionalParticleWidth","linkDirectionalParticleColor","linkDirectionalParticleResolution","forceEngine","d3AlphaDecay","d3VelocityDecay","warmupTicks","cooldownTicks","cooldownTime","onEngineTick","onEngineStop"].map((function(t){return e({},t,$d.linkProp(t))})))),tf=Object.assign.apply(Object,r(["refresh","d3Force","d3ReheatSimulation","emitParticle"].map((function(t){return e({},t,$d.linkMethod(t))})))),nf=Qd("renderObjs",Jd),rf=Object.assign.apply(Object,r(["width","height","backgroundColor","showNavInfo","enablePointerInteraction","postProcessingComposer"].map((function(t){return e({},t,nf.linkProp(t))})))),af=Object.assign.apply(Object,r(["cameraPosition"].map((function(t){return e({},t,nf.linkMethod(t))}))));return bp({props:n({nodeLabel:{default:"name",triggerUpdate:!1},linkLabel:{default:"name",triggerUpdate:!1},linkHoverPrecision:{default:1,onChange:function(e,t){return t.renderObjs.lineHoverPrecision(e)},triggerUpdate:!1},enableNavigationControls:{default:!0,onChange:function(e,t){var n=t.renderObjs.controls();n&&(n.enabled=e)},triggerUpdate:!1},enableNodeDrag:{default:!0,triggerUpdate:!1},onNodeDrag:{default:function(){},triggerUpdate:!1},onNodeDragEnd:{default:function(){},triggerUpdate:!1},onNodeClick:{default:function(){},triggerUpdate:!1},onNodeRightClick:{default:function(){},triggerUpdate:!1},onNodeHover:{default:function(){},triggerUpdate:!1},onLinkClick:{default:function(){},triggerUpdate:!1},onLinkRightClick:{default:function(){},triggerUpdate:!1},onLinkHover:{default:function(){},triggerUpdate:!1},onBackgroundClick:{default:function(){},triggerUpdate:!1},onBackgroundRightClick:{default:function(){},triggerUpdate:!1}},ef,{},rf),methods:n({graph2ScreenCoords:function(e,t,n,r){var i=new Kd.Vector3(t,n,r);return i.project(this.camera()),{x:(i.x+1)*e.width/2,y:-(i.y-1)*e.height/2}},pauseAnimation:function(e){return null!==e.animationFrameRequestId&&(cancelAnimationFrame(e.animationFrameRequestId),e.animationFrameRequestId=null),this},resumeAnimation:function(e){return null===e.animationFrameRequestId&&this._animationCycle(),this},_animationCycle:function(e){e.enablePointerInteraction&&(this.renderer().domElement.style.cursor=null),e.forceGraph.tickFrame(),e.renderObjs.tick(),e.animationFrameRequestId=requestAnimationFrame(this._animationCycle)},scene:function(e){return e.renderObjs.scene()},camera:function(e){return e.renderObjs.camera()},renderer:function(e){return e.renderObjs.renderer()},controls:function(e){return e.renderObjs.controls()},tbControls:function(e){return e.renderObjs.tbControls()},_destructor:function(){this.pauseAnimation(),this.graphData({nodes:[],links:[]})}},tf,{},af),stateInit:function(e){var t=e.controlType,n=e.rendererConfig;return{forceGraph:new pd,renderObjs:Jd({controlType:t,rendererConfig:n})}},init:function(e,t){e.innerHTML="",e.appendChild(t.container=document.createElement("div")),t.container.style.position="relative";var n=document.createElement("div");t.container.appendChild(n),t.renderObjs(n);var r,i=t.renderObjs.camera(),a=t.renderObjs.renderer(),o=t.renderObjs.controls();o.enabled=!!t.enableNavigationControls,t.lastSetCameraZ=i.position.z,t.container.appendChild(r=document.createElement("div")),r.className="graph-info-msg",r.textContent="",t.forceGraph.onLoading((function(){r.textContent="Loading..."})).onFinishLoading((function(){r.textContent=""})).onUpdate((function(){t.graphData=t.forceGraph.graphData(),0===i.position.x&&0===i.position.y&&i.position.z===t.lastSetCameraZ&&t.graphData.nodes.length&&(i.lookAt(t.forceGraph.position),t.lastSetCameraZ=i.position.z=170*Math.cbrt(t.graphData.nodes.length))})).onFinishUpdate((function(){if(t._dragControls){var e=t.graphData.nodes.find((function(e){return e.__initialFixedPos&&!e.__disposeControlsAfterDrag}));e?e.__disposeControlsAfterDrag=!0:t._dragControls.dispose(),t._dragControls=void 0}if(t.enableNodeDrag&&t.enablePointerInteraction&&"d3"===t.forceEngine){var n=t._dragControls=new hu(t.graphData.nodes.map((function(e){return e.__threeObj})).filter((function(e){return e})),i,a.domElement);n.addEventListener("dragstart",(function(e){o.enabled=!1;var t=e.object.__data;!t.__initialFixedPos&&(t.__initialFixedPos={fx:t.fx,fy:t.fy,fz:t.fz}),!t.__initialPos&&(t.__initialPos={x:t.x,y:t.y,z:t.z}),["x","y","z"].forEach((function(e){return t["f".concat(e)]=t[e]})),a.domElement.classList.add("grabbable")})),n.addEventListener("drag",(function(e){t.ignoreOneClick=!0;var n=e.object.__data,r=e.object.position,i={x:r.x-n.x,y:r.y-n.y,z:r.z-n.z};["x","y","z"].forEach((function(e){return n["f".concat(e)]=n[e]=r[e]})),t.forceGraph.d3AlphaTarget(.3).resetCountdown(),n.__dragged=!0,t.onNodeDrag(n,i)})),n.addEventListener("dragend",(function(e){var r=e.object.__data;r.__disposeControlsAfterDrag&&(n.dispose(),delete r.__disposeControlsAfterDrag);var i=r.__initialFixedPos,s=r.__initialPos,c={x:s.x-r.x,y:s.y-r.y,z:s.z-r.z};i&&(["x","y","z"].forEach((function(e){var t="f".concat(e);void 0===i[t]&&delete r[t]})),delete r.__initialFixedPos,delete r.__initialPos,r.__dragged&&(delete r.__dragged,t.onNodeDragEnd(r,c))),t.forceGraph.d3AlphaTarget(0).resetCountdown(),t.enableNavigationControls&&(o.enabled=!0),a.domElement.classList.remove("grabbable")}))}}));var s=function(e){for(var t=e;t&&!t.hasOwnProperty("__graphObjType");)t=t.parent;return t};t.renderObjs.objects([new Kd.AmbientLight(12303291),new Kd.DirectionalLight(16777215,.6),t.forceGraph]).hoverOrderComparator((function(e,t){var n=s(e);if(!n)return 1;var r=s(t);if(!r)return-1;var i=function(e){return"node"===e.__graphObjType};return i(r)-i(n)})).tooltipContent((function(e){var n=s(e);return n&&_p(t["".concat(n.__graphObjType,"Label")])(n.__data)||""})).onHover((function(e){var n=s(e);if(n!==t.hoverObj){var r=t.hoverObj?t.hoverObj.__graphObjType:null,i=t.hoverObj?t.hoverObj.__data:null,a=n?n.__graphObjType:null,o=n?n.__data:null;r&&r!==a&&t["on".concat("node"===r?"Node":"Link","Hover")](null,i),a&&t["on".concat("node"===a?"Node":"Link","Hover")](o,r===a?i:null),t.hoverObj=n}})).onClick((function(e,n){if(t.ignoreOneClick)t.ignoreOneClick=!1;else{var r=s(e);r?t["on".concat("node"===r.__graphObjType?"Node":"Link","Click")](r.__data,n):t.onBackgroundClick(n)}})).onRightClick((function(e,n){var r=s(e);r?t["on".concat("node"===r.__graphObjType?"Node":"Link","RightClick")](r.__data,n):t.onBackgroundRightClick(n)})),this._animationCycle()}})}));
diff --git a/plugins/analysis/webinterface/httpserver/static/js/main.js b/plugins/analysis/webinterface/httpserver/static/js/main.js
index 96ceda5150e4f9b0cb37ddfba08cc00e35707a18..72c440b27a11aacaa594cb01e325b4061f1b82fc 100644
--- a/plugins/analysis/webinterface/httpserver/static/js/main.js
+++ b/plugins/analysis/webinterface/httpserver/static/js/main.js
@@ -2,10 +2,10 @@ const ANALYSIS_SERVER_URL = window.location.host + "/datastream";
 const NODE_ID_LENGTH = 64;
 
 // for some strange reason color formats for edges and nodes need to be different... careful!
-const EDGE_COLOR_DEFAULT = "#444444";
-const EDGE_COLOR_OUTGOING = "#336db5";
-const EDGE_COLOR_INCOMING = "#1c8d7f";
-const VERTEX_COLOR_DEFAULT = "0x666666";
+const EDGE_COLOR_DEFAULT = "#ff7d6c40";
+const EDGE_COLOR_OUTGOING = "#336db5ff";
+const EDGE_COLOR_INCOMING = "#1c8d7fff";
+const VERTEX_COLOR_DEFAULT = "0xa8d0e6";
 const VERTEX_COLOR_ACTIVE = "0x336db5";
 const VERTEX_COLOR_CONNECTED = "0x1c8d7f";
 const VERTEX_SIZE = 14;
@@ -25,8 +25,7 @@ class Frontend {
                     return;
                 }
 
-                // TODO: add active class and remove possible others (necessary for search feature)
-
+                this.app.resetActiveNode();
                 this.app.setActiveNode(nodeId, true);
             }
         }, false);
@@ -46,7 +45,7 @@ class Frontend {
             this.searchTerm = value;
             
             let results = new Set();
-            for(let n of this.app.ds.nodesOnline) {
+            for(let n of this.app.ds.nodes) {
                 if(n.startsWith(value)) {
                     results.add(n);
                 }
@@ -58,7 +57,7 @@ class Frontend {
                 this.app.setActiveNode(n, true);
             }
 
-            this.displayNodesOnline(results);
+            this.displayNodes(results);
         });
 
         document.getElementById("clear").addEventListener("click", (e) => {
@@ -110,7 +109,11 @@ class Frontend {
             history.replaceState(null, null, '#'+nodeId);
         }
 
-        let neighbors = this.app.ds.neighbors[nodeId];
+        let neighbors = this.app.ds.neighbors.get(nodeId);
+        // when node doesn't have neighbors yet
+        if (neighbors === undefined) {
+            neighbors=this.app.ds.createNeighborsObject();
+        }
         this.showNodeLinks(nodeId, neighbors);
     }
 
@@ -127,19 +130,26 @@ class Frontend {
         document.getElementById("out").innerHTML = "";
     }
 
-    displayNodesOnline(nodesOnline) {
+    displayNodes(nodes) {
         // this line might be a performance killer!
-        nodesOnline = Array.from(nodesOnline).sort();
+        nodes = Array.from(nodes).sort();
+        // When the active node gets removed, we should reset the nodeLink too
+        var isActiveNodePresent = false;
 
         let html = [];
-        for(let n of nodesOnline) {
+        for(let n of nodes) {
             if(n == this.activeNode) {
                 html.push('<span class="n active">' + n + "</span>");
+                isActiveNodePresent = true;
             } else {
                 html.push('<span class="n">' + n + "</span>");
             }
         }
         document.getElementById("nodesOnline").innerHTML = html.join("");
+        if (!isActiveNodePresent) {
+            // active node was removed
+            this.resetActiveNode();
+        }
     }
 }
 
@@ -147,192 +157,98 @@ class Datastructure {
     constructor(app) {
         this.app = app;
         this.nodes = new Set();
-        this.nodesOnline = new Set();
-        this.nodesOffline = new Set();
-        this.nodesDisconnected = new Set();
         this.connections = new Set();
         this.neighbors = new Map();
     }
 
     getStatusText() {
         // avg = this.connections.size*2 / (this.nodesOnline-1) : -1 == entry node (always disconnected)
-        return "nodes online: " + this.nodesOnline.size + "(" + this.nodesDisconnected.size + ")" + " - IDs: " + this.nodes.size + " - edges: " + this.connections.size + " - avg: " + (this.connections.size*2 / (this.nodesOnline.size-1)).toFixed(2);
+        return "nodes online: " + this.nodes.size + " - edges: " + this.connections.size + " - avg: " + (this.connections.size*2 / (this.nodes.size-1)).toFixed(2);
     }
 
     addNode(idA) {
         if(!this.nodes.has(idA)) {
-            this.nodes.add(idA);
-
-            this.app.setStreamStatusMessage("addedToNodepool: " + idA);
-            this.app.updateStatus();
+            this.app.setStreamStatusMessage("Added Node: " + idA);
+        }
+        this.nodes.add(idA);
+        this.app.graph.addVertex(idA);
+        this.app.updateStatus();
+        // 30 is the minimum springLength
+        if (this.nodes.size > 30) {
+            this.app.graph.layout.simulator.springLength(this.nodes.size)
         }
-
-        // TODO: temporary fix for faulty analysis server. do not set nodes offline.
-        this.setNodeOnline(idA);
     }
 
     removeNode(idA) {
-        if(!this.nodes.has(idA)) {
-            console.error("removeNode but not in nodes list:", idA);
-            return;
-        }
-
-        if(this.nodesDisconnected.has(idA)) { this.nodesDisconnected.delete(idA); }
-        if(this.neighbors.has(idA)) { this.neighbors.delete(idA); }
+        this.nodes.delete(idA);
+        this.app.graph.deleteVertex(idA)
 
-        if(this.nodesOnline.has(idA)) {
-            this.nodesOnline.delete(idA);
-            this.app.graph.deleteVertex(idA);
-
-            this.app.setStreamStatusMessage("removeNode from onlinepool: " + idA);
-        }
-        
-        if(this.nodesOffline.has(idA)) {
-            this.nodesOffline.delete(idA);
-            this.app.setStreamStatusMessage("removeNode from offlinepool: " + idA);
-        }
-
-        if(this.nodes.has(idA)) {
-            this.nodes.delete(idA);
-            this.app.setStreamStatusMessage("removeNode from nodepool: " + idA);
-        }
-        
+        this.app.setStreamStatusMessage("Removed Node: " + idA); 
         this.app.updateStatus();
-    }
-
-    setNodeOnline(idA) {
-        if(!this.nodes.has(idA)) {
-            console.error("setNodeOnline but not in nodes list:", idA);
-            return;
+        // 30 is the minimum springLength
+        if (this.nodes.size > 30) {
+            this.app.graph.layout.simulator.springLength(this.nodes.size)
         }
-
-        // check if not in nodesOnline set
-        if(!this.nodesOnline.has(idA)) {
-            this.nodesOnline.add(idA);
-            this.app.graph.addVertex(idA);
-
-            // create entry in neighbors map
-            this.neighbors[idA] = this.createNeighborsObject();
-            this.nodesDisconnected.add(idA);
-
-            this.app.setStreamStatusMessage("setNodeOnline: " + idA)
-        } else {
-            this.app.setStreamStatusMessage("setNodeOnline skipped: " + idA)
-        }
-
-        // check if in nodesOffline set
-        if(this.nodesOffline.has(idA)) {
-            this.nodesOffline.delete(idA);
-
-            this.app.setStreamStatusMessage("removedFromOfflinepool: " + idA)
-        }
-
-        this.app.updateStatus();
     }
 
     createNeighborsObject() {
         return {
             in: new Set(),
             out: new Set(),
+            isEmpty : function() {
+                return this.in.size + this.out.size === 0;
+            }
         }
     }
 
-    setNodeOffline(idA) {
-        // TODO: temporary fix for faulty analysis server. do not set nodes offline.
-        return;
-
-        if(!this.nodes.has(idA)) {
-            console.error("setNodeOffline but not in nodes list:", idA);
-            return;
-        }
-
-        if(this.nodesDisconnected.has(idA)) { this.nodesDisconnected.delete(idA); }
-        if(this.neighbors.has(idA)) { this.neighbors.delete(idA); }
-
-        if(!this.nodesOffline.has(idA)) {
-            this.nodesOffline.add(idA);
-
-            this.app.setStreamStatusMessage("addedToOfflinepool: " + idA)
-        }
-
-        // check if node is currently online
-        if(this.nodesOnline.has(idA)) {
-            this.nodesOnline.delete(idA);
-            this.app.graph.deleteVertex(idA);
-
-            this.app.setStreamStatusMessage("removedFromOnlinepool: " + idA)
-        }
-
-        this.app.updateStatus();
-    }
-
     connectNodes(con, idA, idB) {
-        if(!this.nodes.has(idA)) {
-            console.error("connectNodes but not in nodes list:", idA, con);
-            return;
-        }
-        if(!this.nodes.has(idB)) {
-            console.error("connectNodes but not in nodes list:", idB, con);
-            return;
-        }
-
         if(this.connections.has(con)) {
             this.app.setStreamStatusMessage("connectNodes skipped: " + idA + " > " + idB);
         } else {
-            // add new connection only if both nodes are online
-            if(this.nodesOnline.has(idA) && this.nodesOnline.has(idB) && idA != idB) {
-                this.app.graph.addEdge(con, idA, idB);
-                this.connections.add(con);
+            this.app.graph.addEdge(con, idA, idB);
+            this.connections.add(con);
 
-                // update datastructure for fast neighbor lookup
-                this.neighbors[idA].out.add(idB);
-                this.neighbors[idB].in.add(idA);
-
-                // remove from disconnected list
-                if(this.nodesDisconnected.has(idA)) { this.nodesDisconnected.delete(idA); }
-                if(this.nodesDisconnected.has(idB)) { this.nodesDisconnected.delete(idB); }
+            // update datastructure for fast neighbor lookup
+            if (!this.neighbors.has(idA)) {
+                // Need to initialize the object
+                this.neighbors.set(idA, this.createNeighborsObject());
+            }
 
-                this.app.setStreamStatusMessage("connectNodes: " + idA + " > " + idB);
-                this.app.updateStatus();
-            } else {
-                console.log("connectNodes skipped: either node not online", idA, idB);
+            this.neighbors.get(idA).out.add(idB);
+            if (!this.neighbors.has(idB)) {
+                // Need to initialize the object
+                this.neighbors.set(idB, this.createNeighborsObject());
             }
+            this.neighbors.get(idB).in.add(idA);
+
+            this.app.setStreamStatusMessage("connectNodes: " + idA + " > " + idB);
+            this.app.updateStatus();
         }
     }
 
     disconnectNodes(con, idA, idB) {
-        if(!this.nodes.has(idA)) {
-            console.error("disconnectNodes but not in nodes list:", idA, con);
-            return;
-        }
-        if(!this.nodes.has(idB)) {
-            console.error("disconnectNodes but not in nodes list:", idB, con);
-            return;
-        }
-
         if(this.connections.has(con)) {
             this.connections.delete(con);
-            this.app.graph.deleteEdge(con, idA, idB);
+            this.app.graph.deleteEdge(idA, idB);
 
             // update datastructure for fast neighbor lookup
-            this.neighbors[idA].out.delete(idB);
-            this.neighbors[idB].in.delete(idA);
+            this.neighbors.get(idA).out.delete(idB);
+            this.neighbors.get(idB).in.delete(idA);
 
-            // check if nodes still have neighbors
-            if(!this.hasNodeNeighbors(idA)) { this.nodesDisconnected.add(idA); }
-            if(!this.hasNodeNeighbors(idB)) { this.nodesDisconnected.add(idB); }
+            if (this.neighbors.get(idA).isEmpty()){
+                this.neighbors.delete(idA);
+            }
+
+            if (this.neighbors.get(idB).isEmpty()){
+                this.neighbors.delete(idB);
+            }
 
             this.app.setStreamStatusMessage("disconnectNodes: " + idA + " > " + idB);
             this.app.updateStatus();
         } else {
-            console.log("disconnectNodes skipped: either node not online", idA, idB);
+            console.log("disconnectNodes skipped: ", idA, idB);
         }
     }
-
-    hasNodeNeighbors(idA) {
-        let neighbors = this.neighbors[idA];
-        return ((neighbors.in.size + neighbors.out.size) > 0)
-    }
 }
 
 class Graph {
@@ -417,21 +333,24 @@ class Graph {
 
         this.graph.beginUpdate();
 
-        let neighbors = this.app.ds.neighbors[selectedNode];
+        let neighbors = this.app.ds.neighbors.get(selectedNode);
 
         // highlight current node
         this.updateNodeUiColor(selectedNode, VERTEX_COLOR_ACTIVE);
 
-        // highlight incoming connections
-        for(let n of neighbors.in) {
-            this.updateNodeUiColor(n, VERTEX_COLOR_CONNECTED);
-            this.updateLinkUiColor(n, selectedNode, EDGE_COLOR_INCOMING);
-        }
+        // Node doesn't have any neighbors yet. nothing to be highlighted
+        if (neighbors!==undefined){
+            // highlight incoming connections
+            for(let n of neighbors.in) {
+                this.updateNodeUiColor(n, VERTEX_COLOR_CONNECTED);
+                this.updateLinkUiColor(n, selectedNode, EDGE_COLOR_INCOMING);
+            }
 
-        // highlight outcoming connections
-        for(let n of neighbors.out) {
-            this.updateNodeUiColor(n, VERTEX_COLOR_CONNECTED);
-            this.updateLinkUiColor(selectedNode, n, EDGE_COLOR_OUTGOING);
+            // highlight outcoming connections
+            for(let n of neighbors.out) {
+                this.updateNodeUiColor(n, VERTEX_COLOR_CONNECTED);
+                this.updateLinkUiColor(selectedNode, n, EDGE_COLOR_OUTGOING);
+            }
         }
 
         this.graph.endUpdate();
@@ -472,7 +391,7 @@ class Graph {
         this.graph.addLink(idA, idB, con);
     }
 
-    deleteEdge(con, idA, idB) {
+    deleteEdge(idA, idB) {
         let link = this.graph.getLink(idA, idB);
         this.graph.removeLink(link);
     }
@@ -536,7 +455,7 @@ class Application {
             if(this.frontend.searchTerm.length > 0) {
                 return;
             }
-            this.frontend.displayNodesOnline(this.ds.nodesOnline) 
+            this.frontend.displayNodes(this.ds.nodes)
         }, 300);
     }
 
@@ -580,18 +499,23 @@ class Application {
             ((window.location.protocol === "https:") ? "wss://" : "ws://") + this.url
         );
     
-        this.socket.onopen = () => {
-            this.setStatusMessage("WebSocket opened. Loading ... ");
-            setInterval(() => {
-                this.socket.send("_");
-            }, 1000);
-        };
-    
         this.socket.onerror = (e) => {
             this.setStatusMessage("WebSocket error observed. Please reload.");
             console.error("WebSocket error observed", e);
           };
-    
+
+        this.socket.onopen = () => {	
+            this.setStatusMessage("WebSocket opened. Loading ... ");
+            this.pingId = setInterval(() => {
+                this.socket.send("_");
+            }, 1000);
+        };
+
+        this.socket.onclose = () => {
+            clearInterval(this.pingId)
+            console.log("WebSocket connection was closed.")
+        }
+
         this.socket.onmessage = (e) => {
             let type = e.data[0];
             let data = e.data.substr(1);
@@ -629,16 +553,6 @@ class Application {
                     console.log("disconnectNodes event:", idA, " - ", idB);
                     this.ds.disconnectNodes(idA+idB, idA, idB);
                     break;
-    
-                case "O":
-                    console.log("setNodeOnline event:", idA);
-                    this.ds.setNodeOnline(idA);
-                    break;
-    
-                case "o":
-                    console.log("setNodeOffline event:", idA);
-                    this.ds.setNodeOffline(idA);
-                    break;
             }
         }
     }
@@ -651,9 +565,6 @@ window.onload = () => {
     app.run()
 }
 
-
-
-
 function hasClass(elem, className) {
     return elem.classList.contains(className);
 }
diff --git a/plugins/analysis/webinterface/httpserver/static/js/main_3d.js b/plugins/analysis/webinterface/httpserver/static/js/main_3d.js
new file mode 100644
index 0000000000000000000000000000000000000000..388e9a240fef3d492c640c165764cd5a30bea375
--- /dev/null
+++ b/plugins/analysis/webinterface/httpserver/static/js/main_3d.js
@@ -0,0 +1,392 @@
+const ANALYSIS_SERVER_URL = "127.0.0.1" + "/datastream";
+const NODE_ID_LENGTH = 64;
+const backgroundColor = '#060D29'
+const nodeColor = 'rgba(168, 208, 230, 0.8)' //#A8D0E6
+const linkColor = 'rgba(255, 125, 108, 0.4)'  //#ff7d6c
+const highlightNodeColor = 'rgba(168, 208, 230, 1.0)' //#A8D0E6
+const highlightInColor =  'rgba(134, 194, 50, 1.0)' // #86c232
+const highlightOutColor = 'rgba(191, 10, 173, 1.0)' // #bf0aad
+
+class Frontend {
+    constructor(app) {
+        this.app = app;
+        this.activeNode = '';
+        this.searchTerm = '';
+        document.addEventListener('click', (e) => {
+            if (e.target.classList.contains("n")) {
+                let htmlNode = e.target;
+                let nodeId = htmlNode.innerHTML;
+
+                if(htmlNode.classList.contains('active')) {
+                    this.app.resetActiveNode();
+                    return;
+                }
+                this.app.resetActiveNode();
+                this.app.setActiveNode(nodeId, true);
+            }
+        }, false);
+
+        this.initSearch();
+        this.showSearchField();
+    }
+
+    initSearch() {
+        document.getElementById("search").addEventListener('keyup', (e) => {
+            let value = e.target.value.trim().toLowerCase();
+
+            if(value === "") {
+                this.resetSearch();
+                return;
+            }
+
+            this.searchTerm = value;
+
+            let results = [];
+            for(let n of this.app.ds.gData.nodes) {
+                if(n.id.startsWith(value)) {
+                    results.push(n);
+                }
+            }
+
+            this.displayNodesOnline(results);
+        });
+
+        document.getElementById("clear").addEventListener("click", (e) => {
+            this.resetSearch();
+        });
+    }
+
+    resetSearch() {
+        document.getElementById("search").value = "";
+        this.searchTerm = '';
+        this.app.resetActiveNode();
+    }
+
+    showSearchField() {
+        document.getElementById('searchWrapper').style.cssText = "display:block;"
+    }
+
+    // Show nodes
+    displayNodesOnline(nodes) {
+        let html = [];
+        // When the active node gets removed, we should reset the nodeLink too
+        var isActiveNodePresent = false;
+        for(let n of nodes) {
+            if(n.id == this.activeNode) {
+                html.push('<span class="n active">' + n.id + "</span>");
+                isActiveNodePresent = true;
+            } else {
+                html.push('<span class="n">' + n.id + "</span>");
+            }
+        }
+        document.getElementById("nodesOnline").innerHTML = html.join("");
+        if (!isActiveNodePresent) {
+            // active node was removed
+            this.resetActiveNode();
+        }
+    }
+
+    setStatusMessage(msg) {
+        document.getElementById("status").innerHTML = msg;
+    }
+
+    setStreamStatusMessage(msg) {
+        document.getElementById("streamstatus").innerHTML = msg;
+    }
+
+    showNodeLinks(node, inNeighbors, outNeighbors) {
+        document.getElementById("nodeId").innerHTML = node + " in:" + inNeighbors.length + " out:" + outNeighbors.length;
+
+        let html = "incoming edges: ";
+        // incoming
+        for(let n of inNeighbors) {
+            html += n + " &rarr; " + "NODE<br>";
+        }
+        if(inNeighbors.length == 0) { html += "no incoming edges!" }
+        document.getElementById("in").innerHTML = html;
+
+        html = "outgoing edges: ";
+        // outgoing
+        for(let n of outNeighbors) {
+            html += "NODE" + " &rarr; " + n + "<br>";
+        }
+        if(outNeighbors.length == 0) { html += "no outgoing edges!" }
+        document.getElementById("out").innerHTML = html;
+    }
+
+    setActiveNode(nodeId, updateHash=false) {
+        this.activeNode = nodeId;
+        // Determine neighbors of the node
+        var inNeighbors = [];
+        var outNeighbors = [];
+        this.app.ds.gData.links.forEach(link => {
+            if (link.source.id == nodeId){
+                outNeighbors.push(link.target.id);
+            } else if (link.target.id == nodeId){
+                inNeighbors.push(link.source.id)
+            }
+        }
+        )
+        this.showNodeLinks(nodeId, inNeighbors, outNeighbors);
+        this.highlightNode(nodeId);
+        this.highlightLinks(nodeId);
+        this.refreshGraphHighlights();
+    }
+
+    resetActiveNode() {
+        this.activeNode = '';
+        this.resetNodeLinks();
+        this.clearHighlight();
+    }
+
+    resetNodeLinks() {
+        document.getElementById("nodeId").innerHTML = "";
+        document.getElementById("in").innerHTML = "";
+        document.getElementById("out").innerHTML = "";
+    }
+
+    highlightNode(node) {
+        this.app.graph.highlightNodes.add(node);
+    }
+
+    highlightLinks(node) {
+        this.app.ds.gData.links.forEach(link => {
+            if (link.source.id == node){
+                this.app.graph.highlightOutLinks.add(link);
+                this.app.graph.highlightOutNeighbors.add(link.target.id)
+            } else if (link.target.id == node){
+                this.app.graph.highlightInLinks.add(link);
+                this.app.graph.highlightInNeighbors.add(link.source.id)
+            }
+        })
+    }
+
+    clearHighlight(){
+        this.app.graph.highlightNodes.clear();
+        this.app.graph.highlightInNeighbors.clear();
+        this.app.graph.highlightOutNeighbors.clear();
+        this.app.graph.highlightInLinks.clear();
+        this.app.graph.highlightOutLinks.clear();
+        this.refreshGraphHighlights();
+    }
+
+    // Refereshes rendering of graph
+    refreshGraphHighlights(){
+        this.app.graph.graph.refresh();
+    }
+}
+
+class Datastructure {
+    constructor(app) {
+        this.app = app;
+        this.gData = {
+            nodes: [],
+            links: []
+        };
+        this.needsDataSet = false;
+    }
+
+    addNode(idA) {
+        this.gData.nodes.push({ id: idA})
+        this.app.graph.setGraphData(this.gData);
+        this.needsDataSet = true;
+        this.app.setStreamStatusMessage("Added Node: " + idA);
+    }
+
+    removeNode(idA) {
+        this.gData.links = this.gData.links.filter(l => l.source.id !== idA && l.target.id !== idA); // Remove links attached to node
+        this.gData.nodes = this.gData.nodes.filter(n => n.id !== idA); // Remove node
+        this.app.graph.setGraphData(this.gData);
+        this.needsDataSet = true;
+        this.app.setStreamStatusMessage("Removed Node: " + idA);
+    }
+
+    connectNodes(idA, idB) {
+        this.gData.links.push({ source: idA, target: idB })
+        this.app.graph.setGraphData(this.gData);
+        this.needsDataSet = true;
+        this.app.setStreamStatusMessage("Connected Nodes: " + idA + " > " + idB);
+
+    }
+    disconnectNodes(idA, idB) {
+        this.gData.links = this.gData.links.filter(l => (l.source.id !== idA && l.target.id !== idB));
+        this.gData.links = this.gData.links.filter(l => (l.source.id !== idB && l.target.id !== idA));
+        this.app.graph.setGraphData(this.gData);
+        this.needsDataSet = true;
+        this.app.setStreamStatusMessage("Disconnected Nodes: " + idA + " > " + idB);
+    }
+
+    getStatusText() {
+        var statusLine = "nodes online: " + this.gData.nodes.length + " - connections: " + this.gData.links.length;
+        statusLine += " - average connections/node: ";
+        if (this.gData.links.length === 0 || this.gData.nodes.length === 0) {
+            statusLine += " - ";
+        } else {
+            // A connection has two ends, so counts double for nodes.
+            statusLine += 2*(this.gData.links.length/this.gData.nodes.length).toFixed(2);
+        }
+        return statusLine;
+    }
+}
+
+class Graph{
+    constructor(app) {
+        this.app = app
+        this.highlightNodes = new Set()
+        this.highlightInLinks = new Set()
+        this.highlightOutLinks = new Set()
+        this.highlightInNeighbors = new Set()
+        this.highlightOutNeighbors = new Set()
+        this.graph = ForceGraph3D()
+            (document.getElementById('graphc'))
+            .backgroundColor(backgroundColor)
+            // Disable dragginf nodes for perfromance.
+            .enableNodeDrag(false)
+            //.graphData(app.ds.gData)
+            .linkOpacity(1.0)
+            .nodeOpacity(1.0)
+            .nodeVal( node => {
+                if (this.highlightNodes.has(node.id) === true)
+                    return 5
+                return 1
+            })
+            .nodeColor((node) => {
+                if (this.highlightNodes.has(node.id) === true)
+                    return highlightNodeColor
+                if (this.highlightInNeighbors.has(node.id) === true)
+                    return highlightInColor
+                if (this.highlightOutNeighbors.has(node.id) === true)
+                    return highlightOutColor
+                return nodeColor
+            })
+            .linkColor((link) => {
+                if (this.highlightInLinks.has(link) === true)
+                    return highlightInColor
+                if (this.highlightOutLinks.has(link) === true)
+                    return highlightOutColor
+                return linkColor
+            })
+            .nodeResolution(2)
+            .linkWidth(1)
+            //.linkDirectionalParticles(5)
+            .numDimensions(2)	
+            //.linkDirectionalParticleSpeed(0.01);
+    }
+
+    setGraphData(gData) {
+        this.graph.graphData(gData)
+    }
+
+    getGraphData() {
+        return this.graph.graphData()
+    }
+}
+
+class Application {
+    constructor(url) {
+        this.url = url;
+        this.ds = new Datastructure(this)
+        this.graph = new Graph(this)
+        this.frontend = new Frontend(this)
+    }
+
+    run() {
+        this.initWebsocket();
+        this.showStatus();
+        this.showOnlineNodes();
+    }
+
+    initWebsocket() {
+        this.socket = new WebSocket(
+            ((window.location.protocol === "https:") ? "wss://" : "ws://") + this.url
+        );
+    
+        this.socket.onopen = () => {
+            this.pingId = setInterval(() => {
+                this.socket.send("_");
+            }, 1000);
+        };
+    
+        this.socket.onerror = (e) => {
+            console.error("WebSocket error observed", e);
+        };
+
+        this.socket.onclose = () => {
+            clearInterval(this.pingId)
+            console.log("Websocket connection closed.")
+        }
+    
+        this.socket.onmessage = (e) => {
+            let type = e.data[0];
+            let data = e.data.substr(1);
+            let idA = data.substr(0, NODE_ID_LENGTH);
+            let idB;
+
+
+            switch (type) {
+                case "_":
+                    //do nothing - its just a ping
+                    break;
+    
+                case "A":
+                    console.log("addNode event:", idA);
+                    // filter out empty ids
+                    if(idA.length == NODE_ID_LENGTH) {
+                        this.ds.addNode(idA);
+                    }
+                    break;
+
+                case "a":
+                    console.log("removeNode event:", idA);
+                    this.ds.removeNode(idA);
+                    break;
+    
+                case "C":
+                    idB = data.substr(NODE_ID_LENGTH, NODE_ID_LENGTH);
+                    console.log("connectNodes event:", idA, " - ", idB);
+                    this.ds.connectNodes(idA, idB);
+                    break;
+    
+                case "c":
+                    idB = data.substr(NODE_ID_LENGTH, NODE_ID_LENGTH);
+                    console.log("disconnectNodes event:", idA, " - ", idB);
+                    this.ds.disconnectNodes( idA, idB);
+                    break;
+            }
+        }
+    }
+
+    showOnlineNodes() {
+        setInterval(() => { 
+            if(this.frontend.searchTerm.length > 0) {
+                return;
+            }
+            this.frontend.displayNodesOnline(this.ds.gData.nodes)
+        }, 300);
+    }
+
+    showStatus() {
+        setInterval(() => {
+            this.frontend.setStatusMessage(this.ds.getStatusText())
+        }, 300);
+    }
+
+    setStreamStatusMessage(msg) {
+        this.frontend.setStreamStatusMessage(msg);
+    }
+
+    setActiveNode(nodeId, updateHash=false) {
+        // Display node and neighbors in div info
+        this.frontend.setActiveNode(nodeId, updateHash);
+    }
+
+    resetActiveNode() {
+        this.frontend.resetActiveNode();
+    }
+}
+
+let app;
+window.onload = () => {
+    app = new Application(ANALYSIS_SERVER_URL);
+    app.run()
+}
\ No newline at end of file
diff --git a/plugins/analysis/webinterface/httpserver/websocket_channel.go b/plugins/analysis/webinterface/httpserver/websocket_channel.go
index 0b75fefe284f958ddbdf54be568035b5a1483ac2..38a04a7dcad82fe1d635115206cc29aca7ec4adf 100644
--- a/plugins/analysis/webinterface/httpserver/websocket_channel.go
+++ b/plugins/analysis/webinterface/httpserver/websocket_channel.go
@@ -26,13 +26,6 @@ func (c *WebSocketChannel) Write(update string) {
 	c.send <- update
 }
 
-func (c *WebSocketChannel) TryWrite(update string) {
-	select {
-	case c.send <- update:
-	default:
-	}
-}
-
 func (c *WebSocketChannel) KeepAlive() {
 	buf := make([]byte, 1)
 	for {
diff --git a/plugins/analysis/webinterface/plugin.go b/plugins/analysis/webinterface/plugin.go
index 68d1a33d2a70efaa1db252192725c5118304b1a0..447f1c42b4aeb0e78ca5592b48f448c8cbbd1bb7 100644
--- a/plugins/analysis/webinterface/plugin.go
+++ b/plugins/analysis/webinterface/plugin.go
@@ -13,4 +13,5 @@ func Configure(plugin *node.Plugin) {
 
 func Run(plugin *node.Plugin) {
 	httpserver.Run()
+	recordedevents.Run()
 }
diff --git a/plugins/analysis/webinterface/recordedevents/constants.go b/plugins/analysis/webinterface/recordedevents/constants.go
new file mode 100644
index 0000000000000000000000000000000000000000..957bedf876bc04bd9bb558f4681beafc0589c80b
--- /dev/null
+++ b/plugins/analysis/webinterface/recordedevents/constants.go
@@ -0,0 +1,6 @@
+package recordedevents
+
+import "time"
+
+// CleanUpPeriod is the period in which we scan and delete old data
+const CleanUpPeriod = 15 * time.Second
diff --git a/plugins/analysis/webinterface/recordedevents/recorded_events.go b/plugins/analysis/webinterface/recordedevents/recorded_events.go
index 2e2a9a724b3524f9ce017e6a0fa5e49e40d899ae..9e30c88d3af371124348cf0931145fe7ddb81613 100644
--- a/plugins/analysis/webinterface/recordedevents/recorded_events.go
+++ b/plugins/analysis/webinterface/recordedevents/recorded_events.go
@@ -1,94 +1,170 @@
 package recordedevents
 
 import (
+	"encoding/hex"
+	"strings"
 	"sync"
+	"time"
 
+	"github.com/iotaledger/goshimmer/packages/shutdown"
 	"github.com/iotaledger/goshimmer/plugins/analysis/server"
+	"github.com/iotaledger/goshimmer/plugins/analysis/types/heartbeat"
 	"github.com/iotaledger/goshimmer/plugins/analysis/webinterface/types"
+	"github.com/iotaledger/hive.go/daemon"
 	"github.com/iotaledger/hive.go/events"
 	"github.com/iotaledger/hive.go/node"
 )
 
-var nodes = make(map[string]bool)
-var links = make(map[string]map[string]bool)
+// Maps nodeId to the latest arrival of a heartbeat
+var nodes = make(map[string]time.Time)
+
+// Maps nodeId to outgoing connections + latest arrival of heartbeat
+var links = make(map[string]map[string]time.Time)
 
 var lock sync.Mutex
 
 func Configure(plugin *node.Plugin) {
-	server.Events.AddNode.Attach(events.NewClosure(func(nodeId string) {
-		plugin.Node.Logger.Debugw("AddNode", "nodeID", nodeId)
-		lock.Lock()
-		defer lock.Unlock()
-
-		if _, exists := nodes[nodeId]; !exists {
-			nodes[nodeId] = false
+	server.Events.Heartbeat.Attach(events.NewClosure(func(packet heartbeat.Packet) {
+		var out strings.Builder
+		for _, value := range packet.OutboundIDs {
+			out.WriteString(hex.EncodeToString(value))
 		}
-	}))
-
-	server.Events.RemoveNode.Attach(events.NewClosure(func(nodeId string) {
-		plugin.Node.Logger.Debugw("RemoveNode", "nodeID", nodeId)
-		lock.Lock()
-		defer lock.Unlock()
-
-		delete(nodes, nodeId)
-	}))
-
-	server.Events.NodeOnline.Attach(events.NewClosure(func(nodeId string) {
-		plugin.Node.Logger.Debugw("NodeOnline", "nodeID", nodeId)
+		var in strings.Builder
+		for _, value := range packet.InboundIDs {
+			in.WriteString(hex.EncodeToString(value))
+		}
+		plugin.Node.Logger.Debugw(
+			"Heartbeat",
+			"nodeId", hex.EncodeToString(packet.OwnID),
+			"outboundIds", out.String(),
+			"inboundIds", in.String(),
+		)
 		lock.Lock()
 		defer lock.Unlock()
 
-		nodes[nodeId] = true
-	}))
+		nodeIdString := hex.EncodeToString(packet.OwnID)
+		timestamp := time.Now()
 
-	server.Events.NodeOffline.Attach(events.NewClosure(func(nodeId string) {
-		plugin.Node.Logger.Debugw("NodeOffline", "nodeID", nodeId)
-		lock.Lock()
-		defer lock.Unlock()
+		// When node is new, add to graph
+		if _, isAlready := nodes[nodeIdString]; !isAlready {
+			server.Events.AddNode.Trigger(nodeIdString)
+		}
+		// Save it + update timestamp
+		nodes[nodeIdString] = timestamp
+
+		// Outgoing neighbor links update
+		for _, outgoingNeighbor := range packet.OutboundIDs {
+			outgoingNeighborString := hex.EncodeToString(outgoingNeighbor)
+			// Do we already know about this neighbor?
+			// If no, add it and set it online
+			if _, isAlready := nodes[outgoingNeighborString]; !isAlready {
+				// First time we see this particular node
+				server.Events.AddNode.Trigger(outgoingNeighborString)
+			}
+			// We have indirectly heard about the neighbor.
+			nodes[outgoingNeighborString] = timestamp
+
+			// Do we have any links already with src=nodeIdString?
+			if _, isAlready := links[nodeIdString]; !isAlready {
+				// Nope, so we have to allocate an empty map to be nested in links for nodeIdString
+				links[nodeIdString] = make(map[string]time.Time)
+			}
+
+			// Update graph when connection hasn't been seen before
+			if _, isAlready := links[nodeIdString][outgoingNeighborString]; !isAlready {
+				server.Events.ConnectNodes.Trigger(nodeIdString, outgoingNeighborString)
+			}
+			// Update links
+			links[nodeIdString][outgoingNeighborString] = timestamp
+		}
 
-		nodes[nodeId] = false
+		// Incoming neighbor links update
+		for _, incomingNeighbor := range packet.InboundIDs {
+			incomingNeighborString := hex.EncodeToString(incomingNeighbor)
+			// Do we already know about this neighbor?
+			// If no, add it and set it online
+			if _, isAlready := nodes[incomingNeighborString]; !isAlready {
+				// First time we see this particular node
+				server.Events.AddNode.Trigger(incomingNeighborString)
+			}
+			// We have indirectly heard about the neighbor.
+			nodes[incomingNeighborString] = timestamp
+
+			// Do we have any links already with src=incomingNeighborString?
+			if _, isAlready := links[incomingNeighborString]; !isAlready {
+				// Nope, so we have to allocate an empty map to be nested in links for incomingNeighborString
+				links[incomingNeighborString] = make(map[string]time.Time)
+			}
+
+			// Update graph when connection hasn't been seen before
+			if _, isAlready := links[incomingNeighborString][nodeIdString]; !isAlready {
+				server.Events.ConnectNodes.Trigger(incomingNeighborString, nodeIdString)
+			}
+			// Update links map
+			links[incomingNeighborString][nodeIdString] = timestamp
+		}
 	}))
+}
 
-	server.Events.ConnectNodes.Attach(events.NewClosure(func(sourceId string, targetId string) {
-		plugin.Node.Logger.Debugw("ConnectNodes", "sourceID", sourceId, "targetId", targetId)
-		lock.Lock()
-		defer lock.Unlock()
-
-		connectionMap, connectionMapExists := links[sourceId]
-		if !connectionMapExists {
-			connectionMap = make(map[string]bool)
-
-			links[sourceId] = connectionMap
+func Run() {
+	daemon.BackgroundWorker("Analysis Server Record Manager", func(shutdownSignal <-chan struct{}) {
+		ticker := time.NewTicker(CleanUpPeriod)
+		defer ticker.Stop()
+		for {
+			select {
+			case <-shutdownSignal:
+				return
+
+			case <-ticker.C:
+				cleanUp(CleanUpPeriod)
+			}
 		}
-		connectionMap[targetId] = true
-	}))
+	}, shutdown.PriorityAnalysis)
+}
 
-	server.Events.DisconnectNodes.Attach(events.NewClosure(func(sourceId string, targetId string) {
-		plugin.Node.Logger.Debugw("DisconnectNodes", "sourceID", sourceId, "targetId", targetId)
-		lock.Lock()
-		defer lock.Unlock()
+// Remove nodes and links we haven't seen for at least 3 times the heartbeat interval
+func cleanUp(interval time.Duration) {
+	lock.Lock()
+	defer lock.Unlock()
+	now := time.Now()
+
+	// Go through the list of connections. Remove connections that are older than interval time.
+	for srcNode, targetMap := range links {
+		for trgNode, lastSeen := range targetMap {
+			if now.Sub(lastSeen) > interval {
+				delete(targetMap, trgNode)
+				server.Events.DisconnectNodes.Trigger(srcNode, trgNode)
+			}
+		}
+		// Delete src node from links if it doesn't have any connections
+		if len(targetMap) == 0 {
+			delete(links, srcNode)
+		}
+	}
 
-		connectionMap, connectionMapExists := links[sourceId]
-		if connectionMapExists {
-			delete(connectionMap, targetId)
+	// Go through the list of nodes. Remove nodes that haven't been seen for interval time
+	for node, lastSeen := range nodes {
+		if now.Sub(lastSeen) > interval {
+			delete(nodes, node)
+			server.Events.RemoveNode.Trigger(node)
 		}
-	}))
+	}
 }
 
-func getEventsToReplay() (map[string]bool, map[string]map[string]bool) {
+func getEventsToReplay() (map[string]time.Time, map[string]map[string]time.Time) {
 	lock.Lock()
 	defer lock.Unlock()
 
-	copiedNodes := make(map[string]bool)
-	for nodeId, online := range nodes {
-		copiedNodes[nodeId] = online
+	copiedNodes := make(map[string]time.Time, len(nodes))
+	for nodeID, lastHeartbeat := range nodes {
+		copiedNodes[nodeID] = lastHeartbeat
 	}
 
-	copiedLinks := make(map[string]map[string]bool)
-	for sourceId, targetMap := range links {
-		copiedLinks[sourceId] = make(map[string]bool)
-		for targetId := range targetMap {
-			copiedLinks[sourceId][targetId] = true
+	copiedLinks := make(map[string]map[string]time.Time, len(links))
+	for sourceID, targetMap := range links {
+		copiedLinks[sourceID] = make(map[string]time.Time, len(targetMap))
+		for targetID, lastHeartbeat := range targetMap {
+			copiedLinks[sourceID][targetID] = lastHeartbeat
 		}
 	}
 
@@ -98,18 +174,15 @@ func getEventsToReplay() (map[string]bool, map[string]map[string]bool) {
 func Replay(handlers *types.EventHandlers) {
 	copiedNodes, copiedLinks := getEventsToReplay()
 
-	for nodeId, online := range copiedNodes {
-		handlers.AddNode(nodeId)
-		if online {
-			handlers.NodeOnline(nodeId)
-		} else {
-			handlers.NodeOffline(nodeId)
-		}
+	// When a node is present in the list, it means we heard about it directly
+	// or indirectly, but within CLEAN_UP_PERIOD, therefore it is online
+	for nodeID := range copiedNodes {
+		handlers.AddNode(nodeID)
 	}
 
-	for sourceId, targetMap := range copiedLinks {
-		for targetId := range targetMap {
-			handlers.ConnectNodes(sourceId, targetId)
+	for sourceID, targetMap := range copiedLinks {
+		for targetID := range targetMap {
+			handlers.ConnectNodes(sourceID, targetID)
 		}
 	}
 }
diff --git a/plugins/analysis/webinterface/types/types.go b/plugins/analysis/webinterface/types/types.go
index 475da9ad04a9b8b575313dea63f66d1108a2389f..76aca004ea0c8fca6c0a11573cbfa629b7e33419 100644
--- a/plugins/analysis/webinterface/types/types.go
+++ b/plugins/analysis/webinterface/types/types.go
@@ -5,8 +5,6 @@ type EventHandlers = struct {
 	RemoveNode      func(nodeId string)
 	ConnectNodes    func(sourceId string, targetId string)
 	DisconnectNodes func(sourceId string, targetId string)
-	NodeOnline      func(nodeId string)
-	NodeOffline     func(nodeId string)
 }
 
 type EventHandlersConsumer = func(handler *EventHandlers)