diff --git a/.dockerignore b/.dockerignore index 95feeba4c6f..aaf093a40b5 100644 --- a/.dockerignore +++ b/.dockerignore @@ -3,6 +3,7 @@ docs examples !examples/v1alpha3/nas +!examples/v1beta1/nas manifests pkg/ui/*/frontend/node_modules pkg/ui/*/frontend/build diff --git a/.travis.yml b/.travis.yml index 066c35d8ca8..0ba0fb119d6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ jobs: go_import_path: github.com/kubeflow/katib install: - curl -L -O "https://github.com/kubernetes-sigs/kubebuilder/releases/download/v1.0.7/kubebuilder_1.0.7_linux_amd64.tar.gz" - - # extract the archive + - # extract the archive - tar -zxvf kubebuilder_1.0.7_linux_amd64.tar.gz - sudo mv kubebuilder_1.0.7_linux_amd64 /usr/local/kubebuilder - export PATH=$PATH:/usr/local/kubebuilder/bin @@ -22,4 +22,5 @@ jobs: install: - npm install --global prettier@1.19.1 script: + - make prettier-check-v1alpha3 - make prettier-check diff --git a/Makefile b/Makefile index 2060368c55e..b47705fdbbc 100644 --- a/Makefile +++ b/Makefile @@ -33,14 +33,22 @@ vet: depend generate update: hack/update-gofmt.sh -# Deploy katib v1alpha3 manifests into a k8s cluster -deploy: +# Deploy Katib v1alpha3 manifests into a k8s cluster +deployv1alpha3: bash scripts/v1alpha3/deploy.sh -# Undeploy katib v1alpha3 manifests into a k8s cluster -undeploy: +# Deploy Katib v1beta1 manifests into a k8s cluster +deploy: + bash scripts/v1beta1/deploy.sh + +# Undeploy Katib v1alpha3 manifests from a k8s cluster +undeployv1alpha3: bash scripts/v1alpha3/undeploy.sh +# Undeploy Katib v1beta1 manifests from a k8s cluster +undeploy: + bash scripts/v1beta1/undeploy.sh + # Generate code generate: ifndef GOPATH @@ -48,8 +56,18 @@ ifndef GOPATH endif go generate ./pkg/... ./cmd/... -build: depend generate +# Build images for Katib v1alpha3 components +buildv1alpha3: depend generate bash scripts/v1alpha3/build.sh -prettier-check: +# Build images for Katib v1beta1 components +build: depend generate + bash scripts/v1beta1/build.sh + +# Prettier UI format check for Katib v1alpha3 +prettier-check-v1alpha3: npm run format:check --prefix pkg/ui/v1alpha3/frontend + +# Prettier UI format check for Katib v1beta1 +prettier-check: + npm run format:check --prefix pkg/ui/v1beta1/frontend diff --git a/cmd/db-manager/v1beta1/Dockerfile b/cmd/db-manager/v1beta1/Dockerfile new file mode 100644 index 00000000000..6d884eb4ad0 --- /dev/null +++ b/cmd/db-manager/v1beta1/Dockerfile @@ -0,0 +1,26 @@ +FROM golang:alpine AS build-env +# The GOPATH in the image is /go. +ADD . /go/src/github.com/kubeflow/katib +WORKDIR /go/src/github.com/kubeflow/katib/cmd/db-manager +RUN if [ "$(uname -m)" = "ppc64le" ] || [ "$(uname -m)" = "aarch64" ]; then \ + apk --update add git gcc musl-dev && \ + go build -o katib-db-manager ./v1beta1; \ + else \ + go build -o katib-db-manager ./v1beta1; \ + fi +RUN GRPC_HEALTH_PROBE_VERSION=v0.3.1 && \ + if [ "$(uname -m)" = "ppc64le" ]; then \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-ppc64le; \ + elif [ "$(uname -m)" = "aarch64" ]; then \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-arm64; \ + else \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64; \ + fi && \ + chmod +x /bin/grpc_health_probe + +FROM alpine:3.7 +WORKDIR /app +COPY --from=build-env /bin/grpc_health_probe /bin/ +COPY --from=build-env /go/src/github.com/kubeflow/katib/cmd/db-manager/katib-db-manager /app/ +ENTRYPOINT ["./katib-db-manager"] +CMD ["-w", "kubernetes"] diff --git a/cmd/db-manager/v1beta1/main.go b/cmd/db-manager/v1beta1/main.go new file mode 100644 index 00000000000..b65ab7c5b7b --- /dev/null +++ b/cmd/db-manager/v1beta1/main.go @@ -0,0 +1,100 @@ +package main + +import ( + "context" + "flag" + "fmt" + "net" + "os" + + health_pb "github.com/kubeflow/katib/pkg/apis/manager/health" + api_pb "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" + db "github.com/kubeflow/katib/pkg/db/v1beta1" + "github.com/kubeflow/katib/pkg/db/v1beta1/common" + "k8s.io/klog" + + "google.golang.org/grpc" + "google.golang.org/grpc/reflection" +) + +const ( + port = "0.0.0.0:6789" +) + +var dbIf common.KatibDBInterface + +type server struct { +} + +// Report a log of Observations for a Trial. +// The log consists of timestamp and value of metric. +// Katib store every log of metrics. +// You can see accuracy curve or other metric logs on UI. +func (s *server) ReportObservationLog(ctx context.Context, in *api_pb.ReportObservationLogRequest) (*api_pb.ReportObservationLogReply, error) { + err := dbIf.RegisterObservationLog(in.TrialName, in.ObservationLog) + return &api_pb.ReportObservationLogReply{}, err +} + +// Get all log of Observations for a Trial. +func (s *server) GetObservationLog(ctx context.Context, in *api_pb.GetObservationLogRequest) (*api_pb.GetObservationLogReply, error) { + ol, err := dbIf.GetObservationLog(in.TrialName, in.MetricName, in.StartTime, in.EndTime) + return &api_pb.GetObservationLogReply{ + ObservationLog: ol, + }, err +} + +// Delete all log of Observations for a Trial. +func (s *server) DeleteObservationLog(ctx context.Context, in *api_pb.DeleteObservationLogRequest) (*api_pb.DeleteObservationLogReply, error) { + err := dbIf.DeleteObservationLog(in.TrialName) + return &api_pb.DeleteObservationLogReply{}, err +} + +func (s *server) Check(ctx context.Context, in *health_pb.HealthCheckRequest) (*health_pb.HealthCheckResponse, error) { + resp := health_pb.HealthCheckResponse{ + Status: health_pb.HealthCheckResponse_SERVING, + } + + // We only accept optional service name only if it's set to suggested format. + if in != nil && in.Service != "" && in.Service != "grpc.health.v1.Health" { + resp.Status = health_pb.HealthCheckResponse_UNKNOWN + return &resp, fmt.Errorf("grpc.health.v1.Health can only be accepted if you specify service name.") + } + + // Check if connection to katib db driver is okay since otherwise manager could not serve most of its methods. + err := dbIf.SelectOne() + if err != nil { + resp.Status = health_pb.HealthCheckResponse_NOT_SERVING + return &resp, fmt.Errorf("Failed to execute `SELECT 1` probe: %v", err) + } + + return &resp, nil +} + +func main() { + flag.Parse() + var err error + dbNameEnvName := common.DBNameEnvName + dbName := os.Getenv(dbNameEnvName) + if dbName == "" { + klog.Fatal("DB_NAME env is not set. Exiting") + } + dbIf, err = db.NewKatibDBInterface(dbName) + if err != nil { + klog.Fatalf("Failed to open db connection: %v", err) + } + dbIf.DBInit() + listener, err := net.Listen("tcp", port) + if err != nil { + klog.Fatalf("Failed to listen: %v", err) + } + + size := 1<<31 - 1 + klog.Infof("Start Katib manager: %s", port) + s := grpc.NewServer(grpc.MaxRecvMsgSize(size), grpc.MaxSendMsgSize(size)) + api_pb.RegisterManagerServer(s, &server{}) + health_pb.RegisterHealthServer(s, &server{}) + reflection.Register(s) + if err = s.Serve(listener); err != nil { + klog.Fatalf("Failed to serve: %v", err) + } +} diff --git a/cmd/db-manager/v1beta1/main_test.go b/cmd/db-manager/v1beta1/main_test.go new file mode 100644 index 00000000000..e91e136125a --- /dev/null +++ b/cmd/db-manager/v1beta1/main_test.go @@ -0,0 +1,171 @@ +package main + +import ( + "context" + "testing" + + "github.com/golang/mock/gomock" + + health_pb "github.com/kubeflow/katib/pkg/apis/manager/health" + api_pb "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" + mockdb "github.com/kubeflow/katib/pkg/mock/v1beta1/db" +) + +func TestReportObservationLog(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + s := &server{} + mockDB := mockdb.NewMockKatibDBInterface(ctrl) + dbIf = mockDB + + req := &api_pb.ReportObservationLogRequest{ + TrialName: "test1-trial1", + ObservationLog: &api_pb.ObservationLog{ + MetricLogs: []*api_pb.MetricLog{ + { + TimeStamp: "2019-02-03T04:05:06+09:00", + Metric: &api_pb.Metric{ + Name: "f1_score", + Value: "88.95", + }, + }, + { + TimeStamp: "2019-02-03T04:05:06+09:00", + Metric: &api_pb.Metric{ + Name: "loss", + Value: "0.5", + }, + }, + { + TimeStamp: "2019-02-03T04:05:06+09:00", + Metric: &api_pb.Metric{ + Name: "precision", + Value: "88.7", + }, + }, + { + TimeStamp: "2019-02-03T04:05:06+09:00", + Metric: &api_pb.Metric{ + Name: "recall", + Value: "89.2", + }, + }, + }, + }, + } + mockDB.EXPECT().RegisterObservationLog(req.TrialName, req.ObservationLog).Return(nil) + _, err := s.ReportObservationLog(context.Background(), req) + if err != nil { + t.Fatalf("ReportObservationLog Error %v", err) + } +} + +func TestGetObservationLog(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + s := &server{} + mockDB := mockdb.NewMockKatibDBInterface(ctrl) + dbIf = mockDB + + req := &api_pb.GetObservationLogRequest{ + TrialName: "test1-trial1", + StartTime: "2019-02-03T03:05:06+09:00", + EndTime: "2019-02-03T05:05:06+09:00", + } + + obs := &api_pb.ObservationLog{ + MetricLogs: []*api_pb.MetricLog{ + { + TimeStamp: "2019-02-03T04:05:06+09:00", + Metric: &api_pb.Metric{ + Name: "f1_score", + Value: "88.95", + }, + }, + { + TimeStamp: "2019-02-03T04:05:06+09:00", + Metric: &api_pb.Metric{ + Name: "loss", + Value: "0.5", + }, + }, + { + TimeStamp: "2019-02-03T04:05:06+09:00", + Metric: &api_pb.Metric{ + Name: "precision", + Value: "88.7", + }, + }, + { + TimeStamp: "2019-02-03T04:05:06+09:00", + Metric: &api_pb.Metric{ + Name: "recall", + Value: "89.2", + }, + }, + }, + } + + mockDB.EXPECT().GetObservationLog(req.TrialName, req.MetricName, req.StartTime, req.EndTime).Return(obs, nil) + ret, err := s.GetObservationLog(context.Background(), req) + if err != nil { + t.Fatalf("GetObservationLog Error %v", err) + } + if len(obs.MetricLogs) != len(ret.ObservationLog.MetricLogs) { + t.Fatalf("GetObservationLog Test fail expect metrics number %d got %d", len(obs.MetricLogs), len(ret.ObservationLog.MetricLogs)) + } +} + +func TestDeleteObservationLog(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + s := &server{} + mockDB := mockdb.NewMockKatibDBInterface(ctrl) + dbIf = mockDB + + req := &api_pb.DeleteObservationLogRequest{ + TrialName: "test1-trial1", + } + mockDB.EXPECT().DeleteObservationLog(req.TrialName).Return(nil) + _, err := s.DeleteObservationLog(context.Background(), req) + if err != nil { + t.Fatalf("DeleteExperiment Error %v", err) + } +} + +func TestCheck(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + s := &server{} + mockDB := mockdb.NewMockKatibDBInterface(ctrl) + dbIf = mockDB + testCases := []struct { + Request *health_pb.HealthCheckRequest + ExpectedStatus health_pb.HealthCheckResponse_ServingStatus + Name string + }{ + { + Request: &health_pb.HealthCheckRequest{ + Service: "grpc.health.v1.Health", + }, + ExpectedStatus: health_pb.HealthCheckResponse_SERVING, + Name: "Valid Request", + }, + { + Request: &health_pb.HealthCheckRequest{ + Service: "grpc.health.v1.1.Health", + }, + ExpectedStatus: health_pb.HealthCheckResponse_UNKNOWN, + Name: "Invalid service name", + }, + } + + mockDB.EXPECT().SelectOne().Return(nil) + + for _, tc := range testCases { + response, _ := s.Check(context.Background(), tc.Request) + if response.Status != tc.ExpectedStatus { + t.Fatalf("Case %v failed. ExpectedStatus %v, got %v", tc.Name, tc.ExpectedStatus, response.Status) + } + } +} diff --git a/cmd/katib-controller/v1beta1/Dockerfile b/cmd/katib-controller/v1beta1/Dockerfile new file mode 100644 index 00000000000..6ad31c3f49b --- /dev/null +++ b/cmd/katib-controller/v1beta1/Dockerfile @@ -0,0 +1,22 @@ +# Build the manager binary +FROM golang:alpine AS build-env + +# Copy in the go src +ADD . /go/src/github.com/kubeflow/katib + +WORKDIR /go/src/github.com/kubeflow/katib/cmd/katib-controller +# Build +RUN if [ "$(uname -m)" = "ppc64le" ]; then \ + CGO_ENABLED=0 GOOS=linux GOARCH=ppc64le go build -a -o katib-controller ./v1beta1; \ + elif [ "$(uname -m)" = "aarch64" ]; then \ + CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -a -o katib-controller ./v1beta1; \ + else \ + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o katib-controller ./v1beta1; \ + fi +# Copy the controller-manager into a thin image +FROM alpine:3.7 +WORKDIR /app +RUN apk update && apk add ca-certificates +COPY --from=build-env /go/src/github.com/kubeflow/katib/cmd/katib-controller/katib-controller . +USER 1000 +ENTRYPOINT ["./katib-controller"] diff --git a/cmd/katib-controller/v1beta1/main.go b/cmd/katib-controller/v1beta1/main.go new file mode 100644 index 00000000000..86550c47be6 --- /dev/null +++ b/cmd/katib-controller/v1beta1/main.go @@ -0,0 +1,123 @@ +/* +Copyright 2018 The Kubeflow Authors +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/* + Katib-controller is a controller (operator) for Experiments and Trials +*/ +package main + +import ( + "flag" + "os" + + "github.com/spf13/viper" + _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" + "sigs.k8s.io/controller-runtime/pkg/client/config" + "sigs.k8s.io/controller-runtime/pkg/manager" + logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + "sigs.k8s.io/controller-runtime/pkg/runtime/signals" + + apis "github.com/kubeflow/katib/pkg/apis/controller" + controller "github.com/kubeflow/katib/pkg/controller.v1beta1" + "github.com/kubeflow/katib/pkg/controller.v1beta1/consts" + webhook "github.com/kubeflow/katib/pkg/webhook/v1beta1" +) + +func main() { + logf.SetLogger(logf.ZapLogger(false)) + log := logf.Log.WithName("entrypoint") + + var experimentSuggestionName string + var metricsAddr string + var webhookPort int + var certLocalFS bool + var injectSecurityContext bool + var serviceName string + var enableGRPCProbeInSuggestion bool + + flag.StringVar(&experimentSuggestionName, "experiment-suggestion-name", + "default", "The implementation of suggestion interface in experiment controller (default|fake)") + flag.StringVar(&metricsAddr, "metrics-addr", ":8080", "The address the metric endpoint binds to.") + flag.IntVar(&webhookPort, "webhook-port", 8443, "The port number to be used for admission webhook server.") + flag.BoolVar(&certLocalFS, "cert-localfs", false, "Store the webhook cert in local file system") + flag.BoolVar(&injectSecurityContext, "webhook-inject-securitycontext", false, "Inject the securityContext of container[0] in the sidecar") + flag.StringVar(&serviceName, "webhook-service-name", "katib-controller", "The service name which will be used in webhook") + flag.BoolVar(&enableGRPCProbeInSuggestion, "enable-grpc-probe-in-suggestion", true, "enable grpc probe in suggestions") + + flag.Parse() + + // Set the config in viper. + viper.Set(consts.ConfigExperimentSuggestionName, experimentSuggestionName) + viper.Set(consts.ConfigCertLocalFS, certLocalFS) + viper.Set(consts.ConfigInjectSecurityContext, injectSecurityContext) + viper.Set(consts.ConfigEnableGRPCProbeInSuggestion, enableGRPCProbeInSuggestion) + + log.Info("Config:", + consts.ConfigExperimentSuggestionName, + viper.GetString(consts.ConfigExperimentSuggestionName), + consts.ConfigCertLocalFS, + viper.GetBool(consts.ConfigCertLocalFS), + "webhook-port", + webhookPort, + "metrics-addr", + metricsAddr, + consts.ConfigInjectSecurityContext, + viper.GetBool(consts.ConfigInjectSecurityContext), + consts.ConfigEnableGRPCProbeInSuggestion, + viper.GetBool(consts.ConfigEnableGRPCProbeInSuggestion), + ) + + // Get a config to talk to the apiserver + cfg, err := config.GetConfig() + if err != nil { + log.Error(err, "Fail to get the config") + os.Exit(1) + } + + // Create a new katib controller to provide shared dependencies and start components + mgr, err := manager.New(cfg, manager.Options{ + MetricsBindAddress: metricsAddr, + }) + if err != nil { + log.Error(err, "unable add APIs to scheme") + os.Exit(1) + } + + log.Info("Registering Components.") + + // Setup Scheme for all resources + if err := apis.AddToScheme(mgr.GetScheme()); err != nil { + log.Error(err, "Fail to create the manager") + os.Exit(1) + } + + // Setup all Controllers + log.Info("Setting up controller") + if err := controller.AddToManager(mgr); err != nil { + log.Error(err, "unable to register controllers to the manager") + os.Exit(1) + } + + log.Info("Setting up webhooks") + if err := webhook.AddToManager(mgr, int32(webhookPort), serviceName); err != nil { + log.Error(err, "unable to register webhooks to the manager") + os.Exit(1) + } + + // Start the Cmd + log.Info("Starting the Cmd.") + if err := mgr.Start(signals.SetupSignalHandler()); err != nil { + log.Error(err, "unable to run the manager") + os.Exit(1) + } +} diff --git a/cmd/metricscollector/v1beta1/file-metricscollector/Dockerfile b/cmd/metricscollector/v1beta1/file-metricscollector/Dockerfile new file mode 100644 index 00000000000..5ce6894ca46 --- /dev/null +++ b/cmd/metricscollector/v1beta1/file-metricscollector/Dockerfile @@ -0,0 +1,22 @@ +# Build the manager binary +FROM golang:alpine AS build-env + +# Copy in the go src +ADD . /go/src/github.com/kubeflow/katib + +WORKDIR /go/src/github.com/kubeflow/katib/cmd/metricscollector/v1beta1/file-metricscollector/ + +# Build +RUN if [ "$(uname -m)" = "ppc64le" ]; then \ + CGO_ENABLED=0 GOOS=linux GOARCH=ppc64le go build -a -o file-metricscollector ./; \ + elif [ "$(uname -m)" = "aarch64" ]; then \ + CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -a -o file-metricscollector ./; \ + else \ + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o file-metricscollector ./; \ + fi + +# Copy the controller-manager into a thin image +FROM alpine:3.7 +WORKDIR /app +COPY --from=build-env /go/src/github.com/kubeflow/katib/cmd/metricscollector/v1beta1/file-metricscollector/file-metricscollector . +ENTRYPOINT ["./file-metricscollector"] diff --git a/cmd/metricscollector/v1beta1/file-metricscollector/main.go b/cmd/metricscollector/v1beta1/file-metricscollector/main.go new file mode 100644 index 00000000000..73543aa129c --- /dev/null +++ b/cmd/metricscollector/v1beta1/file-metricscollector/main.go @@ -0,0 +1,128 @@ +/* +Copyright 2018 The Kubeflow Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/* +MetricsCollector is a default metricscollector for worker. +It will collect metrics from pod log. +You should print metrics in {{MetricsName}}={{MetricsValue}} format. +For example, the objective value name is F1 and the metrics are loss, your training code should print like below. + --- + epoch 1: + batch1 loss=0.8 + batch2 loss=0.6 + + F1=0.4 + + epoch 2: + batch1 loss=0.4 + batch2 loss=0.2 + + F1=0.7 + --- +The metrics collector will collect all logs of metrics. +*/ + +package main + +import ( + "context" + "flag" + "os" + "path/filepath" + "strings" + + "github.com/hpcloud/tail" + "google.golang.org/grpc" + "k8s.io/klog" + + api "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" + "github.com/kubeflow/katib/pkg/metricscollector/v1beta1/common" + filemc "github.com/kubeflow/katib/pkg/metricscollector/v1beta1/file-metricscollector" +) + +var ( + metricsFileName = flag.String("path", "", "Metrics File Path") + trialName = flag.String("t", "", "Trial Name") + managerService = flag.String("s", "", "Katib Manager service") + metricNames = flag.String("m", "", "Metric names") + filters = flag.String("f", "", "Metric filters") + pollInterval = flag.Duration("p", common.DefaultPollInterval, "Poll interval to check if main process of worker container exit") + timeout = flag.Duration("timeout", common.DefaultTimeout, "Timeout to check if main process of worker container exit") + waitAll = flag.Bool("w", common.DefaultWaitAll, "Whether wait for all other main process of container exiting") +) + +func printMetricsFile(mFile string) { + for { + _, err := os.Stat(mFile) + if err == nil { + break + } else if os.IsNotExist(err) { + continue + } else { + klog.Fatalf("could not watch metrics file: %v", err) + } + } + + t, _ := tail.TailFile(mFile, tail.Config{Follow: true}) + for line := range t.Lines { + klog.Info(line.Text) + } +} + +func main() { + flag.Parse() + klog.Infof("Trial Name: %s", *trialName) + + go printMetricsFile(*metricsFileName) + wopts := common.WaitPidsOpts{ + PollInterval: *pollInterval, + Timeout: *timeout, + WaitAll: *waitAll, + CompletedMarkedDirPath: filepath.Dir(*metricsFileName), + } + if err := common.Wait(wopts); err != nil { + klog.Fatalf("Failed to wait for worker container: %v", err) + } + + conn, err := grpc.Dial(*managerService, grpc.WithInsecure()) + if err != nil { + klog.Fatalf("could not connect: %v", err) + } + defer conn.Close() + c := api.NewManagerClient(conn) + ctx := context.Background() + var metricList []string + if len(*metricNames) != 0 { + metricList = strings.Split(*metricNames, ";") + } + var filterList []string + if len(*filters) != 0 { + filterList = strings.Split(*filters, ";") + } + olog, err := filemc.CollectObservationLog(*metricsFileName, metricList, filterList) + if err != nil { + klog.Fatalf("Failed to collect logs: %v", err) + } + reportreq := &api.ReportObservationLogRequest{ + TrialName: *trialName, + ObservationLog: olog, + } + _, err = c.ReportObservationLog(ctx, reportreq) + if err != nil { + klog.Fatalf("Failed to Report logs: %v", err) + } + klog.Infof("Metrics reported. :\n%v", olog) +} diff --git a/cmd/metricscollector/v1beta1/tfevent-metricscollector/Dockerfile b/cmd/metricscollector/v1beta1/tfevent-metricscollector/Dockerfile new file mode 100644 index 00000000000..b5d3c807d23 --- /dev/null +++ b/cmd/metricscollector/v1beta1/tfevent-metricscollector/Dockerfile @@ -0,0 +1,7 @@ +FROM tensorflow/tensorflow:1.11.0 +RUN pip install rfc3339 grpcio googleapis-common-protos +ADD . /usr/src/app/github.com/kubeflow/katib +WORKDIR /usr/src/app/github.com/kubeflow/katib/cmd/metricscollector/v1beta1/tfevent-metricscollector/ +RUN pip install --no-cache-dir -r requirements.txt +ENV PYTHONPATH /usr/src/app/github.com/kubeflow/katib:/usr/src/app/github.com/kubeflow/katib/pkg/apis/manager/v1beta1/python:/usr/src/app/github.com/kubeflow/katib/pkg/metricscollector/v1beta1/tfevent-metricscollector/:/usr/src/app/github.com/kubeflow/katib/pkg/metricscollector/v1beta1/common/ +ENTRYPOINT ["python", "main.py"] diff --git a/cmd/metricscollector/v1beta1/tfevent-metricscollector/Dockerfile.aarch64 b/cmd/metricscollector/v1beta1/tfevent-metricscollector/Dockerfile.aarch64 new file mode 100644 index 00000000000..44746a40e0b --- /dev/null +++ b/cmd/metricscollector/v1beta1/tfevent-metricscollector/Dockerfile.aarch64 @@ -0,0 +1,28 @@ +FROM ubuntu:18.04 + +RUN apt-get update \ + && apt-get -y install software-properties-common \ + autoconf \ + automake \ + build-essential \ + cmake \ + pkg-config \ + wget \ + python-pip \ + libhdf5-dev \ + libhdf5-serial-dev \ + hdf5-tools\ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +RUN wget https://github.com/lhelontra/tensorflow-on-arm/releases/download/v1.11.0/tensorflow-1.11.0-cp27-none-linux_aarch64.whl \ + && pip install tensorflow-1.11.0-cp27-none-linux_aarch64.whl \ + && rm tensorflow-1.11.0-cp27-none-linux_aarch64.whl \ + && rm -rf .cache + +RUN pip install rfc3339 grpcio googleapis-common-protos jupyter +ADD . /usr/src/app/github.com/kubeflow/katib +WORKDIR /usr/src/app/github.com/kubeflow/katib/cmd/metricscollector/v1beta1/tfevent-metricscollector/ +RUN pip install --no-cache-dir -r requirements.txt +ENV PYTHONPATH /usr/src/app/github.com/kubeflow/katib:/usr/src/app/github.com/kubeflow/katib/pkg/apis/manager/v1beta1/python:/usr/src/app/github.com/kubeflow/katib/pkg/metricscollector/v1beta1/tfevent-metricscollector/:/usr/src/app/github.com/kubeflow/katib/pkg/metricscollector/v1beta1/common/ +ENTRYPOINT ["python", "main.py"] diff --git a/cmd/metricscollector/v1beta1/tfevent-metricscollector/Dockerfile.ppc64le b/cmd/metricscollector/v1beta1/tfevent-metricscollector/Dockerfile.ppc64le new file mode 100644 index 00000000000..b8d2b637607 --- /dev/null +++ b/cmd/metricscollector/v1beta1/tfevent-metricscollector/Dockerfile.ppc64le @@ -0,0 +1,7 @@ +FROM ibmcom/tensorflow-ppc64le:1.14.0-py3 +RUN pip install rfc3339 grpcio googleapis-common-protos +ADD . /usr/src/app/github.com/kubeflow/katib +WORKDIR /usr/src/app/github.com/kubeflow/katib/cmd/metricscollector/v1beta1/tfevent-metricscollector/ +RUN pip install --no-cache-dir -r requirements.txt +ENV PYTHONPATH /usr/src/app/github.com/kubeflow/katib:/usr/src/app/github.com/kubeflow/katib/pkg/apis/manager/v1beta1/python:/usr/src/app/github.com/kubeflow/katib/pkg/metricscollector/v1beta1/tfevent-metricscollector/:/usr/src/app/github.com/kubeflow/katib/pkg/metricscollector/v1beta1/common/ +ENTRYPOINT ["python", "main.py"] diff --git a/cmd/metricscollector/v1beta1/tfevent-metricscollector/main.py b/cmd/metricscollector/v1beta1/tfevent-metricscollector/main.py new file mode 100644 index 00000000000..8d2d05ac7ef --- /dev/null +++ b/cmd/metricscollector/v1beta1/tfevent-metricscollector/main.py @@ -0,0 +1,54 @@ +import grpc +import argparse +import api_pb2 +import api_pb2_grpc +from pns import WaitOtherMainProcesses +from tfevent_loader import MetricsCollector +from logging import getLogger, StreamHandler, INFO + +timeout_in_seconds = 60 + + +def parse_options(): + parser = argparse.ArgumentParser( + description='TF-Event MetricsCollector', + add_help=True + ) + parser.add_argument("-s", "--manager_server_addr", + type=str, default="katib-db-manager:6789") + parser.add_argument("-t", "--trial_name", type=str, default="") + parser.add_argument("-path", "--dir_path", type=str, default="/log") + parser.add_argument("-m", "--metric_names", type=str, default="") + parser.add_argument("-f", "--metric_filters", type=str, default="") + opt = parser.parse_args() + return opt + + +if __name__ == '__main__': + logger = getLogger(__name__) + handler = StreamHandler() + handler.setLevel(INFO) + logger.setLevel(INFO) + logger.addHandler(handler) + logger.propagate = False + opt = parse_options() + manager_server = opt.manager_server_addr.split(':') + if len(manager_server) != 2: + raise Exception("Invalid katib manager service address: %s" % + opt.manager_server_addr) + + WaitOtherMainProcesses(completed_marked_dir=opt.dir_path) + + mc = MetricsCollector(opt.metric_names.split(';')) + observation_log = mc.parse_file(opt.dir_path) + + channel = grpc.beta.implementations.insecure_channel( + manager_server[0], int(manager_server[1])) + + with api_pb2.beta_create_Manager_stub(channel) as client: + logger.info("In " + opt.trial_name + " " + + str(len(observation_log.metric_logs)) + " metrics will be reported.") + client.ReportObservationLog(api_pb2.ReportObservationLogRequest( + trial_name=opt.trial_name, + observation_log=observation_log + ), timeout=timeout_in_seconds) diff --git a/cmd/metricscollector/v1beta1/tfevent-metricscollector/requirements.txt b/cmd/metricscollector/v1beta1/tfevent-metricscollector/requirements.txt new file mode 100644 index 00000000000..d2ec0c34de0 --- /dev/null +++ b/cmd/metricscollector/v1beta1/tfevent-metricscollector/requirements.txt @@ -0,0 +1 @@ +psutil==5.6.6 diff --git a/cmd/suggestion/chocolate/v1beta1/Dockerfile b/cmd/suggestion/chocolate/v1beta1/Dockerfile new file mode 100644 index 00000000000..e2224ef75f3 --- /dev/null +++ b/cmd/suggestion/chocolate/v1beta1/Dockerfile @@ -0,0 +1,24 @@ +FROM python:3.6 + +RUN if [ "$(uname -m)" = "ppc64le" ] || [ "$(uname -m)" = "aarch64" ]; then \ + apt-get -y update && \ + apt-get -y install gfortran libopenblas-dev liblapack-dev && \ + pip install cython 'numpy>=1.13.3'; \ + fi +RUN GRPC_HEALTH_PROBE_VERSION=v0.3.1 && \ + if [ "$(uname -m)" = "ppc64le" ]; then \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-ppc64le; \ + elif [ "$(uname -m)" = "aarch64" ]; then \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-arm64; \ + else \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64; \ + fi && \ + chmod +x /bin/grpc_health_probe + +ADD . /usr/src/app/github.com/kubeflow/katib +WORKDIR /usr/src/app/github.com/kubeflow/katib/cmd/suggestion/chocolate/v1beta1 +RUN pip install --no-cache-dir -r requirements.txt + +ENV PYTHONPATH /usr/src/app/github.com/kubeflow/katib:/usr/src/app/github.com/kubeflow/katib/pkg/apis/manager/v1beta1/python:/usr/src/app/github.com/kubeflow/katib/pkg/apis/manager/health/python + +ENTRYPOINT ["python", "main.py"] diff --git a/cmd/suggestion/chocolate/v1beta1/main.py b/cmd/suggestion/chocolate/v1beta1/main.py new file mode 100644 index 00000000000..86647cbd3a5 --- /dev/null +++ b/cmd/suggestion/chocolate/v1beta1/main.py @@ -0,0 +1,28 @@ +import grpc +import time +from pkg.apis.manager.v1beta1.python import api_pb2_grpc +from pkg.apis.manager.health.python import health_pb2_grpc +from pkg.suggestion.v1beta1.chocolate.service import ChocolateService +from concurrent import futures + +_ONE_DAY_IN_SECONDS = 60 * 60 * 24 +DEFAULT_PORT = "0.0.0.0:6789" + + +def serve(): + server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) + service = ChocolateService() + api_pb2_grpc.add_SuggestionServicer_to_server(service, server) + health_pb2_grpc.add_HealthServicer_to_server(service, server) + server.add_insecure_port(DEFAULT_PORT) + print("Listening...") + server.start() + try: + while True: + time.sleep(_ONE_DAY_IN_SECONDS) + except KeyboardInterrupt: + server.stop(0) + + +if __name__ == "__main__": + serve() diff --git a/cmd/suggestion/chocolate/v1beta1/requirements.txt b/cmd/suggestion/chocolate/v1beta1/requirements.txt new file mode 100644 index 00000000000..117ee92cbc7 --- /dev/null +++ b/cmd/suggestion/chocolate/v1beta1/requirements.txt @@ -0,0 +1,12 @@ +grpcio==1.23.0 +duecredit===0.7.0 +cloudpickle==0.5.6 +numpy>=1.13.3 +scikit-learn>=0.19.0 +scipy>=0.19.1 +forestci==0.3 +protobuf==3.9.1 +googleapis-common-protos==1.6.0 +SQLAlchemy==1.3.8 +git+https://github.com/AIworx-Labs/chocolate@master +ghalton>=0.6 diff --git a/cmd/suggestion/goptuna/v1beta1/Dockerfile b/cmd/suggestion/goptuna/v1beta1/Dockerfile new file mode 100644 index 00000000000..45372287bd7 --- /dev/null +++ b/cmd/suggestion/goptuna/v1beta1/Dockerfile @@ -0,0 +1,27 @@ +FROM golang:alpine AS go-build +# The GOPATH in the image is /go. +ADD . /go/src/github.com/kubeflow/katib +WORKDIR /go/src/github.com/kubeflow/katib/cmd/suggestion/goptuna +RUN if [ "$(uname -m)" = "ppc64le" ] || [ "$(uname -m)" = "aarch64" ]; then \ + apk --update add gcc musl-dev && \ + go build -o goptuna-suggestion ./v1beta1; \ + else \ + go build -o goptuna-suggestion ./v1beta1; \ + fi + +RUN GRPC_HEALTH_PROBE_VERSION=v0.3.1 && \ + if [ "$(uname -m)" = "ppc64le" ]; then \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-ppc64le; \ + elif [ "$(uname -m)" = "aarch64" ]; then \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-arm64; \ + else \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64; \ + fi && \ + chmod +x /bin/grpc_health_probe + +FROM alpine:3.7 +WORKDIR /app +COPY --from=go-build /bin/grpc_health_probe /bin/ +COPY --from=go-build /go/src/github.com/kubeflow/katib/cmd/suggestion/goptuna/goptuna-suggestion /app/ + +ENTRYPOINT ["./goptuna-suggestion"] diff --git a/cmd/suggestion/goptuna/v1beta1/main.go b/cmd/suggestion/goptuna/v1beta1/main.go new file mode 100644 index 00000000000..c359451730d --- /dev/null +++ b/cmd/suggestion/goptuna/v1beta1/main.go @@ -0,0 +1,41 @@ +package main + +import ( + "context" + "net" + + health_pb "github.com/kubeflow/katib/pkg/apis/manager/health" + api_v1_beta1 "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" + suggestion "github.com/kubeflow/katib/pkg/suggestion/v1beta1/goptuna" + "google.golang.org/grpc" + "k8s.io/klog" +) + +const ( + address = "0.0.0.0:6789" +) + +type healthService struct { +} + +func (s *healthService) Check(ctx context.Context, in *health_pb.HealthCheckRequest) (*health_pb.HealthCheckResponse, error) { + return &health_pb.HealthCheckResponse{ + Status: health_pb.HealthCheckResponse_SERVING, + }, nil +} + +func main() { + l, err := net.Listen("tcp", address) + if err != nil { + klog.Fatalf("Failed to listen: %v", err) + } + srv := grpc.NewServer() + api_v1_beta1.RegisterSuggestionServer(srv, suggestion.NewSuggestionService()) + health_pb.RegisterHealthServer(srv, &healthService{}) + + klog.Infof("Start Goptuna suggestion service: %s", address) + err = srv.Serve(l) + if err != nil { + klog.Fatalf("Failed to serve: %v", err) + } +} diff --git a/cmd/suggestion/hyperband/v1beta1/Dockerfile b/cmd/suggestion/hyperband/v1beta1/Dockerfile new file mode 100644 index 00000000000..65bd824d31f --- /dev/null +++ b/cmd/suggestion/hyperband/v1beta1/Dockerfile @@ -0,0 +1,25 @@ +FROM python:3.6 + +RUN if [ "$(uname -m)" = "ppc64le" ] || [ "$(uname -m)" = "aarch64" ]; then \ + apt-get -y update && \ + apt-get -y install gfortran libopenblas-dev liblapack-dev && \ + pip install cython; \ + fi + +RUN GRPC_HEALTH_PROBE_VERSION=v0.3.1 && \ + if [ "$(uname -m)" = "ppc64le" ]; then \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-ppc64le; \ + elif [ "$(uname -m)" = "aarch64" ]; then \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-arm64; \ + else \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64; \ + fi && \ + chmod +x /bin/grpc_health_probe + +ADD . /usr/src/app/github.com/kubeflow/katib +WORKDIR /usr/src/app/github.com/kubeflow/katib/cmd/suggestion/hyperband/v1beta1 +RUN pip install --no-cache-dir -r requirements.txt + +ENV PYTHONPATH /usr/src/app/github.com/kubeflow/katib:/usr/src/app/github.com/kubeflow/katib/pkg/apis/manager/v1beta1/python:/usr/src/app/github.com/kubeflow/katib/pkg/apis/manager/health/python + +ENTRYPOINT ["python", "main.py"] diff --git a/cmd/suggestion/hyperband/v1beta1/main.py b/cmd/suggestion/hyperband/v1beta1/main.py new file mode 100644 index 00000000000..c1517171ee3 --- /dev/null +++ b/cmd/suggestion/hyperband/v1beta1/main.py @@ -0,0 +1,29 @@ +import grpc +import time +from pkg.apis.manager.v1beta1.python import api_pb2_grpc +from pkg.apis.manager.health.python import health_pb2_grpc +from pkg.suggestion.v1beta1.hyperband.service import HyperbandService +from concurrent import futures + +_ONE_DAY_IN_SECONDS = 60 * 60 * 24 +DEFAULT_PORT = "0.0.0.0:6789" + + +def serve(): + server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) + service = HyperbandService() + api_pb2_grpc.add_SuggestionServicer_to_server(service, server) + health_pb2_grpc.add_HealthServicer_to_server(service, server) + + server.add_insecure_port(DEFAULT_PORT) + print("Listening...") + server.start() + try: + while True: + time.sleep(_ONE_DAY_IN_SECONDS) + except KeyboardInterrupt: + server.stop(0) + + +if __name__ == "__main__": + serve() diff --git a/cmd/suggestion/hyperband/v1beta1/requirements.txt b/cmd/suggestion/hyperband/v1beta1/requirements.txt new file mode 100644 index 00000000000..210d97f7f81 --- /dev/null +++ b/cmd/suggestion/hyperband/v1beta1/requirements.txt @@ -0,0 +1,9 @@ +grpcio==1.23.0 +duecredit===0.7.0 +cloudpickle==0.5.6 +numpy>=1.13.3 +scikit-learn>=0.19.0 +scipy>=0.19.1 +forestci==0.3 +protobuf==3.9.1 +googleapis-common-protos==1.6.0 diff --git a/cmd/suggestion/hyperopt/v1beta1/Dockerfile b/cmd/suggestion/hyperopt/v1beta1/Dockerfile new file mode 100644 index 00000000000..bda18733ddd --- /dev/null +++ b/cmd/suggestion/hyperopt/v1beta1/Dockerfile @@ -0,0 +1,26 @@ +FROM python:3.6 + +RUN if [ "$(uname -m)" = "ppc64le" ] || [ "$(uname -m)" = "aarch64" ]; then \ + apt-get -y update && \ + apt-get -y install gfortran libopenblas-dev liblapack-dev && \ + pip install cython; \ + fi + +RUN GRPC_HEALTH_PROBE_VERSION=v0.3.1 && \ + if [ "$(uname -m)" = "ppc64le" ]; then \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-ppc64le; \ + elif [ "$(uname -m)" = "aarch64" ]; then \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-arm64; \ + else \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64; \ + fi && \ + chmod +x /bin/grpc_health_probe + +ADD . /usr/src/app/github.com/kubeflow/katib +WORKDIR /usr/src/app/github.com/kubeflow/katib/cmd/suggestion/hyperopt/v1beta1 +RUN pip install --no-cache-dir -r requirements.txt + +ENV PYTHONPATH /usr/src/app/github.com/kubeflow/katib:/usr/src/app/github.com/kubeflow/katib/pkg/apis/manager/v1beta1/python:/usr/src/app/github.com/kubeflow/katib/pkg/apis/manager/health/python + +ENTRYPOINT ["python", "main.py"] + diff --git a/cmd/suggestion/hyperopt/v1beta1/main.py b/cmd/suggestion/hyperopt/v1beta1/main.py new file mode 100644 index 00000000000..c80abb7e356 --- /dev/null +++ b/cmd/suggestion/hyperopt/v1beta1/main.py @@ -0,0 +1,28 @@ +import grpc +import time +from pkg.apis.manager.v1beta1.python import api_pb2_grpc +from pkg.apis.manager.health.python import health_pb2_grpc +from pkg.suggestion.v1beta1.hyperopt.service import HyperoptService +from concurrent import futures + +_ONE_DAY_IN_SECONDS = 60 * 60 * 24 +DEFAULT_PORT = "0.0.0.0:6789" + + +def serve(): + server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) + service = HyperoptService() + api_pb2_grpc.add_SuggestionServicer_to_server(service, server) + health_pb2_grpc.add_HealthServicer_to_server(service, server) + server.add_insecure_port(DEFAULT_PORT) + print("Listening...") + server.start() + try: + while True: + time.sleep(_ONE_DAY_IN_SECONDS) + except KeyboardInterrupt: + server.stop(0) + + +if __name__ == "__main__": + serve() diff --git a/cmd/suggestion/hyperopt/v1beta1/requirements.txt b/cmd/suggestion/hyperopt/v1beta1/requirements.txt new file mode 100644 index 00000000000..b4bf1ae04e8 --- /dev/null +++ b/cmd/suggestion/hyperopt/v1beta1/requirements.txt @@ -0,0 +1,10 @@ +grpcio==1.23.0 +duecredit===0.7.0 +cloudpickle==0.5.6 +numpy>=1.13.3 +scikit-learn>=0.19.0 +scipy>=0.19.1 +forestci==0.3 +protobuf==3.9.1 +googleapis-common-protos==1.6.0 +hyperopt==0.2.3 diff --git a/cmd/suggestion/nas/darts/v1beta1/Dockerfile b/cmd/suggestion/nas/darts/v1beta1/Dockerfile new file mode 100644 index 00000000000..f4de4553285 --- /dev/null +++ b/cmd/suggestion/nas/darts/v1beta1/Dockerfile @@ -0,0 +1,26 @@ +FROM python:3.6 + +RUN if [ "$(uname -m)" = "ppc64le" ] || [ "$(uname -m)" = "aarch64" ]; then \ + apt-get -y update && \ + apt-get -y install gfortran libopenblas-dev liblapack-dev && \ + pip install cython; \ + fi + +RUN GRPC_HEALTH_PROBE_VERSION=v0.3.1 && \ + if [ "$(uname -m)" = "ppc64le" ]; then \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-ppc64le; \ + elif [ "$(uname -m)" = "aarch64" ]; then \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-arm64; \ + else \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64; \ + fi && \ + chmod +x /bin/grpc_health_probe + +ADD . /usr/src/app/github.com/kubeflow/katib +WORKDIR /usr/src/app/github.com/kubeflow/katib/cmd/suggestion/nas/darts/v1beta1 +RUN pip install --no-cache-dir -r requirements.txt + +ENV PYTHONPATH /usr/src/app/github.com/kubeflow/katib:/usr/src/app/github.com/kubeflow/katib/pkg/apis/manager/v1beta1/python:/usr/src/app/github.com/kubeflow/katib/pkg/apis/manager/health/python + +ENTRYPOINT ["python", "main.py"] + diff --git a/cmd/suggestion/nas/darts/v1beta1/main.py b/cmd/suggestion/nas/darts/v1beta1/main.py new file mode 100644 index 00000000000..4d8bf9085d0 --- /dev/null +++ b/cmd/suggestion/nas/darts/v1beta1/main.py @@ -0,0 +1,30 @@ +import grpc +from concurrent import futures +import time +from pkg.apis.manager.v1beta1.python import api_pb2_grpc +from pkg.apis.manager.health.python import health_pb2_grpc +from pkg.suggestion.v1beta1.nas.darts.service import DartsService + + +_ONE_DAY_IN_SECONDS = 60 * 60 * 24 +DEFAULT_PORT = "0.0.0.0:6789" + + +def serve(): + print("Darts Suggestion Service") + server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) + service = DartsService() + api_pb2_grpc.add_SuggestionServicer_to_server(service, server) + health_pb2_grpc.add_HealthServicer_to_server(service, server) + server.add_insecure_port(DEFAULT_PORT) + print("Listening...") + server.start() + try: + while True: + time.sleep(_ONE_DAY_IN_SECONDS) + except KeyboardInterrupt: + server.stop(0) + + +if __name__ == "__main__": + serve() diff --git a/cmd/suggestion/nas/darts/v1beta1/requirements.txt b/cmd/suggestion/nas/darts/v1beta1/requirements.txt new file mode 100644 index 00000000000..92bd5706e11 --- /dev/null +++ b/cmd/suggestion/nas/darts/v1beta1/requirements.txt @@ -0,0 +1,3 @@ +grpcio==1.23.0 +protobuf==3.9.1 +googleapis-common-protos==1.6.0 diff --git a/cmd/suggestion/nas/enas/v1beta1/Dockerfile b/cmd/suggestion/nas/enas/v1beta1/Dockerfile new file mode 100644 index 00000000000..fe2f3247f2f --- /dev/null +++ b/cmd/suggestion/nas/enas/v1beta1/Dockerfile @@ -0,0 +1,22 @@ +FROM python:3.6 + +RUN if [ "$(uname -m)" = "ppc64le" ]; then \ + apt-get -y update && \ + apt-get -y install gfortran libopenblas-dev liblapack-dev && \ + pip install cython; \ + fi +RUN GRPC_HEALTH_PROBE_VERSION=v0.3.1 && \ + if [ "$(uname -m)" = "ppc64le" ]; then \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-ppc64le; \ + else \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64; \ + fi && \ + chmod +x /bin/grpc_health_probe + +ADD . /usr/src/app/github.com/kubeflow/katib +WORKDIR /usr/src/app/github.com/kubeflow/katib/cmd/suggestion/nas/enas/v1beta1 +RUN pip install --no-cache-dir -r requirements.txt + +ENV PYTHONPATH /usr/src/app/github.com/kubeflow/katib:/usr/src/app/github.com/kubeflow/katib/pkg/apis/manager/v1beta1/python:/usr/src/app/github.com/kubeflow/katib/pkg/apis/manager/health/python + +ENTRYPOINT ["python", "main.py"] diff --git a/cmd/suggestion/nas/enas/v1beta1/Dockerfile.aarch64 b/cmd/suggestion/nas/enas/v1beta1/Dockerfile.aarch64 new file mode 100644 index 00000000000..153e938b6af --- /dev/null +++ b/cmd/suggestion/nas/enas/v1beta1/Dockerfile.aarch64 @@ -0,0 +1,51 @@ +FROM golang:alpine AS build-env +# The GOPATH in the image is /go. +ADD . /go/src/github.com/kubeflow/katib +RUN if [ "$(uname -m)" = "ppc64le" ] || [ "$(uname -m)" = "aarch64" ]; then \ + apk --update add git gcc musl-dev && \ + go get github.com/grpc-ecosystem/grpc-health-probe && \ + mv $GOPATH/bin/grpc-health-probe /bin/grpc_health_probe && \ + chmod +x /bin/grpc_health_probe; \ + else \ + GRPC_HEALTH_PROBE_VERSION=v0.3.1 && \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \ + chmod +x /bin/grpc_health_probe; \ + fi + +FROM python:3.7-slim-buster + +RUN apt-get update \ + && apt-get -y install software-properties-common \ + autoconf \ + automake \ + build-essential \ + cmake \ + libtool \ + pkg-config \ + wget \ + gfortran \ + libopenblas-dev \ + liblapack-dev \ + libhdf5-dev \ + libhdf5-serial-dev \ + hdf5-tools \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +RUN pip install cython numpy + +RUN wget https://github.com/lhelontra/tensorflow-on-arm/releases/download/v1.14.0-buster/tensorflow-1.14.0-cp37-none-linux_aarch64.whl \ + && pip install tensorflow-1.14.0-cp37-none-linux_aarch64.whl \ + && rm tensorflow-1.14.0-cp37-none-linux_aarch64.whl \ + && rm -rf .cache + +RUN pip install 'grpcio==1.23.0' 'protobuf==3.9.1' 'googleapis-common-protos==1.6.0' + +COPY --from=build-env /bin/grpc_health_probe /bin/ + +ADD . /usr/src/app/github.com/kubeflow/katib +WORKDIR /usr/src/app/github.com/kubeflow/katib/cmd/suggestion/nas/enas/v1beta1 + +ENV PYTHONPATH /usr/src/app/github.com/kubeflow/katib:/usr/src/app/github.com/kubeflow/katib/pkg/apis/manager/v1beta1/python:/usr/src/app/github.com/kubeflow/katib/pkg/apis/manager/health/python + +ENTRYPOINT ["python", "main.py"] diff --git a/cmd/suggestion/nas/enas/v1beta1/main.py b/cmd/suggestion/nas/enas/v1beta1/main.py new file mode 100644 index 00000000000..59ae9cbe2e0 --- /dev/null +++ b/cmd/suggestion/nas/enas/v1beta1/main.py @@ -0,0 +1,31 @@ +import grpc +from concurrent import futures +import time + +from pkg.apis.manager.v1beta1.python import api_pb2_grpc +from pkg.apis.manager.health.python import health_pb2_grpc +from pkg.suggestion.v1beta1.nas.enas.service import EnasService + + +_ONE_DAY_IN_SECONDS = 60 * 60 * 24 +DEFAULT_PORT = "0.0.0.0:6789" + + +def serve(): + print("ENAS Suggestion Service") + server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) + service = EnasService() + api_pb2_grpc.add_SuggestionServicer_to_server(service, server) + health_pb2_grpc.add_HealthServicer_to_server(service, server) + server.add_insecure_port(DEFAULT_PORT) + print("Listening...") + server.start() + try: + while True: + time.sleep(_ONE_DAY_IN_SECONDS) + except KeyboardInterrupt: + server.stop(0) + + +if __name__ == "__main__": + serve() diff --git a/cmd/suggestion/nas/enas/v1beta1/requirements.txt b/cmd/suggestion/nas/enas/v1beta1/requirements.txt new file mode 100644 index 00000000000..03792764f26 --- /dev/null +++ b/cmd/suggestion/nas/enas/v1beta1/requirements.txt @@ -0,0 +1,4 @@ +grpcio==1.23.0 +protobuf==3.9.1 +googleapis-common-protos==1.6.0 +tensorflow==1.15.2 diff --git a/cmd/suggestion/skopt/v1beta1/Dockerfile b/cmd/suggestion/skopt/v1beta1/Dockerfile new file mode 100644 index 00000000000..d00d2f4ccd0 --- /dev/null +++ b/cmd/suggestion/skopt/v1beta1/Dockerfile @@ -0,0 +1,25 @@ +FROM python:3.6 + +RUN if [ "$(uname -m)" = "ppc64le" ] || [ "$(uname -m)" = "aarch64" ]; then \ + apt-get -y update && \ + apt-get -y install gfortran libopenblas-dev liblapack-dev && \ + pip install cython; \ + fi + +RUN GRPC_HEALTH_PROBE_VERSION=v0.3.1 && \ + if [ "$(uname -m)" = "ppc64le" ]; then \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-ppc64le; \ + elif [ "$(uname -m)" = "aarch64" ]; then \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-arm64; \ + else \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64; \ + fi && \ + chmod +x /bin/grpc_health_probe + +ADD . /usr/src/app/github.com/kubeflow/katib +WORKDIR /usr/src/app/github.com/kubeflow/katib/cmd/suggestion/skopt/v1beta1 +RUN pip install --no-cache-dir -r requirements.txt + +ENV PYTHONPATH /usr/src/app/github.com/kubeflow/katib:/usr/src/app/github.com/kubeflow/katib/pkg/apis/manager/v1beta1/python:/usr/src/app/github.com/kubeflow/katib/pkg/apis/manager/health/python + +ENTRYPOINT ["python", "main.py"] diff --git a/cmd/suggestion/skopt/v1beta1/main.py b/cmd/suggestion/skopt/v1beta1/main.py new file mode 100644 index 00000000000..c948f592d3b --- /dev/null +++ b/cmd/suggestion/skopt/v1beta1/main.py @@ -0,0 +1,28 @@ +import grpc +import time +from pkg.apis.manager.v1beta1.python import api_pb2_grpc +from pkg.apis.manager.health.python import health_pb2_grpc +from pkg.suggestion.v1beta1.skopt.service import SkoptService +from concurrent import futures + +_ONE_DAY_IN_SECONDS = 60 * 60 * 24 +DEFAULT_PORT = "0.0.0.0:6789" + + +def serve(): + server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) + service = SkoptService() + api_pb2_grpc.add_SuggestionServicer_to_server(service, server) + health_pb2_grpc.add_HealthServicer_to_server(service, server) + server.add_insecure_port(DEFAULT_PORT) + print("Listening...") + server.start() + try: + while True: + time.sleep(_ONE_DAY_IN_SECONDS) + except KeyboardInterrupt: + server.stop(0) + + +if __name__ == "__main__": + serve() diff --git a/cmd/suggestion/skopt/v1beta1/requirements.txt b/cmd/suggestion/skopt/v1beta1/requirements.txt new file mode 100644 index 00000000000..4108cb553e4 --- /dev/null +++ b/cmd/suggestion/skopt/v1beta1/requirements.txt @@ -0,0 +1,10 @@ +grpcio==1.23.0 +duecredit===0.7.0 +cloudpickle==0.5.6 +numpy>=1.13.3 +scikit-learn==0.22.0 +scipy>=0.19.1 +forestci==0.3 +protobuf==3.9.1 +googleapis-common-protos==1.6.0 +scikit-optimize==0.5.2 diff --git a/cmd/ui/v1beta1/Dockerfile b/cmd/ui/v1beta1/Dockerfile new file mode 100644 index 00000000000..bc46673e695 --- /dev/null +++ b/cmd/ui/v1beta1/Dockerfile @@ -0,0 +1,27 @@ +FROM node:10.16.2-alpine AS npm-build + +ADD /pkg/ui/v1beta1/frontend /frontend +RUN cd /frontend && npm install +RUN cd /frontend && npm run build +RUN rm -rf /frontend/node_modules + +FROM golang:alpine AS go-build +# The GOPATH in the image is /go. +ADD . /go/src/github.com/kubeflow/katib +WORKDIR /go/src/github.com/kubeflow/katib/cmd/ui +RUN if [ "$(uname -m)" = "ppc64le" ] || [ "$(uname -m)" = "aarch64" ]; then \ + apk --update add gcc musl-dev && \ + go build -o katib-ui ./v1beta1; \ + else \ + go build -o katib-ui ./v1beta1; \ + fi + +FROM alpine:3.7 +WORKDIR /app +# v1beta1 source code +COPY --from=go-build /go/src/github.com/kubeflow/katib/cmd/ui/katib-ui /app/ +COPY --from=npm-build /frontend/build /app/build + +USER 1000 + +ENTRYPOINT ["./katib-ui"] diff --git a/cmd/ui/v1beta1/main.go b/cmd/ui/v1beta1/main.go new file mode 100644 index 00000000000..b98f91f0124 --- /dev/null +++ b/cmd/ui/v1beta1/main.go @@ -0,0 +1,56 @@ +package main + +import ( + "flag" + "fmt" + "log" + "net/http" + + _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" + + ui "github.com/kubeflow/katib/pkg/ui/v1beta1" +) + +var ( + port, host, buildDir *string +) + +func init() { + port = flag.String("port", "80", "the port to listen to for incoming HTTP connections") + host = flag.String("host", "0.0.0.0", "the host to listen to for incoming HTTP connections") + buildDir = flag.String("build-dir", "/app/build", "the dir of frontend") +} +func main() { + flag.Parse() + kuh := ui.NewKatibUIHandler() + + log.Printf("Serving the frontend dir %s", *buildDir) + frontend := http.FileServer(http.Dir(*buildDir)) + http.Handle("/katib/", http.StripPrefix("/katib/", frontend)) + + http.HandleFunc("/katib/fetch_hp_jobs/", kuh.FetchAllHPJobs) + http.HandleFunc("/katib/fetch_nas_jobs/", kuh.FetchAllNASJobs) + http.HandleFunc("/katib/submit_yaml/", kuh.SubmitYamlJob) + http.HandleFunc("/katib/submit_hp_job/", kuh.SubmitParamsJob) + http.HandleFunc("/katib/submit_nas_job/", kuh.SubmitParamsJob) + + http.HandleFunc("/katib/delete_experiment/", kuh.DeleteExperiment) + + http.HandleFunc("/katib/fetch_experiment/", kuh.FetchExperiment) + http.HandleFunc("/katib/fetch_suggestion/", kuh.FetchSuggestion) + + http.HandleFunc("/katib/fetch_hp_job_info/", kuh.FetchHPJobInfo) + http.HandleFunc("/katib/fetch_hp_job_trial_info/", kuh.FetchHPJobTrialInfo) + http.HandleFunc("/katib/fetch_nas_job_info/", kuh.FetchNASJobInfo) + + http.HandleFunc("/katib/fetch_trial_templates/", kuh.FetchTrialTemplates) + http.HandleFunc("/katib/add_template/", kuh.AddTemplate) + http.HandleFunc("/katib/edit_template/", kuh.EditTemplate) + http.HandleFunc("/katib/delete_template/", kuh.DeleteTemplate) + http.HandleFunc("/katib/fetch_namespaces", kuh.FetchNamespaces) + + log.Printf("Serving at %s:%s", *host, *port) + if err := http.ListenAndServe(fmt.Sprintf("%s:%s", *host, *port), nil); err != nil { + panic(err) + } +} diff --git a/docs/developer-guide.md b/docs/developer-guide.md index c46db8b49b0..6c5835272ab 100644 --- a/docs/developer-guide.md +++ b/docs/developer-guide.md @@ -1,28 +1,27 @@ -Table of Contents -================= - - * [Table of Contents](#table-of-contents) - * [Developer Guide](#developer-guide) - * [Requirements](#requirements) - * [Build from source code](#build-from-source-code) - * [Workflow design](#workflow-design) - * [Implement a new algorithm and use it in Katib](#implement-a-new-algorithm-and-use-it-in-katib) - * [Create a new Trial kind](#create-a-new-trial-kind) - * [Algorithm settings documentation](#algorithm-settings-documentation) - * [Design proposals](#design-proposals) +# Table of Contents + +- [Table of Contents](#table-of-contents) +- [Developer Guide](#developer-guide) + - [Requirements](#requirements) + - [Build from source code](#build-from-source-code) + - [Workflow design](#workflow-design) + - [Implement a new algorithm and use it in Katib](#implement-a-new-algorithm-and-use-it-in-katib) + - [Create a new Trial kind](#create-a-new-trial-kind) + - [Algorithm settings documentation](#algorithm-settings-documentation) + - [Design proposals](#design-proposals) Created by [gh-md-toc](https://github.com/ekalinin/github-markdown-toc) # Developer Guide -This developer guide is for people who want to contribute to the Katib project. -If you're interesting in using Katib in your machine learning project, +This developer guide is for people who want to contribute to the Katib project. +If you're interesting in using Katib in your machine learning project, see the following user guides: -* [Concepts](https://www.kubeflow.org/docs/components/hyperparameter-tuning/overview/) +- [Concepts](https://www.kubeflow.org/docs/components/hyperparameter-tuning/overview/) in Katib, hyperparameter tuning, and neural architecture search. -* [Getting started with Katib](https://kubeflow.org/docs/components/hyperparameter-tuning/hyperparameter/). -* Detailed guide to [configuring and running a Katib +- [Getting started with Katib](https://kubeflow.org/docs/components/hyperparameter-tuning/hyperparameter/). +- Detailed guide to [configuring and running a Katib experiment](https://kubeflow.org/docs/components/hyperparameter-tuning/experiment/). ## Requirements @@ -36,19 +35,19 @@ see the following user guides: Check source code as follows: ```bash -make build +make buildv1alpha3 ``` You can deploy Katib v1alpha3 manifests into a k8s cluster as follows: ```bash -make deploy +make deployv1alpha3 ``` You can undeploy Katib v1alpha3 manifests from a k8s cluster as follows: ```bash -make undeploy +make undeployv1alpha3 ``` ## Workflow design diff --git a/examples/v1beta1/MinikubeDemo/deploy.sh b/examples/v1beta1/MinikubeDemo/deploy.sh new file mode 100755 index 00000000000..9a65953ddaa --- /dev/null +++ b/examples/v1beta1/MinikubeDemo/deploy.sh @@ -0,0 +1,5 @@ +#/bin/bash +set -x +set -e +minikube start --disk-size 50g --memory 4096 --cpus 4 +bash ../../../scripts/v1beta1/deploy.sh diff --git a/examples/v1beta1/MinikubeDemo/destroy.sh b/examples/v1beta1/MinikubeDemo/destroy.sh new file mode 100755 index 00000000000..3b352104a9b --- /dev/null +++ b/examples/v1beta1/MinikubeDemo/destroy.sh @@ -0,0 +1,5 @@ +#/bin/bash +set -x +set -e +minikube delete +pkill kubectl diff --git a/examples/v1beta1/README.md b/examples/v1beta1/README.md new file mode 100644 index 00000000000..f1c50ec024b --- /dev/null +++ b/examples/v1beta1/README.md @@ -0,0 +1,378 @@ +# Simple Minikube Demo + +You can deploy katib components and try a simple mnist demo on your laptop! + +## Requirement + +- [Minikube](https://kubernetes.io/docs/tasks/tools/install-minikube/) +- kubectl + +## Deploy katib + +Start Katib on Minikube with [deploy.sh](./MinikubeDemo/deploy.sh). +A Minikube cluster and Katib components will be deployed! You can check them with `kubectl -n kubeflow get pods`. + +Then, start port-forward for katib UI `8000 -> UI`. + +kubectl v1.10~ + +``` +$ kubectl -n kubeflow port-forward svc/katib-ui 8000:80 & +``` + +kubectl ~v1.9 + +``` +& kubectl -n kubeflow port-forward $(kubectl -n kubeflow get pod -o=name | grep katib-ui | sed -e "s@pods\/@@") 8000:80 & +``` + +## Create Experiment + +#### Random Suggestion Demo + +``` +$ kubectl apply -f random-example.yaml +``` + +#### Grid Suggestion Demo + +``` +$ kubectl apply -f grid-example.yaml +``` + +#### Bayesian Optimization Suggestion Demo + +``` +$ kubectl apply -f bayesianoptimization-example.yaml +``` + +#### Hyperband Suggestion Demo + +``` +$ kubectl apply -f hyperband-example.yaml +``` + +#### Run trial evaluation job by [PyTorchJob](https://github.com/kubeflow/pytorch-operator) + +``` +$ kubectl apply -f pytorchjob-example.yaml +``` + +#### Run trial evaluation job by [TFJob](https://github.com/kubeflow/tf-operator) + +``` +$ kubectl apply -f tfevent-volume/ +$ kubectl apply -f tfjob-example.yaml +``` + +## Monitor Experiment + +#### CLI + +You can submit a new Experiment or check your Experiment results with `kubectl` CLI. +List experiments + +``` +# kubectl get experiment -n kubeflow +NAME STATUS AGE +random-experiment Succeeded 25m +``` + +Check experiment result + +``` +# kubectl get experiment random-experiment -n kubeflow -oyaml +apiVersion: kubeflow.org/v1beta1 +kind: Experiment +metadata: + annotations: + kubectl.kubernetes.io/last-applied-configuration: | + {"apiVersion":"kubeflow.org/v1beta1","kind":"Experiment","metadata":{"annotations":{},"name":"random-experiment","namespace":"kubeflow"},"spec":{"algorithm":{"algorithmName":"random"},"maxFailedTrialCount":3,"maxTrialCount":12,"objective":{"additionalMetricNames":["accuracy"],"goal":0.99,"objectiveMetricName":"Validation-accuracy","type":"maximize"},"parallelTrialCount":3,"parameters":[{"feasibleSpace":{"max":"0.03","min":"0.01"},"name":"--lr","parameterType":"double"},{"feasibleSpace":{"max":"5","min":"2"},"name":"--num-layers","parameterType":"int"},{"feasibleSpace":{"list":["sgd","adam","ftrl"]},"name":"--optimizer","parameterType":"categorical"}],"trialTemplate":{"goTemplate":{"rawTemplate":"apiVersion: batch/v1\nkind: Job\nmetadata:\n name: {{.Trial}}\n namespace: {{.NameSpace}}\nspec:\n template:\n spec:\n containers:\n - name: {{.Trial}}\n image: katib/mxnet-mnist-example\n command:\n - \"python\"\n - \"/mxnet/example/image-classification/train_mnist.py\"\n - \"--batch-size=64\"\n {{- with .HyperParameters}}\n {{- range .}}\n - \"{{.Name}}={{.Value}}\"\n {{- end}}\n {{- end}}\n restartPolicy: Never"}}}} + creationTimestamp: 2019-07-15T07:37:40Z + finalizers: + - clean-data-in-db + name: random-experiment + namespace: kubeflow + resourceVersion: "22147879" + selfLink: /apis/kubeflow.org/v1beta1/namespaces/kubeflow/experiments/random-experiment + uid: 6c8896db-a6d3-11e9-b55b-00163e01b303 +spec: + algorithm: + algorithmName: random + algorithmSettings: null + maxFailedTrialCount: 3 + maxTrialCount: 12 + objective: + additionalMetricNames: + - accuracy + goal: 0.99 + objectiveMetricName: Validation-accuracy + type: maximize + parallelTrialCount: 3 + parameters: + - feasibleSpace: + max: "0.03" + min: "0.01" + name: --lr + parameterType: double + - feasibleSpace: + max: "5" + min: "2" + name: --num-layers + parameterType: int + - feasibleSpace: + list: + - sgd + - adam + - ftrl + name: --optimizer + parameterType: categorical + trialTemplate: + goTemplate: + rawTemplate: |- + apiVersion: batch/v1 + kind: Job + metadata: + name: {{.Trial}} + namespace: {{.NameSpace}} + spec: + template: + spec: + containers: + - name: {{.Trial}} + image: katib/mxnet-mnist-example + command: + - "python" + - "/mxnet/example/image-classification/train_mnist.py" + - "--batch-size=64" + {{- with .HyperParameters}} + {{- range .}} + - "{{.Name}}={{.Value}}" + {{- end}} + {{- end}} + restartPolicy: Never +status: + completionTime: 2019-07-15T07:45:56Z + conditions: + - lastTransitionTime: 2019-07-15T07:37:29Z + lastUpdateTime: 2019-07-15T07:37:29Z + message: Experiment is created + reason: ExperimentCreated + status: "True" + type: Created + - lastTransitionTime: 2019-07-15T07:45:56Z + lastUpdateTime: 2019-07-15T07:45:56Z + message: Experiment is running + reason: ExperimentRunning + status: "False" + type: Running + - lastTransitionTime: 2019-07-15T07:45:56Z + lastUpdateTime: 2019-07-15T07:45:56Z + message: Experiment has succeeded because max trial count has reached + reason: ExperimentSucceeded + status: "True" + type: Succeeded + currentOptimalTrial: + observation: + metrics: + - name: Validation-accuracy + value: 0.98119 + parameterAssignments: + - name: --lr + value: "0.01178778887185771" + - name: --num-layers + value: "4" + - name: --optimizer + value: sgd + startTime: 2019-07-15T07:37:29Z + trials: 12 + trialsSucceeded: 12 +``` + +List trials + +``` +# kubectl get trials -n kubeflow +NAME STATUS AGE +random-experiment-24lgqghm Succeeded 26m +random-experiment-2vdqlqfm Succeeded 28m +random-experiment-4xg8n48f Succeeded 30m +random-experiment-64stflgp Succeeded 29m +random-experiment-d9jgsm96 Succeeded 29m +random-experiment-pnrqmqdm Succeeded 27m +random-experiment-qvcdfppz Succeeded 27m +random-experiment-r49pflgp Succeeded 30m +random-experiment-r7d7mcbx Succeeded 29m +random-experiment-rwbf62k5 Succeeded 26m +random-experiment-vs8pmh2m Succeeded 27m +random-experiment-wmnlq972 Succeeded 30m +``` + +Check trial detail + +``` +# kubectl get trials random-experiment-24lgqghm -oyaml -n kubeflow +apiVersion: kubeflow.org/v1beta1 +kind: Trial +metadata: + creationTimestamp: 2019-07-15T07:41:38Z + generation: 1 + labels: + experiment: random-experiment + name: random-experiment-24lgqghm + namespace: kubeflow + ownerReferences: + - apiVersion: kubeflow.org/v1beta1 + blockOwnerDeletion: true + controller: true + kind: Experiment + name: random-experiment + uid: 6c8896db-a6d3-11e9-b55b-00163e01b303 + resourceVersion: "22147830" + selfLink: /apis/kubeflow.org/v1beta1/namespaces/kubeflow/trials/random-experiment-24lgqghm + uid: fad59cb8-a6d3-11e9-b55b-00163e01b303 +spec: + metricsCollectorSpec: |- + apiVersion: batch/v1beta1 + kind: CronJob + metadata: + name: random-experiment-24lgqghm + namespace: kubeflow + spec: + schedule: "*/1 * * * *" + successfulJobsHistoryLimit: 0 + failedJobsHistoryLimit: 1 + concurrencyPolicy: Forbid + jobTemplate: + spec: + backoffLimit: 0 + template: + spec: + serviceAccountName: metrics-collector + containers: + - name: random-experiment-24lgqghm + image: gcr.io/kubeflow-images-public/katib/v1beta1/metrics-collector + imagePullPolicy: IfNotPresent + command: ["./metricscollector"] + args: + - "-e" + - "random-experiment" + - "-t" + - "random-experiment-24lgqghm" + - "-k" + - "Job" + - "-n" + - "kubeflow" + - "-m" + - "katib-db-manager.kubeflow:6789" + - "-mn" + - "Validation-accuracy;accuracy" + restartPolicy: Never + objective: + additionalMetricNames: + - accuracy + goal: 0.99 + objectiveMetricName: Validation-accuracy + type: maximize + parameterAssignments: + - name: --lr + value: "0.017151855585117313" + - name: --num-layers + value: "5" + - name: --optimizer + value: adam + runSpec: |- + apiVersion: batch/v1 + kind: Job + metadata: + name: random-experiment-24lgqghm + namespace: kubeflow + spec: + template: + spec: + containers: + - name: random-experiment-24lgqghm + image: katib/mxnet-mnist-example + command: + - "python" + - "/mxnet/example/image-classification/train_mnist.py" + - "--batch-size=64" + - "--lr=0.017151855585117313" + - "--num-layers=5" + - "--optimizer=adam" + restartPolicy: Never +status: + completionTime: 2019-07-15T07:45:42Z + conditions: + - lastTransitionTime: 2019-07-15T07:41:29Z + lastUpdateTime: 2019-07-15T07:41:29Z + message: Trial is created + reason: TrialCreated + status: "True" + type: Created + - lastTransitionTime: 2019-07-15T07:45:42Z + lastUpdateTime: 2019-07-15T07:45:42Z + message: Trial is running + reason: TrialRunning + status: "False" + type: Running + - lastTransitionTime: 2019-07-15T07:45:42Z + lastUpdateTime: 2019-07-15T07:45:42Z + message: Trial has succeeded + reason: TrialSucceeded + status: "True" + type: Succeeded + observation: + metrics: + - name: Validation-accuracy + value: 0.969347 + startTime: 2019-07-15T07:41:29Z +``` + +#### UI + +You can submit a new Experiment or check your Experiment results with Web UI. +Acsess to `http://127.0.0.1:8000/katib` + +## Clean + +Clean up with [destroy.sh](./MinikubeDemo/destroy.sh) script. +It will stop port-forward process and delete minikube cluster. + +# List of current Katib training container images + +- Mxnet mnist example with collecting metrics time, [source](https://github.com/kubeflow/katib/blob/master/examples/v1beta1/mxnet-mnist/mnist.py). + +``` +docker.io/kubeflowkatib/mxnet-mnist +``` + +- Pytorch mnist example with saving metrics to the file, [source](https://github.com/kubeflow/katib/blob/master/examples/v1beta1/file-metrics-collector/mnist.py). + +``` +docker.io/kubeflowkatib/pytorch-mnist +``` + +- Keras cifar10 CNN example for ENAS with gpu support, [source](https://github.com/kubeflow/katib/blob/master/examples/v1beta1/nas/enas-cnn-cifar10/Dockerfile.gpu). + +``` +docker.io/kubeflowkatib/enas-cnn-cifar10-gpu +``` + +- Keras cifar10 CNN example for ENAS with cpu support, [source](https://github.com/kubeflow/katib/blob/master/examples/v1beta1/nas/enas-cnn-cifar10/Dockerfile.cpu). + +``` +docker.io/kubeflowkatib/enas-cnn-cifar10-cpu +``` + +- Pytorch operator mnist example, [source](https://github.com/kubeflow/pytorch-operator/blob/master/examples/mnist/mnist.py). + +``` +gcr.io/kubeflow-ci/pytorch-dist-mnist-test +``` + +- Tf operator mnist example, [source](https://github.com/kubeflow/tf-operator/blob/master/examples/v1/mnist_with_summaries/mnist_with_summaries.py). + +``` +gcr.io/kubeflow-ci/tf-mnist-with-summaries +``` diff --git a/examples/v1beta1/bayesianoptimization-example.yaml b/examples/v1beta1/bayesianoptimization-example.yaml new file mode 100644 index 00000000000..102dc413362 --- /dev/null +++ b/examples/v1beta1/bayesianoptimization-example.yaml @@ -0,0 +1,64 @@ +apiVersion: "kubeflow.org/v1beta1" +kind: Experiment +metadata: + namespace: kubeflow + labels: + controller-tools.k8s.io: "1.0" + name: bayesianoptimization-example +spec: + objective: + type: maximize + goal: 0.99 + objectiveMetricName: Validation-accuracy + additionalMetricNames: + - Train-accuracy + algorithm: + algorithmName: bayesianoptimization + algorithmSettings: + - name: "random_state" + value: "10" + parallelTrialCount: 3 + maxTrialCount: 12 + maxFailedTrialCount: 3 + parameters: + - name: --lr + parameterType: double + feasibleSpace: + min: "0.01" + max: "0.03" + - name: --num-layers + parameterType: int + feasibleSpace: + min: "2" + max: "5" + - name: --optimizer + parameterType: categorical + feasibleSpace: + list: + - sgd + - adam + - ftrl + trialTemplate: + goTemplate: + rawTemplate: |- + apiVersion: batch/v1 + kind: Job + metadata: + name: {{.Trial}} + namespace: {{.NameSpace}} + spec: + template: + spec: + containers: + - name: {{.Trial}} + image: docker.io/kubeflowkatib/mxnet-mnist + command: + - "python3" + - "/opt/mxnet-mnist/mnist.py" + - "--batch-size=64" + {{- with .HyperParameters}} + {{- range .}} + - "{{.Name}}={{.Value}}" + {{- end}} + {{- end}} + restartPolicy: Never diff --git a/examples/v1beta1/cmaes-example.yaml b/examples/v1beta1/cmaes-example.yaml new file mode 100644 index 00000000000..9ec37f9ecb7 --- /dev/null +++ b/examples/v1beta1/cmaes-example.yaml @@ -0,0 +1,61 @@ +apiVersion: "kubeflow.org/v1beta1" +kind: Experiment +metadata: + namespace: kubeflow + labels: + controller-tools.k8s.io: "1.0" + name: cmaes-example +spec: + objective: + type: maximize + goal: 0.99 + objectiveMetricName: Validation-accuracy + additionalMetricNames: + - Train-accuracy + algorithm: + algorithmName: cmaes + parallelTrialCount: 3 + maxTrialCount: 12 + maxFailedTrialCount: 3 + parameters: + - name: --lr + parameterType: double + feasibleSpace: + min: "0.01" + max: "0.03" + - name: --num-layers + parameterType: int + feasibleSpace: + min: "2" + max: "5" + - name: --optimizer + parameterType: categorical + feasibleSpace: + list: + - sgd + - adam + - ftrl + trialTemplate: + goTemplate: + rawTemplate: |- + apiVersion: batch/v1 + kind: Job + metadata: + name: {{.Trial}} + namespace: {{.NameSpace}} + spec: + template: + spec: + containers: + - name: {{.Trial}} + image: docker.io/kubeflowkatib/mxnet-mnist + command: + - "python3" + - "/opt/mxnet-mnist/mnist.py" + - "--batch-size=64" + {{- with .HyperParameters}} + {{- range .}} + - "{{.Name}}={{.Value}}" + {{- end}} + {{- end}} + restartPolicy: Never diff --git a/examples/v1beta1/custom-metricscollector-example.yaml b/examples/v1beta1/custom-metricscollector-example.yaml new file mode 100644 index 00000000000..59ea1a0a286 --- /dev/null +++ b/examples/v1beta1/custom-metricscollector-example.yaml @@ -0,0 +1,78 @@ +# TODO (andreyvelich) This metrics collector image (kubeflowkatib/custom-metrics-collector) doesn't work in v1beta1. +# It is currently using api.v1.alpha3.Manager instead of api.v1.beta1.Manager to report metrics. +apiVersion: "kubeflow.org/v1beta1" +kind: Experiment +metadata: + namespace: kubeflow + labels: + controller-tools.k8s.io: "1.0" + name: custom-metricscollector-example +spec: + objective: + type: maximize + goal: 0.99 + objectiveMetricName: accuracy + metricsCollectorSpec: + source: + fileSystemPath: + path: "/katib/mnist.log" + kind: File + collector: + kind: Custom + customCollector: + args: + - -m + - accuracy + - -s + - katib-db-manager.kubeflow:6789 + - -path + - /katib/mnist.log + image: kubeflowkatib/custom-metrics-collector:latest + imagePullPolicy: Always + name: custom-metrics-logger-and-collector + env: + - name: TrialNamePrefix + valueFrom: + fieldRef: + fieldPath: metadata.name + algorithm: + algorithmName: random + parallelTrialCount: 3 + maxTrialCount: 12 + maxFailedTrialCount: 3 + parameters: + - name: --lr + parameterType: double + feasibleSpace: + min: "0.01" + max: "0.03" + - name: --momentum + parameterType: double + feasibleSpace: + min: "0.3" + max: "0.7" + trialTemplate: + goTemplate: + rawTemplate: |- + apiVersion: batch/v1 + kind: Job + metadata: + name: {{.Trial}} + namespace: {{.NameSpace}} + spec: + template: + spec: + containers: + - name: {{.Trial}} + image: docker.io/kubeflowkatib/pytorch-mnist + imagePullPolicy: Always + command: + - "python" + - "/var/mnist.py" + - "--epochs=1" + {{- with .HyperParameters}} + {{- range .}} + - "{{.Name}}={{.Value}}" + {{- end}} + {{- end}} + restartPolicy: Never diff --git a/examples/v1beta1/file-metrics-collector/Dockerfile b/examples/v1beta1/file-metrics-collector/Dockerfile new file mode 100644 index 00000000000..16b200116e2 --- /dev/null +++ b/examples/v1beta1/file-metrics-collector/Dockerfile @@ -0,0 +1,6 @@ +FROM pytorch/pytorch:1.0-cuda10.0-cudnn7-runtime + +WORKDIR /var +ADD mnist.py /var + +ENTRYPOINT ["python", "/var/mnist.py"] diff --git a/examples/v1beta1/file-metrics-collector/mnist.py b/examples/v1beta1/file-metrics-collector/mnist.py new file mode 100644 index 00000000000..b436f2ca4b0 --- /dev/null +++ b/examples/v1beta1/file-metrics-collector/mnist.py @@ -0,0 +1,152 @@ +from __future__ import print_function + +import argparse +import logging +import os + +from torchvision import datasets, transforms +import torch +import torch.distributed as dist +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim + +WORLD_SIZE = int(os.environ.get('WORLD_SIZE', 1)) + +logging.basicConfig(filename='/katib/mnist.log', level=logging.DEBUG) + + +class Net(nn.Module): + def __init__(self): + super(Net, self).__init__() + self.conv1 = nn.Conv2d(1, 20, 5, 1) + self.conv2 = nn.Conv2d(20, 50, 5, 1) + self.fc1 = nn.Linear(4*4*50, 500) + self.fc2 = nn.Linear(500, 10) + + def forward(self, x): + x = F.relu(self.conv1(x)) + x = F.max_pool2d(x, 2, 2) + x = F.relu(self.conv2(x)) + x = F.max_pool2d(x, 2, 2) + x = x.view(-1, 4*4*50) + x = F.relu(self.fc1(x)) + x = self.fc2(x) + return F.log_softmax(x, dim=1) + + +def train(args, model, device, train_loader, optimizer, epoch): + model.train() + for batch_idx, (data, target) in enumerate(train_loader): + data, target = data.to(device), target.to(device) + optimizer.zero_grad() + output = model(data) + loss = F.nll_loss(output, target) + loss.backward() + optimizer.step() + if batch_idx % args.log_interval == 0: + msg = 'Train Epoch: {} [{}/{} ({:.0f}%)]\tloss={:.4f}'.format( + epoch, batch_idx * len(data), len(train_loader.dataset), + 100. * batch_idx / len(train_loader), loss.item()) + print(msg) + logging.debug(msg) + niter = epoch * len(train_loader) + batch_idx + + +def test(args, model, device, test_loader, epoch): + model.eval() + test_loss = 0 + correct = 0 + with torch.no_grad(): + for data, target in test_loader: + data, target = data.to(device), target.to(device) + output = model(data) + test_loss += F.nll_loss(output, target, reduction='sum').item() # sum up batch loss + pred = output.max(1, keepdim=True)[1] # get the index of the max log-probability + correct += pred.eq(target.view_as(pred)).sum().item() + + test_loss /= len(test_loader.dataset) + logging.info('\n{{metricName: accuracy, metricValue: {:.4f}}};{{metricName: loss, metricValue: {:.4f}}}\n'.format( + float(correct) / len(test_loader.dataset), test_loss)) + + +def should_distribute(): + return dist.is_available() and WORLD_SIZE > 1 + + +def is_distributed(): + return dist.is_available() and dist.is_initialized() + + +def main(): + # Training settings + parser = argparse.ArgumentParser(description='PyTorch MNIST Example') + parser.add_argument('--batch-size', type=int, default=64, metavar='N', + help='input batch size for training (default: 64)') + parser.add_argument('--test-batch-size', type=int, default=1000, metavar='N', + help='input batch size for testing (default: 1000)') + parser.add_argument('--epochs', type=int, default=10, metavar='N', + help='number of epochs to train (default: 10)') + parser.add_argument('--lr', type=float, default=0.01, metavar='LR', + help='learning rate (default: 0.01)') + parser.add_argument('--momentum', type=float, default=0.5, metavar='M', + help='SGD momentum (default: 0.5)') + parser.add_argument('--no-cuda', action='store_true', default=False, + help='disables CUDA training') + parser.add_argument('--seed', type=int, default=1, metavar='S', + help='random seed (default: 1)') + parser.add_argument('--log-interval', type=int, default=10, metavar='N', + help='how many batches to wait before logging training status') + parser.add_argument('--save-model', action='store_true', default=False, + help='For Saving the current Model') + if dist.is_available(): + parser.add_argument('--backend', type=str, help='Distributed backend', + choices=[dist.Backend.GLOO, dist.Backend.NCCL, dist.Backend.MPI], + default=dist.Backend.GLOO) + args = parser.parse_args() + use_cuda = not args.no_cuda and torch.cuda.is_available() + if use_cuda: + print('Using CUDA') + + torch.manual_seed(args.seed) + + device = torch.device("cuda" if use_cuda else "cpu") + + if should_distribute(): + print('Using distributed PyTorch with {} backend'.format(args.backend)) + dist.init_process_group(backend=args.backend) + + kwargs = {'num_workers': 1, 'pin_memory': True} if use_cuda else {} + train_loader = torch.utils.data.DataLoader( + datasets.MNIST('../data', train=True, download=True, + transform=transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize((0.1307,), (0.3081,)) + ])), + batch_size=args.batch_size, shuffle=True, **kwargs) + test_loader = torch.utils.data.DataLoader( + datasets.MNIST('../data', train=False, transform=transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize((0.1307,), (0.3081,)) + ])), + batch_size=args.test_batch_size, shuffle=False, **kwargs) + + model = Net().to(device) + + if is_distributed(): + Distributor = nn.parallel.DistributedDataParallel if use_cuda \ + else nn.parallel.DistributedDataParallelCPU + model = Distributor(model) + + optimizer = optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum) + + for epoch in range(1, args.epochs + 1): + train(args, model, device, train_loader, optimizer, epoch) + test(args, model, device, test_loader, epoch) + + if (args.save_model): + torch.save(model.state_dict(), "mnist_cnn.pt") + + +if __name__ == '__main__': + main() diff --git a/examples/v1beta1/file-metricscollector-example.yaml b/examples/v1beta1/file-metricscollector-example.yaml new file mode 100644 index 00000000000..539870bda40 --- /dev/null +++ b/examples/v1beta1/file-metricscollector-example.yaml @@ -0,0 +1,65 @@ +apiVersion: "kubeflow.org/v1beta1" +kind: Experiment +metadata: + namespace: kubeflow + labels: + controller-tools.k8s.io: "1.0" + name: file-metricscollector-example +spec: + objective: + type: maximize + goal: 0.99 + objectiveMetricName: accuracy + additionalMetricNames: + - loss + metricsCollectorSpec: + source: + filter: + metricsFormat: + - "{metricName: ([\\w|-]+), metricValue: ((-?\\d+)(\\.\\d+)?)}" + fileSystemPath: + path: "/katib/mnist.log" + kind: File + collector: + kind: File + algorithm: + algorithmName: random + parallelTrialCount: 3 + maxTrialCount: 12 + maxFailedTrialCount: 3 + parameters: + - name: --lr + parameterType: double + feasibleSpace: + min: "0.01" + max: "0.03" + - name: --momentum + parameterType: double + feasibleSpace: + min: "0.3" + max: "0.7" + trialTemplate: + goTemplate: + rawTemplate: |- + apiVersion: batch/v1 + kind: Job + metadata: + name: {{.Trial}} + namespace: {{.NameSpace}} + spec: + template: + spec: + containers: + - name: {{.Trial}} + image: docker.io/kubeflowkatib/pytorch-mnist:1.0 + imagePullPolicy: Always + command: + - "python" + - "/var/mnist.py" + - "--epochs=1" + {{- with .HyperParameters}} + {{- range .}} + - "{{.Name}}={{.Value}}" + {{- end}} + {{- end}} + restartPolicy: Never diff --git a/examples/v1beta1/grid-example.yaml b/examples/v1beta1/grid-example.yaml new file mode 100644 index 00000000000..6d1f48b5f48 --- /dev/null +++ b/examples/v1beta1/grid-example.yaml @@ -0,0 +1,67 @@ +apiVersion: "kubeflow.org/v1beta1" +kind: Experiment +metadata: + namespace: kubeflow + labels: + controller-tools.k8s.io: "1.0" + name: grid-example +spec: + objective: + type: maximize + goal: 0.99 + objectiveMetricName: Validation-accuracy + additionalMetricNames: + - Train-accuracy + algorithm: + algorithmName: grid + parallelTrialCount: 3 + maxTrialCount: 12 + maxFailedTrialCount: 3 + parameters: + - name: --lr + parameterType: double + feasibleSpace: + min: "0.001" + max: "0.01" + step: "0.001" + - name: --num-layers + parameterType: int + feasibleSpace: + min: "2" + max: "5" + - name: --num-epochs + parameterType: int + feasibleSpace: + min: "10" + max: "15" + - name: --optimizer + parameterType: categorical + feasibleSpace: + list: + - sgd + - adam + - ftrl + trialTemplate: + goTemplate: + rawTemplate: |- + apiVersion: batch/v1 + kind: Job + metadata: + name: {{.Trial}} + namespace: {{.NameSpace}} + spec: + template: + spec: + containers: + - name: {{.Trial}} + image: docker.io/kubeflowkatib/mxnet-mnist + command: + - "python3" + - "/opt/mxnet-mnist/mnist.py" + - "--batch-size=64" + {{- with .HyperParameters}} + {{- range .}} + - "{{.Name}}={{.Value}}" + {{- end}} + {{- end}} + restartPolicy: Never diff --git a/examples/v1beta1/hyperband-example.yaml b/examples/v1beta1/hyperband-example.yaml new file mode 100644 index 00000000000..8dea1acc07c --- /dev/null +++ b/examples/v1beta1/hyperband-example.yaml @@ -0,0 +1,71 @@ +apiVersion: "kubeflow.org/v1beta1" +kind: Experiment +metadata: + namespace: kubeflow + name: hyperband-example +spec: + parallelTrialCount: 9 + maxTrialCount: 9 + objective: + type: maximize + goal: 0.99 + objectiveMetricName: Validation-accuracy + additionalMetricNames: + - Train-accuracy + algorithm: + algorithmName: hyperband + algorithmSettings: + - name: "resource_name" + value: "--num-epochs" + - name: "eta" + value: "3" + - name: "r_l" + value: "9" + maxFailedTrialCount: 9 + parameters: + - name: --lr + parameterType: double + feasibleSpace: + min: "0.01" + max: "0.03" + - name: --num-layers + parameterType: int + feasibleSpace: + min: "2" + max: "5" + - name: --optimizer + parameterType: categorical + feasibleSpace: + list: + - sgd + - adam + - ftrl + - name: --num-epochs + parameterType: int + feasibleSpace: + min: "20" + max: "20" + trialTemplate: + goTemplate: + rawTemplate: |- + apiVersion: batch/v1 + kind: Job + metadata: + name: {{.Trial}} + namespace: {{.NameSpace}} + spec: + template: + spec: + containers: + - name: {{.Trial}} + image: docker.io/kubeflowkatib/mxnet-mnist + command: + - "python3" + - "/opt/mxnet-mnist/mnist.py" + - "--batch-size=64" + {{- with .HyperParameters}} + {{- range .}} + - "{{.Name}}={{.Value}}" + {{- end}} + {{- end}} + restartPolicy: Never diff --git a/examples/v1beta1/mxnet-mnist/Dockerfile b/examples/v1beta1/mxnet-mnist/Dockerfile new file mode 100644 index 00000000000..a08dc032d6b --- /dev/null +++ b/examples/v1beta1/mxnet-mnist/Dockerfile @@ -0,0 +1,13 @@ +FROM ubuntu:16.04 + +RUN apt-get update && \ + apt-get install -y wget python3-dev gcc && \ + wget https://bootstrap.pypa.io/get-pip.py && \ + python3 get-pip.py + +RUN pip3 install mxnet + +ADD . /opt/mxnet-mnist +WORKDIR /opt/mxnet-mnist + +ENTRYPOINT ["python3", "/opt/mxnet-mnist/mnist.py"] diff --git a/examples/v1beta1/mxnet-mnist/README.md b/examples/v1beta1/mxnet-mnist/README.md new file mode 100644 index 00000000000..5707be4696a --- /dev/null +++ b/examples/v1beta1/mxnet-mnist/README.md @@ -0,0 +1,6 @@ +# Mxnet image classification example +This is Mxnet image classification training container with recording time of the metrics. + +It uses only simple multilayer perceptron network (mlp). + +If you want to read more about this example, visit official [incubator-mxnet](https://github.com/apache/incubator-mxnet/tree/master/example/image-classification) github repository. diff --git a/examples/v1beta1/mxnet-mnist/common/__init__.py b/examples/v1beta1/mxnet-mnist/common/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/examples/v1beta1/mxnet-mnist/common/fit.py b/examples/v1beta1/mxnet-mnist/common/fit.py new file mode 100644 index 00000000000..6818559cedb --- /dev/null +++ b/examples/v1beta1/mxnet-mnist/common/fit.py @@ -0,0 +1,343 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +""" example train fit utility """ +import logging +import os +import time +import re +import math +import mxnet as mx + + +def get_epoch_size(args, kv): + return math.ceil(int(args.num_examples / kv.num_workers) / args.batch_size) + + +def _get_lr_scheduler(args, kv): + if 'lr_factor' not in args or args.lr_factor >= 1: + return (args.lr, None) + epoch_size = get_epoch_size(args, kv) + begin_epoch = args.load_epoch if args.load_epoch else 0 + if 'pow' in args.lr_step_epochs: + lr = args.lr + max_up = args.num_epochs * epoch_size + pwr = float(re.sub('pow[- ]*', '', args.lr_step_epochs)) + poly_sched = mx.lr_scheduler.PolyScheduler(max_up, lr, pwr) + return (lr, poly_sched) + step_epochs = [int(l) for l in args.lr_step_epochs.split(',')] + lr = args.lr + for s in step_epochs: + if begin_epoch >= s: + lr *= args.lr_factor + if lr != args.lr: + logging.info('Adjust learning rate to %e for epoch %d', + lr, begin_epoch) + + steps = [epoch_size * (x - begin_epoch) + for x in step_epochs if x - begin_epoch > 0] + if steps: + return (lr, mx.lr_scheduler.MultiFactorScheduler(step=steps, factor=args.lr_factor, + base_lr=args.lr)) + else: + return (lr, None) + + +def _load_model(args, rank=0): + if 'load_epoch' not in args or args.load_epoch is None: + return (None, None, None) + assert args.model_prefix is not None + model_prefix = args.model_prefix + if rank > 0 and os.path.exists("%s-%d-symbol.json" % (model_prefix, rank)): + model_prefix += "-%d" % (rank) + sym, arg_params, aux_params = mx.model.load_checkpoint( + model_prefix, args.load_epoch) + logging.info('Loaded model %s_%04d.params', model_prefix, args.load_epoch) + return (sym, arg_params, aux_params) + + +def _save_model(args, rank=0): + if args.model_prefix is None: + return None + return mx.callback.do_checkpoint(args.model_prefix if rank == 0 else "%s-%d" % ( + args.model_prefix, rank), period=args.save_period) + + +def add_fit_args(parser): + """ + parser : argparse.ArgumentParser + return a parser added with args required by fit + """ + train = parser.add_argument_group('Training', 'model training') + train.add_argument('--network', type=str, + help='the neural network to use') + train.add_argument('--num-layers', type=int, + help='number of layers in the neural network, \ + required by some networks such as resnet') + train.add_argument('--gpus', type=str, + help='list of gpus to run, e.g. 0 or 0,2,5. empty means using cpu') + train.add_argument('--kv-store', type=str, default='device', + help='key-value store type') + train.add_argument('--num-epochs', type=int, default=100, + help='max num of epochs') + train.add_argument('--lr', type=float, default=0.1, + help='initial learning rate') + train.add_argument('--lr-factor', type=float, default=0.1, + help='the ratio to reduce lr on each step') + train.add_argument('--lr-step-epochs', type=str, + help='the epochs to reduce the lr, e.g. 30,60') + train.add_argument('--initializer', type=str, default='default', + help='the initializer type') + train.add_argument('--optimizer', type=str, default='sgd', + help='the optimizer type') + train.add_argument('--mom', type=float, default=0.9, + help='momentum for sgd') + train.add_argument('--wd', type=float, default=0.0001, + help='weight decay for sgd') + train.add_argument('--batch-size', type=int, default=128, + help='the batch size') + train.add_argument('--disp-batches', type=int, default=20, + help='show progress for every n batches') + train.add_argument('--model-prefix', type=str, + help='model prefix') + train.add_argument('--save-period', type=int, default=1, help='params saving period') + parser.add_argument('--monitor', dest='monitor', type=int, default=0, + help='log network parameters every N iters if larger than 0') + train.add_argument('--load-epoch', type=int, + help='load the model on an epoch using the model-load-prefix') + train.add_argument('--top-k', type=int, default=0, + help='report the top-k accuracy. 0 means no report.') + train.add_argument('--loss', type=str, default='', + help='show the cross-entropy or nll loss. ce strands for cross-entropy, nll-loss stands for likelihood loss') + train.add_argument('--test-io', type=int, default=0, + help='1 means test reading speed without training') + train.add_argument('--dtype', type=str, default='float32', + help='precision: float32 or float16') + train.add_argument('--gc-type', type=str, default='none', + help='type of gradient compression to use, \ + takes `2bit` or `none` for now') + train.add_argument('--gc-threshold', type=float, default=0.5, + help='threshold for 2bit gradient compression') + # additional parameters for large batch sgd + train.add_argument('--macrobatch-size', type=int, default=0, + help='distributed effective batch size') + train.add_argument('--warmup-epochs', type=int, default=5, + help='the epochs to ramp-up lr to scaled large-batch value') + train.add_argument('--warmup-strategy', type=str, default='linear', + help='the ramping-up strategy for large batch sgd') + train.add_argument('--profile-worker-suffix', type=str, default='', + help='profile workers actions into this file. During distributed training\ + filename saved will be rank1_ followed by this suffix') + train.add_argument('--profile-server-suffix', type=str, default='', + help='profile server actions into a file with name like rank1_ followed by this suffix \ + during distributed training') + train.add_argument('--use-imagenet-data-augmentation', type=int, default=0, + help='enable data augmentation of ImageNet data, default disabled') + return train + + +def fit(args, network, data_loader, **kwargs): + """ + train a model + args : argparse returns + network : the symbol definition of the nerual network + data_loader : function that returns the train and val data iterators + """ + # kvstore + kv = mx.kvstore.create(args.kv_store) + if args.gc_type != 'none': + kv.set_gradient_compression({'type': args.gc_type, + 'threshold': args.gc_threshold}) + if args.profile_server_suffix: + mx.profiler.set_config(filename=args.profile_server_suffix, profile_all=True, profile_process='server') + mx.profiler.set_state(state='run', profile_process='server') + + if args.profile_worker_suffix: + if kv.num_workers > 1: + filename = 'rank' + str(kv.rank) + '_' + args.profile_worker_suffix + else: + filename = args.profile_worker_suffix + mx.profiler.set_config(filename=filename, profile_all=True, profile_process='worker') + mx.profiler.set_state(state='run', profile_process='worker') + + # logging + head = '%(asctime)-15s Node[' + str(kv.rank) + '] %(message)s' + logging.basicConfig(level=logging.DEBUG, format=head) + logging.info('start with arguments %s', args) + + epoch_size = get_epoch_size(args, kv) + + # data iterators + (train, val) = data_loader(args, kv) + if 'dist' in args.kv_store and not 'async' in args.kv_store: + logging.info('Resizing training data to %d batches per machine', epoch_size) + # resize train iter to ensure each machine has same number of batches per epoch + # if not, dist_sync can hang at the end with one machine waiting for other machines + train = mx.io.ResizeIter(train, epoch_size) + + if args.test_io: + tic = time.time() + for i, batch in enumerate(train): + if isinstance(batch, list): + for b in batch: + for j in b.data: + j.wait_to_read() + else: + for j in batch.data: + j.wait_to_read() + if (i + 1) % args.disp_batches == 0: + logging.info('Batch [%d]\tSpeed: %.2f samples/sec', i, + args.disp_batches * args.batch_size / (time.time() - tic)) + tic = time.time() + return + + # load model + if 'arg_params' in kwargs and 'aux_params' in kwargs: + arg_params = kwargs['arg_params'] + aux_params = kwargs['aux_params'] + else: + sym, arg_params, aux_params = _load_model(args, kv.rank) + if sym is not None: + assert sym.tojson() == network.tojson() + + # save model + checkpoint = _save_model(args, kv.rank) + + # devices for training + devs = mx.cpu() if args.gpus is None or args.gpus == "" else [ + mx.gpu(int(i)) for i in args.gpus.split(',')] + + # learning rate + lr, lr_scheduler = _get_lr_scheduler(args, kv) + + # create model + model = mx.mod.Module( + context=devs, + symbol=network + ) + + lr_scheduler = lr_scheduler + optimizer_params = { + 'learning_rate': lr, + 'wd': args.wd, + 'lr_scheduler': lr_scheduler, + 'multi_precision': True} + + # Only a limited number of optimizers have 'momentum' property + has_momentum = {'sgd', 'dcasgd', 'nag', 'signum', 'lbsgd'} + if args.optimizer in has_momentum: + optimizer_params['momentum'] = args.mom + + monitor = mx.mon.Monitor( + args.monitor, pattern=".*") if args.monitor > 0 else None + + # A limited number of optimizers have a warmup period + has_warmup = {'lbsgd', 'lbnag'} + if args.optimizer in has_warmup: + nworkers = kv.num_workers + if epoch_size < 1: + epoch_size = 1 + macrobatch_size = args.macrobatch_size + if macrobatch_size < args.batch_size * nworkers: + macrobatch_size = args.batch_size * nworkers + #batch_scale = round(float(macrobatch_size) / args.batch_size / nworkers +0.4999) + batch_scale = math.ceil( + float(macrobatch_size) / args.batch_size / nworkers) + optimizer_params['updates_per_epoch'] = epoch_size + optimizer_params['begin_epoch'] = args.load_epoch if args.load_epoch else 0 + optimizer_params['batch_scale'] = batch_scale + optimizer_params['warmup_strategy'] = args.warmup_strategy + optimizer_params['warmup_epochs'] = args.warmup_epochs + optimizer_params['num_epochs'] = args.num_epochs + + if args.initializer == 'default': + if args.network == 'alexnet': + # AlexNet will not converge using Xavier + initializer = mx.init.Normal() + # VGG will not trend to converge using Xavier-Gaussian + elif args.network and 'vgg' in args.network: + initializer = mx.init.Xavier() + else: + initializer = mx.init.Xavier( + rnd_type='gaussian', factor_type="in", magnitude=2) + # initializer = mx.init.Xavier(factor_type="in", magnitude=2.34), + elif args.initializer == 'xavier': + initializer = mx.init.Xavier() + elif args.initializer == 'msra': + initializer = mx.init.MSRAPrelu() + elif args.initializer == 'orthogonal': + initializer = mx.init.Orthogonal() + elif args.initializer == 'normal': + initializer = mx.init.Normal() + elif args.initializer == 'uniform': + initializer = mx.init.Uniform() + elif args.initializer == 'one': + initializer = mx.init.One() + elif args.initializer == 'zero': + initializer = mx.init.Zero() + + # evaluation metrices + eval_metrics = ['accuracy'] + if args.top_k > 0: + eval_metrics.append(mx.metric.create( + 'top_k_accuracy', top_k=args.top_k)) + + supported_loss = ['ce', 'nll_loss'] + if len(args.loss) > 0: + # ce or nll loss is only applicable to softmax output + loss_type_list = args.loss.split(',') + if 'softmax_output' in network.list_outputs(): + for loss_type in loss_type_list: + loss_type = loss_type.strip() + if loss_type == 'nll': + loss_type = 'nll_loss' + if loss_type not in supported_loss: + logging.warning(loss_type + ' is not an valid loss type, only cross-entropy or ' + 'negative likelihood loss is supported!') + else: + eval_metrics.append(mx.metric.create(loss_type)) + else: + logging.warning("The output is not softmax_output, loss argument will be skipped!") + + # callbacks that run after each batch + batch_end_callbacks = [mx.callback.Speedometer( + args.batch_size, args.disp_batches)] + if 'batch_end_callback' in kwargs: + cbs = kwargs['batch_end_callback'] + batch_end_callbacks += cbs if isinstance(cbs, list) else [cbs] + + # run + model.fit(train, + begin_epoch=args.load_epoch if args.load_epoch else 0, + num_epoch=args.num_epochs, + eval_data=val, + eval_metric=eval_metrics, + kvstore=kv, + optimizer=args.optimizer, + optimizer_params=optimizer_params, + initializer=initializer, + arg_params=arg_params, + aux_params=aux_params, + batch_end_callback=batch_end_callbacks, + epoch_end_callback=checkpoint, + allow_missing=True, + monitor=monitor) + + if args.profile_server_suffix: + mx.profiler.set_state(state='run', profile_process='server') + if args.profile_worker_suffix: + mx.profiler.set_state(state='run', profile_process='worker') diff --git a/examples/v1beta1/mxnet-mnist/common/utils.py b/examples/v1beta1/mxnet-mnist/common/utils.py new file mode 100644 index 00000000000..3a0f64cc95b --- /dev/null +++ b/examples/v1beta1/mxnet-mnist/common/utils.py @@ -0,0 +1,48 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +import os +import errno + +import mxnet as mx + + +def download_file(url, local_fname=None, force_write=False): + # requests is not default installed + import requests + if local_fname is None: + local_fname = url.split('/')[-1] + if not force_write and os.path.exists(local_fname): + return local_fname + + dir_name = os.path.dirname(local_fname) + + if dir_name != "": + if not os.path.exists(dir_name): + try: # try to create the directory if it doesn't exists + os.makedirs(dir_name) + except OSError as exc: + if exc.errno != errno.EEXIST: + raise + + r = requests.get(url, stream=True) + assert r.status_code == 200, "failed to open %s" % url + with open(local_fname, 'wb') as f: + for chunk in r.iter_content(chunk_size=1024): + if chunk: # filter out keep-alive new chunks + f.write(chunk) + return local_fname diff --git a/examples/v1beta1/mxnet-mnist/mnist.py b/examples/v1beta1/mxnet-mnist/mnist.py new file mode 100644 index 00000000000..a0acc562767 --- /dev/null +++ b/examples/v1beta1/mxnet-mnist/mnist.py @@ -0,0 +1,107 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +""" +Train mnist, see more explanation at https://mxnet.io/tutorials/python/mnist.html +""" +import os +import argparse +import logging +import mxnet as mx +import numpy as np +import gzip +import struct +from common import fit +from common import utils +# This example only for mlp network +from symbols import mlp + +# Use this format (%Y-%m-%dT%H:%M:%SZ) to record timestamp of the metrics +logging.basicConfig( + format="%(asctime)s %(levelname)-8s %(message)s", + datefmt="%Y-%m-%dT%H:%M:%SZ", + level=logging.DEBUG) + + +def read_data(label, image): + """ + download and read data into numpy + """ + base_url = 'http://yann.lecun.com/exdb/mnist/' + with gzip.open(utils.download_file(base_url+label, os.path.join('data', label))) as flbl: + magic, num = struct.unpack(">II", flbl.read(8)) + label = np.fromstring(flbl.read(), dtype=np.int8) + with gzip.open(utils.download_file(base_url+image, os.path.join('data', image)), 'rb') as fimg: + magic, num, rows, cols = struct.unpack(">IIII", fimg.read(16)) + image = np.fromstring(fimg.read(), dtype=np.uint8).reshape(len(label), rows, cols) + return (label, image) + + +def to4d(img): + """ + reshape to 4D arrays + """ + return img.reshape(img.shape[0], 1, 28, 28).astype(np.float32)/255 + + +def get_mnist_iter(args, kv): + """ + create data iterator with NDArrayIter + """ + (train_lbl, train_img) = read_data( + 'train-labels-idx1-ubyte.gz', 'train-images-idx3-ubyte.gz') + (val_lbl, val_img) = read_data( + 't10k-labels-idx1-ubyte.gz', 't10k-images-idx3-ubyte.gz') + train = mx.io.NDArrayIter( + to4d(train_img), train_lbl, args.batch_size, shuffle=True) + val = mx.io.NDArrayIter( + to4d(val_img), val_lbl, args.batch_size) + return (train, val) + + +if __name__ == '__main__': + # parse args + parser = argparse.ArgumentParser(description="train mnist", + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + parser.add_argument('--num-classes', type=int, default=10, + help='the number of classes') + parser.add_argument('--num-examples', type=int, default=60000, + help='the number of training examples') + + parser.add_argument('--add_stn', action="store_true", default=False, + help='Add Spatial Transformer Network Layer (lenet only)') + parser.add_argument('--image_shape', default='1, 28, 28', help='shape of training images') + + fit.add_fit_args(parser) + parser.set_defaults( + # network + network='mlp', + # train + gpus=None, + batch_size=64, + disp_batches=100, + num_epochs=10, + lr=.05, + lr_step_epochs='10' + ) + args = parser.parse_args() + + # load mlp network + sym = mlp.get_symbol(**vars(args)) + + # train + fit.fit(args, sym, get_mnist_iter) diff --git a/examples/v1beta1/mxnet-mnist/symbols/__init__.py b/examples/v1beta1/mxnet-mnist/symbols/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/examples/v1beta1/mxnet-mnist/symbols/mlp.py b/examples/v1beta1/mxnet-mnist/symbols/mlp.py new file mode 100644 index 00000000000..f6f6f0eba32 --- /dev/null +++ b/examples/v1beta1/mxnet-mnist/symbols/mlp.py @@ -0,0 +1,33 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +""" +a simple multilayer perceptron +""" +import mxnet as mx + + +def get_symbol(num_classes=10, **kwargs): + data = mx.symbol.Variable('data') + data = mx.sym.Flatten(data=data) + fc1 = mx.symbol.FullyConnected(data=data, name='fc1', num_hidden=128) + act1 = mx.symbol.Activation(data=fc1, name='relu1', act_type="relu") + fc2 = mx.symbol.FullyConnected(data=act1, name='fc2', num_hidden=64) + act2 = mx.symbol.Activation(data=fc2, name='relu2', act_type="relu") + fc3 = mx.symbol.FullyConnected(data=act2, name='fc3', num_hidden=num_classes) + mlp = mx.symbol.SoftmaxOutput(data=fc3, name='softmax') + return mlp diff --git a/examples/v1beta1/nas/darts-cnn-cifar10/Dockerfile b/examples/v1beta1/nas/darts-cnn-cifar10/Dockerfile new file mode 100644 index 00000000000..cb77722c0e5 --- /dev/null +++ b/examples/v1beta1/nas/darts-cnn-cifar10/Dockerfile @@ -0,0 +1,9 @@ +ARG cuda_version=10.0 +ARG cudnn_version=7 +FROM pytorch/pytorch:1.0-cuda${cuda_version}-cudnn${cudnn_version}-runtime + + +ADD . /usr/src/app/github.com/kubeflow/katib +WORKDIR /usr/src/app/github.com/kubeflow/katib/examples/v1beta1/nas/darts-cnn-cifar10 + +ENTRYPOINT ["python3", "-u", "run_trial.py"] diff --git a/examples/v1beta1/nas/darts-cnn-cifar10/architect.py b/examples/v1beta1/nas/darts-cnn-cifar10/architect.py new file mode 100644 index 00000000000..65217706af3 --- /dev/null +++ b/examples/v1beta1/nas/darts-cnn-cifar10/architect.py @@ -0,0 +1,113 @@ +import torch +import copy + + +class Architect(): + """" Architect controls architecture of cell by computing gradients of alphas + """ + + def __init__(self, model, w_momentum, w_weight_decay): + self.model = model + self.v_model = copy.deepcopy(model) + self.w_momentum = w_momentum + self.w_weight_decay = w_weight_decay + + def virtual_step(self, train_x, train_y, xi, w_optim): + """ + Compute unrolled weight w' (virtual step) + Step process: + 1) forward + 2) calculate loss + 3) compute gradient (by backprop) + 4) update gradient + + Args: + xi: learning rate for virtual gradient step (same as weights lr) + w_optim: weights optimizer + """ + + # Forward and calculate loss + # Loss for train with w. L_train(w) + loss = self.model.loss(train_x, train_y) + # Compute gradient + gradients = torch.autograd.grad(loss, self.model.getWeights()) + + # Do virtual step (Update gradient) + # Bellow opeartions do not need gradient tracking + with torch.no_grad(): + # dict key is not the value, but the pointer. So original network weight have to + # be iterated also. + for w, vw, g in zip(self.model.getWeights(), self.v_model.getWeights(), gradients): + m = w_optim.state[w].get("momentum_buffer", 0.) * self.w_momentum + vw.copy_(w - xi * (m + g + self.w_weight_decay * w)) + + # Sync alphas + for a, va in zip(self.model.getAlphas(), self.v_model.getAlphas()): + va.copy_(a) + + def unrolled_backward(self, train_x, train_y, valid_x, valid_y, xi, w_optim): + """ Compute unrolled loss and backward its gradients + Args: + xi: learning rate for virtual gradient step (same as model lr) + w_optim: weights optimizer - for virtual step + """ + # Do virtual step (calc w') + self.virtual_step(train_x, train_y, xi, w_optim) + + # Calculate unrolled loss + # Loss for validation with w'. L_valid(w') + loss = self.v_model.loss(valid_x, valid_y) + + # Calculate gradient + v_alphas = tuple(self.v_model.getAlphas()) + v_weights = tuple(self.v_model.getWeights()) + v_grads = torch.autograd.grad(loss, v_alphas + v_weights) + + dalpha = v_grads[:len(v_alphas)] + dws = v_grads[len(v_alphas):] + + hessian = self.compute_hessian(dws, train_x, train_y) + + # Update final gradient = dalpha - xi * hessian + with torch.no_grad(): + for alpha, da, h in zip(self.model.getAlphas(), dalpha, hessian): + alpha.grad = da - xi * h + + def compute_hessian(self, dws, train_x, train_y): + """ + dw = dw' { L_valid(w', alpha) } + w+ = w + eps * dw + w- = w - eps * dw + hessian = (dalpha{ L_train(w+, alpha) } - dalpha{ L_train(w-, alpha) }) / (2*eps) + eps = 0.01 / ||dw|| + """ + + norm = torch.cat([dw.view(-1) for dw in dws]).norm() + eps = 0.01 / norm + + # w+ = w + eps * dw + with torch.no_grad(): + for p, dw in zip(self.model.getWeights(), dws): + p += eps * dw + + loss = self.model.loss(train_x, train_y) + # dalpha { L_train(w+, alpha) } + dalpha_positive = torch.autograd.grad(loss, self.model.getAlphas()) + + # w- = w - eps * dw + with torch.no_grad(): + for p, dw in zip(self.model.getWeights(), dws): + # TODO (andreyvelich): Do we need this * 2.0 ? + p -= 2. * eps * dw + + loss = self.model.loss(train_x, train_y) + # dalpha { L_train(w-, alpha) } + dalpha_negative = torch.autograd.grad(loss, self.model.getAlphas()) + + # recover w + with torch.no_grad(): + for p, dw in zip(self.model.getWeights(), dws): + p += eps * dw + + hessian = [(p-n) / (2. * eps) for p, n in zip(dalpha_positive, dalpha_negative)] + return hessian diff --git a/examples/v1beta1/nas/darts-cnn-cifar10/model.py b/examples/v1beta1/nas/darts-cnn-cifar10/model.py new file mode 100644 index 00000000000..f7080296db4 --- /dev/null +++ b/examples/v1beta1/nas/darts-cnn-cifar10/model.py @@ -0,0 +1,181 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from operations import FactorizedReduce, StdConv, MixedOp + + +class Cell(nn.Module): + """ Cell for search + Each edge is mixed and continuous relaxed. + """ + + def __init__(self, num_nodes, c_prev_prev, c_prev, c_cur, reduction_prev, reduction_cur, search_space): + """ + Args: + num_nodes: Number of intermediate cell nodes + c_prev_prev: channels_out[k-2] + c_prev : Channels_out[k-1] + c_cur : Channels_in[k] (current) + reduction_prev: flag for whether the previous cell is reduction cell or not + reduction_cur: flag for whether the current cell is reduction cell or not + """ + + super(Cell, self).__init__() + self.reduction_cur = reduction_cur + self.num_nodes = num_nodes + + # If previous cell is reduction cell, current input size does not match with + # output size of cell[k-2]. So the output[k-2] should be reduced by preprocessing + if reduction_prev: + self.preprocess0 = FactorizedReduce(c_prev_prev, c_cur) + else: + self.preprocess0 = StdConv(c_prev_prev, c_cur, kernel_size=1, stride=1, padding=0) + self.preprocess1 = StdConv(c_prev, c_cur, kernel_size=1, stride=1, padding=0) + + # Generate dag from mixed operations + self.dag_ops = nn.ModuleList() + + for i in range(self.num_nodes): + self.dag_ops.append(nn.ModuleList()) + # Include 2 input nodes + for j in range(2+i): + # Reduction with stride = 2 must be only for the input node + stride = 2 if reduction_cur and j < 2 else 1 + op = MixedOp(c_cur, stride, search_space) + self.dag_ops[i].append(op) + + def forward(self, s0, s1, w_dag): + s0 = self.preprocess0(s0) + s1 = self.preprocess1(s1) + + states = [s0, s1] + for edges, w_list in zip(self.dag_ops, w_dag): + state_cur = sum(edges[i](s, w) for i, (s, w) in enumerate((zip(states, w_list)))) + states.append(state_cur) + + state_out = torch.cat(states[2:], dim=1) + return state_out + + +class NetworkCNN(nn.Module): + + def __init__(self, init_channels, input_channels, num_classes, + num_layers, criterion, search_space, num_nodes, stem_multiplier): + super(NetworkCNN, self).__init__() + + self.init_channels = init_channels + self.num_classes = num_classes + self.num_layers = num_layers + self.criterion = criterion + + # TODO: Algorithm settings? + self.num_nodes = num_nodes + self.stem_multiplier = stem_multiplier + + c_cur = self.stem_multiplier*self.init_channels + + self.stem = nn.Sequential( + nn.Conv2d(input_channels, c_cur, 3, padding=1, bias=False), + nn.BatchNorm2d(c_cur) + ) + + # In first Cell stem is used for s0 and s1 + # c_prev_prev and c_prev - output channels size + # c_cur - init channels size + c_prev_prev, c_prev, c_cur = c_cur, c_cur, self.init_channels + + self.cells = nn.ModuleList() + + reduction_prev = False + for i in range(self.num_layers): + # For Network with 1 layer: Only Normal Cell + if self.num_layers == 1: + reduction_cur = False + else: + # For Network with two layers: First layer - Normal, Second - Reduction + # For Other Networks: [1/3, 2/3] Layers - Reduction cell with double channels + # Others - Normal cell + if ((self.num_layers == 2 and i == 1) or + (self.num_layers > 2 and i in [self.num_layers//3, 2*self.num_layers//3])): + c_cur *= 2 + reduction_cur = True + else: + reduction_cur = False + + cell = Cell(self.num_nodes, c_prev_prev, c_prev, c_cur, reduction_prev, reduction_cur, search_space) + reduction_prev = reduction_cur + self.cells.append(cell) + + c_cur_out = c_cur * self.num_nodes + c_prev_prev, c_prev = c_prev, c_cur_out + + self.global_pooling = nn.AdaptiveAvgPool2d(1) + self.classifier = nn.Linear(c_prev, self.num_classes) + + # Initialize alphas parameters + num_ops = len(search_space.primitives) + + self.alpha_normal = nn.ParameterList() + self.alpha_reduce = nn.ParameterList() + + for i in range(self.num_nodes): + self.alpha_normal.append(nn.Parameter(1e-3*torch.randn(i+2, num_ops))) + if self.num_layers > 1: + self.alpha_reduce.append(nn.Parameter(1e-3*torch.randn(i+2, num_ops))) + + # Setup alphas list + self.alphas = [] + for name, parameter in self.named_parameters(): + if "alpha" in name: + self.alphas.append((name, parameter)) + + def forward(self, x): + + weights_normal = [F.softmax(alpha, dim=-1) for alpha in self.alpha_normal] + weights_reduce = [F.softmax(alpha, dim=-1) for alpha in self.alpha_reduce] + + s0 = s1 = self.stem(x) + + for cell in self.cells: + weights = weights_reduce if cell.reduction_cur else weights_normal + s0, s1 = s1, cell(s0, s1, weights) + + out = self.global_pooling(s1) + + # Make out flatten + out = out.view(out.size(0), -1) + + logits = self.classifier(out) + return logits + + def print_alphas(self): + + print("\n>>> Alphas Normal <<<") + for alpha in self.alpha_normal: + print(F.softmax(alpha, dim=-1)) + + if self.num_layers > 1: + print("\n>>> Alpha Reduce <<<") + for alpha in self.alpha_reduce: + print(F.softmax(alpha, dim=-1)) + print("\n") + + def getWeights(self): + return self.parameters() + + def getAlphas(self): + for _, parameter in self.alphas: + yield parameter + + def loss(self, x, y): + logits = self.forward(x) + return self.criterion(logits, y) + + def genotype(self, search_space): + gene_normal = search_space.parse(self.alpha_normal, k=2) + gene_reduce = search_space.parse(self.alpha_reduce, k=2) + # concat all intermediate nodes + concat = range(2, 2 + self.num_nodes) + + return search_space.genotype(normal=gene_normal, normal_concat=concat, + reduce=gene_reduce, reduce_concat=concat) diff --git a/examples/v1beta1/nas/darts-cnn-cifar10/operations.py b/examples/v1beta1/nas/darts-cnn-cifar10/operations.py new file mode 100644 index 00000000000..e9efe8b9e63 --- /dev/null +++ b/examples/v1beta1/nas/darts-cnn-cifar10/operations.py @@ -0,0 +1,166 @@ +import torch.nn as nn +import torch + +OPS = { + 'none': lambda channels, stride: Zero(stride), + 'avg_pooling_3x3': lambda channels, stride: PoolBN('avg', channels, kernel_size=3, stride=stride, padding=1), + 'max_pooling_3x3': lambda channels, stride: PoolBN('max', channels, kernel_size=3, stride=stride, padding=1), + 'skip_connection': lambda channels, stride: Identity() if stride == 1 else FactorizedReduce(channels, channels), + 'separable_convolution_3x3': lambda channels, stride: SepConv(channels, kernel_size=3, stride=stride, padding=1), + 'separable_convolution_5x5': lambda channels, stride: SepConv(channels, kernel_size=5, stride=stride, padding=2), + # 3x3 -> 5x5 + 'dilated_convolution_3x3': lambda channels, stride: DilConv(channels, + kernel_size=3, stride=stride, padding=2, dilation=2), + # 5x5 -> 9x9 + 'dilated_convolution_5x5': lambda channels, stride: DilConv(channels, + kernel_size=5, stride=stride, padding=4, dilation=2), +} + + +class Zero(nn.Module): + """ + Zero operation + """ + + def __init__(self, stride): + super(Zero, self).__init__() + self.stride = stride + + def forward(self, x): + if self.stride == 1: + return x * 0. + # Resize by stride + return x[:, :, ::self.stride, ::self.stride] * 0. + + +class PoolBN(nn.Module): + """ + Avg or Max pooling - BN + """ + + def __init__(self, pool_type, channels, kernel_size, stride, padding): + super(PoolBN, self).__init__() + if pool_type == "avg": + self.pool = nn.AvgPool2d(kernel_size, stride, padding, count_include_pad=False) + elif pool_type == "max": + self.pool = nn.MaxPool2d(kernel_size, stride, padding) + + self.bn = nn.BatchNorm2d(channels, affine=False) + self.net = nn.Sequential( + self.pool, + self.bn + ) + + def forward(self, x): + # out = self.pool(x), + # print(out) + # out = self.bn(out) + # print(out) + return self.net(x) + + +class Identity(nn.Module): + + def __init__(self): + super(Identity, self).__init__() + + def forward(self, x): + return x + + +class FactorizedReduce(nn.Module): + """ + Reduce feature map size by factorized pointwise (stride=2) + ReLU - Conv1 - Conv2 - BN + """ + + def __init__(self, c_in, c_out): + super(FactorizedReduce, self).__init__() + self.relu = nn.ReLU() + self.conv1 = nn.Conv2d(c_in, c_out // 2, kernel_size=1, stride=2, padding=0, bias=False) + self.conv2 = nn.Conv2d(c_in, c_out // 2, kernel_size=1, stride=2, padding=0, bias=False) + self.bn = nn.BatchNorm2d(c_out, affine=False) + + def forward(self, x): + + x = self.relu(x) + out = torch.cat([self.conv1(x), self.conv2(x[:, :, 1:, 1:])], dim=1) + out = self.bn(out) + + return out + + +class StdConv(nn.Module): + """ Standard convolition + ReLU - Conv - BN + """ + + def __init__(self, c_in, c_out, kernel_size, stride, padding): + super(StdConv, self).__init__() + self.net = nn.Sequential( + nn.ReLU(), + nn.Conv2d(c_in, c_out, kernel_size=kernel_size, stride=stride, padding=padding, bias=False), + nn.BatchNorm2d(c_out, affine=False) + ) + + def forward(self, x): + return self.net(x) + + +class DilConv(nn.Module): + """ (Dilated) depthwise separable conv + ReLU - (Dilated) depthwise separable - Pointwise - BN + + If dilation == 2, 3x3 conv => 5x5 receptive field + 5x5 conv => 9x9 receptive field + """ + + def __init__(self, channels, kernel_size, stride, padding, dilation): + super(DilConv, self).__init__() + + self.net = nn.Sequential( + nn.ReLU(), + nn.Conv2d(channels, channels, kernel_size, stride, padding, dilation=dilation, groups=channels, bias=False), + nn.Conv2d(channels, channels, kernel_size=1, stride=1, padding=0, bias=False), + nn.BatchNorm2d(channels, affine=False) + ) + + def forward(self, x): + return self.net(x) + + +class SepConv(nn.Module): + """ Depthwise separable conv + DilConv (dilation=1) * 2 + """ + + def __init__(self, channels, kernel_size, stride, padding): + super(SepConv, self).__init__() + self.net = nn.Sequential( + DilConv(channels, kernel_size, stride=stride, padding=padding, dilation=1), + DilConv(channels, kernel_size, stride=1, padding=padding, dilation=1) + ) + + def forward(self, x): + return self.net(x) + + +class MixedOp(nn.Module): + """ Mixed operation + """ + + def __init__(self, channels, stride, search_space): + super(MixedOp, self).__init__() + self.ops = nn.ModuleList() + + for primitive in search_space.primitives: + op = OPS[primitive](channels, stride) + self.ops.append(op) + + def forward(self, x, weights): + """ + Args: + x: input + weights: weight for each operation + """ + return sum(w * op(x) for w, op in zip(weights, self.ops)) diff --git a/examples/v1beta1/nas/darts-cnn-cifar10/run_trial.py b/examples/v1beta1/nas/darts-cnn-cifar10/run_trial.py new file mode 100644 index 00000000000..e243c42aa06 --- /dev/null +++ b/examples/v1beta1/nas/darts-cnn-cifar10/run_trial.py @@ -0,0 +1,245 @@ + +import torch.nn as nn + +import torch +import argparse +import json +import numpy as np + +from model import NetworkCNN +from architect import Architect +import utils +from search_space import SearchSpace + + +def main(): + + parser = argparse.ArgumentParser(description='TrainingContainer') + parser.add_argument('--algorithm-settings', type=str, default="", help="algorithm settings") + parser.add_argument('--search-space', type=str, default="", help="search space for the neural architecture search") + parser.add_argument('--num-layers', type=str, default="", help="number of layers of the neural network") + + args = parser.parse_args() + + # Get Algorithm Settings + algorithm_settings = args.algorithm_settings.replace("\'", "\"") + algorithm_settings = json.loads(algorithm_settings) + print(">>> Algorithm settings") + for key, value in algorithm_settings.items(): + if len(key) > 13: + print("{}\t{}".format(key, value)) + elif len(key) < 5: + print("{}\t\t\t{}".format(key, value)) + else: + print("{}\t\t{}".format(key, value)) + print() + + num_epochs = int(algorithm_settings["num_epochs"]) + + w_lr = float(algorithm_settings["w_lr"]) + w_lr_min = float(algorithm_settings["w_lr_min"]) + w_momentum = float(algorithm_settings["w_momentum"]) + w_weight_decay = float(algorithm_settings["w_weight_decay"]) + w_grad_clip = float(algorithm_settings["w_grad_clip"]) + + alpha_lr = float(algorithm_settings["alpha_lr"]) + alpha_weight_decay = float(algorithm_settings["alpha_weight_decay"]) + + batch_size = int(algorithm_settings["batch_size"]) + num_workers = int(algorithm_settings["num_workers"]) + + init_channels = int(algorithm_settings["init_channels"]) + + print_step = int(algorithm_settings["print_step"]) + + num_nodes = int(algorithm_settings["num_nodes"]) + stem_multiplier = int(algorithm_settings["stem_multiplier"]) + + # Get Search Space + search_space = args.search_space.replace("\'", "\"") + search_space = json.loads(search_space) + search_space = SearchSpace(search_space) + + # Get Num Layers + num_layers = int(args.num_layers) + print("Number of layers {}\n".format(num_layers)) + + # Set GPU Device + # Currently use only first available GPU + # TODO: Add multi GPU support + # TODO: Add functionality to select GPU + all_gpus = list(range(torch.cuda.device_count())) + if len(all_gpus) > 0: + device = torch.device("cuda") + torch.cuda.set_device(all_gpus[0]) + np.random.seed(2) + torch.manual_seed(2) + torch.cuda.manual_seed_all(2) + torch.backends.cudnn.benchmark = True + print(">>> Use GPU for Training <<<") + print("Device ID: {}".format(torch.cuda.current_device())) + print("Device name: {}".format(torch.cuda.get_device_name(0))) + print("Device availability: {}\n".format(torch.cuda.is_available())) + else: + device = torch.device("cpu") + print(">>> Use CPU for Training <<<") + + # Get dataset with meta information + # TODO: Add support for more dataset + input_channels, num_classes, train_data = utils.get_dataset() + + criterion = nn.CrossEntropyLoss().to(device) + + model = NetworkCNN(init_channels, input_channels, num_classes, num_layers, + criterion, search_space, num_nodes, stem_multiplier) + + model = model.to(device) + + # Weights optimizer + w_optim = torch.optim.SGD(model.getWeights(), w_lr, momentum=w_momentum, weight_decay=w_weight_decay) + + # Alphas optimizer + alpha_optim = torch.optim.Adam(model.getAlphas(), alpha_lr, betas=(0.5, 0.999), weight_decay=alpha_weight_decay) + + # Split data to train/validation + num_train = len(train_data) + split = num_train // 2 + indices = list(range(num_train)) + + train_sampler = torch.utils.data.sampler.SubsetRandomSampler(indices[:split]) + valid_sampler = torch.utils.data.sampler.SubsetRandomSampler(indices[split:]) + + train_loader = torch.utils.data.DataLoader(train_data, + batch_size=batch_size, + sampler=train_sampler, + num_workers=num_workers, + pin_memory=True) + + valid_loader = torch.utils.data.DataLoader(train_data, + batch_size=batch_size, + sampler=valid_sampler, + num_workers=num_workers, + pin_memory=True) + + lr_scheduler = torch.optim.lr_scheduler.CosineAnnealingLR( + w_optim, + num_epochs, + eta_min=w_lr_min) + + architect = Architect(model, w_momentum, w_weight_decay) + + # Start training + best_top1 = 0. + + for epoch in range(num_epochs): + lr_scheduler.step() + lr = lr_scheduler.get_lr()[0] + + model.print_alphas() + + # Training + print(">>> Training") + train(train_loader, valid_loader, model, architect, w_optim, alpha_optim, + lr, epoch, num_epochs, device, w_grad_clip, print_step) + + # Validation + print("\n>>> Validation") + cur_step = (epoch + 1) * len(train_loader) + top1 = validate(valid_loader, model, epoch, cur_step, num_epochs, device, print_step) + + # Print genotype + genotype = model.genotype(search_space) + print("\nModel genotype = {}".format(genotype)) + + # Modify best top1 + if top1 > best_top1: + best_top1 = top1 + best_genotype = genotype + + print("Final best Prec@1 = {:.4%}".format(best_top1)) + print("\nBest-Genotype={}".format(str(best_genotype).replace(" ", ""))) + + +def train(train_loader, valid_loader, model, architect, w_optim, alpha_optim, + lr, epoch, num_epochs, device, w_grad_clip, print_step): + top1 = utils.AverageMeter() + top5 = utils.AverageMeter() + losses = utils.AverageMeter() + cur_step = epoch * len(train_loader) + + model.train() + for step, ((train_x, train_y), (valid_x, valid_y)) in enumerate(zip(train_loader, valid_loader)): + + train_x, train_y = train_x.to(device, non_blocking=True), train_y.to(device, non_blocking=True) + valid_x, valid_y = valid_x.to(device, non_blocking=True), valid_y.to(device, non_blocking=True) + + train_size = train_x.size(0) + + # Phase 1. Architect step (Alpha) + alpha_optim.zero_grad() + architect.unrolled_backward(train_x, train_y, valid_x, valid_y, lr, w_optim) + alpha_optim.step() + + # Phase 2. Child network step (W) + w_optim.zero_grad() + logits = model(train_x) + loss = model.criterion(logits, train_y) + loss.backward() + + # Gradient clipping + nn.utils.clip_grad_norm_(model.getWeights(), w_grad_clip) + w_optim.step() + + prec1, prec5 = utils.accuracy(logits, train_y, topk=(1, 5)) + + losses.update(loss.item(), train_size) + top1.update(prec1.item(), train_size) + top5.update(prec5.item(), train_size) + + if step % print_step == 0 or step == len(train_loader) - 1: + print( + "Train: [{:2d}/{}] Step {:03d}/{:03d} Loss {losses.avg:.3f} " + "Prec@(1,5) ({top1.avg:.1%}, {top5.avg:.1%})".format( + epoch+1, num_epochs, step, len(train_loader)-1, losses=losses, + top1=top1, top5=top5)) + + cur_step += 1 + + print("Train: [{:2d}/{}] Final Prec@1 {:.4%}".format(epoch+1, num_epochs, top1.avg)) + + +def validate(valid_loader, model, epoch, cur_step, num_epochs, device, print_step): + top1 = utils.AverageMeter() + top5 = utils.AverageMeter() + losses = utils.AverageMeter() + + model.eval() + + with torch.no_grad(): + for step, (valid_x, valid_y) in enumerate(valid_loader): + valid_x, valid_y = valid_x.to(device, non_blocking=True), valid_y.to(device, non_blocking=True) + + valid_size = valid_x.size(0) + + logits = model(valid_x) + loss = model.criterion(logits, valid_y) + + prec1, prec5 = utils.accuracy(logits, valid_y, topk=(1, 5)) + losses.update(loss.item(), valid_size) + top1.update(prec1.item(), valid_size) + top5.update(prec5.item(), valid_size) + + if step % print_step == 0 or step == len(valid_loader) - 1: + print( + "Validation: [{:2d}/{}] Step {:03d}/{:03d} Loss {losses.avg:.3f} " + "Prec@(1,5) ({top1.avg:.1%}, {top5.avg:.1%})".format( + epoch+1, num_epochs, step, len(valid_loader)-1, losses=losses, + top1=top1, top5=top5)) + + print("Valid: [{:2d}/{}] Final Prec@1 {:.4%}".format(epoch+1, num_epochs, top1.avg)) + + return top1.avg + + +if __name__ == "__main__": + main() diff --git a/examples/v1beta1/nas/darts-cnn-cifar10/search_space.py b/examples/v1beta1/nas/darts-cnn-cifar10/search_space.py new file mode 100644 index 00000000000..f1ca61eee01 --- /dev/null +++ b/examples/v1beta1/nas/darts-cnn-cifar10/search_space.py @@ -0,0 +1,50 @@ +from collections import namedtuple +import torch + + +class SearchSpace(): + def __init__(self, search_space): + self.primitives = search_space + self.primitives.append("none") + + print(">>> All Primitives") + print("{}\n".format(self.primitives)) + self.genotype = namedtuple('Genotype', 'normal normal_concat reduce reduce_concat') + + def parse(self, alpha, k): + """ + Parse continuous alpha to discrete gene. + alpha is ParameterList: + ParameterList [ + Parameter(n_edges1, n_ops), + Parameter(n_edges2, n_ops), + ... + ] + + gene is list: + [ + [('node1_ops_1', node_idx), ..., ('node1_ops_k', node_idx)], + [('node2_ops_1', node_idx), ..., ('node2_ops_k', node_idx)], + ... + ] + each node has two edges (k=2) in CNN. + """ + + gene = [] + assert self.primitives[-1] == 'none' # assume last PRIMITIVE is 'none' + + # 1) Convert the mixed op to discrete edge (single op) by choosing top-1 weight edge + # 2) Choose top-k edges per node by edge score (top-1 weight in edge) + for edges in alpha: + # edges: Tensor(n_edges, n_ops) + edge_max, primitive_indices = torch.topk(edges[:, :-1], 1) # ignore 'none' + topk_edge_values, topk_edge_indices = torch.topk(edge_max.view(-1), k) + node_gene = [] + for edge_idx in topk_edge_indices: + prim_idx = primitive_indices[edge_idx] + prim = self.primitives[prim_idx] + node_gene.append((prim, edge_idx.item())) + + gene.append(node_gene) + + return gene diff --git a/examples/v1beta1/nas/darts-cnn-cifar10/utils.py b/examples/v1beta1/nas/darts-cnn-cifar10/utils.py new file mode 100644 index 00000000000..b736ebbe5ea --- /dev/null +++ b/examples/v1beta1/nas/darts-cnn-cifar10/utils.py @@ -0,0 +1,70 @@ +import torchvision.datasets as dset +import torchvision.transforms as transforms + + +class AverageMeter(): + """ Computes and stores the average and current value """ + + def __init__(self): + self.reset() + + def reset(self): + """ Reset all statistics """ + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + + def update(self, val, n=1): + """ Update statistics """ + self.val = val + self.sum += val * n + self.count += n + self.avg = self.sum / self.count + + +def accuracy(output, target, topk=(1,)): + """ Computes the precision@k for the specified values of k """ + maxk = max(topk) + batch_size = target.size(0) + + _, pred = output.topk(maxk, 1, True, True) + + pred = pred.t() + # one-hot case + if target.ndimension() > 1: + target = target.max(1)[1] + + correct = pred.eq(target.view(1, -1).expand_as(pred)) + + res = [] + for k in topk: + correct_k = correct[:k].view(-1).float().sum(0) + res.append(correct_k.mul_(1.0 / batch_size)) + + return res + + +def get_dataset(): + dataset_cls = dset.CIFAR10 + num_classes = 10 + input_channels = 3 + + # Do preprocessing + MEAN = [0.49139968, 0.48215827, 0.44653124] + STD = [0.24703233, 0.24348505, 0.26158768] + transf = [ + transforms.RandomCrop(32, padding=4), + transforms.RandomHorizontalFlip() + ] + + normalize = [ + transforms.ToTensor(), + transforms.Normalize(MEAN, STD) + ] + + train_transform = transforms.Compose(transf + normalize) + + train_data = dataset_cls(root="./data", train=True, download=True, transform=train_transform) + + return input_channels, num_classes, train_data diff --git a/examples/v1beta1/nas/darts-example-gpu.yaml b/examples/v1beta1/nas/darts-example-gpu.yaml new file mode 100644 index 00000000000..a44a6c111c1 --- /dev/null +++ b/examples/v1beta1/nas/darts-example-gpu.yaml @@ -0,0 +1,85 @@ +apiVersion: "kubeflow.org/v1beta1" +kind: Experiment +metadata: + namespace: kubeflow + name: darts-example-gpu +spec: + parallelTrialCount: 1 + maxTrialCount: 1 + maxFailedTrialCount: 1 + objective: + type: maximize + objectiveMetricName: Best-Genotype + metricsCollectorSpec: + collector: + kind: StdOut + source: + filter: + metricsFormat: + - "([\\w-]+)=(Genotype.*)" + algorithm: + algorithmName: darts + algorithmSettings: + - name: num_epochs + value: "3" + nasConfig: + graphConfig: + numLayers: 3 + operations: + - operationType: separable_convolution + parameters: + - name: filter_size + parameterType: categorical + feasibleSpace: + list: + - "3" + - operationType: dilated_convolution + parameters: + - name: filter_size + parameterType: categorical + feasibleSpace: + list: + - "3" + - "5" + - operationType: avg_pooling + parameters: + - name: filter_size + parameterType: categorical + feasibleSpace: + list: + - "3" + - operationType: max_pooling + parameters: + - name: filter_size + parameterType: categorical + feasibleSpace: + list: + - "3" + - operationType: skip_connection + trialTemplate: + goTemplate: + rawTemplate: |- + apiVersion: batch/v1 + kind: Job + metadata: + name: {{.Trial}} + namespace: {{.NameSpace}} + spec: + template: + spec: + containers: + - name: {{.Trial}} + image: docker.io/kubeflowkatib/darts-cnn-cifar10 + imagePullPolicy: Always + command: + - "python3" + - "run_trial.py" + {{- with .HyperParameters}} + {{- range .}} + - "--{{.Name}}=\"{{.Value}}\"" + {{- end}} + {{- end}} + resources: + limits: + nvidia.com/gpu: 1 + restartPolicy: Never diff --git a/examples/v1beta1/nas/enas-cnn-cifar10/Dockerfile.cpu b/examples/v1beta1/nas/enas-cnn-cifar10/Dockerfile.cpu new file mode 100644 index 00000000000..694aff8ffff --- /dev/null +++ b/examples/v1beta1/nas/enas-cnn-cifar10/Dockerfile.cpu @@ -0,0 +1,22 @@ +FROM tensorflow/tensorflow:1.12.0 + +# Install system packages +RUN apt-get update && apt-get install -y software-properties-common && \ + add-apt-repository ppa:deadsnakes/ppa && \ + apt-get update && \ + apt-get install -y --no-install-recommends \ + python3-setuptools \ + python3-dev \ + python3-pip \ + git \ + graphviz \ + wget + +ADD . /usr/src/app/github.com/kubeflow/katib +WORKDIR /usr/src/app/github.com/kubeflow/katib/examples/v1beta1/nas/enas-cnn-cifar10 + +RUN pip3 install --upgrade pip +RUN pip3 install --upgrade --no-cache-dir -r requirements-cpu.txt +ENV PYTHONPATH /usr/src/app/github.com/kubeflow/katib/examples/v1beta1/nas/enas-cnn-cifar10 + +ENTRYPOINT ["python3", "-u", "RunTrial.py"] diff --git a/examples/v1beta1/nas/enas-cnn-cifar10/Dockerfile.gpu b/examples/v1beta1/nas/enas-cnn-cifar10/Dockerfile.gpu new file mode 100644 index 00000000000..03e19ed970e --- /dev/null +++ b/examples/v1beta1/nas/enas-cnn-cifar10/Dockerfile.gpu @@ -0,0 +1,32 @@ +ARG cuda_version=10.0 +ARG cudnn_version=7 +FROM nvidia/cuda:${cuda_version}-cudnn${cudnn_version}-devel + +# Install system packages +RUN apt-get update && apt-get install -y software-properties-common && \ + add-apt-repository ppa:deadsnakes/ppa && \ + apt-get update && \ + apt-get install -y --no-install-recommends \ + bzip2 \ + g++ \ + git \ + graphviz \ + libgl1-mesa-glx \ + libhdf5-dev \ + openmpi-bin \ + python3 \ + python3-pip \ + python3-setuptools \ + python3-dev \ + wget && \ + rm -rf /var/lib/apt/lists/* + + +ADD . /usr/src/app/github.com/kubeflow/katib +WORKDIR /usr/src/app/github.com/kubeflow/katib/examples/v1beta1/nas/enas-cnn-cifar10 + +RUN pip3 install --upgrade pip +RUN pip3 install --no-cache-dir -r requirements-gpu.txt +ENV PYTHONPATH /usr/src/app/github.com/kubeflow/katib/examples/v1beta1/nas/enas-cnn-cifar10 + +ENTRYPOINT ["python3", "-u", "RunTrial.py"] diff --git a/examples/v1beta1/nas/enas-cnn-cifar10/ModelConstructor.py b/examples/v1beta1/nas/enas-cnn-cifar10/ModelConstructor.py new file mode 100644 index 00000000000..6ef93cc3301 --- /dev/null +++ b/examples/v1beta1/nas/enas-cnn-cifar10/ModelConstructor.py @@ -0,0 +1,67 @@ +import numpy as np +from keras.models import Model +from keras import backend as K +import json +from keras.layers import Input, Conv2D, ZeroPadding2D, concatenate, MaxPooling2D, \ + AveragePooling2D, Dense, Activation, BatchNormalization, GlobalAveragePooling2D, Dropout +from op_library import concat, conv, sp_conv, dw_conv, reduction + + +class ModelConstructor(object): + def __init__(self, arc_json, nn_json): + self.arch = json.loads(arc_json) + nn_config = json.loads(nn_json) + self.num_layers = nn_config['num_layers'] + self.input_sizes = nn_config['input_sizes'] + self.output_size = nn_config['output_sizes'][-1] + self.embedding = nn_config['embedding'] + + def build_model(self): + # a list of the data all layers + all_layers = [0 for _ in range(self.num_layers + 1)] + # a list of all the dimensions of all layers + all_dims = [0 for _ in range(self.num_layers + 1)] + + # ================= Stacking layers ================= + # Input Layer. Layer 0 + input_layer = Input(shape=self.input_sizes) + all_layers[0] = input_layer + + # Intermediate Layers. Starting from layer 1. + for l in range(1, self.num_layers + 1): + input_layers = list() + opt = self.arch[l - 1][0] + opt_config = self.embedding[str(opt)] + skip = self.arch[l - 1][1:l+1] + + # set up the connection to the previous layer first + input_layers.append(all_layers[l - 1]) + + # then add skip connections + for i in range(l - 1): + if l > 1 and skip[i] == 1: + input_layers.append(all_layers[i]) + + layer_input = concat(input_layers) + if opt_config['opt_type'] == 'convolution': + layer_output = conv(layer_input, opt_config) + if opt_config['opt_type'] == 'separable_convolution': + layer_output = sp_conv(layer_input, opt_config) + if opt_config['opt_type'] == 'depthwise_convolution': + layer_output = dw_conv(layer_input, opt_config) + elif opt_config['opt_type'] == 'reduction': + layer_output = reduction(layer_input, opt_config) + + all_layers[l] = layer_output + + # Final Layer + # Global Average Pooling, then Fully connected with softmax. + avgpooled = GlobalAveragePooling2D()(all_layers[self.num_layers]) + dropped = Dropout(0.4)(avgpooled) + logits = Dense(units=self.output_size, + activation='softmax')(dropped) + + # Encapsulate the model + self.model = Model(inputs=input_layer, outputs=logits) + + return self.model diff --git a/examples/v1beta1/nas/enas-cnn-cifar10/RunTrial.py b/examples/v1beta1/nas/enas-cnn-cifar10/RunTrial.py new file mode 100644 index 00000000000..4672e079a27 --- /dev/null +++ b/examples/v1beta1/nas/enas-cnn-cifar10/RunTrial.py @@ -0,0 +1,78 @@ +import keras +import numpy as np +from keras.datasets import cifar10 +from ModelConstructor import ModelConstructor +from keras.utils import to_categorical +from keras.utils import multi_gpu_model +from keras.preprocessing.image import ImageDataGenerator +import argparse +import time + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='TrainingContainer') + parser.add_argument('--architecture', type=str, default="", metavar='N', + help='architecture of the neural network') + parser.add_argument('--nn_config', type=str, default="", metavar='N', + help='configurations and search space embeddings') + parser.add_argument('--num_epochs', type=int, default=10, metavar='N', + help='number of epoches that each child will be trained') + parser.add_argument('--num_gpus', type=int, default=1, metavar='N', + help='number of GPU that used for training') + args = parser.parse_args() + + arch = args.architecture.replace("\'", "\"") + print(">>> arch received by trial") + print(arch) + + nn_config = args.nn_config.replace("\'", "\"") + print(">>> nn_config received by trial") + print(nn_config) + + num_epochs = args.num_epochs + print(">>> num_epochs received by trial") + print(num_epochs) + + num_gpus = args.num_gpus + print(">>> num_gpus received by trial:") + print(num_gpus) + + print("\n>>> Constructing Model...") + constructor = ModelConstructor(arch, nn_config) + test_model = constructor.build_model() + print(">>> Model Constructed Successfully\n") + + if num_gpus > 1: + test_model = multi_gpu_model(test_model, gpus=num_gpus) + + test_model.summary() + test_model.compile(loss=keras.losses.categorical_crossentropy, + optimizer=keras.optimizers.Adam(lr=1e-3, decay=1e-4), + metrics=['accuracy']) + + (x_train, y_train), (x_test, y_test) = cifar10.load_data() + x_train = x_train.astype('float32') + x_test = x_test.astype('float32') + x_train /= 255 + x_test /= 255 + y_train = to_categorical(y_train) + y_test = to_categorical(y_test) + + augmentation = ImageDataGenerator( + width_shift_range=0.1, + height_shift_range=0.1, + horizontal_flip=True) + + # TODO: Add batch size to args + aug_data_flow = augmentation.flow(x_train, y_train, batch_size=128) + + print(">>> Data Loaded. Training starts.") + for e in range(num_epochs): + print("\nTotal Epoch {}/{}".format(e+1, num_epochs)) + history = test_model.fit_generator(generator=aug_data_flow, + steps_per_epoch=int(len(x_train)/128)+1, + epochs=1, verbose=1, + validation_data=(x_test, y_test)) + print("Training-Accuracy={}".format(history.history['acc'][-1])) + print("Training-Loss={}".format(history.history['loss'][-1])) + print("Validation-Accuracy={}".format(history.history['val_acc'][-1])) + print("Validation-Loss={}".format(history.history['val_loss'][-1])) diff --git a/examples/v1beta1/nas/enas-cnn-cifar10/op_library.py b/examples/v1beta1/nas/enas-cnn-cifar10/op_library.py new file mode 100644 index 00000000000..cd95429d97b --- /dev/null +++ b/examples/v1beta1/nas/enas-cnn-cifar10/op_library.py @@ -0,0 +1,141 @@ +import numpy as np +from keras import backend as K +from keras.layers import Input, Conv2D, ZeroPadding2D, concatenate, MaxPooling2D, \ + AveragePooling2D, Dense, Activation, BatchNormalization, GlobalAveragePooling2D, \ + SeparableConv2D, DepthwiseConv2D + + +def concat(inputs): + n = len(inputs) + if n == 1: + return inputs[0] + + total_dim = list() + for x in inputs: + total_dim.append(K.int_shape(x)) + total_dim = np.asarray(total_dim) + max_dim = max(total_dim[:, 1]) + + padded_input = [0 for _ in range(n)] + + for i in range(n): + if total_dim[i][1] < max_dim: + diff = max_dim - total_dim[i][1] + half_diff = int(diff / 2) + if diff % 2 == 0: + padded_input[i] = ZeroPadding2D(padding=(half_diff, half_diff))(inputs[i]) + else: + padded_input[i] = ZeroPadding2D(padding=((half_diff, half_diff + 1), + (half_diff, half_diff + 1)))(inputs[i]) + else: + padded_input[i] = inputs[i] + + result = concatenate(inputs=padded_input, axis=-1) + return result + + +def conv(x, config): + parameters = { + "num_filter": 64, + "filter_size": 3, + "stride": 1, + } + for k in parameters.keys(): + if k in config: + parameters[k] = int(config[k]) + + activated = Activation('relu')(x) + + conved = Conv2D( + filters=parameters['num_filter'], + kernel_size=parameters['filter_size'], + strides=parameters['stride'], + padding='same')(activated) + + result = BatchNormalization()(conved) + + return result + + +def sp_conv(x, config): + parameters = { + "num_filter": 64, + "filter_size": 3, + "stride": 1, + "depth_multiplier": 1, + } + + for k in parameters.keys(): + if k in config: + parameters[k] = int(config[k]) + + activated = Activation('relu')(x) + + conved = SeparableConv2D( + filters=parameters['num_filter'], + kernel_size=parameters['filter_size'], + strides=parameters['stride'], + depth_multiplier=parameters['depth_multiplier'], + padding='same')(activated) + + result = BatchNormalization()(conved) + + return result + +def dw_conv(x, config): + parameters = { + "filter_size": 3, + "stride": 1, + "depth_multiplier": 1, + } + for k in parameters.keys(): + if k in config: + parameters[k] = int(config[k]) + + activated = Activation('relu')(x) + + conved = DepthwiseConv2D( + kernel_size=parameters['filter_size'], + strides=parameters['stride'], + depth_multiplier=parameters['depth_multiplier'], + padding='same')(activated) + + result = BatchNormalization()(conved) + + return result + + +def reduction(x, config): + # handle the exteme case where the input has the dimension 1 by 1 and is not reductible + # we will just change the reduction layer to identity layer + # such situation is very likely to appear though + dim = K.int_shape(x) + if dim[1] == 1 or dim[2] == 1: + print("WARNING: One or more dimensions of the input of the reduction layer is 1. It cannot be further reduced. A identity layer will be used instead.") + return x + + parameters = { + 'reduction_type': "max_pooling", + 'pool_size': 2, + 'stride': None, + } + + if 'reduction_type' in config: + parameters['reduction_type'] = config['reduction_type'] + if 'pool_size' in config: + parameters['pool_size'] = int(config['pool_size']) + if 'stride' in config: + parameters['stride'] = int(config['stride']) + + if parameters['reduction_type'] == 'max_pooling': + result = MaxPooling2D( + pool_size=parameters['pool_size'], + strides=parameters['stride'] + )(x) + elif parameters['reduction_type'] == 'avg_pooling': + result = AveragePooling2D( + pool_size=parameters['pool_size'], + strides=parameters['stride'] + )(x) + + return result diff --git a/examples/v1beta1/nas/enas-cnn-cifar10/requirements-cpu.txt b/examples/v1beta1/nas/enas-cnn-cifar10/requirements-cpu.txt new file mode 100644 index 00000000000..28faabc0492 --- /dev/null +++ b/examples/v1beta1/nas/enas-cnn-cifar10/requirements-cpu.txt @@ -0,0 +1,2 @@ +tensorflow==1.15.2 +keras==2.2.4 diff --git a/examples/v1beta1/nas/enas-cnn-cifar10/requirements-gpu.txt b/examples/v1beta1/nas/enas-cnn-cifar10/requirements-gpu.txt new file mode 100644 index 00000000000..4d7a717abcf --- /dev/null +++ b/examples/v1beta1/nas/enas-cnn-cifar10/requirements-gpu.txt @@ -0,0 +1,2 @@ +tensorflow-gpu==1.15.2 +keras==2.2.4 diff --git a/examples/v1beta1/nas/enas-example-cpu.yaml b/examples/v1beta1/nas/enas-example-cpu.yaml new file mode 100644 index 00000000000..af45ec9a13b --- /dev/null +++ b/examples/v1beta1/nas/enas-example-cpu.yaml @@ -0,0 +1,149 @@ +# This CPU example aims to show all the possible operations +# is not very likely to get good result due to the extensive search space + +# In practice, setting up a limited search space with more common operations is more likely to get better performance. +# For example, Efficient Neural Architecture Search via Parameter Sharing (https://arxiv.org/abs/1802.03268) +# uses only 6 operations, 3x3/5x5 convolution, 3x3/5x5 separable_convolution and 3x3 max_pooling/avg_pooling. + +# It uses only 1 layer of CNN and 1 train epoch to show CPU support and it has very bad results. +# In practice, if you increase number of layers, training process on CPU will take more time. + +apiVersion: "kubeflow.org/v1beta1" +kind: Experiment +metadata: + namespace: kubeflow + name: enas-example-cpu +spec: + parallelTrialCount: 2 + maxTrialCount: 3 + maxFailedTrialCount: 2 + objective: + type: maximize + goal: 0.99 + objectiveMetricName: Validation-Accuracy + algorithm: + algorithmName: enas + trialTemplate: + goTemplate: + rawTemplate: |- + apiVersion: batch/v1 + kind: Job + metadata: + name: {{.Trial}} + namespace: {{.NameSpace}} + spec: + template: + spec: + containers: + - name: {{.Trial}} + image: docker.io/kubeflowkatib/enas-cnn-cifar10-cpu + command: + - "python3" + - "-u" + - "RunTrial.py" + {{- with .HyperParameters}} + {{- range .}} + - "--{{.Name}}=\"{{.Value}}\"" + {{- end}} + {{- end}} + - "--num_epochs=1" + restartPolicy: Never + nasConfig: + graphConfig: + numLayers: 1 + inputSizes: + - 32 + - 32 + - 3 + outputSizes: + - 10 + operations: + - operationType: convolution + parameters: + - name: filter_size + parameterType: categorical + feasibleSpace: + list: + - "3" + - "5" + - "7" + - name: num_filter + parameterType: categorical + feasibleSpace: + list: + - "32" + - "48" + - "64" + - "96" + - "128" + - name: stride + parameterType: categorical + feasibleSpace: + list: + - "1" + - "2" + - operationType: separable_convolution + parameters: + - name: filter_size + parameterType: categorical + feasibleSpace: + list: + - "3" + - "5" + - "7" + - name: num_filter + parameterType: categorical + feasibleSpace: + list: + - "32" + - "48" + - "64" + - "96" + - "128" + - name: stride + parameterType: categorical + feasibleSpace: + list: + - "1" + - "2" + - name: depth_multiplier + parameterType: categorical + feasibleSpace: + list: + - "1" + - "2" + - operationType: depthwise_convolution + parameters: + - name: filter_size + parameterType: categorical + feasibleSpace: + list: + - "3" + - "5" + - "7" + - name: stride + parameterType: categorical + feasibleSpace: + list: + - "1" + - "2" + - name: depth_multiplier + parameterType: categorical + feasibleSpace: + list: + - "1" + - "2" + - operationType: reduction + parameters: + - name: reduction_type + parameterType: categorical + feasibleSpace: + list: + - max_pooling + - avg_pooling + - name: pool_size + parameterType: int + feasibleSpace: + min: "2" + max: "3" + step: "1" diff --git a/examples/v1beta1/nas/enas-example-gpu.yaml b/examples/v1beta1/nas/enas-example-gpu.yaml new file mode 100644 index 00000000000..1799c45f20b --- /dev/null +++ b/examples/v1beta1/nas/enas-example-gpu.yaml @@ -0,0 +1,148 @@ +# This GPU example aims to show all the possible operations +# is not very likely to get good result due to the extensive search space + +# In practice, setting up a limited search space with more common operations is more likely to get better performance. +# For example, Efficient Neural Architecture Search via Parameter Sharing (https://arxiv.org/abs/1802.03268) +# uses only 6 operations, 3x3/5x5 convolution, 3x3/5x5 separable_convolution and 3x3 max_pooling/avg_pooling + +apiVersion: "kubeflow.org/v1beta1" +kind: Experiment +metadata: + namespace: kubeflow + name: enas-example-gpu +spec: + parallelTrialCount: 3 + maxTrialCount: 12 + maxFailedTrialCount: 3 + objective: + type: maximize + goal: 0.99 + objectiveMetricName: Validation-Accuracy + algorithm: + algorithmName: enas + trialTemplate: + goTemplate: + rawTemplate: |- + apiVersion: batch/v1 + kind: Job + metadata: + name: {{.Trial}} + namespace: {{.NameSpace}} + spec: + template: + spec: + containers: + - name: {{.Trial}} + image: docker.io/kubeflowkatib/enas-cnn-cifar10-gpu + command: + - "python3" + - "-u" + - "RunTrial.py" + {{- with .HyperParameters}} + {{- range .}} + - "--{{.Name}}=\"{{.Value}}\"" + {{- end}} + {{- end}} + resources: + limits: + nvidia.com/gpu: 1 + restartPolicy: Never + nasConfig: + graphConfig: + numLayers: 8 + inputSizes: + - 32 + - 32 + - 3 + outputSizes: + - 10 + operations: + - operationType: convolution + parameters: + - name: filter_size + parameterType: categorical + feasibleSpace: + list: + - "3" + - "5" + - "7" + - name: num_filter + parameterType: categorical + feasibleSpace: + list: + - "32" + - "48" + - "64" + - "96" + - "128" + - name: stride + parameterType: categorical + feasibleSpace: + list: + - "1" + - "2" + - operationType: separable_convolution + parameters: + - name: filter_size + parameterType: categorical + feasibleSpace: + list: + - "3" + - "5" + - "7" + - name: num_filter + parameterType: categorical + feasibleSpace: + list: + - "32" + - "48" + - "64" + - "96" + - "128" + - name: stride + parameterType: categorical + feasibleSpace: + list: + - "1" + - "2" + - name: depth_multiplier + parameterType: categorical + feasibleSpace: + list: + - "1" + - "2" + - operationType: depthwise_convolution + parameters: + - name: filter_size + parameterType: categorical + feasibleSpace: + list: + - "3" + - "5" + - "7" + - name: stride + parameterType: categorical + feasibleSpace: + list: + - "1" + - "2" + - name: depth_multiplier + parameterType: categorical + feasibleSpace: + list: + - "1" + - "2" + - operationType: reduction + parameters: + - name: reduction_type + parameterType: categorical + feasibleSpace: + list: + - max_pooling + - avg_pooling + - name: pool_size + parameterType: int + feasibleSpace: + min: "2" + max: "3" + step: "1" diff --git a/examples/v1beta1/never-resume-example.yaml b/examples/v1beta1/never-resume-example.yaml new file mode 100644 index 00000000000..8ee684e6317 --- /dev/null +++ b/examples/v1beta1/never-resume-example.yaml @@ -0,0 +1,62 @@ +apiVersion: "kubeflow.org/v1beta1" +kind: Experiment +metadata: + namespace: kubeflow + labels: + controller-tools.k8s.io: "1.0" + name: never-resume-example +spec: + objective: + type: maximize + goal: 0.99 + objectiveMetricName: Validation-accuracy + additionalMetricNames: + - Train-accuracy + algorithm: + algorithmName: random + parallelTrialCount: 3 + maxTrialCount: 12 + maxFailedTrialCount: 3 + resumePolicy: Never + parameters: + - name: --lr + parameterType: double + feasibleSpace: + min: "0.01" + max: "0.03" + - name: --num-layers + parameterType: int + feasibleSpace: + min: "2" + max: "5" + - name: --optimizer + parameterType: categorical + feasibleSpace: + list: + - sgd + - adam + - ftrl + trialTemplate: + goTemplate: + rawTemplate: |- + apiVersion: batch/v1 + kind: Job + metadata: + name: {{.Trial}} + namespace: {{.NameSpace}} + spec: + template: + spec: + containers: + - name: {{.Trial}} + image: docker.io/kubeflowkatib/mxnet-mnist + command: + - "python3" + - "/opt/mxnet-mnist/mnist.py" + - "--batch-size=64" + {{- with .HyperParameters}} + {{- range .}} + - "{{.Name}}={{.Value}}" + {{- end}} + {{- end}} + restartPolicy: Never diff --git a/examples/v1beta1/pytorchjob-example.yaml b/examples/v1beta1/pytorchjob-example.yaml new file mode 100644 index 00000000000..33a5a888819 --- /dev/null +++ b/examples/v1beta1/pytorchjob-example.yaml @@ -0,0 +1,70 @@ +apiVersion: "kubeflow.org/v1beta1" +kind: Experiment +metadata: + namespace: kubeflow + name: pytorchjob-example +spec: + parallelTrialCount: 3 + maxTrialCount: 12 + maxFailedTrialCount: 3 + objective: + type: maximize + goal: 0.99 + objectiveMetricName: accuracy + algorithm: + algorithmName: random + trialTemplate: + goTemplate: + rawTemplate: |- + apiVersion: "kubeflow.org/v1" + kind: PyTorchJob + metadata: + name: {{.Trial}} + namespace: {{.NameSpace}} + spec: + pytorchReplicaSpecs: + Master: + replicas: 1 + restartPolicy: OnFailure + template: + spec: + containers: + - name: pytorch + image: gcr.io/kubeflow-ci/pytorch-dist-mnist-test:v1.0 + imagePullPolicy: Always + command: + - "python" + - "/var/mnist.py" + {{- with .HyperParameters}} + {{- range .}} + - "{{.Name}}={{.Value}}" + {{- end}} + {{- end}} + Worker: + replicas: 2 + restartPolicy: OnFailure + template: + spec: + containers: + - name: pytorch + image: gcr.io/kubeflow-ci/pytorch-dist-mnist-test:v1.0 + imagePullPolicy: Always + command: + - "python" + - "/var/mnist.py" + {{- with .HyperParameters}} + {{- range .}} + - "{{.Name}}={{.Value}}" + {{- end}} + {{- end}} + parameters: + - name: --lr + parameterType: double + feasibleSpace: + min: "0.01" + max: "0.05" + - name: --momentum + parameterType: double + feasibleSpace: + min: "0.5" + max: "0.9" diff --git a/examples/v1beta1/random-example.yaml b/examples/v1beta1/random-example.yaml new file mode 100644 index 00000000000..0ecf61cd1df --- /dev/null +++ b/examples/v1beta1/random-example.yaml @@ -0,0 +1,61 @@ +apiVersion: "kubeflow.org/v1beta1" +kind: Experiment +metadata: + namespace: kubeflow + labels: + controller-tools.k8s.io: "1.0" + name: random-example +spec: + objective: + type: maximize + goal: 0.99 + objectiveMetricName: Validation-accuracy + additionalMetricNames: + - Train-accuracy + algorithm: + algorithmName: random + parallelTrialCount: 3 + maxTrialCount: 12 + maxFailedTrialCount: 3 + parameters: + - name: --lr + parameterType: double + feasibleSpace: + min: "0.01" + max: "0.03" + - name: --num-layers + parameterType: int + feasibleSpace: + min: "2" + max: "5" + - name: --optimizer + parameterType: categorical + feasibleSpace: + list: + - sgd + - adam + - ftrl + trialTemplate: + goTemplate: + rawTemplate: |- + apiVersion: batch/v1 + kind: Job + metadata: + name: {{.Trial}} + namespace: {{.NameSpace}} + spec: + template: + spec: + containers: + - name: {{.Trial}} + image: docker.io/kubeflowkatib/mxnet-mnist + command: + - "python3" + - "/opt/mxnet-mnist/mnist.py" + - "--batch-size=64" + {{- with .HyperParameters}} + {{- range .}} + - "{{.Name}}={{.Value}}" + {{- end}} + {{- end}} + restartPolicy: Never diff --git a/examples/v1beta1/tfjob-example.yaml b/examples/v1beta1/tfjob-example.yaml new file mode 100644 index 00000000000..ade5c38379a --- /dev/null +++ b/examples/v1beta1/tfjob-example.yaml @@ -0,0 +1,61 @@ +apiVersion: "kubeflow.org/v1beta1" +kind: Experiment +metadata: + namespace: kubeflow + name: tfjob-example +spec: + parallelTrialCount: 3 + maxTrialCount: 12 + maxFailedTrialCount: 3 + objective: + type: maximize + goal: 0.99 + objectiveMetricName: accuracy_1 + algorithm: + algorithmName: random + metricsCollectorSpec: + source: + fileSystemPath: + path: /train + kind: Directory + collector: + kind: TensorFlowEvent + parameters: + - name: --learning_rate + parameterType: double + feasibleSpace: + min: "0.01" + max: "0.05" + - name: --batch_size + parameterType: int + feasibleSpace: + min: "100" + max: "200" + trialTemplate: + goTemplate: + rawTemplate: |- + apiVersion: "kubeflow.org/v1" + kind: TFJob + metadata: + name: {{.Trial}} + namespace: {{.NameSpace}} + spec: + tfReplicaSpecs: + Worker: + replicas: 1 + restartPolicy: OnFailure + template: + spec: + containers: + - name: tensorflow + image: gcr.io/kubeflow-ci/tf-mnist-with-summaries:1.0 + imagePullPolicy: Always + command: + - "python" + - "/var/tf_mnist/mnist_with_summaries.py" + - "--log_dir=/train/metrics" + {{- with .HyperParameters}} + {{- range .}} + - "{{.Name}}={{.Value}}" + {{- end}} + {{- end}} diff --git a/examples/v1beta1/tpe-example.yaml b/examples/v1beta1/tpe-example.yaml new file mode 100644 index 00000000000..5f9714c34d8 --- /dev/null +++ b/examples/v1beta1/tpe-example.yaml @@ -0,0 +1,61 @@ +apiVersion: "kubeflow.org/v1beta1" +kind: Experiment +metadata: + namespace: kubeflow + labels: + controller-tools.k8s.io: "1.0" + name: tpe-example +spec: + objective: + type: maximize + goal: 0.99 + objectiveMetricName: Validation-accuracy + additionalMetricNames: + - Train-accuracy + algorithm: + algorithmName: tpe + parallelTrialCount: 3 + maxTrialCount: 12 + maxFailedTrialCount: 3 + parameters: + - name: --lr + parameterType: double + feasibleSpace: + min: "0.01" + max: "0.03" + - name: --num-layers + parameterType: int + feasibleSpace: + min: "2" + max: "5" + - name: --optimizer + parameterType: categorical + feasibleSpace: + list: + - sgd + - adam + - ftrl + trialTemplate: + goTemplate: + rawTemplate: |- + apiVersion: batch/v1 + kind: Job + metadata: + name: {{.Trial}} + namespace: {{.NameSpace}} + spec: + template: + spec: + containers: + - name: {{.Trial}} + image: docker.io/kubeflowkatib/mxnet-mnist + command: + - "python3" + - "/opt/mxnet-mnist/mnist.py" + - "--batch-size=64" + {{- with .HyperParameters}} + {{- range .}} + - "{{.Name}}={{.Value}}" + {{- end}} + {{- end}} + restartPolicy: Never diff --git a/hack/swagger/main.go b/hack/swagger/main.go index 119fd6c1142..094bf6f587c 100644 --- a/hack/swagger/main.go +++ b/hack/swagger/main.go @@ -21,14 +21,15 @@ import ( "github.com/go-openapi/spec" "github.com/kubeflow/katib/pkg/apis/v1alpha3" + "github.com/kubeflow/katib/pkg/apis/v1beta1" "k8s.io/klog" "k8s.io/kube-openapi/pkg/common" ) // Generate OpenAPI spec definitions for Katib Resource func main() { - if len(os.Args) <= 1 { - klog.Fatal("Supply a version") + if len(os.Args) <= 2 { + klog.Fatal("Supply Swagger version and Katib Version") } version := os.Args[1] if !strings.HasPrefix(version, "v") { @@ -37,7 +38,17 @@ func main() { refCallback := func(name string) spec.Ref { return spec.MustCreateRef("#/definitions/" + common.EscapeJsonPointer(swaggify(name))) } - oAPIDefs := v1alpha3.GetOpenAPIDefinitions(refCallback) + + katibVersion := os.Args[2] + oAPIDefs := make(map[string]common.OpenAPIDefinition) + if katibVersion == "v1alpha3" { + oAPIDefs = v1alpha3.GetOpenAPIDefinitions(refCallback) + } else if katibVersion == "v1beta1" { + oAPIDefs = v1beta1.GetOpenAPIDefinitions(refCallback) + } else { + klog.Fatalf("Katib version %v is not supported", katibVersion) + } + defs := spec.Definitions{} for defName, val := range oAPIDefs { defs[swaggify(defName)] = val.Schema @@ -49,8 +60,8 @@ func main() { Paths: &spec.Paths{Paths: map[string]spec.PathItem{}}, Info: &spec.Info{ InfoProps: spec.InfoProps{ - Title: "katib", - Description: "swagger description for katib", + Title: "Katib", + Description: "Swagger description for Katib", Version: version, }, }, diff --git a/hack/update-openapigen.sh b/hack/update-openapigen.sh index 6f2c5ad816d..51c22c00bf8 100755 --- a/hack/update-openapigen.sh +++ b/hack/update-openapigen.sh @@ -19,21 +19,40 @@ set -o nounset set -o pipefail if [[ -z "${GOPATH:-}" ]]; then - export GOPATH=$(go env GOPATH) + export GOPATH=$(go env GOPATH) fi PROJECT_ROOT=$(pwd) CODEGEN_PKG=$(pwd)/vendor/k8s.io/code-generator -VERSION="v1alpha3" -SWAGGER_CODEGEN_FILE="pkg/apis/v1alpha3/swagger.json" + +KATIB_VERSION_V1ALPHA3="v1alpha3" +SWAGGER_CODEGEN_FILE_V1ALPHA3="pkg/apis/v1alpha3/swagger.json" + +KATIB_VERSION_V1BETA1="v1beta1" +SWAGGER_CODEGEN_FILE_V1BETA1="pkg/apis/v1beta1/swagger.json" + SWAGGER_VERSION="0.1" -echo "Generating OpenAPI specification ..." +# OpenAPI for v1alpha3 Katib version +echo "Generating OpenAPI specification for v1alpha3..." +go run ${CODEGEN_PKG}/cmd/openapi-gen/main.go \ + --go-header-file ${PROJECT_ROOT}/hack/boilerplate.go.txt \ + --input-dirs github.com/kubeflow/katib/pkg/apis/controller/common/${KATIB_VERSION_V1ALPHA3},github.com/kubeflow/katib/pkg/apis/controller/experiments/${KATIB_VERSION_V1ALPHA3},github.com/kubeflow/katib/pkg/apis/controller/suggestions/${KATIB_VERSION_V1ALPHA3},github.com/kubeflow/katib/pkg/apis/controller/trials/${KATIB_VERSION_V1ALPHA3} \ + --output-package github.com/kubeflow/katib/pkg/apis/${KATIB_VERSION_V1ALPHA3} \ + $@ + +# Swagger file for v1alpha3 Katib version +echo "Generating Swagger file for v1alpha3..." +go run hack/swagger/main.go ${SWAGGER_VERSION} ${KATIB_VERSION_V1ALPHA3} >${SWAGGER_CODEGEN_FILE_V1ALPHA3} + +# OpenAPI for v1beta1 Katib version +echo "Generating OpenAPI specification for v1beta1..." go run ${CODEGEN_PKG}/cmd/openapi-gen/main.go \ --go-header-file ${PROJECT_ROOT}/hack/boilerplate.go.txt \ - --input-dirs github.com/kubeflow/katib/pkg/apis/controller/common/${VERSION},github.com/kubeflow/katib/pkg/apis/controller/experiments/${VERSION},github.com/kubeflow/katib/pkg/apis/controller/suggestions/${VERSION},github.com/kubeflow/katib/pkg/apis/controller/trials/${VERSION} \ - --output-package github.com/kubeflow/katib/pkg/apis/${VERSION} \ + --input-dirs github.com/kubeflow/katib/pkg/apis/controller/common/${KATIB_VERSION_V1BETA1},github.com/kubeflow/katib/pkg/apis/controller/experiments/${KATIB_VERSION_V1BETA1},github.com/kubeflow/katib/pkg/apis/controller/suggestions/${KATIB_VERSION_V1BETA1},github.com/kubeflow/katib/pkg/apis/controller/trials/${KATIB_VERSION_V1BETA1} \ + --output-package github.com/kubeflow/katib/pkg/apis/${KATIB_VERSION_V1BETA1} \ $@ -echo "Generating swagger file ..." -go run hack/swagger/main.go ${SWAGGER_VERSION} > ${SWAGGER_CODEGEN_FILE} +# Swagger file for v1beta1 Katib version +echo "Generating Swagger file for v1beta1..." +go run hack/swagger/main.go ${SWAGGER_VERSION} ${KATIB_VERSION_V1BETA1} >${SWAGGER_CODEGEN_FILE_V1BETA1} diff --git a/manifests/v1beta1/0-namespace.yaml b/manifests/v1beta1/0-namespace.yaml new file mode 100644 index 00000000000..d5b7bf410a2 --- /dev/null +++ b/manifests/v1beta1/0-namespace.yaml @@ -0,0 +1,6 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: kubeflow + labels: + katib-metricscollector-injection: enabled diff --git a/manifests/v1beta1/db-manager/deployment.yaml b/manifests/v1beta1/db-manager/deployment.yaml new file mode 100644 index 00000000000..729f7907fb0 --- /dev/null +++ b/manifests/v1beta1/db-manager/deployment.yaml @@ -0,0 +1,48 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: katib-db-manager + namespace: kubeflow + labels: + app: katib + component: db-manager +spec: + replicas: 1 + selector: + matchLabels: + app: katib + component: db-manager + template: + metadata: + name: katib-db-manager + labels: + app: katib + component: db-manager + spec: + containers: + - name: katib-db-manager + image: gcr.io/kubeflow-images-public/katib/v1beta1/katib-db-manager + imagePullPolicy: IfNotPresent + env: + - name: DB_NAME + value: "mysql" + - name: DB_PASSWORD + valueFrom: + secretKeyRef: + name: katib-mysql-secrets + key: MYSQL_ROOT_PASSWORD + command: + - "./katib-db-manager" + ports: + - name: api + containerPort: 6789 + readinessProbe: + exec: + command: ["/bin/grpc_health_probe", "-addr=:6789"] + initialDelaySeconds: 5 + livenessProbe: + exec: + command: ["/bin/grpc_health_probe", "-addr=:6789"] + initialDelaySeconds: 10 + periodSeconds: 60 + failureThreshold: 5 diff --git a/manifests/v1beta1/db-manager/service.yaml b/manifests/v1beta1/db-manager/service.yaml new file mode 100644 index 00000000000..ca9e6ef78c3 --- /dev/null +++ b/manifests/v1beta1/db-manager/service.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: Service +metadata: + name: katib-db-manager + namespace: kubeflow + labels: + app: katib + component: db-manager +spec: + type: ClusterIP + ports: + - port: 6789 + protocol: TCP + name: api + selector: + app: katib + component: db-manager diff --git a/manifests/v1beta1/katib-controller/crd-experiment.yaml b/manifests/v1beta1/katib-controller/crd-experiment.yaml new file mode 100644 index 00000000000..2637aa90041 --- /dev/null +++ b/manifests/v1beta1/katib-controller/crd-experiment.yaml @@ -0,0 +1,25 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: experiments.kubeflow.org +spec: + additionalPrinterColumns: + - JSONPath: .status.conditions[-1:].type + name: Status + type: string + - JSONPath: .metadata.creationTimestamp + name: Age + type: date + group: kubeflow.org + version: v1beta1 + scope: Namespaced + subresources: + status: {} + names: + kind: Experiment + singular: experiment + plural: experiments + categories: + - all + - kubeflow + - katib diff --git a/manifests/v1beta1/katib-controller/crd-suggestion.yaml b/manifests/v1beta1/katib-controller/crd-suggestion.yaml new file mode 100644 index 00000000000..8de13785c00 --- /dev/null +++ b/manifests/v1beta1/katib-controller/crd-suggestion.yaml @@ -0,0 +1,34 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: suggestions.kubeflow.org +spec: + additionalPrinterColumns: + - JSONPath: .status.conditions[-1:].type + name: Type + type: string + - JSONPath: .status.conditions[-1:].status + name: Status + type: string + - JSONPath: .spec.requests + name: Requested + type: string + - JSONPath: .status.suggestionCount + name: Assigned + type: string + - JSONPath: .metadata.creationTimestamp + name: Age + type: date + group: kubeflow.org + version: v1beta1 + scope: Namespaced + subresources: + status: {} + names: + kind: Suggestion + singular: suggestion + plural: suggestions + categories: + - all + - kubeflow + - katib diff --git a/manifests/v1beta1/katib-controller/crd-trial.yaml b/manifests/v1beta1/katib-controller/crd-trial.yaml new file mode 100644 index 00000000000..6b7dd5347f0 --- /dev/null +++ b/manifests/v1beta1/katib-controller/crd-trial.yaml @@ -0,0 +1,28 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: trials.kubeflow.org +spec: + additionalPrinterColumns: + - JSONPath: .status.conditions[-1:].type + name: Type + type: string + - JSONPath: .status.conditions[-1:].status + name: Status + type: string + - JSONPath: .metadata.creationTimestamp + name: Age + type: date + group: kubeflow.org + version: v1beta1 + scope: Namespaced + subresources: + status: {} + names: + kind: Trial + singular: trial + plural: trials + categories: + - all + - kubeflow + - katib diff --git a/manifests/v1beta1/katib-controller/katib-config.yaml b/manifests/v1beta1/katib-controller/katib-config.yaml new file mode 100644 index 00000000000..0caf0cf023a --- /dev/null +++ b/manifests/v1beta1/katib-controller/katib-config.yaml @@ -0,0 +1,56 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: katib-config + namespace: kubeflow +data: + metrics-collector-sidecar: |- + { + "StdOut": { + "image": "gcr.io/kubeflow-images-public/katib/v1beta1/file-metrics-collector" + }, + "File": { + "image": "gcr.io/kubeflow-images-public/katib/v1beta1/file-metrics-collector" + }, + "TensorFlowEvent": { + "image": "gcr.io/kubeflow-images-public/katib/v1beta1/tfevent-metrics-collector", + "resources": { + "limits": { + "memory": "1Gi" + } + } + } + } + suggestion: |- + { + "random": { + "image": "gcr.io/kubeflow-images-public/katib/v1beta1/suggestion-hyperopt" + }, + "grid": { + "image": "gcr.io/kubeflow-images-public/katib/v1beta1/suggestion-chocolate" + }, + "hyperband": { + "image": "gcr.io/kubeflow-images-public/katib/v1beta1/suggestion-hyperband" + }, + "bayesianoptimization": { + "image": "gcr.io/kubeflow-images-public/katib/v1beta1/suggestion-skopt" + }, + "tpe": { + "image": "gcr.io/kubeflow-images-public/katib/v1beta1/suggestion-hyperopt" + }, + "enas": { + "image": "gcr.io/kubeflow-images-public/katib/v1beta1/suggestion-enas", + "imagePullPolicy": "Always", + "resources": { + "limits": { + "memory": "200Mi" + } + } + }, + "cmaes": { + "image": "gcr.io/kubeflow-images-public/katib/v1beta1/suggestion-goptuna" + }, + "darts": { + "image": "gcr.io/kubeflow-images-public/katib/v1beta1/suggestion-darts" + } + } diff --git a/manifests/v1beta1/katib-controller/katib-controller.yaml b/manifests/v1beta1/katib-controller/katib-controller.yaml new file mode 100644 index 00000000000..779f255bad5 --- /dev/null +++ b/manifests/v1beta1/katib-controller/katib-controller.yaml @@ -0,0 +1,48 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: katib-controller + namespace: kubeflow + labels: + app: katib-controller +spec: + replicas: 1 + selector: + matchLabels: + app: katib-controller + template: + metadata: + labels: + app: katib-controller + annotations: + prometheus.io/scrape: "true" + spec: + serviceAccountName: katib-controller + containers: + - name: katib-controller + image: gcr.io/kubeflow-images-public/katib/v1beta1/katib-controller + imagePullPolicy: IfNotPresent + command: ["./katib-controller"] + args: + - "--webhook-port=8443" + ports: + - containerPort: 8443 + name: webhook + protocol: TCP + - containerPort: 8080 + name: metrics + protocol: TCP + env: + - name: KATIB_CORE_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + volumeMounts: + - mountPath: /tmp/cert + name: cert + readOnly: true + volumes: + - name: cert + secret: + defaultMode: 420 + secretName: katib-controller diff --git a/manifests/v1beta1/katib-controller/rbac.yaml b/manifests/v1beta1/katib-controller/rbac.yaml new file mode 100644 index 00000000000..df5da3d0254 --- /dev/null +++ b/manifests/v1beta1/katib-controller/rbac.yaml @@ -0,0 +1,88 @@ +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: katib-controller +rules: + - apiGroups: + - "" + resources: + - configmaps + - serviceaccounts + - services + - secrets + - events + - namespaces + verbs: + - "*" + - apiGroups: + - "" + resources: + - pods + - pods/log + - pods/status + verbs: + - "*" + - apiGroups: + - apps + resources: + - deployments + verbs: + - "*" + - apiGroups: + - batch + resources: + - jobs + - cronjobs + verbs: + - "*" + - apiGroups: + - apiextensions.k8s.io + resources: + - customresourcedefinitions + verbs: + - create + - get + - apiGroups: + - admissionregistration.k8s.io + resources: + - validatingwebhookconfigurations + - mutatingwebhookconfigurations + verbs: + - "*" + - apiGroups: + - kubeflow.org + resources: + - experiments + - experiments/status + - trials + - trials/status + - suggestions + - suggestions/status + verbs: + - "*" + - apiGroups: + - kubeflow.org + resources: + - tfjobs + - pytorchjobs + verbs: + - "*" +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: katib-controller + namespace: kubeflow +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: katib-controller +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: katib-controller +subjects: + - kind: ServiceAccount + name: katib-controller + namespace: kubeflow diff --git a/manifests/v1beta1/katib-controller/secret.yaml b/manifests/v1beta1/katib-controller/secret.yaml new file mode 100644 index 00000000000..8c9b009caf9 --- /dev/null +++ b/manifests/v1beta1/katib-controller/secret.yaml @@ -0,0 +1,5 @@ +apiVersion: v1 +kind: Secret +metadata: + name: katib-controller + namespace: kubeflow diff --git a/manifests/v1beta1/katib-controller/service.yaml b/manifests/v1beta1/katib-controller/service.yaml new file mode 100644 index 00000000000..cb2548a13c7 --- /dev/null +++ b/manifests/v1beta1/katib-controller/service.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +kind: Service +metadata: + name: katib-controller + namespace: kubeflow + annotations: + prometheus.io/port: "8080" + prometheus.io/scheme: http + prometheus.io/scrape: "true" +spec: + ports: + - port: 443 + protocol: TCP + targetPort: 8443 + name: webhook + - name: metrics + port: 8080 + targetPort: 8080 + selector: + app: katib-controller diff --git a/manifests/v1beta1/katib-controller/trialTemplateConfigmap.yaml b/manifests/v1beta1/katib-controller/trialTemplateConfigmap.yaml new file mode 100644 index 00000000000..eff3c7c3baa --- /dev/null +++ b/manifests/v1beta1/katib-controller/trialTemplateConfigmap.yaml @@ -0,0 +1,28 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: trial-template + namespace: kubeflow +data: + defaultTrialTemplate.yaml: |- + apiVersion: batch/v1 + kind: Job + metadata: + name: {{.Trial}} + namespace: {{.NameSpace}} + spec: + template: + spec: + containers: + - name: {{.Trial}} + image: docker.io/kubeflowkatib/mxnet-mnist + command: + - "python3" + - "/opt/mxnet-mnist/mnist.py" + - "--batch-size=64" + {{- with .HyperParameters}} + {{- range .}} + - "{{.Name}}={{.Value}}" + {{- end}} + {{- end}} + restartPolicy: Never diff --git a/manifests/v1beta1/katib-controller/trialTemplateConfigmapLabeled.yaml b/manifests/v1beta1/katib-controller/trialTemplateConfigmapLabeled.yaml new file mode 100644 index 00000000000..211f77bd17d --- /dev/null +++ b/manifests/v1beta1/katib-controller/trialTemplateConfigmapLabeled.yaml @@ -0,0 +1,95 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: trial-template-labeled + namespace: kubeflow + labels: + app: katib-trial-templates +data: + defaultTrialTemplate.yaml: |- + apiVersion: batch/v1 + kind: Job + metadata: + name: {{.Trial}} + namespace: {{.NameSpace}} + spec: + template: + spec: + containers: + - name: {{.Trial}} + image: docker.io/kubeflowkatib/mxnet-mnist + command: + - "python3" + - "/opt/mxnet-mnist/mnist.py" + - "--batch-size=64" + {{- with .HyperParameters}} + {{- range .}} + - "{{.Name}}={{.Value}}" + {{- end}} + {{- end}} + restartPolicy: Never + enasCPUTemplate: |- + apiVersion: batch/v1 + kind: Job + metadata: + name: {{.Trial}} + namespace: {{.NameSpace}} + spec: + template: + spec: + containers: + - name: {{.Trial}} + image: docker.io/kubeflowkatib/enas-cnn-cifar10-cpu + command: + - "python3.5" + - "-u" + - "RunTrial.py" + {{- with .HyperParameters}} + {{- range .}} + - "--{{.Name}}=\"{{.Value}}\"" + {{- end}} + {{- end}} + - "--num_epochs=1" + restartPolicy: Never + pytorchJobTemplate: |- + apiVersion: "kubeflow.org/v1" + kind: PyTorchJob + metadata: + name: {{.Trial}} + namespace: {{.NameSpace}} + spec: + pytorchReplicaSpecs: + Master: + replicas: 1 + restartPolicy: OnFailure + template: + spec: + containers: + - name: pytorch + image: gcr.io/kubeflow-ci/pytorch-dist-mnist-test:v1.0 + imagePullPolicy: Always + command: + - "python" + - "/var/mnist.py" + {{- with .HyperParameters}} + {{- range .}} + - "{{.Name}}={{.Value}}" + {{- end}} + {{- end}} + Worker: + replicas: 2 + restartPolicy: OnFailure + template: + spec: + containers: + - name: pytorch + image: gcr.io/kubeflow-ci/pytorch-dist-mnist-test:v1.0 + imagePullPolicy: Always + command: + - "python" + - "/var/mnist.py" + {{- with .HyperParameters}} + {{- range .}} + - "{{.Name}}={{.Value}}" + {{- end}} + {{- end}} diff --git a/manifests/v1beta1/mysql-db/deployment.yaml b/manifests/v1beta1/mysql-db/deployment.yaml new file mode 100644 index 00000000000..a99496bbf7d --- /dev/null +++ b/manifests/v1beta1/mysql-db/deployment.yaml @@ -0,0 +1,65 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: katib-mysql + namespace: kubeflow + labels: + app: katib + component: mysql +spec: + replicas: 1 + selector: + matchLabels: + app: katib + component: mysql + template: + metadata: + name: katib-mysql + labels: + app: katib + component: mysql + spec: + containers: + - name: katib-mysql + image: mysql:8 + args: + - --datadir + - /var/lib/mysql/datadir + env: + - name: MYSQL_ROOT_PASSWORD + valueFrom: + secretKeyRef: + name: katib-mysql-secrets + key: MYSQL_ROOT_PASSWORD + - name: MYSQL_ALLOW_EMPTY_PASSWORD + value: "true" + - name: MYSQL_DATABASE + value: "katib" + ports: + - name: dbapi + containerPort: 3306 + readinessProbe: + exec: + command: + - "/bin/bash" + - "-c" + - "mysql -D ${MYSQL_DATABASE} -u root -p${MYSQL_ROOT_PASSWORD} -e 'SELECT 1'" + initialDelaySeconds: 5 + periodSeconds: 10 + timeoutSeconds: 1 + livenessProbe: + exec: + command: + - "/bin/bash" + - "-c" + - "mysqladmin ping -u root -p${MYSQL_ROOT_PASSWORD}" + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 5 + volumeMounts: + - name: katib-mysql + mountPath: /var/lib/mysql + volumes: + - name: katib-mysql + persistentVolumeClaim: + claimName: katib-mysql diff --git a/manifests/v1beta1/mysql-db/secret.yaml b/manifests/v1beta1/mysql-db/secret.yaml new file mode 100644 index 00000000000..b6f36d50a10 --- /dev/null +++ b/manifests/v1beta1/mysql-db/secret.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: Secret +type: Opaque +metadata: + name: katib-mysql-secrets + namespace: kubeflow +data: + MYSQL_ROOT_PASSWORD: dGVzdA== # "test" diff --git a/manifests/v1beta1/mysql-db/service.yaml b/manifests/v1beta1/mysql-db/service.yaml new file mode 100644 index 00000000000..85827ca6c50 --- /dev/null +++ b/manifests/v1beta1/mysql-db/service.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: Service +metadata: + name: katib-mysql + namespace: kubeflow + labels: + app: katib + component: mysql +spec: + type: ClusterIP + ports: + - port: 3306 + protocol: TCP + name: dbapi + selector: + app: katib + component: mysql diff --git a/manifests/v1beta1/pv/pv.yaml b/manifests/v1beta1/pv/pv.yaml new file mode 100644 index 00000000000..a3afad40f31 --- /dev/null +++ b/manifests/v1beta1/pv/pv.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: PersistentVolume +metadata: + name: katib-mysql + labels: + type: local + app: katib +spec: + storageClassName: katib + capacity: + storage: 10Gi + accessModes: + - ReadWriteOnce + hostPath: + path: /tmp/katib diff --git a/manifests/v1beta1/pv/pvc.yaml b/manifests/v1beta1/pv/pvc.yaml new file mode 100644 index 00000000000..c454826f51e --- /dev/null +++ b/manifests/v1beta1/pv/pvc.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: katib-mysql + namespace: kubeflow + labels: + app: katib +spec: + storageClassName: katib + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi diff --git a/manifests/v1beta1/ui/deployment.yaml b/manifests/v1beta1/ui/deployment.yaml new file mode 100644 index 00000000000..fd813887792 --- /dev/null +++ b/manifests/v1beta1/ui/deployment.yaml @@ -0,0 +1,38 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: katib-ui + namespace: kubeflow + labels: + app: katib + component: ui +spec: + replicas: 1 + selector: + matchLabels: + app: katib + component: ui + template: + metadata: + name: katib-ui + labels: + app: katib + component: ui + spec: + containers: + - name: katib-ui + image: gcr.io/kubeflow-images-public/katib/v1beta1/katib-ui + imagePullPolicy: IfNotPresent + command: + - "./katib-ui" + args: + - "--port=8080" + env: + - name: KATIB_CORE_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + ports: + - name: ui + containerPort: 8080 + serviceAccountName: katib-ui diff --git a/manifests/v1beta1/ui/rbac.yaml b/manifests/v1beta1/ui/rbac.yaml new file mode 100644 index 00000000000..aae4adb2799 --- /dev/null +++ b/manifests/v1beta1/ui/rbac.yaml @@ -0,0 +1,39 @@ +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: katib-ui +rules: + - apiGroups: + - "" + resources: + - configmaps + - namespaces + verbs: + - "*" + - apiGroups: + - kubeflow.org + resources: + - experiments + - trials + - suggestions + verbs: + - "*" +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: katib-ui + namespace: kubeflow +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: katib-ui +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: katib-ui +subjects: + - kind: ServiceAccount + name: katib-ui + namespace: kubeflow diff --git a/manifests/v1beta1/ui/service.yaml b/manifests/v1beta1/ui/service.yaml new file mode 100644 index 00000000000..40f1fbfbdc2 --- /dev/null +++ b/manifests/v1beta1/ui/service.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: Service +metadata: + name: katib-ui + namespace: kubeflow + labels: + app: katib + component: ui +spec: + type: ClusterIP + ports: + - port: 80 + protocol: TCP + name: ui + targetPort: 8080 + selector: + app: katib + component: ui diff --git a/pkg/apis/controller/addtoscheme_katib_v1beta1.go b/pkg/apis/controller/addtoscheme_katib_v1beta1.go new file mode 100644 index 00000000000..4383507193b --- /dev/null +++ b/pkg/apis/controller/addtoscheme_katib_v1beta1.go @@ -0,0 +1,31 @@ +/* + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package apis + +import ( + experiments "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + suggestions "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1" + trials "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" +) + +func init() { + // Register the types with the Scheme so the components can map objects to GroupVersionKinds and back + AddToSchemes = append(AddToSchemes, + experiments.SchemeBuilder.AddToScheme, + trials.SchemeBuilder.AddToScheme, + suggestions.SchemeBuilder.AddToScheme, + ) +} diff --git a/pkg/apis/controller/common/v1beta1/common_types.go b/pkg/apis/controller/common/v1beta1/common_types.go new file mode 100644 index 00000000000..f2429b805de --- /dev/null +++ b/pkg/apis/controller/common/v1beta1/common_types.go @@ -0,0 +1,150 @@ +/* + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// +k8s:deepcopy-gen=true +type AlgorithmSpec struct { + AlgorithmName string `json:"algorithmName,omitempty"` + // Key-value pairs representing settings for suggestion algorithms. + AlgorithmSettings []AlgorithmSetting `json:"algorithmSettings,omitempty"` + EarlyStopping *EarlyStoppingSpec `json:"earlyStopping,omitempty"` +} + +type AlgorithmSetting struct { + Name string `json:"name,omitempty"` + Value string `json:"value,omitempty"` +} + +// +k8s:deepcopy-gen=true +type EarlyStoppingSpec struct { + EarlyStoppingAlgorithmName string `json:"earlyStoppingAlgorithmName,omitempty"` + EarlyStoppingSettings []EarlyStoppingSetting `json:"earlyStoppingSettings"` +} + +type EarlyStoppingSetting struct { + Name string `json:"name,omitempty"` + Value string `json:"value,omitempty"` +} + +// +k8s:deepcopy-gen=true +type ObjectiveSpec struct { + Type ObjectiveType `json:"type,omitempty"` + Goal *float64 `json:"goal,omitempty"` + ObjectiveMetricName string `json:"objectiveMetricName,omitempty"` + // This can be empty if we only care about the objective metric. + // Note: If we adopt a push instead of pull mechanism, this can be omitted completely. + AdditionalMetricNames []string `json:"additionalMetricNames,omitempty"` +} + +type ObjectiveType string + +const ( + ObjectiveTypeUnknown ObjectiveType = "" + ObjectiveTypeMinimize ObjectiveType = "minimize" + ObjectiveTypeMaximize ObjectiveType = "maximize" +) + +type ParameterAssignment struct { + Name string `json:"name,omitempty"` + Value string `json:"value,omitempty"` +} + +type Metric struct { + Name string `json:"name,omitempty"` + Value float64 `json:"value,omitempty"` +} + +// +k8s:deepcopy-gen=true +type Observation struct { + // Key-value pairs for metric names and values + Metrics []Metric `json:"metrics"` +} + +// +k8s:deepcopy-gen=true +type MetricsCollectorSpec struct { + Source *SourceSpec `json:"source,omitempty"` + Collector *CollectorSpec `json:"collector,omitempty"` +} + +// +k8s:deepcopy-gen=true +type SourceSpec struct { + // Model-train source code can expose metrics by http, such as HTTP endpoint in + // prometheus metric format + HttpGet *v1.HTTPGetAction `json:"httpGet,omitempty"` + // During training model, metrics may be persisted into local file in source + // code, such as tfEvent use case + FileSystemPath *FileSystemPath `json:"fileSystemPath,omitempty"` + // Default metric output format is {"metric": "", + // "value": , "epoch": , "step": }, but if the output doesn't + // follow default format, please extend it here + Filter *FilterSpec `json:"filter,omitempty"` +} + +// +k8s:deepcopy-gen=true +type FilterSpec struct { + // When the metrics output follows format as this field specified, metricsCollector + // collects it and reports to metrics server, it can be ": " or else + MetricsFormat []string `json:"metricsFormat,omitempty"` +} + +type FileSystemKind string + +const ( + DirectoryKind FileSystemKind = "Directory" + FileKind FileSystemKind = "File" + InvalidKind FileSystemKind = "Invalid" +) + +// +k8s:deepcopy-gen=true +type FileSystemPath struct { + Path string `json:"path,omitempty"` + Kind FileSystemKind `json:"kind,omitempty"` +} + +type CollectorKind string + +const ( + StdOutCollector CollectorKind = "StdOut" + + FileCollector CollectorKind = "File" + DefaultFilePath = "/var/log/katib/metrics.log" + + TfEventCollector CollectorKind = "TensorFlowEvent" + DefaultTensorflowEventDirPath = "/var/log/katib/tfevent/" + + PrometheusMetricCollector CollectorKind = "PrometheusMetric" + DefaultPrometheusPath = "/metrics" + DefaultPrometheusPort = 8080 + + CustomCollector CollectorKind = "Custom" + + // When model training source code persists metrics into persistent layer + // directly, metricsCollector isn't in need, and its kind is "noneCollector" + NoneCollector CollectorKind = "None" + + MetricsVolume = "metrics-volume" +) + +// +k8s:deepcopy-gen=true +type CollectorSpec struct { + Kind CollectorKind `json:"kind"` + // When kind is "customCollector", this field will be used + CustomCollector *v1.Container `json:"customCollector,omitempty"` +} diff --git a/pkg/apis/controller/common/v1beta1/doc.go b/pkg/apis/controller/common/v1beta1/doc.go new file mode 100644 index 00000000000..e8f74bdf7ee --- /dev/null +++ b/pkg/apis/controller/common/v1beta1/doc.go @@ -0,0 +1,23 @@ +/* + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package v1beta1 contains API Schema definitions for the common v1beta1 API group +// +k8s:openapi-gen=true +// +k8s:deepcopy-gen=package,register +// +k8s:conversion-gen=github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1 +// +k8s:defaulter-gen=TypeMeta +// +kubebuilder:subresource:status +// +groupName=common.kubeflow.org +package v1beta1 diff --git a/pkg/apis/controller/common/v1beta1/register.go b/pkg/apis/controller/common/v1beta1/register.go new file mode 100644 index 00000000000..c0a2db3202d --- /dev/null +++ b/pkg/apis/controller/common/v1beta1/register.go @@ -0,0 +1,43 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package v1beta1 contains API Schema definitions for the common v1beta1 API group +// +k8s:openapi-gen=true +// +k8s:deepcopy-gen=package,register +// +k8s:conversion-gen=github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1 +// +k8s:defaulter-gen=TypeMeta +// +kubebuilder:subresource:status +// +groupName=common.kubeflow.org +package v1beta1 + +import ( + "k8s.io/apimachinery/pkg/runtime/schema" + "sigs.k8s.io/controller-runtime/pkg/runtime/scheme" +) + +const ( + Group = "kubeflow.org" + Version = "v1beta1" +) + +var ( + // SchemeGroupVersion is group version used to register these objects + SchemeGroupVersion = schema.GroupVersion{Group: Group, Version: Version} + + // SchemeBuilder is used to add go types to the GroupVersionKind scheme + SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion} + AddToScheme = SchemeBuilder.AddToScheme +) diff --git a/pkg/apis/controller/common/v1beta1/zz_generated.deepcopy.go b/pkg/apis/controller/common/v1beta1/zz_generated.deepcopy.go new file mode 100644 index 00000000000..4c6e9d36359 --- /dev/null +++ b/pkg/apis/controller/common/v1beta1/zz_generated.deepcopy.go @@ -0,0 +1,297 @@ +// +build !ignore_autogenerated + +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +// Code generated by main. DO NOT EDIT. + +package v1beta1 + +import ( + v1 "k8s.io/api/core/v1" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AlgorithmSetting) DeepCopyInto(out *AlgorithmSetting) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AlgorithmSetting. +func (in *AlgorithmSetting) DeepCopy() *AlgorithmSetting { + if in == nil { + return nil + } + out := new(AlgorithmSetting) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AlgorithmSpec) DeepCopyInto(out *AlgorithmSpec) { + *out = *in + if in.AlgorithmSettings != nil { + in, out := &in.AlgorithmSettings, &out.AlgorithmSettings + *out = make([]AlgorithmSetting, len(*in)) + copy(*out, *in) + } + if in.EarlyStopping != nil { + in, out := &in.EarlyStopping, &out.EarlyStopping + *out = new(EarlyStoppingSpec) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AlgorithmSpec. +func (in *AlgorithmSpec) DeepCopy() *AlgorithmSpec { + if in == nil { + return nil + } + out := new(AlgorithmSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CollectorSpec) DeepCopyInto(out *CollectorSpec) { + *out = *in + if in.CustomCollector != nil { + in, out := &in.CustomCollector, &out.CustomCollector + *out = new(v1.Container) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CollectorSpec. +func (in *CollectorSpec) DeepCopy() *CollectorSpec { + if in == nil { + return nil + } + out := new(CollectorSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EarlyStoppingSetting) DeepCopyInto(out *EarlyStoppingSetting) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EarlyStoppingSetting. +func (in *EarlyStoppingSetting) DeepCopy() *EarlyStoppingSetting { + if in == nil { + return nil + } + out := new(EarlyStoppingSetting) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EarlyStoppingSpec) DeepCopyInto(out *EarlyStoppingSpec) { + *out = *in + if in.EarlyStoppingSettings != nil { + in, out := &in.EarlyStoppingSettings, &out.EarlyStoppingSettings + *out = make([]EarlyStoppingSetting, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EarlyStoppingSpec. +func (in *EarlyStoppingSpec) DeepCopy() *EarlyStoppingSpec { + if in == nil { + return nil + } + out := new(EarlyStoppingSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FileSystemPath) DeepCopyInto(out *FileSystemPath) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FileSystemPath. +func (in *FileSystemPath) DeepCopy() *FileSystemPath { + if in == nil { + return nil + } + out := new(FileSystemPath) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FilterSpec) DeepCopyInto(out *FilterSpec) { + *out = *in + if in.MetricsFormat != nil { + in, out := &in.MetricsFormat, &out.MetricsFormat + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FilterSpec. +func (in *FilterSpec) DeepCopy() *FilterSpec { + if in == nil { + return nil + } + out := new(FilterSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Metric) DeepCopyInto(out *Metric) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metric. +func (in *Metric) DeepCopy() *Metric { + if in == nil { + return nil + } + out := new(Metric) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MetricsCollectorSpec) DeepCopyInto(out *MetricsCollectorSpec) { + *out = *in + if in.Source != nil { + in, out := &in.Source, &out.Source + *out = new(SourceSpec) + (*in).DeepCopyInto(*out) + } + if in.Collector != nil { + in, out := &in.Collector, &out.Collector + *out = new(CollectorSpec) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MetricsCollectorSpec. +func (in *MetricsCollectorSpec) DeepCopy() *MetricsCollectorSpec { + if in == nil { + return nil + } + out := new(MetricsCollectorSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ObjectiveSpec) DeepCopyInto(out *ObjectiveSpec) { + *out = *in + if in.Goal != nil { + in, out := &in.Goal, &out.Goal + *out = new(float64) + **out = **in + } + if in.AdditionalMetricNames != nil { + in, out := &in.AdditionalMetricNames, &out.AdditionalMetricNames + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ObjectiveSpec. +func (in *ObjectiveSpec) DeepCopy() *ObjectiveSpec { + if in == nil { + return nil + } + out := new(ObjectiveSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Observation) DeepCopyInto(out *Observation) { + *out = *in + if in.Metrics != nil { + in, out := &in.Metrics, &out.Metrics + *out = make([]Metric, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Observation. +func (in *Observation) DeepCopy() *Observation { + if in == nil { + return nil + } + out := new(Observation) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ParameterAssignment) DeepCopyInto(out *ParameterAssignment) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ParameterAssignment. +func (in *ParameterAssignment) DeepCopy() *ParameterAssignment { + if in == nil { + return nil + } + out := new(ParameterAssignment) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SourceSpec) DeepCopyInto(out *SourceSpec) { + *out = *in + if in.HttpGet != nil { + in, out := &in.HttpGet, &out.HttpGet + *out = new(v1.HTTPGetAction) + (*in).DeepCopyInto(*out) + } + if in.FileSystemPath != nil { + in, out := &in.FileSystemPath, &out.FileSystemPath + *out = new(FileSystemPath) + **out = **in + } + if in.Filter != nil { + in, out := &in.Filter, &out.Filter + *out = new(FilterSpec) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SourceSpec. +func (in *SourceSpec) DeepCopy() *SourceSpec { + if in == nil { + return nil + } + out := new(SourceSpec) + in.DeepCopyInto(out) + return out +} diff --git a/pkg/apis/controller/experiments/v1beta1/constants.go b/pkg/apis/controller/experiments/v1beta1/constants.go new file mode 100644 index 00000000000..bb94e788d49 --- /dev/null +++ b/pkg/apis/controller/experiments/v1beta1/constants.go @@ -0,0 +1,30 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package v1beta1 + +const ( + // Default value of Spec.ParallelTrialCount + DefaultTrialParallelCount = 3 + + // Default value of Spec.ConfigMapName for Trial template + DefaultTrialConfigMapName = "trial-template" + + // Default value of Spec.TemplatePath + DefaultTrialTemplatePath = "defaultTrialTemplate.yaml" + + // Default value of Spec.DefaultResumePolicy + DefaultResumePolicy = LongRunning +) diff --git a/pkg/apis/controller/experiments/v1beta1/doc.go b/pkg/apis/controller/experiments/v1beta1/doc.go new file mode 100644 index 00000000000..45f8da8d586 --- /dev/null +++ b/pkg/apis/controller/experiments/v1beta1/doc.go @@ -0,0 +1,23 @@ +/* + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package v1beta1 contains API Schema definitions for the experiment v1beta1 API group +// +k8s:openapi-gen=true +// +k8s:deepcopy-gen=package,register +// +k8s:conversion-gen=github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1 +// +k8s:defaulter-gen=TypeMeta +// +kubebuilder:subresource:status +// +groupName=experiment.kubeflow.org +package v1beta1 diff --git a/pkg/apis/controller/experiments/v1beta1/experiment_defaults.go b/pkg/apis/controller/experiments/v1beta1/experiment_defaults.go new file mode 100644 index 00000000000..f2c9d43935b --- /dev/null +++ b/pkg/apis/controller/experiments/v1beta1/experiment_defaults.go @@ -0,0 +1,120 @@ +// +build !ignore_autogenerated + +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +// Code generated by main. DO NOT EDIT. + +package v1beta1 + +import ( + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/util/intstr" + + common "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" + "github.com/kubeflow/katib/pkg/controller.v1beta1/consts" +) + +func (e *Experiment) SetDefault() { + e.setDefaultParallelTrialCount() + e.setDefaultResumePolicy() + e.setDefaultTrialTemplate() + e.setDefaultMetricsCollector() +} + +func (e *Experiment) setDefaultParallelTrialCount() { + if e.Spec.ParallelTrialCount == nil { + e.Spec.ParallelTrialCount = new(int32) + *e.Spec.ParallelTrialCount = DefaultTrialParallelCount + } +} + +func (e *Experiment) setDefaultResumePolicy() { + if e.Spec.ResumePolicy == "" { + e.Spec.ResumePolicy = DefaultResumePolicy + } +} + +func (e *Experiment) setDefaultTrialTemplate() { + t := e.Spec.TrialTemplate + if t == nil { + t = &TrialTemplate{ + Retain: true, + } + } + if t.GoTemplate == nil { + t.GoTemplate = &GoTemplate{} + } + if t.GoTemplate.RawTemplate == "" && t.GoTemplate.TemplateSpec == nil { + t.GoTemplate.TemplateSpec = &TemplateSpec{ + ConfigMapNamespace: consts.DefaultKatibNamespace, + ConfigMapName: DefaultTrialConfigMapName, + TemplatePath: DefaultTrialTemplatePath, + } + } + e.Spec.TrialTemplate = t +} + +func (e *Experiment) setDefaultMetricsCollector() { + if e.Spec.MetricsCollectorSpec == nil { + e.Spec.MetricsCollectorSpec = &common.MetricsCollectorSpec{} + } + if e.Spec.MetricsCollectorSpec.Collector == nil { + e.Spec.MetricsCollectorSpec.Collector = &common.CollectorSpec{ + Kind: common.StdOutCollector, + } + } + switch e.Spec.MetricsCollectorSpec.Collector.Kind { + case common.PrometheusMetricCollector: + if e.Spec.MetricsCollectorSpec.Source == nil { + e.Spec.MetricsCollectorSpec.Source = &common.SourceSpec{} + } + if e.Spec.MetricsCollectorSpec.Source.HttpGet == nil { + e.Spec.MetricsCollectorSpec.Source.HttpGet = &v1.HTTPGetAction{} + } + if e.Spec.MetricsCollectorSpec.Source.HttpGet.Path == "" { + e.Spec.MetricsCollectorSpec.Source.HttpGet.Path = common.DefaultPrometheusPath + } + if e.Spec.MetricsCollectorSpec.Source.HttpGet.Port.String() == "0" { + e.Spec.MetricsCollectorSpec.Source.HttpGet.Port = intstr.FromInt(common.DefaultPrometheusPort) + } + case common.FileCollector: + if e.Spec.MetricsCollectorSpec.Source == nil { + e.Spec.MetricsCollectorSpec.Source = &common.SourceSpec{} + } + if e.Spec.MetricsCollectorSpec.Source.FileSystemPath == nil { + e.Spec.MetricsCollectorSpec.Source.FileSystemPath = &common.FileSystemPath{} + } + if e.Spec.MetricsCollectorSpec.Source.FileSystemPath.Kind == "" { + e.Spec.MetricsCollectorSpec.Source.FileSystemPath.Kind = common.FileKind + } + if e.Spec.MetricsCollectorSpec.Source.FileSystemPath.Path == "" { + e.Spec.MetricsCollectorSpec.Source.FileSystemPath.Path = common.DefaultFilePath + } + case common.TfEventCollector: + if e.Spec.MetricsCollectorSpec.Source == nil { + e.Spec.MetricsCollectorSpec.Source = &common.SourceSpec{} + } + if e.Spec.MetricsCollectorSpec.Source.FileSystemPath == nil { + e.Spec.MetricsCollectorSpec.Source.FileSystemPath = &common.FileSystemPath{} + } + if e.Spec.MetricsCollectorSpec.Source.FileSystemPath.Kind == "" { + e.Spec.MetricsCollectorSpec.Source.FileSystemPath.Kind = common.DirectoryKind + } + if e.Spec.MetricsCollectorSpec.Source.FileSystemPath.Path == "" { + e.Spec.MetricsCollectorSpec.Source.FileSystemPath.Path = common.DefaultTensorflowEventDirPath + } + } +} diff --git a/pkg/apis/controller/experiments/v1beta1/experiment_types.go b/pkg/apis/controller/experiments/v1beta1/experiment_types.go new file mode 100644 index 00000000000..483010c6f3e --- /dev/null +++ b/pkg/apis/controller/experiments/v1beta1/experiment_types.go @@ -0,0 +1,249 @@ +/* + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta1 + +import ( + common "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +type ExperimentSpec struct { + // List of hyperparameter configurations. + Parameters []ParameterSpec `json:"parameters,omitempty"` + + // Describes the objective of the experiment. + Objective *common.ObjectiveSpec `json:"objective,omitempty"` + + // Describes the suggestion algorithm. + Algorithm *common.AlgorithmSpec `json:"algorithm,omitempty"` + + // Template for each run of the trial. + TrialTemplate *TrialTemplate `json:"trialTemplate,omitempty"` + + // How many trials can be processed in parallel. + // Defaults to 3 + ParallelTrialCount *int32 `json:"parallelTrialCount,omitempty"` + + // Max completed trials to mark experiment as succeeded + MaxTrialCount *int32 `json:"maxTrialCount,omitempty"` + + // Max failed trials to mark experiment as failed. + MaxFailedTrialCount *int32 `json:"maxFailedTrialCount,omitempty"` + + // Describes the specification of the metrics collector + MetricsCollectorSpec *common.MetricsCollectorSpec `json:"metricsCollectorSpec,omitempty"` + + NasConfig *NasConfig `json:"nasConfig,omitempty"` + + // Describes resuming policy which usually take effect after experiment terminated. + ResumePolicy ResumePolicyType `json:"resumePolicy,omitempty"` + + // TODO - Other fields, exact format is TBD. Will add these back during implementation. + // - Early stopping +} + +type ExperimentStatus struct { + // Represents time when the Experiment was acknowledged by the Experiment controller. + // It is not guaranteed to be set in happens-before order across separate operations. + // It is represented in RFC3339 form and is in UTC. + StartTime *metav1.Time `json:"startTime,omitempty"` + + // Represents time when the Experiment was completed. It is not guaranteed to + // be set in happens-before order across separate operations. + // It is represented in RFC3339 form and is in UTC. + CompletionTime *metav1.Time `json:"completionTime,omitempty"` + + // Represents last time when the Experiment was reconciled. It is not guaranteed to + // be set in happens-before order across separate operations. + // It is represented in RFC3339 form and is in UTC. + LastReconcileTime *metav1.Time `json:"lastReconcileTime,omitempty"` + + // List of observed runtime conditions for this Experiment. + Conditions []ExperimentCondition `json:"conditions,omitempty"` + + // Current optimal trial parameters and observations. + CurrentOptimalTrial OptimalTrial `json:"currentOptimalTrial,omitempty"` + + // List of trial names which are running. + RunningTrialList []string `json:"runningTrialList,omitempty"` + + // List of trial names which are pending. + PendingTrialList []string `json:"pendingTrialList,omitempty"` + + // List of trial names which have already failed. + FailedTrialList []string `json:"failedTrialList,omitempty"` + + // List of trial names which have already succeeded. + SucceededTrialList []string `json:"succeededTrialList,omitempty"` + + // List of trial names which have been killed. + KilledTrialList []string `json:"killedTrialList,omitempty"` + + // Trials is the total number of trials owned by the experiment. + Trials int32 `json:"trials,omitempty"` + + // How many trials have succeeded. + TrialsSucceeded int32 `json:"trialsSucceeded,omitempty"` + + // How many trials have failed. + TrialsFailed int32 `json:"trialsFailed,omitempty"` + + // How many trials have been killed. + TrialsKilled int32 `json:"trialsKilled,omitempty"` + + // How many trials are currently pending. + TrialsPending int32 `json:"trialsPending,omitempty"` + + // How many trials are currently running. + TrialsRunning int32 `json:"trialsRunning,omitempty"` +} + +// OptimalTrial is the metrics and assignments of the best trial. +type OptimalTrial struct { + // BestTrialName is the name of the best trial. + BestTrialName string `json:"bestTrialName"` + // Key-value pairs for hyperparameters and assignment values. + ParameterAssignments []common.ParameterAssignment `json:"parameterAssignments"` + + // Observation for this trial + Observation common.Observation `json:"observation,omitempty"` +} + +// +k8s:deepcopy-gen=true +// ExperimentCondition describes the state of the experiment at a certain point. +type ExperimentCondition struct { + // Type of experiment condition. + Type ExperimentConditionType `json:"type"` + + // Status of the condition, one of True, False, Unknown. + Status v1.ConditionStatus `json:"status"` + + // The reason for the condition's last transition. + Reason string `json:"reason,omitempty"` + + // A human readable message indicating details about the transition. + Message string `json:"message,omitempty"` + + // The last time this condition was updated. + LastUpdateTime metav1.Time `json:"lastUpdateTime,omitempty"` + + // Last time the condition transitioned from one status to another. + LastTransitionTime metav1.Time `json:"lastTransitionTime,omitempty"` +} + +// ExperimentConditionType defines the state of an Experiment. +type ExperimentConditionType string + +const ( + ExperimentCreated ExperimentConditionType = "Created" + ExperimentRunning ExperimentConditionType = "Running" + ExperimentRestarting ExperimentConditionType = "Restarting" + ExperimentSucceeded ExperimentConditionType = "Succeeded" + ExperimentFailed ExperimentConditionType = "Failed" +) + +type ResumePolicyType string + +const ( + NeverResume ResumePolicyType = "Never" + LongRunning ResumePolicyType = "LongRunning" +) + +type ParameterSpec struct { + Name string `json:"name,omitempty"` + ParameterType ParameterType `json:"parameterType,omitempty"` + FeasibleSpace FeasibleSpace `json:"feasibleSpace,omitempty"` +} + +type ParameterType string + +const ( + ParameterTypeUnknown ParameterType = "unknown" + ParameterTypeDouble ParameterType = "double" + ParameterTypeInt ParameterType = "int" + ParameterTypeDiscrete ParameterType = "discrete" + ParameterTypeCategorical ParameterType = "categorical" +) + +type FeasibleSpace struct { + Max string `json:"max,omitempty"` + Min string `json:"min,omitempty"` + List []string `json:"list,omitempty"` + Step string `json:"step,omitempty"` +} + +type TrialTemplate struct { + Retain bool `json:"retain,omitempty"` + GoTemplate *GoTemplate `json:"goTemplate,omitempty"` +} + +type TemplateSpec struct { + ConfigMapName string `json:"configMapName,omitempty"` + ConfigMapNamespace string `json:"configMapNamespace,omitempty"` + TemplatePath string `json:"templatePath,omitempty"` +} + +type GoTemplate struct { + TemplateSpec *TemplateSpec `json:"templateSpec,omitempty"` + RawTemplate string `json:"rawTemplate,omitempty"` +} + +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Structure of the Experiment custom resource. +// +k8s:openapi-gen=true +// +kubebuilder:subresource:status +type Experiment struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec ExperimentSpec `json:"spec,omitempty"` + Status ExperimentStatus `json:"status,omitempty"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ExperimentList contains a list of Experiments +type ExperimentList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []Experiment `json:"items"` +} + +// NasConfig contains config for NAS job +type NasConfig struct { + GraphConfig GraphConfig `json:"graphConfig,omitempty"` + Operations []Operation `json:"operations,omitempty"` +} + +// GraphConfig contains a config of DAG +type GraphConfig struct { + NumLayers *int32 `json:"numLayers,omitempty"` + InputSizes []int32 `json:"inputSizes,omitempty"` + OutputSizes []int32 `json:"outputSizes,omitempty"` +} + +// Operation contains type of operation in DAG +type Operation struct { + OperationType string `json:"operationType,omitempty"` + Parameters []ParameterSpec `json:"parameters,omitempty"` +} + +func init() { + SchemeBuilder.Register(&Experiment{}, &ExperimentList{}) +} diff --git a/pkg/apis/controller/experiments/v1beta1/register.go b/pkg/apis/controller/experiments/v1beta1/register.go new file mode 100644 index 00000000000..5f9bc215b69 --- /dev/null +++ b/pkg/apis/controller/experiments/v1beta1/register.go @@ -0,0 +1,42 @@ +/* + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package v1beta1 contains API Schema definitions for the experiment v1beta1 API group +// +k8s:openapi-gen=true +// +k8s:deepcopy-gen=package,register +// +k8s:conversion-gen=github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1 +// +k8s:defaulter-gen=TypeMeta +// +kubebuilder:subresource:status +// +groupName=experiments.kubeflow.org +package v1beta1 + +import ( + "k8s.io/apimachinery/pkg/runtime/schema" + "sigs.k8s.io/controller-runtime/pkg/runtime/scheme" +) + +const ( + Group = "kubeflow.org" + Version = "v1beta1" +) + +var ( + // SchemeGroupVersion is group version used to register these objects + SchemeGroupVersion = schema.GroupVersion{Group: Group, Version: Version} + + // SchemeBuilder is used to add go types to the GroupVersionKind scheme + SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion} + AddToScheme = SchemeBuilder.AddToScheme +) diff --git a/pkg/apis/controller/experiments/v1beta1/util.go b/pkg/apis/controller/experiments/v1beta1/util.go new file mode 100644 index 00000000000..f044e2d0bec --- /dev/null +++ b/pkg/apis/controller/experiments/v1beta1/util.go @@ -0,0 +1,163 @@ +/* + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta1 + +import ( + "errors" + + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +const ( + cleanDataFinalizer = "clean-data-in-db" +) + +func getCondition(exp *Experiment, condType ExperimentConditionType) *ExperimentCondition { + if exp.Status.Conditions != nil { + for _, condition := range exp.Status.Conditions { + if condition.Type == condType { + return &condition + } + } + } + return nil +} + +func hasCondition(exp *Experiment, condType ExperimentConditionType) bool { + cond := getCondition(exp, condType) + if cond != nil && cond.Status == v1.ConditionTrue { + return true + } + return false +} + +func (exp *Experiment) removeCondition(condType ExperimentConditionType) { + var newConditions []ExperimentCondition + for _, c := range exp.Status.Conditions { + + if c.Type == condType { + continue + } + + newConditions = append(newConditions, c) + } + exp.Status.Conditions = newConditions +} + +func newCondition(conditionType ExperimentConditionType, status v1.ConditionStatus, reason, message string) ExperimentCondition { + return ExperimentCondition{ + Type: conditionType, + Status: status, + LastUpdateTime: metav1.Now(), + LastTransitionTime: metav1.Now(), + Reason: reason, + Message: message, + } +} + +func (exp *Experiment) IsCreated() bool { + return hasCondition(exp, ExperimentCreated) +} + +func (exp *Experiment) IsSucceeded() bool { + return hasCondition(exp, ExperimentSucceeded) +} + +func (exp *Experiment) IsFailed() bool { + return hasCondition(exp, ExperimentFailed) +} + +func (exp *Experiment) IsRunning() bool { + return hasCondition(exp, ExperimentRunning) +} + +func (exp *Experiment) IsRestarting() bool { + return hasCondition(exp, ExperimentRestarting) +} + +func (exp *Experiment) IsCompleted() bool { + return exp.IsSucceeded() || exp.IsFailed() +} + +func (exp *Experiment) IsCompletedReason(reason string) bool { + cond := getCondition(exp, ExperimentSucceeded) + if cond != nil && cond.Status == v1.ConditionTrue && cond.Reason == reason { + return true + } + return false +} + +func (exp *Experiment) HasRunningTrials() bool { + return exp.Status.TrialsRunning != 0 +} + +func (exp *Experiment) GetLastConditionType() (ExperimentConditionType, error) { + if len(exp.Status.Conditions) > 0 { + return exp.Status.Conditions[len(exp.Status.Conditions)-1].Type, nil + } + return "", errors.New("Experiment doesn't have any condition") +} + +func (exp *Experiment) setCondition(conditionType ExperimentConditionType, status v1.ConditionStatus, reason, message string) { + + newCond := newCondition(conditionType, status, reason, message) + currentCond := getCondition(exp, conditionType) + // Do nothing if condition doesn't change + if currentCond != nil && currentCond.Status == newCond.Status && currentCond.Reason == newCond.Reason { + return + } + + // Do not update lastTransitionTime if the status of the condition doesn't change. + if currentCond != nil && currentCond.Status == newCond.Status { + newCond.LastTransitionTime = currentCond.LastTransitionTime + } + + exp.removeCondition(conditionType) + exp.Status.Conditions = append(exp.Status.Conditions, newCond) +} + +func (exp *Experiment) MarkExperimentStatusCreated(reason, message string) { + exp.setCondition(ExperimentCreated, v1.ConditionTrue, reason, message) +} + +func (exp *Experiment) MarkExperimentStatusRunning(reason, message string) { + //exp.removeCondition(ExperimentRestarting) + exp.setCondition(ExperimentRunning, v1.ConditionTrue, reason, message) +} + +func (exp *Experiment) MarkExperimentStatusRestarting(reason, message string) { + exp.removeCondition(ExperimentSucceeded) + exp.removeCondition(ExperimentFailed) + exp.setCondition(ExperimentRestarting, v1.ConditionTrue, reason, message) +} + +func (exp *Experiment) MarkExperimentStatusSucceeded(reason, message string) { + currentCond := getCondition(exp, ExperimentRunning) + if currentCond != nil { + exp.setCondition(ExperimentRunning, v1.ConditionFalse, currentCond.Reason, currentCond.Message) + } + exp.setCondition(ExperimentSucceeded, v1.ConditionTrue, reason, message) + +} + +func (exp *Experiment) MarkExperimentStatusFailed(reason, message string) { + currentCond := getCondition(exp, ExperimentRunning) + if currentCond != nil { + exp.setCondition(ExperimentRunning, v1.ConditionFalse, currentCond.Reason, currentCond.Message) + } + exp.setCondition(ExperimentFailed, v1.ConditionTrue, reason, message) +} diff --git a/pkg/apis/controller/experiments/v1beta1/zz_generated.deepcopy.go b/pkg/apis/controller/experiments/v1beta1/zz_generated.deepcopy.go new file mode 100644 index 00000000000..28377d4449e --- /dev/null +++ b/pkg/apis/controller/experiments/v1beta1/zz_generated.deepcopy.go @@ -0,0 +1,424 @@ +// +build !ignore_autogenerated + +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +// Code generated by main. DO NOT EDIT. + +package v1beta1 + +import ( + commonv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Experiment) DeepCopyInto(out *Experiment) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Experiment. +func (in *Experiment) DeepCopy() *Experiment { + if in == nil { + return nil + } + out := new(Experiment) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Experiment) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExperimentCondition) DeepCopyInto(out *ExperimentCondition) { + *out = *in + in.LastUpdateTime.DeepCopyInto(&out.LastUpdateTime) + in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExperimentCondition. +func (in *ExperimentCondition) DeepCopy() *ExperimentCondition { + if in == nil { + return nil + } + out := new(ExperimentCondition) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExperimentList) DeepCopyInto(out *ExperimentList) { + *out = *in + out.TypeMeta = in.TypeMeta + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Experiment, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExperimentList. +func (in *ExperimentList) DeepCopy() *ExperimentList { + if in == nil { + return nil + } + out := new(ExperimentList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ExperimentList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExperimentSpec) DeepCopyInto(out *ExperimentSpec) { + *out = *in + if in.Parameters != nil { + in, out := &in.Parameters, &out.Parameters + *out = make([]ParameterSpec, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Objective != nil { + in, out := &in.Objective, &out.Objective + *out = new(commonv1beta1.ObjectiveSpec) + (*in).DeepCopyInto(*out) + } + if in.Algorithm != nil { + in, out := &in.Algorithm, &out.Algorithm + *out = new(commonv1beta1.AlgorithmSpec) + (*in).DeepCopyInto(*out) + } + if in.TrialTemplate != nil { + in, out := &in.TrialTemplate, &out.TrialTemplate + *out = new(TrialTemplate) + (*in).DeepCopyInto(*out) + } + if in.ParallelTrialCount != nil { + in, out := &in.ParallelTrialCount, &out.ParallelTrialCount + *out = new(int32) + **out = **in + } + if in.MaxTrialCount != nil { + in, out := &in.MaxTrialCount, &out.MaxTrialCount + *out = new(int32) + **out = **in + } + if in.MaxFailedTrialCount != nil { + in, out := &in.MaxFailedTrialCount, &out.MaxFailedTrialCount + *out = new(int32) + **out = **in + } + if in.MetricsCollectorSpec != nil { + in, out := &in.MetricsCollectorSpec, &out.MetricsCollectorSpec + *out = new(commonv1beta1.MetricsCollectorSpec) + (*in).DeepCopyInto(*out) + } + if in.NasConfig != nil { + in, out := &in.NasConfig, &out.NasConfig + *out = new(NasConfig) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExperimentSpec. +func (in *ExperimentSpec) DeepCopy() *ExperimentSpec { + if in == nil { + return nil + } + out := new(ExperimentSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExperimentStatus) DeepCopyInto(out *ExperimentStatus) { + *out = *in + if in.StartTime != nil { + in, out := &in.StartTime, &out.StartTime + *out = (*in).DeepCopy() + } + if in.CompletionTime != nil { + in, out := &in.CompletionTime, &out.CompletionTime + *out = (*in).DeepCopy() + } + if in.LastReconcileTime != nil { + in, out := &in.LastReconcileTime, &out.LastReconcileTime + *out = (*in).DeepCopy() + } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]ExperimentCondition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + in.CurrentOptimalTrial.DeepCopyInto(&out.CurrentOptimalTrial) + if in.RunningTrialList != nil { + in, out := &in.RunningTrialList, &out.RunningTrialList + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.PendingTrialList != nil { + in, out := &in.PendingTrialList, &out.PendingTrialList + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.FailedTrialList != nil { + in, out := &in.FailedTrialList, &out.FailedTrialList + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.SucceededTrialList != nil { + in, out := &in.SucceededTrialList, &out.SucceededTrialList + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.KilledTrialList != nil { + in, out := &in.KilledTrialList, &out.KilledTrialList + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExperimentStatus. +func (in *ExperimentStatus) DeepCopy() *ExperimentStatus { + if in == nil { + return nil + } + out := new(ExperimentStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FeasibleSpace) DeepCopyInto(out *FeasibleSpace) { + *out = *in + if in.List != nil { + in, out := &in.List, &out.List + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeasibleSpace. +func (in *FeasibleSpace) DeepCopy() *FeasibleSpace { + if in == nil { + return nil + } + out := new(FeasibleSpace) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GoTemplate) DeepCopyInto(out *GoTemplate) { + *out = *in + if in.TemplateSpec != nil { + in, out := &in.TemplateSpec, &out.TemplateSpec + *out = new(TemplateSpec) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GoTemplate. +func (in *GoTemplate) DeepCopy() *GoTemplate { + if in == nil { + return nil + } + out := new(GoTemplate) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GraphConfig) DeepCopyInto(out *GraphConfig) { + *out = *in + if in.NumLayers != nil { + in, out := &in.NumLayers, &out.NumLayers + *out = new(int32) + **out = **in + } + if in.InputSizes != nil { + in, out := &in.InputSizes, &out.InputSizes + *out = make([]int32, len(*in)) + copy(*out, *in) + } + if in.OutputSizes != nil { + in, out := &in.OutputSizes, &out.OutputSizes + *out = make([]int32, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GraphConfig. +func (in *GraphConfig) DeepCopy() *GraphConfig { + if in == nil { + return nil + } + out := new(GraphConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NasConfig) DeepCopyInto(out *NasConfig) { + *out = *in + in.GraphConfig.DeepCopyInto(&out.GraphConfig) + if in.Operations != nil { + in, out := &in.Operations, &out.Operations + *out = make([]Operation, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NasConfig. +func (in *NasConfig) DeepCopy() *NasConfig { + if in == nil { + return nil + } + out := new(NasConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Operation) DeepCopyInto(out *Operation) { + *out = *in + if in.Parameters != nil { + in, out := &in.Parameters, &out.Parameters + *out = make([]ParameterSpec, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Operation. +func (in *Operation) DeepCopy() *Operation { + if in == nil { + return nil + } + out := new(Operation) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OptimalTrial) DeepCopyInto(out *OptimalTrial) { + *out = *in + if in.ParameterAssignments != nil { + in, out := &in.ParameterAssignments, &out.ParameterAssignments + *out = make([]commonv1beta1.ParameterAssignment, len(*in)) + copy(*out, *in) + } + in.Observation.DeepCopyInto(&out.Observation) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OptimalTrial. +func (in *OptimalTrial) DeepCopy() *OptimalTrial { + if in == nil { + return nil + } + out := new(OptimalTrial) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ParameterSpec) DeepCopyInto(out *ParameterSpec) { + *out = *in + in.FeasibleSpace.DeepCopyInto(&out.FeasibleSpace) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ParameterSpec. +func (in *ParameterSpec) DeepCopy() *ParameterSpec { + if in == nil { + return nil + } + out := new(ParameterSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TemplateSpec) DeepCopyInto(out *TemplateSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TemplateSpec. +func (in *TemplateSpec) DeepCopy() *TemplateSpec { + if in == nil { + return nil + } + out := new(TemplateSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TrialTemplate) DeepCopyInto(out *TrialTemplate) { + *out = *in + if in.GoTemplate != nil { + in, out := &in.GoTemplate, &out.GoTemplate + *out = new(GoTemplate) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TrialTemplate. +func (in *TrialTemplate) DeepCopy() *TrialTemplate { + if in == nil { + return nil + } + out := new(TrialTemplate) + in.DeepCopyInto(out) + return out +} diff --git a/pkg/apis/controller/suggestions/v1beta1/doc.go b/pkg/apis/controller/suggestions/v1beta1/doc.go new file mode 100644 index 00000000000..6fa46aac495 --- /dev/null +++ b/pkg/apis/controller/suggestions/v1beta1/doc.go @@ -0,0 +1,24 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package v1beta1 contains API Schema definitions for the suggestion v1beta1 API group +// +k8s:openapi-gen=true +// +k8s:deepcopy-gen=package,register +// +k8s:conversion-gen=github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1 +// +k8s:defaulter-gen=TypeMeta +// +kubebuilder:subresource:status +// +groupName=suggestion.kubeflow.org +package v1beta1 diff --git a/pkg/apis/controller/suggestions/v1beta1/register.go b/pkg/apis/controller/suggestions/v1beta1/register.go new file mode 100644 index 00000000000..eb16a8686c7 --- /dev/null +++ b/pkg/apis/controller/suggestions/v1beta1/register.go @@ -0,0 +1,43 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package v1beta1 contains API Schema definitions for the suggestion v1beta1 API group +// +k8s:openapi-gen=true +// +k8s:deepcopy-gen=package,register +// +k8s:conversion-gen=github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1 +// +k8s:defaulter-gen=TypeMeta +// +kubebuilder:subresource:status +// +groupName=suggestion.kubeflow.org +package v1beta1 + +import ( + "k8s.io/apimachinery/pkg/runtime/schema" + "sigs.k8s.io/controller-runtime/pkg/runtime/scheme" +) + +const ( + Group = "kubeflow.org" + Version = "v1beta1" +) + +var ( + // SchemeGroupVersion is group version used to register these objects + SchemeGroupVersion = schema.GroupVersion{Group: Group, Version: Version} + + // SchemeBuilder is used to add go types to the GroupVersionKind scheme + SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion} + AddToScheme = SchemeBuilder.AddToScheme +) diff --git a/pkg/apis/controller/suggestions/v1beta1/suggestion_types.go b/pkg/apis/controller/suggestions/v1beta1/suggestion_types.go new file mode 100644 index 00000000000..a111516a05a --- /dev/null +++ b/pkg/apis/controller/suggestions/v1beta1/suggestion_types.go @@ -0,0 +1,130 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta1 + +import ( + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + common "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" +) + +// SuggestionSpec defines the desired state of Suggestion +type SuggestionSpec struct { + AlgorithmName string `json:"algorithmName"` + // Number of suggestions requested + Requests int32 `json:"requests,omitempty"` +} + +// SuggestionStatus defines the observed state of Suggestion +type SuggestionStatus struct { + // Algorithmsettings set by the algorithm services. + AlgorithmSettings []common.AlgorithmSetting `json:"algorithmSettings,omitempty"` + + // Number of suggestion results + SuggestionCount int32 `json:"suggestionCount,omitempty"` + + // Suggestion results + Suggestions []TrialAssignment `json:"suggestions,omitempty"` + + // Represents time when the Suggestion was acknowledged by the Suggestion controller. + // It is not guaranteed to be set in happens-before order across separate operations. + // It is represented in RFC3339 form and is in UTC. + StartTime *metav1.Time `json:"startTime,omitempty"` + + // Represents time when the Suggestion was completed. It is not guaranteed to + // be set in happens-before order across separate operations. + // It is represented in RFC3339 form and is in UTC. + CompletionTime *metav1.Time `json:"completionTime,omitempty"` + + // Represents last time when the Suggestion was reconciled. It is not guaranteed to + // be set in happens-before order across separate operations. + // It is represented in RFC3339 form and is in UTC. + LastReconcileTime *metav1.Time `json:"lastReconcileTime,omitempty"` + + // List of observed runtime conditions for this Suggestion. + Conditions []SuggestionCondition `json:"conditions,omitempty"` +} + +// TrialAssignment is the assignment for one trial. +type TrialAssignment struct { + // Suggestion results + ParameterAssignments []common.ParameterAssignment `json:"parameterAssignments,omitempty"` + + //Name of the suggestion + Name string `json:"name,omitempty"` +} + +// SuggestionCondition describes the state of the Suggestion at a certain point. +// +k8s:deepcopy-gen=true +type SuggestionCondition struct { + // Type of Suggestion condition. + Type SuggestionConditionType `json:"type"` + + // Status of the condition, one of True, False, Unknown. + Status v1.ConditionStatus `json:"status"` + + // The reason for the condition's last transition. + Reason string `json:"reason,omitempty"` + + // A human readable message indicating details about the transition. + Message string `json:"message,omitempty"` + + // The last time this condition was updated. + LastUpdateTime metav1.Time `json:"lastUpdateTime,omitempty"` + + // Last time the condition transitioned from one status to another. + LastTransitionTime metav1.Time `json:"lastTransitionTime,omitempty"` +} + +// SuggestionConditionType defines the state of a Suggestion. +type SuggestionConditionType string + +const ( + SuggestionCreated SuggestionConditionType = "Created" + SuggestionDeploymentReady SuggestionConditionType = "DeploymentReady" + SuggestionRunning SuggestionConditionType = "Running" + SuggestionSucceeded SuggestionConditionType = "Succeeded" + SuggestionFailed SuggestionConditionType = "Failed" +) + +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Suggestion represents the structure of a Suggestion resource. +// +k8s:openapi-gen=true +// +kubebuilder:subresource:status +type Suggestion struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec SuggestionSpec `json:"spec,omitempty"` + Status SuggestionStatus `json:"status,omitempty"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// SuggestionList contains a list of Suggestion +type SuggestionList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []Suggestion `json:"items"` +} + +func init() { + SchemeBuilder.Register(&Suggestion{}, &SuggestionList{}) +} diff --git a/pkg/apis/controller/suggestions/v1beta1/util.go b/pkg/apis/controller/suggestions/v1beta1/util.go new file mode 100644 index 00000000000..33d3878ccba --- /dev/null +++ b/pkg/apis/controller/suggestions/v1beta1/util.go @@ -0,0 +1,117 @@ +package v1beta1 + +import ( + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func getCondition(suggestion *Suggestion, condType SuggestionConditionType) *SuggestionCondition { + if suggestion.Status.Conditions != nil { + for _, condition := range suggestion.Status.Conditions { + if condition.Type == condType { + return &condition + } + } + } + return nil +} + +func hasCondition(suggestion *Suggestion, condType SuggestionConditionType) bool { + cond := getCondition(suggestion, condType) + if cond != nil && cond.Status == v1.ConditionTrue { + return true + } + return false +} + +func (suggestion *Suggestion) removeCondition(condType SuggestionConditionType) { + var newConditions []SuggestionCondition + for _, c := range suggestion.Status.Conditions { + + if c.Type == condType { + continue + } + + newConditions = append(newConditions, c) + } + suggestion.Status.Conditions = newConditions +} + +func newCondition(conditionType SuggestionConditionType, status v1.ConditionStatus, reason, message string) SuggestionCondition { + return SuggestionCondition{ + Type: conditionType, + Status: status, + LastUpdateTime: metav1.Now(), + LastTransitionTime: metav1.Now(), + Reason: reason, + Message: message, + } +} + +func (suggestion *Suggestion) IsCreated() bool { + return hasCondition(suggestion, SuggestionCreated) +} + +func (suggestion *Suggestion) IsFailed() bool { + return hasCondition(suggestion, SuggestionFailed) +} + +func (suggestion *Suggestion) IsSucceeded() bool { + return hasCondition(suggestion, SuggestionSucceeded) +} + +func (suggestion *Suggestion) IsRunning() bool { + return hasCondition(suggestion, SuggestionRunning) +} + +func (suggestion *Suggestion) IsCompleted() bool { + return suggestion.IsSucceeded() || suggestion.IsFailed() +} + +func (suggestion *Suggestion) setCondition(conditionType SuggestionConditionType, status v1.ConditionStatus, reason, message string) { + + newCond := newCondition(conditionType, status, reason, message) + currentCond := getCondition(suggestion, conditionType) + // Do nothing if condition doesn't change + if currentCond != nil && currentCond.Status == newCond.Status && currentCond.Reason == newCond.Reason { + return + } + + // Do not update lastTransitionTime if the status of the condition doesn't change. + if currentCond != nil && currentCond.Status == newCond.Status { + newCond.LastTransitionTime = currentCond.LastTransitionTime + } + + suggestion.removeCondition(conditionType) + suggestion.Status.Conditions = append(suggestion.Status.Conditions, newCond) +} + +func (suggestion *Suggestion) MarkSuggestionStatusCreated(reason, message string) { + suggestion.setCondition(SuggestionCreated, v1.ConditionTrue, reason, message) +} + +func (suggestion *Suggestion) MarkSuggestionStatusRunning(reason, message string) { + //suggestion.removeCondition(SuggestionRestarting) + suggestion.setCondition(SuggestionRunning, v1.ConditionTrue, reason, message) +} + +func (suggestion *Suggestion) MarkSuggestionStatusSucceeded(reason, message string) { + currentCond := getCondition(suggestion, SuggestionRunning) + if currentCond != nil { + suggestion.setCondition(SuggestionRunning, v1.ConditionFalse, currentCond.Reason, currentCond.Message) + } + suggestion.setCondition(SuggestionSucceeded, v1.ConditionTrue, reason, message) + +} + +func (suggestion *Suggestion) MarkSuggestionStatusFailed(reason, message string) { + currentCond := getCondition(suggestion, SuggestionRunning) + if currentCond != nil { + suggestion.setCondition(SuggestionRunning, v1.ConditionFalse, currentCond.Reason, currentCond.Message) + } + suggestion.setCondition(SuggestionFailed, v1.ConditionTrue, reason, message) +} + +func (suggestion *Suggestion) MarkSuggestionStatusDeploymentReady(status v1.ConditionStatus, reason, message string) { + suggestion.setCondition(SuggestionDeploymentReady, status, reason, message) +} diff --git a/pkg/apis/controller/suggestions/v1beta1/zz_generated.deepcopy.go b/pkg/apis/controller/suggestions/v1beta1/zz_generated.deepcopy.go new file mode 100644 index 00000000000..7e237b4e1e3 --- /dev/null +++ b/pkg/apis/controller/suggestions/v1beta1/zz_generated.deepcopy.go @@ -0,0 +1,188 @@ +// +build !ignore_autogenerated + +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +// Code generated by main. DO NOT EDIT. + +package v1beta1 + +import ( + commonv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Suggestion) DeepCopyInto(out *Suggestion) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + out.Spec = in.Spec + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Suggestion. +func (in *Suggestion) DeepCopy() *Suggestion { + if in == nil { + return nil + } + out := new(Suggestion) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Suggestion) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SuggestionCondition) DeepCopyInto(out *SuggestionCondition) { + *out = *in + in.LastUpdateTime.DeepCopyInto(&out.LastUpdateTime) + in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SuggestionCondition. +func (in *SuggestionCondition) DeepCopy() *SuggestionCondition { + if in == nil { + return nil + } + out := new(SuggestionCondition) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SuggestionList) DeepCopyInto(out *SuggestionList) { + *out = *in + out.TypeMeta = in.TypeMeta + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Suggestion, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SuggestionList. +func (in *SuggestionList) DeepCopy() *SuggestionList { + if in == nil { + return nil + } + out := new(SuggestionList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *SuggestionList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SuggestionSpec) DeepCopyInto(out *SuggestionSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SuggestionSpec. +func (in *SuggestionSpec) DeepCopy() *SuggestionSpec { + if in == nil { + return nil + } + out := new(SuggestionSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SuggestionStatus) DeepCopyInto(out *SuggestionStatus) { + *out = *in + if in.AlgorithmSettings != nil { + in, out := &in.AlgorithmSettings, &out.AlgorithmSettings + *out = make([]commonv1beta1.AlgorithmSetting, len(*in)) + copy(*out, *in) + } + if in.Suggestions != nil { + in, out := &in.Suggestions, &out.Suggestions + *out = make([]TrialAssignment, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.StartTime != nil { + in, out := &in.StartTime, &out.StartTime + *out = (*in).DeepCopy() + } + if in.CompletionTime != nil { + in, out := &in.CompletionTime, &out.CompletionTime + *out = (*in).DeepCopy() + } + if in.LastReconcileTime != nil { + in, out := &in.LastReconcileTime, &out.LastReconcileTime + *out = (*in).DeepCopy() + } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]SuggestionCondition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SuggestionStatus. +func (in *SuggestionStatus) DeepCopy() *SuggestionStatus { + if in == nil { + return nil + } + out := new(SuggestionStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TrialAssignment) DeepCopyInto(out *TrialAssignment) { + *out = *in + if in.ParameterAssignments != nil { + in, out := &in.ParameterAssignments, &out.ParameterAssignments + *out = make([]commonv1beta1.ParameterAssignment, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TrialAssignment. +func (in *TrialAssignment) DeepCopy() *TrialAssignment { + if in == nil { + return nil + } + out := new(TrialAssignment) + in.DeepCopyInto(out) + return out +} diff --git a/pkg/apis/controller/trials/v1beta1/doc.go b/pkg/apis/controller/trials/v1beta1/doc.go new file mode 100644 index 00000000000..139f1217ec3 --- /dev/null +++ b/pkg/apis/controller/trials/v1beta1/doc.go @@ -0,0 +1,23 @@ +/* + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package v1beta1 contains API Schema definitions for the trial v1beta1 API group +// +k8s:openapi-gen=true +// +k8s:deepcopy-gen=package,register +// +k8s:conversion-gen=github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1 +// +k8s:defaulter-gen=TypeMeta +// +kubebuilder:subresource:status +// +groupName=trial.kubeflow.org +package v1beta1 diff --git a/pkg/apis/controller/trials/v1beta1/register.go b/pkg/apis/controller/trials/v1beta1/register.go new file mode 100644 index 00000000000..d9f36b18ec0 --- /dev/null +++ b/pkg/apis/controller/trials/v1beta1/register.go @@ -0,0 +1,42 @@ +/* + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package v1beta1 contains API Schema definitions for the trial v1beta1 API group +// +k8s:openapi-gen=true +// +k8s:deepcopy-gen=package,register +// +k8s:conversion-gen=github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1 +// +k8s:defaulter-gen=TypeMeta +// +kubebuilder:subresource:status +// +groupName=trials.kubeflow.org +package v1beta1 + +import ( + "k8s.io/apimachinery/pkg/runtime/schema" + "sigs.k8s.io/controller-runtime/pkg/runtime/scheme" +) + +const ( + Group = "kubeflow.org" + Version = "v1beta1" +) + +var ( + // SchemeGroupVersion is group version used to register these objects + SchemeGroupVersion = schema.GroupVersion{Group: Group, Version: Version} + + // SchemeBuilder is used to add go types to the GroupVersionKind scheme + SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion} + AddToScheme = SchemeBuilder.AddToScheme +) diff --git a/pkg/apis/controller/trials/v1beta1/trial_types.go b/pkg/apis/controller/trials/v1beta1/trial_types.go new file mode 100644 index 00000000000..3579f0af88d --- /dev/null +++ b/pkg/apis/controller/trials/v1beta1/trial_types.go @@ -0,0 +1,124 @@ +/* + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta1 + +import ( + common "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +type TrialSpec struct { + // Describes the objective of the experiment. + Objective *common.ObjectiveSpec `json:"objective,omitempty"` + + // Key-value pairs for hyperparameters and assignment values. + ParameterAssignments []common.ParameterAssignment `json:"parameterAssignments"` + + // Raw text for the trial run spec. This can be any generic Kubernetes + // runtime object. The trial operator should create the resource as written, + // and let the corresponding resource controller (e.g. tf-operator) handle + // the rest. + RunSpec string `json:"runSpec,omitempty"` + // Whether to retain the trial run object after completed. + RetainRun bool `json:"retainRun,omitempty"` + + // Describes how metrics will be collected + MetricsCollector common.MetricsCollectorSpec `json:"metricsCollector,omitempty"` +} + +type TrialStatus struct { + // Represents time when the Trial was acknowledged by the Trial controller. + // It is not guaranteed to be set in happens-before order across separate operations. + // It is represented in RFC3339 form and is in UTC + StartTime *metav1.Time `json:"startTime,omitempty"` + + // Represents time when the Trial was completed. It is not guaranteed to + // be set in happens-before order across separate operations. + // It is represented in RFC3339 form and is in UTC + CompletionTime *metav1.Time `json:"completionTime,omitempty"` + + // Represents last time when the Trial was reconciled. It is not guaranteed to + // be set in happens-before order across separate operations. + // It is represented in RFC3339 form and is in UTC. + LastReconcileTime *metav1.Time `json:"lastReconcileTime,omitempty"` + + // List of observed runtime conditions for this Trial. + Conditions []TrialCondition `json:"conditions,omitempty"` + + // Results of the Trial - objectives and other metrics values. + Observation *common.Observation `json:"observation,omitempty"` +} + +// +k8s:deepcopy-gen=true +// TrialCondition describes the state of the trial at a certain point. +type TrialCondition struct { + // Type of trial condition. + Type TrialConditionType `json:"type"` + + // Status of the condition, one of True, False, Unknown. + Status v1.ConditionStatus `json:"status"` + + // The reason for the condition's last transition. + Reason string `json:"reason,omitempty"` + + // A human readable message indicating details about the transition. + Message string `json:"message,omitempty"` + + // The last time this condition was updated. + LastUpdateTime metav1.Time `json:"lastUpdateTime,omitempty"` + + // Last time the condition transitioned from one status to another. + LastTransitionTime metav1.Time `json:"lastTransitionTime,omitempty"` +} + +// TrialConditionType describes the various conditions a Trial can be in. +type TrialConditionType string + +const ( + TrialCreated TrialConditionType = "Created" + TrialRunning TrialConditionType = "Running" + TrialSucceeded TrialConditionType = "Succeeded" + TrialKilled TrialConditionType = "Killed" + TrialFailed TrialConditionType = "Failed" +) + +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Represents the structure of a Trial resource. +// +k8s:openapi-gen=true +// +kubebuilder:subresource:status +type Trial struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec TrialSpec `json:"spec,omitempty"` + Status TrialStatus `json:"status,omitempty"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// TrialList contains a list of Trials +type TrialList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []Trial `json:"items"` +} + +func init() { + SchemeBuilder.Register(&Trial{}, &TrialList{}) +} diff --git a/pkg/apis/controller/trials/v1beta1/util.go b/pkg/apis/controller/trials/v1beta1/util.go new file mode 100644 index 00000000000..5688daec935 --- /dev/null +++ b/pkg/apis/controller/trials/v1beta1/util.go @@ -0,0 +1,146 @@ +/* + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta1 + +import ( + "errors" + + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func getCondition(trial *Trial, condType TrialConditionType) *TrialCondition { + for _, condition := range trial.Status.Conditions { + if condition.Type == condType { + return &condition + } + } + return nil +} + +func hasCondition(trial *Trial, condType TrialConditionType) bool { + cond := getCondition(trial, condType) + if cond != nil && cond.Status == v1.ConditionTrue { + return true + } + return false +} + +func (trial *Trial) removeCondition(condType TrialConditionType) { + var newConditions []TrialCondition + for _, c := range trial.Status.Conditions { + + if c.Type == condType { + continue + } + + newConditions = append(newConditions, c) + } + trial.Status.Conditions = newConditions +} + +func newCondition(conditionType TrialConditionType, status v1.ConditionStatus, reason, message string) TrialCondition { + return TrialCondition{ + Type: conditionType, + Status: status, + LastUpdateTime: metav1.Now(), + LastTransitionTime: metav1.Now(), + Reason: reason, + Message: message, + } +} + +func (trial *Trial) IsCreated() bool { + return hasCondition(trial, TrialCreated) +} + +func (trial *Trial) IsRunning() bool { + return hasCondition(trial, TrialRunning) +} + +func (trial *Trial) IsSucceeded() bool { + return hasCondition(trial, TrialSucceeded) +} + +func (trial *Trial) IsFailed() bool { + return hasCondition(trial, TrialFailed) +} + +func (trial *Trial) IsKilled() bool { + return hasCondition(trial, TrialKilled) +} + +func (trial *Trial) IsCompleted() bool { + return trial.IsSucceeded() || trial.IsFailed() || trial.IsKilled() +} + +func (trial *Trial) GetLastConditionType() (TrialConditionType, error) { + if len(trial.Status.Conditions) > 0 { + return trial.Status.Conditions[len(trial.Status.Conditions)-1].Type, nil + } + return "", errors.New("Trial doesn't have any condition") +} + +func (trial *Trial) setCondition(conditionType TrialConditionType, status v1.ConditionStatus, reason, message string) { + + newCond := newCondition(conditionType, status, reason, message) + currentCond := getCondition(trial, conditionType) + // Do nothing if condition doesn't change + if currentCond != nil && currentCond.Status == newCond.Status && currentCond.Reason == newCond.Reason { + return + } + + // Do not update lastTransitionTime if the status of the condition doesn't change. + if currentCond != nil && currentCond.Status == newCond.Status { + newCond.LastTransitionTime = currentCond.LastTransitionTime + } + + trial.removeCondition(conditionType) + trial.Status.Conditions = append(trial.Status.Conditions, newCond) +} + +func (trial *Trial) MarkTrialStatusCreated(reason, message string) { + trial.setCondition(TrialCreated, v1.ConditionTrue, reason, message) +} + +func (trial *Trial) MarkTrialStatusRunning(reason, message string) { + trial.setCondition(TrialRunning, v1.ConditionTrue, reason, message) +} + +func (trial *Trial) MarkTrialStatusSucceeded(status v1.ConditionStatus, reason, message string) { + currentCond := getCondition(trial, TrialRunning) + if currentCond != nil { + trial.setCondition(TrialRunning, v1.ConditionFalse, currentCond.Reason, currentCond.Message) + } + trial.setCondition(TrialSucceeded, status, reason, message) + +} + +func (trial *Trial) MarkTrialStatusFailed(reason, message string) { + currentCond := getCondition(trial, TrialRunning) + if currentCond != nil { + trial.setCondition(TrialRunning, v1.ConditionFalse, currentCond.Reason, currentCond.Message) + } + trial.setCondition(TrialFailed, v1.ConditionTrue, reason, message) +} + +func (trial *Trial) MarkTrialStatusKilled(reason, message string) { + currentCond := getCondition(trial, TrialRunning) + if currentCond != nil { + trial.setCondition(TrialRunning, v1.ConditionFalse, currentCond.Reason, currentCond.Message) + } + trial.setCondition(TrialKilled, v1.ConditionTrue, reason, message) +} diff --git a/pkg/apis/controller/trials/v1beta1/zz_generated.deepcopy.go b/pkg/apis/controller/trials/v1beta1/zz_generated.deepcopy.go new file mode 100644 index 00000000000..6474671f43d --- /dev/null +++ b/pkg/apis/controller/trials/v1beta1/zz_generated.deepcopy.go @@ -0,0 +1,171 @@ +// +build !ignore_autogenerated + +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +// Code generated by main. DO NOT EDIT. + +package v1beta1 + +import ( + commonv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Trial) DeepCopyInto(out *Trial) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Trial. +func (in *Trial) DeepCopy() *Trial { + if in == nil { + return nil + } + out := new(Trial) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Trial) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TrialCondition) DeepCopyInto(out *TrialCondition) { + *out = *in + in.LastUpdateTime.DeepCopyInto(&out.LastUpdateTime) + in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TrialCondition. +func (in *TrialCondition) DeepCopy() *TrialCondition { + if in == nil { + return nil + } + out := new(TrialCondition) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TrialList) DeepCopyInto(out *TrialList) { + *out = *in + out.TypeMeta = in.TypeMeta + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Trial, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TrialList. +func (in *TrialList) DeepCopy() *TrialList { + if in == nil { + return nil + } + out := new(TrialList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *TrialList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TrialSpec) DeepCopyInto(out *TrialSpec) { + *out = *in + if in.Objective != nil { + in, out := &in.Objective, &out.Objective + *out = new(commonv1beta1.ObjectiveSpec) + (*in).DeepCopyInto(*out) + } + if in.ParameterAssignments != nil { + in, out := &in.ParameterAssignments, &out.ParameterAssignments + *out = make([]commonv1beta1.ParameterAssignment, len(*in)) + copy(*out, *in) + } + in.MetricsCollector.DeepCopyInto(&out.MetricsCollector) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TrialSpec. +func (in *TrialSpec) DeepCopy() *TrialSpec { + if in == nil { + return nil + } + out := new(TrialSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TrialStatus) DeepCopyInto(out *TrialStatus) { + *out = *in + if in.StartTime != nil { + in, out := &in.StartTime, &out.StartTime + *out = (*in).DeepCopy() + } + if in.CompletionTime != nil { + in, out := &in.CompletionTime, &out.CompletionTime + *out = (*in).DeepCopy() + } + if in.LastReconcileTime != nil { + in, out := &in.LastReconcileTime, &out.LastReconcileTime + *out = (*in).DeepCopy() + } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]TrialCondition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Observation != nil { + in, out := &in.Observation, &out.Observation + *out = new(commonv1beta1.Observation) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TrialStatus. +func (in *TrialStatus) DeepCopy() *TrialStatus { + if in == nil { + return nil + } + out := new(TrialStatus) + in.DeepCopyInto(out) + return out +} diff --git a/pkg/apis/manager/v1beta1/Makefile b/pkg/apis/manager/v1beta1/Makefile new file mode 100644 index 00000000000..f63e1d5a8f4 --- /dev/null +++ b/pkg/apis/manager/v1beta1/Makefile @@ -0,0 +1,2 @@ +api.pb.go: api.proto + protoc -I. api.proto --go_out=plugins=grpc:. diff --git a/pkg/apis/manager/v1beta1/api.pb.go b/pkg/apis/manager/v1beta1/api.pb.go new file mode 100644 index 00000000000..2d597ac250c --- /dev/null +++ b/pkg/apis/manager/v1beta1/api.pb.go @@ -0,0 +1,1470 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: api.proto + +/* +Package api_v1_beta1 is a generated protocol buffer package. + +It is generated from these files: + api.proto + +It has these top-level messages: + FeasibleSpace + ParameterSpec + ObjectiveSpec + AlgorithmSetting + EarlyStoppingSpec + AlgorithmSpec + NasConfig + GraphConfig + Operation + ExperimentSpec + Experiment + ParameterAssignment + Metric + MetricLog + Observation + ObservationLog + TrialSpec + TrialStatus + Trial + ReportObservationLogRequest + ReportObservationLogReply + DeleteObservationLogRequest + DeleteObservationLogReply + GetObservationLogRequest + GetObservationLogReply + GetSuggestionsRequest + GetSuggestionsReply + ValidateAlgorithmSettingsRequest + ValidateAlgorithmSettingsReply +*/ +package api_v1_beta1 + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" +import _ "google.golang.org/genproto/googleapis/api/annotations" + +import ( + context "golang.org/x/net/context" + grpc "google.golang.org/grpc" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +// * +// Types of value for HyperParameter. +type ParameterType int32 + +const ( + ParameterType_UNKNOWN_TYPE ParameterType = 0 + ParameterType_DOUBLE ParameterType = 1 + ParameterType_INT ParameterType = 2 + ParameterType_DISCRETE ParameterType = 3 + ParameterType_CATEGORICAL ParameterType = 4 +) + +var ParameterType_name = map[int32]string{ + 0: "UNKNOWN_TYPE", + 1: "DOUBLE", + 2: "INT", + 3: "DISCRETE", + 4: "CATEGORICAL", +} +var ParameterType_value = map[string]int32{ + "UNKNOWN_TYPE": 0, + "DOUBLE": 1, + "INT": 2, + "DISCRETE": 3, + "CATEGORICAL": 4, +} + +func (x ParameterType) String() string { + return proto.EnumName(ParameterType_name, int32(x)) +} +func (ParameterType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +// * +// Direction of optimization. Minimize or Maximize. +type ObjectiveType int32 + +const ( + ObjectiveType_UNKNOWN ObjectiveType = 0 + ObjectiveType_MINIMIZE ObjectiveType = 1 + ObjectiveType_MAXIMIZE ObjectiveType = 2 +) + +var ObjectiveType_name = map[int32]string{ + 0: "UNKNOWN", + 1: "MINIMIZE", + 2: "MAXIMIZE", +} +var ObjectiveType_value = map[string]int32{ + "UNKNOWN": 0, + "MINIMIZE": 1, + "MAXIMIZE": 2, +} + +func (x ObjectiveType) String() string { + return proto.EnumName(ObjectiveType_name, int32(x)) +} +func (ObjectiveType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } + +type TrialStatus_TrialConditionType int32 + +const ( + TrialStatus_CREATED TrialStatus_TrialConditionType = 0 + TrialStatus_RUNNING TrialStatus_TrialConditionType = 1 + TrialStatus_SUCCEEDED TrialStatus_TrialConditionType = 2 + TrialStatus_KILLED TrialStatus_TrialConditionType = 3 + TrialStatus_FAILED TrialStatus_TrialConditionType = 4 + TrialStatus_UNKNOWN TrialStatus_TrialConditionType = 5 +) + +var TrialStatus_TrialConditionType_name = map[int32]string{ + 0: "CREATED", + 1: "RUNNING", + 2: "SUCCEEDED", + 3: "KILLED", + 4: "FAILED", + 5: "UNKNOWN", +} +var TrialStatus_TrialConditionType_value = map[string]int32{ + "CREATED": 0, + "RUNNING": 1, + "SUCCEEDED": 2, + "KILLED": 3, + "FAILED": 4, + "UNKNOWN": 5, +} + +func (x TrialStatus_TrialConditionType) String() string { + return proto.EnumName(TrialStatus_TrialConditionType_name, int32(x)) +} +func (TrialStatus_TrialConditionType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor0, []int{17, 0} +} + +// * +// Feasible space for optimization. +// Int and Double type use Max/Min. +// Discrete and Categorical type use List. +type FeasibleSpace struct { + Max string `protobuf:"bytes,1,opt,name=max" json:"max,omitempty"` + Min string `protobuf:"bytes,2,opt,name=min" json:"min,omitempty"` + List []string `protobuf:"bytes,3,rep,name=list" json:"list,omitempty"` + Step string `protobuf:"bytes,4,opt,name=step" json:"step,omitempty"` +} + +func (m *FeasibleSpace) Reset() { *m = FeasibleSpace{} } +func (m *FeasibleSpace) String() string { return proto.CompactTextString(m) } +func (*FeasibleSpace) ProtoMessage() {} +func (*FeasibleSpace) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +func (m *FeasibleSpace) GetMax() string { + if m != nil { + return m.Max + } + return "" +} + +func (m *FeasibleSpace) GetMin() string { + if m != nil { + return m.Min + } + return "" +} + +func (m *FeasibleSpace) GetList() []string { + if m != nil { + return m.List + } + return nil +} + +func (m *FeasibleSpace) GetStep() string { + if m != nil { + return m.Step + } + return "" +} + +// * +// Config for a Hyper parameter. +// Katib will create each Hyper parameter from this config. +type ParameterSpec struct { + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + ParameterType ParameterType `protobuf:"varint,2,opt,name=parameter_type,json=parameterType,enum=api.v1.beta1.ParameterType" json:"parameter_type,omitempty"` + FeasibleSpace *FeasibleSpace `protobuf:"bytes,3,opt,name=feasible_space,json=feasibleSpace" json:"feasible_space,omitempty"` +} + +func (m *ParameterSpec) Reset() { *m = ParameterSpec{} } +func (m *ParameterSpec) String() string { return proto.CompactTextString(m) } +func (*ParameterSpec) ProtoMessage() {} +func (*ParameterSpec) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } + +func (m *ParameterSpec) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *ParameterSpec) GetParameterType() ParameterType { + if m != nil { + return m.ParameterType + } + return ParameterType_UNKNOWN_TYPE +} + +func (m *ParameterSpec) GetFeasibleSpace() *FeasibleSpace { + if m != nil { + return m.FeasibleSpace + } + return nil +} + +type ObjectiveSpec struct { + Type ObjectiveType `protobuf:"varint,1,opt,name=type,enum=api.v1.beta1.ObjectiveType" json:"type,omitempty"` + Goal float64 `protobuf:"fixed64,2,opt,name=goal" json:"goal,omitempty"` + ObjectiveMetricName string `protobuf:"bytes,3,opt,name=objective_metric_name,json=objectiveMetricName" json:"objective_metric_name,omitempty"` + AdditionalMetricNames []string `protobuf:"bytes,4,rep,name=additional_metric_names,json=additionalMetricNames" json:"additional_metric_names,omitempty"` +} + +func (m *ObjectiveSpec) Reset() { *m = ObjectiveSpec{} } +func (m *ObjectiveSpec) String() string { return proto.CompactTextString(m) } +func (*ObjectiveSpec) ProtoMessage() {} +func (*ObjectiveSpec) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } + +func (m *ObjectiveSpec) GetType() ObjectiveType { + if m != nil { + return m.Type + } + return ObjectiveType_UNKNOWN +} + +func (m *ObjectiveSpec) GetGoal() float64 { + if m != nil { + return m.Goal + } + return 0 +} + +func (m *ObjectiveSpec) GetObjectiveMetricName() string { + if m != nil { + return m.ObjectiveMetricName + } + return "" +} + +func (m *ObjectiveSpec) GetAdditionalMetricNames() []string { + if m != nil { + return m.AdditionalMetricNames + } + return nil +} + +type AlgorithmSetting struct { + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` +} + +func (m *AlgorithmSetting) Reset() { *m = AlgorithmSetting{} } +func (m *AlgorithmSetting) String() string { return proto.CompactTextString(m) } +func (*AlgorithmSetting) ProtoMessage() {} +func (*AlgorithmSetting) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } + +func (m *AlgorithmSetting) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *AlgorithmSetting) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +type EarlyStoppingSpec struct { +} + +func (m *EarlyStoppingSpec) Reset() { *m = EarlyStoppingSpec{} } +func (m *EarlyStoppingSpec) String() string { return proto.CompactTextString(m) } +func (*EarlyStoppingSpec) ProtoMessage() {} +func (*EarlyStoppingSpec) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } + +type AlgorithmSpec struct { + AlgorithmName string `protobuf:"bytes,1,opt,name=algorithm_name,json=algorithmName" json:"algorithm_name,omitempty"` + AlgorithmSetting []*AlgorithmSetting `protobuf:"bytes,2,rep,name=algorithm_setting,json=algorithmSetting" json:"algorithm_setting,omitempty"` + EarlyStoppingSpec *EarlyStoppingSpec `protobuf:"bytes,3,opt,name=early_stopping_spec,json=earlyStoppingSpec" json:"early_stopping_spec,omitempty"` +} + +func (m *AlgorithmSpec) Reset() { *m = AlgorithmSpec{} } +func (m *AlgorithmSpec) String() string { return proto.CompactTextString(m) } +func (*AlgorithmSpec) ProtoMessage() {} +func (*AlgorithmSpec) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } + +func (m *AlgorithmSpec) GetAlgorithmName() string { + if m != nil { + return m.AlgorithmName + } + return "" +} + +func (m *AlgorithmSpec) GetAlgorithmSetting() []*AlgorithmSetting { + if m != nil { + return m.AlgorithmSetting + } + return nil +} + +func (m *AlgorithmSpec) GetEarlyStoppingSpec() *EarlyStoppingSpec { + if m != nil { + return m.EarlyStoppingSpec + } + return nil +} + +// * +// NasConfig contains a config of NAS job +type NasConfig struct { + GraphConfig *GraphConfig `protobuf:"bytes,1,opt,name=graph_config,json=graphConfig" json:"graph_config,omitempty"` + Operations *NasConfig_Operations `protobuf:"bytes,2,opt,name=operations" json:"operations,omitempty"` +} + +func (m *NasConfig) Reset() { *m = NasConfig{} } +func (m *NasConfig) String() string { return proto.CompactTextString(m) } +func (*NasConfig) ProtoMessage() {} +func (*NasConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } + +func (m *NasConfig) GetGraphConfig() *GraphConfig { + if m != nil { + return m.GraphConfig + } + return nil +} + +func (m *NasConfig) GetOperations() *NasConfig_Operations { + if m != nil { + return m.Operations + } + return nil +} + +type NasConfig_Operations struct { + Operation []*Operation `protobuf:"bytes,1,rep,name=operation" json:"operation,omitempty"` +} + +func (m *NasConfig_Operations) Reset() { *m = NasConfig_Operations{} } +func (m *NasConfig_Operations) String() string { return proto.CompactTextString(m) } +func (*NasConfig_Operations) ProtoMessage() {} +func (*NasConfig_Operations) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6, 0} } + +func (m *NasConfig_Operations) GetOperation() []*Operation { + if m != nil { + return m.Operation + } + return nil +} + +// * +// GraphConfig contains a config of DAG +type GraphConfig struct { + NumLayers int32 `protobuf:"varint,1,opt,name=num_layers,json=numLayers" json:"num_layers,omitempty"` + InputSizes []int32 `protobuf:"varint,2,rep,packed,name=input_sizes,json=inputSizes" json:"input_sizes,omitempty"` + OutputSizes []int32 `protobuf:"varint,3,rep,packed,name=output_sizes,json=outputSizes" json:"output_sizes,omitempty"` +} + +func (m *GraphConfig) Reset() { *m = GraphConfig{} } +func (m *GraphConfig) String() string { return proto.CompactTextString(m) } +func (*GraphConfig) ProtoMessage() {} +func (*GraphConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } + +func (m *GraphConfig) GetNumLayers() int32 { + if m != nil { + return m.NumLayers + } + return 0 +} + +func (m *GraphConfig) GetInputSizes() []int32 { + if m != nil { + return m.InputSizes + } + return nil +} + +func (m *GraphConfig) GetOutputSizes() []int32 { + if m != nil { + return m.OutputSizes + } + return nil +} + +// * +// Config for operations in DAG +type Operation struct { + OperationType string `protobuf:"bytes,1,opt,name=operation_type,json=operationType" json:"operation_type,omitempty"` + ParameterSpecs *Operation_ParameterSpecs `protobuf:"bytes,2,opt,name=parameter_specs,json=parameterSpecs" json:"parameter_specs,omitempty"` +} + +func (m *Operation) Reset() { *m = Operation{} } +func (m *Operation) String() string { return proto.CompactTextString(m) } +func (*Operation) ProtoMessage() {} +func (*Operation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } + +func (m *Operation) GetOperationType() string { + if m != nil { + return m.OperationType + } + return "" +} + +func (m *Operation) GetParameterSpecs() *Operation_ParameterSpecs { + if m != nil { + return m.ParameterSpecs + } + return nil +} + +// * +// List of ParameterSpec +type Operation_ParameterSpecs struct { + Parameters []*ParameterSpec `protobuf:"bytes,1,rep,name=parameters" json:"parameters,omitempty"` +} + +func (m *Operation_ParameterSpecs) Reset() { *m = Operation_ParameterSpecs{} } +func (m *Operation_ParameterSpecs) String() string { return proto.CompactTextString(m) } +func (*Operation_ParameterSpecs) ProtoMessage() {} +func (*Operation_ParameterSpecs) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8, 0} } + +func (m *Operation_ParameterSpecs) GetParameters() []*ParameterSpec { + if m != nil { + return m.Parameters + } + return nil +} + +// * +// Spec of a Experiment. Experiment represents a single optimization run over a feasible space. +// Each Experiment contains a configuration describing the feasible space, as well as a set of Trials. +// It is assumed that objective function f(x) does not change in the course of a Experiment. +type ExperimentSpec struct { + ParameterSpecs *ExperimentSpec_ParameterSpecs `protobuf:"bytes,1,opt,name=parameter_specs,json=parameterSpecs" json:"parameter_specs,omitempty"` + Objective *ObjectiveSpec `protobuf:"bytes,2,opt,name=objective" json:"objective,omitempty"` + Algorithm *AlgorithmSpec `protobuf:"bytes,3,opt,name=algorithm" json:"algorithm,omitempty"` + TrialTemplate string `protobuf:"bytes,4,opt,name=trial_template,json=trialTemplate" json:"trial_template,omitempty"` + MetricsCollectorSpec string `protobuf:"bytes,5,opt,name=metrics_collector_spec,json=metricsCollectorSpec" json:"metrics_collector_spec,omitempty"` + ParallelTrialCount int32 `protobuf:"varint,6,opt,name=parallel_trial_count,json=parallelTrialCount" json:"parallel_trial_count,omitempty"` + MaxTrialCount int32 `protobuf:"varint,7,opt,name=max_trial_count,json=maxTrialCount" json:"max_trial_count,omitempty"` + NasConfig *NasConfig `protobuf:"bytes,8,opt,name=nas_config,json=nasConfig" json:"nas_config,omitempty"` +} + +func (m *ExperimentSpec) Reset() { *m = ExperimentSpec{} } +func (m *ExperimentSpec) String() string { return proto.CompactTextString(m) } +func (*ExperimentSpec) ProtoMessage() {} +func (*ExperimentSpec) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } + +func (m *ExperimentSpec) GetParameterSpecs() *ExperimentSpec_ParameterSpecs { + if m != nil { + return m.ParameterSpecs + } + return nil +} + +func (m *ExperimentSpec) GetObjective() *ObjectiveSpec { + if m != nil { + return m.Objective + } + return nil +} + +func (m *ExperimentSpec) GetAlgorithm() *AlgorithmSpec { + if m != nil { + return m.Algorithm + } + return nil +} + +func (m *ExperimentSpec) GetTrialTemplate() string { + if m != nil { + return m.TrialTemplate + } + return "" +} + +func (m *ExperimentSpec) GetMetricsCollectorSpec() string { + if m != nil { + return m.MetricsCollectorSpec + } + return "" +} + +func (m *ExperimentSpec) GetParallelTrialCount() int32 { + if m != nil { + return m.ParallelTrialCount + } + return 0 +} + +func (m *ExperimentSpec) GetMaxTrialCount() int32 { + if m != nil { + return m.MaxTrialCount + } + return 0 +} + +func (m *ExperimentSpec) GetNasConfig() *NasConfig { + if m != nil { + return m.NasConfig + } + return nil +} + +// * +// List of ParameterSpec +type ExperimentSpec_ParameterSpecs struct { + Parameters []*ParameterSpec `protobuf:"bytes,1,rep,name=parameters" json:"parameters,omitempty"` +} + +func (m *ExperimentSpec_ParameterSpecs) Reset() { *m = ExperimentSpec_ParameterSpecs{} } +func (m *ExperimentSpec_ParameterSpecs) String() string { return proto.CompactTextString(m) } +func (*ExperimentSpec_ParameterSpecs) ProtoMessage() {} +func (*ExperimentSpec_ParameterSpecs) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{9, 0} +} + +func (m *ExperimentSpec_ParameterSpecs) GetParameters() []*ParameterSpec { + if m != nil { + return m.Parameters + } + return nil +} + +type Experiment struct { + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Spec *ExperimentSpec `protobuf:"bytes,2,opt,name=spec" json:"spec,omitempty"` +} + +func (m *Experiment) Reset() { *m = Experiment{} } +func (m *Experiment) String() string { return proto.CompactTextString(m) } +func (*Experiment) ProtoMessage() {} +func (*Experiment) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } + +func (m *Experiment) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Experiment) GetSpec() *ExperimentSpec { + if m != nil { + return m.Spec + } + return nil +} + +type ParameterAssignment struct { + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` +} + +func (m *ParameterAssignment) Reset() { *m = ParameterAssignment{} } +func (m *ParameterAssignment) String() string { return proto.CompactTextString(m) } +func (*ParameterAssignment) ProtoMessage() {} +func (*ParameterAssignment) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } + +func (m *ParameterAssignment) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *ParameterAssignment) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +type Metric struct { + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` +} + +func (m *Metric) Reset() { *m = Metric{} } +func (m *Metric) String() string { return proto.CompactTextString(m) } +func (*Metric) ProtoMessage() {} +func (*Metric) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } + +func (m *Metric) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Metric) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +type MetricLog struct { + TimeStamp string `protobuf:"bytes,1,opt,name=time_stamp,json=timeStamp" json:"time_stamp,omitempty"` + Metric *Metric `protobuf:"bytes,2,opt,name=metric" json:"metric,omitempty"` +} + +func (m *MetricLog) Reset() { *m = MetricLog{} } +func (m *MetricLog) String() string { return proto.CompactTextString(m) } +func (*MetricLog) ProtoMessage() {} +func (*MetricLog) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } + +func (m *MetricLog) GetTimeStamp() string { + if m != nil { + return m.TimeStamp + } + return "" +} + +func (m *MetricLog) GetMetric() *Metric { + if m != nil { + return m.Metric + } + return nil +} + +type Observation struct { + Metrics []*Metric `protobuf:"bytes,1,rep,name=metrics" json:"metrics,omitempty"` +} + +func (m *Observation) Reset() { *m = Observation{} } +func (m *Observation) String() string { return proto.CompactTextString(m) } +func (*Observation) ProtoMessage() {} +func (*Observation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } + +func (m *Observation) GetMetrics() []*Metric { + if m != nil { + return m.Metrics + } + return nil +} + +type ObservationLog struct { + MetricLogs []*MetricLog `protobuf:"bytes,1,rep,name=metric_logs,json=metricLogs" json:"metric_logs,omitempty"` +} + +func (m *ObservationLog) Reset() { *m = ObservationLog{} } +func (m *ObservationLog) String() string { return proto.CompactTextString(m) } +func (*ObservationLog) ProtoMessage() {} +func (*ObservationLog) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } + +func (m *ObservationLog) GetMetricLogs() []*MetricLog { + if m != nil { + return m.MetricLogs + } + return nil +} + +type TrialSpec struct { + ExperimentName string `protobuf:"bytes,1,opt,name=experiment_name,json=experimentName" json:"experiment_name,omitempty"` + Objective *ObjectiveSpec `protobuf:"bytes,2,opt,name=objective" json:"objective,omitempty"` + ParameterAssignments *TrialSpec_ParameterAssignments `protobuf:"bytes,3,opt,name=parameter_assignments,json=parameterAssignments" json:"parameter_assignments,omitempty"` + RunSpec string `protobuf:"bytes,4,opt,name=run_spec,json=runSpec" json:"run_spec,omitempty"` + MetricsCollectorSpec string `protobuf:"bytes,5,opt,name=metrics_collector_spec,json=metricsCollectorSpec" json:"metrics_collector_spec,omitempty"` +} + +func (m *TrialSpec) Reset() { *m = TrialSpec{} } +func (m *TrialSpec) String() string { return proto.CompactTextString(m) } +func (*TrialSpec) ProtoMessage() {} +func (*TrialSpec) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} } + +func (m *TrialSpec) GetExperimentName() string { + if m != nil { + return m.ExperimentName + } + return "" +} + +func (m *TrialSpec) GetObjective() *ObjectiveSpec { + if m != nil { + return m.Objective + } + return nil +} + +func (m *TrialSpec) GetParameterAssignments() *TrialSpec_ParameterAssignments { + if m != nil { + return m.ParameterAssignments + } + return nil +} + +func (m *TrialSpec) GetRunSpec() string { + if m != nil { + return m.RunSpec + } + return "" +} + +func (m *TrialSpec) GetMetricsCollectorSpec() string { + if m != nil { + return m.MetricsCollectorSpec + } + return "" +} + +// * +// List of ParameterAssignment +type TrialSpec_ParameterAssignments struct { + Assignments []*ParameterAssignment `protobuf:"bytes,1,rep,name=assignments" json:"assignments,omitempty"` +} + +func (m *TrialSpec_ParameterAssignments) Reset() { *m = TrialSpec_ParameterAssignments{} } +func (m *TrialSpec_ParameterAssignments) String() string { return proto.CompactTextString(m) } +func (*TrialSpec_ParameterAssignments) ProtoMessage() {} +func (*TrialSpec_ParameterAssignments) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{16, 0} +} + +func (m *TrialSpec_ParameterAssignments) GetAssignments() []*ParameterAssignment { + if m != nil { + return m.Assignments + } + return nil +} + +type TrialStatus struct { + StartTime string `protobuf:"bytes,1,opt,name=start_time,json=startTime" json:"start_time,omitempty"` + CompletionTime string `protobuf:"bytes,2,opt,name=completion_time,json=completionTime" json:"completion_time,omitempty"` + Condition TrialStatus_TrialConditionType `protobuf:"varint,3,opt,name=condition,enum=api.v1.beta1.TrialStatus_TrialConditionType" json:"condition,omitempty"` + Observation *Observation `protobuf:"bytes,4,opt,name=observation" json:"observation,omitempty"` +} + +func (m *TrialStatus) Reset() { *m = TrialStatus{} } +func (m *TrialStatus) String() string { return proto.CompactTextString(m) } +func (*TrialStatus) ProtoMessage() {} +func (*TrialStatus) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} } + +func (m *TrialStatus) GetStartTime() string { + if m != nil { + return m.StartTime + } + return "" +} + +func (m *TrialStatus) GetCompletionTime() string { + if m != nil { + return m.CompletionTime + } + return "" +} + +func (m *TrialStatus) GetCondition() TrialStatus_TrialConditionType { + if m != nil { + return m.Condition + } + return TrialStatus_CREATED +} + +func (m *TrialStatus) GetObservation() *Observation { + if m != nil { + return m.Observation + } + return nil +} + +type Trial struct { + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Spec *TrialSpec `protobuf:"bytes,2,opt,name=spec" json:"spec,omitempty"` + Status *TrialStatus `protobuf:"bytes,3,opt,name=status" json:"status,omitempty"` +} + +func (m *Trial) Reset() { *m = Trial{} } +func (m *Trial) String() string { return proto.CompactTextString(m) } +func (*Trial) ProtoMessage() {} +func (*Trial) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } + +func (m *Trial) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Trial) GetSpec() *TrialSpec { + if m != nil { + return m.Spec + } + return nil +} + +func (m *Trial) GetStatus() *TrialStatus { + if m != nil { + return m.Status + } + return nil +} + +type ReportObservationLogRequest struct { + TrialName string `protobuf:"bytes,1,opt,name=trial_name,json=trialName" json:"trial_name,omitempty"` + ObservationLog *ObservationLog `protobuf:"bytes,2,opt,name=observation_log,json=observationLog" json:"observation_log,omitempty"` +} + +func (m *ReportObservationLogRequest) Reset() { *m = ReportObservationLogRequest{} } +func (m *ReportObservationLogRequest) String() string { return proto.CompactTextString(m) } +func (*ReportObservationLogRequest) ProtoMessage() {} +func (*ReportObservationLogRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } + +func (m *ReportObservationLogRequest) GetTrialName() string { + if m != nil { + return m.TrialName + } + return "" +} + +func (m *ReportObservationLogRequest) GetObservationLog() *ObservationLog { + if m != nil { + return m.ObservationLog + } + return nil +} + +type ReportObservationLogReply struct { +} + +func (m *ReportObservationLogReply) Reset() { *m = ReportObservationLogReply{} } +func (m *ReportObservationLogReply) String() string { return proto.CompactTextString(m) } +func (*ReportObservationLogReply) ProtoMessage() {} +func (*ReportObservationLogReply) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} } + +type DeleteObservationLogRequest struct { + TrialName string `protobuf:"bytes,1,opt,name=trial_name,json=trialName" json:"trial_name,omitempty"` +} + +func (m *DeleteObservationLogRequest) Reset() { *m = DeleteObservationLogRequest{} } +func (m *DeleteObservationLogRequest) String() string { return proto.CompactTextString(m) } +func (*DeleteObservationLogRequest) ProtoMessage() {} +func (*DeleteObservationLogRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} } + +func (m *DeleteObservationLogRequest) GetTrialName() string { + if m != nil { + return m.TrialName + } + return "" +} + +type DeleteObservationLogReply struct { +} + +func (m *DeleteObservationLogReply) Reset() { *m = DeleteObservationLogReply{} } +func (m *DeleteObservationLogReply) String() string { return proto.CompactTextString(m) } +func (*DeleteObservationLogReply) ProtoMessage() {} +func (*DeleteObservationLogReply) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} } + +type GetObservationLogRequest struct { + TrialName string `protobuf:"bytes,1,opt,name=trial_name,json=trialName" json:"trial_name,omitempty"` + MetricName string `protobuf:"bytes,2,opt,name=metric_name,json=metricName" json:"metric_name,omitempty"` + StartTime string `protobuf:"bytes,3,opt,name=start_time,json=startTime" json:"start_time,omitempty"` + EndTime string `protobuf:"bytes,4,opt,name=end_time,json=endTime" json:"end_time,omitempty"` +} + +func (m *GetObservationLogRequest) Reset() { *m = GetObservationLogRequest{} } +func (m *GetObservationLogRequest) String() string { return proto.CompactTextString(m) } +func (*GetObservationLogRequest) ProtoMessage() {} +func (*GetObservationLogRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} } + +func (m *GetObservationLogRequest) GetTrialName() string { + if m != nil { + return m.TrialName + } + return "" +} + +func (m *GetObservationLogRequest) GetMetricName() string { + if m != nil { + return m.MetricName + } + return "" +} + +func (m *GetObservationLogRequest) GetStartTime() string { + if m != nil { + return m.StartTime + } + return "" +} + +func (m *GetObservationLogRequest) GetEndTime() string { + if m != nil { + return m.EndTime + } + return "" +} + +type GetObservationLogReply struct { + ObservationLog *ObservationLog `protobuf:"bytes,1,opt,name=observation_log,json=observationLog" json:"observation_log,omitempty"` +} + +func (m *GetObservationLogReply) Reset() { *m = GetObservationLogReply{} } +func (m *GetObservationLogReply) String() string { return proto.CompactTextString(m) } +func (*GetObservationLogReply) ProtoMessage() {} +func (*GetObservationLogReply) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} } + +func (m *GetObservationLogReply) GetObservationLog() *ObservationLog { + if m != nil { + return m.ObservationLog + } + return nil +} + +type GetSuggestionsRequest struct { + Experiment *Experiment `protobuf:"bytes,1,opt,name=experiment" json:"experiment,omitempty"` + Trials []*Trial `protobuf:"bytes,2,rep,name=trials" json:"trials,omitempty"` + RequestNumber int32 `protobuf:"varint,3,opt,name=request_number,json=requestNumber" json:"request_number,omitempty"` +} + +func (m *GetSuggestionsRequest) Reset() { *m = GetSuggestionsRequest{} } +func (m *GetSuggestionsRequest) String() string { return proto.CompactTextString(m) } +func (*GetSuggestionsRequest) ProtoMessage() {} +func (*GetSuggestionsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} } + +func (m *GetSuggestionsRequest) GetExperiment() *Experiment { + if m != nil { + return m.Experiment + } + return nil +} + +func (m *GetSuggestionsRequest) GetTrials() []*Trial { + if m != nil { + return m.Trials + } + return nil +} + +func (m *GetSuggestionsRequest) GetRequestNumber() int32 { + if m != nil { + return m.RequestNumber + } + return 0 +} + +type GetSuggestionsReply struct { + ParameterAssignments []*GetSuggestionsReply_ParameterAssignments `protobuf:"bytes,1,rep,name=parameter_assignments,json=parameterAssignments" json:"parameter_assignments,omitempty"` + Algorithm *AlgorithmSpec `protobuf:"bytes,2,opt,name=algorithm" json:"algorithm,omitempty"` +} + +func (m *GetSuggestionsReply) Reset() { *m = GetSuggestionsReply{} } +func (m *GetSuggestionsReply) String() string { return proto.CompactTextString(m) } +func (*GetSuggestionsReply) ProtoMessage() {} +func (*GetSuggestionsReply) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} } + +func (m *GetSuggestionsReply) GetParameterAssignments() []*GetSuggestionsReply_ParameterAssignments { + if m != nil { + return m.ParameterAssignments + } + return nil +} + +func (m *GetSuggestionsReply) GetAlgorithm() *AlgorithmSpec { + if m != nil { + return m.Algorithm + } + return nil +} + +type GetSuggestionsReply_ParameterAssignments struct { + Assignments []*ParameterAssignment `protobuf:"bytes,1,rep,name=assignments" json:"assignments,omitempty"` +} + +func (m *GetSuggestionsReply_ParameterAssignments) Reset() { + *m = GetSuggestionsReply_ParameterAssignments{} +} +func (m *GetSuggestionsReply_ParameterAssignments) String() string { return proto.CompactTextString(m) } +func (*GetSuggestionsReply_ParameterAssignments) ProtoMessage() {} +func (*GetSuggestionsReply_ParameterAssignments) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{26, 0} +} + +func (m *GetSuggestionsReply_ParameterAssignments) GetAssignments() []*ParameterAssignment { + if m != nil { + return m.Assignments + } + return nil +} + +type ValidateAlgorithmSettingsRequest struct { + Experiment *Experiment `protobuf:"bytes,1,opt,name=experiment" json:"experiment,omitempty"` +} + +func (m *ValidateAlgorithmSettingsRequest) Reset() { *m = ValidateAlgorithmSettingsRequest{} } +func (m *ValidateAlgorithmSettingsRequest) String() string { return proto.CompactTextString(m) } +func (*ValidateAlgorithmSettingsRequest) ProtoMessage() {} +func (*ValidateAlgorithmSettingsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{27} +} + +func (m *ValidateAlgorithmSettingsRequest) GetExperiment() *Experiment { + if m != nil { + return m.Experiment + } + return nil +} + +// * +// Return INVALID_ARGUMENT Error if Algorithm Settings are not Valid +type ValidateAlgorithmSettingsReply struct { +} + +func (m *ValidateAlgorithmSettingsReply) Reset() { *m = ValidateAlgorithmSettingsReply{} } +func (m *ValidateAlgorithmSettingsReply) String() string { return proto.CompactTextString(m) } +func (*ValidateAlgorithmSettingsReply) ProtoMessage() {} +func (*ValidateAlgorithmSettingsReply) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} } + +func init() { + proto.RegisterType((*FeasibleSpace)(nil), "api.v1.beta1.FeasibleSpace") + proto.RegisterType((*ParameterSpec)(nil), "api.v1.beta1.ParameterSpec") + proto.RegisterType((*ObjectiveSpec)(nil), "api.v1.beta1.ObjectiveSpec") + proto.RegisterType((*AlgorithmSetting)(nil), "api.v1.beta1.AlgorithmSetting") + proto.RegisterType((*EarlyStoppingSpec)(nil), "api.v1.beta1.EarlyStoppingSpec") + proto.RegisterType((*AlgorithmSpec)(nil), "api.v1.beta1.AlgorithmSpec") + proto.RegisterType((*NasConfig)(nil), "api.v1.beta1.NasConfig") + proto.RegisterType((*NasConfig_Operations)(nil), "api.v1.beta1.NasConfig.Operations") + proto.RegisterType((*GraphConfig)(nil), "api.v1.beta1.GraphConfig") + proto.RegisterType((*Operation)(nil), "api.v1.beta1.Operation") + proto.RegisterType((*Operation_ParameterSpecs)(nil), "api.v1.beta1.Operation.ParameterSpecs") + proto.RegisterType((*ExperimentSpec)(nil), "api.v1.beta1.ExperimentSpec") + proto.RegisterType((*ExperimentSpec_ParameterSpecs)(nil), "api.v1.beta1.ExperimentSpec.ParameterSpecs") + proto.RegisterType((*Experiment)(nil), "api.v1.beta1.Experiment") + proto.RegisterType((*ParameterAssignment)(nil), "api.v1.beta1.ParameterAssignment") + proto.RegisterType((*Metric)(nil), "api.v1.beta1.Metric") + proto.RegisterType((*MetricLog)(nil), "api.v1.beta1.MetricLog") + proto.RegisterType((*Observation)(nil), "api.v1.beta1.Observation") + proto.RegisterType((*ObservationLog)(nil), "api.v1.beta1.ObservationLog") + proto.RegisterType((*TrialSpec)(nil), "api.v1.beta1.TrialSpec") + proto.RegisterType((*TrialSpec_ParameterAssignments)(nil), "api.v1.beta1.TrialSpec.ParameterAssignments") + proto.RegisterType((*TrialStatus)(nil), "api.v1.beta1.TrialStatus") + proto.RegisterType((*Trial)(nil), "api.v1.beta1.Trial") + proto.RegisterType((*ReportObservationLogRequest)(nil), "api.v1.beta1.ReportObservationLogRequest") + proto.RegisterType((*ReportObservationLogReply)(nil), "api.v1.beta1.ReportObservationLogReply") + proto.RegisterType((*DeleteObservationLogRequest)(nil), "api.v1.beta1.DeleteObservationLogRequest") + proto.RegisterType((*DeleteObservationLogReply)(nil), "api.v1.beta1.DeleteObservationLogReply") + proto.RegisterType((*GetObservationLogRequest)(nil), "api.v1.beta1.GetObservationLogRequest") + proto.RegisterType((*GetObservationLogReply)(nil), "api.v1.beta1.GetObservationLogReply") + proto.RegisterType((*GetSuggestionsRequest)(nil), "api.v1.beta1.GetSuggestionsRequest") + proto.RegisterType((*GetSuggestionsReply)(nil), "api.v1.beta1.GetSuggestionsReply") + proto.RegisterType((*GetSuggestionsReply_ParameterAssignments)(nil), "api.v1.beta1.GetSuggestionsReply.ParameterAssignments") + proto.RegisterType((*ValidateAlgorithmSettingsRequest)(nil), "api.v1.beta1.ValidateAlgorithmSettingsRequest") + proto.RegisterType((*ValidateAlgorithmSettingsReply)(nil), "api.v1.beta1.ValidateAlgorithmSettingsReply") + proto.RegisterEnum("api.v1.beta1.ParameterType", ParameterType_name, ParameterType_value) + proto.RegisterEnum("api.v1.beta1.ObjectiveType", ObjectiveType_name, ObjectiveType_value) + proto.RegisterEnum("api.v1.beta1.TrialStatus_TrialConditionType", TrialStatus_TrialConditionType_name, TrialStatus_TrialConditionType_value) +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// Client API for Manager service + +type ManagerClient interface { + // * + // Report a log of Observations for a Trial. + // The log consists of timestamp and value of metric. + // Katib store every log of metrics. + // You can see accuracy curve or other metric logs on UI. + ReportObservationLog(ctx context.Context, in *ReportObservationLogRequest, opts ...grpc.CallOption) (*ReportObservationLogReply, error) + // * + // Get all log of Observations for a Trial. + GetObservationLog(ctx context.Context, in *GetObservationLogRequest, opts ...grpc.CallOption) (*GetObservationLogReply, error) + // * + // Delete all log of Observations for a Trial. + DeleteObservationLog(ctx context.Context, in *DeleteObservationLogRequest, opts ...grpc.CallOption) (*DeleteObservationLogReply, error) +} + +type managerClient struct { + cc *grpc.ClientConn +} + +func NewManagerClient(cc *grpc.ClientConn) ManagerClient { + return &managerClient{cc} +} + +func (c *managerClient) ReportObservationLog(ctx context.Context, in *ReportObservationLogRequest, opts ...grpc.CallOption) (*ReportObservationLogReply, error) { + out := new(ReportObservationLogReply) + err := grpc.Invoke(ctx, "/api.v1.beta1.Manager/ReportObservationLog", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managerClient) GetObservationLog(ctx context.Context, in *GetObservationLogRequest, opts ...grpc.CallOption) (*GetObservationLogReply, error) { + out := new(GetObservationLogReply) + err := grpc.Invoke(ctx, "/api.v1.beta1.Manager/GetObservationLog", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managerClient) DeleteObservationLog(ctx context.Context, in *DeleteObservationLogRequest, opts ...grpc.CallOption) (*DeleteObservationLogReply, error) { + out := new(DeleteObservationLogReply) + err := grpc.Invoke(ctx, "/api.v1.beta1.Manager/DeleteObservationLog", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// Server API for Manager service + +type ManagerServer interface { + // * + // Report a log of Observations for a Trial. + // The log consists of timestamp and value of metric. + // Katib store every log of metrics. + // You can see accuracy curve or other metric logs on UI. + ReportObservationLog(context.Context, *ReportObservationLogRequest) (*ReportObservationLogReply, error) + // * + // Get all log of Observations for a Trial. + GetObservationLog(context.Context, *GetObservationLogRequest) (*GetObservationLogReply, error) + // * + // Delete all log of Observations for a Trial. + DeleteObservationLog(context.Context, *DeleteObservationLogRequest) (*DeleteObservationLogReply, error) +} + +func RegisterManagerServer(s *grpc.Server, srv ManagerServer) { + s.RegisterService(&_Manager_serviceDesc, srv) +} + +func _Manager_ReportObservationLog_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ReportObservationLogRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagerServer).ReportObservationLog(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/api.v1.beta1.Manager/ReportObservationLog", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagerServer).ReportObservationLog(ctx, req.(*ReportObservationLogRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Manager_GetObservationLog_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetObservationLogRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagerServer).GetObservationLog(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/api.v1.beta1.Manager/GetObservationLog", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagerServer).GetObservationLog(ctx, req.(*GetObservationLogRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Manager_DeleteObservationLog_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteObservationLogRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagerServer).DeleteObservationLog(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/api.v1.beta1.Manager/DeleteObservationLog", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagerServer).DeleteObservationLog(ctx, req.(*DeleteObservationLogRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Manager_serviceDesc = grpc.ServiceDesc{ + ServiceName: "api.v1.beta1.Manager", + HandlerType: (*ManagerServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "ReportObservationLog", + Handler: _Manager_ReportObservationLog_Handler, + }, + { + MethodName: "GetObservationLog", + Handler: _Manager_GetObservationLog_Handler, + }, + { + MethodName: "DeleteObservationLog", + Handler: _Manager_DeleteObservationLog_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "api.proto", +} + +// Client API for Suggestion service + +type SuggestionClient interface { + GetSuggestions(ctx context.Context, in *GetSuggestionsRequest, opts ...grpc.CallOption) (*GetSuggestionsReply, error) + ValidateAlgorithmSettings(ctx context.Context, in *ValidateAlgorithmSettingsRequest, opts ...grpc.CallOption) (*ValidateAlgorithmSettingsReply, error) +} + +type suggestionClient struct { + cc *grpc.ClientConn +} + +func NewSuggestionClient(cc *grpc.ClientConn) SuggestionClient { + return &suggestionClient{cc} +} + +func (c *suggestionClient) GetSuggestions(ctx context.Context, in *GetSuggestionsRequest, opts ...grpc.CallOption) (*GetSuggestionsReply, error) { + out := new(GetSuggestionsReply) + err := grpc.Invoke(ctx, "/api.v1.beta1.Suggestion/GetSuggestions", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *suggestionClient) ValidateAlgorithmSettings(ctx context.Context, in *ValidateAlgorithmSettingsRequest, opts ...grpc.CallOption) (*ValidateAlgorithmSettingsReply, error) { + out := new(ValidateAlgorithmSettingsReply) + err := grpc.Invoke(ctx, "/api.v1.beta1.Suggestion/ValidateAlgorithmSettings", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// Server API for Suggestion service + +type SuggestionServer interface { + GetSuggestions(context.Context, *GetSuggestionsRequest) (*GetSuggestionsReply, error) + ValidateAlgorithmSettings(context.Context, *ValidateAlgorithmSettingsRequest) (*ValidateAlgorithmSettingsReply, error) +} + +func RegisterSuggestionServer(s *grpc.Server, srv SuggestionServer) { + s.RegisterService(&_Suggestion_serviceDesc, srv) +} + +func _Suggestion_GetSuggestions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetSuggestionsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SuggestionServer).GetSuggestions(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/api.v1.beta1.Suggestion/GetSuggestions", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SuggestionServer).GetSuggestions(ctx, req.(*GetSuggestionsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Suggestion_ValidateAlgorithmSettings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ValidateAlgorithmSettingsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SuggestionServer).ValidateAlgorithmSettings(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/api.v1.beta1.Suggestion/ValidateAlgorithmSettings", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SuggestionServer).ValidateAlgorithmSettings(ctx, req.(*ValidateAlgorithmSettingsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Suggestion_serviceDesc = grpc.ServiceDesc{ + ServiceName: "api.v1.beta1.Suggestion", + HandlerType: (*SuggestionServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetSuggestions", + Handler: _Suggestion_GetSuggestions_Handler, + }, + { + MethodName: "ValidateAlgorithmSettings", + Handler: _Suggestion_ValidateAlgorithmSettings_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "api.proto", +} + +// Client API for EarlyStopping service + +type EarlyStoppingClient interface { +} + +type earlyStoppingClient struct { + cc *grpc.ClientConn +} + +func NewEarlyStoppingClient(cc *grpc.ClientConn) EarlyStoppingClient { + return &earlyStoppingClient{cc} +} + +// Server API for EarlyStopping service + +type EarlyStoppingServer interface { +} + +func RegisterEarlyStoppingServer(s *grpc.Server, srv EarlyStoppingServer) { + s.RegisterService(&_EarlyStopping_serviceDesc, srv) +} + +var _EarlyStopping_serviceDesc = grpc.ServiceDesc{ + ServiceName: "api.v1.beta1.EarlyStopping", + HandlerType: (*EarlyStoppingServer)(nil), + Methods: []grpc.MethodDesc{}, + Streams: []grpc.StreamDesc{}, + Metadata: "api.proto", +} + +func init() { proto.RegisterFile("api.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 1644 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0xdd, 0x72, 0x1b, 0x4b, + 0x11, 0xce, 0x4a, 0xf2, 0x8f, 0x5a, 0x96, 0x2c, 0x8f, 0xe5, 0x63, 0xd9, 0x3e, 0x9c, 0x38, 0x0b, + 0xe4, 0x98, 0x93, 0x94, 0x72, 0x22, 0x20, 0x15, 0xea, 0x84, 0xa2, 0x1c, 0x59, 0xc7, 0xa5, 0x13, + 0x5b, 0x4a, 0x8d, 0x64, 0x08, 0x84, 0xaa, 0xad, 0xb1, 0x3c, 0x51, 0x36, 0xec, 0x1f, 0x3b, 0x23, + 0x97, 0x05, 0x37, 0x54, 0xf1, 0x0a, 0x5c, 0xe5, 0x9e, 0x2b, 0x5e, 0x82, 0xa2, 0x78, 0x02, 0x8a, + 0x17, 0xe0, 0x4d, 0xa8, 0xe9, 0x5d, 0xed, 0x8f, 0xb4, 0xb2, 0x13, 0x07, 0xee, 0x66, 0xba, 0xbf, + 0xee, 0xe9, 0xee, 0xe9, 0xfe, 0x76, 0x24, 0x28, 0x32, 0xcf, 0x6c, 0x78, 0xbe, 0x2b, 0x5d, 0xb2, + 0xa6, 0x96, 0x97, 0x8f, 0x1b, 0xe7, 0x5c, 0xb2, 0xc7, 0xbb, 0x9f, 0x8f, 0x5c, 0x77, 0x64, 0xf1, + 0x47, 0xcc, 0x33, 0x1f, 0x31, 0xc7, 0x71, 0x25, 0x93, 0xa6, 0xeb, 0x88, 0x00, 0xab, 0xbf, 0x86, + 0xf2, 0xb7, 0x9c, 0x09, 0xf3, 0xdc, 0xe2, 0x7d, 0x8f, 0x0d, 0x39, 0xa9, 0x42, 0xde, 0x66, 0x57, + 0x75, 0x6d, 0x5f, 0x3b, 0x28, 0x52, 0xb5, 0x44, 0x89, 0xe9, 0xd4, 0x73, 0xa1, 0xc4, 0x74, 0x08, + 0x81, 0x82, 0x65, 0x0a, 0x59, 0xcf, 0xef, 0xe7, 0x0f, 0x8a, 0x14, 0xd7, 0x4a, 0x26, 0x24, 0xf7, + 0xea, 0x05, 0x84, 0xe1, 0x5a, 0xff, 0x9b, 0x06, 0xe5, 0x97, 0xcc, 0x67, 0x36, 0x97, 0xdc, 0xef, + 0x7b, 0x7c, 0xa8, 0x50, 0x0e, 0xb3, 0x79, 0xe8, 0x1e, 0xd7, 0xe4, 0x39, 0x54, 0xbc, 0x29, 0xc8, + 0x90, 0x13, 0x8f, 0xe3, 0x51, 0x95, 0xe6, 0x5e, 0x23, 0x99, 0x47, 0x23, 0x72, 0x34, 0x98, 0x78, + 0x9c, 0x96, 0xbd, 0xe4, 0x56, 0xf9, 0x78, 0x13, 0xa6, 0x61, 0x08, 0x95, 0x47, 0x3d, 0xbf, 0xaf, + 0x1d, 0x94, 0x66, 0x7d, 0xa4, 0x52, 0xa5, 0xe5, 0x37, 0xc9, 0xad, 0xfe, 0x77, 0x0d, 0xca, 0xbd, + 0xf3, 0x77, 0x7c, 0x28, 0xcd, 0x4b, 0x8e, 0xd1, 0x3e, 0x82, 0x02, 0xc6, 0xa3, 0x65, 0xc5, 0x13, + 0x41, 0x31, 0x1e, 0x04, 0xaa, 0xf4, 0x46, 0x2e, 0xb3, 0x30, 0x01, 0x8d, 0xe2, 0x9a, 0x34, 0x61, + 0xcb, 0x9d, 0x42, 0x0d, 0x9b, 0x4b, 0xdf, 0x1c, 0x1a, 0x58, 0x83, 0x3c, 0xd6, 0x60, 0x33, 0x52, + 0x9e, 0xa2, 0xae, 0xab, 0x4a, 0xf2, 0x04, 0xb6, 0xd9, 0xc5, 0x85, 0xa9, 0x2e, 0x8a, 0x59, 0x49, + 0x23, 0x51, 0x2f, 0x60, 0xcd, 0xb7, 0x62, 0x75, 0x6c, 0x26, 0xf4, 0x67, 0x50, 0x3d, 0xb4, 0x46, + 0xae, 0x6f, 0xca, 0xb7, 0x76, 0x9f, 0x4b, 0x69, 0x3a, 0xa3, 0xcc, 0x92, 0xd7, 0x60, 0xe9, 0x92, + 0x59, 0x63, 0x1e, 0x5e, 0x6a, 0xb0, 0xd1, 0x37, 0x61, 0xa3, 0xcd, 0x7c, 0x6b, 0xd2, 0x97, 0xae, + 0xe7, 0x99, 0xce, 0x48, 0xd5, 0x40, 0xff, 0xb7, 0x06, 0xe5, 0xd8, 0xa7, 0xaa, 0xca, 0x0f, 0xa1, + 0xc2, 0xa6, 0x02, 0x23, 0xe1, 0xba, 0x1c, 0x49, 0x31, 0x87, 0x17, 0xb0, 0x11, 0xc3, 0x44, 0x10, + 0x4c, 0x3d, 0xb7, 0x9f, 0x3f, 0x28, 0x35, 0xbf, 0x48, 0x57, 0x72, 0x36, 0x64, 0x5a, 0x65, 0xb3, + 0x49, 0xf4, 0x60, 0x93, 0xab, 0xd0, 0x0c, 0x11, 0xc6, 0x66, 0x08, 0x8f, 0x0f, 0xc3, 0x4b, 0xbe, + 0x9b, 0x76, 0x37, 0x97, 0x03, 0xdd, 0xe0, 0x73, 0x69, 0xfd, 0x4b, 0x83, 0x62, 0x97, 0x89, 0x96, + 0xeb, 0xbc, 0x31, 0x47, 0xe4, 0x19, 0xac, 0x8d, 0x7c, 0xe6, 0xbd, 0x35, 0x86, 0xb8, 0xc7, 0x84, + 0x4a, 0xcd, 0x9d, 0xb4, 0xdf, 0x63, 0x85, 0x08, 0x0c, 0x68, 0x69, 0x14, 0x6f, 0xc8, 0x73, 0x00, + 0xd7, 0xe3, 0x7e, 0x30, 0x57, 0x58, 0xd2, 0x52, 0x53, 0x4f, 0xdb, 0x46, 0x47, 0x35, 0x7a, 0x11, + 0x92, 0x26, 0xac, 0x76, 0x5b, 0x00, 0xb1, 0x86, 0xfc, 0x14, 0x8a, 0x91, 0xae, 0xae, 0x61, 0xcd, + 0xb6, 0x67, 0xba, 0x6f, 0xaa, 0xa6, 0x31, 0x52, 0xf7, 0xa0, 0x94, 0x08, 0x92, 0x7c, 0x0f, 0xc0, + 0x19, 0xdb, 0x86, 0xc5, 0x26, 0xdc, 0x17, 0x98, 0xd3, 0x12, 0x2d, 0x3a, 0x63, 0xfb, 0x04, 0x05, + 0xe4, 0x2e, 0x94, 0x4c, 0xc7, 0x1b, 0x4b, 0x43, 0x98, 0x7f, 0xe0, 0x02, 0xaf, 0x66, 0x89, 0x02, + 0x8a, 0xfa, 0x4a, 0x42, 0xee, 0xc1, 0x9a, 0x3b, 0x96, 0x31, 0x22, 0x8f, 0x88, 0x52, 0x20, 0x43, + 0x08, 0x96, 0x31, 0x0a, 0x45, 0x75, 0x46, 0x14, 0x8c, 0x11, 0x4d, 0x4e, 0x91, 0x96, 0x23, 0x29, + 0x0e, 0x6b, 0x0f, 0xd6, 0xe3, 0x81, 0x57, 0xf7, 0x38, 0x2d, 0xda, 0xfd, 0x05, 0x39, 0x36, 0x52, + 0x24, 0x22, 0x68, 0xcc, 0x17, 0xb8, 0xdf, 0x3d, 0x85, 0x4a, 0x1a, 0x41, 0xbe, 0x01, 0x88, 0x30, + 0x22, 0xac, 0xe0, 0x22, 0x3e, 0xc1, 0x16, 0x49, 0xc0, 0xf5, 0xf7, 0x05, 0xa8, 0xb4, 0xaf, 0x3c, + 0xee, 0x9b, 0x36, 0x77, 0x24, 0xf6, 0xfc, 0x60, 0x3e, 0xe4, 0xa0, 0x47, 0x1e, 0xcc, 0xf4, 0x5e, + 0xca, 0xec, 0x86, 0xb8, 0xc9, 0xcf, 0xa0, 0x18, 0x4d, 0x7f, 0x58, 0x82, 0x45, 0x24, 0x83, 0x41, + 0xc6, 0x68, 0x65, 0x1a, 0x0d, 0x49, 0x36, 0xd7, 0xa5, 0x86, 0x96, 0xc6, 0x68, 0x75, 0x4b, 0xd2, + 0x37, 0x99, 0x65, 0x48, 0x6e, 0x7b, 0x16, 0x93, 0x3c, 0xe4, 0xec, 0x32, 0x4a, 0x07, 0xa1, 0x90, + 0xfc, 0x04, 0x3e, 0x0b, 0x88, 0x47, 0x18, 0x43, 0xd7, 0xb2, 0xf8, 0x50, 0xba, 0x41, 0xea, 0xf5, + 0x25, 0x84, 0xd7, 0x42, 0x6d, 0x6b, 0xaa, 0xc4, 0x42, 0x7d, 0x0d, 0x35, 0x95, 0xa4, 0x65, 0x71, + 0xcb, 0x08, 0x4e, 0x19, 0xba, 0x63, 0x47, 0xd6, 0x97, 0xb1, 0xfb, 0xc8, 0x54, 0x37, 0x50, 0xaa, + 0x96, 0xd2, 0x90, 0xfb, 0xb0, 0x6e, 0xb3, 0xab, 0x14, 0x78, 0x05, 0xc1, 0x65, 0x9b, 0x5d, 0x25, + 0x70, 0x4f, 0x00, 0x1c, 0x26, 0xa6, 0x13, 0xba, 0x8a, 0x29, 0x6f, 0x2f, 0x98, 0x32, 0x5a, 0x74, + 0xa6, 0xcb, 0xff, 0x75, 0x73, 0x50, 0x80, 0xf8, 0x92, 0x33, 0xc9, 0xf5, 0x6b, 0x28, 0x60, 0x99, + 0x82, 0x0b, 0xfd, 0xfc, 0xba, 0x06, 0xa1, 0x88, 0xd4, 0x7f, 0x01, 0x9b, 0xd1, 0x81, 0x87, 0x42, + 0x98, 0x23, 0x67, 0xa1, 0xf3, 0x6c, 0xe6, 0x6e, 0xc2, 0x72, 0xf0, 0x19, 0xf8, 0x08, 0x9b, 0x57, + 0x50, 0x0c, 0x6c, 0x4e, 0x5c, 0xa4, 0x0a, 0x69, 0xda, 0xdc, 0x10, 0x92, 0xd9, 0x5e, 0x68, 0x5c, + 0x54, 0x92, 0xbe, 0x12, 0x90, 0x87, 0xb0, 0x1c, 0xdc, 0x76, 0x98, 0x54, 0x2d, 0x9d, 0x54, 0xe0, + 0x87, 0x86, 0x18, 0xfd, 0xe7, 0x50, 0xea, 0x9d, 0x0b, 0xee, 0x5f, 0x06, 0xac, 0xd0, 0x80, 0x95, + 0xb0, 0x55, 0xc2, 0x5a, 0x67, 0x5b, 0x4f, 0x41, 0xfa, 0x77, 0x50, 0x49, 0x98, 0xab, 0xe8, 0x9e, + 0x42, 0x29, 0xfc, 0x06, 0x5a, 0xee, 0x48, 0x64, 0x13, 0x62, 0x94, 0x0b, 0x05, 0x7b, 0xba, 0x14, + 0xfa, 0x9f, 0xf2, 0x50, 0xc4, 0x1e, 0xc2, 0xe6, 0xfc, 0x12, 0xd6, 0x79, 0x54, 0xff, 0xe4, 0xa7, + 0xab, 0x12, 0x8b, 0xf1, 0xdb, 0xf5, 0x09, 0x83, 0xc9, 0x60, 0x2b, 0x66, 0x0a, 0x16, 0x5d, 0xa6, + 0x08, 0x87, 0xf4, 0x61, 0xda, 0x4d, 0x14, 0x5b, 0x23, 0xa3, 0x01, 0x04, 0xad, 0x79, 0x19, 0x52, + 0xb2, 0x03, 0xab, 0xfe, 0xd8, 0x09, 0x66, 0x31, 0x18, 0xdd, 0x15, 0x7f, 0xec, 0x60, 0x86, 0xb7, + 0x1a, 0xda, 0xdd, 0xd7, 0x50, 0xcb, 0x3a, 0x9e, 0xb4, 0xa0, 0x94, 0xcc, 0x20, 0xa8, 0xfb, 0xbd, + 0x05, 0x93, 0x12, 0x1b, 0xd2, 0xa4, 0x95, 0xfe, 0x8f, 0x1c, 0x94, 0x82, 0x34, 0x25, 0x93, 0x63, + 0xa1, 0x5a, 0x4d, 0x48, 0xe6, 0x4b, 0x43, 0xb5, 0xd7, 0xb4, 0xd5, 0x50, 0x32, 0x30, 0x6d, 0xae, + 0xee, 0x68, 0xe8, 0xda, 0x9e, 0xc5, 0x83, 0x8f, 0x88, 0xc2, 0x04, 0x6d, 0x5b, 0x89, 0xc5, 0x08, + 0xfc, 0x0e, 0x8a, 0x43, 0xd7, 0x09, 0x5e, 0x41, 0x58, 0xdc, 0x4a, 0x76, 0x71, 0xf1, 0xd4, 0x46, + 0x48, 0x24, 0x21, 0x1e, 0x9f, 0x6c, 0xb1, 0x39, 0xf9, 0x06, 0x4a, 0x6e, 0xdc, 0x72, 0x58, 0xd4, + 0xb9, 0xcf, 0x7f, 0xa2, 0x27, 0x69, 0x12, 0xad, 0x9f, 0x03, 0x99, 0xf7, 0x4e, 0x4a, 0xb0, 0xd2, + 0xa2, 0xed, 0xc3, 0x41, 0xfb, 0xa8, 0x7a, 0x47, 0x6d, 0xe8, 0x59, 0xb7, 0xdb, 0xe9, 0x1e, 0x57, + 0x35, 0x52, 0x86, 0x62, 0xff, 0xac, 0xd5, 0x6a, 0xb7, 0x8f, 0xda, 0x47, 0xd5, 0x1c, 0x01, 0x58, + 0x7e, 0xd1, 0x39, 0x39, 0x69, 0x1f, 0x55, 0xf3, 0x6a, 0xfd, 0xed, 0x61, 0x47, 0xad, 0x0b, 0xca, + 0xe6, 0xac, 0xfb, 0xa2, 0xdb, 0xfb, 0x55, 0xb7, 0xba, 0xa4, 0xff, 0x11, 0x96, 0xf0, 0x8c, 0xcc, + 0xf9, 0x7e, 0x90, 0x22, 0x9c, 0xed, 0x05, 0x1d, 0x16, 0x70, 0x0d, 0x79, 0x0c, 0xcb, 0x02, 0x4b, + 0x12, 0x36, 0xe4, 0xce, 0xc2, 0x9a, 0xd1, 0x10, 0xa8, 0xff, 0x59, 0x83, 0x3d, 0xca, 0x3d, 0xd7, + 0x97, 0xe9, 0xb9, 0xa4, 0xfc, 0xf7, 0x63, 0x2e, 0x24, 0x92, 0x07, 0xb2, 0x77, 0x22, 0xb2, 0x22, + 0x4a, 0x70, 0x98, 0xda, 0xb0, 0x9e, 0x28, 0x97, 0x1a, 0xe1, 0x6c, 0x6a, 0x9c, 0x71, 0x5e, 0x71, + 0x53, 0x7b, 0x7d, 0x0f, 0x76, 0xb2, 0x83, 0xf0, 0xac, 0x89, 0xfe, 0x0c, 0xf6, 0x8e, 0xb8, 0xc5, + 0x25, 0xbf, 0x4d, 0x84, 0xca, 0x75, 0xb6, 0xb5, 0x72, 0xfd, 0x17, 0x0d, 0xea, 0xc7, 0xfc, 0x76, + 0xa9, 0xdf, 0x8d, 0x88, 0x0b, 0xf5, 0x41, 0x23, 0x87, 0xfc, 0x84, 0x80, 0xf4, 0x30, 0xe4, 0x67, + 0x87, 0x61, 0x07, 0x56, 0xb9, 0x73, 0x11, 0x28, 0xc3, 0x49, 0xe7, 0xce, 0x85, 0x52, 0xe9, 0x06, + 0x7c, 0x96, 0x11, 0x95, 0x67, 0x4d, 0xb2, 0xea, 0xad, 0xdd, 0xa2, 0xde, 0x7f, 0xd5, 0x60, 0xeb, + 0x98, 0xcb, 0xfe, 0x78, 0x34, 0xe2, 0x22, 0x78, 0xb0, 0x86, 0x49, 0x3f, 0x05, 0x88, 0xf9, 0x32, + 0xf4, 0x5d, 0x5f, 0xf4, 0x99, 0xa3, 0x09, 0x2c, 0x79, 0x00, 0xcb, 0x58, 0x1c, 0x11, 0xfe, 0x10, + 0xd8, 0xcc, 0x68, 0x3e, 0x1a, 0x42, 0xd4, 0x3b, 0xc5, 0x0f, 0x4e, 0x34, 0x9c, 0xb1, 0x7d, 0xce, + 0x7d, 0xac, 0xcf, 0x12, 0x2d, 0x87, 0xd2, 0x2e, 0x0a, 0xf5, 0xf7, 0x39, 0xd8, 0x9c, 0x8d, 0x53, + 0x95, 0xe1, 0x77, 0x8b, 0x88, 0x38, 0xa0, 0xb1, 0x27, 0x33, 0x8f, 0xfb, 0x79, 0x0f, 0x1f, 0x43, + 0xc9, 0xa9, 0xe7, 0x58, 0xee, 0x63, 0x9e, 0x63, 0xff, 0x5f, 0xf2, 0xfd, 0x2d, 0xec, 0xff, 0x92, + 0x59, 0xe6, 0x05, 0x93, 0x7c, 0xf6, 0x57, 0xd6, 0xa7, 0x5f, 0xa7, 0xbe, 0x0f, 0x5f, 0x5c, 0xe3, + 0xdd, 0xb3, 0x26, 0x5f, 0x9d, 0x25, 0xfe, 0x00, 0x40, 0x5a, 0xac, 0xc2, 0x5a, 0xc8, 0x6a, 0xc6, + 0xe0, 0xd7, 0x2f, 0xdb, 0xd5, 0x3b, 0x8a, 0xf3, 0x8e, 0x7a, 0x67, 0xcf, 0x4f, 0xda, 0x55, 0x8d, + 0xac, 0x40, 0xbe, 0xd3, 0x1d, 0x54, 0x73, 0x64, 0x0d, 0x56, 0x8f, 0x3a, 0xfd, 0x16, 0x6d, 0x0f, + 0xda, 0xd5, 0x3c, 0x59, 0x87, 0x52, 0xeb, 0x70, 0xd0, 0x3e, 0xee, 0xd1, 0x4e, 0xeb, 0xf0, 0xa4, + 0x5a, 0xf8, 0xea, 0x69, 0xe2, 0x97, 0xfa, 0x94, 0x6d, 0xa7, 0x64, 0x79, 0x47, 0x19, 0x9f, 0x76, + 0xba, 0x9d, 0xd3, 0xce, 0x6f, 0x94, 0x4f, 0xb5, 0x3b, 0x7c, 0x15, 0xec, 0x72, 0xcd, 0x7f, 0xe6, + 0x60, 0xe5, 0x94, 0x39, 0x6c, 0xc4, 0x7d, 0xf2, 0x0e, 0x6a, 0x59, 0x8c, 0x42, 0x7e, 0x94, 0x4e, + 0xfe, 0x1a, 0xea, 0xdb, 0xfd, 0xf2, 0x43, 0xa0, 0xaa, 0x1b, 0x19, 0x6c, 0xcc, 0x8d, 0x2b, 0xb9, + 0x3f, 0xd7, 0x83, 0xd9, 0xa7, 0xfc, 0xe0, 0x46, 0x9c, 0x3a, 0xe2, 0x1d, 0xd4, 0xb2, 0x58, 0x6c, + 0x36, 0x9d, 0x6b, 0x78, 0x72, 0x36, 0x9d, 0x85, 0xa4, 0xd8, 0xfc, 0x8f, 0x06, 0x10, 0xcf, 0x0b, + 0x79, 0x05, 0x95, 0xf4, 0x00, 0x91, 0xef, 0x5f, 0x3f, 0x5e, 0xc1, 0x71, 0xf7, 0x6e, 0x9c, 0x41, + 0x32, 0x81, 0x9d, 0x85, 0x2d, 0x46, 0x1a, 0x69, 0xfb, 0x9b, 0x3a, 0x7d, 0xf7, 0xe1, 0x07, 0xe3, + 0x55, 0x8e, 0xeb, 0x50, 0x4e, 0xfd, 0x95, 0x70, 0xbe, 0x8c, 0x7f, 0x99, 0xfd, 0xf8, 0xbf, 0x01, + 0x00, 0x00, 0xff, 0xff, 0xbd, 0xb6, 0x8c, 0x15, 0x6b, 0x13, 0x00, 0x00, +} diff --git a/pkg/apis/manager/v1beta1/api.pb.gw.go b/pkg/apis/manager/v1beta1/api.pb.gw.go new file mode 100644 index 00000000000..3384a90d338 --- /dev/null +++ b/pkg/apis/manager/v1beta1/api.pb.gw.go @@ -0,0 +1,218 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: api.proto + +/* +Package api_v1_beta1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package api_v1_beta1 + +import ( + "io" + "net/http" + + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "golang.org/x/net/context" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/status" +) + +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray + +func request_Manager_ReportObservationLog_0(ctx context.Context, marshaler runtime.Marshaler, client ManagerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ReportObservationLogRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ReportObservationLog(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func request_Manager_GetObservationLog_0(ctx context.Context, marshaler runtime.Marshaler, client ManagerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetObservationLogRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.GetObservationLog(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func request_Manager_DeleteObservationLog_0(ctx context.Context, marshaler runtime.Marshaler, client ManagerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DeleteObservationLogRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["trial_name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "trial_name") + } + + protoReq.TrialName, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "trial_name", err) + } + + msg, err := client.DeleteObservationLog(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +// RegisterManagerHandlerFromEndpoint is same as RegisterManagerHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterManagerHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Printf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Printf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterManagerHandler(ctx, mux, conn) +} + +// RegisterManagerHandler registers the http handlers for service Manager to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterManagerHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + client := NewManagerClient(conn) + + mux.Handle("POST", pattern_Manager_ReportObservationLog_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Manager_ReportObservationLog_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Manager_ReportObservationLog_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Manager_GetObservationLog_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Manager_GetObservationLog_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Manager_GetObservationLog_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_Manager_DeleteObservationLog_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Manager_DeleteObservationLog_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Manager_DeleteObservationLog_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_Manager_ReportObservationLog_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "Manager", "ReportObservationLog"}, "")) + + pattern_Manager_GetObservationLog_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "Manager", "GetObservationLog"}, "")) + + pattern_Manager_DeleteObservationLog_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "Manager", "DeleteObservationLog", "trial_name"}, "")) +) + +var ( + forward_Manager_ReportObservationLog_0 = runtime.ForwardResponseMessage + + forward_Manager_GetObservationLog_0 = runtime.ForwardResponseMessage + + forward_Manager_DeleteObservationLog_0 = runtime.ForwardResponseMessage +) diff --git a/pkg/apis/manager/v1beta1/api.proto b/pkg/apis/manager/v1beta1/api.proto new file mode 100644 index 00000000000..34b60a71b31 --- /dev/null +++ b/pkg/apis/manager/v1beta1/api.proto @@ -0,0 +1,278 @@ +/** + * Katib API v1beta1 + */ +syntax = "proto3"; + +package api.v1.beta1; + +import "google/api/annotations.proto"; + +/** + * Service for Main API for Katib + * For each RPC service, we define mapping to HTTP REST API method. + * The mapping includes the URL path, query parameters and request body. + * https://cloud.google.com/service-infrastructure/docs/service-management/reference/rpc/google.api#http + */ +service Manager { + /** + * Report a log of Observations for a Trial. + * The log consists of timestamp and value of metric. + * Katib store every log of metrics. + * You can see accuracy curve or other metric logs on UI. + */ + rpc ReportObservationLog(ReportObservationLogRequest) returns (ReportObservationLogReply); + + /** + * Get all log of Observations for a Trial. + */ + rpc GetObservationLog(GetObservationLogRequest) returns (GetObservationLogReply); + + /** + * Delete all log of Observations for a Trial. + */ + rpc DeleteObservationLog(DeleteObservationLogRequest) returns (DeleteObservationLogReply); +} + +service Suggestion { + rpc GetSuggestions(GetSuggestionsRequest) returns (GetSuggestionsReply); + rpc ValidateAlgorithmSettings(ValidateAlgorithmSettingsRequest) returns (ValidateAlgorithmSettingsReply); +} + +service EarlyStopping { +//TODO: This feature is not yet fully implemented. +} + +/** + * Types of value for HyperParameter. + */ +enum ParameterType { + UNKNOWN_TYPE = 0; /// Undefined type and not used. + DOUBLE = 1; /// Double float type. Use "Max/Min". + INT = 2; /// Int type. Use "Max/Min". + DISCRETE = 3; /// Discrete number type. Use "List" as float. + CATEGORICAL = 4; /// Categorical type. Use "List" as string. +} + + +/** + * Feasible space for optimization. + * Int and Double type use Max/Min. + * Discrete and Categorical type use List. + */ +message FeasibleSpace { + string max = 1; /// Max Value + string min = 2; /// Minimum Value + repeated string list = 3; /// List of Values. + string step = 4; /// Step for double or int parameter +} + +/** + * Config for a Hyper parameter. + * Katib will create each Hyper parameter from this config. + */ +message ParameterSpec { + string name = 1; /// Name of the parameter. + ParameterType parameter_type = 2; /// Type of the parameter. + FeasibleSpace feasible_space = 3; /// FeasibleSpace for the parameter. +} + +/** + * Direction of optimization. Minimize or Maximize. + */ +enum ObjectiveType { + UNKNOWN = 0; /// Undefined type and not used. + MINIMIZE = 1; /// Minimize + MAXIMIZE = 2; /// Maximize +} + +message ObjectiveSpec{ + ObjectiveType type = 1; + double goal = 2; + string objective_metric_name = 3; + repeated string additional_metric_names = 4; + /// This can be empty if we only care about the objective metric. +} + +message AlgorithmSetting { + string name = 1; + string value = 2; +} + +message EarlyStoppingSpec { +//TODO: This feature is not yet fully implemented. +} + +message AlgorithmSpec { + string algorithm_name = 1; + repeated AlgorithmSetting algorithm_setting = 2; + EarlyStoppingSpec early_stopping_spec = 3; +} + +/** + * NasConfig contains a config of NAS job + */ + message NasConfig { + GraphConfig graph_config = 1; /// Config of DAG + message Operations { + repeated Operation operation = 1; + } + Operations operations = 2; /// List of Operation +} + +/** + * GraphConfig contains a config of DAG + */ + message GraphConfig { + int32 num_layers = 1; /// Number of layers + repeated int32 input_sizes = 2; /// Dimensions of input size + repeated int32 output_sizes = 3; /// Dimensions of output size +} + +/** + * Config for operations in DAG + */ + message Operation { + string operation_type = 1; /// Type of operation in DAG + /** + * List of ParameterSpec + */ + message ParameterSpecs { + repeated ParameterSpec parameters = 1; + } + ParameterSpecs parameter_specs = 2; +} + +/** + * Spec of a Experiment. Experiment represents a single optimization run over a feasible space. + * Each Experiment contains a configuration describing the feasible space, as well as a set of Trials. + * It is assumed that objective function f(x) does not change in the course of a Experiment. + */ +message ExperimentSpec { + /** + * List of ParameterSpec + */ + message ParameterSpecs { + repeated ParameterSpec parameters = 1; + } + ParameterSpecs parameter_specs = 1; + ObjectiveSpec objective = 2; + AlgorithmSpec algorithm = 3; + string trial_template = 4; + string metrics_collector_spec = 5; + int32 parallel_trial_count = 6; + int32 max_trial_count = 7; + NasConfig nas_config = 8; +} + +message Experiment { + string name = 1; /// Name of Experiment. This is unique in DB. + ExperimentSpec spec = 2; +} + +message ParameterAssignment { + string name = 1; + string value = 2; +} + +message Metric { + string name = 1; + string value = 2; +} + +message MetricLog { + string time_stamp = 1; /// RFC3339 format + Metric metric = 2; +} + +message Observation { + repeated Metric metrics = 1; +} + +message ObservationLog { + repeated MetricLog metric_logs = 1; +} + +message TrialSpec { + /** + * List of ParameterAssignment + */ + message ParameterAssignments{ + repeated ParameterAssignment assignments = 1; + } + string experiment_name = 1; + ObjectiveSpec objective = 2; + ParameterAssignments parameter_assignments = 3; + string run_spec = 4; + string metrics_collector_spec = 5; +} + +message TrialStatus { + enum TrialConditionType { + CREATED = 0; + RUNNING = 1; + SUCCEEDED = 2; + KILLED = 3; + FAILED = 4; + UNKNOWN = 5; + } + string start_time = 1; /// RFC3339 format + string completion_time = 2; /// RFC3339 format + TrialConditionType condition = 3; + Observation observation = 4; /// The best observation in logs. +} + +message Trial { + string name = 1; + TrialSpec spec = 2; + TrialStatus status = 3; +} + +message ReportObservationLogRequest { + string trial_name = 1; + ObservationLog observation_log = 2; +} + +message ReportObservationLogReply { +} + +message DeleteObservationLogRequest { + string trial_name = 1; +} + +message DeleteObservationLogReply { +} + +message GetObservationLogRequest { + string trial_name = 1; + string metric_name = 2; + string start_time = 3; ///The start of the time range. RFC3339 format + string end_time = 4; ///The end of the time range. RFC3339 format +} + +message GetObservationLogReply { + ObservationLog observation_log = 1; +} + +message GetSuggestionsRequest { + Experiment experiment = 1; + repeated Trial trials = 2; // all completed trials owned by the experiment. + int32 request_number = 3; ///The number of Suggestion you request at one time. When you set 3 to request_number, you can get three Suggestions at one time. +} + +message GetSuggestionsReply { + message ParameterAssignments{ + repeated ParameterAssignment assignments = 1; + } + repeated ParameterAssignments parameter_assignments = 1; + AlgorithmSpec algorithm = 2; +} + +message ValidateAlgorithmSettingsRequest { + Experiment experiment = 1; +} + +/** + * Return INVALID_ARGUMENT Error if Algorithm Settings are not Valid + */ +message ValidateAlgorithmSettingsReply { +} diff --git a/pkg/apis/manager/v1beta1/api.swagger.json b/pkg/apis/manager/v1beta1/api.swagger.json new file mode 100644 index 00000000000..6eee2780c09 --- /dev/null +++ b/pkg/apis/manager/v1beta1/api.swagger.json @@ -0,0 +1,138 @@ +{ + "swagger": "2.0", + "info": { + "title": "api.proto", + "version": "version not set" + }, + "schemes": [ + "http", + "https" + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "paths": {}, + "definitions": { + "beta1AlgorithmSetting": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, + "beta1AlgorithmSpec": { + "type": "object", + "properties": { + "algorithm_name": { + "type": "string" + }, + "algorithm_setting": { + "type": "array", + "items": { + "$ref": "#/definitions/beta1AlgorithmSetting" + } + }, + "early_stopping_spec": { + "$ref": "#/definitions/beta1EarlyStoppingSpec" + } + } + }, + "beta1DeleteObservationLogReply": { + "type": "object" + }, + "beta1EarlyStoppingSpec": { + "type": "object" + }, + "beta1GetObservationLogReply": { + "type": "object", + "properties": { + "observation_log": { + "$ref": "#/definitions/beta1ObservationLog" + } + } + }, + "beta1GetSuggestionsReply": { + "type": "object", + "properties": { + "parameter_assignments": { + "type": "array", + "items": { + "$ref": "#/definitions/beta1GetSuggestionsReplyParameterAssignments" + } + }, + "algorithm": { + "$ref": "#/definitions/beta1AlgorithmSpec" + } + } + }, + "beta1GetSuggestionsReplyParameterAssignments": { + "type": "object", + "properties": { + "assignments": { + "type": "array", + "items": { + "$ref": "#/definitions/beta1ParameterAssignment" + } + } + } + }, + "beta1Metric": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, + "beta1MetricLog": { + "type": "object", + "properties": { + "time_stamp": { + "type": "string" + }, + "metric": { + "$ref": "#/definitions/beta1Metric" + } + } + }, + "beta1ObservationLog": { + "type": "object", + "properties": { + "metric_logs": { + "type": "array", + "items": { + "$ref": "#/definitions/beta1MetricLog" + } + } + } + }, + "beta1ParameterAssignment": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, + "beta1ReportObservationLogReply": { + "type": "object" + }, + "beta1ValidateAlgorithmSettingsReply": { + "type": "object", + "title": "*\nReturn INVALID_ARGUMENT Error if Algorithm Settings are not Valid" + } + } +} diff --git a/pkg/apis/manager/v1beta1/build.sh b/pkg/apis/manager/v1beta1/build.sh new file mode 100755 index 00000000000..74a1f5b2a18 --- /dev/null +++ b/pkg/apis/manager/v1beta1/build.sh @@ -0,0 +1,11 @@ +set -x +set -e +for proto in api.proto; do + docker run -it --rm -v $PWD:$(pwd) -w $(pwd) znly/protoc --python_out=plugins=grpc:./python --go_out=plugins=grpc:. -I. $proto + docker run -it --rm -v $PWD:$(pwd) -w $(pwd) znly/protoc --plugin=protoc-gen-grpc=/usr/bin/grpc_python_plugin --python_out=./python --grpc_out=./python -I. $proto + docker run -it --rm -v $PWD:$(pwd) -w $(pwd) znly/protoc --grpc-gateway_out=logtostderr=true:. -I. $proto + docker run -it --rm -v $PWD:$(pwd) -w $(pwd) znly/protoc --swagger_out=logtostderr=true:. -I. $proto +done +docker build -t protoc-gen-doc gen-doc/ +docker run --rm -v $PWD/gen-doc:/out -v $PWD:/apiprotos protoc-gen-doc --doc_opt=markdown,api.md -I /protobuf -I /apiprotos api.proto +docker run --rm -v $PWD/gen-doc:/out -v $PWD:/apiprotos protoc-gen-doc --doc_opt=html,index.html -I /protobuf -I /apiprotos api.proto diff --git a/pkg/apis/manager/v1beta1/gen-doc/Dockerfile b/pkg/apis/manager/v1beta1/gen-doc/Dockerfile new file mode 100644 index 00000000000..afaba128816 --- /dev/null +++ b/pkg/apis/manager/v1beta1/gen-doc/Dockerfile @@ -0,0 +1,17 @@ +FROM pseudomuto/protoc-gen-doc +RUN apt-get -q -y update && apt-get -q -y install curl && \ + mkdir -p /protobuf/google/protobuf && \ + for f in any duration descriptor empty struct timestamp wrappers; do \ + curl -L -o /protobuf/google/protobuf/${f}.proto https://raw.githubusercontent.com/google/protobuf/master/src/google/protobuf/${f}.proto; \ + done && \ + mkdir -p /protobuf/google/api && \ + for f in annotations http; do \ + curl -L -o /protobuf/google/api/${f}.proto https://raw.githubusercontent.com/grpc-ecosystem/grpc-gateway/master/third_party/googleapis/google/api/${f}.proto; \ + done && \ + mkdir -p /protobuf/github.com/gogo/protobuf/gogoproto && \ + curl -L -o /protobuf/github.com/gogo/protobuf/gogoproto/gogo.proto https://raw.githubusercontent.com/gogo/protobuf/master/gogoproto/gogo.proto && \ + mkdir -p /protobuf/github.com/mwitkow/go-proto-validators && \ + curl -L -o /protobuf/github.com/mwitkow/go-proto-validators/validator.proto https://raw.githubusercontent.com/mwitkow/go-proto-validators/master/validator.proto && \ + apt-get remove --purge -y curl && \ + apt-get -y autoremove && \ + rm -rf /var/lib/apt/lists/* diff --git a/pkg/apis/manager/v1beta1/gen-doc/api.md b/pkg/apis/manager/v1beta1/gen-doc/api.md new file mode 100644 index 00000000000..d28e64b1d30 --- /dev/null +++ b/pkg/apis/manager/v1beta1/gen-doc/api.md @@ -0,0 +1,705 @@ +# Protocol Documentation + + +## Table of Contents + +- [api.proto](#api.proto) + - [AlgorithmSetting](#api.v1.beta1.AlgorithmSetting) + - [AlgorithmSpec](#api.v1.beta1.AlgorithmSpec) + - [DeleteObservationLogReply](#api.v1.beta1.DeleteObservationLogReply) + - [DeleteObservationLogRequest](#api.v1.beta1.DeleteObservationLogRequest) + - [EarlyStoppingSpec](#api.v1.beta1.EarlyStoppingSpec) + - [Experiment](#api.v1.beta1.Experiment) + - [ExperimentSpec](#api.v1.beta1.ExperimentSpec) + - [ExperimentSpec.ParameterSpecs](#api.v1.beta1.ExperimentSpec.ParameterSpecs) + - [FeasibleSpace](#api.v1.beta1.FeasibleSpace) + - [GetObservationLogReply](#api.v1.beta1.GetObservationLogReply) + - [GetObservationLogRequest](#api.v1.beta1.GetObservationLogRequest) + - [GetSuggestionsReply](#api.v1.beta1.GetSuggestionsReply) + - [GetSuggestionsReply.ParameterAssignments](#api.v1.beta1.GetSuggestionsReply.ParameterAssignments) + - [GetSuggestionsRequest](#api.v1.beta1.GetSuggestionsRequest) + - [GraphConfig](#api.v1.beta1.GraphConfig) + - [Metric](#api.v1.beta1.Metric) + - [MetricLog](#api.v1.beta1.MetricLog) + - [NasConfig](#api.v1.beta1.NasConfig) + - [NasConfig.Operations](#api.v1.beta1.NasConfig.Operations) + - [ObjectiveSpec](#api.v1.beta1.ObjectiveSpec) + - [Observation](#api.v1.beta1.Observation) + - [ObservationLog](#api.v1.beta1.ObservationLog) + - [Operation](#api.v1.beta1.Operation) + - [Operation.ParameterSpecs](#api.v1.beta1.Operation.ParameterSpecs) + - [ParameterAssignment](#api.v1.beta1.ParameterAssignment) + - [ParameterSpec](#api.v1.beta1.ParameterSpec) + - [ReportObservationLogReply](#api.v1.beta1.ReportObservationLogReply) + - [ReportObservationLogRequest](#api.v1.beta1.ReportObservationLogRequest) + - [Trial](#api.v1.beta1.Trial) + - [TrialSpec](#api.v1.beta1.TrialSpec) + - [TrialSpec.ParameterAssignments](#api.v1.beta1.TrialSpec.ParameterAssignments) + - [TrialStatus](#api.v1.beta1.TrialStatus) + - [ValidateAlgorithmSettingsReply](#api.v1.beta1.ValidateAlgorithmSettingsReply) + - [ValidateAlgorithmSettingsRequest](#api.v1.beta1.ValidateAlgorithmSettingsRequest) + + - [ObjectiveType](#api.v1.beta1.ObjectiveType) + - [ParameterType](#api.v1.beta1.ParameterType) + - [TrialStatus.TrialConditionType](#api.v1.beta1.TrialStatus.TrialConditionType) + + - [EarlyStopping](#api.v1.beta1.EarlyStopping) + - [Manager](#api.v1.beta1.Manager) + - [Suggestion](#api.v1.beta1.Suggestion) + +- [Scalar Value Types](#scalar-value-types) + + + + +

Top

+ +## api.proto +Katib API v1beta1 + + + + +### AlgorithmSetting + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | +| value | [string](#string) | | | + + + + + + + + +### AlgorithmSpec + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| algorithm_name | [string](#string) | | | +| algorithm_setting | [AlgorithmSetting](#api.v1.beta1.AlgorithmSetting) | repeated | | +| early_stopping_spec | [EarlyStoppingSpec](#api.v1.beta1.EarlyStoppingSpec) | | | + + + + + + + + +### DeleteObservationLogReply + + + + + + + + + +### DeleteObservationLogRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| trial_name | [string](#string) | | | + + + + + + + + +### EarlyStoppingSpec +TODO: This feature is not yet fully implemented. + + + + + + + + +### Experiment + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | Name of Experiment. This is unique in DB. | +| spec | [ExperimentSpec](#api.v1.beta1.ExperimentSpec) | | | + + + + + + + + +### ExperimentSpec +Spec of a Experiment. Experiment represents a single optimization run over a feasible space. +Each Experiment contains a configuration describing the feasible space, as well as a set of Trials. +It is assumed that objective function f(x) does not change in the course of a Experiment. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| parameter_specs | [ExperimentSpec.ParameterSpecs](#api.v1.beta1.ExperimentSpec.ParameterSpecs) | | | +| objective | [ObjectiveSpec](#api.v1.beta1.ObjectiveSpec) | | | +| algorithm | [AlgorithmSpec](#api.v1.beta1.AlgorithmSpec) | | | +| trial_template | [string](#string) | | | +| metrics_collector_spec | [string](#string) | | | +| parallel_trial_count | [int32](#int32) | | | +| max_trial_count | [int32](#int32) | | | +| nas_config | [NasConfig](#api.v1.beta1.NasConfig) | | | + + + + + + + + +### ExperimentSpec.ParameterSpecs +List of ParameterSpec + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| parameters | [ParameterSpec](#api.v1.beta1.ParameterSpec) | repeated | | + + + + + + + + +### FeasibleSpace +Feasible space for optimization. +Int and Double type use Max/Min. +Discrete and Categorical type use List. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| max | [string](#string) | | Max Value | +| min | [string](#string) | | Minimum Value | +| list | [string](#string) | repeated | List of Values. | +| step | [string](#string) | | Step for double or int parameter | + + + + + + + + +### GetObservationLogReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| observation_log | [ObservationLog](#api.v1.beta1.ObservationLog) | | | + + + + + + + + +### GetObservationLogRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| trial_name | [string](#string) | | | +| metric_name | [string](#string) | | | +| start_time | [string](#string) | | The start of the time range. RFC3339 format | +| end_time | [string](#string) | | The end of the time range. RFC3339 format | + + + + + + + + +### GetSuggestionsReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| parameter_assignments | [GetSuggestionsReply.ParameterAssignments](#api.v1.beta1.GetSuggestionsReply.ParameterAssignments) | repeated | | +| algorithm | [AlgorithmSpec](#api.v1.beta1.AlgorithmSpec) | | | + + + + + + + + +### GetSuggestionsReply.ParameterAssignments + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| assignments | [ParameterAssignment](#api.v1.beta1.ParameterAssignment) | repeated | | + + + + + + + + +### GetSuggestionsRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| experiment | [Experiment](#api.v1.beta1.Experiment) | | | +| trials | [Trial](#api.v1.beta1.Trial) | repeated | all completed trials owned by the experiment. | +| request_number | [int32](#int32) | | The number of Suggestion you request at one time. When you set 3 to request_number, you can get three Suggestions at one time. | + + + + + + + + +### GraphConfig +GraphConfig contains a config of DAG + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| num_layers | [int32](#int32) | | Number of layers | +| input_sizes | [int32](#int32) | repeated | Dimensions of input size | +| output_sizes | [int32](#int32) | repeated | Dimensions of output size | + + + + + + + + +### Metric + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | +| value | [string](#string) | | | + + + + + + + + +### MetricLog + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| time_stamp | [string](#string) | | RFC3339 format | +| metric | [Metric](#api.v1.beta1.Metric) | | | + + + + + + + + +### NasConfig +NasConfig contains a config of NAS job + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| graph_config | [GraphConfig](#api.v1.beta1.GraphConfig) | | Config of DAG | +| operations | [NasConfig.Operations](#api.v1.beta1.NasConfig.Operations) | | List of Operation | + + + + + + + + +### NasConfig.Operations + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| operation | [Operation](#api.v1.beta1.Operation) | repeated | | + + + + + + + + +### ObjectiveSpec + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| type | [ObjectiveType](#api.v1.beta1.ObjectiveType) | | | +| goal | [double](#double) | | | +| objective_metric_name | [string](#string) | | | +| additional_metric_names | [string](#string) | repeated | This can be empty if we only care about the objective metric. | + + + + + + + + +### Observation + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| metrics | [Metric](#api.v1.beta1.Metric) | repeated | | + + + + + + + + +### ObservationLog + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| metric_logs | [MetricLog](#api.v1.beta1.MetricLog) | repeated | | + + + + + + + + +### Operation +Config for operations in DAG + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| operation_type | [string](#string) | | Type of operation in DAG | +| parameter_specs | [Operation.ParameterSpecs](#api.v1.beta1.Operation.ParameterSpecs) | | | + + + + + + + + +### Operation.ParameterSpecs +List of ParameterSpec + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| parameters | [ParameterSpec](#api.v1.beta1.ParameterSpec) | repeated | | + + + + + + + + +### ParameterAssignment + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | +| value | [string](#string) | | | + + + + + + + + +### ParameterSpec +Config for a Hyper parameter. +Katib will create each Hyper parameter from this config. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | Name of the parameter. | +| parameter_type | [ParameterType](#api.v1.beta1.ParameterType) | | Type of the parameter. | +| feasible_space | [FeasibleSpace](#api.v1.beta1.FeasibleSpace) | | FeasibleSpace for the parameter. | + + + + + + + + +### ReportObservationLogReply + + + + + + + + + +### ReportObservationLogRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| trial_name | [string](#string) | | | +| observation_log | [ObservationLog](#api.v1.beta1.ObservationLog) | | | + + + + + + + + +### Trial + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | +| spec | [TrialSpec](#api.v1.beta1.TrialSpec) | | | +| status | [TrialStatus](#api.v1.beta1.TrialStatus) | | | + + + + + + + + +### TrialSpec + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| experiment_name | [string](#string) | | | +| objective | [ObjectiveSpec](#api.v1.beta1.ObjectiveSpec) | | | +| parameter_assignments | [TrialSpec.ParameterAssignments](#api.v1.beta1.TrialSpec.ParameterAssignments) | | | +| run_spec | [string](#string) | | | +| metrics_collector_spec | [string](#string) | | | + + + + + + + + +### TrialSpec.ParameterAssignments +List of ParameterAssignment + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| assignments | [ParameterAssignment](#api.v1.beta1.ParameterAssignment) | repeated | | + + + + + + + + +### TrialStatus + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| start_time | [string](#string) | | RFC3339 format | +| completion_time | [string](#string) | | RFC3339 format | +| condition | [TrialStatus.TrialConditionType](#api.v1.beta1.TrialStatus.TrialConditionType) | | | +| observation | [Observation](#api.v1.beta1.Observation) | | The best observation in logs. | + + + + + + + + +### ValidateAlgorithmSettingsReply +Return INVALID_ARGUMENT Error if Algorithm Settings are not Valid + + + + + + + + +### ValidateAlgorithmSettingsRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| experiment | [Experiment](#api.v1.beta1.Experiment) | | | + + + + + + + + + + +### ObjectiveType +Direction of optimization. Minimize or Maximize. + +| Name | Number | Description | +| ---- | ------ | ----------- | +| UNKNOWN | 0 | Undefined type and not used. | +| MINIMIZE | 1 | Minimize | +| MAXIMIZE | 2 | Maximize | + + + + + +### ParameterType +Types of value for HyperParameter. + +| Name | Number | Description | +| ---- | ------ | ----------- | +| UNKNOWN_TYPE | 0 | Undefined type and not used. | +| DOUBLE | 1 | Double float type. Use "Max/Min". | +| INT | 2 | Int type. Use "Max/Min". | +| DISCRETE | 3 | Discrete number type. Use "List" as float. | +| CATEGORICAL | 4 | Categorical type. Use "List" as string. | + + + + + +### TrialStatus.TrialConditionType + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| CREATED | 0 | | +| RUNNING | 1 | | +| SUCCEEDED | 2 | | +| KILLED | 3 | | +| FAILED | 4 | | +| UNKNOWN | 5 | | + + + + + + + + + +### EarlyStopping +TODO: This feature is not yet fully implemented. + +| Method Name | Request Type | Response Type | Description | +| ----------- | ------------ | ------------- | ------------| + + + + +### Manager +Service for Main API for Katib +For each RPC service, we define mapping to HTTP REST API method. +The mapping includes the URL path, query parameters and request body. +https://cloud.google.com/service-infrastructure/docs/service-management/reference/rpc/google.api#http + +| Method Name | Request Type | Response Type | Description | +| ----------- | ------------ | ------------- | ------------| +| ReportObservationLog | [ReportObservationLogRequest](#api.v1.beta1.ReportObservationLogRequest) | [ReportObservationLogReply](#api.v1.beta1.ReportObservationLogReply) | Report a log of Observations for a Trial. The log consists of timestamp and value of metric. Katib store every log of metrics. You can see accuracy curve or other metric logs on UI. | +| GetObservationLog | [GetObservationLogRequest](#api.v1.beta1.GetObservationLogRequest) | [GetObservationLogReply](#api.v1.beta1.GetObservationLogReply) | Get all log of Observations for a Trial. | +| DeleteObservationLog | [DeleteObservationLogRequest](#api.v1.beta1.DeleteObservationLogRequest) | [DeleteObservationLogReply](#api.v1.beta1.DeleteObservationLogReply) | Delete all log of Observations for a Trial. | + + + + +### Suggestion + + +| Method Name | Request Type | Response Type | Description | +| ----------- | ------------ | ------------- | ------------| +| GetSuggestions | [GetSuggestionsRequest](#api.v1.beta1.GetSuggestionsRequest) | [GetSuggestionsReply](#api.v1.beta1.GetSuggestionsReply) | | +| ValidateAlgorithmSettings | [ValidateAlgorithmSettingsRequest](#api.v1.beta1.ValidateAlgorithmSettingsRequest) | [ValidateAlgorithmSettingsReply](#api.v1.beta1.ValidateAlgorithmSettingsReply) | | + + + + + +## Scalar Value Types + +| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby | +| ----------- | ----- | --- | ---- | ------ | -- | -- | --- | ---- | +| double | | double | double | float | float64 | double | float | Float | +| float | | float | float | float | float32 | float | float | Float | +| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) | +| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) | +| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) | +| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum | +| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass | +| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) | +| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) | + diff --git a/pkg/apis/manager/v1beta1/gen-doc/index.html b/pkg/apis/manager/v1beta1/gen-doc/index.html new file mode 100644 index 00000000000..ccc25d82789 --- /dev/null +++ b/pkg/apis/manager/v1beta1/gen-doc/index.html @@ -0,0 +1,1791 @@ + + + + + Protocol Documentation + + + + + + + + + + +

Protocol Documentation

+ +

Table of Contents

+ +
+ + + +
+

api.proto

Top +
+

Katib API v1beta1

+ + +

AlgorithmSetting

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
namestring

valuestring

+ + + + + +

AlgorithmSpec

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
algorithm_namestring

algorithm_settingAlgorithmSettingrepeated

early_stopping_specEarlyStoppingSpec

+ + + + + +

DeleteObservationLogReply

+

+ + + + + +

DeleteObservationLogRequest

+

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
trial_namestring

+ + + + + +

EarlyStoppingSpec

+

TODO: This feature is not yet fully implemented.

+ + + + + +

Experiment

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
namestring

Name of Experiment. This is unique in DB.

specExperimentSpec

+ + + + + +

ExperimentSpec

+

Spec of a Experiment. Experiment represents a single optimization run over a feasible space.

Each Experiment contains a configuration describing the feasible space, as well as a set of Trials.

It is assumed that objective function f(x) does not change in the course of a Experiment.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
parameter_specsExperimentSpec.ParameterSpecs

objectiveObjectiveSpec

algorithmAlgorithmSpec

trial_templatestring

metrics_collector_specstring

parallel_trial_countint32

max_trial_countint32

nas_configNasConfig

+ + + + + +

ExperimentSpec.ParameterSpecs

+

List of ParameterSpec

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
parametersParameterSpecrepeated

+ + + + + +

FeasibleSpace

+

Feasible space for optimization.

Int and Double type use Max/Min.

Discrete and Categorical type use List.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
maxstring

Max Value

minstring

Minimum Value

liststringrepeated

List of Values.

stepstring

Step for double or int parameter

+ + + + + +

GetObservationLogReply

+

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
observation_logObservationLog

+ + + + + +

GetObservationLogRequest

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
trial_namestring

metric_namestring

start_timestring

The start of the time range. RFC3339 format

end_timestring

The end of the time range. RFC3339 format

+ + + + + +

GetSuggestionsReply

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
parameter_assignmentsGetSuggestionsReply.ParameterAssignmentsrepeated

algorithmAlgorithmSpec

+ + + + + +

GetSuggestionsReply.ParameterAssignments

+

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
assignmentsParameterAssignmentrepeated

+ + + + + +

GetSuggestionsRequest

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
experimentExperiment

trialsTrialrepeated

all completed trials owned by the experiment.

request_numberint32

The number of Suggestion you request at one time. When you set 3 to request_number, you can get three Suggestions at one time.

+ + + + + +

GraphConfig

+

GraphConfig contains a config of DAG

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
num_layersint32

Number of layers

input_sizesint32repeated

Dimensions of input size

output_sizesint32repeated

Dimensions of output size

+ + + + + +

Metric

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
namestring

valuestring

+ + + + + +

MetricLog

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
time_stampstring

RFC3339 format

metricMetric

+ + + + + +

NasConfig

+

NasConfig contains a config of NAS job

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
graph_configGraphConfig

Config of DAG

operationsNasConfig.Operations

List of Operation

+ + + + + +

NasConfig.Operations

+

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
operationOperationrepeated

+ + + + + +

ObjectiveSpec

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
typeObjectiveType

goaldouble

objective_metric_namestring

additional_metric_namesstringrepeated

This can be empty if we only care about the objective metric.

+ + + + + +

Observation

+

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
metricsMetricrepeated

+ + + + + +

ObservationLog

+

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
metric_logsMetricLogrepeated

+ + + + + +

Operation

+

Config for operations in DAG

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
operation_typestring

Type of operation in DAG

parameter_specsOperation.ParameterSpecs

+ + + + + +

Operation.ParameterSpecs

+

List of ParameterSpec

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
parametersParameterSpecrepeated

+ + + + + +

ParameterAssignment

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
namestring

valuestring

+ + + + + +

ParameterSpec

+

Config for a Hyper parameter.

Katib will create each Hyper parameter from this config.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
namestring

Name of the parameter.

parameter_typeParameterType

Type of the parameter.

feasible_spaceFeasibleSpace

FeasibleSpace for the parameter.

+ + + + + +

ReportObservationLogReply

+

+ + + + + +

ReportObservationLogRequest

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
trial_namestring

observation_logObservationLog

+ + + + + +

Trial

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
namestring

specTrialSpec

statusTrialStatus

+ + + + + +

TrialSpec

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
experiment_namestring

objectiveObjectiveSpec

parameter_assignmentsTrialSpec.ParameterAssignments

run_specstring

metrics_collector_specstring

+ + + + + +

TrialSpec.ParameterAssignments

+

List of ParameterAssignment

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
assignmentsParameterAssignmentrepeated

+ + + + + +

TrialStatus

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
start_timestring

RFC3339 format

completion_timestring

RFC3339 format

conditionTrialStatus.TrialConditionType

observationObservation

The best observation in logs.

+ + + + + +

ValidateAlgorithmSettingsReply

+

Return INVALID_ARGUMENT Error if Algorithm Settings are not Valid

+ + + + + +

ValidateAlgorithmSettingsRequest

+

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
experimentExperiment

+ + + + + + + +

ObjectiveType

+

Direction of optimization. Minimize or Maximize.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameNumberDescription
UNKNOWN0

Undefined type and not used.

MINIMIZE1

Minimize

MAXIMIZE2

Maximize

+ +

ParameterType

+

Types of value for HyperParameter.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameNumberDescription
UNKNOWN_TYPE0

Undefined type and not used.

DOUBLE1

Double float type. Use "Max/Min".

INT2

Int type. Use "Max/Min".

DISCRETE3

Discrete number type. Use "List" as float.

CATEGORICAL4

Categorical type. Use "List" as string.

+ +

TrialStatus.TrialConditionType

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameNumberDescription
CREATED0

RUNNING1

SUCCEEDED2

KILLED3

FAILED4

UNKNOWN5

+ + + + + +

EarlyStopping

+

TODO: This feature is not yet fully implemented.

+ + + + + + + +
Method NameRequest TypeResponse TypeDescription
+ + +

Manager

+

Service for Main API for Katib

For each RPC service, we define mapping to HTTP REST API method.

The mapping includes the URL path, query parameters and request body.

https://cloud.google.com/service-infrastructure/docs/service-management/reference/rpc/google.api#http

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method NameRequest TypeResponse TypeDescription
ReportObservationLogReportObservationLogRequestReportObservationLogReply

Report a log of Observations for a Trial. +The log consists of timestamp and value of metric. +Katib store every log of metrics. +You can see accuracy curve or other metric logs on UI.

GetObservationLogGetObservationLogRequestGetObservationLogReply

Get all log of Observations for a Trial.

DeleteObservationLogDeleteObservationLogRequestDeleteObservationLogReply

Delete all log of Observations for a Trial.

+ + +

Suggestion

+

+ + + + + + + + + + + + + + + + + + + + + +
Method NameRequest TypeResponse TypeDescription
GetSuggestionsGetSuggestionsRequestGetSuggestionsReply

ValidateAlgorithmSettingsValidateAlgorithmSettingsRequestValidateAlgorithmSettingsReply

+ + + + +

Scalar Value Types

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
.proto TypeNotesC++JavaPythonGoC#PHPRuby
doubledoubledoublefloatfloat64doublefloatFloat
floatfloatfloatfloatfloat32floatfloatFloat
int32Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead.int32intintint32intintegerBignum or Fixnum (as required)
int64Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead.int64longint/longint64longinteger/stringBignum
uint32Uses variable-length encoding.uint32intint/longuint32uintintegerBignum or Fixnum (as required)
uint64Uses variable-length encoding.uint64longint/longuint64ulonginteger/stringBignum or Fixnum (as required)
sint32Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s.int32intintint32intintegerBignum or Fixnum (as required)
sint64Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s.int64longint/longint64longinteger/stringBignum
fixed32Always four bytes. More efficient than uint32 if values are often greater than 2^28.uint32intintuint32uintintegerBignum or Fixnum (as required)
fixed64Always eight bytes. More efficient than uint64 if values are often greater than 2^56.uint64longint/longuint64ulonginteger/stringBignum
sfixed32Always four bytes.int32intintint32intintegerBignum or Fixnum (as required)
sfixed64Always eight bytes.int64longint/longint64longinteger/stringBignum
boolboolbooleanbooleanboolboolbooleanTrueClass/FalseClass
stringA string must always contain UTF-8 encoded or 7-bit ASCII text.stringStringstr/unicodestringstringstringString (UTF-8)
bytesMay contain any arbitrary sequence of bytes.stringByteStringstr[]byteByteStringstringString (ASCII-8BIT)
+ + + diff --git a/pkg/apis/manager/v1beta1/python/api_pb2.py b/pkg/apis/manager/v1beta1/python/api_pb2.py new file mode 100644 index 00000000000..f523a6dd014 --- /dev/null +++ b/pkg/apis/manager/v1beta1/python/api_pb2.py @@ -0,0 +1,2296 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: api.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='api.proto', + package='api.v1.beta1', + syntax='proto3', + serialized_pb=_b('\n\tapi.proto\x12\x0c\x61pi.v1.beta1\x1a\x1cgoogle/api/annotations.proto\"E\n\rFeasibleSpace\x12\x0b\n\x03max\x18\x01 \x01(\t\x12\x0b\n\x03min\x18\x02 \x01(\t\x12\x0c\n\x04list\x18\x03 \x03(\t\x12\x0c\n\x04step\x18\x04 \x01(\t\"\x87\x01\n\rParameterSpec\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x33\n\x0eparameter_type\x18\x02 \x01(\x0e\x32\x1b.api.v1.beta1.ParameterType\x12\x33\n\x0e\x66\x65\x61sible_space\x18\x03 \x01(\x0b\x32\x1b.api.v1.beta1.FeasibleSpace\"\x88\x01\n\rObjectiveSpec\x12)\n\x04type\x18\x01 \x01(\x0e\x32\x1b.api.v1.beta1.ObjectiveType\x12\x0c\n\x04goal\x18\x02 \x01(\x01\x12\x1d\n\x15objective_metric_name\x18\x03 \x01(\t\x12\x1f\n\x17\x61\x64\x64itional_metric_names\x18\x04 \x03(\t\"/\n\x10\x41lgorithmSetting\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\x13\n\x11\x45\x61rlyStoppingSpec\"\xa0\x01\n\rAlgorithmSpec\x12\x16\n\x0e\x61lgorithm_name\x18\x01 \x01(\t\x12\x39\n\x11\x61lgorithm_setting\x18\x02 \x03(\x0b\x32\x1e.api.v1.beta1.AlgorithmSetting\x12<\n\x13\x65\x61rly_stopping_spec\x18\x03 \x01(\x0b\x32\x1f.api.v1.beta1.EarlyStoppingSpec\"\xae\x01\n\tNasConfig\x12/\n\x0cgraph_config\x18\x01 \x01(\x0b\x32\x19.api.v1.beta1.GraphConfig\x12\x36\n\noperations\x18\x02 \x01(\x0b\x32\".api.v1.beta1.NasConfig.Operations\x1a\x38\n\nOperations\x12*\n\toperation\x18\x01 \x03(\x0b\x32\x17.api.v1.beta1.Operation\"L\n\x0bGraphConfig\x12\x12\n\nnum_layers\x18\x01 \x01(\x05\x12\x13\n\x0binput_sizes\x18\x02 \x03(\x05\x12\x14\n\x0coutput_sizes\x18\x03 \x03(\x05\"\xa7\x01\n\tOperation\x12\x16\n\x0eoperation_type\x18\x01 \x01(\t\x12?\n\x0fparameter_specs\x18\x02 \x01(\x0b\x32&.api.v1.beta1.Operation.ParameterSpecs\x1a\x41\n\x0eParameterSpecs\x12/\n\nparameters\x18\x01 \x03(\x0b\x32\x1b.api.v1.beta1.ParameterSpec\"\x95\x03\n\x0e\x45xperimentSpec\x12\x44\n\x0fparameter_specs\x18\x01 \x01(\x0b\x32+.api.v1.beta1.ExperimentSpec.ParameterSpecs\x12.\n\tobjective\x18\x02 \x01(\x0b\x32\x1b.api.v1.beta1.ObjectiveSpec\x12.\n\talgorithm\x18\x03 \x01(\x0b\x32\x1b.api.v1.beta1.AlgorithmSpec\x12\x16\n\x0etrial_template\x18\x04 \x01(\t\x12\x1e\n\x16metrics_collector_spec\x18\x05 \x01(\t\x12\x1c\n\x14parallel_trial_count\x18\x06 \x01(\x05\x12\x17\n\x0fmax_trial_count\x18\x07 \x01(\x05\x12+\n\nnas_config\x18\x08 \x01(\x0b\x32\x17.api.v1.beta1.NasConfig\x1a\x41\n\x0eParameterSpecs\x12/\n\nparameters\x18\x01 \x03(\x0b\x32\x1b.api.v1.beta1.ParameterSpec\"F\n\nExperiment\x12\x0c\n\x04name\x18\x01 \x01(\t\x12*\n\x04spec\x18\x02 \x01(\x0b\x32\x1c.api.v1.beta1.ExperimentSpec\"2\n\x13ParameterAssignment\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"%\n\x06Metric\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"E\n\tMetricLog\x12\x12\n\ntime_stamp\x18\x01 \x01(\t\x12$\n\x06metric\x18\x02 \x01(\x0b\x32\x14.api.v1.beta1.Metric\"4\n\x0bObservation\x12%\n\x07metrics\x18\x01 \x03(\x0b\x32\x14.api.v1.beta1.Metric\">\n\x0eObservationLog\x12,\n\x0bmetric_logs\x18\x01 \x03(\x0b\x32\x17.api.v1.beta1.MetricLog\"\xa3\x02\n\tTrialSpec\x12\x17\n\x0f\x65xperiment_name\x18\x01 \x01(\t\x12.\n\tobjective\x18\x02 \x01(\x0b\x32\x1b.api.v1.beta1.ObjectiveSpec\x12K\n\x15parameter_assignments\x18\x03 \x01(\x0b\x32,.api.v1.beta1.TrialSpec.ParameterAssignments\x12\x10\n\x08run_spec\x18\x04 \x01(\t\x12\x1e\n\x16metrics_collector_spec\x18\x05 \x01(\t\x1aN\n\x14ParameterAssignments\x12\x36\n\x0b\x61ssignments\x18\x01 \x03(\x0b\x32!.api.v1.beta1.ParameterAssignment\"\x8f\x02\n\x0bTrialStatus\x12\x12\n\nstart_time\x18\x01 \x01(\t\x12\x17\n\x0f\x63ompletion_time\x18\x02 \x01(\t\x12?\n\tcondition\x18\x03 \x01(\x0e\x32,.api.v1.beta1.TrialStatus.TrialConditionType\x12.\n\x0bobservation\x18\x04 \x01(\x0b\x32\x19.api.v1.beta1.Observation\"b\n\x12TrialConditionType\x12\x0b\n\x07\x43REATED\x10\x00\x12\x0b\n\x07RUNNING\x10\x01\x12\r\n\tSUCCEEDED\x10\x02\x12\n\n\x06KILLED\x10\x03\x12\n\n\x06\x46\x41ILED\x10\x04\x12\x0b\n\x07UNKNOWN\x10\x05\"g\n\x05Trial\x12\x0c\n\x04name\x18\x01 \x01(\t\x12%\n\x04spec\x18\x02 \x01(\x0b\x32\x17.api.v1.beta1.TrialSpec\x12)\n\x06status\x18\x03 \x01(\x0b\x32\x19.api.v1.beta1.TrialStatus\"h\n\x1bReportObservationLogRequest\x12\x12\n\ntrial_name\x18\x01 \x01(\t\x12\x35\n\x0fobservation_log\x18\x02 \x01(\x0b\x32\x1c.api.v1.beta1.ObservationLog\"\x1b\n\x19ReportObservationLogReply\"1\n\x1b\x44\x65leteObservationLogRequest\x12\x12\n\ntrial_name\x18\x01 \x01(\t\"\x1b\n\x19\x44\x65leteObservationLogReply\"i\n\x18GetObservationLogRequest\x12\x12\n\ntrial_name\x18\x01 \x01(\t\x12\x13\n\x0bmetric_name\x18\x02 \x01(\t\x12\x12\n\nstart_time\x18\x03 \x01(\t\x12\x10\n\x08\x65nd_time\x18\x04 \x01(\t\"O\n\x16GetObservationLogReply\x12\x35\n\x0fobservation_log\x18\x01 \x01(\x0b\x32\x1c.api.v1.beta1.ObservationLog\"\x82\x01\n\x15GetSuggestionsRequest\x12,\n\nexperiment\x18\x01 \x01(\x0b\x32\x18.api.v1.beta1.Experiment\x12#\n\x06trials\x18\x02 \x03(\x0b\x32\x13.api.v1.beta1.Trial\x12\x16\n\x0erequest_number\x18\x03 \x01(\x05\"\xec\x01\n\x13GetSuggestionsReply\x12U\n\x15parameter_assignments\x18\x01 \x03(\x0b\x32\x36.api.v1.beta1.GetSuggestionsReply.ParameterAssignments\x12.\n\talgorithm\x18\x02 \x01(\x0b\x32\x1b.api.v1.beta1.AlgorithmSpec\x1aN\n\x14ParameterAssignments\x12\x36\n\x0b\x61ssignments\x18\x01 \x03(\x0b\x32!.api.v1.beta1.ParameterAssignment\"P\n ValidateAlgorithmSettingsRequest\x12,\n\nexperiment\x18\x01 \x01(\x0b\x32\x18.api.v1.beta1.Experiment\" \n\x1eValidateAlgorithmSettingsReply*U\n\rParameterType\x12\x10\n\x0cUNKNOWN_TYPE\x10\x00\x12\n\n\x06\x44OUBLE\x10\x01\x12\x07\n\x03INT\x10\x02\x12\x0c\n\x08\x44ISCRETE\x10\x03\x12\x0f\n\x0b\x43\x41TEGORICAL\x10\x04*8\n\rObjectiveType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0c\n\x08MINIMIZE\x10\x01\x12\x0c\n\x08MAXIMIZE\x10\x02\x32\xc4\x02\n\x07Manager\x12j\n\x14ReportObservationLog\x12).api.v1.beta1.ReportObservationLogRequest\x1a\'.api.v1.beta1.ReportObservationLogReply\x12\x61\n\x11GetObservationLog\x12&.api.v1.beta1.GetObservationLogRequest\x1a$.api.v1.beta1.GetObservationLogReply\x12j\n\x14\x44\x65leteObservationLog\x12).api.v1.beta1.DeleteObservationLogRequest\x1a\'.api.v1.beta1.DeleteObservationLogReply2\xe1\x01\n\nSuggestion\x12X\n\x0eGetSuggestions\x12#.api.v1.beta1.GetSuggestionsRequest\x1a!.api.v1.beta1.GetSuggestionsReply\x12y\n\x19ValidateAlgorithmSettings\x12..api.v1.beta1.ValidateAlgorithmSettingsRequest\x1a,.api.v1.beta1.ValidateAlgorithmSettingsReply2\x0f\n\rEarlyStoppingb\x06proto3') + , + dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,]) + +_PARAMETERTYPE = _descriptor.EnumDescriptor( + name='ParameterType', + full_name='api.v1.beta1.ParameterType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='UNKNOWN_TYPE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DOUBLE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='INT', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DISCRETE', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CATEGORICAL', index=4, number=4, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3387, + serialized_end=3472, +) +_sym_db.RegisterEnumDescriptor(_PARAMETERTYPE) + +ParameterType = enum_type_wrapper.EnumTypeWrapper(_PARAMETERTYPE) +_OBJECTIVETYPE = _descriptor.EnumDescriptor( + name='ObjectiveType', + full_name='api.v1.beta1.ObjectiveType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='UNKNOWN', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MINIMIZE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MAXIMIZE', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3474, + serialized_end=3530, +) +_sym_db.RegisterEnumDescriptor(_OBJECTIVETYPE) + +ObjectiveType = enum_type_wrapper.EnumTypeWrapper(_OBJECTIVETYPE) +UNKNOWN_TYPE = 0 +DOUBLE = 1 +INT = 2 +DISCRETE = 3 +CATEGORICAL = 4 +UNKNOWN = 0 +MINIMIZE = 1 +MAXIMIZE = 2 + + +_TRIALSTATUS_TRIALCONDITIONTYPE = _descriptor.EnumDescriptor( + name='TrialConditionType', + full_name='api.v1.beta1.TrialStatus.TrialConditionType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='CREATED', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RUNNING', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SUCCEEDED', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='KILLED', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='FAILED', index=4, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='UNKNOWN', index=5, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=2291, + serialized_end=2389, +) +_sym_db.RegisterEnumDescriptor(_TRIALSTATUS_TRIALCONDITIONTYPE) + + +_FEASIBLESPACE = _descriptor.Descriptor( + name='FeasibleSpace', + full_name='api.v1.beta1.FeasibleSpace', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='max', full_name='api.v1.beta1.FeasibleSpace.max', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='min', full_name='api.v1.beta1.FeasibleSpace.min', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='list', full_name='api.v1.beta1.FeasibleSpace.list', index=2, + number=3, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='step', full_name='api.v1.beta1.FeasibleSpace.step', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=57, + serialized_end=126, +) + + +_PARAMETERSPEC = _descriptor.Descriptor( + name='ParameterSpec', + full_name='api.v1.beta1.ParameterSpec', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='api.v1.beta1.ParameterSpec.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='parameter_type', full_name='api.v1.beta1.ParameterSpec.parameter_type', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='feasible_space', full_name='api.v1.beta1.ParameterSpec.feasible_space', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=129, + serialized_end=264, +) + + +_OBJECTIVESPEC = _descriptor.Descriptor( + name='ObjectiveSpec', + full_name='api.v1.beta1.ObjectiveSpec', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='type', full_name='api.v1.beta1.ObjectiveSpec.type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='goal', full_name='api.v1.beta1.ObjectiveSpec.goal', index=1, + number=2, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='objective_metric_name', full_name='api.v1.beta1.ObjectiveSpec.objective_metric_name', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='additional_metric_names', full_name='api.v1.beta1.ObjectiveSpec.additional_metric_names', index=3, + number=4, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=267, + serialized_end=403, +) + + +_ALGORITHMSETTING = _descriptor.Descriptor( + name='AlgorithmSetting', + full_name='api.v1.beta1.AlgorithmSetting', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='api.v1.beta1.AlgorithmSetting.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='value', full_name='api.v1.beta1.AlgorithmSetting.value', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=405, + serialized_end=452, +) + + +_EARLYSTOPPINGSPEC = _descriptor.Descriptor( + name='EarlyStoppingSpec', + full_name='api.v1.beta1.EarlyStoppingSpec', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=454, + serialized_end=473, +) + + +_ALGORITHMSPEC = _descriptor.Descriptor( + name='AlgorithmSpec', + full_name='api.v1.beta1.AlgorithmSpec', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='algorithm_name', full_name='api.v1.beta1.AlgorithmSpec.algorithm_name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='algorithm_setting', full_name='api.v1.beta1.AlgorithmSpec.algorithm_setting', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='early_stopping_spec', full_name='api.v1.beta1.AlgorithmSpec.early_stopping_spec', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=476, + serialized_end=636, +) + + +_NASCONFIG_OPERATIONS = _descriptor.Descriptor( + name='Operations', + full_name='api.v1.beta1.NasConfig.Operations', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='operation', full_name='api.v1.beta1.NasConfig.Operations.operation', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=757, + serialized_end=813, +) + +_NASCONFIG = _descriptor.Descriptor( + name='NasConfig', + full_name='api.v1.beta1.NasConfig', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='graph_config', full_name='api.v1.beta1.NasConfig.graph_config', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='operations', full_name='api.v1.beta1.NasConfig.operations', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_NASCONFIG_OPERATIONS, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=639, + serialized_end=813, +) + + +_GRAPHCONFIG = _descriptor.Descriptor( + name='GraphConfig', + full_name='api.v1.beta1.GraphConfig', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='num_layers', full_name='api.v1.beta1.GraphConfig.num_layers', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='input_sizes', full_name='api.v1.beta1.GraphConfig.input_sizes', index=1, + number=2, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='output_sizes', full_name='api.v1.beta1.GraphConfig.output_sizes', index=2, + number=3, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=815, + serialized_end=891, +) + + +_OPERATION_PARAMETERSPECS = _descriptor.Descriptor( + name='ParameterSpecs', + full_name='api.v1.beta1.Operation.ParameterSpecs', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='parameters', full_name='api.v1.beta1.Operation.ParameterSpecs.parameters', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=996, + serialized_end=1061, +) + +_OPERATION = _descriptor.Descriptor( + name='Operation', + full_name='api.v1.beta1.Operation', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='operation_type', full_name='api.v1.beta1.Operation.operation_type', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='parameter_specs', full_name='api.v1.beta1.Operation.parameter_specs', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_OPERATION_PARAMETERSPECS, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=894, + serialized_end=1061, +) + + +_EXPERIMENTSPEC_PARAMETERSPECS = _descriptor.Descriptor( + name='ParameterSpecs', + full_name='api.v1.beta1.ExperimentSpec.ParameterSpecs', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='parameters', full_name='api.v1.beta1.ExperimentSpec.ParameterSpecs.parameters', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=996, + serialized_end=1061, +) + +_EXPERIMENTSPEC = _descriptor.Descriptor( + name='ExperimentSpec', + full_name='api.v1.beta1.ExperimentSpec', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='parameter_specs', full_name='api.v1.beta1.ExperimentSpec.parameter_specs', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='objective', full_name='api.v1.beta1.ExperimentSpec.objective', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='algorithm', full_name='api.v1.beta1.ExperimentSpec.algorithm', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='trial_template', full_name='api.v1.beta1.ExperimentSpec.trial_template', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='metrics_collector_spec', full_name='api.v1.beta1.ExperimentSpec.metrics_collector_spec', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='parallel_trial_count', full_name='api.v1.beta1.ExperimentSpec.parallel_trial_count', index=5, + number=6, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='max_trial_count', full_name='api.v1.beta1.ExperimentSpec.max_trial_count', index=6, + number=7, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='nas_config', full_name='api.v1.beta1.ExperimentSpec.nas_config', index=7, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_EXPERIMENTSPEC_PARAMETERSPECS, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1064, + serialized_end=1469, +) + + +_EXPERIMENT = _descriptor.Descriptor( + name='Experiment', + full_name='api.v1.beta1.Experiment', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='api.v1.beta1.Experiment.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='spec', full_name='api.v1.beta1.Experiment.spec', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1471, + serialized_end=1541, +) + + +_PARAMETERASSIGNMENT = _descriptor.Descriptor( + name='ParameterAssignment', + full_name='api.v1.beta1.ParameterAssignment', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='api.v1.beta1.ParameterAssignment.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='value', full_name='api.v1.beta1.ParameterAssignment.value', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1543, + serialized_end=1593, +) + + +_METRIC = _descriptor.Descriptor( + name='Metric', + full_name='api.v1.beta1.Metric', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='api.v1.beta1.Metric.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='value', full_name='api.v1.beta1.Metric.value', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1595, + serialized_end=1632, +) + + +_METRICLOG = _descriptor.Descriptor( + name='MetricLog', + full_name='api.v1.beta1.MetricLog', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='time_stamp', full_name='api.v1.beta1.MetricLog.time_stamp', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='metric', full_name='api.v1.beta1.MetricLog.metric', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1634, + serialized_end=1703, +) + + +_OBSERVATION = _descriptor.Descriptor( + name='Observation', + full_name='api.v1.beta1.Observation', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='metrics', full_name='api.v1.beta1.Observation.metrics', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1705, + serialized_end=1757, +) + + +_OBSERVATIONLOG = _descriptor.Descriptor( + name='ObservationLog', + full_name='api.v1.beta1.ObservationLog', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='metric_logs', full_name='api.v1.beta1.ObservationLog.metric_logs', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1759, + serialized_end=1821, +) + + +_TRIALSPEC_PARAMETERASSIGNMENTS = _descriptor.Descriptor( + name='ParameterAssignments', + full_name='api.v1.beta1.TrialSpec.ParameterAssignments', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='assignments', full_name='api.v1.beta1.TrialSpec.ParameterAssignments.assignments', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2037, + serialized_end=2115, +) + +_TRIALSPEC = _descriptor.Descriptor( + name='TrialSpec', + full_name='api.v1.beta1.TrialSpec', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='experiment_name', full_name='api.v1.beta1.TrialSpec.experiment_name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='objective', full_name='api.v1.beta1.TrialSpec.objective', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='parameter_assignments', full_name='api.v1.beta1.TrialSpec.parameter_assignments', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='run_spec', full_name='api.v1.beta1.TrialSpec.run_spec', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='metrics_collector_spec', full_name='api.v1.beta1.TrialSpec.metrics_collector_spec', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_TRIALSPEC_PARAMETERASSIGNMENTS, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1824, + serialized_end=2115, +) + + +_TRIALSTATUS = _descriptor.Descriptor( + name='TrialStatus', + full_name='api.v1.beta1.TrialStatus', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='start_time', full_name='api.v1.beta1.TrialStatus.start_time', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='completion_time', full_name='api.v1.beta1.TrialStatus.completion_time', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='condition', full_name='api.v1.beta1.TrialStatus.condition', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='observation', full_name='api.v1.beta1.TrialStatus.observation', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _TRIALSTATUS_TRIALCONDITIONTYPE, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2118, + serialized_end=2389, +) + + +_TRIAL = _descriptor.Descriptor( + name='Trial', + full_name='api.v1.beta1.Trial', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='api.v1.beta1.Trial.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='spec', full_name='api.v1.beta1.Trial.spec', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='status', full_name='api.v1.beta1.Trial.status', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2391, + serialized_end=2494, +) + + +_REPORTOBSERVATIONLOGREQUEST = _descriptor.Descriptor( + name='ReportObservationLogRequest', + full_name='api.v1.beta1.ReportObservationLogRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='trial_name', full_name='api.v1.beta1.ReportObservationLogRequest.trial_name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='observation_log', full_name='api.v1.beta1.ReportObservationLogRequest.observation_log', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2496, + serialized_end=2600, +) + + +_REPORTOBSERVATIONLOGREPLY = _descriptor.Descriptor( + name='ReportObservationLogReply', + full_name='api.v1.beta1.ReportObservationLogReply', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2602, + serialized_end=2629, +) + + +_DELETEOBSERVATIONLOGREQUEST = _descriptor.Descriptor( + name='DeleteObservationLogRequest', + full_name='api.v1.beta1.DeleteObservationLogRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='trial_name', full_name='api.v1.beta1.DeleteObservationLogRequest.trial_name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2631, + serialized_end=2680, +) + + +_DELETEOBSERVATIONLOGREPLY = _descriptor.Descriptor( + name='DeleteObservationLogReply', + full_name='api.v1.beta1.DeleteObservationLogReply', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2682, + serialized_end=2709, +) + + +_GETOBSERVATIONLOGREQUEST = _descriptor.Descriptor( + name='GetObservationLogRequest', + full_name='api.v1.beta1.GetObservationLogRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='trial_name', full_name='api.v1.beta1.GetObservationLogRequest.trial_name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='metric_name', full_name='api.v1.beta1.GetObservationLogRequest.metric_name', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='start_time', full_name='api.v1.beta1.GetObservationLogRequest.start_time', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='end_time', full_name='api.v1.beta1.GetObservationLogRequest.end_time', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2711, + serialized_end=2816, +) + + +_GETOBSERVATIONLOGREPLY = _descriptor.Descriptor( + name='GetObservationLogReply', + full_name='api.v1.beta1.GetObservationLogReply', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='observation_log', full_name='api.v1.beta1.GetObservationLogReply.observation_log', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2818, + serialized_end=2897, +) + + +_GETSUGGESTIONSREQUEST = _descriptor.Descriptor( + name='GetSuggestionsRequest', + full_name='api.v1.beta1.GetSuggestionsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='experiment', full_name='api.v1.beta1.GetSuggestionsRequest.experiment', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='trials', full_name='api.v1.beta1.GetSuggestionsRequest.trials', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='request_number', full_name='api.v1.beta1.GetSuggestionsRequest.request_number', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2900, + serialized_end=3030, +) + + +_GETSUGGESTIONSREPLY_PARAMETERASSIGNMENTS = _descriptor.Descriptor( + name='ParameterAssignments', + full_name='api.v1.beta1.GetSuggestionsReply.ParameterAssignments', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='assignments', full_name='api.v1.beta1.GetSuggestionsReply.ParameterAssignments.assignments', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2037, + serialized_end=2115, +) + +_GETSUGGESTIONSREPLY = _descriptor.Descriptor( + name='GetSuggestionsReply', + full_name='api.v1.beta1.GetSuggestionsReply', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='parameter_assignments', full_name='api.v1.beta1.GetSuggestionsReply.parameter_assignments', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='algorithm', full_name='api.v1.beta1.GetSuggestionsReply.algorithm', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_GETSUGGESTIONSREPLY_PARAMETERASSIGNMENTS, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3033, + serialized_end=3269, +) + + +_VALIDATEALGORITHMSETTINGSREQUEST = _descriptor.Descriptor( + name='ValidateAlgorithmSettingsRequest', + full_name='api.v1.beta1.ValidateAlgorithmSettingsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='experiment', full_name='api.v1.beta1.ValidateAlgorithmSettingsRequest.experiment', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3271, + serialized_end=3351, +) + + +_VALIDATEALGORITHMSETTINGSREPLY = _descriptor.Descriptor( + name='ValidateAlgorithmSettingsReply', + full_name='api.v1.beta1.ValidateAlgorithmSettingsReply', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3353, + serialized_end=3385, +) + +_PARAMETERSPEC.fields_by_name['parameter_type'].enum_type = _PARAMETERTYPE +_PARAMETERSPEC.fields_by_name['feasible_space'].message_type = _FEASIBLESPACE +_OBJECTIVESPEC.fields_by_name['type'].enum_type = _OBJECTIVETYPE +_ALGORITHMSPEC.fields_by_name['algorithm_setting'].message_type = _ALGORITHMSETTING +_ALGORITHMSPEC.fields_by_name['early_stopping_spec'].message_type = _EARLYSTOPPINGSPEC +_NASCONFIG_OPERATIONS.fields_by_name['operation'].message_type = _OPERATION +_NASCONFIG_OPERATIONS.containing_type = _NASCONFIG +_NASCONFIG.fields_by_name['graph_config'].message_type = _GRAPHCONFIG +_NASCONFIG.fields_by_name['operations'].message_type = _NASCONFIG_OPERATIONS +_OPERATION_PARAMETERSPECS.fields_by_name['parameters'].message_type = _PARAMETERSPEC +_OPERATION_PARAMETERSPECS.containing_type = _OPERATION +_OPERATION.fields_by_name['parameter_specs'].message_type = _OPERATION_PARAMETERSPECS +_EXPERIMENTSPEC_PARAMETERSPECS.fields_by_name['parameters'].message_type = _PARAMETERSPEC +_EXPERIMENTSPEC_PARAMETERSPECS.containing_type = _EXPERIMENTSPEC +_EXPERIMENTSPEC.fields_by_name['parameter_specs'].message_type = _EXPERIMENTSPEC_PARAMETERSPECS +_EXPERIMENTSPEC.fields_by_name['objective'].message_type = _OBJECTIVESPEC +_EXPERIMENTSPEC.fields_by_name['algorithm'].message_type = _ALGORITHMSPEC +_EXPERIMENTSPEC.fields_by_name['nas_config'].message_type = _NASCONFIG +_EXPERIMENT.fields_by_name['spec'].message_type = _EXPERIMENTSPEC +_METRICLOG.fields_by_name['metric'].message_type = _METRIC +_OBSERVATION.fields_by_name['metrics'].message_type = _METRIC +_OBSERVATIONLOG.fields_by_name['metric_logs'].message_type = _METRICLOG +_TRIALSPEC_PARAMETERASSIGNMENTS.fields_by_name['assignments'].message_type = _PARAMETERASSIGNMENT +_TRIALSPEC_PARAMETERASSIGNMENTS.containing_type = _TRIALSPEC +_TRIALSPEC.fields_by_name['objective'].message_type = _OBJECTIVESPEC +_TRIALSPEC.fields_by_name['parameter_assignments'].message_type = _TRIALSPEC_PARAMETERASSIGNMENTS +_TRIALSTATUS.fields_by_name['condition'].enum_type = _TRIALSTATUS_TRIALCONDITIONTYPE +_TRIALSTATUS.fields_by_name['observation'].message_type = _OBSERVATION +_TRIALSTATUS_TRIALCONDITIONTYPE.containing_type = _TRIALSTATUS +_TRIAL.fields_by_name['spec'].message_type = _TRIALSPEC +_TRIAL.fields_by_name['status'].message_type = _TRIALSTATUS +_REPORTOBSERVATIONLOGREQUEST.fields_by_name['observation_log'].message_type = _OBSERVATIONLOG +_GETOBSERVATIONLOGREPLY.fields_by_name['observation_log'].message_type = _OBSERVATIONLOG +_GETSUGGESTIONSREQUEST.fields_by_name['experiment'].message_type = _EXPERIMENT +_GETSUGGESTIONSREQUEST.fields_by_name['trials'].message_type = _TRIAL +_GETSUGGESTIONSREPLY_PARAMETERASSIGNMENTS.fields_by_name['assignments'].message_type = _PARAMETERASSIGNMENT +_GETSUGGESTIONSREPLY_PARAMETERASSIGNMENTS.containing_type = _GETSUGGESTIONSREPLY +_GETSUGGESTIONSREPLY.fields_by_name['parameter_assignments'].message_type = _GETSUGGESTIONSREPLY_PARAMETERASSIGNMENTS +_GETSUGGESTIONSREPLY.fields_by_name['algorithm'].message_type = _ALGORITHMSPEC +_VALIDATEALGORITHMSETTINGSREQUEST.fields_by_name['experiment'].message_type = _EXPERIMENT +DESCRIPTOR.message_types_by_name['FeasibleSpace'] = _FEASIBLESPACE +DESCRIPTOR.message_types_by_name['ParameterSpec'] = _PARAMETERSPEC +DESCRIPTOR.message_types_by_name['ObjectiveSpec'] = _OBJECTIVESPEC +DESCRIPTOR.message_types_by_name['AlgorithmSetting'] = _ALGORITHMSETTING +DESCRIPTOR.message_types_by_name['EarlyStoppingSpec'] = _EARLYSTOPPINGSPEC +DESCRIPTOR.message_types_by_name['AlgorithmSpec'] = _ALGORITHMSPEC +DESCRIPTOR.message_types_by_name['NasConfig'] = _NASCONFIG +DESCRIPTOR.message_types_by_name['GraphConfig'] = _GRAPHCONFIG +DESCRIPTOR.message_types_by_name['Operation'] = _OPERATION +DESCRIPTOR.message_types_by_name['ExperimentSpec'] = _EXPERIMENTSPEC +DESCRIPTOR.message_types_by_name['Experiment'] = _EXPERIMENT +DESCRIPTOR.message_types_by_name['ParameterAssignment'] = _PARAMETERASSIGNMENT +DESCRIPTOR.message_types_by_name['Metric'] = _METRIC +DESCRIPTOR.message_types_by_name['MetricLog'] = _METRICLOG +DESCRIPTOR.message_types_by_name['Observation'] = _OBSERVATION +DESCRIPTOR.message_types_by_name['ObservationLog'] = _OBSERVATIONLOG +DESCRIPTOR.message_types_by_name['TrialSpec'] = _TRIALSPEC +DESCRIPTOR.message_types_by_name['TrialStatus'] = _TRIALSTATUS +DESCRIPTOR.message_types_by_name['Trial'] = _TRIAL +DESCRIPTOR.message_types_by_name['ReportObservationLogRequest'] = _REPORTOBSERVATIONLOGREQUEST +DESCRIPTOR.message_types_by_name['ReportObservationLogReply'] = _REPORTOBSERVATIONLOGREPLY +DESCRIPTOR.message_types_by_name['DeleteObservationLogRequest'] = _DELETEOBSERVATIONLOGREQUEST +DESCRIPTOR.message_types_by_name['DeleteObservationLogReply'] = _DELETEOBSERVATIONLOGREPLY +DESCRIPTOR.message_types_by_name['GetObservationLogRequest'] = _GETOBSERVATIONLOGREQUEST +DESCRIPTOR.message_types_by_name['GetObservationLogReply'] = _GETOBSERVATIONLOGREPLY +DESCRIPTOR.message_types_by_name['GetSuggestionsRequest'] = _GETSUGGESTIONSREQUEST +DESCRIPTOR.message_types_by_name['GetSuggestionsReply'] = _GETSUGGESTIONSREPLY +DESCRIPTOR.message_types_by_name['ValidateAlgorithmSettingsRequest'] = _VALIDATEALGORITHMSETTINGSREQUEST +DESCRIPTOR.message_types_by_name['ValidateAlgorithmSettingsReply'] = _VALIDATEALGORITHMSETTINGSREPLY +DESCRIPTOR.enum_types_by_name['ParameterType'] = _PARAMETERTYPE +DESCRIPTOR.enum_types_by_name['ObjectiveType'] = _OBJECTIVETYPE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +FeasibleSpace = _reflection.GeneratedProtocolMessageType('FeasibleSpace', (_message.Message,), dict( + DESCRIPTOR = _FEASIBLESPACE, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.FeasibleSpace) + )) +_sym_db.RegisterMessage(FeasibleSpace) + +ParameterSpec = _reflection.GeneratedProtocolMessageType('ParameterSpec', (_message.Message,), dict( + DESCRIPTOR = _PARAMETERSPEC, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.ParameterSpec) + )) +_sym_db.RegisterMessage(ParameterSpec) + +ObjectiveSpec = _reflection.GeneratedProtocolMessageType('ObjectiveSpec', (_message.Message,), dict( + DESCRIPTOR = _OBJECTIVESPEC, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.ObjectiveSpec) + )) +_sym_db.RegisterMessage(ObjectiveSpec) + +AlgorithmSetting = _reflection.GeneratedProtocolMessageType('AlgorithmSetting', (_message.Message,), dict( + DESCRIPTOR = _ALGORITHMSETTING, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.AlgorithmSetting) + )) +_sym_db.RegisterMessage(AlgorithmSetting) + +EarlyStoppingSpec = _reflection.GeneratedProtocolMessageType('EarlyStoppingSpec', (_message.Message,), dict( + DESCRIPTOR = _EARLYSTOPPINGSPEC, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.EarlyStoppingSpec) + )) +_sym_db.RegisterMessage(EarlyStoppingSpec) + +AlgorithmSpec = _reflection.GeneratedProtocolMessageType('AlgorithmSpec', (_message.Message,), dict( + DESCRIPTOR = _ALGORITHMSPEC, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.AlgorithmSpec) + )) +_sym_db.RegisterMessage(AlgorithmSpec) + +NasConfig = _reflection.GeneratedProtocolMessageType('NasConfig', (_message.Message,), dict( + + Operations = _reflection.GeneratedProtocolMessageType('Operations', (_message.Message,), dict( + DESCRIPTOR = _NASCONFIG_OPERATIONS, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.NasConfig.Operations) + )) + , + DESCRIPTOR = _NASCONFIG, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.NasConfig) + )) +_sym_db.RegisterMessage(NasConfig) +_sym_db.RegisterMessage(NasConfig.Operations) + +GraphConfig = _reflection.GeneratedProtocolMessageType('GraphConfig', (_message.Message,), dict( + DESCRIPTOR = _GRAPHCONFIG, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.GraphConfig) + )) +_sym_db.RegisterMessage(GraphConfig) + +Operation = _reflection.GeneratedProtocolMessageType('Operation', (_message.Message,), dict( + + ParameterSpecs = _reflection.GeneratedProtocolMessageType('ParameterSpecs', (_message.Message,), dict( + DESCRIPTOR = _OPERATION_PARAMETERSPECS, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.Operation.ParameterSpecs) + )) + , + DESCRIPTOR = _OPERATION, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.Operation) + )) +_sym_db.RegisterMessage(Operation) +_sym_db.RegisterMessage(Operation.ParameterSpecs) + +ExperimentSpec = _reflection.GeneratedProtocolMessageType('ExperimentSpec', (_message.Message,), dict( + + ParameterSpecs = _reflection.GeneratedProtocolMessageType('ParameterSpecs', (_message.Message,), dict( + DESCRIPTOR = _EXPERIMENTSPEC_PARAMETERSPECS, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.ExperimentSpec.ParameterSpecs) + )) + , + DESCRIPTOR = _EXPERIMENTSPEC, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.ExperimentSpec) + )) +_sym_db.RegisterMessage(ExperimentSpec) +_sym_db.RegisterMessage(ExperimentSpec.ParameterSpecs) + +Experiment = _reflection.GeneratedProtocolMessageType('Experiment', (_message.Message,), dict( + DESCRIPTOR = _EXPERIMENT, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.Experiment) + )) +_sym_db.RegisterMessage(Experiment) + +ParameterAssignment = _reflection.GeneratedProtocolMessageType('ParameterAssignment', (_message.Message,), dict( + DESCRIPTOR = _PARAMETERASSIGNMENT, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.ParameterAssignment) + )) +_sym_db.RegisterMessage(ParameterAssignment) + +Metric = _reflection.GeneratedProtocolMessageType('Metric', (_message.Message,), dict( + DESCRIPTOR = _METRIC, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.Metric) + )) +_sym_db.RegisterMessage(Metric) + +MetricLog = _reflection.GeneratedProtocolMessageType('MetricLog', (_message.Message,), dict( + DESCRIPTOR = _METRICLOG, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.MetricLog) + )) +_sym_db.RegisterMessage(MetricLog) + +Observation = _reflection.GeneratedProtocolMessageType('Observation', (_message.Message,), dict( + DESCRIPTOR = _OBSERVATION, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.Observation) + )) +_sym_db.RegisterMessage(Observation) + +ObservationLog = _reflection.GeneratedProtocolMessageType('ObservationLog', (_message.Message,), dict( + DESCRIPTOR = _OBSERVATIONLOG, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.ObservationLog) + )) +_sym_db.RegisterMessage(ObservationLog) + +TrialSpec = _reflection.GeneratedProtocolMessageType('TrialSpec', (_message.Message,), dict( + + ParameterAssignments = _reflection.GeneratedProtocolMessageType('ParameterAssignments', (_message.Message,), dict( + DESCRIPTOR = _TRIALSPEC_PARAMETERASSIGNMENTS, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.TrialSpec.ParameterAssignments) + )) + , + DESCRIPTOR = _TRIALSPEC, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.TrialSpec) + )) +_sym_db.RegisterMessage(TrialSpec) +_sym_db.RegisterMessage(TrialSpec.ParameterAssignments) + +TrialStatus = _reflection.GeneratedProtocolMessageType('TrialStatus', (_message.Message,), dict( + DESCRIPTOR = _TRIALSTATUS, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.TrialStatus) + )) +_sym_db.RegisterMessage(TrialStatus) + +Trial = _reflection.GeneratedProtocolMessageType('Trial', (_message.Message,), dict( + DESCRIPTOR = _TRIAL, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.Trial) + )) +_sym_db.RegisterMessage(Trial) + +ReportObservationLogRequest = _reflection.GeneratedProtocolMessageType('ReportObservationLogRequest', (_message.Message,), dict( + DESCRIPTOR = _REPORTOBSERVATIONLOGREQUEST, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.ReportObservationLogRequest) + )) +_sym_db.RegisterMessage(ReportObservationLogRequest) + +ReportObservationLogReply = _reflection.GeneratedProtocolMessageType('ReportObservationLogReply', (_message.Message,), dict( + DESCRIPTOR = _REPORTOBSERVATIONLOGREPLY, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.ReportObservationLogReply) + )) +_sym_db.RegisterMessage(ReportObservationLogReply) + +DeleteObservationLogRequest = _reflection.GeneratedProtocolMessageType('DeleteObservationLogRequest', (_message.Message,), dict( + DESCRIPTOR = _DELETEOBSERVATIONLOGREQUEST, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.DeleteObservationLogRequest) + )) +_sym_db.RegisterMessage(DeleteObservationLogRequest) + +DeleteObservationLogReply = _reflection.GeneratedProtocolMessageType('DeleteObservationLogReply', (_message.Message,), dict( + DESCRIPTOR = _DELETEOBSERVATIONLOGREPLY, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.DeleteObservationLogReply) + )) +_sym_db.RegisterMessage(DeleteObservationLogReply) + +GetObservationLogRequest = _reflection.GeneratedProtocolMessageType('GetObservationLogRequest', (_message.Message,), dict( + DESCRIPTOR = _GETOBSERVATIONLOGREQUEST, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.GetObservationLogRequest) + )) +_sym_db.RegisterMessage(GetObservationLogRequest) + +GetObservationLogReply = _reflection.GeneratedProtocolMessageType('GetObservationLogReply', (_message.Message,), dict( + DESCRIPTOR = _GETOBSERVATIONLOGREPLY, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.GetObservationLogReply) + )) +_sym_db.RegisterMessage(GetObservationLogReply) + +GetSuggestionsRequest = _reflection.GeneratedProtocolMessageType('GetSuggestionsRequest', (_message.Message,), dict( + DESCRIPTOR = _GETSUGGESTIONSREQUEST, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.GetSuggestionsRequest) + )) +_sym_db.RegisterMessage(GetSuggestionsRequest) + +GetSuggestionsReply = _reflection.GeneratedProtocolMessageType('GetSuggestionsReply', (_message.Message,), dict( + + ParameterAssignments = _reflection.GeneratedProtocolMessageType('ParameterAssignments', (_message.Message,), dict( + DESCRIPTOR = _GETSUGGESTIONSREPLY_PARAMETERASSIGNMENTS, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.GetSuggestionsReply.ParameterAssignments) + )) + , + DESCRIPTOR = _GETSUGGESTIONSREPLY, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.GetSuggestionsReply) + )) +_sym_db.RegisterMessage(GetSuggestionsReply) +_sym_db.RegisterMessage(GetSuggestionsReply.ParameterAssignments) + +ValidateAlgorithmSettingsRequest = _reflection.GeneratedProtocolMessageType('ValidateAlgorithmSettingsRequest', (_message.Message,), dict( + DESCRIPTOR = _VALIDATEALGORITHMSETTINGSREQUEST, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.ValidateAlgorithmSettingsRequest) + )) +_sym_db.RegisterMessage(ValidateAlgorithmSettingsRequest) + +ValidateAlgorithmSettingsReply = _reflection.GeneratedProtocolMessageType('ValidateAlgorithmSettingsReply', (_message.Message,), dict( + DESCRIPTOR = _VALIDATEALGORITHMSETTINGSREPLY, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:api.v1.beta1.ValidateAlgorithmSettingsReply) + )) +_sym_db.RegisterMessage(ValidateAlgorithmSettingsReply) + + + +_MANAGER = _descriptor.ServiceDescriptor( + name='Manager', + full_name='api.v1.beta1.Manager', + file=DESCRIPTOR, + index=0, + options=None, + serialized_start=3533, + serialized_end=3857, + methods=[ + _descriptor.MethodDescriptor( + name='ReportObservationLog', + full_name='api.v1.beta1.Manager.ReportObservationLog', + index=0, + containing_service=None, + input_type=_REPORTOBSERVATIONLOGREQUEST, + output_type=_REPORTOBSERVATIONLOGREPLY, + options=None, + ), + _descriptor.MethodDescriptor( + name='GetObservationLog', + full_name='api.v1.beta1.Manager.GetObservationLog', + index=1, + containing_service=None, + input_type=_GETOBSERVATIONLOGREQUEST, + output_type=_GETOBSERVATIONLOGREPLY, + options=None, + ), + _descriptor.MethodDescriptor( + name='DeleteObservationLog', + full_name='api.v1.beta1.Manager.DeleteObservationLog', + index=2, + containing_service=None, + input_type=_DELETEOBSERVATIONLOGREQUEST, + output_type=_DELETEOBSERVATIONLOGREPLY, + options=None, + ), +]) +_sym_db.RegisterServiceDescriptor(_MANAGER) + +DESCRIPTOR.services_by_name['Manager'] = _MANAGER + + +_SUGGESTION = _descriptor.ServiceDescriptor( + name='Suggestion', + full_name='api.v1.beta1.Suggestion', + file=DESCRIPTOR, + index=1, + options=None, + serialized_start=3860, + serialized_end=4085, + methods=[ + _descriptor.MethodDescriptor( + name='GetSuggestions', + full_name='api.v1.beta1.Suggestion.GetSuggestions', + index=0, + containing_service=None, + input_type=_GETSUGGESTIONSREQUEST, + output_type=_GETSUGGESTIONSREPLY, + options=None, + ), + _descriptor.MethodDescriptor( + name='ValidateAlgorithmSettings', + full_name='api.v1.beta1.Suggestion.ValidateAlgorithmSettings', + index=1, + containing_service=None, + input_type=_VALIDATEALGORITHMSETTINGSREQUEST, + output_type=_VALIDATEALGORITHMSETTINGSREPLY, + options=None, + ), +]) +_sym_db.RegisterServiceDescriptor(_SUGGESTION) + +DESCRIPTOR.services_by_name['Suggestion'] = _SUGGESTION + + +_EARLYSTOPPING = _descriptor.ServiceDescriptor( + name='EarlyStopping', + full_name='api.v1.beta1.EarlyStopping', + file=DESCRIPTOR, + index=2, + options=None, + serialized_start=4087, + serialized_end=4102, + methods=[ +]) +_sym_db.RegisterServiceDescriptor(_EARLYSTOPPING) + +DESCRIPTOR.services_by_name['EarlyStopping'] = _EARLYSTOPPING + +try: + # THESE ELEMENTS WILL BE DEPRECATED. + # Please use the generated *_pb2_grpc.py files instead. + import grpc + from grpc.beta import implementations as beta_implementations + from grpc.beta import interfaces as beta_interfaces + from grpc.framework.common import cardinality + from grpc.framework.interfaces.face import utilities as face_utilities + + + class ManagerStub(object): + """* + Service for Main API for Katib + For each RPC service, we define mapping to HTTP REST API method. + The mapping includes the URL path, query parameters and request body. + https://cloud.google.com/service-infrastructure/docs/service-management/reference/rpc/google.api#http + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.ReportObservationLog = channel.unary_unary( + '/api.v1.beta1.Manager/ReportObservationLog', + request_serializer=ReportObservationLogRequest.SerializeToString, + response_deserializer=ReportObservationLogReply.FromString, + ) + self.GetObservationLog = channel.unary_unary( + '/api.v1.beta1.Manager/GetObservationLog', + request_serializer=GetObservationLogRequest.SerializeToString, + response_deserializer=GetObservationLogReply.FromString, + ) + self.DeleteObservationLog = channel.unary_unary( + '/api.v1.beta1.Manager/DeleteObservationLog', + request_serializer=DeleteObservationLogRequest.SerializeToString, + response_deserializer=DeleteObservationLogReply.FromString, + ) + + + class ManagerServicer(object): + """* + Service for Main API for Katib + For each RPC service, we define mapping to HTTP REST API method. + The mapping includes the URL path, query parameters and request body. + https://cloud.google.com/service-infrastructure/docs/service-management/reference/rpc/google.api#http + """ + + def ReportObservationLog(self, request, context): + """* + Report a log of Observations for a Trial. + The log consists of timestamp and value of metric. + Katib store every log of metrics. + You can see accuracy curve or other metric logs on UI. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetObservationLog(self, request, context): + """* + Get all log of Observations for a Trial. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteObservationLog(self, request, context): + """* + Delete all log of Observations for a Trial. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + + def add_ManagerServicer_to_server(servicer, server): + rpc_method_handlers = { + 'ReportObservationLog': grpc.unary_unary_rpc_method_handler( + servicer.ReportObservationLog, + request_deserializer=ReportObservationLogRequest.FromString, + response_serializer=ReportObservationLogReply.SerializeToString, + ), + 'GetObservationLog': grpc.unary_unary_rpc_method_handler( + servicer.GetObservationLog, + request_deserializer=GetObservationLogRequest.FromString, + response_serializer=GetObservationLogReply.SerializeToString, + ), + 'DeleteObservationLog': grpc.unary_unary_rpc_method_handler( + servicer.DeleteObservationLog, + request_deserializer=DeleteObservationLogRequest.FromString, + response_serializer=DeleteObservationLogReply.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'api.v1.beta1.Manager', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + + + class SuggestionStub(object): + # missing associated documentation comment in .proto file + pass + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.GetSuggestions = channel.unary_unary( + '/api.v1.beta1.Suggestion/GetSuggestions', + request_serializer=GetSuggestionsRequest.SerializeToString, + response_deserializer=GetSuggestionsReply.FromString, + ) + self.ValidateAlgorithmSettings = channel.unary_unary( + '/api.v1.beta1.Suggestion/ValidateAlgorithmSettings', + request_serializer=ValidateAlgorithmSettingsRequest.SerializeToString, + response_deserializer=ValidateAlgorithmSettingsReply.FromString, + ) + + + class SuggestionServicer(object): + # missing associated documentation comment in .proto file + pass + + def GetSuggestions(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ValidateAlgorithmSettings(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + + def add_SuggestionServicer_to_server(servicer, server): + rpc_method_handlers = { + 'GetSuggestions': grpc.unary_unary_rpc_method_handler( + servicer.GetSuggestions, + request_deserializer=GetSuggestionsRequest.FromString, + response_serializer=GetSuggestionsReply.SerializeToString, + ), + 'ValidateAlgorithmSettings': grpc.unary_unary_rpc_method_handler( + servicer.ValidateAlgorithmSettings, + request_deserializer=ValidateAlgorithmSettingsRequest.FromString, + response_serializer=ValidateAlgorithmSettingsReply.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'api.v1.beta1.Suggestion', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + + + class EarlyStoppingStub(object): + """TODO: This feature is not yet fully implemented. + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + + + class EarlyStoppingServicer(object): + """TODO: This feature is not yet fully implemented. + """ + + + def add_EarlyStoppingServicer_to_server(servicer, server): + rpc_method_handlers = { + } + generic_handler = grpc.method_handlers_generic_handler( + 'api.v1.beta1.EarlyStopping', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + + + class BetaManagerServicer(object): + """The Beta API is deprecated for 0.15.0 and later. + + It is recommended to use the GA API (classes and functions in this + file not marked beta) for all further purposes. This class was generated + only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""" + """* + Service for Main API for Katib + For each RPC service, we define mapping to HTTP REST API method. + The mapping includes the URL path, query parameters and request body. + https://cloud.google.com/service-infrastructure/docs/service-management/reference/rpc/google.api#http + """ + def ReportObservationLog(self, request, context): + """* + Report a log of Observations for a Trial. + The log consists of timestamp and value of metric. + Katib store every log of metrics. + You can see accuracy curve or other metric logs on UI. + """ + context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) + def GetObservationLog(self, request, context): + """* + Get all log of Observations for a Trial. + """ + context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) + def DeleteObservationLog(self, request, context): + """* + Delete all log of Observations for a Trial. + """ + context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) + + + class BetaManagerStub(object): + """The Beta API is deprecated for 0.15.0 and later. + + It is recommended to use the GA API (classes and functions in this + file not marked beta) for all further purposes. This class was generated + only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""" + """* + Service for Main API for Katib + For each RPC service, we define mapping to HTTP REST API method. + The mapping includes the URL path, query parameters and request body. + https://cloud.google.com/service-infrastructure/docs/service-management/reference/rpc/google.api#http + """ + def ReportObservationLog(self, request, timeout, metadata=None, with_call=False, protocol_options=None): + """* + Report a log of Observations for a Trial. + The log consists of timestamp and value of metric. + Katib store every log of metrics. + You can see accuracy curve or other metric logs on UI. + """ + raise NotImplementedError() + ReportObservationLog.future = None + def GetObservationLog(self, request, timeout, metadata=None, with_call=False, protocol_options=None): + """* + Get all log of Observations for a Trial. + """ + raise NotImplementedError() + GetObservationLog.future = None + def DeleteObservationLog(self, request, timeout, metadata=None, with_call=False, protocol_options=None): + """* + Delete all log of Observations for a Trial. + """ + raise NotImplementedError() + DeleteObservationLog.future = None + + + def beta_create_Manager_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None): + """The Beta API is deprecated for 0.15.0 and later. + + It is recommended to use the GA API (classes and functions in this + file not marked beta) for all further purposes. This function was + generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0""" + request_deserializers = { + ('api.v1.beta1.Manager', 'DeleteObservationLog'): DeleteObservationLogRequest.FromString, + ('api.v1.beta1.Manager', 'GetObservationLog'): GetObservationLogRequest.FromString, + ('api.v1.beta1.Manager', 'ReportObservationLog'): ReportObservationLogRequest.FromString, + } + response_serializers = { + ('api.v1.beta1.Manager', 'DeleteObservationLog'): DeleteObservationLogReply.SerializeToString, + ('api.v1.beta1.Manager', 'GetObservationLog'): GetObservationLogReply.SerializeToString, + ('api.v1.beta1.Manager', 'ReportObservationLog'): ReportObservationLogReply.SerializeToString, + } + method_implementations = { + ('api.v1.beta1.Manager', 'DeleteObservationLog'): face_utilities.unary_unary_inline(servicer.DeleteObservationLog), + ('api.v1.beta1.Manager', 'GetObservationLog'): face_utilities.unary_unary_inline(servicer.GetObservationLog), + ('api.v1.beta1.Manager', 'ReportObservationLog'): face_utilities.unary_unary_inline(servicer.ReportObservationLog), + } + server_options = beta_implementations.server_options(request_deserializers=request_deserializers, response_serializers=response_serializers, thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout) + return beta_implementations.server(method_implementations, options=server_options) + + + def beta_create_Manager_stub(channel, host=None, metadata_transformer=None, pool=None, pool_size=None): + """The Beta API is deprecated for 0.15.0 and later. + + It is recommended to use the GA API (classes and functions in this + file not marked beta) for all further purposes. This function was + generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0""" + request_serializers = { + ('api.v1.beta1.Manager', 'DeleteObservationLog'): DeleteObservationLogRequest.SerializeToString, + ('api.v1.beta1.Manager', 'GetObservationLog'): GetObservationLogRequest.SerializeToString, + ('api.v1.beta1.Manager', 'ReportObservationLog'): ReportObservationLogRequest.SerializeToString, + } + response_deserializers = { + ('api.v1.beta1.Manager', 'DeleteObservationLog'): DeleteObservationLogReply.FromString, + ('api.v1.beta1.Manager', 'GetObservationLog'): GetObservationLogReply.FromString, + ('api.v1.beta1.Manager', 'ReportObservationLog'): ReportObservationLogReply.FromString, + } + cardinalities = { + 'DeleteObservationLog': cardinality.Cardinality.UNARY_UNARY, + 'GetObservationLog': cardinality.Cardinality.UNARY_UNARY, + 'ReportObservationLog': cardinality.Cardinality.UNARY_UNARY, + } + stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, request_serializers=request_serializers, response_deserializers=response_deserializers, thread_pool=pool, thread_pool_size=pool_size) + return beta_implementations.dynamic_stub(channel, 'api.v1.beta1.Manager', cardinalities, options=stub_options) + + + class BetaSuggestionServicer(object): + """The Beta API is deprecated for 0.15.0 and later. + + It is recommended to use the GA API (classes and functions in this + file not marked beta) for all further purposes. This class was generated + only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""" + # missing associated documentation comment in .proto file + pass + def GetSuggestions(self, request, context): + # missing associated documentation comment in .proto file + pass + context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) + def ValidateAlgorithmSettings(self, request, context): + # missing associated documentation comment in .proto file + pass + context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) + + + class BetaSuggestionStub(object): + """The Beta API is deprecated for 0.15.0 and later. + + It is recommended to use the GA API (classes and functions in this + file not marked beta) for all further purposes. This class was generated + only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""" + # missing associated documentation comment in .proto file + pass + def GetSuggestions(self, request, timeout, metadata=None, with_call=False, protocol_options=None): + # missing associated documentation comment in .proto file + pass + raise NotImplementedError() + GetSuggestions.future = None + def ValidateAlgorithmSettings(self, request, timeout, metadata=None, with_call=False, protocol_options=None): + # missing associated documentation comment in .proto file + pass + raise NotImplementedError() + ValidateAlgorithmSettings.future = None + + + def beta_create_Suggestion_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None): + """The Beta API is deprecated for 0.15.0 and later. + + It is recommended to use the GA API (classes and functions in this + file not marked beta) for all further purposes. This function was + generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0""" + request_deserializers = { + ('api.v1.beta1.Suggestion', 'GetSuggestions'): GetSuggestionsRequest.FromString, + ('api.v1.beta1.Suggestion', 'ValidateAlgorithmSettings'): ValidateAlgorithmSettingsRequest.FromString, + } + response_serializers = { + ('api.v1.beta1.Suggestion', 'GetSuggestions'): GetSuggestionsReply.SerializeToString, + ('api.v1.beta1.Suggestion', 'ValidateAlgorithmSettings'): ValidateAlgorithmSettingsReply.SerializeToString, + } + method_implementations = { + ('api.v1.beta1.Suggestion', 'GetSuggestions'): face_utilities.unary_unary_inline(servicer.GetSuggestions), + ('api.v1.beta1.Suggestion', 'ValidateAlgorithmSettings'): face_utilities.unary_unary_inline(servicer.ValidateAlgorithmSettings), + } + server_options = beta_implementations.server_options(request_deserializers=request_deserializers, response_serializers=response_serializers, thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout) + return beta_implementations.server(method_implementations, options=server_options) + + + def beta_create_Suggestion_stub(channel, host=None, metadata_transformer=None, pool=None, pool_size=None): + """The Beta API is deprecated for 0.15.0 and later. + + It is recommended to use the GA API (classes and functions in this + file not marked beta) for all further purposes. This function was + generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0""" + request_serializers = { + ('api.v1.beta1.Suggestion', 'GetSuggestions'): GetSuggestionsRequest.SerializeToString, + ('api.v1.beta1.Suggestion', 'ValidateAlgorithmSettings'): ValidateAlgorithmSettingsRequest.SerializeToString, + } + response_deserializers = { + ('api.v1.beta1.Suggestion', 'GetSuggestions'): GetSuggestionsReply.FromString, + ('api.v1.beta1.Suggestion', 'ValidateAlgorithmSettings'): ValidateAlgorithmSettingsReply.FromString, + } + cardinalities = { + 'GetSuggestions': cardinality.Cardinality.UNARY_UNARY, + 'ValidateAlgorithmSettings': cardinality.Cardinality.UNARY_UNARY, + } + stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, request_serializers=request_serializers, response_deserializers=response_deserializers, thread_pool=pool, thread_pool_size=pool_size) + return beta_implementations.dynamic_stub(channel, 'api.v1.beta1.Suggestion', cardinalities, options=stub_options) + + + class BetaEarlyStoppingServicer(object): + """The Beta API is deprecated for 0.15.0 and later. + + It is recommended to use the GA API (classes and functions in this + file not marked beta) for all further purposes. This class was generated + only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""" + """TODO: This feature is not yet fully implemented. + """ + + + class BetaEarlyStoppingStub(object): + """The Beta API is deprecated for 0.15.0 and later. + + It is recommended to use the GA API (classes and functions in this + file not marked beta) for all further purposes. This class was generated + only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""" + """TODO: This feature is not yet fully implemented. + """ + + + def beta_create_EarlyStopping_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None): + """The Beta API is deprecated for 0.15.0 and later. + + It is recommended to use the GA API (classes and functions in this + file not marked beta) for all further purposes. This function was + generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0""" + request_deserializers = { + } + response_serializers = { + } + method_implementations = { + } + server_options = beta_implementations.server_options(request_deserializers=request_deserializers, response_serializers=response_serializers, thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout) + return beta_implementations.server(method_implementations, options=server_options) + + + def beta_create_EarlyStopping_stub(channel, host=None, metadata_transformer=None, pool=None, pool_size=None): + """The Beta API is deprecated for 0.15.0 and later. + + It is recommended to use the GA API (classes and functions in this + file not marked beta) for all further purposes. This function was + generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0""" + request_serializers = { + } + response_deserializers = { + } + cardinalities = { + } + stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, request_serializers=request_serializers, response_deserializers=response_deserializers, thread_pool=pool, thread_pool_size=pool_size) + return beta_implementations.dynamic_stub(channel, 'api.v1.beta1.EarlyStopping', cardinalities, options=stub_options) +except ImportError: + pass +# @@protoc_insertion_point(module_scope) diff --git a/pkg/apis/manager/v1beta1/python/api_pb2_grpc.py b/pkg/apis/manager/v1beta1/python/api_pb2_grpc.py new file mode 100644 index 00000000000..ce8bcd7fa66 --- /dev/null +++ b/pkg/apis/manager/v1beta1/python/api_pb2_grpc.py @@ -0,0 +1,178 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +import grpc + +import api_pb2 as api__pb2 + + +class ManagerStub(object): + """* + Service for Main API for Katib + For each RPC service, we define mapping to HTTP REST API method. + The mapping includes the URL path, query parameters and request body. + https://cloud.google.com/service-infrastructure/docs/service-management/reference/rpc/google.api#http + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.ReportObservationLog = channel.unary_unary( + '/api.v1.beta1.Manager/ReportObservationLog', + request_serializer=api__pb2.ReportObservationLogRequest.SerializeToString, + response_deserializer=api__pb2.ReportObservationLogReply.FromString, + ) + self.GetObservationLog = channel.unary_unary( + '/api.v1.beta1.Manager/GetObservationLog', + request_serializer=api__pb2.GetObservationLogRequest.SerializeToString, + response_deserializer=api__pb2.GetObservationLogReply.FromString, + ) + self.DeleteObservationLog = channel.unary_unary( + '/api.v1.beta1.Manager/DeleteObservationLog', + request_serializer=api__pb2.DeleteObservationLogRequest.SerializeToString, + response_deserializer=api__pb2.DeleteObservationLogReply.FromString, + ) + + +class ManagerServicer(object): + """* + Service for Main API for Katib + For each RPC service, we define mapping to HTTP REST API method. + The mapping includes the URL path, query parameters and request body. + https://cloud.google.com/service-infrastructure/docs/service-management/reference/rpc/google.api#http + """ + + def ReportObservationLog(self, request, context): + """* + Report a log of Observations for a Trial. + The log consists of timestamp and value of metric. + Katib store every log of metrics. + You can see accuracy curve or other metric logs on UI. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetObservationLog(self, request, context): + """* + Get all log of Observations for a Trial. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteObservationLog(self, request, context): + """* + Delete all log of Observations for a Trial. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_ManagerServicer_to_server(servicer, server): + rpc_method_handlers = { + 'ReportObservationLog': grpc.unary_unary_rpc_method_handler( + servicer.ReportObservationLog, + request_deserializer=api__pb2.ReportObservationLogRequest.FromString, + response_serializer=api__pb2.ReportObservationLogReply.SerializeToString, + ), + 'GetObservationLog': grpc.unary_unary_rpc_method_handler( + servicer.GetObservationLog, + request_deserializer=api__pb2.GetObservationLogRequest.FromString, + response_serializer=api__pb2.GetObservationLogReply.SerializeToString, + ), + 'DeleteObservationLog': grpc.unary_unary_rpc_method_handler( + servicer.DeleteObservationLog, + request_deserializer=api__pb2.DeleteObservationLogRequest.FromString, + response_serializer=api__pb2.DeleteObservationLogReply.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'api.v1.beta1.Manager', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + + +class SuggestionStub(object): + # missing associated documentation comment in .proto file + pass + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.GetSuggestions = channel.unary_unary( + '/api.v1.beta1.Suggestion/GetSuggestions', + request_serializer=api__pb2.GetSuggestionsRequest.SerializeToString, + response_deserializer=api__pb2.GetSuggestionsReply.FromString, + ) + self.ValidateAlgorithmSettings = channel.unary_unary( + '/api.v1.beta1.Suggestion/ValidateAlgorithmSettings', + request_serializer=api__pb2.ValidateAlgorithmSettingsRequest.SerializeToString, + response_deserializer=api__pb2.ValidateAlgorithmSettingsReply.FromString, + ) + + +class SuggestionServicer(object): + # missing associated documentation comment in .proto file + pass + + def GetSuggestions(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ValidateAlgorithmSettings(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_SuggestionServicer_to_server(servicer, server): + rpc_method_handlers = { + 'GetSuggestions': grpc.unary_unary_rpc_method_handler( + servicer.GetSuggestions, + request_deserializer=api__pb2.GetSuggestionsRequest.FromString, + response_serializer=api__pb2.GetSuggestionsReply.SerializeToString, + ), + 'ValidateAlgorithmSettings': grpc.unary_unary_rpc_method_handler( + servicer.ValidateAlgorithmSettings, + request_deserializer=api__pb2.ValidateAlgorithmSettingsRequest.FromString, + response_serializer=api__pb2.ValidateAlgorithmSettingsReply.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'api.v1.beta1.Suggestion', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + + +class EarlyStoppingStub(object): + """TODO: This feature is not yet fully implemented. + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + + +class EarlyStoppingServicer(object): + """TODO: This feature is not yet fully implemented. + """ + + +def add_EarlyStoppingServicer_to_server(servicer, server): + rpc_method_handlers = { + } + generic_handler = grpc.method_handlers_generic_handler( + 'api.v1.beta1.EarlyStopping', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) diff --git a/pkg/apis/v1alpha3/swagger.json b/pkg/apis/v1alpha3/swagger.json index eee94f9b3ec..83cdc372518 100644 --- a/pkg/apis/v1alpha3/swagger.json +++ b/pkg/apis/v1alpha3/swagger.json @@ -1,8 +1,8 @@ { "swagger": "2.0", "info": { - "description": "swagger description for katib", - "title": "katib", + "description": "Swagger description for Katib", + "title": "Katib", "version": "v0.1" }, "paths": {}, diff --git a/pkg/apis/v1beta1/openapi_generated.go b/pkg/apis/v1beta1/openapi_generated.go new file mode 100644 index 00000000000..854bacf64b4 --- /dev/null +++ b/pkg/apis/v1beta1/openapi_generated.go @@ -0,0 +1,1503 @@ +// +build !ignore_autogenerated + +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +// Code generated by main. DO NOT EDIT. + +// This file was autogenerated by openapi-gen. Do not edit it manually! + +package v1beta1 + +import ( + spec "github.com/go-openapi/spec" + common "k8s.io/kube-openapi/pkg/common" +) + +func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition { + return map[string]common.OpenAPIDefinition{ + "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.AlgorithmSetting": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Properties: map[string]spec.Schema{ + "name": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "value": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + Dependencies: []string{}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.AlgorithmSpec": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Properties: map[string]spec.Schema{ + "algorithmName": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "algorithmSettings": { + SchemaProps: spec.SchemaProps{ + Description: "Key-value pairs representing settings for suggestion algorithms.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.AlgorithmSetting"), + }, + }, + }, + }, + }, + "earlyStopping": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.EarlyStoppingSpec"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.AlgorithmSetting", "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.EarlyStoppingSpec"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.CollectorSpec": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "customCollector": { + SchemaProps: spec.SchemaProps{ + Description: "When kind is \"customCollector\", this field will be used", + Ref: ref("k8s.io/api/core/v1.Container"), + }, + }, + }, + Required: []string{"kind"}, + }, + }, + Dependencies: []string{ + "k8s.io/api/core/v1.Container"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.EarlyStoppingSetting": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Properties: map[string]spec.Schema{ + "name": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "value": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + Dependencies: []string{}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.EarlyStoppingSpec": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Properties: map[string]spec.Schema{ + "earlyStoppingAlgorithmName": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "earlyStoppingSettings": { + SchemaProps: spec.SchemaProps{ + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.EarlyStoppingSetting"), + }, + }, + }, + }, + }, + }, + Required: []string{"earlyStoppingSettings"}, + }, + }, + Dependencies: []string{ + "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.EarlyStoppingSetting"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.FileSystemPath": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Properties: map[string]spec.Schema{ + "path": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "kind": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + Dependencies: []string{}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.FilterSpec": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Properties: map[string]spec.Schema{ + "metricsFormat": { + SchemaProps: spec.SchemaProps{ + Description: "When the metrics output follows format as this field specified, metricsCollector collects it and reports to metrics server, it can be \": \" or else", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + }, + }, + }, + Dependencies: []string{}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.Metric": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Properties: map[string]spec.Schema{ + "name": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "value": { + SchemaProps: spec.SchemaProps{ + Type: []string{"number"}, + Format: "double", + }, + }, + }, + }, + }, + Dependencies: []string{}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.MetricsCollectorSpec": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Properties: map[string]spec.Schema{ + "source": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.SourceSpec"), + }, + }, + "collector": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.CollectorSpec"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.CollectorSpec", "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.SourceSpec"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.ObjectiveSpec": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Properties: map[string]spec.Schema{ + "type": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "goal": { + SchemaProps: spec.SchemaProps{ + Type: []string{"number"}, + Format: "double", + }, + }, + "objectiveMetricName": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "additionalMetricNames": { + SchemaProps: spec.SchemaProps{ + Description: "This can be empty if we only care about the objective metric. Note: If we adopt a push instead of pull mechanism, this can be omitted completely.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + }, + }, + }, + Dependencies: []string{}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.Observation": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Properties: map[string]spec.Schema{ + "metrics": { + SchemaProps: spec.SchemaProps{ + Description: "Key-value pairs for metric names and values", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.Metric"), + }, + }, + }, + }, + }, + }, + Required: []string{"metrics"}, + }, + }, + Dependencies: []string{ + "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.Metric"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.ParameterAssignment": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Properties: map[string]spec.Schema{ + "name": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "value": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + Dependencies: []string{}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.SourceSpec": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Properties: map[string]spec.Schema{ + "httpGet": { + SchemaProps: spec.SchemaProps{ + Description: "Model-train source code can expose metrics by http, such as HTTP endpoint in prometheus metric format", + Ref: ref("k8s.io/api/core/v1.HTTPGetAction"), + }, + }, + "fileSystemPath": { + SchemaProps: spec.SchemaProps{ + Description: "During training model, metrics may be persisted into local file in source code, such as tfEvent use case", + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.FileSystemPath"), + }, + }, + "filter": { + SchemaProps: spec.SchemaProps{ + Description: "Default metric output format is {\"metric\": \"\", \"value\": , \"epoch\": , \"step\": }, but if the output doesn't follow default format, please extend it here", + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.FilterSpec"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.FileSystemPath", "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.FilterSpec", "k8s.io/api/core/v1.HTTPGetAction"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.Experiment": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Structure of the Experiment custom resource.", + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + }, + }, + "spec": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.ExperimentSpec"), + }, + }, + "status": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.ExperimentStatus"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.ExperimentSpec", "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.ExperimentStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.ExperimentCondition": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "ExperimentCondition describes the state of the experiment at a certain point.", + Properties: map[string]spec.Schema{ + "type": { + SchemaProps: spec.SchemaProps{ + Description: "Type of experiment condition.", + Type: []string{"string"}, + Format: "", + }, + }, + "status": { + SchemaProps: spec.SchemaProps{ + Description: "Status of the condition, one of True, False, Unknown.", + Type: []string{"string"}, + Format: "", + }, + }, + "reason": { + SchemaProps: spec.SchemaProps{ + Description: "The reason for the condition's last transition.", + Type: []string{"string"}, + Format: "", + }, + }, + "message": { + SchemaProps: spec.SchemaProps{ + Description: "A human readable message indicating details about the transition.", + Type: []string{"string"}, + Format: "", + }, + }, + "lastUpdateTime": { + SchemaProps: spec.SchemaProps{ + Description: "The last time this condition was updated.", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + "lastTransitionTime": { + SchemaProps: spec.SchemaProps{ + Description: "Last time the condition transitioned from one status to another.", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + }, + Required: []string{"type", "status"}, + }, + }, + Dependencies: []string{ + "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.ExperimentList": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "ExperimentList contains a list of Experiments", + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), + }, + }, + "items": { + SchemaProps: spec.SchemaProps{ + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.Experiment"), + }, + }, + }, + }, + }, + }, + Required: []string{"items"}, + }, + }, + Dependencies: []string{ + "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.Experiment", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.ExperimentSpec": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Properties: map[string]spec.Schema{ + "parameters": { + SchemaProps: spec.SchemaProps{ + Description: "List of hyperparameter configurations.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.ParameterSpec"), + }, + }, + }, + }, + }, + "objective": { + SchemaProps: spec.SchemaProps{ + Description: "Describes the objective of the experiment.", + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.ObjectiveSpec"), + }, + }, + "algorithm": { + SchemaProps: spec.SchemaProps{ + Description: "Describes the suggestion algorithm.", + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.AlgorithmSpec"), + }, + }, + "trialTemplate": { + SchemaProps: spec.SchemaProps{ + Description: "Template for each run of the trial.", + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.TrialTemplate"), + }, + }, + "parallelTrialCount": { + SchemaProps: spec.SchemaProps{ + Description: "How many trials can be processed in parallel. Defaults to 3", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "maxTrialCount": { + SchemaProps: spec.SchemaProps{ + Description: "Max completed trials to mark experiment as succeeded", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "maxFailedTrialCount": { + SchemaProps: spec.SchemaProps{ + Description: "Max failed trials to mark experiment as failed.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "metricsCollectorSpec": { + SchemaProps: spec.SchemaProps{ + Description: "Describes the specification of the metrics collector", + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.MetricsCollectorSpec"), + }, + }, + "nasConfig": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.NasConfig"), + }, + }, + "resumePolicy": { + SchemaProps: spec.SchemaProps{ + Description: "Describes resuming policy which usually take effect after experiment terminated.", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.AlgorithmSpec", "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.MetricsCollectorSpec", "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.ObjectiveSpec", "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.NasConfig", "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.ParameterSpec", "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.TrialTemplate"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.ExperimentStatus": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Properties: map[string]spec.Schema{ + "startTime": { + SchemaProps: spec.SchemaProps{ + Description: "Represents time when the Experiment was acknowledged by the Experiment controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + "completionTime": { + SchemaProps: spec.SchemaProps{ + Description: "Represents time when the Experiment was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + "lastReconcileTime": { + SchemaProps: spec.SchemaProps{ + Description: "Represents last time when the Experiment was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + "conditions": { + SchemaProps: spec.SchemaProps{ + Description: "List of observed runtime conditions for this Experiment.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.ExperimentCondition"), + }, + }, + }, + }, + }, + "currentOptimalTrial": { + SchemaProps: spec.SchemaProps{ + Description: "Current optimal trial parameters and observations.", + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.OptimalTrial"), + }, + }, + "runningTrialList": { + SchemaProps: spec.SchemaProps{ + Description: "List of trial names which are running.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "pendingTrialList": { + SchemaProps: spec.SchemaProps{ + Description: "List of trial names which are pending.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "failedTrialList": { + SchemaProps: spec.SchemaProps{ + Description: "List of trial names which have already failed.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "succeededTrialList": { + SchemaProps: spec.SchemaProps{ + Description: "List of trial names which have already succeeded.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "killedTrialList": { + SchemaProps: spec.SchemaProps{ + Description: "List of trial names which have been killed.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "trials": { + SchemaProps: spec.SchemaProps{ + Description: "Trials is the total number of trials owned by the experiment.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "trialsSucceeded": { + SchemaProps: spec.SchemaProps{ + Description: "How many trials have succeeded.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "trialsFailed": { + SchemaProps: spec.SchemaProps{ + Description: "How many trials have failed.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "trialsKilled": { + SchemaProps: spec.SchemaProps{ + Description: "How many trials have been killed.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "trialsPending": { + SchemaProps: spec.SchemaProps{ + Description: "How many trials are currently pending.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "trialsRunning": { + SchemaProps: spec.SchemaProps{ + Description: "How many trials are currently running.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.ExperimentCondition", "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.OptimalTrial", "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.FeasibleSpace": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Properties: map[string]spec.Schema{ + "max": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "min": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "list": { + SchemaProps: spec.SchemaProps{ + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "step": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + Dependencies: []string{}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.GoTemplate": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Properties: map[string]spec.Schema{ + "templateSpec": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.TemplateSpec"), + }, + }, + "rawTemplate": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.TemplateSpec"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.GraphConfig": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "GraphConfig contains a config of DAG", + Properties: map[string]spec.Schema{ + "numLayers": { + SchemaProps: spec.SchemaProps{ + Type: []string{"integer"}, + Format: "int32", + }, + }, + "inputSizes": { + SchemaProps: spec.SchemaProps{ + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"integer"}, + Format: "int32", + }, + }, + }, + }, + }, + "outputSizes": { + SchemaProps: spec.SchemaProps{ + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"integer"}, + Format: "int32", + }, + }, + }, + }, + }, + }, + }, + }, + Dependencies: []string{}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.NasConfig": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "NasConfig contains config for NAS job", + Properties: map[string]spec.Schema{ + "graphConfig": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.GraphConfig"), + }, + }, + "operations": { + SchemaProps: spec.SchemaProps{ + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.Operation"), + }, + }, + }, + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.GraphConfig", "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.Operation"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.Operation": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Operation contains type of operation in DAG", + Properties: map[string]spec.Schema{ + "operationType": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "parameters": { + SchemaProps: spec.SchemaProps{ + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.ParameterSpec"), + }, + }, + }, + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.ParameterSpec"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.OptimalTrial": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "OptimalTrial is the metrics and assignments of the best trial.", + Properties: map[string]spec.Schema{ + "bestTrialName": { + SchemaProps: spec.SchemaProps{ + Description: "BestTrialName is the name of the best trial.", + Type: []string{"string"}, + Format: "", + }, + }, + "parameterAssignments": { + SchemaProps: spec.SchemaProps{ + Description: "Key-value pairs for hyperparameters and assignment values.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.ParameterAssignment"), + }, + }, + }, + }, + }, + "observation": { + SchemaProps: spec.SchemaProps{ + Description: "Observation for this trial", + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.Observation"), + }, + }, + }, + Required: []string{"bestTrialName", "parameterAssignments"}, + }, + }, + Dependencies: []string{ + "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.Observation", "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.ParameterAssignment"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.ParameterSpec": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Properties: map[string]spec.Schema{ + "name": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "parameterType": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "feasibleSpace": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.FeasibleSpace"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.FeasibleSpace"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.TemplateSpec": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Properties: map[string]spec.Schema{ + "configMapName": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "configMapNamespace": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "templatePath": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + Dependencies: []string{}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.TrialTemplate": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Properties: map[string]spec.Schema{ + "retain": { + SchemaProps: spec.SchemaProps{ + Type: []string{"boolean"}, + Format: "", + }, + }, + "goTemplate": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.GoTemplate"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1.GoTemplate"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1.Suggestion": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Suggestion represents the structure of a Suggestion resource.", + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + }, + }, + "spec": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1.SuggestionSpec"), + }, + }, + "status": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1.SuggestionStatus"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1.SuggestionSpec", "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1.SuggestionStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1.SuggestionCondition": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "SuggestionCondition describes the state of the Suggestion at a certain point.", + Properties: map[string]spec.Schema{ + "type": { + SchemaProps: spec.SchemaProps{ + Description: "Type of Suggestion condition.", + Type: []string{"string"}, + Format: "", + }, + }, + "status": { + SchemaProps: spec.SchemaProps{ + Description: "Status of the condition, one of True, False, Unknown.", + Type: []string{"string"}, + Format: "", + }, + }, + "reason": { + SchemaProps: spec.SchemaProps{ + Description: "The reason for the condition's last transition.", + Type: []string{"string"}, + Format: "", + }, + }, + "message": { + SchemaProps: spec.SchemaProps{ + Description: "A human readable message indicating details about the transition.", + Type: []string{"string"}, + Format: "", + }, + }, + "lastUpdateTime": { + SchemaProps: spec.SchemaProps{ + Description: "The last time this condition was updated.", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + "lastTransitionTime": { + SchemaProps: spec.SchemaProps{ + Description: "Last time the condition transitioned from one status to another.", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + }, + Required: []string{"type", "status"}, + }, + }, + Dependencies: []string{ + "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1.SuggestionList": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "SuggestionList contains a list of Suggestion", + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), + }, + }, + "items": { + SchemaProps: spec.SchemaProps{ + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1.Suggestion"), + }, + }, + }, + }, + }, + }, + Required: []string{"items"}, + }, + }, + Dependencies: []string{ + "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1.Suggestion", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1.SuggestionSpec": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "SuggestionSpec defines the desired state of Suggestion", + Properties: map[string]spec.Schema{ + "algorithmName": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "requests": { + SchemaProps: spec.SchemaProps{ + Description: "Number of suggestions requested", + Type: []string{"integer"}, + Format: "int32", + }, + }, + }, + Required: []string{"algorithmName"}, + }, + }, + Dependencies: []string{}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1.SuggestionStatus": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "SuggestionStatus defines the observed state of Suggestion", + Properties: map[string]spec.Schema{ + "algorithmSettings": { + SchemaProps: spec.SchemaProps{ + Description: "Algorithmsettings set by the algorithm services.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.AlgorithmSetting"), + }, + }, + }, + }, + }, + "suggestionCount": { + SchemaProps: spec.SchemaProps{ + Description: "Number of suggestion results", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "suggestions": { + SchemaProps: spec.SchemaProps{ + Description: "Suggestion results", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1.TrialAssignment"), + }, + }, + }, + }, + }, + "startTime": { + SchemaProps: spec.SchemaProps{ + Description: "Represents time when the Suggestion was acknowledged by the Suggestion controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + "completionTime": { + SchemaProps: spec.SchemaProps{ + Description: "Represents time when the Suggestion was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + "lastReconcileTime": { + SchemaProps: spec.SchemaProps{ + Description: "Represents last time when the Suggestion was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + "conditions": { + SchemaProps: spec.SchemaProps{ + Description: "List of observed runtime conditions for this Suggestion.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1.SuggestionCondition"), + }, + }, + }, + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.AlgorithmSetting", "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1.SuggestionCondition", "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1.TrialAssignment", "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1.TrialAssignment": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "TrialAssignment is the assignment for one trial.", + Properties: map[string]spec.Schema{ + "parameterAssignments": { + SchemaProps: spec.SchemaProps{ + Description: "Suggestion results", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.ParameterAssignment"), + }, + }, + }, + }, + }, + "name": { + SchemaProps: spec.SchemaProps{ + Description: "Name of the suggestion", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.ParameterAssignment"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1.Trial": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Represents the structure of a Trial resource.", + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + }, + }, + "spec": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1.TrialSpec"), + }, + }, + "status": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1.TrialStatus"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1.TrialSpec", "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1.TrialStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1.TrialCondition": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "TrialCondition describes the state of the trial at a certain point.", + Properties: map[string]spec.Schema{ + "type": { + SchemaProps: spec.SchemaProps{ + Description: "Type of trial condition.", + Type: []string{"string"}, + Format: "", + }, + }, + "status": { + SchemaProps: spec.SchemaProps{ + Description: "Status of the condition, one of True, False, Unknown.", + Type: []string{"string"}, + Format: "", + }, + }, + "reason": { + SchemaProps: spec.SchemaProps{ + Description: "The reason for the condition's last transition.", + Type: []string{"string"}, + Format: "", + }, + }, + "message": { + SchemaProps: spec.SchemaProps{ + Description: "A human readable message indicating details about the transition.", + Type: []string{"string"}, + Format: "", + }, + }, + "lastUpdateTime": { + SchemaProps: spec.SchemaProps{ + Description: "The last time this condition was updated.", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + "lastTransitionTime": { + SchemaProps: spec.SchemaProps{ + Description: "Last time the condition transitioned from one status to another.", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + }, + Required: []string{"type", "status"}, + }, + }, + Dependencies: []string{ + "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1.TrialList": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "TrialList contains a list of Trials", + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), + }, + }, + "items": { + SchemaProps: spec.SchemaProps{ + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1.Trial"), + }, + }, + }, + }, + }, + }, + Required: []string{"items"}, + }, + }, + Dependencies: []string{ + "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1.Trial", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1.TrialSpec": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Properties: map[string]spec.Schema{ + "objective": { + SchemaProps: spec.SchemaProps{ + Description: "Describes the objective of the experiment.", + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.ObjectiveSpec"), + }, + }, + "parameterAssignments": { + SchemaProps: spec.SchemaProps{ + Description: "Key-value pairs for hyperparameters and assignment values.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.ParameterAssignment"), + }, + }, + }, + }, + }, + "runSpec": { + SchemaProps: spec.SchemaProps{ + Description: "Raw text for the trial run spec. This can be any generic Kubernetes runtime object. The trial operator should create the resource as written, and let the corresponding resource controller (e.g. tf-operator) handle the rest.", + Type: []string{"string"}, + Format: "", + }, + }, + "retainRun": { + SchemaProps: spec.SchemaProps{ + Description: "Whether to retain the trial run object after completed.", + Type: []string{"boolean"}, + Format: "", + }, + }, + "metricsCollector": { + SchemaProps: spec.SchemaProps{ + Description: "Describes how metrics will be collected", + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.MetricsCollectorSpec"), + }, + }, + }, + Required: []string{"parameterAssignments"}, + }, + }, + Dependencies: []string{ + "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.MetricsCollectorSpec", "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.ObjectiveSpec", "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.ParameterAssignment"}, + }, + "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1.TrialStatus": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Properties: map[string]spec.Schema{ + "startTime": { + SchemaProps: spec.SchemaProps{ + Description: "Represents time when the Trial was acknowledged by the Trial controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + "completionTime": { + SchemaProps: spec.SchemaProps{ + Description: "Represents time when the Trial was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + "lastReconcileTime": { + SchemaProps: spec.SchemaProps{ + Description: "Represents last time when the Trial was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + "conditions": { + SchemaProps: spec.SchemaProps{ + Description: "List of observed runtime conditions for this Trial.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1.TrialCondition"), + }, + }, + }, + }, + }, + "observation": { + SchemaProps: spec.SchemaProps{ + Description: "Results of the Trial - objectives and other metrics values.", + Ref: ref("github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.Observation"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1.Observation", "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1.TrialCondition", "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, + }, + } +} diff --git a/pkg/apis/v1beta1/swagger.json b/pkg/apis/v1beta1/swagger.json new file mode 100644 index 00000000000..e6a897739e8 --- /dev/null +++ b/pkg/apis/v1beta1/swagger.json @@ -0,0 +1,834 @@ +{ + "swagger": "2.0", + "info": { + "description": "Swagger description for Katib", + "title": "Katib", + "version": "v0.1" + }, + "paths": {}, + "definitions": { + ".v1beta1.Suggestion": { + "description": "Suggestion represents the structure of a Suggestion resource.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/v1.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/.v1beta1.SuggestionSpec" + }, + "status": { + "$ref": "#/definitions/.v1beta1.SuggestionStatus" + } + } + }, + ".v1beta1.SuggestionCondition": { + "description": "SuggestionCondition describes the state of the Suggestion at a certain point.", + "required": [ + "type", + "status" + ], + "properties": { + "lastTransitionTime": { + "description": "Last time the condition transitioned from one status to another.", + "$ref": "#/definitions/v1.Time" + }, + "lastUpdateTime": { + "description": "The last time this condition was updated.", + "$ref": "#/definitions/v1.Time" + }, + "message": { + "description": "A human readable message indicating details about the transition.", + "type": "string" + }, + "reason": { + "description": "The reason for the condition's last transition.", + "type": "string" + }, + "status": { + "description": "Status of the condition, one of True, False, Unknown.", + "type": "string" + }, + "type": { + "description": "Type of Suggestion condition.", + "type": "string" + } + } + }, + ".v1beta1.SuggestionList": { + "description": "SuggestionList contains a list of Suggestion", + "required": [ + "items" + ], + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + "type": "string" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/.v1beta1.Suggestion" + } + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/v1.ListMeta" + } + } + }, + ".v1beta1.SuggestionSpec": { + "description": "SuggestionSpec defines the desired state of Suggestion", + "required": [ + "algorithmName" + ], + "properties": { + "algorithmName": { + "type": "string" + }, + "requests": { + "description": "Number of suggestions requested", + "type": "integer", + "format": "int32" + } + } + }, + ".v1beta1.SuggestionStatus": { + "description": "SuggestionStatus defines the observed state of Suggestion", + "properties": { + "algorithmSettings": { + "description": "Algorithmsettings set by the algorithm services.", + "type": "array", + "items": { + "$ref": "#/definitions/v1beta1.AlgorithmSetting" + } + }, + "completionTime": { + "description": "Represents time when the Suggestion was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", + "$ref": "#/definitions/v1.Time" + }, + "conditions": { + "description": "List of observed runtime conditions for this Suggestion.", + "type": "array", + "items": { + "$ref": "#/definitions/.v1beta1.SuggestionCondition" + } + }, + "lastReconcileTime": { + "description": "Represents last time when the Suggestion was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", + "$ref": "#/definitions/v1.Time" + }, + "startTime": { + "description": "Represents time when the Suggestion was acknowledged by the Suggestion controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", + "$ref": "#/definitions/v1.Time" + }, + "suggestionCount": { + "description": "Number of suggestion results", + "type": "integer", + "format": "int32" + }, + "suggestions": { + "description": "Suggestion results", + "type": "array", + "items": { + "$ref": "#/definitions/.v1beta1.TrialAssignment" + } + } + } + }, + ".v1beta1.Trial": { + "description": "Represents the structure of a Trial resource.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/v1.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/.v1beta1.TrialSpec" + }, + "status": { + "$ref": "#/definitions/.v1beta1.TrialStatus" + } + } + }, + ".v1beta1.TrialAssignment": { + "description": "TrialAssignment is the assignment for one trial.", + "properties": { + "name": { + "description": "Name of the suggestion", + "type": "string" + }, + "parameterAssignments": { + "description": "Suggestion results", + "type": "array", + "items": { + "$ref": "#/definitions/v1beta1.ParameterAssignment" + } + } + } + }, + ".v1beta1.TrialCondition": { + "description": "TrialCondition describes the state of the trial at a certain point.", + "required": [ + "type", + "status" + ], + "properties": { + "lastTransitionTime": { + "description": "Last time the condition transitioned from one status to another.", + "$ref": "#/definitions/v1.Time" + }, + "lastUpdateTime": { + "description": "The last time this condition was updated.", + "$ref": "#/definitions/v1.Time" + }, + "message": { + "description": "A human readable message indicating details about the transition.", + "type": "string" + }, + "reason": { + "description": "The reason for the condition's last transition.", + "type": "string" + }, + "status": { + "description": "Status of the condition, one of True, False, Unknown.", + "type": "string" + }, + "type": { + "description": "Type of trial condition.", + "type": "string" + } + } + }, + ".v1beta1.TrialList": { + "description": "TrialList contains a list of Trials", + "required": [ + "items" + ], + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + "type": "string" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/.v1beta1.Trial" + } + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/v1.ListMeta" + } + } + }, + ".v1beta1.TrialSpec": { + "required": [ + "parameterAssignments" + ], + "properties": { + "metricsCollector": { + "description": "Describes how metrics will be collected", + "$ref": "#/definitions/v1beta1.MetricsCollectorSpec" + }, + "objective": { + "description": "Describes the objective of the experiment.", + "$ref": "#/definitions/v1beta1.ObjectiveSpec" + }, + "parameterAssignments": { + "description": "Key-value pairs for hyperparameters and assignment values.", + "type": "array", + "items": { + "$ref": "#/definitions/v1beta1.ParameterAssignment" + } + }, + "retainRun": { + "description": "Whether to retain the trial run object after completed.", + "type": "boolean" + }, + "runSpec": { + "description": "Raw text for the trial run spec. This can be any generic Kubernetes runtime object. The trial operator should create the resource as written, and let the corresponding resource controller (e.g. tf-operator) handle the rest.", + "type": "string" + } + } + }, + ".v1beta1.TrialStatus": { + "properties": { + "completionTime": { + "description": "Represents time when the Trial was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC", + "$ref": "#/definitions/v1.Time" + }, + "conditions": { + "description": "List of observed runtime conditions for this Trial.", + "type": "array", + "items": { + "$ref": "#/definitions/.v1beta1.TrialCondition" + } + }, + "lastReconcileTime": { + "description": "Represents last time when the Trial was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", + "$ref": "#/definitions/v1.Time" + }, + "observation": { + "description": "Results of the Trial - objectives and other metrics values.", + "$ref": "#/definitions/v1beta1.Observation" + }, + "startTime": { + "description": "Represents time when the Trial was acknowledged by the Trial controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC", + "$ref": "#/definitions/v1.Time" + } + } + }, + "v1beta1.AlgorithmSetting": { + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, + "v1beta1.AlgorithmSpec": { + "properties": { + "algorithmName": { + "type": "string" + }, + "algorithmSettings": { + "description": "Key-value pairs representing settings for suggestion algorithms.", + "type": "array", + "items": { + "$ref": "#/definitions/v1beta1.AlgorithmSetting" + } + }, + "earlyStopping": { + "$ref": "#/definitions/v1beta1.EarlyStoppingSpec" + } + } + }, + "v1beta1.CollectorSpec": { + "required": [ + "kind" + ], + "properties": { + "customCollector": { + "description": "When kind is \"customCollector\", this field will be used", + "$ref": "#/definitions/v1.Container" + }, + "kind": { + "type": "string" + } + } + }, + "v1beta1.EarlyStoppingSetting": { + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, + "v1beta1.EarlyStoppingSpec": { + "required": [ + "earlyStoppingSettings" + ], + "properties": { + "earlyStoppingAlgorithmName": { + "type": "string" + }, + "earlyStoppingSettings": { + "type": "array", + "items": { + "$ref": "#/definitions/v1beta1.EarlyStoppingSetting" + } + } + } + }, + "v1beta1.Experiment": { + "description": "Structure of the Experiment custom resource.", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/v1.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/v1beta1.ExperimentSpec" + }, + "status": { + "$ref": "#/definitions/v1beta1.ExperimentStatus" + } + } + }, + "v1beta1.ExperimentCondition": { + "description": "ExperimentCondition describes the state of the experiment at a certain point.", + "required": [ + "type", + "status" + ], + "properties": { + "lastTransitionTime": { + "description": "Last time the condition transitioned from one status to another.", + "$ref": "#/definitions/v1.Time" + }, + "lastUpdateTime": { + "description": "The last time this condition was updated.", + "$ref": "#/definitions/v1.Time" + }, + "message": { + "description": "A human readable message indicating details about the transition.", + "type": "string" + }, + "reason": { + "description": "The reason for the condition's last transition.", + "type": "string" + }, + "status": { + "description": "Status of the condition, one of True, False, Unknown.", + "type": "string" + }, + "type": { + "description": "Type of experiment condition.", + "type": "string" + } + } + }, + "v1beta1.ExperimentList": { + "description": "ExperimentList contains a list of Experiments", + "required": [ + "items" + ], + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + "type": "string" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/v1beta1.Experiment" + } + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/v1.ListMeta" + } + } + }, + "v1beta1.ExperimentSpec": { + "properties": { + "algorithm": { + "description": "Describes the suggestion algorithm.", + "$ref": "#/definitions/v1beta1.AlgorithmSpec" + }, + "maxFailedTrialCount": { + "description": "Max failed trials to mark experiment as failed.", + "type": "integer", + "format": "int32" + }, + "maxTrialCount": { + "description": "Max completed trials to mark experiment as succeeded", + "type": "integer", + "format": "int32" + }, + "metricsCollectorSpec": { + "description": "Describes the specification of the metrics collector", + "$ref": "#/definitions/v1beta1.MetricsCollectorSpec" + }, + "nasConfig": { + "$ref": "#/definitions/v1beta1.NasConfig" + }, + "objective": { + "description": "Describes the objective of the experiment.", + "$ref": "#/definitions/v1beta1.ObjectiveSpec" + }, + "parallelTrialCount": { + "description": "How many trials can be processed in parallel. Defaults to 3", + "type": "integer", + "format": "int32" + }, + "parameters": { + "description": "List of hyperparameter configurations.", + "type": "array", + "items": { + "$ref": "#/definitions/v1beta1.ParameterSpec" + } + }, + "resumePolicy": { + "description": "Describes resuming policy which usually take effect after experiment terminated.", + "type": "string" + }, + "trialTemplate": { + "description": "Template for each run of the trial.", + "$ref": "#/definitions/v1beta1.TrialTemplate" + } + } + }, + "v1beta1.ExperimentStatus": { + "properties": { + "completionTime": { + "description": "Represents time when the Experiment was completed. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", + "$ref": "#/definitions/v1.Time" + }, + "conditions": { + "description": "List of observed runtime conditions for this Experiment.", + "type": "array", + "items": { + "$ref": "#/definitions/v1beta1.ExperimentCondition" + } + }, + "currentOptimalTrial": { + "description": "Current optimal trial parameters and observations.", + "$ref": "#/definitions/v1beta1.OptimalTrial" + }, + "failedTrialList": { + "description": "List of trial names which have already failed.", + "type": "array", + "items": { + "type": "string" + } + }, + "killedTrialList": { + "description": "List of trial names which have been killed.", + "type": "array", + "items": { + "type": "string" + } + }, + "lastReconcileTime": { + "description": "Represents last time when the Experiment was reconciled. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", + "$ref": "#/definitions/v1.Time" + }, + "pendingTrialList": { + "description": "List of trial names which are pending.", + "type": "array", + "items": { + "type": "string" + } + }, + "runningTrialList": { + "description": "List of trial names which are running.", + "type": "array", + "items": { + "type": "string" + } + }, + "startTime": { + "description": "Represents time when the Experiment was acknowledged by the Experiment controller. It is not guaranteed to be set in happens-before order across separate operations. It is represented in RFC3339 form and is in UTC.", + "$ref": "#/definitions/v1.Time" + }, + "succeededTrialList": { + "description": "List of trial names which have already succeeded.", + "type": "array", + "items": { + "type": "string" + } + }, + "trials": { + "description": "Trials is the total number of trials owned by the experiment.", + "type": "integer", + "format": "int32" + }, + "trialsFailed": { + "description": "How many trials have failed.", + "type": "integer", + "format": "int32" + }, + "trialsKilled": { + "description": "How many trials have been killed.", + "type": "integer", + "format": "int32" + }, + "trialsPending": { + "description": "How many trials are currently pending.", + "type": "integer", + "format": "int32" + }, + "trialsRunning": { + "description": "How many trials are currently running.", + "type": "integer", + "format": "int32" + }, + "trialsSucceeded": { + "description": "How many trials have succeeded.", + "type": "integer", + "format": "int32" + } + } + }, + "v1beta1.FeasibleSpace": { + "properties": { + "list": { + "type": "array", + "items": { + "type": "string" + } + }, + "max": { + "type": "string" + }, + "min": { + "type": "string" + }, + "step": { + "type": "string" + } + } + }, + "v1beta1.FileSystemPath": { + "properties": { + "kind": { + "type": "string" + }, + "path": { + "type": "string" + } + } + }, + "v1beta1.FilterSpec": { + "properties": { + "metricsFormat": { + "description": "When the metrics output follows format as this field specified, metricsCollector collects it and reports to metrics server, it can be \"\u003cmetric_name\u003e: \u003cfloat\u003e\" or else", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "v1beta1.GoTemplate": { + "properties": { + "rawTemplate": { + "type": "string" + }, + "templateSpec": { + "$ref": "#/definitions/v1beta1.TemplateSpec" + } + } + }, + "v1beta1.GraphConfig": { + "description": "GraphConfig contains a config of DAG", + "properties": { + "inputSizes": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "numLayers": { + "type": "integer", + "format": "int32" + }, + "outputSizes": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + } + } + }, + "v1beta1.Metric": { + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "number", + "format": "double" + } + } + }, + "v1beta1.MetricsCollectorSpec": { + "properties": { + "collector": { + "$ref": "#/definitions/v1beta1.CollectorSpec" + }, + "source": { + "$ref": "#/definitions/v1beta1.SourceSpec" + } + } + }, + "v1beta1.NasConfig": { + "description": "NasConfig contains config for NAS job", + "properties": { + "graphConfig": { + "$ref": "#/definitions/v1beta1.GraphConfig" + }, + "operations": { + "type": "array", + "items": { + "$ref": "#/definitions/v1beta1.Operation" + } + } + } + }, + "v1beta1.ObjectiveSpec": { + "properties": { + "additionalMetricNames": { + "description": "This can be empty if we only care about the objective metric. Note: If we adopt a push instead of pull mechanism, this can be omitted completely.", + "type": "array", + "items": { + "type": "string" + } + }, + "goal": { + "type": "number", + "format": "double" + }, + "objectiveMetricName": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "v1beta1.Observation": { + "required": [ + "metrics" + ], + "properties": { + "metrics": { + "description": "Key-value pairs for metric names and values", + "type": "array", + "items": { + "$ref": "#/definitions/v1beta1.Metric" + } + } + } + }, + "v1beta1.Operation": { + "description": "Operation contains type of operation in DAG", + "properties": { + "operationType": { + "type": "string" + }, + "parameters": { + "type": "array", + "items": { + "$ref": "#/definitions/v1beta1.ParameterSpec" + } + } + } + }, + "v1beta1.OptimalTrial": { + "description": "OptimalTrial is the metrics and assignments of the best trial.", + "required": [ + "bestTrialName", + "parameterAssignments" + ], + "properties": { + "bestTrialName": { + "description": "BestTrialName is the name of the best trial.", + "type": "string" + }, + "observation": { + "description": "Observation for this trial", + "$ref": "#/definitions/v1beta1.Observation" + }, + "parameterAssignments": { + "description": "Key-value pairs for hyperparameters and assignment values.", + "type": "array", + "items": { + "$ref": "#/definitions/v1beta1.ParameterAssignment" + } + } + } + }, + "v1beta1.ParameterAssignment": { + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, + "v1beta1.ParameterSpec": { + "properties": { + "feasibleSpace": { + "$ref": "#/definitions/v1beta1.FeasibleSpace" + }, + "name": { + "type": "string" + }, + "parameterType": { + "type": "string" + } + } + }, + "v1beta1.SourceSpec": { + "properties": { + "fileSystemPath": { + "description": "During training model, metrics may be persisted into local file in source code, such as tfEvent use case", + "$ref": "#/definitions/v1beta1.FileSystemPath" + }, + "filter": { + "description": "Default metric output format is {\"metric\": \"\u003cmetric_name\u003e\", \"value\": \u003cint_or_float\u003e, \"epoch\": \u003cint\u003e, \"step\": \u003cint\u003e}, but if the output doesn't follow default format, please extend it here", + "$ref": "#/definitions/v1beta1.FilterSpec" + }, + "httpGet": { + "description": "Model-train source code can expose metrics by http, such as HTTP endpoint in prometheus metric format", + "$ref": "#/definitions/v1.HTTPGetAction" + } + } + }, + "v1beta1.TemplateSpec": { + "properties": { + "configMapName": { + "type": "string" + }, + "configMapNamespace": { + "type": "string" + }, + "templatePath": { + "type": "string" + } + } + }, + "v1beta1.TrialTemplate": { + "properties": { + "goTemplate": { + "$ref": "#/definitions/v1beta1.GoTemplate" + }, + "retain": { + "type": "boolean" + } + } + } + } +} diff --git a/pkg/common/v1beta1/common.go b/pkg/common/v1beta1/common.go new file mode 100644 index 00000000000..0b37adbad0f --- /dev/null +++ b/pkg/common/v1beta1/common.go @@ -0,0 +1,32 @@ +package v1beta1 + +import ( + "time" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func ConvertTime2RFC3339(t *metav1.Time) string { + if t != nil { + return t.UTC().Format(time.RFC3339) + } else { + zero := &metav1.Time{} + return zero.UTC().Format(time.RFC3339) + } +} + +func GetJobLabelMap(jobKind string, trialName string) map[string]string { + labelMap := make(map[string]string) + + if jobKind == "TFJob" { + labelMap["job-name"] = trialName + labelMap["job-role"] = "master" + } else if jobKind == "PyTorchJob" { + labelMap["job-name"] = trialName + labelMap["job-role"] = "master" + } else { + labelMap["job-name"] = trialName + } + + return labelMap +} diff --git a/pkg/common/v1beta1/katib_manager_util.go b/pkg/common/v1beta1/katib_manager_util.go new file mode 100644 index 00000000000..8a42c83ddc8 --- /dev/null +++ b/pkg/common/v1beta1/katib_manager_util.go @@ -0,0 +1,82 @@ +/* + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta1 + +import ( + "context" + + "google.golang.org/grpc" + + api_pb "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" + "github.com/kubeflow/katib/pkg/controller.v1beta1/consts" +) + +type katibDBManagerClientAndConn struct { + Conn *grpc.ClientConn + KatibDBManagerClient api_pb.ManagerClient +} + +// GetDBManagerAddr returns address of Katib DB Manager +func GetDBManagerAddr() string { + dbManagerNS := consts.DefaultKatibDBManagerServiceNamespace + dbManagerIP := consts.DefaultKatibDBManagerServiceIP + dbManagerPort := consts.DefaultKatibDBManagerServicePort + + if len(dbManagerNS) != 0 { + return dbManagerIP + "." + dbManagerNS + ":" + dbManagerPort + } + + return dbManagerIP + ":" + dbManagerPort +} + +func getKatibDBManagerClientAndConn() (*katibDBManagerClientAndConn, error) { + addr := GetDBManagerAddr() + conn, err := grpc.Dial(addr, grpc.WithInsecure()) + if err != nil { + return nil, err + } + kcc := &katibDBManagerClientAndConn{ + Conn: conn, + KatibDBManagerClient: api_pb.NewManagerClient(conn), + } + return kcc, nil +} + +func closeKatibDBManagerConnection(kcc *katibDBManagerClientAndConn) { + kcc.Conn.Close() +} + +func GetObservationLog(request *api_pb.GetObservationLogRequest) (*api_pb.GetObservationLogReply, error) { + ctx := context.Background() + kcc, err := getKatibDBManagerClientAndConn() + if err != nil { + return nil, err + } + defer closeKatibDBManagerConnection(kcc) + kc := kcc.KatibDBManagerClient + return kc.GetObservationLog(ctx, request) +} + +func DeleteObservationLog(request *api_pb.DeleteObservationLogRequest) (*api_pb.DeleteObservationLogReply, error) { + ctx := context.Background() + kcc, err := getKatibDBManagerClientAndConn() + if err != nil { + return nil, err + } + defer closeKatibDBManagerConnection(kcc) + kc := kcc.KatibDBManagerClient + return kc.DeleteObservationLog(ctx, request) +} diff --git a/pkg/controller.v1beta1/add_experiment.go b/pkg/controller.v1beta1/add_experiment.go new file mode 100644 index 00000000000..b3f683aab27 --- /dev/null +++ b/pkg/controller.v1beta1/add_experiment.go @@ -0,0 +1,26 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package controller + +import ( + "github.com/kubeflow/katib/pkg/controller.v1beta1/experiment" +) + +func init() { + // AddToManagerFuncs is a list of functions to create controllers and add them to a manager. + AddToManagerFuncs = append(AddToManagerFuncs, experiment.Add) +} diff --git a/pkg/controller.v1beta1/add_suggestion.go b/pkg/controller.v1beta1/add_suggestion.go new file mode 100644 index 00000000000..b312d2869c4 --- /dev/null +++ b/pkg/controller.v1beta1/add_suggestion.go @@ -0,0 +1,26 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package controller + +import ( + "github.com/kubeflow/katib/pkg/controller.v1beta1/suggestion" +) + +func init() { + // AddToManagerFuncs is a list of functions to create controllers and add them to a manager. + AddToManagerFuncs = append(AddToManagerFuncs, suggestion.Add) +} diff --git a/pkg/controller.v1beta1/add_trial.go b/pkg/controller.v1beta1/add_trial.go new file mode 100644 index 00000000000..6725294f56d --- /dev/null +++ b/pkg/controller.v1beta1/add_trial.go @@ -0,0 +1,26 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package controller + +import ( + "github.com/kubeflow/katib/pkg/controller.v1beta1/trial" +) + +func init() { + // AddToManagerFuncs is a list of functions to create controllers and add them to a manager. + AddToManagerFuncs = append(AddToManagerFuncs, trial.Add) +} diff --git a/pkg/controller.v1beta1/consts/const.go b/pkg/controller.v1beta1/consts/const.go new file mode 100644 index 00000000000..a39ae67fdee --- /dev/null +++ b/pkg/controller.v1beta1/consts/const.go @@ -0,0 +1,145 @@ +package consts + +import "github.com/kubeflow/katib/pkg/util/v1beta1/env" + +const ( + // ConfigExperimentSuggestionName is the config name of the + // suggestion client implementation in experiment controller. + ConfigExperimentSuggestionName = "experiment-suggestion-name" + // ConfigCertLocalFS is the config name which indicates if we + // should store the cert in file system. + ConfigCertLocalFS = "cert-local-filesystem" + // ConfigInjectSecurityContext is the config name which indicates + // if we should inject the security context into the metrics collector + // sidecar. + ConfigInjectSecurityContext = "inject-security-context" + // ConfigEnableGRPCProbeInSuggestion is the config name which indicates + // if we should set GRPC probe in suggestion deployments. + ConfigEnableGRPCProbeInSuggestion = "enable-grpc-probe-in-suggestion" + + // LabelExperimentName is the label of experiment name. + LabelExperimentName = "experiment" + // LabelSuggestionName is the label of suggestion name. + LabelSuggestionName = "suggestion" + // LabelDeploymentName is the label of deployment name. + LabelDeploymentName = "deployment" + + // ContainerSuggestion is the container name in Suggestion. + ContainerSuggestion = "suggestion" + + // DefaultSuggestionPort is the default port of suggestion service. + DefaultSuggestionPort = 6789 + // DefaultSuggestionPortName is the default port name of suggestion service. + DefaultSuggestionPortName = "katib-api" + // DefaultGRPCService is the default service name in Suggestion, + // which is used to run healthz check using grpc probe. + DefaultGRPCService = "manager.v1beta1.Suggestion" + + // DefaultKatibNamespaceEnvName is the default env name of katib namespace + DefaultKatibNamespaceEnvName = "KATIB_CORE_NAMESPACE" + // DefaultKatibComposerEnvName is the default env name of katib suggestion composer + DefaultKatibComposerEnvName = "KATIB_SUGGESTION_COMPOSER" + + // DefaultKatibDBManagerServiceNamespaceEnvName is the env name of Katib DB Manager namespace + DefaultKatibDBManagerServiceNamespaceEnvName = "KATIB_DB_MANAGER_SERVICE_NAMESPACE" + // DefaultKatibDBManagerServiceIPEnvName is the env name of Katib DB Manager IP + DefaultKatibDBManagerServiceIPEnvName = "KATIB_DB_MANAGER_SERVICE_IP" + // DefaultKatibDBManagerServicePortEnvName is the env name of Katib DB Manager Port + DefaultKatibDBManagerServicePortEnvName = "KATIB_DB_MANAGER_SERVICE_PORT" + + // KatibConfigMapName is the config map constants + // Configmap name which includes Katib's configuration + KatibConfigMapName = "katib-config" + // LabelSuggestionTag is the name of suggestion config in configmap. + LabelSuggestionTag = "suggestion" + // LabelSuggestionImageTag is the name of suggestion image config in configmap. + LabelSuggestionImageTag = "image" + // LabelSuggestionCPULimitTag is the name of suggestion CPU Limit config in configmap. + LabelSuggestionCPULimitTag = "cpuLimit" + // DefaultCPULimit is the default value for CPU Limit + DefaultCPULimit = "500m" + // LabelSuggestionCPURequestTag is the name of suggestion CPU Request config in configmap. + LabelSuggestionCPURequestTag = "cpuRequest" + // DefaultCPURequest is the default value for CPU Request + DefaultCPURequest = "50m" + // LabelSuggestionMemLimitTag is the name of suggestion Mem Limit config in configmap. + LabelSuggestionMemLimitTag = "memLimit" + // DefaultMemLimit is the default value for mem Limit + DefaultMemLimit = "100Mi" + // LabelSuggestionMemRequestTag is the name of suggestion Mem Request config in configmap. + LabelSuggestionMemRequestTag = "memRequest" + // DefaultMemRequest is the default value for mem Request + DefaultMemRequest = "10Mi" + // LabelSuggestionDiskLimitTag is the name of suggestion Disk Limit config in configmap. + LabelSuggestionDiskLimitTag = "diskLimit" + // DefaultDiskLimit is the default value for disk limit. + DefaultDiskLimit = "5Gi" + // LabelSuggestionDiskRequestTag is the name of suggestion Disk Request config in configmap. + LabelSuggestionDiskRequestTag = "diskRequest" + // DefaultDiskRequest is the default value for disk request. + DefaultDiskRequest = "500Mi" + // LabelSuggestionImagePullPolicy is the name of suggestion image pull policy in configmap. + LabelSuggestionImagePullPolicy = "imagePullPolicy" + // LabelSuggestionServiceAccountName is the name of suggestion service account in configmap. + LabelSuggestionServiceAccountName = "serviceAccountName" + // DefaultImagePullPolicy is the default value for image pull policy. + DefaultImagePullPolicy = "IfNotPresent" + // LabelMetricsCollectorSidecar is the name of metrics collector config in configmap. + LabelMetricsCollectorSidecar = "metrics-collector-sidecar" + // LabelMetricsCollectorSidecarImage is the name of metrics collector image config in configmap. + LabelMetricsCollectorSidecarImage = "image" + // LabelMetricsCollectorCPULimitTag is the name of metrics collector CPU Limit config in configmap. + LabelMetricsCollectorCPULimitTag = "cpuLimit" + // LabelMetricsCollectorCPURequestTag is the name of metrics collector CPU Request config in configmap. + LabelMetricsCollectorCPURequestTag = "cpuRequest" + // LabelMetricsCollectorMemLimitTag is the name of metrics collector Mem Limit config in configmap. + LabelMetricsCollectorMemLimitTag = "memLimit" + // LabelMetricsCollectorMemRequestTag is the name of metrics collector Mem Request config in configmap. + LabelMetricsCollectorMemRequestTag = "memRequest" + // LabelMetricsCollectorDiskLimitTag is the name of metrics collector Disk Limit config in configmap. + LabelMetricsCollectorDiskLimitTag = "diskLimit" + // LabelMetricsCollectorDiskRequestTag is the name of metrics collector Disk Request config in configmap. + LabelMetricsCollectorDiskRequestTag = "diskRequest" + // LabelMetricsCollectorImagePullPolicy is the name of metrics collector image pull policy in configmap. + LabelMetricsCollectorImagePullPolicy = "imagePullPolicy" + + // ReconcileErrorReason is the reason when there is a reconcile error. + ReconcileErrorReason = "ReconcileError" + + // JobKindJob is the kind of the Kubernetes Job. + JobKindJob = "Job" + // JobKindTF is the kind of TFJob. + JobKindTF = "TFJob" + // JobKindPyTorch is the kind of PyTorchJob. + JobKindPyTorch = "PyTorchJob" + + // built-in JobRoles + JobRole = "job-role" + JobRoleTF = "tf-job-role" + JobRolePyTorch = "pytorch-job-role" + + // AnnotationIstioSidecarInjectName is the annotation of Istio Sidecar + AnnotationIstioSidecarInjectName = "sidecar.istio.io/inject" + + // AnnotationIstioSidecarInjectValue is the value of Istio Sidecar annotation + AnnotationIstioSidecarInjectValue = "false" + + // LabelTrialTemplateConfigMapName is the label name for the Trial templates configMap + LabelTrialTemplateConfigMapName = "app" + // LabelTrialTemplateConfigMapValue is the label value for the Trial templates configMap + LabelTrialTemplateConfigMapValue = "katib-trial-templates" +) + +var ( + // DefaultKatibNamespace is the default namespace of katib deployment. + DefaultKatibNamespace = env.GetEnvOrDefault(DefaultKatibNamespaceEnvName, "kubeflow") + // DefaultComposer is the default composer of katib suggestion. + DefaultComposer = env.GetEnvOrDefault(DefaultKatibComposerEnvName, "General") + + // DefaultKatibDBManagerServiceNamespace is the default namespace of Katib DB Manager + DefaultKatibDBManagerServiceNamespace = env.GetEnvOrDefault(DefaultKatibDBManagerServiceNamespaceEnvName, DefaultKatibNamespace) + // DefaultKatibDBManagerServiceIP is the default IP of Katib DB Manager + DefaultKatibDBManagerServiceIP = env.GetEnvOrDefault(DefaultKatibDBManagerServiceIPEnvName, "katib-db-manager") + // DefaultKatibDBManagerServicePort is the default Port of Katib DB Manager + DefaultKatibDBManagerServicePort = env.GetEnvOrDefault(DefaultKatibDBManagerServicePortEnvName, "6789") +) diff --git a/pkg/controller.v1beta1/controller.go b/pkg/controller.v1beta1/controller.go new file mode 100644 index 00000000000..b2acc50372b --- /dev/null +++ b/pkg/controller.v1beta1/controller.go @@ -0,0 +1,33 @@ +/* + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package controller + +import ( + "sigs.k8s.io/controller-runtime/pkg/manager" +) + +// AddToManagerFuncs is a list of functions to add all Controllers to the Manager +var AddToManagerFuncs []func(manager.Manager) error + +// AddToManager adds all Controllers to the Manager +func AddToManager(m manager.Manager) error { + for _, f := range AddToManagerFuncs { + if err := f(m); err != nil { + return err + } + } + return nil +} diff --git a/pkg/controller.v1beta1/experiment/experiment_consts.go b/pkg/controller.v1beta1/experiment/experiment_consts.go new file mode 100644 index 00000000000..306f54aea3e --- /dev/null +++ b/pkg/controller.v1beta1/experiment/experiment_consts.go @@ -0,0 +1,5 @@ +package experiment + +const ( + ReconcileFailedReason = "ReconcileFailed" +) diff --git a/pkg/controller.v1beta1/experiment/experiment_controller.go b/pkg/controller.v1beta1/experiment/experiment_controller.go new file mode 100644 index 00000000000..82cb10e5b9d --- /dev/null +++ b/pkg/controller.v1beta1/experiment/experiment_controller.go @@ -0,0 +1,410 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package experiment + +import ( + "context" + "sort" + + "github.com/spf13/viper" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/equality" + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/tools/record" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller" + "sigs.k8s.io/controller-runtime/pkg/handler" + "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/metrics" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + "sigs.k8s.io/controller-runtime/pkg/source" + + experimentsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + suggestionsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1" + trialsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" + "github.com/kubeflow/katib/pkg/controller.v1beta1/consts" + "github.com/kubeflow/katib/pkg/controller.v1beta1/experiment/manifest" + "github.com/kubeflow/katib/pkg/controller.v1beta1/experiment/suggestion" + suggestionfake "github.com/kubeflow/katib/pkg/controller.v1beta1/experiment/suggestion/fake" + "github.com/kubeflow/katib/pkg/controller.v1beta1/experiment/util" +) + +const ( + // ControllerName is the controller name. + ControllerName = "experiment-controller" +) + +var ( + log = logf.Log.WithName(ControllerName) +) + +// Add creates a new Experiment Controller and adds it to the Manager with default RBAC. The Manager will set fields on the Controller +// and Start it when the Manager is Started. +func Add(mgr manager.Manager) error { + return add(mgr, newReconciler(mgr)) +} + +// newReconciler returns a new reconcile.Reconciler +func newReconciler(mgr manager.Manager) reconcile.Reconciler { + r := &ReconcileExperiment{ + Client: mgr.GetClient(), + scheme: mgr.GetScheme(), + recorder: mgr.GetRecorder(ControllerName), + } + imp := viper.GetString(consts.ConfigExperimentSuggestionName) + r.Suggestion = newSuggestion(imp, mgr.GetScheme(), mgr.GetClient()) + + r.Generator = manifest.New(r.Client) + r.updateStatusHandler = r.updateStatus + r.collector = util.NewExpsCollector(mgr.GetCache(), metrics.Registry) + return r +} + +// newSuggestion returns the new Suggestion for the given config. +func newSuggestion(config string, scheme *runtime.Scheme, client client.Client) suggestion.Suggestion { + // Use different implementation according to the configuration. + switch config { + case "fake": + log.Info("Using the fake suggestion implementation") + return suggestionfake.New() + case "default": + log.Info("Using the default suggestion implementation") + return suggestion.New(scheme, client) + default: + log.Info("No valid name specified, using the default suggestion implementation", + "implementation", config) + return suggestion.New(scheme, client) + } +} + +// add adds a new Controller to mgr with r as the reconcile.Reconciler +func add(mgr manager.Manager, r reconcile.Reconciler) error { + // Create a new controller + c, err := controller.New("experiment-controller", mgr, controller.Options{Reconciler: r}) + if err != nil { + log.Error(err, "Failed to create experiment controller") + return err + } + + if err = addWatch(mgr, c); err != nil { + log.Error(err, "Trial watch failed") + return err + } + + log.Info("Experiment controller created") + return nil +} + +// addWatch adds a new Controller to mgr with r as the reconcile.Reconciler +func addWatch(mgr manager.Manager, c controller.Controller) error { + // Watch for changes to Experiment + err := c.Watch(&source.Kind{Type: &experimentsv1beta1.Experiment{}}, &handler.EnqueueRequestForObject{}) + if err != nil { + log.Error(err, "Experiment watch failed") + return err + } + + // Watch for trials for the experiments + err = c.Watch( + &source.Kind{Type: &trialsv1beta1.Trial{}}, + &handler.EnqueueRequestForOwner{ + IsController: true, + OwnerType: &experimentsv1beta1.Experiment{}, + }) + + if err != nil { + log.Error(err, "Trial watch failed") + return err + } + + err = c.Watch( + &source.Kind{Type: &suggestionsv1beta1.Suggestion{}}, + &handler.EnqueueRequestForOwner{ + IsController: true, + OwnerType: &experimentsv1beta1.Experiment{}, + }) + + if err != nil { + log.Error(err, "Suggestion watch failed") + return err + } + return nil +} + +var _ reconcile.Reconciler = &ReconcileExperiment{} + +// ReconcileExperiment reconciles a Experiment object +type ReconcileExperiment struct { + client.Client + scheme *runtime.Scheme + recorder record.EventRecorder + + suggestion.Suggestion + manifest.Generator + // updateStatusHandler is defined for test purpose. + updateStatusHandler updateStatusFunc + // collector is a wrapper for experiment metrics. + collector *util.ExperimentsCollector +} + +// Reconcile reads that state of the cluster for a Experiment object and makes changes based on the state read +// and what is in the Experiment.Spec +// +kubebuilder:rbac:groups=experiments.kubeflow.org,resources=experiments,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=experiments.kubeflow.org,resources=experiments/status,verbs=get;update;patch +func (r *ReconcileExperiment) Reconcile(request reconcile.Request) (reconcile.Result, error) { + // Fetch the Experiment instance + logger := log.WithValues("Experiment", request.NamespacedName) + original := &experimentsv1beta1.Experiment{} + err := r.Get(context.TODO(), request.NamespacedName, original) + if err != nil { + if errors.IsNotFound(err) { + // Object not found, return. Created objects are automatically garbage collected. + // For additional cleanup logic use finalizers. + return reconcile.Result{}, nil + } + // Error reading the object - requeue the request. + logger.Error(err, "Experiment Get error") + return reconcile.Result{}, err + } + instance := original.DeepCopy() + + if needUpdate, finalizers := needUpdateFinalizers(instance); needUpdate { + return r.updateFinalizers(instance, finalizers) + } + + if instance.IsCompleted() { + // Check if completed instance is restartable + // Experiment is restartable only if it is in succeeded state by reaching max trials + // And Resume Policy is LongRunning + if util.IsCompletedExperimentRestartable(instance) { + // Check if max trials is reconfigured + if (instance.Spec.MaxTrialCount != nil && + *instance.Spec.MaxTrialCount != instance.Status.Trials) || + (instance.Spec.MaxTrialCount == nil && instance.Status.Trials != 0) { + logger.Info("Experiment is restarting") + msg := "Experiment is restarted" + instance.MarkExperimentStatusRestarting(util.ExperimentRestartingReason, msg) + } + } else { + // Terminate Suggestion after Experiment is finished if Resume Policy is Never + if instance.Spec.ResumePolicy == experimentsv1beta1.NeverResume { + err := r.terminateSuggestion(instance) + if err != nil { + logger.Error(err, "Terminate Suggestion error") + } + return reconcile.Result{}, err + } + // If experiment is completed with no running trials, stop reconcile + if !instance.HasRunningTrials() { + return reconcile.Result{}, nil + } + } + } + if !instance.IsCreated() { + if instance.Status.StartTime == nil { + now := metav1.Now() + instance.Status.StartTime = &now + } + if instance.Status.CompletionTime == nil { + instance.Status.CompletionTime = &metav1.Time{} + } + msg := "Experiment is created" + instance.MarkExperimentStatusCreated(util.ExperimentCreatedReason, msg) + } else { + err := r.ReconcileExperiment(instance) + if err != nil { + logger.Error(err, "Reconcile experiment error") + r.recorder.Eventf(instance, + corev1.EventTypeWarning, ReconcileFailedReason, + "Failed to reconcile: %v", err) + return reconcile.Result{}, err + } + } + + if !equality.Semantic.DeepEqual(original.Status, instance.Status) { + //assuming that only status change + err = r.updateStatusHandler(instance) + if err != nil { + logger.Error(err, "Update experiment instance status error") + return reconcile.Result{}, err + } + } + + return reconcile.Result{}, nil +} + +// ReconcileExperiment is the main reconcile loop. +func (r *ReconcileExperiment) ReconcileExperiment(instance *experimentsv1beta1.Experiment) error { + logger := log.WithValues("Experiment", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) + trials := &trialsv1beta1.TrialList{} + labels := map[string]string{consts.LabelExperimentName: instance.Name} + lo := &client.ListOptions{} + lo.MatchingLabels(labels).InNamespace(instance.Namespace) + + if err := r.List(context.TODO(), lo, trials); err != nil { + logger.Error(err, "Trial List error") + return err + } + if len(trials.Items) > 0 { + if err := util.UpdateExperimentStatus(r.collector, instance, trials); err != nil { + logger.Error(err, "Update experiment status error") + return err + } + } + reconcileRequired := !instance.IsCompleted() + if reconcileRequired { + r.ReconcileTrials(instance, trials.Items) + } + + return nil +} + +// ReconcileTrials syncs trials. +func (r *ReconcileExperiment) ReconcileTrials(instance *experimentsv1beta1.Experiment, trials []trialsv1beta1.Trial) error { + + logger := log.WithValues("Experiment", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) + + parallelCount := *instance.Spec.ParallelTrialCount + activeCount := instance.Status.TrialsPending + instance.Status.TrialsRunning + completedCount := instance.Status.TrialsSucceeded + instance.Status.TrialsFailed + instance.Status.TrialsKilled + + if activeCount > parallelCount { + deleteCount := activeCount - parallelCount + if deleteCount > 0 { + //delete 'deleteCount' number of trails. Sort them? + logger.Info("DeleteTrials", "deleteCount", deleteCount) + if err := r.deleteTrials(instance, trials, deleteCount); err != nil { + logger.Error(err, "Delete trials error") + return err + } + } + + } else if activeCount < parallelCount { + var requiredActiveCount int32 + if instance.Spec.MaxTrialCount == nil { + requiredActiveCount = parallelCount + } else { + requiredActiveCount = *instance.Spec.MaxTrialCount - completedCount + if requiredActiveCount > parallelCount { + requiredActiveCount = parallelCount + } + } + + addCount := requiredActiveCount - activeCount + if addCount < 0 { + logger.Info("Invalid setting", "requiredActiveCount", requiredActiveCount, "MaxTrialCount", + *instance.Spec.MaxTrialCount, "CompletedCount", completedCount) + addCount = 0 + } + + logger.Info("Statistics", + "requiredActiveCount", requiredActiveCount, + "parallelCount", parallelCount, + "activeCount", activeCount, + "completedCount", completedCount, + ) + + //skip if no trials need to be created + if addCount > 0 { + //create "addCount" number of trials + logger.Info("CreateTrials", "addCount", addCount) + if err := r.createTrials(instance, trials, addCount); err != nil { + logger.Error(err, "Create trials error") + return err + } + } + } + + return nil + +} + +func (r *ReconcileExperiment) createTrials(instance *experimentsv1beta1.Experiment, trialList []trialsv1beta1.Trial, addCount int32) error { + + logger := log.WithValues("Experiment", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) + currentCount := int32(len(trialList)) + trials, err := r.ReconcileSuggestions(instance, currentCount, addCount) + if err != nil { + logger.Error(err, "Get suggestions error") + return err + } + for _, trial := range trials { + if err = r.createTrialInstance(instance, &trial); err != nil { + logger.Error(err, "Create trial instance error", "trial", trial) + continue + } + } + return nil +} + +func (r *ReconcileExperiment) deleteTrials(instance *experimentsv1beta1.Experiment, + trials []trialsv1beta1.Trial, + deleteCount int32) error { + logger := log.WithValues("Experiment", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) + + trialSlice := trials + sort.Slice(trialSlice, func(i, j int) bool { + return trialSlice[i].CreationTimestamp.Time. + After(trialSlice[j].CreationTimestamp.Time) + }) + + for i := 0; i < int(deleteCount); i++ { + if err := r.Delete(context.TODO(), &trialSlice[i]); err != nil { + logger.Error(err, "Trial Delete error") + return err + } + } + return nil +} + +// ReconcileSuggestions gets or creates the suggestion if needed. +func (r *ReconcileExperiment) ReconcileSuggestions(instance *experimentsv1beta1.Experiment, currentCount, addCount int32) ([]suggestionsv1beta1.TrialAssignment, error) { + logger := log.WithValues("Experiment", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) + var assignments []suggestionsv1beta1.TrialAssignment + suggestionRequestsCount := currentCount + addCount + + original, err := r.GetOrCreateSuggestion(instance, suggestionRequestsCount) + logger.Info("GetOrCreateSuggestion", "Instance name", instance.Name, "suggestionRequestsCount", suggestionRequestsCount) + if err != nil { + logger.Error(err, "GetOrCreateSuggestion failed", "instance", instance.Name, "suggestionRequestsCount", suggestionRequestsCount) + return nil, err + } else { + if original != nil { + if original.IsFailed() { + msg := "Suggestion has failed" + instance.MarkExperimentStatusFailed(util.ExperimentFailedReason, msg) + } else { + suggestion := original.DeepCopy() + if len(suggestion.Status.Suggestions) > int(currentCount) { + suggestions := suggestion.Status.Suggestions + assignments = suggestions[currentCount:] + } + if suggestion.Spec.Requests != suggestionRequestsCount { + suggestion.Spec.Requests = suggestionRequestsCount + if err := r.UpdateSuggestion(suggestion); err != nil { + return nil, err + } + } + } + } + } + return assignments, nil +} diff --git a/pkg/controller.v1beta1/experiment/experiment_controller_suite_test.go b/pkg/controller.v1beta1/experiment/experiment_controller_suite_test.go new file mode 100644 index 00000000000..fa1fb6012dc --- /dev/null +++ b/pkg/controller.v1beta1/experiment/experiment_controller_suite_test.go @@ -0,0 +1,102 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package experiment + +import ( + stdlog "log" + "os" + "path/filepath" + "sync" + "testing" + "time" + + "github.com/onsi/gomega" + "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/rest" + "sigs.k8s.io/controller-runtime/pkg/controller" + "sigs.k8s.io/controller-runtime/pkg/envtest" + "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + + apis "github.com/kubeflow/katib/pkg/apis/controller" +) + +var ( + cfg *rest.Config + controlPlaneStartTimeout = 60 * time.Second + controlPlaneStopTimeout = 60 * time.Second +) + +func TestMain(m *testing.M) { + t := &envtest.Environment{ + ControlPlaneStartTimeout: controlPlaneStartTimeout, + ControlPlaneStopTimeout: controlPlaneStopTimeout, + CRDDirectoryPaths: []string{ + filepath.Join("..", "..", "..", "manifests", "v1beta1", "katib-controller"), + filepath.Join("..", "..", "..", "test", "unit", "v1beta1", "crds"), + }, + } + apis.AddToScheme(scheme.Scheme) + + var err error + if cfg, err = t.Start(); err != nil { + stdlog.Fatal(err) + } + + code := m.Run() + t.Stop() + os.Exit(code) +} + +// SetupTestReconcile returns a reconcile.Reconcile implementation that delegates to inner. +func SetupTestReconcile(inner reconcile.Reconciler) reconcile.Reconciler { + fn := reconcile.Func(func(req reconcile.Request) (reconcile.Result, error) { + result, err := inner.Reconcile(req) + return result, err + }) + return fn +} + +// StartTestManager adds recFn +func StartTestManager(mgr manager.Manager, g *gomega.GomegaWithT) (chan struct{}, *sync.WaitGroup) { + stop := make(chan struct{}) + wg := &sync.WaitGroup{} + wg.Add(1) + go func() { + defer wg.Done() + g.Expect(mgr.Start(stop)).NotTo(gomega.HaveOccurred()) + }() + return stop, wg +} + +// addForTestPurpose adds a new Controller to mgr with r as the reconcile.Reconciler. +func addForTestPurpose(mgr manager.Manager, r reconcile.Reconciler) error { + // Create a new controller + c, err := controller.New("test-experiment-controller", mgr, controller.Options{Reconciler: r}) + if err != nil { + log.Error(err, "Failed to create experiment controller for test purpose.") + return err + } + + if err = addWatch(mgr, c); err != nil { + log.Error(err, "Trial watch failed") + return err + } + + log.Info("Experiment controller created") + return nil +} diff --git a/pkg/controller.v1beta1/experiment/experiment_controller_test.go b/pkg/controller.v1beta1/experiment/experiment_controller_test.go new file mode 100644 index 00000000000..038172a6002 --- /dev/null +++ b/pkg/controller.v1beta1/experiment/experiment_controller_test.go @@ -0,0 +1,276 @@ +package experiment + +import ( + "context" + "testing" + "time" + + "github.com/golang/mock/gomock" + "github.com/onsi/gomega" + "github.com/prometheus/client_golang/prometheus" + "k8s.io/apimachinery/pkg/api/errors" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + + commonapiv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" + experimentsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + suggestionsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1" + trialsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" + "github.com/kubeflow/katib/pkg/controller.v1beta1/consts" + "github.com/kubeflow/katib/pkg/controller.v1beta1/experiment/util" + manifestmock "github.com/kubeflow/katib/pkg/mock/v1beta1/experiment/manifest" + suggestionmock "github.com/kubeflow/katib/pkg/mock/v1beta1/experiment/suggestion" +) + +const ( + experimentName = "foo" + namespace = "default" + + timeout = time.Second * 40 +) + +var expectedRequest = reconcile.Request{NamespacedName: types.NamespacedName{Name: experimentName, Namespace: namespace}} +var trialKey = types.NamespacedName{Name: "test", Namespace: namespace} + +func init() { + logf.SetLogger(logf.ZapLogger(true)) +} + +func TestCreateExperiment(t *testing.T) { + g := gomega.NewGomegaWithT(t) + instance := newFakeInstance() + + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + mockCtrl2 := gomock.NewController(t) + defer mockCtrl2.Finish() + suggestion := suggestionmock.NewMockSuggestion(mockCtrl) + + mockCtrl3 := gomock.NewController(t) + defer mockCtrl3.Finish() + generator := manifestmock.NewMockGenerator(mockCtrl) + + // Setup the Manager and Controller. Wrap the Controller Reconcile function so it writes each request to a + // channel when it is finished. + mgr, err := manager.New(cfg, manager.Options{}) + g.Expect(err).NotTo(gomega.HaveOccurred()) + c := mgr.GetClient() + + recFn := SetupTestReconcile(&ReconcileExperiment{ + Client: mgr.GetClient(), + scheme: mgr.GetScheme(), + Suggestion: suggestion, + Generator: generator, + updateStatusHandler: func(instance *experimentsv1beta1.Experiment) error { + if !instance.IsCreated() { + t.Errorf("Expected got condition created") + } + return nil + }, + }) + g.Expect(addForTestPurpose(mgr, recFn)).NotTo(gomega.HaveOccurred()) + + stopMgr, mgrStopped := StartTestManager(mgr, g) + + defer func() { + close(stopMgr) + mgrStopped.Wait() + }() + + // Create the Trial object and expect the Reconcile and Deployment to be created + err = c.Create(context.TODO(), instance) + // The instance object may not be a valid object because it might be missing some required fields. + // Please modify the instance object by adding required fields and then remove the following if statement. + if apierrors.IsInvalid(err) { + t.Logf("failed to create object, got an invalid object error: %v", err) + return + } + g.Expect(err).NotTo(gomega.HaveOccurred()) + + g.Expect(c.Delete(context.TODO(), instance)).NotTo(gomega.HaveOccurred()) + g.Eventually(func() bool { + return errors.IsNotFound(c.Get(context.TODO(), + expectedRequest.NamespacedName, instance)) + }, timeout).Should(gomega.BeTrue()) +} + +func TestReconcileExperiment(t *testing.T) { + g := gomega.NewGomegaWithT(t) + testName := "tn" + instance := newFakeInstance() + instance.Name = testName + + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + mockCtrl2 := gomock.NewController(t) + defer mockCtrl2.Finish() + suggestion := suggestionmock.NewMockSuggestion(mockCtrl) + suggestion.EXPECT().GetOrCreateSuggestion(gomock.Any(), gomock.Any()).Return( + &suggestionsv1beta1.Suggestion{ + ObjectMeta: metav1.ObjectMeta{ + Name: instance.Name, + Namespace: instance.Namespace, + }, + Status: suggestionsv1beta1.SuggestionStatus{ + Suggestions: []suggestionsv1beta1.TrialAssignment{ + { + Name: trialKey.Name, + ParameterAssignments: []commonapiv1beta1.ParameterAssignment{ + { + Name: "--lr", + Value: "0.5", + }, + }, + }, + }, + }, + }, nil).AnyTimes() + suggestion.EXPECT().UpdateSuggestion(gomock.Any()).Return(nil).AnyTimes() + mockCtrl3 := gomock.NewController(t) + defer mockCtrl3.Finish() + generator := manifestmock.NewMockGenerator(mockCtrl) + generator.EXPECT().GetRunSpecWithHyperParameters(gomock.Any(), gomock.Any(), + gomock.Any(), gomock.Any(), gomock.Any()).Return(`apiVersion: "kubeflow.org/v1" +kind: "TFJob" +metadata: + name: "test" + namespace: "default" +spec: + tfReplicaSpecs: + PS: + replicas: 2 + restartPolicy: Never + template: + spec: + containers: + - name: tensorflow + image: kubeflow/tf-dist-mnist-test:1.0 + Worker: + replicas: 4 + restartPolicy: Never + template: + spec: + containers: + - name: tensorflow + image: kubeflow/tf-dist-mnist-test:1.0`, nil).AnyTimes() + + mgr, err := manager.New(cfg, manager.Options{}) + g.Expect(err).NotTo(gomega.HaveOccurred()) + c := mgr.GetClient() + + r := &ReconcileExperiment{ + Client: mgr.GetClient(), + scheme: mgr.GetScheme(), + Suggestion: suggestion, + Generator: generator, + collector: util.NewExpsCollector(mgr.GetCache(), prometheus.NewRegistry()), + } + r.updateStatusHandler = func(instance *experimentsv1beta1.Experiment) error { + if !instance.IsCreated() { + t.Errorf("Expected got condition created") + } + return r.updateStatus(instance) + } + + recFn := SetupTestReconcile(r) + g.Expect(addForTestPurpose(mgr, recFn)).NotTo(gomega.HaveOccurred()) + + stopMgr, mgrStopped := StartTestManager(mgr, g) + + defer func() { + close(stopMgr) + mgrStopped.Wait() + }() + + // Create the Trial object and expect the Reconcile and Deployment to be created + err = c.Create(context.TODO(), instance) + // The instance object may not be a valid object because it might be missing some required fields. + // Please modify the instance object by adding required fields and then remove the following if statement. + if apierrors.IsInvalid(err) { + t.Logf("failed to create object, got an invalid object error: %v", err) + return + } + g.Expect(err).NotTo(gomega.HaveOccurred()) + + trials := &trialsv1beta1.TrialList{} + g.Eventually(func() int { + label := labels.Set{ + consts.LabelExperimentName: testName, + } + c.List(context.TODO(), &client.ListOptions{ + LabelSelector: label.AsSelector(), + }, trials) + return len(trials.Items) + }, timeout). + Should(gomega.Equal(1)) + + g.Expect(c.Delete(context.TODO(), instance)).NotTo(gomega.HaveOccurred()) + g.Eventually(func() bool { + return errors.IsNotFound(c.Get(context.TODO(), + types.NamespacedName{Namespace: instance.Namespace, Name: instance.Name}, instance)) + }, timeout).Should(gomega.BeTrue()) +} + +func newFakeInstance() *experimentsv1beta1.Experiment { + var parallelCount int32 = 1 + var goal float64 = 99.9 + return &experimentsv1beta1.Experiment{ + ObjectMeta: metav1.ObjectMeta{ + Name: experimentName, + Namespace: namespace, + }, + Spec: experimentsv1beta1.ExperimentSpec{ + ParallelTrialCount: ¶llelCount, + MaxTrialCount: ¶llelCount, + Objective: &commonapiv1beta1.ObjectiveSpec{ + Type: commonapiv1beta1.ObjectiveTypeMaximize, + Goal: &goal, + ObjectiveMetricName: "accuracy", + }, + TrialTemplate: &experimentsv1beta1.TrialTemplate{ + GoTemplate: &experimentsv1beta1.GoTemplate{ + RawTemplate: `apiVersion: "kubeflow.org/v1" +kind: TFJob +metadata: + name: {{.Trial}} + namespace: {{.NameSpace}} +spec: + tfReplicaSpecs: + Worker: + replicas: 1 + restartPolicy: OnFailure + template: + spec: + containers: + - name: tensorflow + image: gcr.io/kubeflow-ci/tf-mnist-with-summaries:1.0 + imagePullPolicy: Always + command: + - "python" + - "/var/tf_mnist/mnist_with_summaries.py" + - "--log_dir=/train/{{.Trial}}" + {{- with .HyperParameters}} + {{- range .}} + - "{{.Name}}={{.Value}}" + {{- end}} + {{- end}} + volumeMounts: + - mountPath: "/train" + name: "train" + volumes: + - name: "train" + persistentVolumeClaim: + claimName: "tfevent-volume"`, + }, + }, + }, + } +} diff --git a/pkg/controller.v1beta1/experiment/experiment_status.go b/pkg/controller.v1beta1/experiment/experiment_status.go new file mode 100644 index 00000000000..08cf4c22138 --- /dev/null +++ b/pkg/controller.v1beta1/experiment/experiment_status.go @@ -0,0 +1,17 @@ +package experiment + +import ( + "context" + + experimentsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" +) + +type updateStatusFunc func(instance *experimentsv1beta1.Experiment) error + +func (r *ReconcileExperiment) updateStatus(instance *experimentsv1beta1.Experiment) error { + err := r.Status().Update(context.TODO(), instance) + if err != nil { + return err + } + return nil +} diff --git a/pkg/controller.v1beta1/experiment/experiment_util.go b/pkg/controller.v1beta1/experiment/experiment_util.go new file mode 100644 index 00000000000..9ba59b159c6 --- /dev/null +++ b/pkg/controller.v1beta1/experiment/experiment_util.go @@ -0,0 +1,140 @@ +package experiment + +import ( + "bytes" + "context" + "fmt" + + "k8s.io/apimachinery/pkg/api/errors" + + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/types" + k8syaml "k8s.io/apimachinery/pkg/util/yaml" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + + experimentsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + suggestionsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1" + trialsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" + suggestionController "github.com/kubeflow/katib/pkg/controller.v1beta1/suggestion" + "github.com/kubeflow/katib/pkg/controller.v1beta1/util" +) + +const ( + updatePrometheusMetrics = "update-prometheus-metrics" +) + +func (r *ReconcileExperiment) createTrialInstance(expInstance *experimentsv1beta1.Experiment, trialAssignment *suggestionsv1beta1.TrialAssignment) error { + BUFSIZE := 1024 + logger := log.WithValues("Experiment", types.NamespacedName{Name: expInstance.GetName(), Namespace: expInstance.GetNamespace()}) + + trial := &trialsv1beta1.Trial{} + trial.Name = trialAssignment.Name + trial.Namespace = expInstance.GetNamespace() + trial.Labels = util.TrialLabels(expInstance) + + if err := controllerutil.SetControllerReference(expInstance, trial, r.scheme); err != nil { + logger.Error(err, "Set controller reference error") + return err + } + + trial.Spec.Objective = expInstance.Spec.Objective + + hps := trialAssignment.ParameterAssignments + trial.Spec.ParameterAssignments = trialAssignment.ParameterAssignments + runSpec, err := r.GetRunSpecWithHyperParameters(expInstance, expInstance.GetName(), trial.Name, trial.Namespace, hps) + if err != nil { + logger.Error(err, "Fail to get RunSpec from experiment", expInstance.Name) + return err + } + + trial.Spec.RunSpec = runSpec + if expInstance.Spec.TrialTemplate != nil { + trial.Spec.RetainRun = expInstance.Spec.TrialTemplate.Retain + } + + buf := bytes.NewBufferString(runSpec) + job := &unstructured.Unstructured{} + if err := k8syaml.NewYAMLOrJSONDecoder(buf, BUFSIZE).Decode(job); err != nil { + return fmt.Errorf("Invalid spec.trialTemplate: %v.", err) + } + + if expInstance.Spec.MetricsCollectorSpec != nil { + trial.Spec.MetricsCollector = *expInstance.Spec.MetricsCollectorSpec + } + + if err := r.Create(context.TODO(), trial); err != nil { + logger.Error(err, "Trial create error", "Trial name", trial.Name) + return err + } + return nil + +} + +func needUpdateFinalizers(exp *experimentsv1beta1.Experiment) (bool, []string) { + deleted := !exp.ObjectMeta.DeletionTimestamp.IsZero() + pendingFinalizers := exp.GetFinalizers() + contained := false + for _, elem := range pendingFinalizers { + if elem == updatePrometheusMetrics { + contained = true + break + } + } + + if !deleted && !contained { + finalizers := append(pendingFinalizers, updatePrometheusMetrics) + return true, finalizers + } + if deleted && contained { + finalizers := []string{} + for _, pendingFinalizer := range pendingFinalizers { + if pendingFinalizer != updatePrometheusMetrics { + finalizers = append(finalizers, pendingFinalizer) + } + } + return true, finalizers + } + return false, []string{} +} + +func (r *ReconcileExperiment) updateFinalizers(instance *experimentsv1beta1.Experiment, finalizers []string) (reconcile.Result, error) { + instance.SetFinalizers(finalizers) + if err := r.Update(context.TODO(), instance); err != nil { + return reconcile.Result{}, err + } else { + if !instance.ObjectMeta.DeletionTimestamp.IsZero() { + r.collector.IncreaseExperimentsDeletedCount(instance.Namespace) + } else { + r.collector.IncreaseExperimentsCreatedCount(instance.Namespace) + } + // Need to requeue because finalizer update does not change metadata.generation + return reconcile.Result{Requeue: true}, err + } +} + +func (r *ReconcileExperiment) terminateSuggestion(instance *experimentsv1beta1.Experiment) error { + original := &suggestionsv1beta1.Suggestion{} + err := r.Get(context.TODO(), + types.NamespacedName{Namespace: instance.GetNamespace(), Name: instance.GetName()}, original) + if err != nil { + if errors.IsNotFound(err) { + return nil + } + return err + } + // If Suggestion is failed or Suggestion is Succeeded, not needed to terminate Suggestion + if original.IsFailed() || original.IsSucceeded() { + return nil + } + log.Info("Start terminating suggestion") + suggestion := original.DeepCopy() + msg := "Suggestion is succeeded" + suggestion.MarkSuggestionStatusSucceeded(suggestionController.SuggestionSucceededReason, msg) + log.Info("Mark suggestion succeeded") + + if err := r.UpdateSuggestionStatus(suggestion); err != nil { + return err + } + return nil +} diff --git a/pkg/controller.v1beta1/experiment/manifest/generator.go b/pkg/controller.v1beta1/experiment/manifest/generator.go new file mode 100644 index 00000000000..93827f379b0 --- /dev/null +++ b/pkg/controller.v1beta1/experiment/manifest/generator.go @@ -0,0 +1,133 @@ +package manifest + +import ( + "bytes" + "errors" + "text/template" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/controller-runtime/pkg/client" + + commonapiv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" + experimentsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + "github.com/kubeflow/katib/pkg/controller.v1beta1/consts" + "github.com/kubeflow/katib/pkg/util/v1beta1/katibclient" + "github.com/kubeflow/katib/pkg/util/v1beta1/katibconfig" +) + +const ( + defaultMetricsCollectorTemplateName = "defaultMetricsCollectorTemplate.yaml" +) + +// Generator is the type for manifests Generator. +type Generator interface { + InjectClient(c client.Client) + GetRunSpec(e *experimentsv1beta1.Experiment, experiment, trial, namespace string) (string, error) + GetRunSpecWithHyperParameters(e *experimentsv1beta1.Experiment, experiment, trial, namespace string, hps []commonapiv1beta1.ParameterAssignment) (string, error) + GetSuggestionConfigData(algorithmName string) (map[string]string, error) + GetMetricsCollectorImage(cKind commonapiv1beta1.CollectorKind) (string, error) +} + +// DefaultGenerator is the default implementation of Generator. +type DefaultGenerator struct { + client katibclient.Client +} + +// New creates a new Generator. +func New(c client.Client) Generator { + katibClient := katibclient.NewWithGivenClient(c) + return &DefaultGenerator{ + client: katibClient, + } +} + +func (g *DefaultGenerator) InjectClient(c client.Client) { + g.client.InjectClient(c) +} + +func (g *DefaultGenerator) GetMetricsCollectorImage(cKind commonapiv1beta1.CollectorKind) (string, error) { + configData, err := katibconfig.GetMetricsCollectorConfigData(cKind, g.client.GetClient()) + if err != nil { + return "", nil + } + return configData[consts.LabelMetricsCollectorSidecarImage], nil +} + +func (g *DefaultGenerator) GetSuggestionConfigData(algorithmName string) (map[string]string, error) { + return katibconfig.GetSuggestionConfigData(algorithmName, g.client.GetClient()) +} + +// GetRunSpec get the specification for trial. +func (g *DefaultGenerator) GetRunSpec(e *experimentsv1beta1.Experiment, experiment, trial, namespace string) (string, error) { + params := trialTemplateParams{ + Experiment: experiment, + Trial: trial, + NameSpace: namespace, + } + return g.getRunSpec(e, params) +} + +// GetRunSpecWithHyperParameters get the specification for trial with hyperparameters. +func (g *DefaultGenerator) GetRunSpecWithHyperParameters(e *experimentsv1beta1.Experiment, experiment, trial, namespace string, hps []commonapiv1beta1.ParameterAssignment) (string, error) { + params := trialTemplateParams{ + Experiment: experiment, + Trial: trial, + NameSpace: namespace, + HyperParameters: hps, + } + return g.getRunSpec(e, params) +} + +func (g *DefaultGenerator) getRunSpec(e *experimentsv1beta1.Experiment, params trialTemplateParams) (string, error) { + var buf bytes.Buffer + trialTemplate, err := g.getTrialTemplate(e) + if err != nil { + return "", err + } + if err := trialTemplate.Execute(&buf, params); err != nil { + return "", err + } + return buf.String(), nil +} + +func (g *DefaultGenerator) getTrialTemplate(instance *experimentsv1beta1.Experiment) (*template.Template, error) { + var err error + var tpl *template.Template = nil + + trialTemplate := instance.Spec.TrialTemplate + if trialTemplate.GoTemplate.RawTemplate != "" { + tpl, err = template.New("Trial").Parse(trialTemplate.GoTemplate.RawTemplate) + if err != nil { + return nil, err + } + } else { + templateSpec := trialTemplate.GoTemplate.TemplateSpec + configMapNS := templateSpec.ConfigMapNamespace + configMapName := templateSpec.ConfigMapName + templatePath := templateSpec.TemplatePath + + configMap, err := g.client.GetConfigMap(configMapName, configMapNS) + if err != nil { + return nil, err + } + + if configMapTemplate, ok := configMap[templatePath]; !ok { + err = errors.New(string(metav1.StatusReasonNotFound)) + return nil, err + } else { + tpl, err = template.New("Trial").Parse(configMapTemplate) + if err != nil { + return nil, err + } + } + } + + return tpl, nil +} + +type trialTemplateParams struct { + Experiment string + Trial string + NameSpace string + HyperParameters []commonapiv1beta1.ParameterAssignment +} diff --git a/pkg/controller.v1beta1/experiment/manifest/generator_test.go b/pkg/controller.v1beta1/experiment/manifest/generator_test.go new file mode 100644 index 00000000000..229c3b0e018 --- /dev/null +++ b/pkg/controller.v1beta1/experiment/manifest/generator_test.go @@ -0,0 +1,188 @@ +package manifest + +import ( + "reflect" + "testing" + "text/template" + + "github.com/golang/mock/gomock" + + commonapiv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" + experimentsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + katibclientmock "github.com/kubeflow/katib/pkg/mock/v1beta1/util/katibclient" +) + +const ( + rawTemplate = `apiVersion: batch/v1 +kind: Job +metadata: +name: {{.Trial}} +namespace: {{.NameSpace}} +spec: + template: + spec: + containers: + - name: {{.Trial}} + image: katib/mxnet-mnist-example + command: + - "python" + - "/mxnet/example/image-classification/train_mnist.py" + - "--batch-size=64" + {{- with .HyperParameters}} + {{- range .}} + - "{{.Name}}={{.Value}}" + {{- end}} + {{- end}}` +) + +func TestGetTrialTemplateConfigMap(t *testing.T) { + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + c := katibclientmock.NewMockClient(mockCtrl) + + p := &DefaultGenerator{ + client: c, + } + + templatePath := "test.yaml" + + c.EXPECT().GetConfigMap(gomock.Any(), gomock.Any()).Return(map[string]string{ + templatePath: rawTemplate, + }, nil) + + instance := newFakeInstance() + instance.Spec.TrialTemplate.GoTemplate.TemplateSpec = &experimentsv1beta1.TemplateSpec{ + TemplatePath: templatePath, + } + instance.Spec.TrialTemplate.GoTemplate.RawTemplate = "" + actual, err := p.getTrialTemplate(instance) + if err != nil { + t.Errorf("Expected nil, got %v", err) + } + expected, err := template.New("Trial").Parse(rawTemplate) + if err != nil { + t.Errorf("Expected nil, got %v", err) + } + if !reflect.DeepEqual(expected, actual) { + t.Errorf("Expected %v, got %v", *expected, *actual) + } +} + +func TestGetTrialTemplate(t *testing.T) { + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + c := katibclientmock.NewMockClient(mockCtrl) + + p := &DefaultGenerator{ + client: c, + } + + tc := newFakeInstance() + + expected, err := template.New("Trial"). + Parse(tc.Spec.TrialTemplate.GoTemplate.RawTemplate) + if err != nil { + t.Errorf("Failed to compose expected result") + } + + actual, err := p.getTrialTemplate(tc) + if err != nil { + t.Errorf("Expected nil, got %v", err) + } + + if !reflect.DeepEqual(expected, actual) { + t.Errorf("Expected %v, got %v", *expected, *actual) + } +} + +func TestGetRunSpec(t *testing.T) { + tc := newFakeInstance() + + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + c := katibclientmock.NewMockClient(mockCtrl) + + p := &DefaultGenerator{ + client: c, + } + + actual, err := p.GetRunSpec(tc, "", "test", "testns") + if err != nil { + t.Errorf("Expected nil, got %v", err) + } + expected := `apiVersion: batch/v1 +kind: Job +metadata: +name: test +namespace: testns +spec: + template: + spec: + containers: + - name: test + image: katib/mxnet-mnist-example + command: + - "python" + - "/mxnet/example/image-classification/train_mnist.py" + - "--batch-size=64"` + if expected != actual { + t.Errorf("Expected %s, got %s", expected, actual) + } +} + +func TestGetRunSpecWithHP(t *testing.T) { + tc := newFakeInstance() + + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + c := katibclientmock.NewMockClient(mockCtrl) + + p := &DefaultGenerator{ + client: c, + } + + actual, err := p.GetRunSpecWithHyperParameters(tc, "", "test", "testns", []commonapiv1beta1.ParameterAssignment{ + { + Name: "testname", + Value: "testvalue", + }, + }) + if err != nil { + t.Errorf("Expected nil, got %v", err) + } + expected := `apiVersion: batch/v1 +kind: Job +metadata: +name: test +namespace: testns +spec: + template: + spec: + containers: + - name: test + image: katib/mxnet-mnist-example + command: + - "python" + - "/mxnet/example/image-classification/train_mnist.py" + - "--batch-size=64" + - "testname=testvalue"` + if expected != actual { + t.Errorf("Expected %s, got %s", expected, actual) + } +} + +func newFakeInstance() *experimentsv1beta1.Experiment { + return &experimentsv1beta1.Experiment{ + Spec: experimentsv1beta1.ExperimentSpec{ + TrialTemplate: &experimentsv1beta1.TrialTemplate{ + GoTemplate: &experimentsv1beta1.GoTemplate{ + RawTemplate: rawTemplate, + }, + }, + }, + } +} diff --git a/pkg/controller.v1beta1/experiment/suggestion/fake/fake.go b/pkg/controller.v1beta1/experiment/suggestion/fake/fake.go new file mode 100644 index 00000000000..84277ad24db --- /dev/null +++ b/pkg/controller.v1beta1/experiment/suggestion/fake/fake.go @@ -0,0 +1,26 @@ +package fake + +import ( + experimentsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + suggestionsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1" + "github.com/kubeflow/katib/pkg/controller.v1beta1/experiment/suggestion" +) + +type Fake struct { +} + +func New() suggestion.Suggestion { + return &Fake{} +} + +func (f *Fake) GetOrCreateSuggestion(instance *experimentsv1beta1.Experiment, suggestionRequests int32) (*suggestionsv1beta1.Suggestion, error) { + return nil, nil +} + +func (f *Fake) UpdateSuggestion(suggestion *suggestionsv1beta1.Suggestion) error { + return nil +} + +func (f *Fake) UpdateSuggestionStatus(suggestion *suggestionsv1beta1.Suggestion) error { + return nil +} diff --git a/pkg/controller.v1beta1/experiment/suggestion/suggestion.go b/pkg/controller.v1beta1/experiment/suggestion/suggestion.go new file mode 100644 index 00000000000..700b091c86d --- /dev/null +++ b/pkg/controller.v1beta1/experiment/suggestion/suggestion.go @@ -0,0 +1,96 @@ +package suggestion + +import ( + "context" + + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" + + //utilrand "k8s.io/apimachinery/pkg/util/rand" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + + experimentsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + suggestionsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1" +) + +var log = logf.Log.WithName("experiment-suggestion-client") + +type Suggestion interface { + GetOrCreateSuggestion(instance *experimentsv1beta1.Experiment, suggestionRequests int32) (*suggestionsv1beta1.Suggestion, error) + UpdateSuggestion(suggestion *suggestionsv1beta1.Suggestion) error + UpdateSuggestionStatus(suggestion *suggestionsv1beta1.Suggestion) error +} + +type General struct { + scheme *runtime.Scheme + client.Client +} + +func New(scheme *runtime.Scheme, client client.Client) Suggestion { + return &General{scheme: scheme, Client: client} +} + +func (g *General) GetOrCreateSuggestion(instance *experimentsv1beta1.Experiment, suggestionRequests int32) (*suggestionsv1beta1.Suggestion, error) { + logger := log.WithValues("experiment", types.NamespacedName{Name: instance.Name, Namespace: instance.Namespace}) + suggestion := &suggestionsv1beta1.Suggestion{} + err := g.Get(context.TODO(), + types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}, suggestion) + if err != nil && errors.IsNotFound(err) { + logger.Info("Creating Suggestion", "namespace", instance.Namespace, "name", instance.Name, "requests", suggestionRequests) + if err := g.createSuggestion(instance, suggestionRequests); err != nil { + logger.Error(err, "CreateSuggestion failed", "instance", instance.Name) + return nil, err + } + } else if err != nil { + logger.Error(err, "Suggestion get failed", "instance", instance.Name) + return nil, err + } else { + return suggestion, nil + } + return nil, nil +} + +func (g *General) createSuggestion(instance *experimentsv1beta1.Experiment, suggestionRequests int32) error { + logger := log.WithValues("experiment", types.NamespacedName{Name: instance.Name, Namespace: instance.Namespace}) + suggestion := &suggestionsv1beta1.Suggestion{ + ObjectMeta: metav1.ObjectMeta{ + Name: instance.Name, + Namespace: instance.Namespace, + Labels: instance.Labels, + Annotations: instance.Annotations, + }, + Spec: suggestionsv1beta1.SuggestionSpec{ + AlgorithmName: instance.Spec.Algorithm.AlgorithmName, + Requests: suggestionRequests, + }, + } + + if err := controllerutil.SetControllerReference(instance, suggestion, g.scheme); err != nil { + logger.Error(err, "Error in setting controller reference") + return err + } + logger.Info("Creating Suggestion", "namespace", instance.Namespace, "name", instance.Name) + if err := g.Create(context.TODO(), suggestion); err != nil { + return err + } + return nil +} + +func (g *General) UpdateSuggestion(suggestion *suggestionsv1beta1.Suggestion) error { + if err := g.Update(context.TODO(), suggestion); err != nil { + return err + } + return nil +} + +func (g *General) UpdateSuggestionStatus(suggestion *suggestionsv1beta1.Suggestion) error { + if err := g.Status().Update(context.TODO(), suggestion); err != nil { + return err + } + + return nil +} diff --git a/pkg/controller.v1beta1/experiment/util/prometheus_metrics.go b/pkg/controller.v1beta1/experiment/util/prometheus_metrics.go new file mode 100644 index 00000000000..145d9da06df --- /dev/null +++ b/pkg/controller.v1beta1/experiment/util/prometheus_metrics.go @@ -0,0 +1,136 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + "context" + + "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + "github.com/prometheus/client_golang/prometheus" + "sigs.k8s.io/controller-runtime/pkg/cache" +) + +type ExperimentsCollector struct { + store cache.Cache + expDeleteCount *prometheus.CounterVec + expCreateCount *prometheus.CounterVec + expSucceedCount *prometheus.CounterVec + expFailCount *prometheus.CounterVec + expCurrent *prometheus.GaugeVec +} + +func NewExpsCollector(store cache.Cache, registerer prometheus.Registerer) *ExperimentsCollector { + c := &ExperimentsCollector{ + store: store, + expDeleteCount: prometheus.NewCounterVec(prometheus.CounterOpts{ + Name: "katib_experiment_deleted_total", + Help: "The total number of deleted experiments", + }, []string{"namespace"}), + + expCreateCount: prometheus.NewCounterVec(prometheus.CounterOpts{ + Name: "katib_experiment_created_total", + Help: "The total number of created experiments", + }, []string{"namespace"}), + + expSucceedCount: prometheus.NewCounterVec(prometheus.CounterOpts{ + Name: "katib_experiment_succeeded_total", + Help: "The total number of succeeded experiments", + }, []string{"namespace"}), + + expFailCount: prometheus.NewCounterVec(prometheus.CounterOpts{ + Name: "katib_experiment_failed_total", + Help: "The total number of failed experiments", + }, []string{"namespace"}), + + expCurrent: prometheus.NewGaugeVec(prometheus.GaugeOpts{ + Name: "katib_experiments_current", + Help: "The number of current katib experiments in the cluster", + }, []string{"namespace", "status"}), + } + registerer.MustRegister(c) + return c +} + +// Describe implements the prometheus.Collector interface. +func (m *ExperimentsCollector) Describe(ch chan<- *prometheus.Desc) { + m.expDeleteCount.Describe(ch) + m.expSucceedCount.Describe(ch) + m.expFailCount.Describe(ch) + m.expCreateCount.Describe(ch) + m.expCurrent.Describe(ch) +} + +// Collect implements the prometheus.Collector interface. +func (m *ExperimentsCollector) Collect(ch chan<- prometheus.Metric) { + m.collect() + m.expDeleteCount.Collect(ch) + m.expSucceedCount.Collect(ch) + m.expFailCount.Collect(ch) + m.expCreateCount.Collect(ch) + m.expCurrent.Collect(ch) +} + +func (c *ExperimentsCollector) IncreaseExperimentsDeletedCount(ns string) { + c.expDeleteCount.WithLabelValues(ns).Inc() +} + +func (c *ExperimentsCollector) IncreaseExperimentsCreatedCount(ns string) { + c.expCreateCount.WithLabelValues(ns).Inc() +} + +func (c *ExperimentsCollector) IncreaseExperimentsSucceededCount(ns string) { + c.expSucceedCount.WithLabelValues(ns).Inc() +} + +func (c *ExperimentsCollector) IncreaseExperimentsFailedCount(ns string) { + c.expFailCount.WithLabelValues(ns).Inc() +} + +// collect gets the current experiments from cache. +func (c *ExperimentsCollector) collect() { + var ( + conditionType v1beta1.ExperimentConditionType + status string + err error + ) + expLists := &v1beta1.ExperimentList{} + if err = c.store.List(context.TODO(), nil, expLists); err != nil { + return + } + + expCache := map[string]map[string]int{} + for _, exp := range expLists.Items { + conditionType, err = exp.GetLastConditionType() + status = string(conditionType) + // If experiment doesn't have any condition, use unknown. + if err != nil { + status = "Unknown" + } + + if _, ok := expCache[exp.Namespace]; !ok { + expCache[exp.Namespace] = make(map[string]int) + } + expCache[exp.Namespace][status] += 1 + } + + c.expCurrent.Reset() + for ns, v := range expCache { + for status, count := range v { + c.expCurrent.WithLabelValues(ns, status).Set(float64(count)) + } + } +} diff --git a/pkg/controller.v1beta1/experiment/util/status_util.go b/pkg/controller.v1beta1/experiment/util/status_util.go new file mode 100644 index 00000000000..2c665becb10 --- /dev/null +++ b/pkg/controller.v1beta1/experiment/util/status_util.go @@ -0,0 +1,196 @@ +/* + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + + commonv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" + experimentsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + trialsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +var log = logf.Log.WithName("experiment-status-util") + +const ( + ExperimentCreatedReason = "ExperimentCreated" + ExperimentRunningReason = "ExperimentRunning" + ExperimentRestartingReason = "ExperimentRestarting" + ExperimentGoalReachedReason = "ExperimentGoalReached" + ExperimentMaxTrialsReachedReason = "ExperimentMaxTrialsReached" + ExperimentSuggestionEndReachedReason = "ExperimentSuggestionEndReached" + ExperimentFailedReason = "ExperimentFailed" + ExperimentKilledReason = "ExperimentKilled" +) + +func UpdateExperimentStatus(collector *ExperimentsCollector, instance *experimentsv1beta1.Experiment, trials *trialsv1beta1.TrialList) error { + + isObjectiveGoalReached := updateTrialsSummary(instance, trials) + + if !instance.IsCompleted() { + UpdateExperimentStatusCondition(collector, instance, isObjectiveGoalReached, false) + } + return nil + +} + +func updateTrialsSummary(instance *experimentsv1beta1.Experiment, trials *trialsv1beta1.TrialList) bool { + + var bestTrialValue float64 + sts := &instance.Status + sts.Trials = 0 + sts.RunningTrialList, sts.PendingTrialList, sts.FailedTrialList, sts.SucceededTrialList, sts.KilledTrialList = nil, nil, nil, nil, nil + bestTrialIndex := -1 + isObjectiveGoalReached := false + var objectiveValueGoal float64 + if instance.Spec.Objective.Goal != nil { + objectiveValueGoal = *instance.Spec.Objective.Goal + } + objectiveType := instance.Spec.Objective.Type + objectiveMetricName := instance.Spec.Objective.ObjectiveMetricName + + for index, trial := range trials.Items { + sts.Trials++ + if trial.IsKilled() { + sts.KilledTrialList = append(sts.KilledTrialList, trial.Name) + } else if trial.IsFailed() { + sts.FailedTrialList = append(sts.FailedTrialList, trial.Name) + } else if trial.IsSucceeded() { + sts.SucceededTrialList = append(sts.SucceededTrialList, trial.Name) + } else if trial.IsRunning() { + sts.RunningTrialList = append(sts.RunningTrialList, trial.Name) + } else { + sts.PendingTrialList = append(sts.PendingTrialList, trial.Name) + } + + objectiveMetricValue := getObjectiveMetricValue(trial, objectiveMetricName) + if objectiveMetricValue == nil { + continue + } + + //intialize vars to objective metric value of the first trial + if bestTrialIndex == -1 { + bestTrialValue = *objectiveMetricValue + bestTrialIndex = index + } + + if objectiveType == commonv1beta1.ObjectiveTypeMinimize { + if *objectiveMetricValue < bestTrialValue { + bestTrialValue = *objectiveMetricValue + bestTrialIndex = index + } + if instance.Spec.Objective.Goal != nil && bestTrialValue <= objectiveValueGoal { + isObjectiveGoalReached = true + } + } else if objectiveType == commonv1beta1.ObjectiveTypeMaximize { + if *objectiveMetricValue > bestTrialValue { + bestTrialValue = *objectiveMetricValue + bestTrialIndex = index + } + if instance.Spec.Objective.Goal != nil && bestTrialValue >= objectiveValueGoal { + isObjectiveGoalReached = true + } + } + } + + sts.TrialsRunning = int32(len(sts.RunningTrialList)) + sts.TrialsPending = int32(len(sts.PendingTrialList)) + sts.TrialsSucceeded = int32(len(sts.SucceededTrialList)) + sts.TrialsFailed = int32(len(sts.FailedTrialList)) + sts.TrialsKilled = int32(len(sts.KilledTrialList)) + + // if best trial is set + if bestTrialIndex != -1 { + bestTrial := trials.Items[bestTrialIndex] + + sts.CurrentOptimalTrial.BestTrialName = bestTrial.Name + sts.CurrentOptimalTrial.ParameterAssignments = []commonv1beta1.ParameterAssignment{} + for _, parameterAssigment := range bestTrial.Spec.ParameterAssignments { + sts.CurrentOptimalTrial.ParameterAssignments = append(sts.CurrentOptimalTrial.ParameterAssignments, parameterAssigment) + } + + sts.CurrentOptimalTrial.Observation.Metrics = []commonv1beta1.Metric{} + for _, metric := range bestTrial.Status.Observation.Metrics { + sts.CurrentOptimalTrial.Observation.Metrics = append(sts.CurrentOptimalTrial.Observation.Metrics, metric) + } + } + return isObjectiveGoalReached +} + +func getObjectiveMetricValue(trial trialsv1beta1.Trial, objectiveMetricName string) *float64 { + if trial.Status.Observation == nil { + return nil + } + for _, metric := range trial.Status.Observation.Metrics { + if objectiveMetricName == metric.Name { + return &metric.Value + } + } + return nil +} + +// UpdateExperimentStatusCondition updates the experiment status. +func UpdateExperimentStatusCondition(collector *ExperimentsCollector, instance *experimentsv1beta1.Experiment, isObjectiveGoalReached bool, getSuggestionDone bool) { + completedTrialsCount := instance.Status.TrialsSucceeded + instance.Status.TrialsFailed + instance.Status.TrialsKilled + failedTrialsCount := instance.Status.TrialsFailed + activeTrialsCount := instance.Status.TrialsPending + instance.Status.TrialsRunning + now := metav1.Now() + + if isObjectiveGoalReached { + msg := "Experiment has succeeded because Objective goal has reached" + instance.MarkExperimentStatusSucceeded(ExperimentGoalReachedReason, msg) + instance.Status.CompletionTime = &now + collector.IncreaseExperimentsSucceededCount(instance.Namespace) + return + } + + // First check if MaxFailedTrialCount is reached. + if (instance.Spec.MaxFailedTrialCount != nil) && (failedTrialsCount > *instance.Spec.MaxFailedTrialCount) { + msg := "Experiment has failed because max failed count has reached" + instance.MarkExperimentStatusFailed(ExperimentFailedReason, msg) + instance.Status.CompletionTime = &now + collector.IncreaseExperimentsFailedCount(instance.Namespace) + return + } + + // Then Check if MaxTrialCount is reached. + if (instance.Spec.MaxTrialCount != nil) && (completedTrialsCount >= *instance.Spec.MaxTrialCount) { + msg := "Experiment has succeeded because max trial count has reached" + instance.MarkExperimentStatusSucceeded(ExperimentMaxTrialsReachedReason, msg) + instance.Status.CompletionTime = &now + collector.IncreaseExperimentsSucceededCount(instance.Namespace) + return + } + + if getSuggestionDone && activeTrialsCount == 0 { + msg := "Experiment has succeeded because suggestion service has reached the end" + instance.MarkExperimentStatusSucceeded(ExperimentSuggestionEndReachedReason, msg) + instance.Status.CompletionTime = &now + collector.IncreaseExperimentsSucceededCount(instance.Namespace) + return + } + + msg := "Experiment is running" + instance.MarkExperimentStatusRunning(ExperimentRunningReason, msg) +} + +func IsCompletedExperimentRestartable(instance *experimentsv1beta1.Experiment) bool { + if instance.IsSucceeded() && instance.IsCompletedReason(ExperimentMaxTrialsReachedReason) && instance.Spec.ResumePolicy == experimentsv1beta1.LongRunning { + return true + } + return false +} diff --git a/pkg/controller.v1beta1/suggestion/composer/composer.go b/pkg/controller.v1beta1/suggestion/composer/composer.go new file mode 100644 index 00000000000..6e19202a592 --- /dev/null +++ b/pkg/controller.v1beta1/suggestion/composer/composer.go @@ -0,0 +1,230 @@ +package composer + +import ( + "fmt" + + "github.com/spf13/viper" + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + "sigs.k8s.io/controller-runtime/pkg/manager" + logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + + suggestionsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1" + "github.com/kubeflow/katib/pkg/controller.v1beta1/consts" + "github.com/kubeflow/katib/pkg/controller.v1beta1/util" + "github.com/kubeflow/katib/pkg/util/v1beta1/katibconfig" +) + +const ( + defaultInitialDelaySeconds = 10 + defaultPeriodForReady = 10 + defaultPeriodForLive = 120 + defaultFailureThreshold = 12 + // Ref https://github.com/grpc-ecosystem/grpc-health-probe/ + defaultGRPCHealthCheckProbe = "/bin/grpc_health_probe" +) + +var ( + log = logf.Log.WithName("suggestion-composer") + ComposerRegistry = make(map[string]Composer) +) + +type Composer interface { + DesiredDeployment(s *suggestionsv1beta1.Suggestion) (*appsv1.Deployment, error) + DesiredService(s *suggestionsv1beta1.Suggestion) (*corev1.Service, error) + CreateComposer(mgr manager.Manager) Composer +} + +type General struct { + scheme *runtime.Scheme + client.Client +} + +func New(mgr manager.Manager) Composer { + // We assume DefaultComposer always exists in ComposerRegistry. + ptr, _ := ComposerRegistry[consts.DefaultComposer] + return ptr.CreateComposer(mgr) +} + +func (g *General) DesiredDeployment(s *suggestionsv1beta1.Suggestion) (*appsv1.Deployment, error) { + + suggestionConfigData, err := katibconfig.GetSuggestionConfigData(s.Spec.AlgorithmName, g.Client) + if err != nil { + return nil, err + } + + container, err := g.desiredContainer(s, suggestionConfigData) + if err != nil { + log.Error(err, "Error in constructing container") + return nil, err + } + d := &appsv1.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: util.GetAlgorithmDeploymentName(s), + Namespace: s.Namespace, + Labels: s.Labels, + Annotations: s.Annotations, + }, + Spec: appsv1.DeploymentSpec{ + Selector: &metav1.LabelSelector{ + MatchLabels: util.SuggestionLabels(s), + }, + Template: corev1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: util.SuggestionLabels(s), + Annotations: util.SuggestionAnnotations(s), + }, + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + *container, + }, + }, + }, + }, + } + + // Get Suggestion Service Account Name from config + if suggestionConfigData[consts.LabelSuggestionServiceAccountName] != "" { + d.Spec.Template.Spec.ServiceAccountName = suggestionConfigData[consts.LabelSuggestionServiceAccountName] + } + + if err := controllerutil.SetControllerReference(s, d, g.scheme); err != nil { + return nil, err + } + return d, nil +} + +func (g *General) DesiredService(s *suggestionsv1beta1.Suggestion) (*corev1.Service, error) { + ports := []corev1.ServicePort{ + { + Name: consts.DefaultSuggestionPortName, + Port: consts.DefaultSuggestionPort, + }, + } + + service := &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: util.GetAlgorithmServiceName(s), + Namespace: s.Namespace, + }, + Spec: corev1.ServiceSpec{ + Selector: util.SuggestionLabels(s), + Ports: ports, + Type: corev1.ServiceTypeClusterIP, + }, + } + + // Add owner reference to the service so that it could be GC after the suggestion is deleted + if err := controllerutil.SetControllerReference(s, service, g.scheme); err != nil { + return nil, err + } + + return service, nil +} + +func (g *General) desiredContainer(s *suggestionsv1beta1.Suggestion, suggestionConfigData map[string]string) (*corev1.Container, error) { + + // Get Suggestion data from config + suggestionContainerImage := suggestionConfigData[consts.LabelSuggestionImageTag] + suggestionImagePullPolicy := suggestionConfigData[consts.LabelSuggestionImagePullPolicy] + suggestionCPULimit := suggestionConfigData[consts.LabelSuggestionCPULimitTag] + suggestionCPURequest := suggestionConfigData[consts.LabelSuggestionCPURequestTag] + suggestionMemLimit := suggestionConfigData[consts.LabelSuggestionMemLimitTag] + suggestionMemRequest := suggestionConfigData[consts.LabelSuggestionMemRequestTag] + suggestionDiskLimit := suggestionConfigData[consts.LabelSuggestionDiskLimitTag] + suggestionDiskRequest := suggestionConfigData[consts.LabelSuggestionDiskRequestTag] + c := &corev1.Container{ + Name: consts.ContainerSuggestion, + } + c.Image = suggestionContainerImage + c.ImagePullPolicy = corev1.PullPolicy(suggestionImagePullPolicy) + c.Ports = []corev1.ContainerPort{ + { + Name: consts.DefaultSuggestionPortName, + ContainerPort: consts.DefaultSuggestionPort, + }, + } + + cpuLimitQuantity, err := resource.ParseQuantity(suggestionCPULimit) + if err != nil { + return nil, err + } + cpuRequestQuantity, err := resource.ParseQuantity(suggestionCPURequest) + if err != nil { + return nil, err + } + memLimitQuantity, err := resource.ParseQuantity(suggestionMemLimit) + if err != nil { + return nil, err + } + memRequestQuantity, err := resource.ParseQuantity(suggestionMemRequest) + if err != nil { + return nil, err + } + diskLimitQuantity, err := resource.ParseQuantity(suggestionDiskLimit) + if err != nil { + return nil, err + } + diskRequestQuantity, err := resource.ParseQuantity(suggestionDiskRequest) + if err != nil { + return nil, err + } + + c.Resources = corev1.ResourceRequirements{ + Limits: corev1.ResourceList{ + corev1.ResourceCPU: cpuLimitQuantity, + corev1.ResourceMemory: memLimitQuantity, + corev1.ResourceEphemeralStorage: diskLimitQuantity, + }, + Requests: corev1.ResourceList{ + corev1.ResourceCPU: cpuRequestQuantity, + corev1.ResourceMemory: memRequestQuantity, + corev1.ResourceEphemeralStorage: diskRequestQuantity, + }, + } + + if viper.GetBool(consts.ConfigEnableGRPCProbeInSuggestion) { + c.ReadinessProbe = &corev1.Probe{ + Handler: corev1.Handler{ + Exec: &corev1.ExecAction{ + Command: []string{ + defaultGRPCHealthCheckProbe, + fmt.Sprintf("-addr=:%d", consts.DefaultSuggestionPort), + fmt.Sprintf("-service=%s", consts.DefaultGRPCService), + }, + }, + }, + InitialDelaySeconds: defaultInitialDelaySeconds, + PeriodSeconds: defaultPeriodForReady, + } + c.LivenessProbe = &corev1.Probe{ + Handler: corev1.Handler{ + Exec: &corev1.ExecAction{ + Command: []string{ + defaultGRPCHealthCheckProbe, + fmt.Sprintf("-addr=:%d", consts.DefaultSuggestionPort), + fmt.Sprintf("-service=%s", consts.DefaultGRPCService), + }, + }, + }, + // Ref https://srcco.de/posts/kubernetes-liveness-probes-are-dangerous.html + InitialDelaySeconds: defaultInitialDelaySeconds, + PeriodSeconds: defaultPeriodForLive, + FailureThreshold: defaultFailureThreshold, + } + } + return c, nil +} + +func (g *General) CreateComposer(mgr manager.Manager) Composer { + return &General{mgr.GetScheme(), mgr.GetClient()} +} + +func init() { + ComposerRegistry[consts.DefaultComposer] = &General{} +} diff --git a/pkg/controller.v1beta1/suggestion/suggestion_controller.go b/pkg/controller.v1beta1/suggestion/suggestion_controller.go new file mode 100644 index 00000000000..a20a82f01af --- /dev/null +++ b/pkg/controller.v1beta1/suggestion/suggestion_controller.go @@ -0,0 +1,250 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package suggestion + +import ( + "context" + "fmt" + + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/tools/record" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller" + "sigs.k8s.io/controller-runtime/pkg/handler" + "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + "sigs.k8s.io/controller-runtime/pkg/source" + + experimentsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + suggestionsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1" + trialsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" + "github.com/kubeflow/katib/pkg/controller.v1beta1/consts" + "github.com/kubeflow/katib/pkg/controller.v1beta1/suggestion/composer" + "github.com/kubeflow/katib/pkg/controller.v1beta1/suggestion/suggestionclient" + "github.com/kubeflow/katib/pkg/controller.v1beta1/util" +) + +const ( + ControllerName = "suggestion-controller" +) + +var log = logf.Log.WithName(ControllerName) + +// Add creates a new Suggestion Controller and adds it to the Manager with default RBAC. The Manager will set fields on the Controller +// and Start it when the Manager is Started. +func Add(mgr manager.Manager) error { + return add(mgr, newReconciler(mgr)) +} + +// newReconciler returns a new reconcile.Reconciler +func newReconciler(mgr manager.Manager) reconcile.Reconciler { + return &ReconcileSuggestion{ + Client: mgr.GetClient(), + SuggestionClient: suggestionclient.New(), + scheme: mgr.GetScheme(), + Composer: composer.New(mgr), + recorder: mgr.GetRecorder(ControllerName), + } +} + +// add adds a new Controller to mgr with r as the reconcile.Reconciler +func add(mgr manager.Manager, r reconcile.Reconciler) error { + // Create a new controller + c, err := controller.New("suggestion-controller", mgr, controller.Options{Reconciler: r}) + if err != nil { + return err + } + + err = c.Watch(&source.Kind{Type: &suggestionsv1beta1.Suggestion{}}, &handler.EnqueueRequestForObject{}) + if err != nil { + return err + } + + err = c.Watch(&source.Kind{Type: &appsv1.Deployment{}}, &handler.EnqueueRequestForOwner{ + IsController: true, + OwnerType: &suggestionsv1beta1.Suggestion{}, + }) + if err != nil { + return err + } + + err = c.Watch(&source.Kind{Type: &corev1.Service{}}, &handler.EnqueueRequestForOwner{ + IsController: true, + OwnerType: &suggestionsv1beta1.Suggestion{}, + }) + if err != nil { + return err + } + log.Info("Suggestion controller created") + return nil +} + +var _ reconcile.Reconciler = &ReconcileSuggestion{} + +// ReconcileSuggestion reconciles a Suggestion object +type ReconcileSuggestion struct { + client.Client + composer.Composer + suggestionclient.SuggestionClient + + scheme *runtime.Scheme + recorder record.EventRecorder +} + +// Reconcile reads that state of the cluster for a Suggestion object and makes changes based on the state read +// and what is in the Suggestion.Spec +// TODO(user): Modify this Reconcile function to implement your Controller logic. The scaffolding writes +// a Deployment as an example +// Automatically generate RBAC rules to allow the Controller to read and write Deployments +// +kubebuilder:rbac:groups=apps,resources=deployments,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=apps,resources=deployments/status,verbs=get;update;patch +// +kubebuilder:rbac:groups=katib.kubeflow.org,resources=suggestions,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=katib.kubeflow.org,resources=suggestions/status,verbs=get;update;patch +func (r *ReconcileSuggestion) Reconcile(request reconcile.Request) (reconcile.Result, error) { + logger := log.WithValues("Suggestion", request.NamespacedName) + // Fetch the Suggestion instance + oldS := &suggestionsv1beta1.Suggestion{} + err := r.Get(context.TODO(), request.NamespacedName, oldS) + if err != nil { + if errors.IsNotFound(err) { + // For additional cleanup logic use finalizers. + return reconcile.Result{}, nil + } + // Error reading the object - requeue the request. + return reconcile.Result{}, err + } + instance := oldS.DeepCopy() + // If ResumePolicyType is LongRunning, suggestion status will never be succeeded. + if instance.IsSucceeded() { + err = r.deleteDeployment(instance) + if err != nil { + return reconcile.Result{}, err + } + err = r.deleteService(instance) + if err != nil { + return reconcile.Result{}, err + } + return reconcile.Result{}, nil + } + if !instance.IsCreated() { + if instance.Status.StartTime == nil { + now := metav1.Now() + instance.Status.StartTime = &now + } + msg := "Suggestion is created" + instance.MarkSuggestionStatusCreated(SuggestionCreatedReason, msg) + } else { + err := r.ReconcileSuggestion(instance) + if err != nil { + r.recorder.Eventf(instance, corev1.EventTypeWarning, + consts.ReconcileErrorReason, err.Error()) + + // Try updating just the status condition when possible + // Status conditions might need to be updated even in error + // Ignore all other status fields else it will be inconsistent during retry + _ = r.updateStatusCondition(instance, oldS) + logger.Error(err, "Reconcile Suggestion error") + return reconcile.Result{}, err + } + } + + if err := r.updateStatus(instance, oldS); err != nil { + return reconcile.Result{}, err + } + return reconcile.Result{}, nil +} + +func (r *ReconcileSuggestion) ReconcileSuggestion(instance *suggestionsv1beta1.Suggestion) error { + logger := log.WithValues("Suggestion", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) + service, err := r.DesiredService(instance) + if err != nil { + return err + } + _, err = r.reconcileService(service) + if err != nil { + return err + } + + deploy, err := r.DesiredDeployment(instance) + if err != nil { + return err + } + if foundDeploy, err := r.reconcileDeployment(deploy); err != nil { + return err + } else { + if isReady := r.checkDeploymentReady(foundDeploy); isReady != true { + // deployment is not ready yet + msg := "Deployment is not ready" + instance.MarkSuggestionStatusDeploymentReady(corev1.ConditionFalse, SuggestionDeploymentNotReady, msg) + return nil + } else { + msg := "Deployment is ready" + instance.MarkSuggestionStatusDeploymentReady(corev1.ConditionTrue, SuggestionDeploymentReady, msg) + } + + } + experiment := &experimentsv1beta1.Experiment{} + trials := &trialsv1beta1.TrialList{} + + if err := r.Get(context.TODO(), types.NamespacedName{ + Name: instance.Name, + Namespace: instance.Namespace, + }, experiment); err != nil { + return err + } + + if err := r.List(context.TODO(), + client.MatchingLabels(util.TrialLabels(experiment)), trials); err != nil { + return err + } + if !instance.IsRunning() { + if err = r.ValidateAlgorithmSettings(instance, experiment); err != nil { + logger.Error(err, "Marking suggestion failed as algorithm settings validation failed") + msg := fmt.Sprintf("Validation failed: %v", err) + instance.MarkSuggestionStatusFailed(SuggestionFailedReason, msg) + // return nil since it is a terminal condition + return nil + } + msg := "Suggestion is running" + instance.MarkSuggestionStatusRunning(SuggestionRunningReason, msg) + } + logger.Info("Sync assignments", "suggestions", instance.Spec.Requests) + if err = r.SyncAssignments(instance, experiment, trials.Items); err != nil { + return err + } + + return nil +} + +func (r *ReconcileSuggestion) checkDeploymentReady(deploy *appsv1.Deployment) bool { + if deploy == nil { + return false + } else { + for _, cond := range deploy.Status.Conditions { + if cond.Type == appsv1.DeploymentAvailable && cond.Status == corev1.ConditionTrue { + return true + } + } + } + return false +} diff --git a/pkg/controller.v1beta1/suggestion/suggestion_controller_status.go b/pkg/controller.v1beta1/suggestion/suggestion_controller_status.go new file mode 100644 index 00000000000..3c47f157d53 --- /dev/null +++ b/pkg/controller.v1beta1/suggestion/suggestion_controller_status.go @@ -0,0 +1,39 @@ +package suggestion + +import ( + "context" + + suggestionsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1" + "k8s.io/apimachinery/pkg/api/equality" +) + +const ( + SuggestionCreatedReason = "SuggestionCreated" + SuggestionDeploymentReady = "DeploymentReady" + SuggestionDeploymentNotReady = "DeploymentNotReady" + SuggestionRunningReason = "SuggestionRunning" + SuggestionSucceededReason = "SuggestionSucceeded" + SuggestionFailedReason = "SuggestionFailed" + SuggestionKilledReason = "SuggestionKilled" +) + +func (r *ReconcileSuggestion) updateStatus(s *suggestionsv1beta1.Suggestion, oldS *suggestionsv1beta1.Suggestion) error { + if !equality.Semantic.DeepEqual(s.Status, oldS.Status) { + if err := r.Status().Update(context.TODO(), s); err != nil { + return err + } + } + return nil +} + +func (r *ReconcileSuggestion) updateStatusCondition(s *suggestionsv1beta1.Suggestion, oldS *suggestionsv1beta1.Suggestion) error { + if !equality.Semantic.DeepEqual(s.Status.Conditions, oldS.Status.Conditions) { + newConditions := s.Status.Conditions + s.Status = oldS.Status + s.Status.Conditions = newConditions + if err := r.Status().Update(context.TODO(), s); err != nil { + return err + } + } + return nil +} diff --git a/pkg/controller.v1beta1/suggestion/suggestion_controller_suite_test.go b/pkg/controller.v1beta1/suggestion/suggestion_controller_suite_test.go new file mode 100644 index 00000000000..befb6afb61b --- /dev/null +++ b/pkg/controller.v1beta1/suggestion/suggestion_controller_suite_test.go @@ -0,0 +1,79 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package suggestion + +import ( + stdlog "log" + "os" + "path/filepath" + "sync" + "testing" + + "github.com/onsi/gomega" + "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/rest" + "sigs.k8s.io/controller-runtime/pkg/envtest" + "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + + apis "github.com/kubeflow/katib/pkg/apis/controller" +) + +var cfg *rest.Config + +func TestMain(m *testing.M) { + t := &envtest.Environment{ + CRDDirectoryPaths: []string{ + filepath.Join("..", "..", "..", "manifests", "v1beta1", "katib-controller"), + filepath.Join("..", "..", "..", "test", "unit", "v1beta1", "crds"), + }, + } + apis.AddToScheme(scheme.Scheme) + + var err error + if cfg, err = t.Start(); err != nil { + stdlog.Fatal(err) + } + + code := m.Run() + t.Stop() + os.Exit(code) +} + +// SetupTestReconcile returns a reconcile.Reconcile implementation that delegates to inner and +// writes the request to requests after Reconcile is finished. +func SetupTestReconcile(inner reconcile.Reconciler) (reconcile.Reconciler, chan reconcile.Request) { + requests := make(chan reconcile.Request) + fn := reconcile.Func(func(req reconcile.Request) (reconcile.Result, error) { + result, err := inner.Reconcile(req) + requests <- req + return result, err + }) + return fn, requests +} + +// StartTestManager adds recFn +func StartTestManager(mgr manager.Manager, g *gomega.GomegaWithT) (chan struct{}, *sync.WaitGroup) { + stop := make(chan struct{}) + wg := &sync.WaitGroup{} + wg.Add(1) + go func() { + defer wg.Done() + g.Expect(mgr.Start(stop)).NotTo(gomega.HaveOccurred()) + }() + return stop, wg +} diff --git a/pkg/controller.v1beta1/suggestion/suggestion_controller_test.go b/pkg/controller.v1beta1/suggestion/suggestion_controller_test.go new file mode 100644 index 00000000000..bde2172bb06 --- /dev/null +++ b/pkg/controller.v1beta1/suggestion/suggestion_controller_test.go @@ -0,0 +1,125 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package suggestion + +import ( + "encoding/json" + "testing" + "time" + + "github.com/onsi/gomega" + "golang.org/x/net/context" + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + + suggestionsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1" +) + +var c client.Client + +var expectedRequest = reconcile.Request{NamespacedName: types.NamespacedName{Name: "foo", Namespace: "default"}} +var depKey = types.NamespacedName{Name: "foo-random", Namespace: "default"} + +const timeout = time.Second * 5 + +func init() { + logf.SetLogger(logf.ZapLogger(true)) +} + +func TestReconcile(t *testing.T) { + g := gomega.NewGomegaWithT(t) + instance := &suggestionsv1beta1.Suggestion{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: "default", + }, + Spec: suggestionsv1beta1.SuggestionSpec{ + Requests: 1, + AlgorithmName: "random", + }, + } + configMap := newKatibConfigMapInstance() + + // Setup the Manager and Controller. Wrap the Controller Reconcile function so it writes each request to a + // channel when it is finished. + mgr, err := manager.New(cfg, manager.Options{}) + g.Expect(err).NotTo(gomega.HaveOccurred()) + c = mgr.GetClient() + + recFn, requests := SetupTestReconcile(newReconciler(mgr)) + g.Expect(add(mgr, recFn)).NotTo(gomega.HaveOccurred()) + + stopMgr, mgrStopped := StartTestManager(mgr, g) + + defer func() { + close(stopMgr) + mgrStopped.Wait() + }() + + // Create the Suggestion object and expect the Reconcile and Deployment to be created + err = c.Create(context.TODO(), instance) + g.Expect(err).NotTo(gomega.HaveOccurred()) + err = c.Create(context.TODO(), configMap) + g.Expect(err).NotTo(gomega.HaveOccurred()) + // The instance object may not be a valid object because it might be missing some required fields. + // Please modify the instance object by adding required fields and then remove the following if statement. + if apierrors.IsInvalid(err) { + t.Logf("failed to create object, got an invalid object error: %v", err) + return + } + g.Expect(err).NotTo(gomega.HaveOccurred()) + defer c.Delete(context.TODO(), instance) + g.Eventually(requests, timeout).Should(gomega.Receive(gomega.Equal(expectedRequest))) + + deploy := &appsv1.Deployment{} + g.Eventually(func() error { return c.Get(context.TODO(), depKey, deploy) }, timeout). + Should(gomega.Succeed()) + + // Delete the Deployment and expect Reconcile to be called for Deployment deletion + g.Expect(c.Delete(context.TODO(), deploy)).NotTo(gomega.HaveOccurred()) + g.Eventually(requests, timeout).Should(gomega.Receive(gomega.Equal(expectedRequest))) + g.Eventually(func() error { return c.Get(context.TODO(), depKey, deploy) }, timeout). + Should(gomega.Succeed()) + + // Manually delete Deployment since GC isn't enabled in the test control plane + g.Eventually(func() error { return c.Delete(context.TODO(), deploy) }, timeout). + Should(gomega.MatchError("deployments.apps \"foo-random\" not found")) + +} + +func newKatibConfigMapInstance() *corev1.ConfigMap { + suggestionConfig := map[string]map[string]string{ + "random": {"image": "test"}, + } + b, _ := json.Marshal(suggestionConfig) + return &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: "katib-config", + Namespace: "kubeflow", + }, + Data: map[string]string{ + "suggestion": string(b), + }, + } +} diff --git a/pkg/controller.v1beta1/suggestion/suggestion_controller_util.go b/pkg/controller.v1beta1/suggestion/suggestion_controller_util.go new file mode 100644 index 00000000000..3b719579ef1 --- /dev/null +++ b/pkg/controller.v1beta1/suggestion/suggestion_controller_util.go @@ -0,0 +1,84 @@ +package suggestion + +import ( + "context" + + "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1" + + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/types" +) + +func (r *ReconcileSuggestion) reconcileDeployment(deploy *appsv1.Deployment) (*appsv1.Deployment, error) { + foundDeploy := &appsv1.Deployment{} + err := r.Get(context.TODO(), types.NamespacedName{Name: deploy.Name, Namespace: deploy.Namespace}, foundDeploy) + if err != nil && errors.IsNotFound(err) { + log.Info("Creating Deployment", "namespace", deploy.Namespace, "name", deploy.Name) + err = r.Create(context.TODO(), deploy) + return nil, err + } else if err != nil { + return nil, err + } + return foundDeploy, nil +} + +func (r *ReconcileSuggestion) reconcileService(service *corev1.Service) (*corev1.Service, error) { + foundService := &corev1.Service{} + err := r.Get(context.TODO(), types.NamespacedName{Name: service.Name, Namespace: service.Namespace}, foundService) + if err != nil && errors.IsNotFound(err) { + log.Info("Creating Service", "namespace", service.Namespace, "name", service.Name) + err = r.Create(context.TODO(), service) + return nil, err + } else if err != nil { + return nil, err + } + return foundService, nil +} + +func (r *ReconcileSuggestion) deleteDeployment(instance *v1beta1.Suggestion) error { + deploy, err := r.DesiredDeployment(instance) + if err != nil { + return err + } + realDeploy := &appsv1.Deployment{} + err = r.Get(context.TODO(), types.NamespacedName{Name: deploy.Name, Namespace: deploy.Namespace}, realDeploy) + if err != nil { + if errors.IsNotFound(err) { + return nil + } + return err + } + log.Info("Deleting Suggestion Deployment", "namespace", realDeploy.Namespace, "name", realDeploy.Name) + + err = r.Delete(context.TODO(), realDeploy) + if err != nil { + return err + } + + return nil +} + +func (r *ReconcileSuggestion) deleteService(instance *v1beta1.Suggestion) error { + service, err := r.DesiredService(instance) + if err != nil { + return err + } + realService := &corev1.Service{} + err = r.Get(context.TODO(), types.NamespacedName{Name: service.Name, Namespace: service.Namespace}, realService) + if err != nil { + if errors.IsNotFound(err) { + return nil + } + return err + } + log.Info("Deleting Suggestion Service", "namespace", realService.Namespace, "name", realService.Name) + + err = r.Delete(context.TODO(), realService) + if err != nil { + return err + } + + return nil +} diff --git a/pkg/controller.v1beta1/suggestion/suggestionclient/algorithm_settings.go b/pkg/controller.v1beta1/suggestion/suggestionclient/algorithm_settings.go new file mode 100644 index 00000000000..a5a64233111 --- /dev/null +++ b/pkg/controller.v1beta1/suggestion/suggestionclient/algorithm_settings.go @@ -0,0 +1,53 @@ +package suggestionclient + +import ( + common "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" + experimentsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + suggestionsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1" + suggestionapi "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" +) + +// appendAlgorithmSettingsFromSuggestion appends the algorithm settings +// in suggestion to Experiment. +// Algorithm settings in suggestion will overwrite the settings in experiment. +func appendAlgorithmSettingsFromSuggestion(experiment *experimentsv1beta1.Experiment, algoSettingsInSuggestion []common.AlgorithmSetting) { + algoSettingsInExperiment := experiment.Spec.Algorithm + for _, setting := range algoSettingsInSuggestion { + if index, found := contains( + algoSettingsInExperiment.AlgorithmSettings, setting.Name); found { + // If the setting is found in Experiment, update it. + algoSettingsInExperiment.AlgorithmSettings[index].Value = setting.Value + } else { + // If not found, append it. + algoSettingsInExperiment.AlgorithmSettings = append( + algoSettingsInExperiment.AlgorithmSettings, setting) + } + } +} + +func updateAlgorithmSettings(suggestion *suggestionsv1beta1.Suggestion, algorithm *suggestionapi.AlgorithmSpec) { + for _, setting := range algorithm.AlgorithmSetting { + if setting != nil { + if index, found := contains(suggestion.Status.AlgorithmSettings, setting.Name); found { + // If the setting is found in Suggestion, update it. + suggestion.Status.AlgorithmSettings[index].Value = setting.Value + } else { + // If not found, append it. + suggestion.Status.AlgorithmSettings = append(suggestion.Status.AlgorithmSettings, common.AlgorithmSetting{ + Name: setting.Name, + Value: setting.Value, + }) + } + } + } +} + +func contains(algorithmSettings []common.AlgorithmSetting, + name string) (int, bool) { + for i, s := range algorithmSettings { + if s.Name == name { + return i, true + } + } + return -1, false +} diff --git a/pkg/controller.v1beta1/suggestion/suggestionclient/fake/fake.go b/pkg/controller.v1beta1/suggestion/suggestionclient/fake/fake.go new file mode 100644 index 00000000000..2a7994a9fa3 --- /dev/null +++ b/pkg/controller.v1beta1/suggestion/suggestionclient/fake/fake.go @@ -0,0 +1,53 @@ +package fake + +import ( + "fmt" + + utilrand "k8s.io/apimachinery/pkg/util/rand" + + common "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" + experimentsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + suggestionsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1" + trialsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" + "github.com/kubeflow/katib/pkg/controller.v1beta1/suggestion/suggestionclient" +) + +type Fake struct { +} + +func New() suggestionclient.SuggestionClient { + return &Fake{} +} + +func (f *Fake) SyncAssignments( + instance *suggestionsv1beta1.Suggestion, + e *experimentsv1beta1.Experiment, + ts []trialsv1beta1.Trial) error { + if int(instance.Status.SuggestionCount) != int(instance.Spec.Requests) { + for i := 0; i < int(instance.Spec.Requests)-int(instance.Status.SuggestionCount); i++ { + name := fmt.Sprintf("%s-%s", instance.Name, utilrand.String(8)) + instance.Status.Suggestions = append(instance.Status.Suggestions, suggestionsv1beta1.TrialAssignment{ + Name: name, + ParameterAssignments: []common.ParameterAssignment{ + { + Name: "--lr", + Value: "0.03", + }, + { + Name: "--num-layers", + Value: "4", + }, + { + Name: "--optimizer", + Value: "adam", + }, + }, + }) + } + } + return nil +} + +func (f *Fake) ValidateAlgorithmSettings(instance *suggestionsv1beta1.Suggestion, e *experimentsv1beta1.Experiment) error { + return nil +} diff --git a/pkg/controller.v1beta1/suggestion/suggestionclient/nas.go b/pkg/controller.v1beta1/suggestion/suggestionclient/nas.go new file mode 100644 index 00000000000..6a02c8108a7 --- /dev/null +++ b/pkg/controller.v1beta1/suggestion/suggestionclient/nas.go @@ -0,0 +1,45 @@ +package suggestionclient + +import ( + experimentsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + suggestionapi "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" +) + +func convertNasConfig(nasConfig *experimentsv1beta1.NasConfig) *suggestionapi.NasConfig { + res := &suggestionapi.NasConfig{ + GraphConfig: convertGraphConfig(nasConfig.GraphConfig), + Operations: convertOperations(nasConfig.Operations), + } + return res +} + +func convertGraphConfig(graphConfig experimentsv1beta1.GraphConfig) *suggestionapi.GraphConfig { + gc := &suggestionapi.GraphConfig{} + if graphConfig.NumLayers != nil { + gc.NumLayers = *graphConfig.NumLayers + } + gc.InputSizes = graphConfig.InputSizes + gc.OutputSizes = graphConfig.OutputSizes + return gc +} + +func convertOperations(operations []experimentsv1beta1.Operation) *suggestionapi.NasConfig_Operations { + ops := &suggestionapi.NasConfig_Operations{ + Operation: make([]*suggestionapi.Operation, 0), + } + for _, operation := range operations { + op := &suggestionapi.Operation{ + OperationType: operation.OperationType, + ParameterSpecs: convertNasParameterSpecs(operation.Parameters), + } + ops.Operation = append(ops.Operation, op) + } + return ops +} + +func convertNasParameterSpecs(parameters []experimentsv1beta1.ParameterSpec) *suggestionapi.Operation_ParameterSpecs { + ps := &suggestionapi.Operation_ParameterSpecs{ + Parameters: convertParameters(parameters), + } + return ps +} diff --git a/pkg/controller.v1beta1/suggestion/suggestionclient/suggestionclient.go b/pkg/controller.v1beta1/suggestion/suggestionclient/suggestionclient.go new file mode 100644 index 00000000000..046177e3746 --- /dev/null +++ b/pkg/controller.v1beta1/suggestion/suggestionclient/suggestionclient.go @@ -0,0 +1,357 @@ +package suggestionclient + +import ( + "context" + "fmt" + "time" + + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "k8s.io/apimachinery/pkg/types" + utilrand "k8s.io/apimachinery/pkg/util/rand" + logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + + commonapiv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" + experimentsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + suggestionsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1" + trialsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" + suggestionapi "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" + "github.com/kubeflow/katib/pkg/controller.v1beta1/util" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +var ( + log = logf.Log.WithName("suggestion-client") + timeout = 60 * time.Second + timeFormat = "2006-01-02T15:04:05Z" +) + +// SuggestionClient is the interface to communicate with algorithm services. +type SuggestionClient interface { + SyncAssignments(instance *suggestionsv1beta1.Suggestion, e *experimentsv1beta1.Experiment, + ts []trialsv1beta1.Trial) error + + ValidateAlgorithmSettings(instance *suggestionsv1beta1.Suggestion, e *experimentsv1beta1.Experiment) error +} + +// General is the implementation for SuggestionClient. +type General struct { +} + +// New creates a new SuggestionClient. +func New() SuggestionClient { + return &General{} +} + +// SyncAssignments syncs assignments from algorithm services. +func (g *General) SyncAssignments( + instance *suggestionsv1beta1.Suggestion, + e *experimentsv1beta1.Experiment, + ts []trialsv1beta1.Trial) error { + logger := log.WithValues("Suggestion", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) + requestNum := int(instance.Spec.Requests) - int(instance.Status.SuggestionCount) + if requestNum <= 0 { + return nil + } + + endpoint := util.GetAlgorithmEndpoint(instance) + conn, err := grpc.Dial(endpoint, grpc.WithInsecure()) + if err != nil { + return err + } + defer conn.Close() + + client := suggestionapi.NewSuggestionClient(conn) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + // Algorithm settings in suggestion will overwrite the settings in experiment. + filledE := e.DeepCopy() + appendAlgorithmSettingsFromSuggestion(filledE, + instance.Status.AlgorithmSettings) + + request := &suggestionapi.GetSuggestionsRequest{ + Experiment: g.ConvertExperiment(filledE), + Trials: g.ConvertTrials(ts), + RequestNumber: int32(requestNum), + } + response, err := client.GetSuggestions(ctx, request) + if err != nil { + return err + } + logger.V(0).Info("Getting suggestions", "endpoint", endpoint, "response", response, "request", request) + if len(response.ParameterAssignments) != requestNum { + err := fmt.Errorf("The response contains unexpected trials") + logger.Error(err, "The response contains unexpected trials", "requestNum", requestNum, "response", response) + return err + } + for _, t := range response.ParameterAssignments { + instance.Status.Suggestions = append(instance.Status.Suggestions, + suggestionsv1beta1.TrialAssignment{ + Name: fmt.Sprintf("%s-%s", instance.Name, utilrand.String(8)), + ParameterAssignments: composeParameterAssignments(t.Assignments), + }) + } + instance.Status.SuggestionCount = int32(len(instance.Status.Suggestions)) + + if response.Algorithm != nil { + updateAlgorithmSettings(instance, response.Algorithm) + } + return nil +} + +// ValidateAlgorithmSettings validates if the algorithm specific configurations are valid. +func (g *General) ValidateAlgorithmSettings(instance *suggestionsv1beta1.Suggestion, e *experimentsv1beta1.Experiment) error { + logger := log.WithValues("Suggestion", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) + endpoint := util.GetAlgorithmEndpoint(instance) + conn, err := grpc.Dial(endpoint, grpc.WithInsecure()) + if err != nil { + return err + } + defer conn.Close() + + client := suggestionapi.NewSuggestionClient(conn) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + request := &suggestionapi.ValidateAlgorithmSettingsRequest{ + Experiment: g.ConvertExperiment(e), + } + // See https://github.com/grpc/grpc-go/issues/2636 + // See https://github.com/grpc/grpc-go/pull/2503 + _, err = client.ValidateAlgorithmSettings(ctx, request, grpc.WaitForReady(true)) + statusCode, _ := status.FromError(err) + + // validation error + if statusCode.Code() == codes.InvalidArgument || statusCode.Code() == codes.Unknown { + logger.Error(err, "ValidateAlgorithmSettings error") + return fmt.Errorf("ValidateAlgorithmSettings Error: %v", statusCode.Message()) + } + + // Connection error + if statusCode.Code() == codes.Unavailable { + logger.Error(err, "Connection to Suggestion algorithm service currently unavailable") + return err + } + + // Validate to true as function is not implemented + if statusCode.Code() == codes.Unimplemented { + logger.Info("Method ValidateAlgorithmSettings not found", "Suggestion service", e.Spec.Algorithm.AlgorithmName) + return nil + } + logger.Info("Algorithm settings validated") + return nil +} + +// ConvertExperiment converts CRD to the GRPC definition. +func (g *General) ConvertExperiment(e *experimentsv1beta1.Experiment) *suggestionapi.Experiment { + res := &suggestionapi.Experiment{} + res.Name = e.Name + res.Spec = &suggestionapi.ExperimentSpec{ + Algorithm: &suggestionapi.AlgorithmSpec{ + AlgorithmName: e.Spec.Algorithm.AlgorithmName, + AlgorithmSetting: convertAlgorithmSettings(e.Spec.Algorithm.AlgorithmSettings), + }, + Objective: &suggestionapi.ObjectiveSpec{ + Type: convertObjectiveType(e.Spec.Objective.Type), + ObjectiveMetricName: e.Spec.Objective.ObjectiveMetricName, + }, + ParameterSpecs: &suggestionapi.ExperimentSpec_ParameterSpecs{ + Parameters: convertParameters(e.Spec.Parameters), + }, + } + // Set Goal if user defines it in Objective + if e.Spec.Objective.Goal != nil { + res.Spec.Objective.Goal = *e.Spec.Objective.Goal + } + // Set NasConfig if the user defines it in Spec. + if e.Spec.NasConfig != nil { + res.Spec.NasConfig = convertNasConfig(e.Spec.NasConfig) + } + if e.Spec.ParallelTrialCount != nil { + res.Spec.ParallelTrialCount = *e.Spec.ParallelTrialCount + } + if e.Spec.MaxTrialCount != nil { + res.Spec.MaxTrialCount = *e.Spec.MaxTrialCount + } + return res +} + +// ConvertTrials converts CRD to the GRPC definition. +func (g *General) ConvertTrials(ts []trialsv1beta1.Trial) []*suggestionapi.Trial { + trialsRes := make([]*suggestionapi.Trial, 0) + for _, t := range ts { + trial := &suggestionapi.Trial{ + Name: t.Name, + Spec: &suggestionapi.TrialSpec{ + Objective: &suggestionapi.ObjectiveSpec{ + Type: convertObjectiveType(t.Spec.Objective.Type), + ObjectiveMetricName: t.Spec.Objective.ObjectiveMetricName, + AdditionalMetricNames: t.Spec.Objective.AdditionalMetricNames, + }, + ParameterAssignments: convertTrialParameterAssignments( + t.Spec.ParameterAssignments), + }, + Status: &suggestionapi.TrialStatus{ + StartTime: convertTrialStatusTime(t.Status.StartTime), + CompletionTime: convertTrialStatusTime(t.Status.CompletionTime), + Observation: convertTrialObservation( + t.Status.Observation), + }, + } + if t.Spec.Objective.Goal != nil { + trial.Spec.Objective.Goal = *t.Spec.Objective.Goal + } + if len(t.Status.Conditions) > 0 { + // We send only the latest condition of the Trial! + trial.Status.Condition = convertTrialConditionType( + t.Status.Conditions[len(t.Status.Conditions)-1].Type) + } + trialsRes = append(trialsRes, trial) + } + + return trialsRes +} + +// convertTrialParameterAssignments convert ParameterAssignments CRD to the GRPC definition +func convertTrialParameterAssignments(pas []commonapiv1beta1.ParameterAssignment) *suggestionapi.TrialSpec_ParameterAssignments { + tsPas := &suggestionapi.TrialSpec_ParameterAssignments{ + Assignments: make([]*suggestionapi.ParameterAssignment, 0), + } + for _, pa := range pas { + tsPas.Assignments = append(tsPas.Assignments, &suggestionapi.ParameterAssignment{ + Name: pa.Name, + Value: pa.Value, + }) + } + + return tsPas +} + +// convertTrialConditionType convert Trial Status Condition Type CRD to the GRPC definition +func convertTrialConditionType(conditionType trialsv1beta1.TrialConditionType) suggestionapi.TrialStatus_TrialConditionType { + switch conditionType { + case trialsv1beta1.TrialCreated: + return suggestionapi.TrialStatus_CREATED + case trialsv1beta1.TrialRunning: + return suggestionapi.TrialStatus_RUNNING + case trialsv1beta1.TrialSucceeded: + return suggestionapi.TrialStatus_SUCCEEDED + case trialsv1beta1.TrialKilled: + return suggestionapi.TrialStatus_KILLED + case trialsv1beta1.TrialFailed: + return suggestionapi.TrialStatus_FAILED + default: + return suggestionapi.TrialStatus_UNKNOWN + } +} + +// convertTrialObservation convert Trial Observation Metrics CRD to the GRPC definition +func convertTrialObservation(observation *commonapiv1beta1.Observation) *suggestionapi.Observation { + resObservation := &suggestionapi.Observation{ + Metrics: make([]*suggestionapi.Metric, 0), + } + if observation != nil && observation.Metrics != nil { + for _, m := range observation.Metrics { + resObservation.Metrics = append(resObservation.Metrics, &suggestionapi.Metric{ + Name: m.Name, + Value: fmt.Sprintf("%f", m.Value), + }) + } + } + return resObservation + +} + +// convertTrialStatusTime convert Trial Status Time CRD to the GRPC definition +func convertTrialStatusTime(time *metav1.Time) string { + if time != nil { + return time.Format(timeFormat) + } + return "" +} + +// ComposeTrialsTemplate composes trials with raw template from the GRPC response. +func (g *General) ComposeTrialsTemplate(ts []*suggestionapi.Trial) []trialsv1beta1.Trial { + res := make([]trialsv1beta1.Trial, 0) + for _, t := range ts { + res = append(res, trialsv1beta1.Trial{ + Spec: trialsv1beta1.TrialSpec{ + ParameterAssignments: composeParameterAssignments( + t.Spec.ParameterAssignments.Assignments), + }, + }) + } + return res +} + +func composeParameterAssignments(pas []*suggestionapi.ParameterAssignment) []commonapiv1beta1.ParameterAssignment { + res := make([]commonapiv1beta1.ParameterAssignment, 0) + for _, pa := range pas { + res = append(res, commonapiv1beta1.ParameterAssignment{ + Name: pa.Name, + Value: pa.Value, + }) + } + return res +} + +func convertObjectiveType(typ commonapiv1beta1.ObjectiveType) suggestionapi.ObjectiveType { + switch typ { + case commonapiv1beta1.ObjectiveTypeMaximize: + return suggestionapi.ObjectiveType_MAXIMIZE + case commonapiv1beta1.ObjectiveTypeMinimize: + return suggestionapi.ObjectiveType_MINIMIZE + default: + return suggestionapi.ObjectiveType_UNKNOWN + } +} + +func convertAlgorithmSettings(as []commonapiv1beta1.AlgorithmSetting) []*suggestionapi.AlgorithmSetting { + res := make([]*suggestionapi.AlgorithmSetting, 0) + for _, s := range as { + res = append(res, &suggestionapi.AlgorithmSetting{ + Name: s.Name, + Value: s.Value, + }) + } + return res +} + +func convertParameters(ps []experimentsv1beta1.ParameterSpec) []*suggestionapi.ParameterSpec { + res := make([]*suggestionapi.ParameterSpec, 0) + for _, p := range ps { + res = append(res, &suggestionapi.ParameterSpec{ + Name: p.Name, + ParameterType: convertParameterType(p.ParameterType), + FeasibleSpace: convertFeasibleSpace(p.FeasibleSpace), + }) + } + return res +} + +func convertParameterType(typ experimentsv1beta1.ParameterType) suggestionapi.ParameterType { + switch typ { + case experimentsv1beta1.ParameterTypeDiscrete: + return suggestionapi.ParameterType_DISCRETE + case experimentsv1beta1.ParameterTypeCategorical: + return suggestionapi.ParameterType_CATEGORICAL + case experimentsv1beta1.ParameterTypeDouble: + return suggestionapi.ParameterType_DOUBLE + case experimentsv1beta1.ParameterTypeInt: + return suggestionapi.ParameterType_INT + default: + return suggestionapi.ParameterType_UNKNOWN_TYPE + } +} + +func convertFeasibleSpace(fs experimentsv1beta1.FeasibleSpace) *suggestionapi.FeasibleSpace { + res := &suggestionapi.FeasibleSpace{ + Max: fs.Max, + Min: fs.Min, + List: fs.List, + Step: fs.Step, + } + return res +} diff --git a/pkg/controller.v1beta1/trial/managerclient/managerclient.go b/pkg/controller.v1beta1/trial/managerclient/managerclient.go new file mode 100644 index 00000000000..29a8d3e2235 --- /dev/null +++ b/pkg/controller.v1beta1/trial/managerclient/managerclient.go @@ -0,0 +1,51 @@ +package managerclient + +import ( + trialsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" + api_pb "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" + common "github.com/kubeflow/katib/pkg/common/v1beta1" +) + +// ManagerClient is the interface for katib manager client in trial controller. +type ManagerClient interface { + GetTrialObservationLog( + instance *trialsv1beta1.Trial) (*api_pb.GetObservationLogReply, error) + DeleteTrialObservationLog( + instance *trialsv1beta1.Trial) (*api_pb.DeleteObservationLogReply, error) +} + +// DefaultClient implements the Client interface. +type DefaultClient struct { +} + +// New creates a new ManagerClient. +func New() ManagerClient { + return &DefaultClient{} +} + +func (d *DefaultClient) GetTrialObservationLog( + instance *trialsv1beta1.Trial) (*api_pb.GetObservationLogReply, error) { + // read GetObservationLog call and update observation field + objectiveMetricName := instance.Spec.Objective.ObjectiveMetricName + request := &api_pb.GetObservationLogRequest{ + TrialName: instance.Name, + MetricName: objectiveMetricName, + } + reply, err := common.GetObservationLog(request) + if err != nil { + return nil, err + } + return reply, nil +} + +func (d *DefaultClient) DeleteTrialObservationLog( + instance *trialsv1beta1.Trial) (*api_pb.DeleteObservationLogReply, error) { + request := &api_pb.DeleteObservationLogRequest{ + TrialName: instance.Name, + } + reply, err := common.DeleteObservationLog(request) + if err != nil { + return nil, err + } + return reply, nil +} diff --git a/pkg/controller.v1beta1/trial/prometheus_metrics.go b/pkg/controller.v1beta1/trial/prometheus_metrics.go new file mode 100644 index 00000000000..9fa4e11b33a --- /dev/null +++ b/pkg/controller.v1beta1/trial/prometheus_metrics.go @@ -0,0 +1,136 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package trial + +import ( + "context" + + "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" + "github.com/prometheus/client_golang/prometheus" + "sigs.k8s.io/controller-runtime/pkg/cache" +) + +type TrialsCollector struct { + store cache.Cache + trialDeleteCount *prometheus.CounterVec + trialCreateCount *prometheus.CounterVec + trialSucceedCount *prometheus.CounterVec + trialFailCount *prometheus.CounterVec + trialCurrent *prometheus.GaugeVec +} + +func NewTrialsCollector(store cache.Cache, registerer prometheus.Registerer) *TrialsCollector { + c := &TrialsCollector{ + store: store, + trialDeleteCount: prometheus.NewCounterVec(prometheus.CounterOpts{ + Name: "katib_trial_deleted_total", + Help: "The total number of deleted trials", + }, []string{"namespace"}), + + trialCreateCount: prometheus.NewCounterVec(prometheus.CounterOpts{ + Name: "katib_trial_created_total", + Help: "The total number of created trials", + }, []string{"namespace"}), + + trialSucceedCount: prometheus.NewCounterVec(prometheus.CounterOpts{ + Name: "katib_trial_succeeded_total", + Help: "The total number of succeeded trials", + }, []string{"namespace"}), + + trialFailCount: prometheus.NewCounterVec(prometheus.CounterOpts{ + Name: "katib_trial_failed_total", + Help: "The total number of failed trials", + }, []string{"namespace"}), + + trialCurrent: prometheus.NewGaugeVec(prometheus.GaugeOpts{ + Name: "katib_trials_current", + Help: "The number of current katib trials in the cluster", + }, []string{"namespace", "status"}), + } + registerer.MustRegister(c) + return c +} + +// Describe implements the prometheus.Collector interface. +func (m *TrialsCollector) Describe(ch chan<- *prometheus.Desc) { + m.trialDeleteCount.Describe(ch) + m.trialSucceedCount.Describe(ch) + m.trialFailCount.Describe(ch) + m.trialCreateCount.Describe(ch) + m.trialCurrent.Describe(ch) +} + +// Collect implements the prometheus.Collector interface. +func (m *TrialsCollector) Collect(ch chan<- prometheus.Metric) { + m.collect() + m.trialDeleteCount.Collect(ch) + m.trialSucceedCount.Collect(ch) + m.trialFailCount.Collect(ch) + m.trialCreateCount.Collect(ch) + m.trialCurrent.Collect(ch) +} + +func (c *TrialsCollector) IncreaseTrialsDeletedCount(ns string) { + c.trialDeleteCount.WithLabelValues(ns).Inc() +} + +func (c *TrialsCollector) IncreaseTrialsCreatedCount(ns string) { + c.trialCreateCount.WithLabelValues(ns).Inc() +} + +func (c *TrialsCollector) IncreaseTrialsSucceededCount(ns string) { + c.trialSucceedCount.WithLabelValues(ns).Inc() +} + +func (c *TrialsCollector) IncreaseTrialsFailedCount(ns string) { + c.trialFailCount.WithLabelValues(ns).Inc() +} + +// collect gets the current experiments from cache. +func (c *TrialsCollector) collect() { + var ( + conditionType v1beta1.TrialConditionType + status string + err error + ) + trialLists := &v1beta1.TrialList{} + if err = c.store.List(context.TODO(), nil, trialLists); err != nil { + return + } + + trialCache := map[string]map[string]int{} + for _, trial := range trialLists.Items { + conditionType, err = trial.GetLastConditionType() + status = string(conditionType) + // If trial doesn't have any condition, use unknown. + if err != nil { + status = "Unknown" + } + + if _, ok := trialCache[trial.Namespace]; !ok { + trialCache[trial.Namespace] = make(map[string]int) + } + trialCache[trial.Namespace][status] += 1 + } + + c.trialCurrent.Reset() + for ns, v := range trialCache { + for status, count := range v { + c.trialCurrent.WithLabelValues(ns, status).Set(float64(count)) + } + } +} diff --git a/pkg/controller.v1beta1/trial/trial_controller.go b/pkg/controller.v1beta1/trial/trial_controller.go new file mode 100644 index 00000000000..95027b05cb1 --- /dev/null +++ b/pkg/controller.v1beta1/trial/trial_controller.go @@ -0,0 +1,332 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package trial + +import ( + "bytes" + "context" + "fmt" + + batchv1beta "k8s.io/api/batch/v1beta1" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/equality" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" + k8syaml "k8s.io/apimachinery/pkg/util/yaml" + "k8s.io/client-go/tools/record" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + "sigs.k8s.io/controller-runtime/pkg/handler" + "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/metrics" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + "sigs.k8s.io/controller-runtime/pkg/source" + + trialsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" + "github.com/kubeflow/katib/pkg/controller.v1beta1/trial/managerclient" + "github.com/kubeflow/katib/pkg/controller.v1beta1/util" + jobv1beta1 "github.com/kubeflow/katib/pkg/job/v1beta1" +) + +const ( + // ControllerName is the controller name. + ControllerName = "trial-controller" +) + +var ( + log = logf.Log.WithName(ControllerName) +) + +// Add creates a new Trial Controller and adds it to the Manager with default RBAC. The Manager will set fields on the Controller +// and Start it when the Manager is Started. +func Add(mgr manager.Manager) error { + return add(mgr, newReconciler(mgr)) +} + +// newReconciler returns a new reconcile.Reconciler +func newReconciler(mgr manager.Manager) reconcile.Reconciler { + r := &ReconcileTrial{ + Client: mgr.GetClient(), + scheme: mgr.GetScheme(), + ManagerClient: managerclient.New(), + recorder: mgr.GetRecorder(ControllerName), + collector: NewTrialsCollector(mgr.GetCache(), metrics.Registry), + } + r.updateStatusHandler = r.updateStatus + return r +} + +// add adds a new Controller to mgr with r as the reconcile.Reconciler +func add(mgr manager.Manager, r reconcile.Reconciler) error { + // Create a new controller + c, err := controller.New("trial-controller", mgr, controller.Options{Reconciler: r}) + if err != nil { + log.Error(err, "Create trial controller error") + return err + } + + // Watch for changes to Trial + err = c.Watch(&source.Kind{Type: &trialsv1beta1.Trial{}}, &handler.EnqueueRequestForObject{}) + if err != nil { + log.Error(err, "Trial watch error") + return err + } + + // Watch for changes to Cronjob + err = c.Watch( + &source.Kind{Type: &batchv1beta.CronJob{}}, + &handler.EnqueueRequestForOwner{ + IsController: true, + OwnerType: &trialsv1beta1.Trial{}, + }) + + if err != nil { + log.Error(err, "CronJob watch error") + return err + } + + for _, gvk := range jobv1beta1.SupportedJobList { + unstructuredJob := &unstructured.Unstructured{} + unstructuredJob.SetGroupVersionKind(gvk) + err = c.Watch( + &source.Kind{Type: unstructuredJob}, + &handler.EnqueueRequestForOwner{ + IsController: true, + OwnerType: &trialsv1beta1.Trial{}, + }) + if err != nil { + if meta.IsNoMatchError(err) { + log.Info("Job watch error. CRD might be missing. Please install CRD and restart katib-controller", "CRD Kind", gvk.Kind) + continue + } + return err + } else { + log.Info("Job watch added successfully", "CRD Kind", gvk.Kind) + } + } + log.Info("Trial controller created") + return nil +} + +var _ reconcile.Reconciler = &ReconcileTrial{} + +// ReconcileTrial reconciles a Trial object +type ReconcileTrial struct { + client.Client + scheme *runtime.Scheme + recorder record.EventRecorder + + managerclient.ManagerClient + // updateStatusHandler is defined for test purpose. + updateStatusHandler updateStatusFunc + // collector is a wrapper for experiment metrics. + collector *TrialsCollector +} + +// Reconcile reads that state of the cluster for a Trial object and makes changes based on the state read +// and what is in the Trial.Spec +// +kubebuilder:rbac:groups=trials.kubeflow.org,resources=trials,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=trials.kubeflow.org,resources=trials/status,verbs=get;update;patch +func (r *ReconcileTrial) Reconcile(request reconcile.Request) (reconcile.Result, error) { + // Fetch the Trial instance + logger := log.WithValues("Trial", request.NamespacedName) + original := &trialsv1beta1.Trial{} + err := r.Get(context.TODO(), request.NamespacedName, original) + if err != nil { + if errors.IsNotFound(err) { + // Object not found, return. Created objects are automatically garbage collected. + // For additional cleanup logic use finalizers. + return reconcile.Result{}, nil + } + // Error reading the object - requeue the request. + logger.Error(err, "Trial Get error") + return reconcile.Result{}, err + } + + instance := original.DeepCopy() + + if needUpdate, finalizers := needUpdateFinalizers(instance); needUpdate { + return r.updateFinalizers(instance, finalizers) + } + + if !instance.IsCreated() { + if instance.Status.StartTime == nil { + now := metav1.Now() + instance.Status.StartTime = &now + } + if instance.Status.CompletionTime == nil { + instance.Status.CompletionTime = &metav1.Time{} + } + msg := "Trial is created" + instance.MarkTrialStatusCreated(TrialCreatedReason, msg) + } else { + err := r.reconcileTrial(instance) + if err != nil { + logger.Error(err, "Reconcile trial error") + r.recorder.Eventf(instance, + corev1.EventTypeWarning, ReconcileFailedReason, + "Failed to reconcile: %v", err) + return reconcile.Result{}, err + } + } + + if !equality.Semantic.DeepEqual(original.Status, instance.Status) { + //assuming that only status change + err = r.updateStatusHandler(instance) + if err != nil { + logger.Error(err, "Update trial instance status error") + return reconcile.Result{}, err + } + } + + return reconcile.Result{}, nil +} + +func (r *ReconcileTrial) reconcileTrial(instance *trialsv1beta1.Trial) error { + + var err error + logger := log.WithValues("Trial", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) + desiredJob, err := r.getDesiredJobSpec(instance) + if err != nil { + logger.Error(err, "Job Spec Get error") + return err + } + + deployedJob, err := r.reconcileJob(instance, desiredJob) + if err != nil { + logger.Error(err, "Reconcile job error") + return err + } + + // Job already exists + // TODO Can desired Spec differ from deployedSpec? + if deployedJob != nil { + kind := deployedJob.GetKind() + jobProvider, err := jobv1beta1.New(kind) + if err != nil { + logger.Error(err, "Failed to create the provider") + return err + } + jobCondition, err := jobProvider.GetDeployedJobStatus(deployedJob) + if err != nil { + logger.Error(err, "Get deployed status error") + return err + } + + // Update trial observation when the job is succeeded. + if isJobSucceeded(jobCondition) { + if err = r.UpdateTrialStatusObservation(instance, deployedJob); err != nil { + logger.Error(err, "Update trial status observation error") + return err + } + } + + // Update Trial job status only + // if job has succeeded and if observation field is available. + // if job has failed + // This will ensure that trial is set to be complete only if metric is collected at least once + r.UpdateTrialStatusCondition(instance, deployedJob, jobCondition) + + } + return nil +} + +func (r *ReconcileTrial) reconcileJob(instance *trialsv1beta1.Trial, desiredJob *unstructured.Unstructured) (*unstructured.Unstructured, error) { + var err error + logger := log.WithValues("Trial", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) + apiVersion := desiredJob.GetAPIVersion() + kind := desiredJob.GetKind() + gvk := schema.FromAPIVersionAndKind(apiVersion, kind) + + // Add annotation to desired Job + err = util.TrainingJobAnnotations(desiredJob) + if err != nil { + logger.Error(err, "TrainingJobAnnotations error") + return nil, err + } + + deployedJob := &unstructured.Unstructured{} + deployedJob.SetGroupVersionKind(gvk) + err = r.Get(context.TODO(), types.NamespacedName{Name: desiredJob.GetName(), Namespace: desiredJob.GetNamespace()}, deployedJob) + if err != nil { + if errors.IsNotFound(err) { + if instance.IsCompleted() { + return nil, nil + } + jobProvider, err := jobv1beta1.New(desiredJob.GetKind()) + if err != nil { + return nil, err + } + // mutate desiredJob according to provider + if err := jobProvider.MutateJob(instance, desiredJob); err != nil { + logger.Error(err, "Mutating desiredSpec of km.Training error") + return nil, err + } + logger.Info("Creating Job", "kind", kind, + "name", desiredJob.GetName()) + err = r.Create(context.TODO(), desiredJob) + if err != nil { + logger.Error(err, "Create job error") + return nil, err + } + eventMsg := fmt.Sprintf("Job %s has been created", desiredJob.GetName()) + r.recorder.Eventf(instance, corev1.EventTypeNormal, JobCreatedReason, eventMsg) + } else { + logger.Error(err, "Trial Get error") + return nil, err + } + } else { + if instance.IsCompleted() && !instance.Spec.RetainRun { + if err = r.Delete(context.TODO(), desiredJob, client.PropagationPolicy(metav1.DeletePropagationForeground)); err != nil { + logger.Error(err, "Delete job error") + return nil, err + } else { + eventMsg := fmt.Sprintf("Job %s has been deleted", desiredJob.GetName()) + r.recorder.Eventf(instance, corev1.EventTypeNormal, JobDeletedReason, eventMsg) + return nil, nil + } + } + } + + return deployedJob, nil +} + +func (r *ReconcileTrial) getDesiredJobSpec(instance *trialsv1beta1.Trial) (*unstructured.Unstructured, error) { + + bufSize := 1024 + logger := log.WithValues("Trial", types.NamespacedName{Name: instance.GetName(), Namespace: instance.GetNamespace()}) + buf := bytes.NewBufferString(instance.Spec.RunSpec) + + desiredJobSpec := &unstructured.Unstructured{} + if err := k8syaml.NewYAMLOrJSONDecoder(buf, bufSize).Decode(desiredJobSpec); err != nil { + logger.Error(err, "Yaml decode error") + return nil, err + } + if err := controllerutil.SetControllerReference(instance, desiredJobSpec, r.scheme); err != nil { + logger.Error(err, "Set controller reference error") + return nil, err + } + + return desiredJobSpec, nil +} diff --git a/pkg/controller.v1beta1/trial/trial_controller_consts.go b/pkg/controller.v1beta1/trial/trial_controller_consts.go new file mode 100644 index 00000000000..cc0fe390046 --- /dev/null +++ b/pkg/controller.v1beta1/trial/trial_controller_consts.go @@ -0,0 +1,22 @@ +package trial + +const ( + DefaultJobKind = "Job" + + // For trials + TrialCreatedReason = "TrialCreated" + TrialRunningReason = "TrialRunning" + TrialSucceededReason = "TrialSucceeded" + TrialMetricsUnavailableReason = "MetricsUnavailable" + TrialFailedReason = "TrialFailed" + TrialKilledReason = "TrialKilled" + + // For Jobs + JobCreatedReason = "JobCreated" + JobDeletedReason = "JobDeleted" + JobSucceededReason = "JobSucceeded" + JobMetricsUnavailableReason = "MetricsUnavailable" + JobFailedReason = "JobFailed" + JobRunningReason = "JobRunning" + ReconcileFailedReason = "ReconcileFailed" +) diff --git a/pkg/controller.v1beta1/trial/trial_controller_status.go b/pkg/controller.v1beta1/trial/trial_controller_status.go new file mode 100644 index 00000000000..e163093a72f --- /dev/null +++ b/pkg/controller.v1beta1/trial/trial_controller_status.go @@ -0,0 +1,17 @@ +package trial + +import ( + "context" + + trialsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" +) + +type updateStatusFunc func(instance *trialsv1beta1.Trial) error + +func (r *ReconcileTrial) updateStatus(instance *trialsv1beta1.Trial) error { + err := r.Status().Update(context.TODO(), instance) + if err != nil { + return err + } + return nil +} diff --git a/pkg/controller.v1beta1/trial/trial_controller_suite_test.go b/pkg/controller.v1beta1/trial/trial_controller_suite_test.go new file mode 100644 index 00000000000..ad53af20e30 --- /dev/null +++ b/pkg/controller.v1beta1/trial/trial_controller_suite_test.go @@ -0,0 +1,83 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package trial + +import ( + stdlog "log" + "os" + "path/filepath" + "sync" + "testing" + "time" + + "github.com/onsi/gomega" + "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/rest" + "sigs.k8s.io/controller-runtime/pkg/envtest" + "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + + apis "github.com/kubeflow/katib/pkg/apis/controller" +) + +var ( + cfg *rest.Config + controlPlaneStartTimeout = 60 * time.Second + controlPlaneStopTimeout = 60 * time.Second +) + +func TestMain(m *testing.M) { + t := &envtest.Environment{ + ControlPlaneStartTimeout: controlPlaneStartTimeout, + ControlPlaneStopTimeout: controlPlaneStopTimeout, + CRDDirectoryPaths: []string{ + filepath.Join("..", "..", "..", "manifests", "v1beta1", "katib-controller"), + filepath.Join("..", "..", "..", "test", "unit", "v1beta1", "crds"), + }, + } + apis.AddToScheme(scheme.Scheme) + + var err error + if cfg, err = t.Start(); err != nil { + stdlog.Fatal(err) + } + + code := m.Run() + t.Stop() + os.Exit(code) +} + +// SetupTestReconcile returns a reconcile.Reconcile implementation that delegates to inner. +func SetupTestReconcile(inner reconcile.Reconciler) reconcile.Reconciler { + fn := reconcile.Func(func(req reconcile.Request) (reconcile.Result, error) { + result, err := inner.Reconcile(req) + return result, err + }) + return fn +} + +// StartTestManager adds recFn +func StartTestManager(mgr manager.Manager, g *gomega.GomegaWithT) (chan struct{}, *sync.WaitGroup) { + stop := make(chan struct{}) + wg := &sync.WaitGroup{} + wg.Add(1) + go func() { + defer wg.Done() + g.Expect(mgr.Start(stop)).NotTo(gomega.HaveOccurred()) + }() + return stop, wg +} diff --git a/pkg/controller.v1beta1/trial/trial_controller_test.go b/pkg/controller.v1beta1/trial/trial_controller_test.go new file mode 100644 index 00000000000..8f91a817319 --- /dev/null +++ b/pkg/controller.v1beta1/trial/trial_controller_test.go @@ -0,0 +1,277 @@ +package trial + +import ( + "bytes" + "testing" + "time" + + "github.com/golang/mock/gomock" + "github.com/onsi/gomega" + "github.com/prometheus/client_golang/prometheus" + "golang.org/x/net/context" + corev1 "k8s.io/api/core/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/types" + k8syaml "k8s.io/apimachinery/pkg/util/yaml" + "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + + commonv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" + trialsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" + api_pb "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" + managerclientmock "github.com/kubeflow/katib/pkg/mock/v1beta1/trial/managerclient" +) + +const ( + trialName = "foo" + namespace = "default" + + timeout = time.Second * 40 +) + +var expectedRequest = reconcile.Request{NamespacedName: types.NamespacedName{Name: trialName, Namespace: namespace}} +var expectedResult = reconcile.Result{Requeue: true} +var tfJobKey = types.NamespacedName{Name: "test", Namespace: namespace} + +func init() { + logf.SetLogger(logf.ZapLogger(true)) +} + +func TestCreateTFJobTrial(t *testing.T) { + g := gomega.NewGomegaWithT(t) + instance := newFakeTrialWithTFJob() + + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + mc := managerclientmock.NewMockManagerClient(mockCtrl) + + // Setup the Manager and Controller. Wrap the Controller Reconcile function so it writes each request to a + // channel when it is finished. + mgr, err := manager.New(cfg, manager.Options{}) + g.Expect(err).NotTo(gomega.HaveOccurred()) + c := mgr.GetClient() + + recFn := SetupTestReconcile(&ReconcileTrial{ + Client: mgr.GetClient(), + scheme: mgr.GetScheme(), + ManagerClient: mc, + recorder: mgr.GetRecorder(ControllerName), + updateStatusHandler: func(instance *trialsv1beta1.Trial) error { + if !instance.IsCreated() { + t.Errorf("Expected got condition created") + } + return nil + }, + }) + g.Expect(add(mgr, recFn)).NotTo(gomega.HaveOccurred()) + + stopMgr, mgrStopped := StartTestManager(mgr, g) + + defer func() { + close(stopMgr) + mgrStopped.Wait() + }() + + // Create the Trial object and expect the Reconcile and Deployment to be created + err = c.Create(context.TODO(), instance) + // The instance object may not be a valid object because it might be missing some required fields. + // Please modify the instance object by adding required fields and then remove the following if statement. + if apierrors.IsInvalid(err) { + t.Logf("failed to create object, got an invalid object error: %v", err) + return + } + g.Expect(err).NotTo(gomega.HaveOccurred()) + g.Expect(c.Delete(context.TODO(), instance)).NotTo(gomega.HaveOccurred()) + g.Eventually(func() bool { + return apierrors.IsNotFound(c.Get(context.TODO(), + expectedRequest.NamespacedName, instance)) + }, timeout).Should(gomega.BeTrue()) +} + +func TestReconcileTFJobTrial(t *testing.T) { + g := gomega.NewGomegaWithT(t) + instance := newFakeTrialWithTFJob() + + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + mc := managerclientmock.NewMockManagerClient(mockCtrl) + mc.EXPECT().GetTrialObservationLog(gomock.Any()).Return(&api_pb.GetObservationLogReply{ + ObservationLog: nil, + }, nil).AnyTimes() + mc.EXPECT().DeleteTrialObservationLog(gomock.Any()).Return(&api_pb.DeleteObservationLogReply{}, nil).AnyTimes() + + // Setup the Manager and Controller. Wrap the Controller Reconcile function so it writes each request to a + // channel when it is finished. + mgr, err := manager.New(cfg, manager.Options{}) + g.Expect(err).NotTo(gomega.HaveOccurred()) + c := mgr.GetClient() + + r := &ReconcileTrial{ + Client: mgr.GetClient(), + scheme: mgr.GetScheme(), + ManagerClient: mc, + recorder: mgr.GetRecorder(ControllerName), + collector: NewTrialsCollector(mgr.GetCache(), prometheus.NewRegistry()), + } + + r.updateStatusHandler = func(instance *trialsv1beta1.Trial) error { + if !instance.IsCreated() { + t.Errorf("Expected got condition created") + } + return r.updateStatus(instance) + } + + recFn := SetupTestReconcile(r) + g.Expect(add(mgr, recFn)).NotTo(gomega.HaveOccurred()) + + stopMgr, mgrStopped := StartTestManager(mgr, g) + + defer func() { + close(stopMgr) + mgrStopped.Wait() + }() + + // Create the Trial object and expect the Reconcile and Deployment to be created + err = c.Create(context.TODO(), instance) + // The instance object may not be a valid object because it might be missing some required fields. + // Please modify the instance object by adding required fields and then remove the following if statement. + if apierrors.IsInvalid(err) { + t.Logf("failed to create object, got an invalid object error: %v", err) + return + } + g.Expect(err).NotTo(gomega.HaveOccurred()) + + tfJob := &unstructured.Unstructured{} + bufSize := 1024 + buf := bytes.NewBufferString(instance.Spec.RunSpec) + if err := k8syaml.NewYAMLOrJSONDecoder(buf, bufSize).Decode(tfJob); err != nil { + t.Errorf("Expected nil, got %v", err) + } + g.Eventually(func() error { return c.Get(context.TODO(), tfJobKey, tfJob) }, timeout). + Should(gomega.Succeed()) + + // Delete the TFJob and expect Reconcile to be called for TFJob deletion + g.Expect(c.Delete(context.TODO(), tfJob)).NotTo(gomega.HaveOccurred()) + g.Eventually(func() error { return c.Get(context.TODO(), tfJobKey, tfJob) }, timeout). + Should(gomega.Succeed()) + + // Manually delete TFJob since GC isn't enabled in the test control plane + g.Eventually(func() error { return c.Delete(context.TODO(), tfJob) }, timeout). + Should(gomega.MatchError("tfjobs.kubeflow.org \"test\" not found")) + g.Expect(c.Delete(context.TODO(), instance)).NotTo(gomega.HaveOccurred()) +} + +func TestReconcileCompletedTFJobTrial(t *testing.T) { + g := gomega.NewGomegaWithT(t) + instance := newFakeTrialWithTFJob() + instance.Name = "tfjob-trial" + + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + mc := managerclientmock.NewMockManagerClient(mockCtrl) + mc.EXPECT().GetTrialObservationLog(gomock.Any()).Return(&api_pb.GetObservationLogReply{ + ObservationLog: nil, + }, nil).AnyTimes() + mc.EXPECT().DeleteTrialObservationLog(gomock.Any()).Return(&api_pb.DeleteObservationLogReply{}, nil).AnyTimes() + + // Setup the Manager and Controller. Wrap the Controller Reconcile function so it writes each request to a + // channel when it is finished. + mgr, err := manager.New(cfg, manager.Options{}) + g.Expect(err).NotTo(gomega.HaveOccurred()) + c := mgr.GetClient() + + r := &ReconcileTrial{ + Client: mgr.GetClient(), + scheme: mgr.GetScheme(), + ManagerClient: mc, + recorder: mgr.GetRecorder(ControllerName), + collector: NewTrialsCollector(mgr.GetCache(), prometheus.NewRegistry()), + } + + r.updateStatusHandler = func(instance *trialsv1beta1.Trial) error { + if !instance.IsCreated() { + t.Errorf("Expected got condition created") + } + return r.updateStatus(instance) + } + + recFn := SetupTestReconcile(r) + g.Expect(add(mgr, recFn)).NotTo(gomega.HaveOccurred()) + + stopMgr, mgrStopped := StartTestManager(mgr, g) + + defer func() { + close(stopMgr) + mgrStopped.Wait() + }() + + // Create the Trial object and expect the Reconcile and Deployment to be created + err = c.Create(context.TODO(), instance) + // The instance object may not be a valid object because it might be missing some required fields. + // Please modify the instance object by adding required fields and then remove the following if statement. + if apierrors.IsInvalid(err) { + t.Logf("failed to create object, got an invalid object error: %v", err) + return + } + g.Expect(err).NotTo(gomega.HaveOccurred()) + defer c.Delete(context.TODO(), instance) + + g.Eventually(func() error { + return c.Get(context.TODO(), expectedRequest.NamespacedName, instance) + }, timeout). + Should(gomega.Succeed()) + instance.MarkTrialStatusSucceeded(corev1.ConditionTrue, "", "") + g.Expect(c.Status().Update(context.TODO(), instance)).NotTo(gomega.HaveOccurred()) + g.Eventually(func() bool { + err := c.Get(context.TODO(), expectedRequest.NamespacedName, instance) + if err == nil && instance.IsCompleted() { + return true + } + return false + }, timeout). + Should(gomega.BeTrue()) +} + +func newFakeTrialWithTFJob() *trialsv1beta1.Trial { + objectiveSpec := commonv1beta1.ObjectiveSpec{ObjectiveMetricName: "test"} + t := &trialsv1beta1.Trial{ + ObjectMeta: metav1.ObjectMeta{ + Name: trialName, + Namespace: namespace, + }, + Spec: trialsv1beta1.TrialSpec{ + Objective: &objectiveSpec, + RunSpec: `apiVersion: "kubeflow.org/v1" +kind: "TFJob" +metadata: + name: "test" + namespace: "default" +spec: + tfReplicaSpecs: + PS: + replicas: 2 + restartPolicy: Never + template: + spec: + containers: + - name: tensorflow + image: kubeflow/tf-dist-mnist-test:1.0 + Worker: + replicas: 4 + restartPolicy: Never + template: + spec: + containers: + - name: tensorflow + image: kubeflow/tf-dist-mnist-test:1.0 +`, + }, + } + return t +} diff --git a/pkg/controller.v1beta1/trial/trial_controller_util.go b/pkg/controller.v1beta1/trial/trial_controller_util.go new file mode 100644 index 00000000000..23a4cd7093d --- /dev/null +++ b/pkg/controller.v1beta1/trial/trial_controller_util.go @@ -0,0 +1,222 @@ +/* + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package trial + +import ( + "context" + "fmt" + "strconv" + + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + + commonv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" + trialsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" + api_pb "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" + commonv1 "github.com/kubeflow/tf-operator/pkg/apis/common/v1" +) + +const ( + cleanMetricsFinalizer = "clean-metrics-in-db" +) + +func (r *ReconcileTrial) UpdateTrialStatusCondition(instance *trialsv1beta1.Trial, deployedJob *unstructured.Unstructured, jobCondition *commonv1.JobCondition) { + if jobCondition == nil || instance == nil || deployedJob == nil { + return + } + now := metav1.Now() + jobConditionType := (*jobCondition).Type + if jobConditionType == commonv1.JobSucceeded { + if isTrialObservationAvailable(instance) { + msg := "Trial has succeeded" + instance.MarkTrialStatusSucceeded(corev1.ConditionTrue, TrialSucceededReason, msg) + instance.Status.CompletionTime = &now + + eventMsg := fmt.Sprintf("Job %s has succeeded", deployedJob.GetName()) + r.recorder.Eventf(instance, corev1.EventTypeNormal, JobSucceededReason, eventMsg) + r.collector.IncreaseTrialsSucceededCount(instance.Namespace) + } else { + msg := "Metrics are not available" + instance.MarkTrialStatusSucceeded(corev1.ConditionFalse, TrialMetricsUnavailableReason, msg) + + eventMsg := fmt.Sprintf("Metrics are not available for Job %s", deployedJob.GetName()) + r.recorder.Eventf(instance, corev1.EventTypeWarning, JobMetricsUnavailableReason, eventMsg) + } + } else if jobConditionType == commonv1.JobFailed { + msg := "Trial has failed" + instance.MarkTrialStatusFailed(TrialFailedReason, msg) + instance.Status.CompletionTime = &now + + jobConditionMessage := (*jobCondition).Message + eventMsg := fmt.Sprintf("Job %s has failed: %s", deployedJob.GetName(), jobConditionMessage) + r.recorder.Eventf(instance, corev1.EventTypeNormal, JobFailedReason, eventMsg) + r.collector.IncreaseTrialsFailedCount(instance.Namespace) + } else if jobConditionType == commonv1.JobRunning { + msg := "Trial is running" + instance.MarkTrialStatusRunning(TrialRunningReason, msg) + jobConditionMessage := (*jobCondition).Message + eventMsg := fmt.Sprintf("Job %s is running: %s", + deployedJob.GetName(), jobConditionMessage) + r.recorder.Eventf(instance, corev1.EventTypeNormal, + JobRunningReason, eventMsg) + // TODO(gaocegege): Should we maintain a TrialsRunningCount? + } + // else nothing to do + return +} + +func (r *ReconcileTrial) UpdateTrialStatusObservation(instance *trialsv1beta1.Trial, deployedJob *unstructured.Unstructured) error { + objectiveMetricName := instance.Spec.Objective.ObjectiveMetricName + reply, err := r.GetTrialObservationLog(instance) + if err != nil { + log.Error(err, "Get trial observation log error") + return err + } + if reply.ObservationLog != nil { + bestObjectiveValue := getBestObjectiveMetricValue(reply.ObservationLog.MetricLogs, instance.Spec.Objective.Type) + if bestObjectiveValue != nil { + if instance.Status.Observation == nil { + instance.Status.Observation = &commonv1beta1.Observation{} + metric := commonv1beta1.Metric{Name: objectiveMetricName, Value: *bestObjectiveValue} + instance.Status.Observation.Metrics = []commonv1beta1.Metric{metric} + } else { + for index, metric := range instance.Status.Observation.Metrics { + if metric.Name == objectiveMetricName { + instance.Status.Observation.Metrics[index].Value = *bestObjectiveValue + } + } + } + } + } + return nil +} + +func (r *ReconcileTrial) updateFinalizers(instance *trialsv1beta1.Trial, finalizers []string) (reconcile.Result, error) { + isDelete := true + if !instance.ObjectMeta.DeletionTimestamp.IsZero() { + if _, err := r.DeleteTrialObservationLog(instance); err != nil { + return reconcile.Result{}, err + } + } else { + isDelete = false + } + instance.SetFinalizers(finalizers) + if err := r.Update(context.TODO(), instance); err != nil { + return reconcile.Result{}, err + } else { + if isDelete { + r.collector.IncreaseTrialsDeletedCount(instance.Namespace) + } else { + r.collector.IncreaseTrialsCreatedCount(instance.Namespace) + } + // Need to requeue because finalizer update does not change metadata.generation + return reconcile.Result{Requeue: true}, err + } +} + +func isTrialObservationAvailable(instance *trialsv1beta1.Trial) bool { + if instance == nil { + return false + } + objectiveMetricName := instance.Spec.Objective.ObjectiveMetricName + if instance.Status.Observation != nil && instance.Status.Observation.Metrics != nil { + for _, metric := range instance.Status.Observation.Metrics { + if metric.Name == objectiveMetricName { + return true + } + } + } + return false +} + +func isTrialComplete(instance *trialsv1beta1.Trial, jobCondition *commonv1.JobCondition) bool { + if jobCondition == nil || instance == nil { + return false + } + jobConditionType := (*jobCondition).Type + if jobConditionType == commonv1.JobSucceeded && isTrialObservationAvailable(instance) { + return true + } + if jobConditionType == commonv1.JobFailed { + return true + } + + return false +} + +func isJobSucceeded(jobCondition *commonv1.JobCondition) bool { + if jobCondition == nil { + return false + } + jobConditionType := (*jobCondition).Type + if jobConditionType == commonv1.JobSucceeded { + return true + } + + return false +} + +func getBestObjectiveMetricValue(metricLogs []*api_pb.MetricLog, objectiveType commonv1beta1.ObjectiveType) *float64 { + metricLogSize := len(metricLogs) + if metricLogSize == 0 { + return nil + } + + bestObjectiveValue, _ := strconv.ParseFloat(metricLogs[0].Metric.Value, 64) + for _, metricLog := range metricLogs[1:] { + objectiveMetricValue, _ := strconv.ParseFloat(metricLog.Metric.Value, 64) + if objectiveType == commonv1beta1.ObjectiveTypeMinimize { + if objectiveMetricValue < bestObjectiveValue { + bestObjectiveValue = objectiveMetricValue + } + } else if objectiveType == commonv1beta1.ObjectiveTypeMaximize { + if objectiveMetricValue > bestObjectiveValue { + bestObjectiveValue = objectiveMetricValue + } + } + + } + return &bestObjectiveValue +} + +func needUpdateFinalizers(trial *trialsv1beta1.Trial) (bool, []string) { + deleted := !trial.ObjectMeta.DeletionTimestamp.IsZero() + pendingFinalizers := trial.GetFinalizers() + contained := false + for _, elem := range pendingFinalizers { + if elem == cleanMetricsFinalizer { + contained = true + break + } + } + + if !deleted && !contained { + finalizers := append(pendingFinalizers, cleanMetricsFinalizer) + return true, finalizers + } + if deleted && contained { + finalizers := []string{} + for _, pendingFinalizer := range pendingFinalizers { + if pendingFinalizer != cleanMetricsFinalizer { + finalizers = append(finalizers, pendingFinalizer) + } + } + return true, finalizers + } + return false, []string{} +} diff --git a/pkg/controller.v1beta1/util/annotations.go b/pkg/controller.v1beta1/util/annotations.go new file mode 100644 index 00000000000..0c41b60e688 --- /dev/null +++ b/pkg/controller.v1beta1/util/annotations.go @@ -0,0 +1,122 @@ +/* + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + "fmt" + + batchv1 "k8s.io/api/batch/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + + suggestionsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1" + "github.com/kubeflow/katib/pkg/controller.v1beta1/consts" + jobv1beta1 "github.com/kubeflow/katib/pkg/job/v1beta1" + pytorchv1 "github.com/kubeflow/pytorch-operator/pkg/apis/pytorch/v1" + tfv1 "github.com/kubeflow/tf-operator/pkg/apis/tensorflow/v1" +) + +var ( + log = logf.Log.WithName("util-annotations") +) + +// SuggestionAnnotations returns the expected suggestion annotations. +func SuggestionAnnotations(instance *suggestionsv1beta1.Suggestion) map[string]string { + return appendAnnotation( + instance.Annotations, + consts.AnnotationIstioSidecarInjectName, + consts.AnnotationIstioSidecarInjectValue) +} + +// TrainingJobAnnotations adds annotations to unstructured job. +func TrainingJobAnnotations(desiredJob *unstructured.Unstructured) error { + kind := desiredJob.GetKind() + switch kind { + case consts.JobKindJob: + batchJob := &batchv1.Job{} + err := runtime.DefaultUnstructuredConverter.FromUnstructured(desiredJob.Object, &batchJob) + if err != nil { + log.Error(err, "Convert unstructured to job error") + return err + } + batchJob.Spec.Template.ObjectMeta.Annotations = appendAnnotation( + batchJob.Spec.Template.ObjectMeta.Annotations, + consts.AnnotationIstioSidecarInjectName, + consts.AnnotationIstioSidecarInjectValue) + desiredJob.Object, err = runtime.DefaultUnstructuredConverter.ToUnstructured(batchJob) + if err != nil { + log.Error(err, "Convert job to unstructured error") + return err + } + return nil + case consts.JobKindTF: + tfJob := &tfv1.TFJob{} + err := runtime.DefaultUnstructuredConverter.FromUnstructured(desiredJob.Object, &tfJob) + if err != nil { + log.Error(err, "Convert unstructured to TFJob error") + return err + } + for _, replicaSpec := range tfJob.Spec.TFReplicaSpecs { + replicaSpec.Template.ObjectMeta.Annotations = appendAnnotation( + replicaSpec.Template.ObjectMeta.Annotations, + consts.AnnotationIstioSidecarInjectName, + consts.AnnotationIstioSidecarInjectValue) + } + desiredJob.Object, err = runtime.DefaultUnstructuredConverter.ToUnstructured(tfJob) + if err != nil { + log.Error(err, "Convert TFJob to unstructured error") + return err + } + return nil + case consts.JobKindPyTorch: + pytorchJob := &pytorchv1.PyTorchJob{} + err := runtime.DefaultUnstructuredConverter.FromUnstructured(desiredJob.Object, &pytorchJob) + if err != nil { + log.Error(err, "Convert unstructured to PytorchJob error") + return err + } + for _, replicaSpec := range pytorchJob.Spec.PyTorchReplicaSpecs { + replicaSpec.Template.ObjectMeta.Annotations = appendAnnotation( + replicaSpec.Template.ObjectMeta.Annotations, + consts.AnnotationIstioSidecarInjectName, + consts.AnnotationIstioSidecarInjectValue) + } + desiredJob.Object, err = runtime.DefaultUnstructuredConverter.ToUnstructured(pytorchJob) + if err != nil { + log.Error(err, "Convert PytorchJob to unstructured error") + return err + } + return nil + default: + // Annotation appending of custom job can be done in Provider.MutateJob. + if _, ok := jobv1beta1.SupportedJobList[kind]; ok { + return nil + } + return fmt.Errorf("Invalid Katib Training Job kind %v", kind) + } + +} + +func appendAnnotation(annotations map[string]string, newAnnotationName string, newAnnotationValue string) map[string]string { + res := make(map[string]string) + for k, v := range annotations { + res[k] = v + } + res[newAnnotationName] = newAnnotationValue + + return res +} diff --git a/pkg/controller.v1beta1/util/labels.go b/pkg/controller.v1beta1/util/labels.go new file mode 100644 index 00000000000..c7050069ebd --- /dev/null +++ b/pkg/controller.v1beta1/util/labels.go @@ -0,0 +1,31 @@ +package util + +import ( + experimentsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + suggestionsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1" + "github.com/kubeflow/katib/pkg/controller.v1beta1/consts" +) + +// SuggestionLabels returns the expected suggestion labels. +func SuggestionLabels(instance *suggestionsv1beta1.Suggestion) map[string]string { + res := make(map[string]string) + for k, v := range instance.Labels { + res[k] = v + } + res[consts.LabelDeploymentName] = GetAlgorithmDeploymentName(instance) + res[consts.LabelExperimentName] = instance.Name + res[consts.LabelSuggestionName] = instance.Name + + return res +} + +// TrialLabels returns the expected trial labels. +func TrialLabels(instance *experimentsv1beta1.Experiment) map[string]string { + res := make(map[string]string) + for k, v := range instance.Labels { + res[k] = v + } + res[consts.LabelExperimentName] = instance.Name + + return res +} diff --git a/pkg/controller.v1beta1/util/suggestion.go b/pkg/controller.v1beta1/util/suggestion.go new file mode 100644 index 00000000000..f9713279f53 --- /dev/null +++ b/pkg/controller.v1beta1/util/suggestion.go @@ -0,0 +1,25 @@ +package util + +import ( + "fmt" + + suggestionsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1" + "github.com/kubeflow/katib/pkg/controller.v1beta1/consts" +) + +func GetAlgorithmDeploymentName(s *suggestionsv1beta1.Suggestion) string { + return s.Name + "-" + s.Spec.AlgorithmName +} + +func GetAlgorithmServiceName(s *suggestionsv1beta1.Suggestion) string { + return s.Name + "-" + s.Spec.AlgorithmName +} + +// GetAlgorithmEndpoint returns the endpoint of the algorithm service. +func GetAlgorithmEndpoint(s *suggestionsv1beta1.Suggestion) string { + serviceName := GetAlgorithmServiceName(s) + return fmt.Sprintf("%s.%s:%d", + serviceName, + s.Namespace, + consts.DefaultSuggestionPort) +} diff --git a/pkg/db/v1beta1/common/const.go b/pkg/db/v1beta1/common/const.go new file mode 100644 index 00000000000..0d1d0cac161 --- /dev/null +++ b/pkg/db/v1beta1/common/const.go @@ -0,0 +1,20 @@ +package common + +const ( + DBUserEnvName = "DB_USER" + + DBNameEnvName = "DB_NAME" + + MySqlDBNameEnvValue = "mysql" + + DBPasswordEnvName = "DB_PASSWORD" + + MySQLDBHostEnvName = "KATIB_MYSQL_DB_HOST" + MySQLDBPortEnvName = "KATIB_MYSQL_DB_PORT" + MySQLDatabase = "KATIB_MYSQL_DB_DATABASE" + + DefaultMySQLUser = "root" + DefaultMySQLDatabase = "katib" + DefaultMySQLHost = "katib-mysql" + DefaultMySQLPort = "3306" +) diff --git a/pkg/db/v1beta1/common/kdb.go b/pkg/db/v1beta1/common/kdb.go new file mode 100644 index 00000000000..aaa5bf10bf2 --- /dev/null +++ b/pkg/db/v1beta1/common/kdb.go @@ -0,0 +1,14 @@ +package common + +import ( + v1beta1 "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" +) + +type KatibDBInterface interface { + DBInit() + SelectOne() error + + RegisterObservationLog(trialName string, observationLog *v1beta1.ObservationLog) error + GetObservationLog(trialName string, metricName string, startTime string, endTime string) (*v1beta1.ObservationLog, error) + DeleteObservationLog(trialName string) error +} diff --git a/pkg/db/v1beta1/db.go b/pkg/db/v1beta1/db.go new file mode 100644 index 00000000000..e5a1c570692 --- /dev/null +++ b/pkg/db/v1beta1/db.go @@ -0,0 +1,16 @@ +package db + +import ( + "errors" + + "github.com/kubeflow/katib/pkg/db/v1beta1/common" + "github.com/kubeflow/katib/pkg/db/v1beta1/mysql" +) + +func NewKatibDBInterface(dbName string) (common.KatibDBInterface, error) { + + if dbName == common.MySqlDBNameEnvValue { + return mysql.NewDBInterface() + } + return nil, errors.New("Invalid DB Name") +} diff --git a/pkg/db/v1beta1/mysql/init.go b/pkg/db/v1beta1/mysql/init.go new file mode 100644 index 00000000000..fd4ecd26a4b --- /dev/null +++ b/pkg/db/v1beta1/mysql/init.go @@ -0,0 +1,31 @@ +package mysql + +import ( + "fmt" + + "k8s.io/klog" +) + +func (d *dbConn) DBInit() { + db := d.db + klog.Info("Initializing v1beta1 DB schema") + + _, err := db.Exec(`CREATE TABLE IF NOT EXISTS observation_logs + (trial_name VARCHAR(255) NOT NULL, + id INT AUTO_INCREMENT PRIMARY KEY, + time DATETIME(6), + metric_name VARCHAR(255) NOT NULL, + value TEXT NOT NULL)`) + if err != nil { + klog.Fatalf("Error creating observation_logs table: %v", err) + } +} + +func (d *dbConn) SelectOne() error { + db := d.db + _, err := db.Exec(`SELECT 1`) + if err != nil { + return fmt.Errorf("Error `SELECT 1` probing: %v", err) + } + return nil +} diff --git a/pkg/db/v1beta1/mysql/mysql.go b/pkg/db/v1beta1/mysql/mysql.go new file mode 100644 index 00000000000..f84f79b5b15 --- /dev/null +++ b/pkg/db/v1beta1/mysql/mysql.go @@ -0,0 +1,186 @@ +package mysql + +import ( + crand "crypto/rand" + "database/sql" + "fmt" + "math/big" + "math/rand" + "os" + "time" + + _ "github.com/go-sql-driver/mysql" + "k8s.io/klog" + + v1beta1 "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" + "github.com/kubeflow/katib/pkg/db/v1beta1/common" + "github.com/kubeflow/katib/pkg/util/v1beta1/env" +) + +const ( + dbDriver = "mysql" + //dbNameTmpl = "root:%s@tcp(%s:%s)/%s?timeout=5s" + dbNameTmpl = "%s:%s@tcp(%s:%s)/%s?timeout=5s" + mysqlTimeFmt = "2006-01-02 15:04:05.999999" + + connectInterval = 5 * time.Second + connectTimeout = 60 * time.Second +) + +type dbConn struct { + db *sql.DB +} + +func getDbName() string { + dbPassEnvName := common.DBPasswordEnvName + dbPass := os.Getenv(dbPassEnvName) + dbUser := env.GetEnvOrDefault( + common.DBUserEnvName, common.DefaultMySQLUser) + dbHost := env.GetEnvOrDefault( + common.MySQLDBHostEnvName, common.DefaultMySQLHost) + dbPort := env.GetEnvOrDefault( + common.MySQLDBPortEnvName, common.DefaultMySQLPort) + dbName := env.GetEnvOrDefault(common.MySQLDatabase, + common.DefaultMySQLDatabase) + + return fmt.Sprintf(dbNameTmpl, dbUser, dbPass, dbHost, dbPort, dbName) +} + +func openSQLConn(driverName string, dataSourceName string, interval time.Duration, + timeout time.Duration) (*sql.DB, error) { + ticker := time.NewTicker(interval) + defer ticker.Stop() + + timeoutC := time.After(timeout) + for { + select { + case <-ticker.C: + if db, err := sql.Open(driverName, dataSourceName); err == nil { + if err = db.Ping(); err == nil { + return db, nil + } + klog.Errorf("Ping to Katib db failed: %v", err) + } else { + klog.Errorf("Open sql connection failed: %v", err) + } + case <-timeoutC: + return nil, fmt.Errorf("Timeout waiting for DB conn successfully opened.") + } + } +} + +func NewWithSQLConn(db *sql.DB) (common.KatibDBInterface, error) { + d := new(dbConn) + d.db = db + seed, err := crand.Int(crand.Reader, big.NewInt(1<<63-1)) + if err != nil { + return nil, fmt.Errorf("RNG initialization failed: %v", err) + } + // We can do the following instead, but it creates a locking issue + //d.rng = rand.New(rand.NewSource(seed.Int64())) + rand.Seed(seed.Int64()) + + return d, nil +} + +func NewDBInterface() (common.KatibDBInterface, error) { + db, err := openSQLConn(dbDriver, getDbName(), connectInterval, connectTimeout) + if err != nil { + return nil, fmt.Errorf("DB open failed: %v", err) + } + return NewWithSQLConn(db) +} + +func (d *dbConn) RegisterObservationLog(trialName string, observationLog *v1beta1.ObservationLog) error { + var mname, mvalue string + for _, mlog := range observationLog.MetricLogs { + mname = mlog.Metric.Name + mvalue = mlog.Metric.Value + if mlog.TimeStamp == "" { + continue + } + t, err := time.Parse(time.RFC3339Nano, mlog.TimeStamp) + if err != nil { + return fmt.Errorf("Error parsing start time %s: %v", mlog.TimeStamp, err) + } + sqlTimeStr := t.UTC().Format(mysqlTimeFmt) + _, err = d.db.Exec( + `INSERT INTO observation_logs ( + trial_name, + time, + metric_name, + value + ) VALUES (?, ?, ?, ?)`, + trialName, + sqlTimeStr, + mname, + mvalue, + ) + if err != nil { + return err + } + } + return nil +} + +func (d *dbConn) DeleteObservationLog(trialName string) error { + _, err := d.db.Exec("DELETE FROM observation_logs WHERE trial_name = ?", trialName) + return err +} + +func (d *dbConn) GetObservationLog(trialName string, metricName string, startTime string, endTime string) (*v1beta1.ObservationLog, error) { + qfield := []interface{}{trialName} + qstr := "" + if metricName != "" { + qstr += " AND metric_name = ?" + qfield = append(qfield, metricName) + } + if startTime != "" { + s_time, err := time.Parse(time.RFC3339Nano, startTime) + if err != nil { + return nil, fmt.Errorf("Error parsing start time %s: %v", startTime, err) + } + formattedStartTime := s_time.UTC().Format(mysqlTimeFmt) + qstr += " AND time >= ?" + qfield = append(qfield, formattedStartTime) + } + if endTime != "" { + e_time, err := time.Parse(time.RFC3339Nano, endTime) + if err != nil { + return nil, fmt.Errorf("Error parsing completion time %s: %v", endTime, err) + } + formattedEndTime := e_time.UTC().Format(mysqlTimeFmt) + qstr += " AND time <= ?" + qfield = append(qfield, formattedEndTime) + } + rows, err := d.db.Query("SELECT time, metric_name, value FROM observation_logs WHERE trial_name = ?"+qstr+" ORDER BY time", + qfield...) + if err != nil { + return nil, fmt.Errorf("Failed to get ObservationLogs %v", err) + } + result := &v1beta1.ObservationLog{ + MetricLogs: []*v1beta1.MetricLog{}, + } + for rows.Next() { + var mname, mvalue, sqlTimeStr string + err := rows.Scan(&sqlTimeStr, &mname, &mvalue) + if err != nil { + klog.Errorf("Error scanning log: %v", err) + continue + } + ptime, err := time.Parse(mysqlTimeFmt, sqlTimeStr) + if err != nil { + klog.Errorf("Error parsing time %s: %v", sqlTimeStr, err) + continue + } + timeStamp := ptime.UTC().Format(time.RFC3339Nano) + result.MetricLogs = append(result.MetricLogs, &v1beta1.MetricLog{ + TimeStamp: timeStamp, + Metric: &v1beta1.Metric{ + Name: mname, + Value: mvalue, + }, + }) + } + return result, nil +} diff --git a/pkg/db/v1beta1/mysql/mysql_test.go b/pkg/db/v1beta1/mysql/mysql_test.go new file mode 100644 index 00000000000..5fc68600c01 --- /dev/null +++ b/pkg/db/v1beta1/mysql/mysql_test.go @@ -0,0 +1,147 @@ +package mysql + +import ( + "fmt" + "os" + "testing" + + _ "github.com/go-sql-driver/mysql" + sqlmock "gopkg.in/DATA-DOG/go-sqlmock.v1" + + api_pb "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" + "github.com/kubeflow/katib/pkg/db/v1beta1/common" +) + +var dbInterface, mysqlInterface common.KatibDBInterface +var mock sqlmock.Sqlmock + +var observationLogsColumns = []string{ + "trial_name", + "id", + "time", + "metric_name", + "value", +} + +func TestMain(m *testing.M) { + db, sm, err := sqlmock.New() + mock = sm + if err != nil { + fmt.Printf("error opening db: %v\n", err) + os.Exit(1) + } + dbInterface, err = NewWithSQLConn(db) + if err != nil { + fmt.Printf("error NewWithSQLConn: %v\n", err) + } + mock.ExpectExec("CREATE TABLE IF NOT EXISTS observation_logs").WithArgs().WillReturnResult(sqlmock.NewResult(1, 1)) + dbInterface.DBInit() + err = dbInterface.SelectOne() + if err != nil { + fmt.Printf("error `SELECT 1` probing: %v\n", err) + } + os.Exit(m.Run()) +} + +func TestRegisterObservationLog(t *testing.T) { + obsLog := &api_pb.ObservationLog{ + MetricLogs: []*api_pb.MetricLog{ + { + TimeStamp: "2016-12-31T20:02:05.123456Z", + Metric: &api_pb.Metric{ + Name: "f1_score", + Value: "88.95", + }, + }, + { + TimeStamp: "2016-12-31T20:02:05.123456Z", + Metric: &api_pb.Metric{ + Name: "loss", + Value: "0.5", + }, + }, + { + TimeStamp: "2016-12-31T20:02:05.123456Z", + Metric: &api_pb.Metric{ + Name: "precision", + Value: "88.7", + }, + }, + { + TimeStamp: "2016-12-31T20:02:05.123456Z", + Metric: &api_pb.Metric{ + Name: "recall", + Value: "89.2", + }, + }, + }, + } + for _, m := range obsLog.MetricLogs { + mock.ExpectExec( + `INSERT INTO observation_logs \( + trial_name, + time, + metric_name, + value + \)`, + ).WithArgs( + "test1_trial1", + "2016-12-31 20:02:05.123456", + m.Metric.Name, + m.Metric.Value, + ).WillReturnResult(sqlmock.NewResult(1, 1)) + } + err := dbInterface.RegisterObservationLog("test1_trial1", obsLog) + if err != nil { + t.Errorf("RegisterExperiment failed: %v", err) + } + +} + +func TestGetObservationLog(t *testing.T) { + mock.ExpectQuery("SELECT").WillReturnRows( + sqlmock.NewRows([]string{"time", "metric_name", "value"}).AddRow( + "2016-12-31 21:02:05.123456", + "loss", + "0.9", + ).AddRow( + "2016-12-31 22:02:05.123456", + "loss", + "0.9", + ), + ) + obsLog, err := dbInterface.GetObservationLog( + "test1_trial1", + "loss", + "2016-12-31T21:01:05.123456Z", + "2016-12-31T22:10:20.123456Z", + ) + if err != nil { + t.Errorf("GetObservationLog failed %v", err) + } else if len(obsLog.MetricLogs) != 2 { + t.Errorf("GetObservationLog incorrect return %v", obsLog) + } + +} + +func TestDeleteObservationLog(t *testing.T) { + trialName := "test1_trial1" + + mock.ExpectExec( + "DELETE FROM observation_logs", + ).WithArgs(trialName).WillReturnResult(sqlmock.NewResult(1, 1)) + + err := dbInterface.DeleteObservationLog(trialName) + if err != nil { + t.Errorf("DeleteObservationLog failed: %v", err) + } +} + +func TestGetDbName(t *testing.T) { + dbName := "root:@tcp(katib-mysql:3306)/katib?timeout=5s" + + if getDbName() != dbName { + t.Errorf("getDbName returns wrong value %v", getDbName()) + } + +} diff --git a/pkg/job/v1beta1/job.go b/pkg/job/v1beta1/job.go new file mode 100644 index 00000000000..2e55a8928ba --- /dev/null +++ b/pkg/job/v1beta1/job.go @@ -0,0 +1,88 @@ +package v1beta1 + +import ( + commonv1 "github.com/kubeflow/tf-operator/pkg/apis/common/v1" + batchv1 "k8s.io/api/batch/v1" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + + "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" + "github.com/kubeflow/katib/pkg/controller.v1beta1/consts" +) + +var ( + jobLogger = logf.Log.WithName("provider-job") +) + +// Job is the provider of Job kind. +type Job struct{} + +// GetDeployedJobStatus get the deployed job status. +func (j Job) GetDeployedJobStatus( + deployedJob *unstructured.Unstructured) (*commonv1.JobCondition, error) { + jobCondition := commonv1.JobCondition{} + // Set default type to running. + jobCondition.Type = commonv1.JobRunning + status, ok, unerr := unstructured.NestedFieldCopy(deployedJob.Object, "status") + if !ok { + if unerr != nil { + jobLogger.Error(unerr, "NestedFieldCopy unstructured to status error") + return nil, unerr + } + // Job does not have the running condition in status, thus we think + // the job is running when it is created. + jobLogger.Info("NestedFieldCopy", "err", "status cannot be found in job") + return nil, nil + } + + statusMap := status.(map[string]interface{}) + jobStatus := batchv1.JobStatus{} + err := runtime.DefaultUnstructuredConverter.FromUnstructured(statusMap, &jobStatus) + if err != nil { + jobLogger.Error(err, "Convert unstructured to status error") + return nil, err + } + for _, cond := range jobStatus.Conditions { + if cond.Type == batchv1.JobComplete && cond.Status == corev1.ConditionTrue { + jobCondition.Type = commonv1.JobSucceeded + // JobConditions message not populated when succeeded for batchv1 Job + break + } + if cond.Type == batchv1.JobFailed && cond.Status == corev1.ConditionTrue { + jobCondition.Type = commonv1.JobFailed + jobCondition.Message = cond.Message + break + } + } + return &jobCondition, nil +} + +// IsTrainingContainer returns if the c is the actual training container. +func (j Job) IsTrainingContainer(index int, c corev1.Container) bool { + if index == 0 { + // for Job worker, the first container will be taken as worker container, + // katib document should note it + return true + } + return false +} +func (j Job) MutateJob(*v1beta1.Trial, *unstructured.Unstructured) error { + return nil +} + +func (j *Job) Create(kind string) Provider { + return &Job{} +} + +func init() { + ProviderRegistry[consts.JobKindJob] = &Job{} + SupportedJobList[consts.JobKindJob] = schema.GroupVersionKind{ + Group: "batch", + Version: "v1", + Kind: consts.JobKindJob, + } + JobRoleMap[consts.JobKindJob] = []string{} +} diff --git a/pkg/job/v1beta1/kubeflow.go b/pkg/job/v1beta1/kubeflow.go new file mode 100644 index 00000000000..925e5f752f7 --- /dev/null +++ b/pkg/job/v1beta1/kubeflow.go @@ -0,0 +1,103 @@ +package v1beta1 + +import ( + pytorchv1 "github.com/kubeflow/pytorch-operator/pkg/apis/pytorch/v1" + commonv1 "github.com/kubeflow/tf-operator/pkg/apis/common/v1" + tfv1 "github.com/kubeflow/tf-operator/pkg/apis/tensorflow/v1" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + + "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" + "github.com/kubeflow/katib/pkg/controller.v1beta1/consts" +) + +var ( + kfLogger = logf.Log.WithName("provider-kubeflow") +) + +// Kubeflow is the provider of Kubeflow kinds. +type Kubeflow struct { + Kind string +} + +// GetDeployedJobStatus get the deployed job status. +func (k Kubeflow) GetDeployedJobStatus( + deployedJob *unstructured.Unstructured) (*commonv1.JobCondition, error) { + jobCondition := commonv1.JobCondition{} + // Set default type to running. + jobCondition.Type = commonv1.JobRunning + status, ok, unerr := unstructured.NestedFieldCopy(deployedJob.Object, "status") + if !ok { + if unerr != nil { + kfLogger.Error(unerr, "NestedFieldCopy unstructured to status error") + return nil, unerr + } + kfLogger.Info("NestedFieldCopy unstructured to status error", + "err", "Status is not found in job") + return nil, nil + } + + statusMap := status.(map[string]interface{}) + jobStatus := commonv1.JobStatus{} + err := runtime.DefaultUnstructuredConverter.FromUnstructured(statusMap, &jobStatus) + if err != nil { + kfLogger.Error(err, "Convert unstructured to status error") + return nil, err + } + // Get the latest condition and set it to jobCondition. + if len(jobStatus.Conditions) > 0 { + lc := jobStatus.Conditions[len(jobStatus.Conditions)-1] + jobCondition.Type = lc.Type + jobCondition.Message = lc.Message + jobCondition.Status = lc.Status + jobCondition.Reason = lc.Reason + } + + return &jobCondition, nil +} + +// IsTrainingContainer returns if the c is the actual training container. +func (k Kubeflow) IsTrainingContainer(index int, c corev1.Container) bool { + switch k.Kind { + case consts.JobKindTF: + if c.Name == tfv1.DefaultContainerName { + return true + } + case consts.JobKindPyTorch: + if c.Name == pytorchv1.DefaultContainerName { + return true + } + default: + kfLogger.Info("Invalid Katib worker kind", "JobKind", k.Kind) + return false + } + return false +} + +func (k Kubeflow) MutateJob(*v1beta1.Trial, *unstructured.Unstructured) error { + return nil +} + +func (k *Kubeflow) Create(kind string) Provider { + return &Kubeflow{Kind: kind} +} + +func init() { + ProviderRegistry[consts.JobKindTF] = &Kubeflow{} + SupportedJobList[consts.JobKindTF] = schema.GroupVersionKind{ + Group: "kubeflow.org", + Version: "v1", + Kind: consts.JobKindTF, + } + JobRoleMap[consts.JobKindTF] = []string{consts.JobRole, consts.JobRoleTF} + ProviderRegistry[consts.JobKindPyTorch] = &Kubeflow{} + SupportedJobList[consts.JobKindPyTorch] = schema.GroupVersionKind{ + Group: "kubeflow.org", + Version: "v1", + Kind: consts.JobKindPyTorch, + } + JobRoleMap[consts.JobKindPyTorch] = []string{consts.JobRole, consts.JobRolePyTorch} +} diff --git a/pkg/job/v1beta1/provider.go b/pkg/job/v1beta1/provider.go new file mode 100644 index 00000000000..6417a677cba --- /dev/null +++ b/pkg/job/v1beta1/provider.go @@ -0,0 +1,44 @@ +package v1beta1 + +import ( + "fmt" + + commonv1 "github.com/kubeflow/tf-operator/pkg/apis/common/v1" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" + + "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" +) + +var ( + ProviderRegistry = make(map[string]Provider) + // JobRoleMap is the map which is used to determin if the replica is master. + // Katib will inject metrics collector into master replica. + JobRoleMap = make(map[string][]string) + // SupportedJobList returns the list of the supported jobs' GVK. + SupportedJobList = make(map[string]schema.GroupVersionKind) +) + +// Provider provides utilities for different jobs. +type Provider interface { + // GetDeployedJobStatus get the deployed job status. + GetDeployedJobStatus( + deployedJob *unstructured.Unstructured) (*commonv1.JobCondition, error) + // IsTrainingContainer returns if the c is the actual training container. + IsTrainingContainer(index int, c corev1.Container) bool + // Mutate jobSpec before creation if necessary + MutateJob(*v1beta1.Trial, *unstructured.Unstructured) error + // Recreate Provider from kind + Create(kind string) Provider +} + +// New creates a new Provider. +func New(kind string) (Provider, error) { + if ptr, ok := ProviderRegistry[kind]; ok { + return ptr.Create(kind), nil + } else { + return nil, fmt.Errorf( + "failed to create the provider: Unknown kind %s", kind) + } +} diff --git a/pkg/metricscollector/v1beta1/common/__init__.py b/pkg/metricscollector/v1beta1/common/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/pkg/metricscollector/v1beta1/common/const.go b/pkg/metricscollector/v1beta1/common/const.go new file mode 100644 index 00000000000..7428f526468 --- /dev/null +++ b/pkg/metricscollector/v1beta1/common/const.go @@ -0,0 +1,43 @@ +/* + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package common + +import ( + "time" + + v1beta1common "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" +) + +const ( + DefaultPollInterval = time.Second + DefaultTimeout = 0 + DefaultWaitAll = false + + MetricCollectorContainerName = "metrics-collector" + MetricLoggerCollectorContainerName = "metrics-logger-and-collector" + + TrainingCompleted = "completed" + + DefaultFilter = `([\w|-]+)\s*=\s*((-?\d+)(\.\d+)?)` +) + +var ( + AutoInjectMetricsCollecterList = [...]v1beta1common.CollectorKind{ + v1beta1common.StdOutCollector, + v1beta1common.TfEventCollector, + v1beta1common.FileCollector, + v1beta1common.PrometheusMetricCollector, + } +) diff --git a/pkg/metricscollector/v1beta1/common/pns.go b/pkg/metricscollector/v1beta1/common/pns.go new file mode 100644 index 00000000000..c423d2285e6 --- /dev/null +++ b/pkg/metricscollector/v1beta1/common/pns.go @@ -0,0 +1,128 @@ +/* + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package common + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "runtime" + "strings" + "time" + + gops "github.com/mitchellh/go-ps" +) + +var ErrWaitPidTimeout = fmt.Errorf("Timed out waiting for PID to complete") + +type WaitPidsOpts struct { + PollInterval time.Duration + Timeout time.Duration + WaitAll bool + CompletedMarkedDirPath string +} + +func Wait(opts WaitPidsOpts) error { + pids, err := GetOtherMainProcesses() + if err != nil { + return err + } + return WaitPIDS(pids, opts) +} + +func GetOtherMainProcesses() ([]int, error) { + pids := []int{} + allProcs, err := gops.Processes() + if err != nil { + return pids, fmt.Errorf("Failed to list processes: %v", err) + } + + thisPID := os.Getpid() + for _, proc := range allProcs { + pid := proc.Pid() + if pid == 1 || pid == thisPID || proc.PPid() != 0 { + // ignore the pause container, our own pid, and non-root processes + continue + } + pids = append(pids, pid) + } + return pids, nil +} + +func WaitPIDS(pids []int, opts ...WaitPidsOpts) error { + if runtime.GOOS != "linux" { + return fmt.Errorf("Platform '%s' unsupported", runtime.GOOS) + } + if len(pids) == 0 { + return nil + } + waitAll := false + var timeout time.Duration + var pollInterval = time.Second + if len(opts) > 0 { + if opts[0].PollInterval != 0 { + pollInterval = opts[0].PollInterval + } + if opts[0].Timeout != 0 { + timeout = opts[0].Timeout + } + waitAll = opts[0].WaitAll + } + + finishedPids := []int{} + + ticker := time.NewTicker(pollInterval) + defer ticker.Stop() + var timoutCh <-chan time.Time + if timeout != 0 { + timoutCh = time.NewTimer(timeout).C + } + for { + select { + case <-ticker.C: + for _, pid := range pids { + path := fmt.Sprintf("/proc/%d", pid) + _, err := os.Stat(path) + if err != nil { + if os.IsNotExist(err) { + if opts[0].CompletedMarkedDirPath != "" { + markFile := filepath.Join(opts[0].CompletedMarkedDirPath, fmt.Sprintf("%d.pid", pid)) + if data, err := ioutil.ReadFile(markFile); err != nil { + return fmt.Errorf("Process %d hadn't completed: %v", pid, err) + } else { + if strings.TrimSpace(string(data)) != TrainingCompleted { + return fmt.Errorf("Process %d hadn't completed", pid) + } + } + } + if waitAll { + finishedPids = append(finishedPids, pid) + if len(finishedPids) == len(pids) { + return nil + } + } else { + return nil + } + } + return fmt.Errorf("Fail to check process info: %v", err) + } + } + case <-timoutCh: + return ErrWaitPidTimeout + } + } +} diff --git a/pkg/metricscollector/v1beta1/common/pns.py b/pkg/metricscollector/v1beta1/common/pns.py new file mode 100644 index 00000000000..04e8ff7758d --- /dev/null +++ b/pkg/metricscollector/v1beta1/common/pns.py @@ -0,0 +1,48 @@ +import os +import psutil +import time + + +def GetOtherMainProcesses(): + this_pid = psutil.Process().pid + pids = set() + for proc in psutil.process_iter(): + pid = proc.pid + ppid = proc.ppid() + if pid == 1 or pid == this_pid or ppid != 0: + # ignore the pause container, our own pid, and non-root processes + continue + pids.add(pid) + return pids + + +def WaitPIDs(pids, poll_interval_seconds=1, timeout_seconds=0, is_wait_all=False, completed_marked_dir=""): + start = 0 + pids = set(pids) + if poll_interval_seconds <= 0: + raise Exception("Poll interval seconds must be a positive integer") + while (timeout_seconds <= 0 or start < timeout_seconds) and len(pids) > 0: + stop_pids = set() + for pid in pids: + path = "/proc/%d" % pid + if os.path.isdir(path): + continue + else: + if completed_marked_dir: + mark_file = os.path.join(completed_marked_dir, "%d.pid" % pid) + with open(mark_file) as file_obj: + contents = file_obj.read() + if contents.strip() != "completed": + raise Exception("Pid %d hadn't completed" % pid) + if is_wait_all: + stop_pids.add(pid) + else: + return + if is_wait_all: + pids = pids - stop_pids + time.sleep(poll_interval_seconds) + start = start + poll_interval_seconds + + +def WaitOtherMainProcesses(poll_interval_seconds=1, timeout_seconds=0, is_wait_all=False, completed_marked_dir=""): + return WaitPIDs(GetOtherMainProcesses(), poll_interval_seconds, timeout_seconds, is_wait_all, completed_marked_dir) diff --git a/pkg/metricscollector/v1beta1/file-metricscollector/file-metricscollector.go b/pkg/metricscollector/v1beta1/file-metricscollector/file-metricscollector.go new file mode 100644 index 00000000000..b3f2f0dc6a5 --- /dev/null +++ b/pkg/metricscollector/v1beta1/file-metricscollector/file-metricscollector.go @@ -0,0 +1,95 @@ +package sidecarmetricscollector + +import ( + "io/ioutil" + "os" + "regexp" + "strings" + "time" + + v1beta1 "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" + "github.com/kubeflow/katib/pkg/metricscollector/v1beta1/common" + "k8s.io/klog" +) + +func CollectObservationLog(fileName string, metrics []string, filters []string) (*v1beta1.ObservationLog, error) { + file, err := os.Open(fileName) + if err != nil { + return nil, err + } + defer file.Close() + content, err := ioutil.ReadAll(file) + logs := string(content) + olog, err := parseLogs(strings.Split(logs, "\n"), metrics, filters) + return olog, err +} + +func parseLogs(logs []string, metrics []string, filters []string) (*v1beta1.ObservationLog, error) { + olog := &v1beta1.ObservationLog{} + metricRegList := getFilterRegexpList(filters) + mlogs := make([]*v1beta1.MetricLog, 0, len(logs)) + + for _, logline := range logs { + // skip line which doesn't contain any metrics keywords, avoiding unnecessary pattern match + isObjLine := false + for _, m := range metrics { + if strings.Contains(logline, m) { + isObjLine = true + break + } + } + if !isObjLine { + continue + } + + timestamp := time.Time{}.UTC().Format(time.RFC3339) + ls := strings.SplitN(logline, " ", 2) + if len(ls) != 2 { + klog.Warningf("Metrics will not have timestamp since %s doesn't begin with timestamp string", logline) + } else { + if _, err := time.Parse(time.RFC3339Nano, ls[0]); err != nil { + klog.Warningf("Metrics will not have timestamp since error parsing time %s: %v", ls[0], err) + } else { + timestamp = ls[0] + } + } + + for _, metricReg := range metricRegList { + matchStrs := metricReg.FindAllStringSubmatch(logline, -1) + for _, kevList := range matchStrs { + if len(kevList) < 3 { + continue + } + name := strings.TrimSpace(kevList[1]) + value := strings.TrimSpace(kevList[2]) + for _, m := range metrics { + if name != m { + continue + } + mlogs = append(mlogs, &v1beta1.MetricLog{ + TimeStamp: timestamp, + Metric: &v1beta1.Metric{ + Name: name, + Value: value, + }, + }) + break + } + } + } + } + olog.MetricLogs = mlogs + return olog, nil +} + +func getFilterRegexpList(filters []string) []*regexp.Regexp { + regexpList := make([]*regexp.Regexp, 0, len(filters)) + if len(filters) == 0 { + filters = append(filters, common.DefaultFilter) + } + for _, filter := range filters { + reg, _ := regexp.Compile(filter) + regexpList = append(regexpList, reg) + } + return regexpList +} diff --git a/pkg/metricscollector/v1beta1/tfevent-metricscollector/__init__.py b/pkg/metricscollector/v1beta1/tfevent-metricscollector/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/pkg/metricscollector/v1beta1/tfevent-metricscollector/tfevent_loader.py b/pkg/metricscollector/v1beta1/tfevent-metricscollector/tfevent_loader.py new file mode 100644 index 00000000000..e0dd7b7dc46 --- /dev/null +++ b/pkg/metricscollector/v1beta1/tfevent-metricscollector/tfevent_loader.py @@ -0,0 +1,67 @@ +import tensorflow as tf +import os +from datetime import datetime +import rfc3339 +import grpc +import api_pb2 +import api_pb2_grpc +import sys +from logging import getLogger, StreamHandler, INFO + +# TFEventFileParser parses tfevent files and returns an ObservationLog of the metrics specified. +# When the event file is under a directory(e.g. test dir), please specify "{{dirname}}/{{metrics name}}" +# For example, in the TensorFlow official tutorial for mnist with summary (https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_with_summaries.py), +# the "accuracy" metric is saved under "train" and "test" directories. So in Katib, please specify name of metrics as "train/accuracy" and "test/accuracy". + + +class TFEventFileParser: + def find_all_files(self, directory): + for root, dirs, files in os.walk(directory): + yield root + for f in files: + yield os.path.join(root, f) + + def parse_summary(self, tfefile, metrics): + metric_logs = [] + for summary in tf.train.summary_iterator(tfefile): + paths = tfefile.split("/") + for v in summary.summary.value: + for m in metrics: + tag = str(v.tag) + if len(paths) >= 2 and len(m.split("/")) >= 2: + tag = str(paths[-2]+"/" + v.tag) + if tag.startswith(m): + ml = api_pb2.MetricLog( + time_stamp=rfc3339.rfc3339(datetime.fromtimestamp(summary.wall_time)), + metric=api_pb2.Metric( + name=m, + value=str(v.simple_value) + ) + ) + metric_logs.append(ml) + return metric_logs + + +class MetricsCollector: + def __init__(self, metric_names): + self.logger = getLogger(__name__) + handler = StreamHandler() + handler.setLevel(INFO) + self.logger.setLevel(INFO) + self.logger.addHandler(handler) + self.logger.propagate = False + self.metrics = metric_names + self.parser = TFEventFileParser() + + def parse_file(self, directory): + mls = [] + for f in self.parser.find_all_files(directory): + if os.path.isdir(f): + continue + try: + self.logger.info(f + " will be parsed.") + mls.extend(self.parser.parse_summary(f, self.metrics)) + except Exception as e: + self.logger.warning("Unexpected error: " + str(e)) + continue + return api_pb2.ObservationLog(metric_logs=mls) diff --git a/pkg/mock/v1beta1/api/manager.go b/pkg/mock/v1beta1/api/manager.go new file mode 100644 index 00000000000..e515274ee43 --- /dev/null +++ b/pkg/mock/v1beta1/api/manager.go @@ -0,0 +1,96 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/kubeflow/katib/pkg/apis/manager/v1beta1 (interfaces: ManagerClient) + +// Package mock is a generated GoMock package. +package mock + +import ( + context "context" + gomock "github.com/golang/mock/gomock" + v1beta1 "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" + grpc "google.golang.org/grpc" + reflect "reflect" +) + +// MockManagerClient is a mock of ManagerClient interface +type MockManagerClient struct { + ctrl *gomock.Controller + recorder *MockManagerClientMockRecorder +} + +// MockManagerClientMockRecorder is the mock recorder for MockManagerClient +type MockManagerClientMockRecorder struct { + mock *MockManagerClient +} + +// NewMockManagerClient creates a new mock instance +func NewMockManagerClient(ctrl *gomock.Controller) *MockManagerClient { + mock := &MockManagerClient{ctrl: ctrl} + mock.recorder = &MockManagerClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockManagerClient) EXPECT() *MockManagerClientMockRecorder { + return m.recorder +} + +// DeleteObservationLog mocks base method +func (m *MockManagerClient) DeleteObservationLog(arg0 context.Context, arg1 *v1beta1.DeleteObservationLogRequest, arg2 ...grpc.CallOption) (*v1beta1.DeleteObservationLogReply, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "DeleteObservationLog", varargs...) + ret0, _ := ret[0].(*v1beta1.DeleteObservationLogReply) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteObservationLog indicates an expected call of DeleteObservationLog +func (mr *MockManagerClientMockRecorder) DeleteObservationLog(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteObservationLog", reflect.TypeOf((*MockManagerClient)(nil).DeleteObservationLog), varargs...) +} + +// GetObservationLog mocks base method +func (m *MockManagerClient) GetObservationLog(arg0 context.Context, arg1 *v1beta1.GetObservationLogRequest, arg2 ...grpc.CallOption) (*v1beta1.GetObservationLogReply, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetObservationLog", varargs...) + ret0, _ := ret[0].(*v1beta1.GetObservationLogReply) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetObservationLog indicates an expected call of GetObservationLog +func (mr *MockManagerClientMockRecorder) GetObservationLog(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObservationLog", reflect.TypeOf((*MockManagerClient)(nil).GetObservationLog), varargs...) +} + +// ReportObservationLog mocks base method +func (m *MockManagerClient) ReportObservationLog(arg0 context.Context, arg1 *v1beta1.ReportObservationLogRequest, arg2 ...grpc.CallOption) (*v1beta1.ReportObservationLogReply, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ReportObservationLog", varargs...) + ret0, _ := ret[0].(*v1beta1.ReportObservationLogReply) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ReportObservationLog indicates an expected call of ReportObservationLog +func (mr *MockManagerClientMockRecorder) ReportObservationLog(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReportObservationLog", reflect.TypeOf((*MockManagerClient)(nil).ReportObservationLog), varargs...) +} diff --git a/pkg/mock/v1beta1/api/suggestion.go b/pkg/mock/v1beta1/api/suggestion.go new file mode 100644 index 00000000000..a7fcc01ba06 --- /dev/null +++ b/pkg/mock/v1beta1/api/suggestion.go @@ -0,0 +1,76 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/kubeflow/katib/pkg/apis/manager/v1beta1 (interfaces: SuggestionClient) + +// Package mock is a generated GoMock package. +package mock + +import ( + context "context" + gomock "github.com/golang/mock/gomock" + v1beta1 "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" + grpc "google.golang.org/grpc" + reflect "reflect" +) + +// MockSuggestionClient is a mock of SuggestionClient interface +type MockSuggestionClient struct { + ctrl *gomock.Controller + recorder *MockSuggestionClientMockRecorder +} + +// MockSuggestionClientMockRecorder is the mock recorder for MockSuggestionClient +type MockSuggestionClientMockRecorder struct { + mock *MockSuggestionClient +} + +// NewMockSuggestionClient creates a new mock instance +func NewMockSuggestionClient(ctrl *gomock.Controller) *MockSuggestionClient { + mock := &MockSuggestionClient{ctrl: ctrl} + mock.recorder = &MockSuggestionClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockSuggestionClient) EXPECT() *MockSuggestionClientMockRecorder { + return m.recorder +} + +// GetSuggestions mocks base method +func (m *MockSuggestionClient) GetSuggestions(arg0 context.Context, arg1 *v1beta1.GetSuggestionsRequest, arg2 ...grpc.CallOption) (*v1beta1.GetSuggestionsReply, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetSuggestions", varargs...) + ret0, _ := ret[0].(*v1beta1.GetSuggestionsReply) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetSuggestions indicates an expected call of GetSuggestions +func (mr *MockSuggestionClientMockRecorder) GetSuggestions(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSuggestions", reflect.TypeOf((*MockSuggestionClient)(nil).GetSuggestions), varargs...) +} + +// ValidateAlgorithmSettings mocks base method +func (m *MockSuggestionClient) ValidateAlgorithmSettings(arg0 context.Context, arg1 *v1beta1.ValidateAlgorithmSettingsRequest, arg2 ...grpc.CallOption) (*v1beta1.ValidateAlgorithmSettingsReply, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ValidateAlgorithmSettings", varargs...) + ret0, _ := ret[0].(*v1beta1.ValidateAlgorithmSettingsReply) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ValidateAlgorithmSettings indicates an expected call of ValidateAlgorithmSettings +func (mr *MockSuggestionClientMockRecorder) ValidateAlgorithmSettings(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValidateAlgorithmSettings", reflect.TypeOf((*MockSuggestionClient)(nil).ValidateAlgorithmSettings), varargs...) +} diff --git a/pkg/mock/v1beta1/db/db.go b/pkg/mock/v1beta1/db/db.go new file mode 100644 index 00000000000..f255a16c8b5 --- /dev/null +++ b/pkg/mock/v1beta1/db/db.go @@ -0,0 +1,103 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/kubeflow/katib/pkg/db/v1beta1/common (interfaces: KatibDBInterface) + +// Package mock is a generated GoMock package. +package mock + +import ( + gomock "github.com/golang/mock/gomock" + v1beta1 "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" + reflect "reflect" +) + +// MockKatibDBInterface is a mock of KatibDBInterface interface +type MockKatibDBInterface struct { + ctrl *gomock.Controller + recorder *MockKatibDBInterfaceMockRecorder +} + +// MockKatibDBInterfaceMockRecorder is the mock recorder for MockKatibDBInterface +type MockKatibDBInterfaceMockRecorder struct { + mock *MockKatibDBInterface +} + +// NewMockKatibDBInterface creates a new mock instance +func NewMockKatibDBInterface(ctrl *gomock.Controller) *MockKatibDBInterface { + mock := &MockKatibDBInterface{ctrl: ctrl} + mock.recorder = &MockKatibDBInterfaceMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockKatibDBInterface) EXPECT() *MockKatibDBInterfaceMockRecorder { + return m.recorder +} + +// DBInit mocks base method +func (m *MockKatibDBInterface) DBInit() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "DBInit") +} + +// DBInit indicates an expected call of DBInit +func (mr *MockKatibDBInterfaceMockRecorder) DBInit() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DBInit", reflect.TypeOf((*MockKatibDBInterface)(nil).DBInit)) +} + +// DeleteObservationLog mocks base method +func (m *MockKatibDBInterface) DeleteObservationLog(arg0 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteObservationLog", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeleteObservationLog indicates an expected call of DeleteObservationLog +func (mr *MockKatibDBInterfaceMockRecorder) DeleteObservationLog(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteObservationLog", reflect.TypeOf((*MockKatibDBInterface)(nil).DeleteObservationLog), arg0) +} + +// GetObservationLog mocks base method +func (m *MockKatibDBInterface) GetObservationLog(arg0, arg1, arg2, arg3 string) (*v1beta1.ObservationLog, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetObservationLog", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*v1beta1.ObservationLog) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetObservationLog indicates an expected call of GetObservationLog +func (mr *MockKatibDBInterfaceMockRecorder) GetObservationLog(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObservationLog", reflect.TypeOf((*MockKatibDBInterface)(nil).GetObservationLog), arg0, arg1, arg2, arg3) +} + +// RegisterObservationLog mocks base method +func (m *MockKatibDBInterface) RegisterObservationLog(arg0 string, arg1 *v1beta1.ObservationLog) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RegisterObservationLog", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// RegisterObservationLog indicates an expected call of RegisterObservationLog +func (mr *MockKatibDBInterfaceMockRecorder) RegisterObservationLog(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RegisterObservationLog", reflect.TypeOf((*MockKatibDBInterface)(nil).RegisterObservationLog), arg0, arg1) +} + +// SelectOne mocks base method +func (m *MockKatibDBInterface) SelectOne() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SelectOne") + ret0, _ := ret[0].(error) + return ret0 +} + +// SelectOne indicates an expected call of SelectOne +func (mr *MockKatibDBInterfaceMockRecorder) SelectOne() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SelectOne", reflect.TypeOf((*MockKatibDBInterface)(nil).SelectOne)) +} diff --git a/pkg/mock/v1beta1/experiment/manifest/generator.go b/pkg/mock/v1beta1/experiment/manifest/generator.go new file mode 100644 index 00000000000..62878b5a3a4 --- /dev/null +++ b/pkg/mock/v1beta1/experiment/manifest/generator.go @@ -0,0 +1,108 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/kubeflow/katib/pkg/controller.v1beta1/experiment/manifest (interfaces: Generator) + +// Package mock is a generated GoMock package. +package mock + +import ( + gomock "github.com/golang/mock/gomock" + v1beta1 "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" + v1beta10 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + reflect "reflect" + client "sigs.k8s.io/controller-runtime/pkg/client" +) + +// MockGenerator is a mock of Generator interface +type MockGenerator struct { + ctrl *gomock.Controller + recorder *MockGeneratorMockRecorder +} + +// MockGeneratorMockRecorder is the mock recorder for MockGenerator +type MockGeneratorMockRecorder struct { + mock *MockGenerator +} + +// NewMockGenerator creates a new mock instance +func NewMockGenerator(ctrl *gomock.Controller) *MockGenerator { + mock := &MockGenerator{ctrl: ctrl} + mock.recorder = &MockGeneratorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockGenerator) EXPECT() *MockGeneratorMockRecorder { + return m.recorder +} + +// GetMetricsCollectorImage mocks base method +func (m *MockGenerator) GetMetricsCollectorImage(arg0 v1beta1.CollectorKind) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetMetricsCollectorImage", arg0) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetMetricsCollectorImage indicates an expected call of GetMetricsCollectorImage +func (mr *MockGeneratorMockRecorder) GetMetricsCollectorImage(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetMetricsCollectorImage", reflect.TypeOf((*MockGenerator)(nil).GetMetricsCollectorImage), arg0) +} + +// GetRunSpec mocks base method +func (m *MockGenerator) GetRunSpec(arg0 *v1beta10.Experiment, arg1, arg2, arg3 string) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetRunSpec", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetRunSpec indicates an expected call of GetRunSpec +func (mr *MockGeneratorMockRecorder) GetRunSpec(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetRunSpec", reflect.TypeOf((*MockGenerator)(nil).GetRunSpec), arg0, arg1, arg2, arg3) +} + +// GetRunSpecWithHyperParameters mocks base method +func (m *MockGenerator) GetRunSpecWithHyperParameters(arg0 *v1beta10.Experiment, arg1, arg2, arg3 string, arg4 []v1beta1.ParameterAssignment) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetRunSpecWithHyperParameters", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetRunSpecWithHyperParameters indicates an expected call of GetRunSpecWithHyperParameters +func (mr *MockGeneratorMockRecorder) GetRunSpecWithHyperParameters(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetRunSpecWithHyperParameters", reflect.TypeOf((*MockGenerator)(nil).GetRunSpecWithHyperParameters), arg0, arg1, arg2, arg3, arg4) +} + +// GetSuggestionConfigData mocks base method +func (m *MockGenerator) GetSuggestionConfigData(arg0 string) (map[string]string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetSuggestionConfigData", arg0) + ret0, _ := ret[0].(map[string]string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetSuggestionConfigData indicates an expected call of GetSuggestionConfigData +func (mr *MockGeneratorMockRecorder) GetSuggestionConfigData(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSuggestionConfigData", reflect.TypeOf((*MockGenerator)(nil).GetSuggestionConfigData), arg0) +} + +// InjectClient mocks base method +func (m *MockGenerator) InjectClient(arg0 client.Client) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "InjectClient", arg0) +} + +// InjectClient indicates an expected call of InjectClient +func (mr *MockGeneratorMockRecorder) InjectClient(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InjectClient", reflect.TypeOf((*MockGenerator)(nil).InjectClient), arg0) +} diff --git a/pkg/mock/v1beta1/experiment/suggestion/suggestion.go b/pkg/mock/v1beta1/experiment/suggestion/suggestion.go new file mode 100644 index 00000000000..7c61ec76617 --- /dev/null +++ b/pkg/mock/v1beta1/experiment/suggestion/suggestion.go @@ -0,0 +1,78 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/kubeflow/katib/pkg/controller.v1beta1/experiment/suggestion (interfaces: Suggestion) + +// Package mock is a generated GoMock package. +package mock + +import ( + gomock "github.com/golang/mock/gomock" + v1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + v1beta10 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1" + reflect "reflect" +) + +// MockSuggestion is a mock of Suggestion interface +type MockSuggestion struct { + ctrl *gomock.Controller + recorder *MockSuggestionMockRecorder +} + +// MockSuggestionMockRecorder is the mock recorder for MockSuggestion +type MockSuggestionMockRecorder struct { + mock *MockSuggestion +} + +// NewMockSuggestion creates a new mock instance +func NewMockSuggestion(ctrl *gomock.Controller) *MockSuggestion { + mock := &MockSuggestion{ctrl: ctrl} + mock.recorder = &MockSuggestionMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockSuggestion) EXPECT() *MockSuggestionMockRecorder { + return m.recorder +} + +// GetOrCreateSuggestion mocks base method +func (m *MockSuggestion) GetOrCreateSuggestion(arg0 *v1beta1.Experiment, arg1 int32) (*v1beta10.Suggestion, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetOrCreateSuggestion", arg0, arg1) + ret0, _ := ret[0].(*v1beta10.Suggestion) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetOrCreateSuggestion indicates an expected call of GetOrCreateSuggestion +func (mr *MockSuggestionMockRecorder) GetOrCreateSuggestion(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetOrCreateSuggestion", reflect.TypeOf((*MockSuggestion)(nil).GetOrCreateSuggestion), arg0, arg1) +} + +// UpdateSuggestion mocks base method +func (m *MockSuggestion) UpdateSuggestion(arg0 *v1beta10.Suggestion) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateSuggestion", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// UpdateSuggestion indicates an expected call of UpdateSuggestion +func (mr *MockSuggestionMockRecorder) UpdateSuggestion(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateSuggestion", reflect.TypeOf((*MockSuggestion)(nil).UpdateSuggestion), arg0) +} + +// UpdateSuggestionStatus mocks base method +func (m *MockSuggestion) UpdateSuggestionStatus(arg0 *v1beta10.Suggestion) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateSuggestionStatus", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// UpdateSuggestionStatus indicates an expected call of UpdateSuggestionStatus +func (mr *MockSuggestionMockRecorder) UpdateSuggestionStatus(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateSuggestionStatus", reflect.TypeOf((*MockSuggestion)(nil).UpdateSuggestionStatus), arg0) +} diff --git a/pkg/mock/v1beta1/trial/managerclient/katibmanager.go b/pkg/mock/v1beta1/trial/managerclient/katibmanager.go new file mode 100644 index 00000000000..0a9d81fa544 --- /dev/null +++ b/pkg/mock/v1beta1/trial/managerclient/katibmanager.go @@ -0,0 +1,65 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/kubeflow/katib/pkg/controller.v1beta1/trial/managerclient (interfaces: ManagerClient) + +// Package mock is a generated GoMock package. +package mock + +import ( + gomock "github.com/golang/mock/gomock" + v1beta1 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" + v1beta10 "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" + reflect "reflect" +) + +// MockManagerClient is a mock of ManagerClient interface +type MockManagerClient struct { + ctrl *gomock.Controller + recorder *MockManagerClientMockRecorder +} + +// MockManagerClientMockRecorder is the mock recorder for MockManagerClient +type MockManagerClientMockRecorder struct { + mock *MockManagerClient +} + +// NewMockManagerClient creates a new mock instance +func NewMockManagerClient(ctrl *gomock.Controller) *MockManagerClient { + mock := &MockManagerClient{ctrl: ctrl} + mock.recorder = &MockManagerClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockManagerClient) EXPECT() *MockManagerClientMockRecorder { + return m.recorder +} + +// DeleteTrialObservationLog mocks base method +func (m *MockManagerClient) DeleteTrialObservationLog(arg0 *v1beta1.Trial) (*v1beta10.DeleteObservationLogReply, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteTrialObservationLog", arg0) + ret0, _ := ret[0].(*v1beta10.DeleteObservationLogReply) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteTrialObservationLog indicates an expected call of DeleteTrialObservationLog +func (mr *MockManagerClientMockRecorder) DeleteTrialObservationLog(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteTrialObservationLog", reflect.TypeOf((*MockManagerClient)(nil).DeleteTrialObservationLog), arg0) +} + +// GetTrialObservationLog mocks base method +func (m *MockManagerClient) GetTrialObservationLog(arg0 *v1beta1.Trial) (*v1beta10.GetObservationLogReply, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetTrialObservationLog", arg0) + ret0, _ := ret[0].(*v1beta10.GetObservationLogReply) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetTrialObservationLog indicates an expected call of GetTrialObservationLog +func (mr *MockManagerClientMockRecorder) GetTrialObservationLog(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTrialObservationLog", reflect.TypeOf((*MockManagerClient)(nil).GetTrialObservationLog), arg0) +} diff --git a/pkg/mock/v1beta1/util/katibclient/katibclient.go b/pkg/mock/v1beta1/util/katibclient/katibclient.go new file mode 100644 index 00000000000..cb327159acd --- /dev/null +++ b/pkg/mock/v1beta1/util/katibclient/katibclient.go @@ -0,0 +1,288 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/kubeflow/katib/pkg/util/v1beta1/katibclient (interfaces: Client) + +// Package mock is a generated GoMock package. +package mock + +import ( + gomock "github.com/golang/mock/gomock" + v1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + v1beta10 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1" + v1beta11 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" + v1 "k8s.io/api/core/v1" + reflect "reflect" + client "sigs.k8s.io/controller-runtime/pkg/client" +) + +// MockClient is a mock of Client interface +type MockClient struct { + ctrl *gomock.Controller + recorder *MockClientMockRecorder +} + +// MockClientMockRecorder is the mock recorder for MockClient +type MockClientMockRecorder struct { + mock *MockClient +} + +// NewMockClient creates a new mock instance +func NewMockClient(ctrl *gomock.Controller) *MockClient { + mock := &MockClient{ctrl: ctrl} + mock.recorder = &MockClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockClient) EXPECT() *MockClientMockRecorder { + return m.recorder +} + +// CreateExperiment mocks base method +func (m *MockClient) CreateExperiment(arg0 *v1beta1.Experiment, arg1 ...string) error { + m.ctrl.T.Helper() + varargs := []interface{}{arg0} + for _, a := range arg1 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "CreateExperiment", varargs...) + ret0, _ := ret[0].(error) + return ret0 +} + +// CreateExperiment indicates an expected call of CreateExperiment +func (mr *MockClientMockRecorder) CreateExperiment(arg0 interface{}, arg1 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0}, arg1...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateExperiment", reflect.TypeOf((*MockClient)(nil).CreateExperiment), varargs...) +} + +// DeleteExperiment mocks base method +func (m *MockClient) DeleteExperiment(arg0 *v1beta1.Experiment, arg1 ...string) error { + m.ctrl.T.Helper() + varargs := []interface{}{arg0} + for _, a := range arg1 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "DeleteExperiment", varargs...) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeleteExperiment indicates an expected call of DeleteExperiment +func (mr *MockClientMockRecorder) DeleteExperiment(arg0 interface{}, arg1 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0}, arg1...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteExperiment", reflect.TypeOf((*MockClient)(nil).DeleteExperiment), varargs...) +} + +// GetClient mocks base method +func (m *MockClient) GetClient() client.Client { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetClient") + ret0, _ := ret[0].(client.Client) + return ret0 +} + +// GetClient indicates an expected call of GetClient +func (mr *MockClientMockRecorder) GetClient() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetClient", reflect.TypeOf((*MockClient)(nil).GetClient)) +} + +// GetConfigMap mocks base method +func (m *MockClient) GetConfigMap(arg0 string, arg1 ...string) (map[string]string, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0} + for _, a := range arg1 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetConfigMap", varargs...) + ret0, _ := ret[0].(map[string]string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetConfigMap indicates an expected call of GetConfigMap +func (mr *MockClientMockRecorder) GetConfigMap(arg0 interface{}, arg1 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0}, arg1...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetConfigMap", reflect.TypeOf((*MockClient)(nil).GetConfigMap), varargs...) +} + +// GetExperiment mocks base method +func (m *MockClient) GetExperiment(arg0 string, arg1 ...string) (*v1beta1.Experiment, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0} + for _, a := range arg1 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetExperiment", varargs...) + ret0, _ := ret[0].(*v1beta1.Experiment) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetExperiment indicates an expected call of GetExperiment +func (mr *MockClientMockRecorder) GetExperiment(arg0 interface{}, arg1 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0}, arg1...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetExperiment", reflect.TypeOf((*MockClient)(nil).GetExperiment), varargs...) +} + +// GetExperimentList mocks base method +func (m *MockClient) GetExperimentList(arg0 ...string) (*v1beta1.ExperimentList, error) { + m.ctrl.T.Helper() + varargs := []interface{}{} + for _, a := range arg0 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetExperimentList", varargs...) + ret0, _ := ret[0].(*v1beta1.ExperimentList) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetExperimentList indicates an expected call of GetExperimentList +func (mr *MockClientMockRecorder) GetExperimentList(arg0 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetExperimentList", reflect.TypeOf((*MockClient)(nil).GetExperimentList), arg0...) +} + +// GetNamespaceList mocks base method +func (m *MockClient) GetNamespaceList() (*v1.NamespaceList, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetNamespaceList") + ret0, _ := ret[0].(*v1.NamespaceList) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetNamespaceList indicates an expected call of GetNamespaceList +func (mr *MockClientMockRecorder) GetNamespaceList() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNamespaceList", reflect.TypeOf((*MockClient)(nil).GetNamespaceList)) +} + +// GetSuggestion mocks base method +func (m *MockClient) GetSuggestion(arg0 string, arg1 ...string) (*v1beta10.Suggestion, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0} + for _, a := range arg1 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetSuggestion", varargs...) + ret0, _ := ret[0].(*v1beta10.Suggestion) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetSuggestion indicates an expected call of GetSuggestion +func (mr *MockClientMockRecorder) GetSuggestion(arg0 interface{}, arg1 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0}, arg1...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSuggestion", reflect.TypeOf((*MockClient)(nil).GetSuggestion), varargs...) +} + +// GetTrial mocks base method +func (m *MockClient) GetTrial(arg0 string, arg1 ...string) (*v1beta11.Trial, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0} + for _, a := range arg1 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetTrial", varargs...) + ret0, _ := ret[0].(*v1beta11.Trial) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetTrial indicates an expected call of GetTrial +func (mr *MockClientMockRecorder) GetTrial(arg0 interface{}, arg1 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0}, arg1...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTrial", reflect.TypeOf((*MockClient)(nil).GetTrial), varargs...) +} + +// GetTrialList mocks base method +func (m *MockClient) GetTrialList(arg0 string, arg1 ...string) (*v1beta11.TrialList, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0} + for _, a := range arg1 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetTrialList", varargs...) + ret0, _ := ret[0].(*v1beta11.TrialList) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetTrialList indicates an expected call of GetTrialList +func (mr *MockClientMockRecorder) GetTrialList(arg0 interface{}, arg1 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0}, arg1...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTrialList", reflect.TypeOf((*MockClient)(nil).GetTrialList), varargs...) +} + +// GetTrialTemplates mocks base method +func (m *MockClient) GetTrialTemplates(arg0 ...string) (*v1.ConfigMapList, error) { + m.ctrl.T.Helper() + varargs := []interface{}{} + for _, a := range arg0 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetTrialTemplates", varargs...) + ret0, _ := ret[0].(*v1.ConfigMapList) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetTrialTemplates indicates an expected call of GetTrialTemplates +func (mr *MockClientMockRecorder) GetTrialTemplates(arg0 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTrialTemplates", reflect.TypeOf((*MockClient)(nil).GetTrialTemplates), arg0...) +} + +// InjectClient mocks base method +func (m *MockClient) InjectClient(arg0 client.Client) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "InjectClient", arg0) +} + +// InjectClient indicates an expected call of InjectClient +func (mr *MockClientMockRecorder) InjectClient(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InjectClient", reflect.TypeOf((*MockClient)(nil).InjectClient), arg0) +} + +// UpdateConfigMap mocks base method +func (m *MockClient) UpdateConfigMap(arg0 *v1.ConfigMap) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateConfigMap", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// UpdateConfigMap indicates an expected call of UpdateConfigMap +func (mr *MockClientMockRecorder) UpdateConfigMap(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateConfigMap", reflect.TypeOf((*MockClient)(nil).UpdateConfigMap), arg0) +} + +// UpdateExperiment mocks base method +func (m *MockClient) UpdateExperiment(arg0 *v1beta1.Experiment, arg1 ...string) error { + m.ctrl.T.Helper() + varargs := []interface{}{arg0} + for _, a := range arg1 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "UpdateExperiment", varargs...) + ret0, _ := ret[0].(error) + return ret0 +} + +// UpdateExperiment indicates an expected call of UpdateExperiment +func (mr *MockClientMockRecorder) UpdateExperiment(arg0 interface{}, arg1 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0}, arg1...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateExperiment", reflect.TypeOf((*MockClient)(nil).UpdateExperiment), varargs...) +} diff --git a/pkg/suggestion/v1beta1/bayesianoptimization/__init__.py b/pkg/suggestion/v1beta1/bayesianoptimization/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/pkg/suggestion/v1beta1/bayesianoptimization/acquisition_func.py b/pkg/suggestion/v1beta1/bayesianoptimization/acquisition_func.py new file mode 100644 index 00000000000..9e061c6bd76 --- /dev/null +++ b/pkg/suggestion/v1beta1/bayesianoptimization/acquisition_func.py @@ -0,0 +1,36 @@ +""" module for acquisition function""" +import numpy as np +from scipy.stats import norm + + +class AcquisitionFunc: + """ + Class for acquisition function with options for expected improvement, + probability of improvement, or lower confident bound. + """ + + def __init__(self, model, current_optimal, mode="ei", trade_off=0.01): + """ + :param mode: pi: probability of improvement, ei: expected improvement, lcb: lower confident bound + :param trade_off: a parameter to control the trade off between exploiting and exploring + :param model_type: gp: gaussian process, rf: random forest + """ + self.model = model + self.current_optimal = current_optimal + self.mode = mode + self.trade_off = trade_off + + def compute(self, X_test): + y_mean, y_std, y_variance = self.model.predict(X_test) + + z = (y_mean - self.current_optimal - self.trade_off) / y_std + + if self.mode == "ei": + if y_std.any() < 0.000001: + return 0, y_mean, y_variance + result = y_std * (z * norm.cdf(z) + norm.pdf(z)) + elif self.mode == "pi": + result = norm.cdf(z) + else: + result = - (y_mean - self.trade_off * y_std) + return np.squeeze(result), np.squeeze(y_mean), np.squeeze(y_variance) diff --git a/pkg/suggestion/v1beta1/bayesianoptimization/algorithm_manager.py b/pkg/suggestion/v1beta1/bayesianoptimization/algorithm_manager.py new file mode 100644 index 00000000000..912bc5df9f5 --- /dev/null +++ b/pkg/suggestion/v1beta1/bayesianoptimization/algorithm_manager.py @@ -0,0 +1,201 @@ +""" module for algorithm manager """ +import numpy as np + +from pkg.apis.manager.v1beta1.python import api_pb2 + +from pkg.suggestion.v1beta1.bayesianoptimization.utils import get_logger + + +def deal_with_discrete(feasible_values, current_value): + """ function to embed the current values to the feasible discrete space""" + diff = np.subtract(feasible_values, current_value) + diff = np.absolute(diff) + return feasible_values[np.argmin(diff)] + + +def deal_with_categorical(feasible_values, one_hot_values): + """ function to do the one hot encoding of the categorical values """ + index = np.argmax(one_hot_values) + #index = one_hot_values.argmax() + return feasible_values[int(index)] + + +class AlgorithmManager: + """ class for the algorithm manager + provide some helper functions + """ + + def __init__(self, experiment_name, experiment, parameter_config, X_train, y_train, logger=None): + self.logger = logger if (logger is not None) else get_logger() + self._experiment_name = experiment_name + self._experiment = experiment + self._goal = self._experiment.spec.objective.type + self._dim = parameter_config.dim + self._lowerbound = parameter_config.lower_bounds + self._upperbound = parameter_config.upper_bounds + self._types = parameter_config.parameter_types + self._names = parameter_config.names + # record all the feasible values of discrete type variables + self._discrete_info = parameter_config.discrete_info + self._categorical_info = parameter_config.categorical_info + self._name_id = parameter_config.name_ids + + self._X_train = self._mapping_params(X_train) + self.parse_X() + + self._y_train = y_train + self._parse_metric() + + @property + def experiment_name(self): + """ return the experiment_name """ + return self._experiment_name + + @property + def experiment(self): + """ return the experiment """ + return self._experiment + + @property + def goal(self): + """ return the optimization goal""" + return self._goal + + @property + def dim(self): + """ return the dimension """ + return self._dim + + @property + def lower_bound(self): + """ return the lower bound of all the parameters """ + return self._lowerbound + + @property + def upper_bound(self): + """ return the upper bound of all the parameters """ + return self._upperbound + + @property + def types(self): + """ return the types of all the parameters """ + return self._types + + @property + def names(self): + """ return the names of all the parameters """ + return self._names + + @property + def discrete_info(self): + """ return the info of all the discrete parameters """ + return self._discrete_info + + @property + def categorical_info(self): + """ return the info of all the categorical parameters """ + return self._categorical_info + + @property + def X_train(self): + """ return the training data """ + return self._X_train + + @property + def y_train(self): + """ return the target of the training data""" + return self._y_train + + def _mapping_params(self, parameters_list): + if len(parameters_list) == 0: + return None + ret = [] + for parameters in parameters_list: + maplist = [np.zeros(1)]*len(self._names) + for p in parameters: + self.logger.debug("mapping: %r", p, extra={ + "Experiment": self._experiment_name}) + map_id = self._name_id[p.name] + if self._types[map_id] in [api_pb2.DOUBLE, api_pb2.INT, api_pb2.DISCRETE]: + maplist[map_id] = float(p.value) + elif self._types[map_id] == api_pb2.CATEGORICAL: + for ci in self._categorical_info: + if ci["name"] == p.name: + maplist[map_id] = np.zeros(ci["number"]) + for i, v in enumerate(ci["values"]): + if v == p.value: + maplist[map_id][i] = 1 + break + self.logger.debug("mapped: %r", maplist, extra={ + "Experiment": self._experiment_name}) + ret.append(np.hstack(maplist)) + return ret + + def _parse_metric(self): + """ parse the metric to the dictionary """ + self.logger.info("Ytrain: %r", self._y_train, extra={ + "Experiment": self._experiment_name}) + if not self._y_train: + self._y_train = None + return + y = [] + for metric in self._y_train: + if self._goal == api_pb2.MAXIMIZE: + y.append(float(metric)) + else: + y.append(-float(metric)) + self.logger.debug("Ytrain: %r", y, extra={ + "Experiment": self._experiment_name}) + self._y_train = np.array(y) + + def parse_X(self): + if not self._X_train: + self._X_train = None + return + self.logger.debug("Xtrain: %r", self._X_train, extra={ + "Experiment": self._experiment_name}) + self._X_train = np.array(self._X_train) + + def parse_x_next(self, x_next): + """ parse the next suggestion to the proper format """ + counter = 0 + result = [] + for i in range(len(self._types)): + if self._types[i] == api_pb2.INT: + result.append(int(round(x_next[counter], 0))) + counter = counter + 1 + elif self._types[i] == api_pb2.DISCRETE: + for param in self._discrete_info: + if param["name"] == self._names[i]: + result.append( + deal_with_discrete( + param["values"], x_next[counter]) + ) + counter = counter + 1 + break + elif self._types[i] == api_pb2.CATEGORICAL: + for param in self._categorical_info: + if param["name"] == self._names[i]: + result.append(deal_with_categorical( + feasible_values=param["values"], + one_hot_values=x_next[counter:counter + + param["number"]], + )) + counter = counter + param["number"] + break + elif self._types[i] == api_pb2.DOUBLE: + result.append(x_next[counter]) + counter = counter + 1 + return result + + def convert_to_dict(self, x_next): + """ convert the next suggestion to the dictionary """ + result = [] + for i in range(len(x_next)): + tmp = dict({ + "name": self._names[i], + "value": x_next[i], + "type": self._types[i], + }) + result.append(tmp) + return result diff --git a/pkg/suggestion/v1beta1/bayesianoptimization/bayesian_optimization_algorithm.py b/pkg/suggestion/v1beta1/bayesianoptimization/bayesian_optimization_algorithm.py new file mode 100644 index 00000000000..02daf7f70cc --- /dev/null +++ b/pkg/suggestion/v1beta1/bayesianoptimization/bayesian_optimization_algorithm.py @@ -0,0 +1,73 @@ +""" module for bayesian optimization algorithm """ +import numpy as np +from sklearn.preprocessing import MinMaxScaler + +from pkg.suggestion.v1beta1.bayesianoptimization.global_optimizer import GlobalOptimizer + + +class BOAlgorithm: + """ class for bayesian optimization """ + + def __init__(self, experiment_name, dim, N, lowerbound, upperbound, X_train, y_train, mode, trade_off, + length_scale, noise, nu, kernel_type, n_estimators, max_features, model_type, logger=None): + # np.random.seed(0) + self._experiment_name = experiment_name + self.dim = dim + self.N = N or 100 + self.l = np.zeros((1, dim)) + self.u = np.ones((1, dim)) + self.lowerbound = lowerbound.reshape(1, dim) + self.upperbound = upperbound.reshape(1, dim) + self.logger = logger + + # normalize the upperbound and lowerbound to [0, 1] + self.scaler = MinMaxScaler() + self.scaler.fit(np.append(self.lowerbound, self.upperbound, axis=0)) + + self.X_train = X_train + self.y_train = y_train + if self.y_train is None: + self.current_optimal = None + else: + self.current_optimal = max(self.y_train) + self.logger.debug("create optimizer", extra={ + "Experiment": self._experiment_name}) + # initialize the global optimizer + self.optimizer = GlobalOptimizer( + N, + self.l, + self.u, + self.scaler, + self.X_train, + self.y_train, + self.current_optimal, + experiment_name=self._experiment_name, + mode=mode, + trade_off=trade_off, + length_scale=length_scale, + noise=noise, + nu=nu, + kernel_type=kernel_type, + n_estimators=n_estimators, + max_features=max_features, + model_type=model_type, + logger=logger, + ) + self.logger.debug("optimizer created", extra={ + "Experiment": self._experiment_name}) + + def get_suggestion(self, request_num): + """ main function to provide suggestion """ + x_next_list = [] + if self.X_train is None and self.y_train is None and self.current_optimal is None: + # randomly pick a point as the first trial + for _ in range(request_num): + x_next_list.append(np.random.uniform( + self.lowerbound, self.upperbound, size=(1, self.dim))) + else: + _, x_next_list_que = self.optimizer.direct(request_num) + for xn in x_next_list_que: + x = np.array(xn).reshape(1, self.dim) + x = self.scaler.inverse_transform(x) + x_next_list.append(x) + return x_next_list diff --git a/pkg/suggestion/v1beta1/bayesianoptimization/global_optimizer.py b/pkg/suggestion/v1beta1/bayesianoptimization/global_optimizer.py new file mode 100644 index 00000000000..541da8539f3 --- /dev/null +++ b/pkg/suggestion/v1beta1/bayesianoptimization/global_optimizer.py @@ -0,0 +1,309 @@ +""" module for the global optimizer +DIRECT algorithm is used in this case +""" +import copy + +import numpy as np + +from pkg.suggestion.v1beta1.bayesianoptimization.acquisition_func import AcquisitionFunc +from pkg.suggestion.v1beta1.bayesianoptimization.model.gp import GaussianProcessModel +from pkg.suggestion.v1beta1.bayesianoptimization.model.rf import RandomForestModel +from pkg.suggestion.v1beta1.bayesianoptimization.utils import get_logger + + +class RectPack: + """ class for the rectangular + including border, center and acquisition function value + """ + + def __init__(self, l, u, division_num, dim, scaler, aq_func): + self.l = l + self.u = u + self.center = (l + u) / 2 + j = np.mod(division_num, dim) + k = (division_num - j) / dim + self.d = np.sqrt(j * np.power(3, float(-2 * (k + 1))) + + (dim - j) * np.power(3, float(-2 * k))) / 2 + self.division_num = division_num + self.fc, _, _ = aq_func.compute(scaler.inverse_transform(self.center)) + self.fc = -self.fc + + +class RectBucket: + """ class for the rectangular bucket + rectangular with the same size are put in the same bucket + the rectangular is sorted by the acquisition function value + """ + + def __init__(self, diff, pack): + self.diff = diff + self.array = [pack] + + def insert(self, new_pack): + """ insert a new rectangular to a bucket """ + for i in range(len(self.array)): + if new_pack.fc < self.array[i].fc: + self.array.insert(i, new_pack) + return + self.array.append(new_pack) + + def delete(self): + """ delete the first rectangular""" + del self.array[0] + + def diff_exist(self, diff): + """ detect the size difference """ + return abs(self.diff - diff) < 0.00001 + + +class OptimalPoint: + """ helper class to find potential optimal points""" + + def __init__(self, point, prev, slope): + self.point = point + self.prev = prev + self.slope = slope + + +class DimPack: + def __init__(self, dim, fc): + self.dim = dim + self.fc = fc + + +class GlobalOptimizer: + """ class for the global optimizer """ + + def __init__(self, N, l, u, scaler, X_train, y_train, current_optimal, + experiment_name, mode, trade_off, length_scale, + noise, nu, kernel_type, n_estimators, max_features, model_type, logger=None): + self.logger = logger if (logger is not None) else get_logger() + self.N = N + self.l = l + self.u = u + self.scaler = scaler + self.buckets = [] + self.dim = None + self._experiment_name = experiment_name + if model_type == "gp": + model = GaussianProcessModel( + length_scale=length_scale, + noise=noise, + nu=nu, + kernel_type=kernel_type, + ) + else: + model = RandomForestModel( + n_estimators=n_estimators, + max_features=max_features, + ) + self.logger.debug("before model fit", extra={ + "Experiment": self._experiment_name}) + model.fit(X_train, y_train) + self.logger.debug("after model fit", extra={ + "Experiment": self._experiment_name}) + self.aq_func = AcquisitionFunc( + model=model, + current_optimal=current_optimal, + mode=mode, + trade_off=trade_off, + ) + + def potential_opt(self, f_min): + """ find the potential optimal rectangular """ + b = [] + for i in range(len(self.buckets)): + b.append(self.buckets[i].array[0]) + b.sort(key=lambda x: x.d) + index = 0 + min_fc = b[0].fc + for i in range(len(b)): + if b[i].fc < min_fc: + min_fc = b[i].fc + index = i + + opt_list = [OptimalPoint(b[index], 0, 0)] + for i in range(index + 1, len(b)): + prev = len(opt_list) - 1 + diff1 = b[i].d + diff2 = opt_list[prev].point.d + current_slope = ( + b[i].fc - opt_list[prev].point.fc) / (diff1 - diff2) + prev_slope = opt_list[prev].slope + + while prev >= 0 and current_slope < prev_slope: + temp = opt_list[prev].prev + opt_list[prev].prev = -1 + prev = temp + prev_slope = opt_list[prev].slope + diff1 = b[i].d + diff2 = opt_list[prev].point.d + current_slope = ( + b[i].fc - opt_list[prev].point.fc) / (diff1 - diff2) + + opt_list.append(OptimalPoint(b[i], prev, current_slope)) + + opt_list2 = [] + for i in range(len(opt_list)): + if opt_list[i].prev != -1: + opt_list2.append(opt_list[i]) + + for i in range(len(opt_list2) - 1): + c1 = opt_list2[i].point.d + c2 = opt_list2[i + 1].point.d + fc1 = opt_list2[i].point.fc + fc2 = opt_list2[i + 1].point.fc + if fc1 - c1 * (fc1 - fc2) / (c1 - c2) > (1 - 0.001) * f_min: + # if abs(fc1-fc2)<0.0001: + opt_list2[i] = None + while None in opt_list2: + index = opt_list2.index(None) + del opt_list2[index] + # for opt in opt_list2: + # print(opt.point.fc) + return opt_list2 + + def direct(self, request_num): + """ main algorithm """ + self.dim = self.l.shape[1] + division_num = 0 + + # create the first rectangle and put it in the first bucket + first_rect = RectPack(self.l, self.u, division_num, self.dim, + self.scaler, self.aq_func) + self.buckets.append(RectBucket(first_rect.d, first_rect)) + + ei_min = [] + f_min = first_rect.fc + x_next = first_rect.center + ei_min.append(f_min) + + for _ in range(self.N): + opt_set = self.potential_opt(f_min) + + # for bucket in self.buckets: + # for i in range(len(bucket.array)): + # print(bucket.array[i].fc) + # plt.plot(bucket.diff, bucket.array[i].fc, 'b.') + # + # for opt in opt_set: + # plt.plot(opt.point.d, opt.point.fc, 'r.') + # plt.show() + + for opt in opt_set: + f_min, x_next = self.divide_rect( + opt.point, + f_min, + x_next, + self.aq_func, + self.scaler + ) + for bucket in self.buckets: + if bucket.diff_exist(opt.point.d): + bucket.delete() + if not bucket.array: + index = self.buckets.index(bucket) + del self.buckets[index] + ei_min.append(f_min) + x_next_candidate = self.sample_buckets(request_num) + return f_min, x_next_candidate + + def sample_buckets(self, request_num): + self.logger.debug("In lne self.buckets: %r", len(self.buckets)) + bucket_index = [] + fc_sum = 0.0 + x_next_candidate = [] + for bucket in self.buckets: + for a in bucket.array: + self.logger.debug("fc: %r, %r", a.fc, a.center) + fc_sum -= a.fc + bucket_index.append([-a.fc, a.center]) + bucket_index = sorted(bucket_index, key=lambda x: x[0]) + for _ in range(request_num): + sample = np.random.rand() + stick = 0.0 + for b in bucket_index: + stick += b[0]/fc_sum + if stick > sample: + x_next_candidate.append(b[1]) + break + return x_next_candidate + + def divide_rect(self, opt_rect, f_min, x_next, aq_func, scaler): + """ divide the rectangular into smaller ones """ + rect = copy.deepcopy(opt_rect) + division_num = rect.division_num + j = np.mod(division_num, self.dim) + k = (division_num - j) / self.dim + max_side_len = np.power(3, float(-k)) + delta = max_side_len / 3 + dim_set = [] + for i in range(self.dim): + if abs(max_side_len - (rect.u[0, i] - rect.l[0, i])) < 0.0000001: + dim_set.append(i) + + dim_list = [] + for i in dim_set: + e = np.zeros((1, self.dim)) + e[0, i] = 1 + function_value = min( + aq_func.compute(scaler.inverse_transform( + rect.center + delta * e)), + aq_func.compute(scaler.inverse_transform( + rect.center - delta * e)) + ) + dim_list.append(DimPack(i, function_value)) + dim_list.sort(key=lambda x: x.fc) + + for i in range(len(dim_list)): + division_num = division_num + 1 + temp = np.zeros((1, self.dim)) + temp[0, dim_list[i].dim] = delta + left_rect = RectPack( + rect.l, + rect.u - 2 * temp, + division_num, + self.dim, + self.scaler, + aq_func + ) + middle_rect = RectPack( + rect.l + temp, + rect.u - temp, + division_num, + self.dim, + self.scaler, + aq_func + ) + right_rect = RectPack( + rect.l + 2 * temp, + rect.u, + division_num, + self.dim, + self.scaler, + aq_func + ) + if left_rect.fc < f_min: + f_min = left_rect.fc + x_next = left_rect.center + if right_rect.fc < f_min: + f_min = right_rect.fc + x_next = right_rect.center + + insert = 0 + for bucket in self.buckets: + if bucket.diff_exist(left_rect.d): + bucket.insert(left_rect) + bucket.insert(right_rect) + if i == len(dim_list) - 1: + bucket.insert(middle_rect) + insert = 1 + break + if insert == 0: + new_bucket = RectBucket(left_rect.d, left_rect) + new_bucket.insert(right_rect) + if i == len(dim_list) - 1: + new_bucket.insert(middle_rect) + self.buckets.append(new_bucket) + rect = middle_rect + return f_min, x_next diff --git a/pkg/suggestion/v1beta1/bayesianoptimization/model/__init__.py b/pkg/suggestion/v1beta1/bayesianoptimization/model/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/pkg/suggestion/v1beta1/bayesianoptimization/model/gp.py b/pkg/suggestion/v1beta1/bayesianoptimization/model/gp.py new file mode 100644 index 00000000000..446238c0669 --- /dev/null +++ b/pkg/suggestion/v1beta1/bayesianoptimization/model/gp.py @@ -0,0 +1,38 @@ +""" module for gaussian process prior """ +from sklearn.gaussian_process.kernels import RBF, Matern +from sklearn.gaussian_process import GaussianProcessRegressor + + +class GaussianProcessModel: + """ use the gaussian process as a prior """ + def __init__(self, length_scale=0.5, noise=0.00005, + nu=1.5, kernel_type="matern"): + """ + :param length_scale: the larger the length_scale is, the smoother the gaussian prior is. If a float, + an isotropic kernel is used. If an array, an anisotropic kernel is used where each dimension of it defines + the length-scale of the respective feature dimension. + :param noise: + :param nu: control the smoothness of the prior using Matern kernel. The larger nu is, the smoother the + approximate function is. + :param kernel_type: "rbf": squared exponential kernel, "matern": Matern kernel. + """ + if kernel_type == "rbf": + kernel = RBF(length_scale=length_scale) + elif kernel_type == "matern": + kernel = Matern(length_scale=length_scale, nu=nu) + else: + raise Exception("kernel_type must be 'rbf' or 'matern'") + self.gp = GaussianProcessRegressor( + kernel=kernel, + alpha=noise, + random_state=0, + optimizer=None, + ) + + def fit(self, X_train, y_train): + self.gp.fit(X_train, y_train) + + def predict(self, X_test): + y_mean, y_std = self.gp.predict(X_test, return_std=True) + y_variance = y_std ** 2 + return y_mean, y_std, y_variance diff --git a/pkg/suggestion/v1beta1/bayesianoptimization/model/rf.py b/pkg/suggestion/v1beta1/bayesianoptimization/model/rf.py new file mode 100644 index 00000000000..8778b921e78 --- /dev/null +++ b/pkg/suggestion/v1beta1/bayesianoptimization/model/rf.py @@ -0,0 +1,24 @@ +import numpy as np +import forestci as fci +from sklearn.ensemble import RandomForestRegressor + + +class RandomForestModel: + + def __init__(self, n_estimators=50, max_features="auto"): + self.rf = RandomForestRegressor( + n_estimators=n_estimators, + max_features=max_features, + ) + self.X_train = None + + def fit(self, X_train, y_train): + print(X_train.shape, y_train.shape) + self.X_train = X_train + self.rf.fit(X_train, y_train) + + def predict(self, X_test): + y_mean = self.rf.predict(X_test) + y_variance = fci.random_forest_error(self.rf, self.X_train, X_test) + y_std = np.sqrt(y_variance) + return y_mean, y_std, y_variance diff --git a/pkg/suggestion/v1beta1/bayesianoptimization/utils.py b/pkg/suggestion/v1beta1/bayesianoptimization/utils.py new file mode 100644 index 00000000000..a63bfb3b169 --- /dev/null +++ b/pkg/suggestion/v1beta1/bayesianoptimization/utils.py @@ -0,0 +1,17 @@ +import os +import logging +from logging import getLogger, StreamHandler + + +FORMAT = '%(asctime)-15s Experiment %(experiment_name)s %(message)s' +LOG_LEVEL = os.environ.get("LOG_LEVEL", "INFO") + + +def get_logger(name=__name__): + logger = getLogger(name) + logging.basicConfig(format=FORMAT) + handler = StreamHandler() + logger.setLevel(LOG_LEVEL) + logger.addHandler(handler) + logger.propagate = False + return logger diff --git a/pkg/suggestion/v1beta1/chocolate/__init__.py b/pkg/suggestion/v1beta1/chocolate/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/pkg/suggestion/v1beta1/chocolate/base_service.py b/pkg/suggestion/v1beta1/chocolate/base_service.py new file mode 100644 index 00000000000..2789b56b76f --- /dev/null +++ b/pkg/suggestion/v1beta1/chocolate/base_service.py @@ -0,0 +1,196 @@ +import chocolate as choco +import logging +import base64 +import warnings + +from pkg.suggestion.v1beta1.internal.constant import MAX_GOAL, INTEGER, DOUBLE, CATEGORICAL, DISCRETE +from pkg.suggestion.v1beta1.internal.trial import Assignment + +logger = logging.getLogger(__name__) + +DB_ADDRESS = "sqlite:///my_db.db?check_same_thread=False" +DB_FIELD_LOSS = "_loss" +DB_FIELD_CHOCOLATE_ID = "_chocolate_id" +DB_FIELD_TRIAL_NAME = "_trial_name" + +DEPRECATED_ALGORITHM_NAME = { + "chocolate-random": "random", + "chocolate-quasirandom": "quasirandom", + "chocolate-bayesian-optimization": "bayesianoptimization", + "chocolate-mocmaes": "mocmaes", +} + + +class BaseChocolateService(object): + """ + Refer to https://chocolate.readthedocs.io/ + """ + + def __init__(self, algorithm_name, search_space): + self.conn = choco.SQLiteConnection(DB_ADDRESS) + self.search_space = search_space + self.chocolate_optimizer = None + self.create_optimizer(algorithm_name) + # created_trials is the list of dicts with all created trials assignments, loss and trial name + # _chocolate_id is the ID of the trial, Assignment names are encoded, _loss is the target metric, _trial_name is the Trial name + # One row example: + # {'_chocolate_id': 0, 'LS1scg==': 0.001, 'LS1udW0tZXBvY2hz': 1, 'LS1udW0tbGF5ZXJz': 2, "_loss": "0.97", "_trial_name": "grid-example-hsdvfdwl"} + self.created_trials = [] + self.recorded_trials_names = [] + + def create_optimizer(self, algorithm_name): + + # Search Space example: {"x" : choco.uniform(-6, 6), "y" : choco.uniform(-6, 6)} + chocolate_search_space = {} + + for param in self.search_space.params: + key = BaseChocolateService.encode(param.name) + if param.type == INTEGER: + chocolate_search_space[key] = choco.quantized_uniform( + int(param.min), int(param.max), int(param.step)) + elif param.type == DOUBLE: + chocolate_search_space[key] = choco.quantized_uniform( + float(param.min), float(param.max), float(param.step)) + # For Categorical and Discrete insert indexes to DB from list of values + elif param.type == CATEGORICAL or param.type == DISCRETE: + chocolate_search_space[key] = choco.choice( + [idx for idx, _ in enumerate(param.list)]) + + if algorithm_name in DEPRECATED_ALGORITHM_NAME: + warnings.warn( + "Algorithm name '{}' is deprecated. Please use '{}'.".format( + algorithm_name, DEPRECATED_ALGORITHM_NAME[algorithm_name], + ), + DeprecationWarning, + ) + algorithm_name = DEPRECATED_ALGORITHM_NAME[algorithm_name] + + # Refer to https://chocolate.readthedocs.io/tutorials/algo.html + if algorithm_name == "grid": + self.chocolate_optimizer = choco.Grid( + self.conn, chocolate_search_space, clear_db=True) + # hyperopt-random is the default option in katib. + elif algorithm_name == "random": + self.chocolate_optimizer = choco.Random( + self.conn, chocolate_search_space, clear_db=True) + elif algorithm_name == "quasirandom": + self.chocolate_optimizer = choco.QuasiRandom( + self.conn, chocolate_search_space, clear_db=True) + elif algorithm_name == "bayesianoptimization": + self.chocolate_optimizer = choco.Bayes( + self.conn, chocolate_search_space, clear_db=True) + # elif self.algorithm_name == "chocolate-CMAES": + # self.chocolate_optimizer = choco.CMAES(self.conn, chocolate_search_space, clear_db=True) + elif algorithm_name == "mocmaes": + mu = 1 + self.chocolate_optimizer = choco.MOCMAES( + self.conn, chocolate_search_space, mu=mu, clear_db=True) + else: + raise Exception( + '"Failed to create Chocolate optimizer for the algorithm: {}'.format(algorithm_name)) + + def getSuggestions(self, trials, request_number): + """ + Get the new suggested trials with chocolate algorithm. + """ + logger.info("-" * 100 + "\n") + logger.info("New GetSuggestions call\n") + for _, trial in enumerate(trials): + if trial.name not in self.recorded_trials_names: + loss_for_choco = float(trial.target_metric.value) + if self.search_space.goal == MAX_GOAL: + loss_for_choco = -1 * loss_for_choco + + trial_assignments_dict = {} + for param in self.search_space.params: + param_assignment = None + for assignment in trial.assignments: + if param.name == assignment.name: + param_assignment = assignment.value + break + if param.type == INTEGER: + param_assignment = int(param_assignment) + elif param.type == DOUBLE: + param_assignment = float(param_assignment) + elif param.type == CATEGORICAL or param.type == DISCRETE: + param_assignment = param.list.index(param_assignment) + trial_assignments_dict.update({BaseChocolateService.encode( + param.name): param_assignment}) + + # Finding index for the current Trial Assignments in created_trial list without loss + new_trial_loss_idx = -1 + i = 0 + while new_trial_loss_idx == -1 and i < len(self.created_trials): + # Created Trial must not include loss and must have the same param assignment + if ((DB_FIELD_LOSS not in self.created_trials[i] or self.created_trials[i][DB_FIELD_LOSS] is None) and + len(trial_assignments_dict.items() & self.created_trials[i].items()) == len(self.search_space.params)): + new_trial_loss_idx = i + i += 1 + + if new_trial_loss_idx != -1: + self.created_trials[new_trial_loss_idx][DB_FIELD_LOSS] = loss_for_choco + self.created_trials[new_trial_loss_idx][DB_FIELD_TRIAL_NAME] = trial.name + + # Update sqlite database with new loss and trial assignments + id_filter = { + DB_FIELD_CHOCOLATE_ID: self.created_trials[new_trial_loss_idx][DB_FIELD_CHOCOLATE_ID]} + self.conn.update_result( + id_filter, + self.created_trials[new_trial_loss_idx]) + + self.recorded_trials_names.append(trial.name) + + logger.info("New record in sqlite DB is updated") + logger.info("{}\n".format( + self.created_trials[new_trial_loss_idx])) + + list_of_assignments = [] + for i in range(request_number): + try: + token, chocolate_params = self.chocolate_optimizer.next() + new_assignment = BaseChocolateService.convert( + self.search_space, chocolate_params) + list_of_assignments.append(new_assignment) + logger.info("New suggested parameters for Trial with chocolate_id: {}".format( + token[DB_FIELD_CHOCOLATE_ID])) + for assignment in new_assignment: + logger.info("Name = {}, Value = {}".format( + assignment.name, assignment.value)) + logger.info("-" * 50 + "\n") + # Add new trial assignment with chocolate_id to created trials + token.update(chocolate_params) + new_trial_dict = token + self.created_trials.append(new_trial_dict) + + except StopIteration: + logger.info( + "Chocolate db is exhausted, increase Search Space or decrease maxTrialCount!") + + if len(list_of_assignments) > 0: + logger.info( + "GetSuggestions returns {} new Trials\n\n".format(request_number)) + + return list_of_assignments + + @staticmethod + def convert(search_space, chocolate_params): + assignments = [] + for param in search_space.params: + key = BaseChocolateService.encode(param.name) + if param.type == INTEGER: + assignments.append(Assignment( + param.name, chocolate_params[key])) + elif param.type == DOUBLE: + assignments.append(Assignment( + param.name, chocolate_params[key])) + elif param.type == CATEGORICAL or param.type == DISCRETE: + assignments.append(Assignment( + param.name, param.list[chocolate_params[key]])) + return assignments + + @staticmethod + def encode(name): + """Encode the name. Chocolate will check if the name contains hyphens. + Thus we need to encode it. + """ + return base64.b64encode(name.encode('utf-8')).decode('utf-8') diff --git a/pkg/suggestion/v1beta1/chocolate/service.py b/pkg/suggestion/v1beta1/chocolate/service.py new file mode 100644 index 00000000000..c2577f44a46 --- /dev/null +++ b/pkg/suggestion/v1beta1/chocolate/service.py @@ -0,0 +1,58 @@ +import logging +import grpc + +from pkg.apis.manager.v1beta1.python import api_pb2 +from pkg.apis.manager.v1beta1.python import api_pb2_grpc + +from pkg.suggestion.v1beta1.internal.constant import DOUBLE +from pkg.suggestion.v1beta1.internal.search_space import HyperParameterSearchSpace +from pkg.suggestion.v1beta1.internal.trial import Trial, Assignment +from pkg.suggestion.v1beta1.chocolate.base_service import BaseChocolateService +from pkg.suggestion.v1beta1.internal.base_health_service import HealthServicer + +logger = logging.getLogger(__name__) + + +class ChocolateService(api_pb2_grpc.SuggestionServicer, HealthServicer): + def __init__(self): + super(ChocolateService, self).__init__() + self.base_service = None + self.is_first_run = True + + def ValidateAlgorithmSettings(self, request, context): + algorithm_name = request.experiment.spec.algorithm.algorithm_name + if algorithm_name == "grid": + search_space = HyperParameterSearchSpace.convert( + request.experiment) + for param in search_space.params: + if param.type == DOUBLE: + if param.step == "" or param.step is None: + return self._set_validate_context_error( + context, "param {} step is nil".format(param.name)) + return api_pb2.ValidateAlgorithmSettingsReply() + + def GetSuggestions(self, request, context): + """ + Main function to provide suggestion. + """ + + if self.is_first_run: + search_space = HyperParameterSearchSpace.convert( + request.experiment) + self.base_service = BaseChocolateService( + algorithm_name=request.experiment.spec.algorithm.algorithm_name, + search_space=search_space) + self.is_first_run = False + + trials = Trial.convert(request.trials) + new_assignments = self.base_service.getSuggestions( + trials, request.request_number) + return api_pb2.GetSuggestionsReply( + parameter_assignments=Assignment.generate(new_assignments) + ) + + def _set_validate_context_error(self, context, error_message): + context.set_code(grpc.StatusCode.INVALID_ARGUMENT) + context.set_details(error_message) + logger.info(error_message) + return api_pb2.ValidateAlgorithmSettingsReply() diff --git a/pkg/suggestion/v1beta1/goptuna/converter.go b/pkg/suggestion/v1beta1/goptuna/converter.go new file mode 100644 index 00000000000..04d66da271d --- /dev/null +++ b/pkg/suggestion/v1beta1/goptuna/converter.go @@ -0,0 +1,350 @@ +package suggestion_goptuna_v1beta1 + +import ( + "errors" + "strconv" + "time" + + "github.com/c-bata/goptuna" + "github.com/c-bata/goptuna/cmaes" + "github.com/c-bata/goptuna/tpe" + api_v1_beta1 "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" +) + +func toGoptunaDirection(t api_v1_beta1.ObjectiveType) goptuna.StudyDirection { + if t == api_v1_beta1.ObjectiveType_MINIMIZE { + return goptuna.StudyDirectionMinimize + } + return goptuna.StudyDirectionMaximize +} + +func toGoptunaSampler(algorithm *api_v1_beta1.AlgorithmSpec) (goptuna.Sampler, goptuna.RelativeSampler, error) { + name := algorithm.GetAlgorithmName() + if name == AlgorithmCMAES { + opts := make([]cmaes.SamplerOption, 0, len(algorithm.GetAlgorithmSetting())+1) + opts = append(opts, cmaes.SamplerOptionNStartupTrials(0)) + for _, s := range algorithm.GetAlgorithmSetting() { + if s.Name == "random_state" { + seed, err := strconv.Atoi(s.Value) + if err != nil { + return nil, nil, err + } + opts = append(opts, cmaes.SamplerOptionSeed(int64(seed))) + } else if s.Name == "sigma" { + sigma, err := strconv.ParseFloat(s.Value, 64) + if err != nil { + return nil, nil, err + } + opts = append(opts, cmaes.SamplerOptionInitialSigma(sigma)) + } + } + return nil, cmaes.NewSampler(opts...), nil + } else if name == AlgorithmTPE { + opts := make([]tpe.SamplerOption, 0, len(algorithm.GetAlgorithmSetting())) + for _, s := range algorithm.GetAlgorithmSetting() { + if s.Name == "random_state" { + seed, err := strconv.Atoi(s.Value) + if err != nil { + return nil, nil, err + } + opts = append(opts, tpe.SamplerOptionSeed(int64(seed))) + } else if s.Name == "startup_trials" { + n, err := strconv.Atoi(s.Value) + if err != nil { + return nil, nil, err + } + opts = append(opts, tpe.SamplerOptionNumberOfStartupTrials(n)) + } else if s.Name == "ei_candidates" { + n, err := strconv.Atoi(s.Value) + if err != nil { + return nil, nil, err + } + opts = append(opts, tpe.SamplerOptionNumberOfEICandidates(n)) + } + } + return tpe.NewSampler(opts...), nil, nil + } else { + opts := make([]goptuna.RandomSearchSamplerOption, 0, len(algorithm.GetAlgorithmSetting())) + for _, s := range algorithm.GetAlgorithmSetting() { + if s.Name == "random_state" { + seed, err := strconv.Atoi(s.Value) + if err != nil { + return nil, nil, err + } + opts = append(opts, goptuna.RandomSearchSamplerOptionSeed(int64(seed))) + } + } + return goptuna.NewRandomSearchSampler(opts...), nil, nil + } +} + +func toGoptunaSearchSpace(parameters []*api_v1_beta1.ParameterSpec) (map[string]interface{}, error) { + searchSpace := make(map[string]interface{}, len(parameters)) + for _, p := range parameters { + if p.ParameterType == api_v1_beta1.ParameterType_UNKNOWN_TYPE { + return nil, errors.New("invalid parameter type") + } + + if p.ParameterType == api_v1_beta1.ParameterType_DOUBLE { + high, err := strconv.ParseFloat(p.GetFeasibleSpace().GetMax(), 64) + if err != nil { + return nil, err + } + low, err := strconv.ParseFloat(p.GetFeasibleSpace().GetMin(), 64) + if err != nil { + return nil, err + } + + stepstr := p.GetFeasibleSpace().GetStep() + if stepstr == "" { + searchSpace[p.Name] = goptuna.UniformDistribution{ + High: high, + Low: low, + } + } else { + step, err := strconv.ParseFloat(stepstr, 64) + if err != nil { + return nil, err + } + searchSpace[p.Name] = goptuna.DiscreteUniformDistribution{ + High: high, + Low: low, + Q: step, + } + } + } else if p.ParameterType == api_v1_beta1.ParameterType_INT { + high, err := strconv.Atoi(p.GetFeasibleSpace().GetMax()) + if err != nil { + return nil, err + } + low, err := strconv.Atoi(p.GetFeasibleSpace().GetMin()) + if err != nil { + return nil, err + } + stepstr := p.GetFeasibleSpace().GetStep() + if stepstr == "" { + searchSpace[p.Name] = goptuna.IntUniformDistribution{ + High: high, + Low: low, + } + } else { + step, err := strconv.Atoi(stepstr) + if err != nil { + return nil, err + } + searchSpace[p.Name] = goptuna.StepIntUniformDistribution{ + High: high, + Low: low, + Step: step, + } + } + } else if p.ParameterType == api_v1_beta1.ParameterType_CATEGORICAL { + choices := p.GetFeasibleSpace().GetList() + searchSpace[p.Name] = goptuna.CategoricalDistribution{ + Choices: choices, + } + } else if p.ParameterType == api_v1_beta1.ParameterType_DISCRETE { + // Use categorical distribution instead of goptuna.DiscreteUniformDistribution + // because goptuna.DiscreteUniformDistributions needs to declare the parameter + // space with minimum value, maximum value and interval. + choices := p.GetFeasibleSpace().GetList() + searchSpace[p.Name] = goptuna.CategoricalDistribution{ + Choices: choices, + } + } else { + return nil, errors.New("unsupported parameter type") + } + } + return searchSpace, nil +} + +func toGoptunaState(condition api_v1_beta1.TrialStatus_TrialConditionType) (goptuna.TrialState, error) { + if condition == api_v1_beta1.TrialStatus_CREATED { + return goptuna.TrialStateRunning, nil + } else if condition == api_v1_beta1.TrialStatus_RUNNING { + return goptuna.TrialStateRunning, nil + } else if condition == api_v1_beta1.TrialStatus_SUCCEEDED { + return goptuna.TrialStateComplete, nil + } else if condition == api_v1_beta1.TrialStatus_KILLED { + return goptuna.TrialStateFail, nil + } else if condition == api_v1_beta1.TrialStatus_FAILED { + return goptuna.TrialStateFail, nil + } + return goptuna.TrialStateFail, errors.New("unexpected trial condition") +} + +func getFinalMetric(objectMetricName string, trial *api_v1_beta1.Trial) (float64, error) { + metrics := trial.GetStatus().GetObservation().GetMetrics() + for i := len(metrics) - 1; i >= 0; i-- { + if metrics[i].GetName() != objectMetricName { + continue + } + v, err := strconv.ParseFloat(metrics[i].GetValue(), 64) + if err != nil { + return 0, err + } + return v, nil + } + return 0, errors.New("no objective metrics") +} + +func toGoptunaTrials( + ktrials []*api_v1_beta1.Trial, + objectMetricName string, + study *goptuna.Study, + searchSpace map[string]interface{}, +) (map[string]goptuna.FrozenTrial, error) { + gtrials := make(map[string]goptuna.FrozenTrial, len(ktrials)) + for i, kt := range ktrials { + var err error + var datetimeStart, datetimeComplete time.Time + if kt.GetStatus().GetStartTime() != "" { + datetimeStart, err = time.Parse(time.RFC3339Nano, kt.GetStatus().GetStartTime()) + if err != nil { + return nil, err + } + } + if kt.GetStatus().GetCompletionTime() != "" { + datetimeComplete, err = time.Parse(time.RFC3339Nano, kt.GetStatus().GetCompletionTime()) + if err != nil { + return nil, err + } + } + state, err := toGoptunaState(kt.GetStatus().GetCondition()) + if err != nil { + return nil, err + } + + var finalValue float64 + if state == goptuna.TrialStateComplete { + finalValue, err = getFinalMetric(objectMetricName, kt) + if err != nil { + return nil, err + } + } + + assignments := kt.GetSpec().GetParameterAssignments().GetAssignments() + internalParams, externalParams, err := toGoptunaParams(assignments, searchSpace) + if err != nil { + return nil, err + } + + gt := goptuna.FrozenTrial{ + ID: i, // dummy id + StudyID: study.ID, + Number: i, // dummy number + State: state, + Value: finalValue, + IntermediateValues: nil, + DatetimeStart: datetimeStart, + DatetimeComplete: datetimeComplete, + InternalParams: internalParams, + Params: externalParams, + Distributions: searchSpace, + UserAttrs: nil, + SystemAttrs: nil, + } + gtrials[kt.GetName()] = gt + } + return gtrials, nil +} + +func toGoptunaParams( + assignments []*api_v1_beta1.ParameterAssignment, + searchSpace map[string]interface{}, +) ( + internalParams map[string]float64, + externalParams map[string]interface{}, + err error, +) { + internalParams = make(map[string]float64, len(assignments)) + externalParams = make(map[string]interface{}, len(assignments)) + + for i := range assignments { + name := assignments[i].GetName() + valueStr := assignments[i].GetValue() + + switch d := searchSpace[name].(type) { + case goptuna.UniformDistribution: + p, err := strconv.ParseFloat(valueStr, 64) + if err != nil { + return nil, nil, err + } + internalParams[name] = p + externalParams[name] = d.ToExternalRepr(p) + case goptuna.DiscreteUniformDistribution: + p, err := strconv.ParseFloat(valueStr, 64) + if err != nil { + return nil, nil, err + } + internalParams[name] = p + externalParams[name] = d.ToExternalRepr(p) + case goptuna.IntUniformDistribution: + p, err := strconv.ParseInt(valueStr, 10, 64) + if err != nil { + return nil, nil, err + } + ir := float64(p) + internalParams[name] = ir + // externalParams[name] = p is prohibited because of reflect.DeepEqual() will be false + // at findGoptunaTrialIDByParam() function. + externalParams[name] = d.ToExternalRepr(ir) + case goptuna.StepIntUniformDistribution: + p, err := strconv.ParseInt(valueStr, 10, 64) + if err != nil { + return nil, nil, err + } + ir := float64(p) + internalParams[name] = ir + // externalParams[name] = p is prohibited because of reflect.DeepEqual() will be false + // at findGoptunaTrialIDByParam() function. + externalParams[name] = d.ToExternalRepr(ir) + case goptuna.CategoricalDistribution: + internalRepr := -1.0 + for i := range d.Choices { + if d.Choices[i] == valueStr { + internalRepr = float64(i) + break + } + } + if internalRepr == -1.0 { + return nil, nil, errors.New("invalid categorical value") + } + internalParams[name] = internalRepr + externalParams[name] = valueStr + } + } + return internalParams, externalParams, nil +} + +func createStudyAndSearchSpace( + experiment *api_v1_beta1.Experiment, +) (*goptuna.Study, map[string]interface{}, error) { + direction := toGoptunaDirection(experiment.GetSpec().GetObjective().GetType()) + independentSampler, relativeSampler, err := toGoptunaSampler(experiment.GetSpec().GetAlgorithm()) + if err != nil { + return nil, nil, err + } + searchSpace, err := toGoptunaSearchSpace(experiment.GetSpec().GetParameterSpecs().GetParameters()) + if err != nil { + return nil, nil, err + } + + studyOpts := make([]goptuna.StudyOption, 0, 5) + studyOpts = append(studyOpts, goptuna.StudyOptionSetDirection(direction)) + studyOpts = append(studyOpts, goptuna.StudyOptionDefineSearchSpace(searchSpace)) + studyOpts = append(studyOpts, goptuna.StudyOptionLogger(nil)) + if independentSampler != nil { + studyOpts = append(studyOpts, goptuna.StudyOptionSampler(independentSampler)) + } + if relativeSampler != nil { + studyOpts = append(studyOpts, goptuna.StudyOptionRelativeSampler(relativeSampler)) + } + + study, err := goptuna.CreateStudy(defaultStudyName, studyOpts...) + if err != nil { + return nil, nil, err + } + + return study, searchSpace, nil +} diff --git a/pkg/suggestion/v1beta1/goptuna/converter_test.go b/pkg/suggestion/v1beta1/goptuna/converter_test.go new file mode 100644 index 00000000000..ca2c827d90d --- /dev/null +++ b/pkg/suggestion/v1beta1/goptuna/converter_test.go @@ -0,0 +1,177 @@ +package suggestion_goptuna_v1beta1 + +import ( + "reflect" + "testing" + + "github.com/c-bata/goptuna" + api_v1_beta1 "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" +) + +func Test_toGoptunaDirection(t *testing.T) { + for _, tt := range []struct { + name string + objectiveType api_v1_beta1.ObjectiveType + expected goptuna.StudyDirection + }{ + { + name: "minimize", + objectiveType: api_v1_beta1.ObjectiveType_MINIMIZE, + expected: goptuna.StudyDirectionMinimize, + }, + { + name: "maximize", + objectiveType: api_v1_beta1.ObjectiveType_MAXIMIZE, + expected: goptuna.StudyDirectionMaximize, + }, + } { + t.Run(tt.name, func(t *testing.T) { + got := toGoptunaDirection(tt.objectiveType) + if got != tt.expected { + t.Errorf("toGoptunaDirection() got = %v, want %v", got, tt.expected) + } + }) + } +} + +func Test_toGoptunaSearchSpace(t *testing.T) { + tests := []struct { + name string + parameters []*api_v1_beta1.ParameterSpec + want map[string]interface{} + wantErr bool + }{ + { + name: "Double parameter type", + parameters: []*api_v1_beta1.ParameterSpec{ + { + Name: "param-double", + ParameterType: api_v1_beta1.ParameterType_DOUBLE, + FeasibleSpace: &api_v1_beta1.FeasibleSpace{ + Max: "5.5", + Min: "1.5", + }, + }, + }, + want: map[string]interface{}{ + "param-double": goptuna.UniformDistribution{ + High: 5.5, + Low: 1.5, + }, + }, + wantErr: false, + }, + { + name: "Double parameter type with step", + parameters: []*api_v1_beta1.ParameterSpec{ + { + Name: "param-double", + ParameterType: api_v1_beta1.ParameterType_DOUBLE, + FeasibleSpace: &api_v1_beta1.FeasibleSpace{ + Max: "5.5", + Min: "1.5", + Step: "0.5", + }, + }, + }, + want: map[string]interface{}{ + "param-double": goptuna.DiscreteUniformDistribution{ + High: 5.5, + Low: 1.5, + Q: 0.5, + }, + }, + wantErr: false, + }, + { + name: "Int parameter type", + parameters: []*api_v1_beta1.ParameterSpec{ + { + Name: "param-int", + ParameterType: api_v1_beta1.ParameterType_INT, + FeasibleSpace: &api_v1_beta1.FeasibleSpace{ + Max: "5", + Min: "1", + }, + }, + }, + want: map[string]interface{}{ + "param-int": goptuna.IntUniformDistribution{ + High: 5, + Low: 1, + }, + }, + wantErr: false, + }, + { + name: "Int parameter type with step", + parameters: []*api_v1_beta1.ParameterSpec{ + { + Name: "param-int", + ParameterType: api_v1_beta1.ParameterType_INT, + FeasibleSpace: &api_v1_beta1.FeasibleSpace{ + Max: "5", + Min: "1", + Step: "2", + }, + }, + }, + want: map[string]interface{}{ + "param-int": goptuna.StepIntUniformDistribution{ + High: 5, + Low: 1, + Step: 2, + }, + }, + wantErr: false, + }, + { + name: "Discrete parameter type", + parameters: []*api_v1_beta1.ParameterSpec{ + { + Name: "param-discrete", + ParameterType: api_v1_beta1.ParameterType_DISCRETE, + FeasibleSpace: &api_v1_beta1.FeasibleSpace{ + List: []string{"3", "2", "6"}, + }, + }, + }, + want: map[string]interface{}{ + "param-discrete": goptuna.CategoricalDistribution{ + Choices: []string{"3", "2", "6"}, + }, + }, + wantErr: false, + }, + { + name: "Categorical parameter type", + parameters: []*api_v1_beta1.ParameterSpec{ + { + Name: "param-categorical", + ParameterType: api_v1_beta1.ParameterType_CATEGORICAL, + FeasibleSpace: &api_v1_beta1.FeasibleSpace{ + List: []string{"cat1", "cat2", "cat3"}, + }, + }, + }, + want: map[string]interface{}{ + "param-categorical": goptuna.CategoricalDistribution{ + Choices: []string{"cat1", "cat2", "cat3"}, + }, + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := toGoptunaSearchSpace(tt.parameters) + if (err != nil) != tt.wantErr { + t.Errorf("toGoptunaSearchSpace() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("toGoptunaSearchSpace() got = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/pkg/suggestion/v1beta1/goptuna/sample.go b/pkg/suggestion/v1beta1/goptuna/sample.go new file mode 100644 index 00000000000..2b30cb72651 --- /dev/null +++ b/pkg/suggestion/v1beta1/goptuna/sample.go @@ -0,0 +1,111 @@ +package suggestion_goptuna_v1beta1 + +import ( + "errors" + "reflect" + "strconv" + + "github.com/c-bata/goptuna" + api_v1_beta1 "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" +) + +func sampleNextParam(study *goptuna.Study, searchSpace map[string]interface{}) (int, []*api_v1_beta1.ParameterAssignment, error) { + nextTrialID, err := study.Storage.CreateNewTrial(study.ID) + if err != nil { + return -1, nil, err + } + trial := goptuna.Trial{ + Study: study, + ID: nextTrialID, + } + + // Sample parameters and stored in Goptuna storage. + err = trial.CallRelativeSampler() + if err != nil { + return nextTrialID, nil, err + } + + assignments := make([]*api_v1_beta1.ParameterAssignment, 0, len(searchSpace)) + for name := range searchSpace { + switch distribution := searchSpace[name].(type) { + case goptuna.UniformDistribution: + p, err := trial.SuggestFloat(name, distribution.Low, distribution.High) + if err != nil { + return nextTrialID, nil, err + } + assignments = append(assignments, &api_v1_beta1.ParameterAssignment{ + Name: name, + Value: strconv.FormatFloat(p, 'f', -1, 64), + }) + case goptuna.DiscreteUniformDistribution: + p, err := trial.SuggestDiscreteFloat(name, distribution.Low, distribution.High, distribution.Q) + if err != nil { + return nextTrialID, nil, err + } + assignments = append(assignments, &api_v1_beta1.ParameterAssignment{ + Name: name, + Value: strconv.FormatFloat(p, 'f', -1, 64), + }) + case goptuna.IntUniformDistribution: + p, err := trial.SuggestInt(name, distribution.Low, distribution.High) + if err != nil { + return nextTrialID, nil, err + } + assignments = append(assignments, &api_v1_beta1.ParameterAssignment{ + Name: name, + Value: strconv.Itoa(p), + }) + case goptuna.StepIntUniformDistribution: + p, err := trial.SuggestStepInt(name, distribution.Low, distribution.High, distribution.Step) + if err != nil { + return nextTrialID, nil, err + } + assignments = append(assignments, &api_v1_beta1.ParameterAssignment{ + Name: name, + Value: strconv.Itoa(p), + }) + case goptuna.CategoricalDistribution: + p, err := trial.SuggestCategorical(name, distribution.Choices) + if err != nil { + return nextTrialID, nil, err + } + assignments = append(assignments, &api_v1_beta1.ParameterAssignment{ + Name: name, + Value: p, + }) + } + } + return nextTrialID, assignments, nil +} + +func findGoptunaTrialIDByParam(study *goptuna.Study, trialMapping map[string]int, ktrial goptuna.FrozenTrial) (int, error) { + trials, err := study.GetTrials() + if err != nil { + return -1, err + } + + existInMapping := func(trialID int) bool { + for j := range trialMapping { + if trialMapping[j] == trialID { + return true + } + } + return false + } + + for i := len(trials) - 1; i >= 0; i-- { + if trials[i].State != goptuna.TrialStateRunning { + continue + } + + // skip the trial id which already mapped by other katib trial name + if existInMapping(trials[i].ID) { + continue + } + + if reflect.DeepEqual(ktrial.Params, trials[i].Params) { + return trials[i].ID, nil + } + } + return -1, errors.New("same trial parameter is not found") +} diff --git a/pkg/suggestion/v1beta1/goptuna/service.go b/pkg/suggestion/v1beta1/goptuna/service.go new file mode 100644 index 00000000000..e7f7e737bdf --- /dev/null +++ b/pkg/suggestion/v1beta1/goptuna/service.go @@ -0,0 +1,198 @@ +package suggestion_goptuna_v1beta1 + +import ( + "context" + "sync" + + "github.com/c-bata/goptuna" + api_v1_beta1 "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "k8s.io/klog" +) + +const ( + AlgorithmCMAES = "cmaes" + AlgorithmTPE = "tpe" + AlgorithmRandom = "random" + + defaultStudyName = "Katib" +) + +func NewSuggestionService() *SuggestionService { + return &SuggestionService{ + searchSpace: nil, + study: nil, + trialMapping: make(map[string]int), + } +} + +type SuggestionService struct { + mu sync.RWMutex + searchSpace map[string]interface{} + study *goptuna.Study + trialMapping map[string]int // Katib trial name -> Goptuna trial id +} + +func (s *SuggestionService) GetSuggestions( + ctx context.Context, + req *api_v1_beta1.GetSuggestionsRequest, +) (*api_v1_beta1.GetSuggestionsReply, error) { + err := s.initStudyAndSearchSpaceAtFirstRun(req.GetExperiment()) + if err != nil { + return nil, status.Errorf(codes.Internal, "Failed to create goptuna study and search space: %s", err.Error()) + } + + objectMetricName := req.GetExperiment().GetSpec().GetObjective().GetObjectiveMetricName() + trials, err := toGoptunaTrials(req.GetTrials(), objectMetricName, s.study, s.searchSpace) + if err != nil { + klog.Errorf("Failed to convert to Goptuna trials: %s", err) + return nil, status.Error(codes.Internal, err.Error()) + } + err = s.syncTrials(trials) + if err != nil { + klog.Errorf("Failed to sync Goptuna trials: %s", err) + return nil, status.Error(codes.Internal, err.Error()) + } + + requestNumber := int(req.GetRequestNumber()) + parameterAssignments := make([]*api_v1_beta1.GetSuggestionsReply_ParameterAssignments, requestNumber) + for i := 0; i < requestNumber; i++ { + trialID, assignments, err := sampleNextParam(s.study, s.searchSpace) + if err != nil { + klog.Errorf("Failed to sample next param: trialID=%d, err=%s", trialID, err) + return nil, status.Error(codes.Internal, err.Error()) + } + + klog.Infof("Success to sample new trial: trialID=%d, assignments=%v", trialID, assignments) + parameterAssignments[i] = &api_v1_beta1.GetSuggestionsReply_ParameterAssignments{ + Assignments: assignments, + } + } + + return &api_v1_beta1.GetSuggestionsReply{ + ParameterAssignments: parameterAssignments, + }, nil +} + +// Sync Goptuna trials with Katib trials. +func (s *SuggestionService) syncTrials(ktrials map[string]goptuna.FrozenTrial) (err error) { + s.mu.Lock() + defer s.mu.Unlock() + + for katibTrialName := range ktrials { + ktrial := ktrials[katibTrialName] + gtrialID, found := s.trialMapping[katibTrialName] + if !found { + // In the CMA-ES algorithm, the parameters of Multivariate Normal Distribution MUST be updated by the + // solutions that are sampled from the same generation. To ensure this, Goptuna stores the trial + // metadata which contains the generation number. + // + // But suggestion service cannot know which Katib trial name corresponds to Goptuna trial ID. + // Because Katib's trial name is determined by Katib controller after finished this gRPC call. + // So `findGoptunaTrialIDByParam()` returns the goptuna trial ID from the parameter values. + gtrialID, err = findGoptunaTrialIDByParam(s.study, s.trialMapping, ktrial) + if err != nil { + klog.Errorf("Failed to find Goptuna Trial ID: trialName=%s, err=%s", katibTrialName, err) + return err + } + s.trialMapping[katibTrialName] = gtrialID + klog.Infof("Update trial mapping : trialName=%s -> trialID=%d", katibTrialName, gtrialID) + } + + gtrial, err := s.study.Storage.GetTrial(gtrialID) + if err != nil { + return err + } + + // It doesn't need to update finished trials. + if gtrial.State.IsFinished() { + continue + } + + if ktrial.State == gtrial.State { + continue + } + + if ktrial.State == goptuna.TrialStateComplete { + err = s.study.Storage.SetTrialValue(gtrialID, ktrial.Value) + if err != nil { + return err + } + } + + err = s.study.Storage.SetTrialState(gtrialID, ktrial.State) + if err != nil { + klog.Errorf("Failed to update state: %s", err) + return err + } + + klog.Infof("Detect changes of Trial (trialName=%s, trialID=%d) : State %s, Evaluation %f", + katibTrialName, gtrialID, ktrial.State, ktrial.Value) + } + return nil +} + +func (s *SuggestionService) initStudyAndSearchSpaceAtFirstRun( + experiment *api_v1_beta1.Experiment, +) error { + s.mu.Lock() + defer s.mu.Unlock() + + if s.study != nil && s.searchSpace != nil { + return nil + } + + study, searchSpace, err := createStudyAndSearchSpace(experiment) + if err != nil { + return err + } + + s.study = study + s.searchSpace = searchSpace + return nil +} + +func (s *SuggestionService) ValidateAlgorithmSettings( + ctx context.Context, + req *api_v1_beta1.ValidateAlgorithmSettingsRequest, +) (*api_v1_beta1.ValidateAlgorithmSettingsReply, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "request is empty") + } + + algorithmName := req.GetExperiment().GetSpec().GetAlgorithm().GetAlgorithmName() + if algorithmName != AlgorithmRandom && algorithmName != AlgorithmCMAES && algorithmName != AlgorithmTPE { + return nil, status.Error(codes.InvalidArgument, "unsupported algorithm") + } + + params := req.GetExperiment().GetSpec().GetParameterSpecs().GetParameters() + if algorithmName == AlgorithmCMAES { + cnt := 0 + for _, p := range params { + if p.ParameterType == api_v1_beta1.ParameterType_DOUBLE || p.ParameterType == api_v1_beta1.ParameterType_INT { + cnt++ + } + } + if cnt < 2 { + return nil, status.Error(codes.InvalidArgument, "CMA-ES only supports two or more dimensional continuous search space.") + } + } + + paramSet := make(map[string]interface{}, len(params)) + for _, p := range params { + if _, ok := paramSet[p.Name]; ok { + return nil, status.Errorf(codes.InvalidArgument, "Detect duplicated parameter name: %s", p.Name) + } + paramSet[p.Name] = nil + } + _, _, err := createStudyAndSearchSpace(req.GetExperiment()) + if err != nil { + return nil, status.Errorf(codes.Internal, "Failed to create goptuna study and search space: %s", err.Error()) + } + return &api_v1_beta1.ValidateAlgorithmSettingsReply{}, nil +} + +// This is a compile-time assertion to ensure that SuggestionService +// implements an api_v1_beta1.SuggestionServer interface. +var _ api_v1_beta1.SuggestionServer = &SuggestionService{} diff --git a/pkg/suggestion/v1beta1/goptuna/service_test.go b/pkg/suggestion/v1beta1/goptuna/service_test.go new file mode 100644 index 00000000000..1bb64d71096 --- /dev/null +++ b/pkg/suggestion/v1beta1/goptuna/service_test.go @@ -0,0 +1,173 @@ +package suggestion_goptuna_v1beta1_test + +import ( + "context" + "testing" + + api_v1_beta1 "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" + suggestion_goptuna_v1beta1 "github.com/kubeflow/katib/pkg/suggestion/v1beta1/goptuna" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func TestSuggestionService_GetSuggestions(t *testing.T) { + ctx := context.TODO() + parameterSpecs := &api_v1_beta1.ExperimentSpec_ParameterSpecs{ + Parameters: []*api_v1_beta1.ParameterSpec{ + { + Name: "param-1", + ParameterType: api_v1_beta1.ParameterType_INT, + FeasibleSpace: &api_v1_beta1.FeasibleSpace{ + Max: "10", + Min: "-10", + List: nil, + Step: "", + }, + }, + { + Name: "param-2", + ParameterType: api_v1_beta1.ParameterType_CATEGORICAL, + FeasibleSpace: &api_v1_beta1.FeasibleSpace{ + List: []string{"cat1", "cat2", "cat3"}, + }, + }, + { + Name: "param-3", + ParameterType: api_v1_beta1.ParameterType_DISCRETE, + FeasibleSpace: &api_v1_beta1.FeasibleSpace{ + List: []string{"3", "2", "6"}, + }, + }, + { + Name: "param-4", + ParameterType: api_v1_beta1.ParameterType_DOUBLE, + FeasibleSpace: &api_v1_beta1.FeasibleSpace{ + Max: "5.5", + Min: "-1.5", + }, + }, + }, + } + + for _, tt := range []struct { + name string + req *api_v1_beta1.GetSuggestionsRequest + expectedCode codes.Code + }{ + { + name: "CMA-ES request", + req: &api_v1_beta1.GetSuggestionsRequest{ + Experiment: &api_v1_beta1.Experiment{ + Name: "test", + Spec: &api_v1_beta1.ExperimentSpec{ + Algorithm: &api_v1_beta1.AlgorithmSpec{ + AlgorithmName: "cmaes", + AlgorithmSetting: []*api_v1_beta1.AlgorithmSetting{ + { + Name: "random_state", + Value: "10", + }, + }, + }, + Objective: &api_v1_beta1.ObjectiveSpec{ + Type: api_v1_beta1.ObjectiveType_MINIMIZE, + Goal: 0.1, + ObjectiveMetricName: "metric-1", + AdditionalMetricNames: nil, + }, + ParameterSpecs: parameterSpecs, + }, + }, + RequestNumber: 2, + }, + expectedCode: codes.OK, + }, + { + name: "TPE request", + req: &api_v1_beta1.GetSuggestionsRequest{ + Experiment: &api_v1_beta1.Experiment{ + Name: "test", + Spec: &api_v1_beta1.ExperimentSpec{ + Algorithm: &api_v1_beta1.AlgorithmSpec{ + AlgorithmName: "tpe", + AlgorithmSetting: []*api_v1_beta1.AlgorithmSetting{ + { + Name: "random_state", + Value: "10", + }, + }, + EarlyStoppingSpec: nil, + }, + Objective: &api_v1_beta1.ObjectiveSpec{ + Type: api_v1_beta1.ObjectiveType_MINIMIZE, + Goal: 0.1, + ObjectiveMetricName: "metric-1", + AdditionalMetricNames: nil, + }, + ParameterSpecs: parameterSpecs, + }, + }, + RequestNumber: 2, + }, + }, + { + name: "Random request", + req: &api_v1_beta1.GetSuggestionsRequest{ + Experiment: &api_v1_beta1.Experiment{ + Name: "test", + Spec: &api_v1_beta1.ExperimentSpec{ + Algorithm: &api_v1_beta1.AlgorithmSpec{ + AlgorithmName: "random", + AlgorithmSetting: []*api_v1_beta1.AlgorithmSetting{ + { + Name: "random_state", + Value: "10", + }, + }, + EarlyStoppingSpec: nil, + }, + Objective: &api_v1_beta1.ObjectiveSpec{ + Type: api_v1_beta1.ObjectiveType_MINIMIZE, + Goal: 0.1, + ObjectiveMetricName: "metric-1", + AdditionalMetricNames: nil, + }, + ParameterSpecs: parameterSpecs, + }, + }, + RequestNumber: 2, + }, + }, + } { + t.Run(tt.name, func(t *testing.T) { + s := &suggestion_goptuna_v1beta1.SuggestionService{} + reply, err := s.GetSuggestions(ctx, tt.req) + + c, ok := status.FromError(err) + if !ok { + t.Errorf("GetSuggestion() returns non-gRPC error") + } + if tt.expectedCode != c.Code() { + t.Errorf("GetSuggestions() should return = %v, but got %v", tt.expectedCode, c.Code()) + } + + if c.Code() != codes.OK { + return + } + + if len(reply.ParameterAssignments) != int(tt.req.RequestNumber) { + t.Errorf("GetSuggestions() should return %d suggestions, but got %#v", tt.req.RequestNumber, reply.ParameterAssignments) + return + } + + params := tt.req.GetExperiment().GetSpec().GetParameterSpecs().GetParameters() + for i := range reply.ParameterAssignments { + assignments := reply.ParameterAssignments[i].Assignments + if len(assignments) != len(params) { + t.Errorf("Each assignments should holds %d parameters, but got %#v", len(params), assignments) + return + } + } + }) + } +} diff --git a/pkg/suggestion/v1beta1/hyperband/__init__.py b/pkg/suggestion/v1beta1/hyperband/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/pkg/suggestion/v1beta1/hyperband/parameter.py b/pkg/suggestion/v1beta1/hyperband/parameter.py new file mode 100644 index 00000000000..e2c03e16246 --- /dev/null +++ b/pkg/suggestion/v1beta1/hyperband/parameter.py @@ -0,0 +1,53 @@ +import numpy as np +from sklearn.preprocessing import MinMaxScaler + + +class ParameterConfig: + """ + Class to hold the parameter configuration for an experiment. + + Attributes: + name_ids (dict): Mapping from a parameter name to the index of that + parameter in the other fields. + dim (int): Dimension of the vectors created when parameter assignments + are mapped to a vector. Each int, double, or discrete parameter + adds one to the dimension, and each categorical parameter adds + the number of feasible values for that parameter due to one-hot + encoding. + lower_bounds (ndarray): The lower bounds for each parameter in the + search space. + upper_bounds (ndarray): The lower bounds for each parameter in the + search space. + parameter_types (list): The type of each parameter. + names (list): The name of each parameter. + discrete_info (list): A list of dicts where each dict contains the + information for a single discrete parameter. An example of a dict + is {"name": "discrete_parameter, "values": [2, 3, 5]}] + categorical_info (list): A list of dicts where each dict contains the + information for a single categorical parameter. An example dict is + {"name": "cat_param", "values": ["true", "false"], "number": 2}. + """ + + def __init__(self, name_ids, dim, lower_bounds, upper_bounds, + parameter_types, names, discrete_info, categorical_info): + self.name_ids = name_ids + self.dim = dim + self.lower_bounds = np.array(lower_bounds).reshape((1, dim)) + self.upper_bounds = np.array(upper_bounds).reshape((1, dim)) + self.parameter_types = parameter_types + self.names = names + self.discrete_info = discrete_info + self.categorical_info = categorical_info + if len(self.names) != len(set(self.names)): + raise Exception("Parameter names are not unique.") + + def create_scaler(self): + search_space = np.append(self.lower_bounds, self.upper_bounds, axis=0) + scaler = MinMaxScaler() + scaler.fit(search_space) + return scaler + + def random_sample(self): + new_sample = np.random.uniform(self.lower_bounds, self.upper_bounds, + size=(1, self.dim)) + return new_sample diff --git a/pkg/suggestion/v1beta1/hyperband/parsing_util.py b/pkg/suggestion/v1beta1/hyperband/parsing_util.py new file mode 100644 index 00000000000..bba7e3ce4ec --- /dev/null +++ b/pkg/suggestion/v1beta1/hyperband/parsing_util.py @@ -0,0 +1,144 @@ +""" +Module containing helper functions to translate objects that come +to/from the grpc API into the format accepted/returned by the different +suggestion generation algorithms. +""" +from collections.abc import Iterable +from pkg.apis.manager.v1beta1.python import api_pb2 +import numpy as np +from pkg.suggestion.v1beta1.hyperband.parameter import ParameterConfig + + +def _deal_with_discrete(feasible_values, current_value): + """ function to embed the current values to the feasible discrete space""" + diff = np.subtract(feasible_values, current_value) + diff = np.absolute(diff) + return feasible_values[np.argmin(diff)] + + +def _deal_with_categorical(feasible_values, one_hot_values): + """ function to do the one hot encoding of the categorical values """ + index = np.argmax(one_hot_values) + return feasible_values[int(index)] + + +def parse_parameter_configs(parameter_configs): + name_ids = {} + dim = 0 + lower_bounds = [] + upper_bounds = [] + parameter_types = [] + names = [] + discrete_info = [] + categorical_info = [] + for param_idx, param in enumerate(parameter_configs): + name_ids[param.name] = param_idx + parameter_types.append(param.parameter_type) + names.append(param.name) + if param.parameter_type == api_pb2.DOUBLE: + new_lower = float(param.feasible_space.min) + new_upper = float(param.feasible_space.max) + elif param.parameter_type == api_pb2.INT: + new_lower = int(param.feasible_space.min) + new_upper = int(param.feasible_space.max) + elif param.parameter_type == api_pb2.DISCRETE: + discrete_values = [int(x) for x in param.feasible_space.list] + new_lower = min(discrete_values) + new_upper = max(discrete_values) + discrete_info.append( + {"name": param.name, "values": discrete_values}) + elif param.parameter_type == api_pb2.CATEGORICAL: + num_feasible = len(param.feasible_space.list) + new_lower = [0 for _ in range(num_feasible)] + new_upper = [1 for _ in range(num_feasible)] + categorical_info.append({ + "name": param.name, + "values": param.feasible_space.list, + "number": num_feasible, + }) + if isinstance(new_lower, Iterable): # handles categorical parameters + lower_bounds.extend(new_lower) + upper_bounds.extend(new_upper) + dim += len(new_lower) + else: # handles ints, doubles, and discrete parameters + lower_bounds.append(new_lower) + upper_bounds.append(new_upper) + dim += 1 + parsed_config = ParameterConfig(name_ids, + dim, + lower_bounds, + upper_bounds, + parameter_types, + names, + discrete_info, + categorical_info) + return parsed_config + + +def parse_previous_observations(parameters_list, dim, name_id, types, categorical_info): + parsed_X = np.zeros(shape=(len(parameters_list), dim)) + for row_idx, parameters in enumerate(parameters_list): + offset = 0 + for p in parameters: + map_id = name_id[p.name] + if types[map_id] in [api_pb2.DOUBLE, api_pb2.INT, + api_pb2.DISCRETE]: + parsed_X[row_idx, offset] = float(p.value) + offset += 1 + elif types[map_id] == api_pb2.CATEGORICAL: + for ci in categorical_info: + if ci["name"] == p.name: + value_num = ci["values"].index(p.value) + parsed_X[row_idx, offset + value_num] = 1 + offset += ci["number"] + return parsed_X + + +def parse_metric(y_train, goal): + """ + Parse the metric to the dictionary + """ + y_array = np.array(y_train, dtype=np.float64) + if goal == api_pb2.MINIMIZE: + y_array *= -1 + return y_array + + +def parse_x_next_vector(x_next, param_types, param_names, discrete_info, categorical_info): + """ parse the next suggestion to the proper format """ + counter = 0 + result = [] + if isinstance(x_next, np.ndarray): + x_next = x_next.squeeze(axis=0) + for par_type, par_name in zip(param_types, param_names): + if par_type == api_pb2.INT: + value = int(round(x_next[counter], 0)) + counter = counter + 1 + elif par_type == api_pb2.DOUBLE: + value = float(x_next[counter]) + counter = counter + 1 + elif par_type == api_pb2.DISCRETE: + for param in discrete_info: + if param["name"] == par_name: + value = _deal_with_discrete(param["values"], + x_next[counter]) + counter = counter + 1 + break + elif par_type == api_pb2.CATEGORICAL: + for param in categorical_info: + if param["name"] == par_name: + value = _deal_with_categorical( + feasible_values=param["values"], + one_hot_values=x_next[counter:counter + param["number"]], + ) + counter = counter + param["number"] + break + result.append({"name": par_name, "value": value, "type": par_type}) + return result + + +def parse_x_next_tuple(x_next, param_types, param_names): + result = [] + for value, param_type, param_name in zip(x_next, param_types, param_names): + result.append({"name": param_name, "type": param_type, "value": str(value)}) + return result diff --git a/pkg/suggestion/v1beta1/hyperband/service.py b/pkg/suggestion/v1beta1/hyperband/service.py new file mode 100644 index 00000000000..b3a86bd8a08 --- /dev/null +++ b/pkg/suggestion/v1beta1/hyperband/service.py @@ -0,0 +1,341 @@ +import math +import traceback +import grpc +import logging +from logging import getLogger, StreamHandler, DEBUG + +from pkg.apis.manager.v1beta1.python import api_pb2 +from pkg.apis.manager.v1beta1.python import api_pb2_grpc +from pkg.suggestion.v1beta1.hyperband import parsing_util +from pkg.suggestion.v1beta1.internal.base_health_service import HealthServicer + +logger = getLogger(__name__) +FORMAT = '%(asctime)-15s Experiment %(experiment_name)s %(message)s' +logging.basicConfig(format=FORMAT) +handler = StreamHandler() +handler.setLevel(DEBUG) +logger.setLevel(DEBUG) +logger.addHandler(handler) + + +class HyperbandService(api_pb2_grpc.SuggestionServicer, HealthServicer): + def GetSuggestions(self, request, context): + """ + Main function to provide suggestion. + """ + try: + reply = api_pb2.GetSuggestionsReply() + experiment = request.experiment + self.all_trials = request.trials + alg_settings = experiment.spec.algorithm.algorithm_setting + + param = HyperBandParam.convert(alg_settings) + if param.current_s < 0: + # Hyperband outlerloop has finished + return reply + # This is a hack to get request number. + param.n = request.request_number + + trials = self._make_bracket(experiment, param) + for trial in trials: + reply.parameter_assignments.add(assignments=trial.parameter_assignments.assignments) + reply.algorithm.CopyFrom(HyperBandParam.generate(param)) + return reply + except Exception as e: + logger.error("Fail to generate trials: \n%s", + traceback.format_exc(), extra={"experiment_name": experiment.name}) + raise e + + def _update_hbParameters(self, param): + param.current_i += 1 + if param.current_i > param.current_s: + self._new_hbParameters(param) + + def _new_hbParameters(self, param): + param.current_s -= 1 + param.current_i = 0 + if param.current_s >= 0: + # when param.current_s < 0, hyperband algorithm reaches the end + param.n = int(math.ceil(float(param.s_max + 1) * ( + float(param.eta**param.current_s) / float(param.current_s+1)))) + param.r = param.r_l * \ + param.eta**(-param.current_s) + + def _make_bracket(self, experiment, param): + if param.evaluating_trials == 0: + trialSpecs = self._make_master_bracket(experiment, param) + else: + trialSpecs = self._make_child_bracket(experiment, param) + if param.current_i < param.current_s: + param.evaluating_trials = len(trialSpecs) + else: + param.evaluating_trials = 0 + + logger.info("HyperBand Param eta %d.", + param.eta, extra={"experiment_name": experiment.name}) + logger.info("HyperBand Param R %d.", + param.r_l, extra={"experiment_name": experiment.name}) + logger.info("HyperBand Param sMax %d.", + param.s_max, extra={"experiment_name": experiment.name}) + logger.info("HyperBand Param B %d.", + param.b_l, extra={"experiment_name": experiment.name}) + logger.info("HyperBand Param n %d.", + param.n, extra={"experiment_name": experiment.name}) + logger.info("HyperBand Param r %d.", + param.r, extra={"experiment_name": experiment.name}) + logger.info("HyperBand Param s %d.", + param.current_s, extra={"experiment_name": experiment.name}) + logger.info("HyperBand Param i %d.", + param.current_i, extra={"experiment_name": experiment.name}) + logger.info("HyperBand evaluating trials count %d.", + param.evaluating_trials, extra={"experiment_name": experiment.name}) + logger.info("HyperBand budget resource name %s.", + param.resource_name, extra={"experiment_name": experiment.name}) + if param.evaluating_trials == 0: + self._new_hbParameters(param) + + return trialSpecs + + def _make_child_bracket(self, experiment, param): + n_i = math.ceil(param.n * param.eta**(-param.current_i)) + top_trials_num = int(math.ceil(n_i / param.eta)) + self._update_hbParameters(param) + r_i = int(param.r * param.eta**param.current_i) + last_trials = self._get_top_trial( + param.evaluating_trials, top_trials_num, experiment) + trialSpecs = self._copy_trials( + last_trials, r_i, param.resource_name) + + logger.info("Generate %d trials by child bracket.", + top_trials_num, extra={"experiment_name": experiment.name}) + return trialSpecs + + def _get_last_trials(self, all_trials, latest_trials_num): + sorted_trials = sorted( + all_trials, key=lambda trial: trial.status.start_time) + if len(sorted_trials) > latest_trials_num: + return sorted_trials[-latest_trials_num:] + else: + return sorted_trials + + def _get_top_trial(self, latest_trials_num, top_trials_num, experiment): + objective_metric = experiment.spec.objective.objective_metric_name + objective_type = experiment.spec.objective.type + + def get_objective_value(t): + for m in t.status.observation.metrics: + if m.name == objective_metric: + return float(m.value) + + top_trials = [] + all_trials = self.all_trials + latest_trials = self._get_last_trials(all_trials, latest_trials_num) + + for t in latest_trials: + if t.status.condition != api_pb2.TrialStatus.TrialConditionType.SUCCEEDED: + raise Exception( + "There are some trials which are not completed yet for experiment %s." % experiment.name) + + if objective_type == api_pb2.MAXIMIZE: + top_trials.extend( + sorted(latest_trials, key=get_objective_value, reverse=True)) + else: + top_trials.extend(sorted(latest_trials, key=get_objective_value)) + return top_trials[:top_trials_num] + + def _copy_trials(self, trials, r_i, resourceName): + trialSpecs = [] + for t in trials: + trial_spec = api_pb2.TrialSpec() + for assignment in t.spec.parameter_assignments.assignments: + if assignment.name == resourceName: + value = str(r_i) + else: + value = assignment.value + trial_spec.parameter_assignments.assignments.add(name=assignment.name, + value=value) + trialSpecs.append(trial_spec) + return trialSpecs + + def _make_master_bracket(self, experiment, param): + n = param.n + r = int(param.r) + parameter_config = parsing_util.parse_parameter_configs( + experiment.spec.parameter_specs.parameters) + trial_specs = [] + for _ in range(n): + sample = parameter_config.random_sample() + suggestion = parsing_util.parse_x_next_vector( + sample, + parameter_config.parameter_types, + parameter_config.names, + parameter_config.discrete_info, + parameter_config.categorical_info) + trial_spec = api_pb2.TrialSpec() + trial_spec.experiment_name = experiment.name + for hp in suggestion: + if hp['name'] == param.resource_name: + hp['value'] = str(r) + trial_spec.parameter_assignments.assignments.add(name=hp['name'], + value=str(hp['value'])) + trial_specs.append(trial_spec) + logger.info("Generate %d trials by master bracket.", + n, extra={"experiment_name": experiment.name}) + return trial_specs + + def _set_validate_context_error(self, context, error_message): + context.set_code(grpc.StatusCode.INVALID_ARGUMENT) + context.set_details(error_message) + logger.info(error_message) + return api_pb2.ValidateAlgorithmSettingsReply() + + def ValidateAlgorithmSettings(self, request, context): + params = request.experiment.spec.parameter_specs.parameters + settings = request.experiment.spec.algorithm.algorithm_setting + setting_dict = {} + for setting in settings: + setting_dict[setting.name] = setting.value + if "r_l" not in setting_dict or "resource_name" not in setting_dict: + return self._set_validate_context_error(context, "r_l and resource_name must be set.") + try: + rl = float(setting_dict["r_l"]) + except: + return self._set_validate_context_error(context, "r_l must be a positive float number.") + else: + if rl < 0: + return self._set_validate_context_error(context, "r_l must be a positive float number.") + + if "eta" in setting_dict: + eta = int(float(setting_dict["eta"])) + if eta <= 0: + eta = 3 + else: + eta = 3 + + smax = int(math.log(rl)/math.log(eta)) + max_parallel = int(math.ceil(eta**smax)) + if request.experiment.spec.parallel_trial_count < max_parallel: + return self._set_validate_context_error(context, + "parallelTrialCount must be not less than %d." % max_parallel) + + valid_resourceName = False + for param in params: + if param.name == setting_dict["resource_name"]: + valid_resourceName = True + break + if not valid_resourceName: + return self._set_validate_context_error(context, + "value of resource_name setting must be in parameters.") + + return api_pb2.ValidateAlgorithmSettingsReply() + + +class HyperBandParam(object): + def __init__(self, eta=3, s_max=-1, r_l=-1, + b_l=-1, r=-1, n=-1, current_s=-2, + current_i=-1, resource_name="", + evaluating_trials=0): + self.eta = eta + self.s_max = s_max + self.r_l = r_l + self.b_l = b_l + self.r = r + self.n = n + self.current_s = current_s + self.current_i = current_i + self.resource_name = resource_name + self.evaluating_trials = evaluating_trials + + @staticmethod + def generate(param): + algorithm_settings = [ + api_pb2.AlgorithmSetting( + name="eta", + value=str(param.eta) + ), api_pb2.AlgorithmSetting( + name="s_max", + value=str(param.s_max) + ), api_pb2.AlgorithmSetting( + name="r_l", + value=str(param.r_l) + ), api_pb2.AlgorithmSetting( + name="b_l", + value=str(param.b_l) + ), api_pb2.AlgorithmSetting( + name="r", + value=str(param.r) + ), api_pb2.AlgorithmSetting( + name="n", + value=str(param.n) + ), api_pb2.AlgorithmSetting( + name="current_s", + value=str(param.current_s) + ), api_pb2.AlgorithmSetting( + name="current_i", + value=str(param.current_i) + ), api_pb2.AlgorithmSetting( + name="resource_name", + value=param.resource_name + ), api_pb2.AlgorithmSetting( + name="evaluating_trials", + value=str(param.evaluating_trials) + )] + return api_pb2.AlgorithmSpec( + algorithm_setting=algorithm_settings + ) + + @staticmethod + def convert(alg_settings): + """Convert the algorithm settings to HyperBandParam. + """ + param = HyperBandParam() + # Set the param from the algorithm settings. + for setting in alg_settings: + if setting.name == "eta": + param.eta = float(setting.value) + elif setting.name == "r_l": + param.r_l = float(setting.value) + elif setting.name == "b_l": + param.b_l = float(setting.value) + elif setting.name == "n": + param.n = int(float(setting.value)) + elif setting.name == "r": + param.r = int(float(setting.value)) + elif setting.name == "current_s": + param.current_s = int(float(setting.value)) + elif setting.name == "current_i": + param.current_i = int(float(setting.value)) + elif setting.name == "s_max": + param.s_max = int(float(setting.value)) + elif setting.name == "evaluating_trials": + param.evaluating_trials = int(float(setting.value)) + elif setting.name == "resource_name": + param.resource_name = setting.value + else: + logger.info( + "Unknown HyperBand Param %s, ignore it", setting.name) + if param.current_s == -1: + # Hyperband outlerloop has finished + logger.info("HyperBand outlerloop has finished.") + return param + + # Deal with illegal parameter values. + if param.eta <= 0: + param.eta = 3 + if param.s_max < 0: + param.s_max = int( + math.log(param.r_l) / math.log(param.eta)) + if param.b_l < 0: + param.b_l = (param.s_max + 1) * param.r_l + if param.current_s < 0: + param.current_s = param.s_max + if param.current_i < 0: + param.current_i = 0 + if param.n < 0: + param.n = int(math.ceil(float(param.s_max + 1) * ( + float(param.eta**param.current_s) / float(param.current_s+1)))) + if param.r < 0: + param.r = param.r_l * \ + param.eta**(-param.current_s) + + return param diff --git a/pkg/suggestion/v1beta1/hyperopt/__init__.py b/pkg/suggestion/v1beta1/hyperopt/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/pkg/suggestion/v1beta1/hyperopt/base_service.py b/pkg/suggestion/v1beta1/hyperopt/base_service.py new file mode 100644 index 00000000000..acece984915 --- /dev/null +++ b/pkg/suggestion/v1beta1/hyperopt/base_service.py @@ -0,0 +1,235 @@ +import hyperopt +import numpy as np +import logging + +from pkg.suggestion.v1beta1.internal.constant import INTEGER, DOUBLE, CATEGORICAL, DISCRETE, MAX_GOAL +from pkg.suggestion.v1beta1.internal.trial import Assignment + +logger = logging.getLogger(__name__) + +TPE_ALGORITHM_NAME = "tpe" +RANDOM_ALGORITHM_NAME = "random" + + +class BaseHyperoptService(object): + def __init__(self, + algorithm_name=TPE_ALGORITHM_NAME, + algorithm_conf=None, + search_space=None): + self.algorithm_name = algorithm_name + self.algorithm_conf = algorithm_conf or {} + # pop common configurations + random_state = self.algorithm_conf.pop('random_state', None) + + if self.algorithm_name == TPE_ALGORITHM_NAME: + self.hyperopt_algorithm = hyperopt.tpe.suggest + elif self.algorithm_name == RANDOM_ALGORITHM_NAME: + self.hyperopt_algorithm = hyperopt.rand.suggest + # elif algorithm_name == 'hyperopt-anneal': + # self.hyperopt_algorithm = hyperopt.anneal.suggest_batch + # elif algorithm_name == 'hyperopt-mix': + # self.hyperopt_algorithm = hyperopt.mix.suggest + + self.search_space = search_space + # New hyperopt variables + self.hyperopt_rstate = np.random.RandomState(random_state) + self.create_hyperopt_domain() + self.create_fmin() + self.is_first_run = True + + def create_hyperopt_domain(self): + # Construct search space, example: {"x": hyperopt.hp.uniform('x', -10, 10), "x2": hyperopt.hp.uniform('x2', -10, 10)} + hyperopt_search_space = {} + for param in self.search_space.params: + if param.type == INTEGER: + hyperopt_search_space[param.name] = hyperopt.hp.quniform( + param.name, + float(param.min), + float(param.max), + float(param.step)) + elif param.type == DOUBLE: + hyperopt_search_space[param.name] = hyperopt.hp.uniform( + param.name, + float(param.min), + float(param.max)) + elif param.type == CATEGORICAL or param.type == DISCRETE: + hyperopt_search_space[param.name] = hyperopt.hp.choice( + param.name, param.list) + + self.hyperopt_domain = hyperopt.Domain( + None, hyperopt_search_space, pass_expr_memo_ctrl=None) + + def create_fmin(self): + self.fmin = hyperopt.FMinIter( + self.hyperopt_algorithm, + self.hyperopt_domain, + trials=hyperopt.Trials(), + max_evals=-1, + rstate=self.hyperopt_rstate, + verbose=False) + + self.fmin.catch_eval_exceptions = False + + def getSuggestions(self, trials, request_number): + """ + Get the new suggested trials with the given algorithm. + """ + + recorded_trials_names = self.fmin.trials.specs + + hyperopt_trial_new_ids = [] + hyperopt_trial_specs = [] + hyperopt_trial_results = [] + hyperopt_trial_miscs = [] + # Update hyperopt FMin with new completed Trials + for trial in trials: + if {"trial-name": trial.name} not in recorded_trials_names: + # Produce new id for the new Trial + new_id = self.fmin.trials.new_trial_ids(1) + hyperopt_trial_new_ids.append(new_id[0]) + hyperopt_trial_miscs_idxs = {} + # Example: {'l1_normalization': [0.1], 'learning_rate': [0.1], 'hidden2': [1], 'optimizer': [1]} + hyperopt_trial_miscs_vals = {} + + # Insert Trial assignment to the misc + hyperopt_trial_misc = dict( + tid=new_id[0], cmd=self.hyperopt_domain.cmd, workdir=self.hyperopt_domain.workdir) + for param in self.search_space.params: + parameter_value = None + for assignment in trial.assignments: + if assignment.name == param.name: + parameter_value = assignment.value + break + if param.type == INTEGER: + hyperopt_trial_miscs_idxs[param.name] = new_id + hyperopt_trial_miscs_vals[param.name] = [int(parameter_value)] + elif param.type == DOUBLE: + hyperopt_trial_miscs_idxs[param.name] = new_id + hyperopt_trial_miscs_vals[param.name] = [float(parameter_value)] + elif param.type == DISCRETE or param.type == CATEGORICAL: + index_of_value_in_list = param.list.index(parameter_value) + hyperopt_trial_miscs_idxs[param.name] = new_id + hyperopt_trial_miscs_vals[param.name] = [index_of_value_in_list] + + hyperopt_trial_misc["idxs"] = hyperopt_trial_miscs_idxs + hyperopt_trial_misc["vals"] = hyperopt_trial_miscs_vals + hyperopt_trial_miscs.append(hyperopt_trial_misc) + + # Insert Trial name to the spec + hyperopt_trial_spec = { + "trial-name": trial.name + } + hyperopt_trial_specs.append(hyperopt_trial_spec) + + # Insert Trial result to the result + # TODO: Use negative objective value for loss or not + # TODO: Do we need to analyse additional_metrics? + objective_for_hyperopt = float(trial.target_metric.value) + if self.search_space.goal == MAX_GOAL: + # Now hyperopt only supports fmin and we need to reverse objective value for maximization + objective_for_hyperopt = -1 * objective_for_hyperopt + hyperopt_trial_result = { + "loss": objective_for_hyperopt, + "status": hyperopt.STATUS_OK + } + hyperopt_trial_results.append(hyperopt_trial_result) + + if len(trials) > 0: + + # Create new Trial doc + hyperopt_trials = hyperopt.Trials().new_trial_docs( + tids=hyperopt_trial_new_ids, + specs=hyperopt_trial_specs, + results=hyperopt_trial_results, + miscs=hyperopt_trial_miscs) + + for i, _ in enumerate(hyperopt_trials): + hyperopt_trials[i]["state"] = hyperopt.JOB_STATE_DONE + + # Insert new set of Trial to FMin object + # Example: of inserting doc with tunning lr + # [{ + # 'state':2, + # 'tid':5, + # 'spec':{ + # 'trial-name':'tpe-example-48xl8whg' + # }, + # 'result':{ + # 'loss':-0.1135, + # 'status':'ok' + # }, + # 'misc':{ + # 'tid':5, + # 'cmd':('domain_attachment','FMinIter_Domain'), + # 'workdir':None, + # 'idxs':{ + # '--lr':[5] + # }, + # 'vals':{ + # '--lr':[0.025351232898626827] + # } + # }, + # 'exp_key':None, + # 'owner':None, + # 'version':0, + # 'book_time':None, + # 'refresh_time':None + # }] + self.fmin.trials.insert_trial_docs(hyperopt_trials) + self.fmin.trials.refresh() + + # Produce new request_number ids to make new Suggestion + hyperopt_trial_new_ids = self.fmin.trials.new_trial_ids(request_number) + random_state = self.fmin.rstate.randint(2**31 - 1) + if self.algorithm_name == RANDOM_ALGORITHM_NAME: + new_trials = self.hyperopt_algorithm( + new_ids=hyperopt_trial_new_ids, + domain=self.fmin.domain, + trials=self.fmin.trials, + seed=random_state) + elif self.algorithm_name == TPE_ALGORITHM_NAME: + # n_startup_jobs indicates for how many Trials we run random suggestion + # This must be request_number value + # After this tpe suggestion starts analyse Trial info. + # On the first run we can run suggest just once with n_startup_jobs + # Next suggest runs must be for each new Trial generation + if self.is_first_run: + new_trials = self.hyperopt_algorithm( + new_ids=hyperopt_trial_new_ids, + domain=self.fmin.domain, + trials=self.fmin.trials, + seed=random_state, + n_startup_jobs=request_number, + **self.algorithm_conf) + self.is_first_run = False + else: + new_trials = [] + for i in range(request_number): + # hyperopt_algorithm always returns one new Trial + new_trials.append(self.hyperopt_algorithm( + new_ids=[hyperopt_trial_new_ids[i]], + domain=self.fmin.domain, + trials=self.fmin.trials, + seed=random_state, + n_startup_jobs=request_number, + **self.algorithm_conf)[0]) + + # Construct return advisor Trials from new hyperopt Trials + list_of_assignments = [] + for i in range(request_number): + vals = new_trials[i]['misc']['vals'] + list_of_assignments.append(BaseHyperoptService.convert(self.search_space, vals)) + return list_of_assignments + + @staticmethod + def convert(search_space, vals): + assignments = [] + for param in search_space.params: + if param.type == INTEGER: + assignments.append(Assignment(param.name, int(vals[param.name][0]))) + elif param.type == DOUBLE: + assignments.append(Assignment(param.name, vals[param.name][0])) + elif param.type == CATEGORICAL or param.type == DISCRETE: + assignments.append( + Assignment(param.name, param.list[vals[param.name][0]])) + return assignments diff --git a/pkg/suggestion/v1beta1/hyperopt/service.py b/pkg/suggestion/v1beta1/hyperopt/service.py new file mode 100644 index 00000000000..b21cef891ac --- /dev/null +++ b/pkg/suggestion/v1beta1/hyperopt/service.py @@ -0,0 +1,123 @@ +import logging +import grpc + +from pkg.apis.manager.v1beta1.python import api_pb2 +from pkg.apis.manager.v1beta1.python import api_pb2_grpc + +from pkg.suggestion.v1beta1.internal.search_space import HyperParameterSearchSpace +from pkg.suggestion.v1beta1.internal.trial import Trial, Assignment +from pkg.suggestion.v1beta1.hyperopt.base_service import BaseHyperoptService +from pkg.suggestion.v1beta1.internal.base_health_service import HealthServicer + +logger = logging.getLogger(__name__) + + +class HyperoptService(api_pb2_grpc.SuggestionServicer, HealthServicer): + + def __init__(self): + super(HyperoptService, self).__init__() + self.base_service = None + self.is_first_run = True + + def GetSuggestions(self, request, context): + """ + Main function to provide suggestion. + """ + name, config = OptimizerConfiguration.convert_algorithm_spec( + request.experiment.spec.algorithm) + + if self.is_first_run: + search_space = HyperParameterSearchSpace.convert(request.experiment) + self.base_service = BaseHyperoptService( + algorithm_name=name, + algorithm_conf=config, + search_space=search_space) + self.is_first_run = False + + trials = Trial.convert(request.trials) + new_assignments = self.base_service.getSuggestions(trials, request.request_number) + return api_pb2.GetSuggestionsReply( + parameter_assignments=Assignment.generate(new_assignments) + ) + + def ValidateAlgorithmSettings(self, request, context): + is_valid, message = OptimizerConfiguration.validate_algorithm_spec( + request.experiment.spec.algorithm) + if not is_valid: + context.set_code(grpc.StatusCode.INVALID_ARGUMENT) + context.set_details(message) + logger.error(message) + return api_pb2.ValidateAlgorithmSettingsReply() + + +class OptimizerConfiguration: + __conversion_dict = { + 'tpe': { + 'gamma': lambda x: float(x), + 'prior_weight': lambda x: float(x), + 'n_EI_candidates': lambda x: int(x), + "random_state": lambda x: int(x), + }, + "random": { + "random_state": lambda x: int(x), + } + } + + @classmethod + def convert_algorithm_spec(cls, algorithm_spec): + ret = {} + setting_schema = cls.__conversion_dict[algorithm_spec.algorithm_name] + for s in algorithm_spec.algorithm_setting: + if s.name in setting_schema: + ret[s.name] = setting_schema[s.name](s.value) + + return algorithm_spec.algorithm_name, ret + + @classmethod + def validate_algorithm_spec(cls, algorithm_spec): + algo_name = algorithm_spec.algorithm_name + if algo_name == 'tpe': + return cls._validate_tpe_setting(algorithm_spec.algorithm_setting) + elif algo_name == 'random': + return cls._validate_random_setting(algorithm_spec.algorithm_setting) + else: + return False, "unknown algorithm name {}".format(algo_name) + + @classmethod + def _validate_tpe_setting(cls, algorithm_settings): + for s in algorithm_settings: + try: + if s.name == 'gamma': + if not 1 > float(s.value) > 0: + return False, "gamma should be in the range of (0, 1)" + elif s.name == 'prior_weight': + if not float(s.value) > 0: + return False, "prior_weight should be great than zero" + elif s.name == 'n_EI_candidates': + if not int(s.value) > 0: + return False, "n_EI_candidates should be great than zero" + elif s.name == 'random_state': + if not int(s.value) >= 0: + return False, "random_state should be great or equal than zero" + else: + return False, "unknown setting {} for algorithm tpe".format(s.name) + except Exception as e: + return False, "failed to validate {name}({value}): {exception}".format( + name=s.name, value=s.value, exception=e) + + return True, "" + + @classmethod + def _validate_random_setting(cls, algorithm_settings): + for s in algorithm_settings: + try: + if s.name == 'random_state': + if not (int(s.value) >= 0): + return False, "random_state should be great or equal than zero" + else: + return False, "unknown setting {} for algorithm random".format(s.name) + except Exception as e: + return False, "failed to validate {name}({value}): {exception}".format( + name=s.name, value=s.value, exception=e) + + return True, "" diff --git a/pkg/suggestion/v1beta1/internal/__init__.py b/pkg/suggestion/v1beta1/internal/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/pkg/suggestion/v1beta1/internal/base_health_service.py b/pkg/suggestion/v1beta1/internal/base_health_service.py new file mode 100644 index 00000000000..509f9423367 --- /dev/null +++ b/pkg/suggestion/v1beta1/internal/base_health_service.py @@ -0,0 +1,166 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Reference implementation for health checking in gRPC Python.""" + +import collections +import threading + +import grpc + +from pkg.apis.manager.health.python import health_pb2 as _health_pb2 +from pkg.apis.manager.health.python import health_pb2_grpc as _health_pb2_grpc + +SERVICE_NAME = _health_pb2.DESCRIPTOR.services_by_name['Health'].full_name + + +class _Watcher: + def __init__(self): + self._condition = threading.Condition() + self._responses = collections.deque() + self._open = True + + def __iter__(self): + return self + + def _next(self): + with self._condition: + while not self._responses and self._open: + self._condition.wait() + if self._responses: + return self._responses.popleft() + else: + raise StopIteration() + + def next(self): + return self._next() + + def __next__(self): + return self._next() + + def add(self, response): + with self._condition: + self._responses.append(response) + self._condition.notify() + + def close(self): + with self._condition: + self._open = False + self._condition.notify() + + +def _watcher_to_send_response_callback_adapter(watcher): + + def send_response_callback(response): + if response is None: + watcher.close() + else: + watcher.add(response) + + return send_response_callback + + +class HealthServicer(_health_pb2_grpc.HealthServicer): + """Servicer handling RPCs for service statuses.""" + + def __init__(self, + experimental_non_blocking=True, + experimental_thread_pool=None): + self._lock = threading.RLock() + self._server_status = {} + self._send_response_callbacks = {} + self.Watch.__func__.experimental_non_blocking = experimental_non_blocking + self.Watch.__func__.experimental_thread_pool = experimental_thread_pool + self._gracefully_shutting_down = False + self.set("manager.v1beta1.Suggestion", _health_pb2.HealthCheckResponse.SERVING) + + def _on_close_callback(self, send_response_callback, service): + + def callback(): + with self._lock: + self._send_response_callbacks[service].remove( + send_response_callback) + send_response_callback(None) + + return callback + + def Check(self, request, context): + with self._lock: + status = self._server_status.get(request.service) + if status is None: + print(request.service) + context.set_code(grpc.StatusCode.NOT_FOUND) + return _health_pb2.HealthCheckResponse() + else: + return _health_pb2.HealthCheckResponse(status=status) + + # pylint: disable=arguments-differ + def Watch(self, request, context, send_response_callback=None): + blocking_watcher = None + if send_response_callback is None: + # The server does not support the experimental_non_blocking + # parameter. For backwards compatibility, return a blocking response + # generator. + blocking_watcher = _Watcher() + send_response_callback = _watcher_to_send_response_callback_adapter( + blocking_watcher) + service = request.service + with self._lock: + status = self._server_status.get(service) + if status is None: + status = _health_pb2.HealthCheckResponse.SERVICE_UNKNOWN # pylint: disable=no-member + send_response_callback( + _health_pb2.HealthCheckResponse(status=status)) + if service not in self._send_response_callbacks: + self._send_response_callbacks[service] = set() + self._send_response_callbacks[service].add(send_response_callback) + context.add_callback( + self._on_close_callback(send_response_callback, service)) + return blocking_watcher + + def set(self, service, status): + """Sets the status of a service. + + Args: + service: string, the name of the service. NOTE, '' must be set. + status: HealthCheckResponse.status enum value indicating the status of + the service + """ + with self._lock: + if self._gracefully_shutting_down: + return + else: + self._server_status[service] = status + if service in self._send_response_callbacks: + for send_response_callback in self._send_response_callbacks[ + service]: + send_response_callback( + _health_pb2.HealthCheckResponse(status=status)) + + def enter_graceful_shutdown(self): + """Permanently sets the status of all services to NOT_SERVING. + + This should be invoked when the server is entering a graceful shutdown + period. After this method is invoked, future attempts to set the status + of a service will be ignored. + + This is an EXPERIMENTAL API. + """ + with self._lock: + if self._gracefully_shutting_down: + return + else: + for service in self._server_status: + self.set(service, + _health_pb2.HealthCheckResponse.NOT_SERVING) # pylint: disable=no-member + self._gracefully_shutting_down = True diff --git a/pkg/suggestion/v1beta1/internal/constant.py b/pkg/suggestion/v1beta1/internal/constant.py new file mode 100644 index 00000000000..e0b9715e938 --- /dev/null +++ b/pkg/suggestion/v1beta1/internal/constant.py @@ -0,0 +1,7 @@ +MAX_GOAL = "MAXIMIZE" +MIN_GOAL = "MINIMIZE" + +INTEGER = "INTEGER" +DOUBLE = "DOUBLE" +CATEGORICAL = "CATEGORICAL" +DISCRETE = "DISCRETE" diff --git a/pkg/suggestion/v1beta1/internal/search_space.py b/pkg/suggestion/v1beta1/internal/search_space.py new file mode 100644 index 00000000000..01966b099c9 --- /dev/null +++ b/pkg/suggestion/v1beta1/internal/search_space.py @@ -0,0 +1,82 @@ +import logging +from pkg.apis.manager.v1beta1.python import api_pb2 as api + +from pkg.suggestion.v1beta1.internal.constant import * + + +logging.basicConfig(level=logging.DEBUG) +logger = logging.getLogger(__name__) + + +class HyperParameterSearchSpace(object): + def __init__(self): + self.goal = "" + self.params = [] + + @staticmethod + def convert(experiment): + search_space = HyperParameterSearchSpace() + if experiment.spec.objective.type == api.MAXIMIZE: + search_space.goal = MAX_GOAL + elif experiment.spec.objective.type == api.MINIMIZE: + search_space.goal = MIN_GOAL + for p in experiment.spec.parameter_specs.parameters: + search_space.params.append( + HyperParameterSearchSpace.convertParameter(p)) + return search_space + + def __str__(self): + return "HyperParameterSearchSpace(goal: {}, ".format(self.goal) + \ + "params: {})".format(", ".join([element.__str__() for element in self.params])) + + @staticmethod + def convertParameter(p): + if p.parameter_type == api.INT: + # Default value for INT parameter step is 1 + step = 1 + if p.feasible_space.step is not None and p.feasible_space.step != "": + step = p.feasible_space.step + return HyperParameter.int(p.name, p.feasible_space.min, p.feasible_space.max, step) + elif p.parameter_type == api.DOUBLE: + return HyperParameter.double(p.name, p.feasible_space.min, p.feasible_space.max, p.feasible_space.step) + elif p.parameter_type == api.CATEGORICAL: + return HyperParameter.categorical(p.name, p.feasible_space.list) + elif p.parameter_type == api.DISCRETE: + return HyperParameter.discrete(p.name, p.feasible_space.list) + else: + logger.error( + "Cannot get the type for the parameter: %s (%s)", p.name, p.parameter_type) + + +class HyperParameter(object): + def __init__(self, name, type_, min_, max_, list_, step): + self.name = name + self.type = type_ + self.min = min_ + self.max = max_ + self.list = list_ + self.step = step + + def __str__(self): + if self.type == INTEGER or self.type == DOUBLE: + return "HyperParameter(name: {}, type: {}, min: {}, max: {}, step: {})".format( + self.name, self.type, self.min, self.max, self.step) + else: + return "HyperParameter(name: {}, type: {}, list: {})".format( + self.name, self.type, ", ".join(self.list)) + + @staticmethod + def int(name, min_, max_, step): + return HyperParameter(name, INTEGER, min_, max_, [], step) + + @staticmethod + def double(name, min_, max_, step): + return HyperParameter(name, DOUBLE, min_, max_, [], step) + + @staticmethod + def categorical(name, lst): + return HyperParameter(name, CATEGORICAL, 0, 0, [str(e) for e in lst], 0) + + @staticmethod + def discrete(name, lst): + return HyperParameter(name, DISCRETE, 0, 0, [str(e) for e in lst], 0) diff --git a/pkg/suggestion/v1beta1/internal/trial.py b/pkg/suggestion/v1beta1/internal/trial.py new file mode 100644 index 00000000000..590a382f223 --- /dev/null +++ b/pkg/suggestion/v1beta1/internal/trial.py @@ -0,0 +1,95 @@ +import logging +from pkg.apis.manager.v1beta1.python import api_pb2 as api + + +logging.basicConfig(level=logging.DEBUG) +logger = logging.getLogger(__name__) + + +class Trial(object): + def __init__(self, name, assignments, target_metric, metric_name, additional_metrics): + self.name = name + self.assignments = assignments + self.target_metric = target_metric + self.metric_name = metric_name + self.additional_metrics = additional_metrics + + @staticmethod + def convert(trials): + res = [] + for trial in trials: + if trial.status.condition == api.TrialStatus.TrialConditionType.SUCCEEDED: + new_trial = Trial.convertTrial(trial) + if new_trial is not None: + res.append(Trial.convertTrial(trial)) + return res + + @staticmethod + def convertTrial(trial): + assignments = [] + for assignment in trial.spec.parameter_assignments.assignments: + assignments.append(Assignment.convert(assignment)) + metric_name = trial.spec.objective.objective_metric_name + target_metric, additional_metrics = Metric.convert( + trial.status.observation, metric_name) + # If the target_metric is none, ignore the trial. + if target_metric is not None: + trial = Trial(trial.name, assignments, target_metric, + metric_name, additional_metrics) + return trial + return None + + def __str__(self): + if self.name is None: + return "Trial(assignment: {})".format(", ".join([str(e) for e in self.assignments])) + else: + return "Trial(assignment: {}, metric_name: {}, metric: {}, additional_metrics: {})".format( + ", ".join([str(e) for e in self.assignments]), + self.metric_name, self.target_metric, + ", ".join(str(e) for e in self.additional_metrics)) + + +class Assignment(object): + def __init__(self, name, value): + self.name = name + self.value = value + + @staticmethod + def convert(assignment): + return Assignment(assignment.name, assignment.value) + + @staticmethod + def generate(list_of_assignments): + res = [] + for assignments in list_of_assignments: + buf = [] + for assignment in assignments: + buf.append( + api.ParameterAssignment(name=assignment.name, value=str(assignment.value))) + rt = api.GetSuggestionsReply.ParameterAssignments( + assignments=buf) + res.append(rt) + return res + + def __str__(self): + return "Assignment(name={}, value={})".format(self.name, self.value) + + +class Metric(object): + def __init__(self, name, value): + self.name = name + self.value = value + + @staticmethod + def convert(observation, target): + metric = None + additional_metrics = [] + for m in observation.metrics: + if m.name == target: + metric = Metric(m.name, m.value) + else: + additional_metrics.append(Metric(m.name, m.value)) + return metric, additional_metrics + + def __str__(self): + return "Metric(name={}, value={})".format(self.name, self.value) diff --git a/pkg/suggestion/v1beta1/nas/darts/README.md b/pkg/suggestion/v1beta1/nas/darts/README.md new file mode 100644 index 00000000000..ec7f4a1ec5a --- /dev/null +++ b/pkg/suggestion/v1beta1/nas/darts/README.md @@ -0,0 +1,84 @@ +# About the Differentiable Architecture Search + +The algorithm follows the idea proposed in _DARTS: Differentiable Architecture Search_ by Hanxiao Liu, Karen Simonyan, Yiming Yang (https://arxiv.org/abs/1806.09055). + +The implementation is based on [official github implementation](https://github.com/quark0/darts) and [popular repository](https://github.com/khanrc/pt.darts). + +The algorithm addresses the scalability challenge of architecture search by formulating the task in a differentiable manner. It is based on continuous relaxation and gradient descent in the search space. It is able to efficiently design high-performance convolutional architectures for image classification (on CIFAR-10 and ImageNet) and recurrent architectures for language modeling (on Penn Treebank and WikiText-2). + +## Katib implementation + +To support DARTS in current Katib functionality the implementation follows this way: + +1. DARTS Suggestion service creates set of primitive operations from the Experiment search space. For example: `['separable_convolution_3x3', 'dilated_convolution_3x3', 'dilated_convolution_5x5', 'avg_pooling_3x3', 'max_pooling_3x3', 'skip_connection']`. + +2. Suggestion returns algorithm settings, number of layers and set of primitives to Katib Controller + +3. Katib controller starts training container with appropriate settings and all possible operations. + +4. Training container runs DARTS algorithm. + +5. Metrics collector saves Best Genotype from the training container log. + +Experiment example you can find [here](https://github.com/kubeflow/katib/blob/master/examples/v1beta1/nas/darts-example-gpu.yaml). +You can find DARTS Suggestion service source code [here](https://github.com/kubeflow/katib/tree/master/pkg/suggestion/v1beta1/nas/darts) and DARTS training container implementation [here](https://github.com/kubeflow/katib/tree/master/examples/v1beta1/nas/darts-cnn-cifar10). + +### Best Genotype representation + +Best Genotype is the best cell for each neural network layer. Cells are generated by DARTS algorithm. +Here is an example of the Best Genotype: + +``` +Genotype( + normal=[ + [('max_pooling_3x3',0),('max_pooling_3x3',1)], + [('max_pooling_3x3',0),('max_pooling_3x3',1)], + [('max_pooling_3x3',0),('dilated_convolution_3x3',3)], + [('max_pooling_3x3',0),('max_pooling_3x3',1)] + ], + normal_concat=range(2,6), + reduce=[ + [('dilated_convolution_5x5',1),('separable_convolution_3x3',0)], + [('max_pooling_3x3',2),('dilated_convolution_5x5',1)], + [('dilated_convolution_5x5',3),('dilated_convolution_5x5',2)], + [('dilated_convolution_5x5',3),('dilated_convolution_5x5',4)] + ], + reduce_concat=range(2,6) +) +``` + +In this example you can see 4 DARTS nodes with indexes: 2,3,4,5. + +`reduce` parameter is the cells which located at the 1/3 and 2/3 of the total neural network layers. They represent reduction cells in which all the operations adjacent to the input nodes are of stride two. + +`normal` parameter is the cells which is located at the rest neural network layers. They represent normal cell. + +In CNN all reduce and normal intermediate nodes are concatenated and each node has 2 edges. + +Each element in `normal` array is the node which has 2 edges. First element is the operation on the edge and second element is the node index connection. Note that index 0 is the `C_{k-2}` node and index 1 is the `C_{k-1}` node. + +For example `[('max_pooling_3x3',0),('max_pooling_3x3',1)]` means that `C_{k-2}` node connects to the first node with `max_pooling_3x3` operation (Max Pooling with filter size 3) and `C_{k-1}` node connects to the first node with `max_pooling_3x3` operation. + +`reduce` array follows the same way as `normal` array. + +`normal_concat` and `reduce_concat` means concatenation between intermediate nodes. + +Currently, it supports running only on single GPU and second-order approximation, which produced better results than first-order. + +## TODO list + +- Integrate E2E test in CI. Create simple example, which can run on CPU. + +- Add validation to Suggestion service. + +- Support multi GPU training. Add functionality to select GPU for training. + +- Support DARTS in Katib UI. + +- Think about better representation of Best Genotype. + +- Add more dataset for CNN. Currently, it supports only CIFAR-10. + +- Support RNN in addition to CNN. + +- Support micro mode, which means searching for a particular neural network cell. diff --git a/pkg/suggestion/v1beta1/nas/darts/__init__.py b/pkg/suggestion/v1beta1/nas/darts/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/pkg/suggestion/v1beta1/nas/darts/service.py b/pkg/suggestion/v1beta1/nas/darts/service.py new file mode 100644 index 00000000000..b05a41f79dc --- /dev/null +++ b/pkg/suggestion/v1beta1/nas/darts/service.py @@ -0,0 +1,123 @@ +import logging +from logging import getLogger, StreamHandler, INFO +import json + +from pkg.suggestion.v1beta1.internal.base_health_service import HealthServicer +from pkg.apis.manager.v1beta1.python import api_pb2 +from pkg.apis.manager.v1beta1.python import api_pb2_grpc + + +class DartsService(api_pb2_grpc.SuggestionServicer, HealthServicer): + + def __init__(self): + super(DartsService, self).__init__() + self.is_first_run = True + + self.logger = getLogger(__name__) + FORMAT = '%(asctime)-15s Experiment %(experiment_name)s %(message)s' + logging.basicConfig(format=FORMAT) + handler = StreamHandler() + handler.setLevel(INFO) + self.logger.setLevel(INFO) + self.logger.addHandler(handler) + self.logger.propagate = False + + # TODO: Add validation + def ValidateAlgorithmSettings(self, request, context): + return api_pb2.ValidateAlgorithmSettingsReply() + + def GetSuggestions(self, request, context): + if self.is_first_run: + nas_config = request.experiment.spec.nas_config + num_layers = str(nas_config.graph_config.num_layers) + + search_space = get_search_space(nas_config.operations) + + settings_raw = request.experiment.spec.algorithm.algorithm_setting + algorithm_settings = get_algorithm_settings(settings_raw) + + search_space_json = json.dumps(search_space) + algorithm_settings_json = json.dumps(algorithm_settings) + + search_space_str = str(search_space_json).replace('\"', '\'') + algorithm_settings_str = str(algorithm_settings_json).replace('\"', '\'') + + self.is_first_run = False + + parameter_assignments = [] + for i in range(request.request_number): + + self.logger.info(">>> Generate new Darts Trial Job") + + self.logger.info(">>> Number of layers {}\n".format(num_layers)) + + self.logger.info(">>> Search Space") + self.logger.info("{}\n".format(search_space_str)) + + self.logger.info(">>> Algorithm Settings") + self.logger.info("{}\n\n".format(algorithm_settings_str)) + + parameter_assignments.append( + api_pb2.GetSuggestionsReply.ParameterAssignments( + assignments=[ + api_pb2.ParameterAssignment( + name="algorithm-settings", + value=algorithm_settings_str + ), + api_pb2.ParameterAssignment( + name="search-space", + value=search_space_str + ), + api_pb2.ParameterAssignment( + name="num-layers", + value=num_layers + ) + ] + ) + ) + + return api_pb2.GetSuggestionsReply(parameter_assignments=parameter_assignments) + + +def get_search_space(operations): + search_space = [] + + for operation in list(operations.operation): + opt_type = operation.operation_type + + if opt_type == "skip_connection": + search_space.append(opt_type) + else: + # Currently support only one Categorical parameter - filter size + opt_spec = list(operation.parameter_specs.parameters)[0] + for filter_size in list(opt_spec.feasible_space.list): + search_space.append(opt_type+"_{}x{}".format(filter_size, filter_size)) + return search_space + + +# TODO: Add more algorithm settings +def get_algorithm_settings(settings_raw): + + algorithm_settings_default = { + "num_epochs": 50, + "w_lr": 0.025, + "w_lr_min": 0.001, + "w_momentum": 0.9, + "w_weight_decay": 3e-4, + "w_grad_clip": 5., + "alpha_lr": 3e-4, + "alpha_weight_decay": 1e-3, + "batch_size": 128, + "num_workers": 4, + "init_channels": 16, + "print_step": 50, + "num_nodes": 4, + "stem_multiplier": 3, + } + + for setting in settings_raw: + s_name = setting.name + s_value = setting.value + algorithm_settings_default[s_name] = s_value + + return algorithm_settings_default diff --git a/pkg/suggestion/v1beta1/nas/enas/AlgorithmSettings.py b/pkg/suggestion/v1beta1/nas/enas/AlgorithmSettings.py new file mode 100644 index 00000000000..064b503a533 --- /dev/null +++ b/pkg/suggestion/v1beta1/nas/enas/AlgorithmSettings.py @@ -0,0 +1,42 @@ + +algorithmSettingsValidator = { + "controller_hidden_size": [int, [1, 'inf']], + "controller_temperature": [float, [0, 'inf']], + "controller_tanh_const": [float, [0, 'inf']], + "controller_entropy_weight": [float, [0.0, 'inf']], + "controller_baseline_decay": [float, [0.0, 1.0]], + "controller_learning_rate": [float, [0.0, 1.0]], + "controller_skip_target": [float, [0.0, 1.0]], + "controller_skip_weight": [float, [0.0, 'inf']], + "controller_train_steps": [int, [1, 'inf']], + "controller_log_every_steps": [int, [1, 'inf']], +} +enableNoneSettingsList = [ + "controller_temperature", "controller_tanh_const", "controller_entropy_weight", "controller_skip_weight"] + + +def parseAlgorithmSettings(settings_raw): + + algorithm_settings_default = { + "controller_hidden_size": 64, + "controller_temperature": 5., + "controller_tanh_const": 2.25, + "controller_entropy_weight": 1e-5, + "controller_baseline_decay": 0.999, + "controller_learning_rate": 5e-5, + "controller_skip_target": 0.4, + "controller_skip_weight": 0.8, + "controller_train_steps": 50, + "controller_log_every_steps": 10, + } + + for setting in settings_raw: + s_name = setting.name + s_value = setting.value + if s_value == "None": + algorithm_settings_default[s_name] = None + else: + s_type = algorithmSettingsValidator[s_name][0] + algorithm_settings_default[s_name] = s_type(s_value) + + return algorithm_settings_default diff --git a/pkg/suggestion/v1beta1/nas/enas/Controller.py b/pkg/suggestion/v1beta1/nas/enas/Controller.py new file mode 100755 index 00000000000..cb3ec4021b7 --- /dev/null +++ b/pkg/suggestion/v1beta1/nas/enas/Controller.py @@ -0,0 +1,243 @@ +import tensorflow as tf +import numpy as np + + +class Controller(object): + def __init__(self, + num_layers=12, + num_operations=16, + controller_hidden_size=64, + controller_temperature=5., + controller_tanh_const=2.25, + controller_entropy_weight=1e-5, + controller_baseline_decay=0.999, + controller_learning_rate=5e-5, + controller_skip_target=0.4, + controller_skip_weight=0.8, + controller_name="controller", + logger=None): + + self.logger = logger + self.logger.info(">>> Building Controller\n") + + self.num_layers = num_layers + self.num_operations = num_operations + + self.controller_hidden_size = controller_hidden_size + self.controller_temperature = controller_temperature + self.controller_tanh_const = controller_tanh_const + self.controller_entropy_weight = controller_entropy_weight + self.controller_baseline_decay = controller_baseline_decay + self.controller_learning_rate = controller_learning_rate + self.controller_skip_target = controller_skip_target + self.controller_skip_weight = controller_skip_weight + + self.controller_name = controller_name + + self._build_params() + self._build_sampler() + + def _build_params(self): + """Create TF parameters""" + self.logger.info(">>> Building Controller Parameters\n") + initializer = tf.random_uniform_initializer(minval=-0.01, maxval=0.01) + hidden_size = self.controller_hidden_size + + with tf.compat.v1.variable_scope(self.controller_name, initializer=initializer): + with tf.compat.v1.variable_scope("lstm"): + self.w_lstm = tf.compat.v1.get_variable("w", [2 * hidden_size, 4 * hidden_size]) + + self.g_emb = tf.compat.v1.get_variable("g_emb", [1, hidden_size]) + + with tf.compat.v1.variable_scope("embedding"): + self.w_emb = tf.compat.v1.get_variable("w", [self.num_operations, hidden_size]) + + with tf.compat.v1.variable_scope("softmax"): + self.w_soft = tf.compat.v1.get_variable("w", [hidden_size, self.num_operations]) + + with tf.compat.v1.variable_scope('attention'): + self.attn_w_1 = tf.compat.v1.get_variable('w_1', [hidden_size, hidden_size]) + self.attn_w_2 = tf.compat.v1.get_variable("w_2", [hidden_size, hidden_size]) + self.attn_v = tf.compat.v1.get_variable('v', [hidden_size, 1]) + + num_params = sum([np.prod(v.shape) + for v in tf.compat.v1.trainable_variables() if v.name.startswith(self.controller_name)]) + self.logger.info(">>> Controller has {} Trainable params\n".format(num_params)) + + def _build_sampler(self): + """Build the sampler ops and the log_prob ops.""" + self.logger.info(">>> Building Controller Sampler\n") + + hidden_size = self.controller_hidden_size + + arc_seq = [] + sample_log_probs = [] + sample_entropies = [] + + skip_penalties = [] + skip_count = [] + + all_h = [] + all_h_w = [] + + prev_c = tf.zeros([1, hidden_size], tf.float32) + prev_h = tf.zeros([1, hidden_size], tf.float32) + + skip_targets = tf.constant([1.0 - self.controller_skip_target, self.controller_skip_target], + dtype=tf.float32) + + inputs = self.g_emb + + for layer_id in range(self.num_layers): + + next_c, next_h = _lstm(inputs, prev_c, prev_h, self.w_lstm) + prev_c, prev_h = next_c, next_h + + logits = tf.matmul(next_h, self.w_soft) + + if self.controller_temperature is not None: + logits /= self.controller_temperature + if self.controller_tanh_const is not None: + logits = self.controller_tanh_const * tf.tanh(logits) + + func = tf.random.categorical(logits, 1) + func = tf.dtypes.cast(func, tf.int32) + func = tf.reshape(func, [1]) + + arc_seq.append(func) + + log_prob = tf.nn.sparse_softmax_cross_entropy_with_logits( + logits=logits, labels=func) + + sample_log_probs.append(log_prob) + entropy = log_prob * tf.exp(-log_prob) + entropy = tf.stop_gradient(entropy) + sample_entropies.append(entropy) + inputs = tf.nn.embedding_lookup(self.w_emb, func) + + next_c, next_h = _lstm(inputs, prev_c, prev_h, self.w_lstm) + prev_c, prev_h = next_c, next_h + + if layer_id > 0: + + query = tf.matmul(next_h, self.attn_w_2) + query = query + tf.concat(all_h_w, axis=0) + query = tf.tanh(query) + query = tf.matmul(query, self.attn_v) + + logits = tf.concat([-query, query], axis=1) + + if self.controller_temperature is not None: + logits /= self.controller_temperature + if self.controller_tanh_const is not None: + logits = self.controller_tanh_const * tf.tanh(logits) + + skip_index = tf.random.categorical(logits, 1) + skip_index = tf.dtypes.cast(skip_index, tf.int32) + + skip_index = tf.reshape(skip_index, [layer_id]) + arc_seq.append(skip_index) + + skip_prob = tf.sigmoid(logits) + kl = skip_prob * tf.math.log(skip_prob/skip_targets) + kl = tf.reduce_sum(kl) + skip_penalties.append(kl) + + log_prob = tf.nn.sparse_softmax_cross_entropy_with_logits( + logits=logits, labels=skip_index) + + sample_log_probs.append(tf.reduce_sum(log_prob, keepdims=True)) + + entropy = tf.stop_gradient( + tf.reduce_sum(log_prob * tf.exp(-log_prob), keepdims=True)) + sample_entropies.append(entropy) + + skip_index = tf.dtypes.cast(skip_index, tf.float32) + skip_index = tf.reshape(skip_index, [1, layer_id]) + + skip_count.append(tf.reduce_sum(skip_index)) + + inputs = tf.matmul(skip_index, tf.concat(all_h, axis=0)) + + inputs /= (1.0 + tf.reduce_sum(skip_index)) + else: + inputs = self.g_emb + + all_h.append(next_h) + all_h_w.append(tf.matmul(next_h, self.attn_w_1)) + + arc_seq = tf.concat(arc_seq, axis=0) + self.sample_arc = tf.reshape(arc_seq, [-1]) + + sample_entropies = tf.stack(sample_entropies) + self.sample_entropy = tf.reduce_sum(sample_entropies) + + sample_log_probs = tf.stack(sample_log_probs, axis=0) + self.sample_log_probs = tf.reduce_sum(sample_log_probs) + + skip_penalties = tf.stack(skip_penalties) + self.skip_penalties = tf.reduce_mean(skip_penalties) + + skip_count = tf.stack(skip_count) + self.skip_count = tf.reduce_sum(skip_count) + + def build_trainer(self): + """Build the train ops by connecting Controller with candidate.""" + self.child_val_accuracy = tf.compat.v1.placeholder(tf.float32, shape=()) + + self.reward = self.child_val_accuracy + + normalize = tf.dtypes.cast((self.num_layers * (self.num_layers - 1) / 2), tf.float32) + self.skip_rate = tf.dtypes.cast((self.skip_count / normalize), tf.float32) + + if self.controller_entropy_weight is not None: + self.reward += self.controller_entropy_weight * self.sample_entropy + + self.sample_log_probs = tf.reduce_sum(self.sample_log_probs) + self.baseline = tf.Variable(0.0, dtype=tf.float32, trainable=False) + baseline_update = tf.compat.v1.assign_sub( + self.baseline, (1 - self.controller_baseline_decay) * (self.baseline - self.reward)) + + with tf.control_dependencies([baseline_update]): + self.reward = tf.identity(self.reward) + + self.loss = self.sample_log_probs * (self.reward - self.baseline) + + if self.controller_skip_weight is not None: + self.loss += self.controller_skip_weight * self.skip_penalties + + self.train_step = tf.Variable( + 0, dtype=tf.int32, trainable=False, name=self.controller_name + '_train_step') + + tf_variables = [var for var in tf.compat.v1.trainable_variables() + if var.name.startswith(self.controller_name)] + + self.train_op, self.grad_norm = _build_train_op( + loss=self.loss, + tf_variables=tf_variables, + train_step=self.train_step, + learning_rate=self.controller_learning_rate) + + +# TODO: will remove this function and use tf.nn.LSTMCell instead +def _lstm(x, prev_c, prev_h, w_lstm): + ifog = tf.matmul(tf.concat([x, prev_h], axis=1), w_lstm) + i, f, o, g = tf.split(ifog, 4, axis=1) + i = tf.sigmoid(i) + f = tf.sigmoid(f) + o = tf.sigmoid(o) + g = tf.tanh(g) + next_c = i * g + f * prev_c + next_h = o * tf.tanh(next_c) + return next_c, next_h + + +def _build_train_op(loss, tf_variables, train_step, learning_rate): + """Build training ops from `loss` tensor.""" + optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate) + grads = tf.gradients(loss, tf_variables) + + grad_norm = tf.linalg.global_norm(grads) + train_op = optimizer.apply_gradients(zip(grads, tf_variables), global_step=train_step) + + return train_op, grad_norm diff --git a/pkg/suggestion/v1beta1/nas/enas/Operation.py b/pkg/suggestion/v1beta1/nas/enas/Operation.py new file mode 100644 index 00000000000..f09c48df86c --- /dev/null +++ b/pkg/suggestion/v1beta1/nas/enas/Operation.py @@ -0,0 +1,77 @@ +import itertools +import numpy as np +from pkg.apis.manager.v1beta1.python import api_pb2 + + +class Operation(object): + def __init__(self, opt_id, opt_type, opt_params): + self.opt_id = opt_id + self.opt_type = opt_type + self.opt_params = opt_params + + def get_dict(self): + opt_dict = dict() + opt_dict['opt_id'] = self.opt_id + opt_dict['opt_type'] = self.opt_type + opt_dict['opt_params'] = self.opt_params + return opt_dict + + def print_op(self, logger): + logger.info("Operation ID: \n\t{}".format(self.opt_id)) + logger.info("Operation Type: \n\t{}".format(self.opt_type)) + logger.info("Operations Parameters:") + for ikey in self.opt_params: + logger.info("\t{}: {}".format(ikey, self.opt_params[ikey])) + logger.info("") + + +class SearchSpace(object): + def __init__(self, operations): + self.operation_list = list(operations.operation) + self.search_space = list() + self._parse_operations() + self.num_operations = len(self.search_space) + + def _parse_operations(self): + # search_sapce is a list of Operation class + + operation_id = 0 + + for operation_dict in self.operation_list: + opt_type = operation_dict.operation_type + opt_spec = list(operation_dict.parameter_specs.parameters) + # avail_space is dict with the format {"spec_nam": [spec feasible values]} + avail_space = dict() + num_spec = len(opt_spec) + + for ispec in opt_spec: + spec_name = ispec.name + if ispec.parameter_type == api_pb2.CATEGORICAL: + avail_space[spec_name] = list(ispec.feasible_space.list) + elif ispec.parameter_type == api_pb2.INT: + spec_min = int(ispec.feasible_space.min) + spec_max = int(ispec.feasible_space.max) + spec_step = int(ispec.feasible_space.step) + avail_space[spec_name] = range( + spec_min, spec_max+1, spec_step) + elif ispec.parameter_type == api_pb2.DOUBLE: + spec_min = float(ispec.feasible_space.min) + spec_max = float(ispec.feasible_space.max) + spec_step = float(ispec.feasible_space.step) + double_list = np.arange( + spec_min, spec_max+spec_step, spec_step) + if double_list[-1] > spec_max: + del double_list[-1] + avail_space[spec_name] = double_list + + # generate all the combinations of possible operations + key_avail_space = list(avail_space.keys()) + val_avail_space = list(avail_space.values()) + + for this_opt_vector in itertools.product(*val_avail_space): + opt_params = dict() + for i in range(num_spec): + opt_params[key_avail_space[i]] = this_opt_vector[i] + this_opt_class = Operation(operation_id, opt_type, opt_params) + self.search_space.append(this_opt_class) + operation_id += 1 diff --git a/pkg/suggestion/v1beta1/nas/enas/README.md b/pkg/suggestion/v1beta1/nas/enas/README.md new file mode 100644 index 00000000000..49cf3c3d11a --- /dev/null +++ b/pkg/suggestion/v1beta1/nas/enas/README.md @@ -0,0 +1,136 @@ +# About the Efficient Neural Architecture Search + +The algorithm follows the idea proposed in _Efficient Neural Architecture Search via Parameter Sharing_ by Hieu Pham, Melody Y. Guan, Barret Zoph, Quoc V. Le and Jeff Dean (https://arxiv.org/abs/1802.03268) and _Neural Architecture Search with Reinforcement Learning_ by Barret Zoph and Quoc V. Le (https://arxiv.org/abs/1611.01578). + +The implementation is based on the github of _Efficient Neural Architecture Search via Parameter Sharing_ (https://github.com/melodyguan/enas and https://github.com/google-research/google-research/tree/master/enas_lm). It uses a recurrent neural network with LSTM cells as controller to generate neural architecture candidates. And this controller network is updated by policy gradients. However, it currently does not support parameter sharing. + +## Definition of a Neural Architecture + +Define the number of layers is n, the number of possible operations is m. + +If n = 12, m = 6, the definition of an architecture will be like: + +``` +[2] +[0 0] +[1 1 0] +[5 1 0 1] +[1 1 1 0 1] +[5 0 0 1 0 1] +[1 1 1 0 0 1 0] +[2 0 0 0 1 1 0 1] +[0 0 0 1 1 1 1 1 0] +[2 0 1 0 1 1 1 0 0 0] +[3 1 1 1 1 1 1 0 0 1 1] +[0 1 1 1 1 0 0 1 1 1 1 0] +``` + +There are n rows, the ith row has i elements and describes the ith layer. Please notice that layer 0 is the input and is not included in this definition. + +In each row, the first integer ranges from 0 to m-1 and indicates the operation in this layer. +Starting from the second position, the kth integer is a boolean value that indicates whether (k-2)th layer has a skip connection with this layer. (There will always be a connection from (k-1)th layer to kth layer) + +## Output of `GetSuggestion()` + +The output of `GetSuggestion()` consists of two parts: `architecture` and `nn_config`. + +`architecture` is a json string of the definition of a neural architecture. The format is as stated above. One example is: + +``` +[[27], [29, 0], [22, 1, 0], [13, 0, 0, 0], [26, 1, 1, 0, 0], [30, 1, 0, 1, 0, 0], [11, 0, 1, 1, 0, 1, 1], [9, 1, 0, 0, 1, 0, 0, 0]] +``` + +`nn_config` is a json string of the detailed description of what is the num of layers, input size, output size and what each operation index stands for. A nn_config corresponding to the architecture above can be: + +``` +{ + "num_layers": 8, + "input_sizes": [32, 32, 3], + "output_sizes": [10], + "embedding": { + "27": { + "opt_id": 27, + "opt_type": "convolution", + "opt_params": { + "filter_size": "7", + "num_filter": "96", + "stride": "2" + } + }, + "29": { + "opt_id": 29, + "opt_type": "convolution", + "opt_params": { + "filter_size": "7", + "num_filter": "128", + "stride": "2" + } + }, + "22": { + "opt_id": 22, + "opt_type": "convolution", + "opt_params": { + "filter_size": "7", + "num_filter": "48", + "stride": "1" + } + }, + "13": { + "opt_id": 13, + "opt_type": "convolution", + "opt_params": { + "filter_size": "5", + "num_filter": "48", + "stride": "2" + } + }, + "26": { + "opt_id": 26, + "opt_type": "convolution", + "opt_params": { + "filter_size": "7", + "num_filter": "96", + "stride": "1" + } + }, + "30": { + "opt_id": 30, + "opt_type": "reduction", + "opt_params": { + "reduction_type": "max_pooling", + "pool_size": 2 + } + }, + "11": { + "opt_id": 11, + "opt_type": "convolution", + "opt_params": { + "filter_size": "5", + "num_filter": "32", + "stride": "2" + } + }, + "9": { + "opt_id": 9, + "opt_type": "convolution", + "opt_params": { + "filter_size": "3", + "num_filter": "128", + "stride": "2" + } + } + } +} +``` + +This neural architecture can be visualized as +![a neural network architecture example](example.png) + +## To Do + +1. Add 'micro' mode, which means searching for a neural cell instead of the whole neural network. +2. Add support for recurrent neural networks and build a training container for the Penn Treebank task. +3. Add parameter sharing, if possible. +4. Change LSTM cell from self defined functions in LSTM.py to `tf.nn.rnn_cell.LSTMCell` +5. Store the suggestion checkpoint to PVC to protect against unexpected enas service pod restarts +6. Add `RequestCount` into API so that the suggestion can clean the information of completed studies. diff --git a/pkg/suggestion/v1beta1/nas/enas/__init__.py b/pkg/suggestion/v1beta1/nas/enas/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/pkg/suggestion/v1beta1/nas/enas/example.png b/pkg/suggestion/v1beta1/nas/enas/example.png new file mode 100644 index 00000000000..90ac2eb6190 Binary files /dev/null and b/pkg/suggestion/v1beta1/nas/enas/example.png differ diff --git a/pkg/suggestion/v1beta1/nas/enas/service.py b/pkg/suggestion/v1beta1/nas/enas/service.py new file mode 100644 index 00000000000..0b625a0e641 --- /dev/null +++ b/pkg/suggestion/v1beta1/nas/enas/service.py @@ -0,0 +1,431 @@ +import logging +from logging import getLogger, StreamHandler, INFO +import json +import os +import tensorflow as tf +import grpc + +from pkg.apis.manager.v1beta1.python import api_pb2 +from pkg.apis.manager.v1beta1.python import api_pb2_grpc +from pkg.suggestion.v1beta1.nas.enas.Controller import Controller +from pkg.suggestion.v1beta1.nas.enas.Operation import SearchSpace +from pkg.suggestion.v1beta1.nas.enas.AlgorithmSettings import ( + parseAlgorithmSettings, algorithmSettingsValidator, enableNoneSettingsList) +from pkg.suggestion.v1beta1.internal.base_health_service import HealthServicer + + +class EnasExperiment: + def __init__(self, request, logger): + self.logger = logger + self.experiment_name = request.experiment.name + self.experiment = request.experiment + self.num_trials = 1 + self.tf_graph = tf.Graph() + self.ctrl_cache_file = "ctrl_cache/{}.ckpt".format( + self.experiment_name) + self.suggestion_step = 0 + self.algorithm_settings = None + self.controller = None + self.num_layers = None + self.input_sizes = None + self.output_sizes = None + self.num_operations = None + self.search_space = None + self.opt_direction = None + self.objective_name = None + self.logger.info("-" * 100 + "\nSetting Up Suggestion for Experiment {}\n".format( + self.experiment_name) + "-" * 100) + self._get_experiment_param() + self._setup_controller() + self.logger.info(">>> Suggestion for Experiment {} has been initialized.\n".format( + self.experiment_name)) + + def _get_experiment_param(self): + # this function need to + # 1) get the number of layers + # 2) get the I/O size + # 3) get the available operations + # 4) get the optimization direction (i.e. minimize or maximize) + # 5) get the objective name + # 6) get the algorithm settings + + # Get Search Space + self.opt_direction = self.experiment.spec.objective.type + self.objective_name = self.experiment.spec.objective.objective_metric_name + + nas_config = self.experiment.spec.nas_config + + graph_config = nas_config.graph_config + self.num_layers = int(graph_config.num_layers) + self.input_sizes = list(map(int, graph_config.input_sizes)) + self.output_sizes = list(map(int, graph_config.output_sizes)) + + search_space_raw = nas_config.operations + search_space_object = SearchSpace(search_space_raw) + self.search_space = search_space_object.search_space + self.num_operations = search_space_object.num_operations + + self.print_search_space() + + # Get Experiment Algorithm Settings + settings_raw = self.experiment.spec.algorithm.algorithm_setting + self.algorithm_settings = parseAlgorithmSettings(settings_raw) + + self.print_algorithm_settings() + + def _setup_controller(self): + + with self.tf_graph.as_default(): + + self.controller = Controller( + num_layers=self.num_layers, + num_operations=self.num_operations, + controller_hidden_size=self.algorithm_settings['controller_hidden_size'], + controller_temperature=self.algorithm_settings['controller_temperature'], + controller_tanh_const=self.algorithm_settings['controller_tanh_const'], + controller_entropy_weight=self.algorithm_settings['controller_entropy_weight'], + controller_baseline_decay=self.algorithm_settings['controller_baseline_decay'], + controller_learning_rate=self.algorithm_settings["controller_learning_rate"], + controller_skip_target=self.algorithm_settings['controller_skip_target'], + controller_skip_weight=self.algorithm_settings['controller_skip_weight'], + controller_name="Ctrl_" + self.experiment_name, + logger=self.logger) + + self.controller.build_trainer() + + def print_search_space(self): + if self.search_space is None: + self.logger.warning( + "Error! The Suggestion has not yet been initialized!") + return + + self.logger.info( + ">>> Search Space for Experiment {}".format(self.experiment_name)) + for opt in self.search_space: + opt.print_op(self.logger) + self.logger.info( + "There are {} operations in total.\n".format(self.num_operations)) + + def print_algorithm_settings(self): + if self.algorithm_settings is None: + self.logger.warning( + "Error! The Suggestion has not yet been initialized!") + return + + self.logger.info(">>> Parameters of LSTM Controller for Experiment {}\n".format( + self.experiment_name)) + for spec in self.algorithm_settings: + if len(spec) > 22: + self.logger.info("{}:\t{}".format( + spec, self.algorithm_settings[spec])) + else: + self.logger.info("{}:\t\t{}".format( + spec, self.algorithm_settings[spec])) + + self.logger.info("") + + +class EnasService(api_pb2_grpc.SuggestionServicer, HealthServicer): + def __init__(self, logger=None): + super(EnasService, self).__init__() + self.is_first_run = True + self.experiment = None + if logger == None: + self.logger = getLogger(__name__) + FORMAT = '%(asctime)-15s Experiment %(experiment_name)s %(message)s' + logging.basicConfig(format=FORMAT) + handler = StreamHandler() + handler.setLevel(INFO) + self.logger.setLevel(INFO) + self.logger.addHandler(handler) + self.logger.propagate = False + else: + self.logger = logger + + if not os.path.exists("ctrl_cache/"): + os.makedirs("ctrl_cache/") + + def ValidateAlgorithmSettings(self, request, context): + self.logger.info("Validate Algorithm Settings start") + graph_config = request.experiment.spec.nas_config.graph_config + + # Validate GraphConfig + # Check InputSize + if not graph_config.input_sizes: + return self.SetValidateContextError(context, "Missing InputSizes in GraphConfig:\n{}".format(graph_config)) + + # Check OutputSize + if not graph_config.output_sizes: + return self.SetValidateContextError(context, "Missing OutputSizes in GraphConfig:\n{}".format(graph_config)) + + # Check NumLayers + if not graph_config.num_layers: + return self.SetValidateContextError(context, "Missing NumLayers in GraphConfig:\n{}".format(graph_config)) + + # Validate each operation + operations_list = list( + request.experiment.spec.nas_config.operations.operation) + for operation in operations_list: + + # Check OperationType + if not operation.operation_type: + return self.SetValidateContextError(context, "Missing operationType in Operation:\n{}".format(operation)) + + # Check ParameterConfigs + if not operation.parameter_specs.parameters: + return self.SetValidateContextError(context, "Missing ParameterConfigs in Operation:\n{}".format(operation)) + + # Validate each ParameterConfig in Operation + parameters_list = list(operation.parameter_specs.parameters) + for parameter in parameters_list: + + # Check Name + if not parameter.name: + return self.SetValidateContextError(context, "Missing Name in ParameterConfig:\n{}".format(parameter)) + + # Check ParameterType + if not parameter.parameter_type: + return self.SetValidateContextError(context, "Missing ParameterType in ParameterConfig:\n{}".format(parameter)) + + # Check List in Categorical or Discrete Type + if parameter.parameter_type == api_pb2.CATEGORICAL or parameter.parameter_type == api_pb2.DISCRETE: + if not parameter.feasible_space.list: + return self.SetValidateContextError(context, "Missing List in ParameterConfig.feasibleSpace:\n{}".format(parameter)) + + # Check Max, Min, Step in Int or Double Type + elif parameter.parameter_type == api_pb2.INT or parameter.parameter_type == api_pb2.DOUBLE: + if not parameter.feasible_space.min and not parameter.feasible_space.max: + return self.SetValidateContextError(context, "Missing Max and Min in ParameterConfig.feasibleSpace:\n{}".format(parameter)) + + if parameter.parameter_type == api_pb2.DOUBLE and (not parameter.feasible_space.step or float(parameter.feasible_space.step) <= 0): + return self.SetValidateContextError(context, "Step parameter should be > 0 in ParameterConfig.feasibleSpace:\n{}".format(parameter)) + + # Validate Algorithm Settings + settings_raw = request.experiment.spec.algorithm.algorithm_setting + for setting in settings_raw: + if setting.name in algorithmSettingsValidator.keys(): + if setting.name in enableNoneSettingsList and setting.value == "None": + continue + setting_type = algorithmSettingsValidator[setting.name][0] + setting_range = algorithmSettingsValidator[setting.name][1] + try: + converted_value = setting_type(setting.value) + except: + return self.SetValidateContextError(context, "Algorithm Setting {} must be {} type".format(setting.name, setting_type.__name__)) + + if setting_type == float: + if converted_value <= setting_range[0] or (setting_range[1] != 'inf' and converted_value > setting_range[1]): + return self.SetValidateContextError(context, "Algorithm Setting {}: {} with {} type must be in range ({}, {}]".format( + setting.name, converted_value, setting_type.__name__, setting_range[0], setting_range[1] + )) + + elif converted_value < setting_range[0]: + return self.SetValidateContextError(context, "Algorithm Setting {}: {} with {} type must be in range [{}, {})".format( + setting.name, converted_value, setting_type.__name__, setting_range[0], setting_range[1] + )) + else: + return self.SetValidateContextError(context, "Unknown Algorithm Setting name: {}".format(setting.name)) + + self.logger.info("All Experiment Settings are Valid") + return api_pb2.ValidateAlgorithmSettingsReply() + + def SetValidateContextError(self, context, error_message): + context.set_code(grpc.StatusCode.INVALID_ARGUMENT) + context.set_details(error_message) + self.logger.info(error_message) + return api_pb2.ValidateAlgorithmSettingsReply() + + def GetSuggestions(self, request, context): + if self.is_first_run: + self.experiment = EnasExperiment(request, self.logger) + experiment = self.experiment + if request.request_number > 0: + experiment.num_trials = request.request_number + self.logger.info("-" * 100 + "\nSuggestion Step {} for Experiment {}\n".format( + experiment.suggestion_step, experiment.experiment_name) + "-" * 100) + + self.logger.info("") + self.logger.info(">>> RequestNumber:\t\t{}".format(experiment.num_trials)) + self.logger.info("") + + with experiment.tf_graph.as_default(): + saver = tf.compat.v1.train.Saver() + ctrl = experiment.controller + + controller_ops = { + "loss": ctrl.loss, + "entropy": ctrl.sample_entropy, + "grad_norm": ctrl.grad_norm, + "baseline": ctrl.baseline, + "skip_rate": ctrl.skip_rate, + "train_op": ctrl.train_op, + "train_step": ctrl.train_step, + "sample_arc": ctrl.sample_arc, + "child_val_accuracy": ctrl.child_val_accuracy, + } + + if self.is_first_run: + self.logger.info(">>> First time running suggestion for {}. Random architecture will be given.".format( + experiment.experiment_name)) + with tf.compat.v1.Session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + candidates = list() + for _ in range(experiment.num_trials): + candidates.append( + sess.run(controller_ops["sample_arc"])) + + # TODO: will use PVC to store the checkpoint to protect against unexpected suggestion pod restart + saver.save(sess, experiment.ctrl_cache_file) + + self.is_first_run = False + + else: + with tf.compat.v1.Session() as sess: + saver.restore(sess, experiment.ctrl_cache_file) + + result = self.GetEvaluationResult(request.trials) + + # TODO: (andreyvelich) I deleted this part, should it be handle by controller? + # Sometimes training container may fail and GetEvaluationResult() will return None + # In this case, the Suggestion will: + # 1. Firstly try to respawn the previous trials after waiting for RESPAWN_SLEEP seconds + # 2. If respawning the trials for RESPAWN_LIMIT times still cannot collect valid results, + # then fail the task because it may indicate that the training container has errors. + if result is None: + self.logger.warning( + ">>> Suggestion has spawned trials, but they all failed.") + self.logger.warning( + ">>> Please check whether the training container is correctly implemented") + self.logger.info(">>> Experiment {} failed".format( + experiment.experiment_name)) + return [] + + # This LSTM network is designed to maximize the metrics + # However, if the user wants to minimize the metrics, we can take the negative of the result + + if experiment.opt_direction == api_pb2.MINIMIZE: + result = -result + + self.logger.info(">>> Suggestion updated. LSTM Controller Training\n") + log_every = experiment.algorithm_settings["controller_log_every_steps"] + for ctrl_step in range(1, experiment.algorithm_settings["controller_train_steps"]+1): + run_ops = [ + controller_ops["loss"], + controller_ops["entropy"], + controller_ops["grad_norm"], + controller_ops["baseline"], + controller_ops["skip_rate"], + controller_ops["train_op"] + ] + + loss, entropy, grad_norm, baseline, skip_rate, _ = sess.run( + fetches=run_ops, + feed_dict={controller_ops["child_val_accuracy"]: result}) + + controller_step = sess.run(controller_ops["train_step"]) + if ctrl_step % log_every == 0: + log_string = "" + log_string += "Controller Step: {} - ".format(controller_step) + log_string += "Loss: {:.4f} - ".format(loss) + log_string += "Entropy: {:.9} - ".format(entropy) + log_string += "Gradient Norm: {:.7f} - ".format(grad_norm) + log_string += "Baseline={:.4f} - ".format(baseline) + log_string += "Skip Rate={:.4f}".format(skip_rate) + self.logger.info(log_string) + + candidates = list() + for _ in range(experiment.num_trials): + candidates.append( + sess.run(controller_ops["sample_arc"])) + + saver.save(sess, experiment.ctrl_cache_file) + + organized_candidates = list() + parameter_assignments = list() + + for i in range(experiment.num_trials): + arc = candidates[i].tolist() + organized_arc = [0 for _ in range(experiment.num_layers)] + record = 0 + for l in range(experiment.num_layers): + organized_arc[l] = arc[record: record + l + 1] + record += l + 1 + organized_candidates.append(organized_arc) + + nn_config = dict() + nn_config['num_layers'] = experiment.num_layers + nn_config['input_sizes'] = experiment.input_sizes + nn_config['output_sizes'] = experiment.output_sizes + nn_config['embedding'] = dict() + for l in range(experiment.num_layers): + opt = organized_arc[l][0] + nn_config['embedding'][opt] = experiment.search_space[opt].get_dict() + + organized_arc_json = json.dumps(organized_arc) + nn_config_json = json.dumps(nn_config) + + organized_arc_str = str(organized_arc_json).replace('\"', '\'') + nn_config_str = str(nn_config_json).replace('\"', '\'') + + self.logger.info( + "\n>>> New Neural Network Architecture Candidate #{} (internal representation):".format(i)) + self.logger.info(organized_arc_json) + self.logger.info("\n>>> Corresponding Seach Space Description:") + self.logger.info(nn_config_str) + + parameter_assignments.append( + api_pb2.GetSuggestionsReply.ParameterAssignments( + assignments=[ + api_pb2.ParameterAssignment( + name="architecture", + value=organized_arc_str + ), + api_pb2.ParameterAssignment( + name="nn_config", + value=nn_config_str + ) + ] + ) + ) + + self.logger.info("") + self.logger.info(">>> {} Trials were created for Experiment {}".format( + experiment.num_trials, experiment.experiment_name)) + self.logger.info("") + + experiment.suggestion_step += 1 + + return api_pb2.GetSuggestionsReply(parameter_assignments=parameter_assignments) + + def GetEvaluationResult(self, trials_list): + completed_trials = dict() + failed_trials = [] + for t in trials_list: + if t.status.condition == api_pb2.TrialStatus.TrialConditionType.SUCCEEDED: + target_value = None + for metric in t.status.observation.metrics: + if metric.name == t.spec.objective.objective_metric_name: + target_value = metric.value + break + + # Take only the first metric value + # In current cifar-10 training container this value is the latest + completed_trials[t.name] = float(target_value) + + if t.status.condition == api_pb2.TrialStatus.TrialConditionType.FAILED: + failed_trials.append(t.name) + + n_completed = len(completed_trials) + self.logger.info(">>> By now: {} Trials succeeded, {} Trials failed".format( + n_completed, len(failed_trials))) + for tname in completed_trials: + self.logger.info("Trial: {}, Value: {}".format( + tname, completed_trials[tname])) + for tname in failed_trials: + self.logger.info("Trial: {} was failed".format(tname)) + + if n_completed > 0: + avg_metrics = sum(completed_trials.values()) / n_completed + self.logger.info("The average is {}\n".format(avg_metrics)) + + return avg_metrics diff --git a/pkg/suggestion/v1beta1/skopt/__init__.py b/pkg/suggestion/v1beta1/skopt/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/pkg/suggestion/v1beta1/skopt/base_service.py b/pkg/suggestion/v1beta1/skopt/base_service.py new file mode 100644 index 00000000000..2e7717e18f7 --- /dev/null +++ b/pkg/suggestion/v1beta1/skopt/base_service.py @@ -0,0 +1,127 @@ +import datetime +import logging +import skopt + +from pkg.suggestion.v1beta1.internal.constant import INTEGER, DOUBLE, CATEGORICAL, DISCRETE, MAX_GOAL +from pkg.suggestion.v1beta1.internal.trial import Assignment + +logger = logging.getLogger(__name__) + + +class BaseSkoptService(object): + """ + Refer to https://github.com/scikit-optimize/scikit-optimize . + """ + + def __init__(self, + base_estimator="GP", + n_initial_points=10, + acq_func="gp_hedge", + acq_optimizer="auto", + random_state=None, + search_space=None): + self.base_estimator = base_estimator + self.n_initial_points = n_initial_points + self.acq_func = acq_func + self.acq_optimizer = acq_optimizer + self.random_state = random_state + self.search_space = search_space + self.skopt_optimizer = None + self.create_optimizer() + self.succeeded_trials = 0 + # List of recorded Trials names + self.recorded_trials_names = [] + + def create_optimizer(self): + skopt_search_space = [] + + for param in self.search_space.params: + if param.type == INTEGER: + skopt_search_space.append(skopt.space.Integer( + int(param.min), int(param.max), name=param.name)) + elif param.type == DOUBLE: + skopt_search_space.append(skopt.space.Real( + float(param.min), float(param.max), "log-uniform", name=param.name)) + elif param.type == CATEGORICAL or param.type == DISCRETE: + skopt_search_space.append( + skopt.space.Categorical(param.list, name=param.name)) + + self.skopt_optimizer = skopt.Optimizer( + skopt_search_space, + base_estimator=self.base_estimator, + n_initial_points=self.n_initial_points, + acq_func=self.acq_func, + acq_optimizer=self.acq_optimizer, + random_state=self.random_state) + + def getSuggestions(self, trials, request_number): + """ + Get the new suggested trials with skopt algorithm. + """ + logger.info("-" * 100 + "\n") + logger.info("New GetSuggestions call\n") + skopt_suggested = [] + loss_for_skopt = [] + if len(trials) > self.succeeded_trials or self.succeeded_trials == 0: + self.succeeded_trials = len(trials) + if self.succeeded_trials != 0: + logger.info("Succeeded Trials changed: {}\n".format(self.succeeded_trials)) + for trial in trials: + if trial.name not in self.recorded_trials_names: + self.recorded_trials_names.append(trial.name) + trial_assignment = [] + for param in self.search_space.params: + parameter_value = None + for assignment in trial.assignments: + if assignment.name == param.name: + parameter_value = assignment.value + break + if param.type == INTEGER: + trial_assignment.append(int(parameter_value)) + elif param.type == DOUBLE: + trial_assignment.append(float(parameter_value)) + else: + trial_assignment.append(parameter_value) + skopt_suggested.append(trial_assignment) + loss_value = float(trial.target_metric.value) + if self.search_space.goal == MAX_GOAL: + loss_value = -1 * loss_value + loss_for_skopt.append(loss_value) + + if loss_for_skopt != [] and skopt_suggested != []: + logger.info("Running Optimizer tell to record observation") + logger.info("Evaluated parameters: {}".format(skopt_suggested)) + logger.info("Objective values: {}\n".format(loss_for_skopt)) + t1 = datetime.datetime.now() + self.skopt_optimizer.tell(skopt_suggested, loss_for_skopt) + logger.info("Optimizer tell method takes {} seconds".format((datetime.datetime.now()-t1).seconds)) + logger.info("List of recorded Trials names: {}\n".format(self.recorded_trials_names)) + + else: + logger.info("Succeeded Trials didn't change: {}\n".format(self.succeeded_trials)) + + logger.info("Running Optimizer ask to query new parameters for Trials\n") + + return_trial_list = [] + + for i in range(request_number): + skopt_suggested = self.skopt_optimizer.ask() + logger.info("New suggested parameters for Trial: {}".format(skopt_suggested)) + return_trial_list.append( + BaseSkoptService.convert(self.search_space, skopt_suggested)) + + logger.info("GetSuggestions return {} new Trials\n\n".format(request_number)) + return return_trial_list + + @staticmethod + def convert(search_space, skopt_suggested): + assignments = [] + for i in range(len(search_space.params)): + param = search_space.params[i] + if param.type == INTEGER: + assignments.append(Assignment(param.name, skopt_suggested[i])) + elif param.type == DOUBLE: + assignments.append(Assignment(param.name, skopt_suggested[i])) + elif param.type == CATEGORICAL or param.type == DISCRETE: + assignments.append(Assignment(param.name, skopt_suggested[i])) + return assignments diff --git a/pkg/suggestion/v1beta1/skopt/service.py b/pkg/suggestion/v1beta1/skopt/service.py new file mode 100644 index 00000000000..a02662f2d93 --- /dev/null +++ b/pkg/suggestion/v1beta1/skopt/service.py @@ -0,0 +1,74 @@ +import logging + +from pkg.apis.manager.v1beta1.python import api_pb2 +from pkg.apis.manager.v1beta1.python import api_pb2_grpc +from pkg.suggestion.v1beta1.internal.search_space import HyperParameterSearchSpace +from pkg.suggestion.v1beta1.internal.trial import Trial, Assignment +from pkg.suggestion.v1beta1.skopt.base_service import BaseSkoptService +from pkg.suggestion.v1beta1.internal.base_health_service import HealthServicer + + +logger = logging.getLogger(__name__) + + +class SkoptService(api_pb2_grpc.SuggestionServicer, HealthServicer): + + def __init__(self): + super(SkoptService, self).__init__() + self.base_service = None + self.is_first_run = True + + def GetSuggestions(self, request, context): + """ + Main function to provide suggestion. + """ + algorithm_name, config = OptimizerConfiguration.convertAlgorithmSpec( + request.experiment.spec.algorithm) + if algorithm_name != "bayesianoptimization": + raise Exception("Failed to create the algorithm: {}".format(algorithm_name)) + + if self.is_first_run: + search_space = HyperParameterSearchSpace.convert(request.experiment) + self.base_service = BaseSkoptService( + base_estimator=config.base_estimator, + n_initial_points=config.n_initial_points, + acq_func=config.acq_func, + acq_optimizer=config.acq_optimizer, + random_state=config.random_state, + search_space=search_space) + self.is_first_run = False + + trials = Trial.convert(request.trials) + new_trials = self.base_service.getSuggestions(trials, request.request_number) + return api_pb2.GetSuggestionsReply( + parameter_assignments=Assignment.generate(new_trials) + ) + + +class OptimizerConfiguration(object): + def __init__(self, base_estimator="GP", + n_initial_points=10, + acq_func="gp_hedge", + acq_optimizer="auto", + random_state=None): + self.base_estimator = base_estimator + self.n_initial_points = n_initial_points + self.acq_func = acq_func + self.acq_optimizer = acq_optimizer + self.random_state = random_state + + @staticmethod + def convertAlgorithmSpec(algorithm_spec): + optimizer = OptimizerConfiguration() + for s in algorithm_spec.algorithm_setting: + if s.name == "base_estimator": + optimizer.base_estimator = s.value + elif s.name == "n_initial_points": + optimizer.n_initial_points = int(s.value) + elif s.name == "acq_func": + optimizer.acq_func = s.value + elif s.name == "acq_optimizer": + optimizer.acq_optimizer = s.value + elif s.name == "random_state": + optimizer.random_state = int(s.value) + return algorithm_spec.algorithm_name, optimizer diff --git a/pkg/ui/v1beta1/README.md b/pkg/ui/v1beta1/README.md new file mode 100755 index 00000000000..adca4b86019 --- /dev/null +++ b/pkg/ui/v1beta1/README.md @@ -0,0 +1,86 @@ +# Katib User Interface + +This is the source code for the Katib UI. Current version of Katib UI is v1beta1. On the official Kubeflow website [here](https://www.kubeflow.org/docs/components/hyperparameter-tuning/experiment/#running-the-experiment-from-the-katib-ui) you can find information how to use Katib UI. +We are using [React](https://reactjs.org/) framework to create frontend and Go as a backend. + +We are using [Material UI](https://material-ui.com/) to design frontend. Try to use Material UI components to implement new Katib UI features. + +## Folder structure + +1. `Dockerfile` and file to serve the UI `main.go` you can find under [cmd/ui/v1beta1](https://github.com/kubeflow/katib/tree/master/cmd/ui/v1beta1). + +2. Go backend you can find under [pkg/ui/v1beta1](https://github.com/kubeflow/katib/tree/master/pkg/ui/v1beta1). + +3. React frontend you can find under [pkg/ui/v1beta1/frontend](https://github.com/kubeflow/katib/tree/master/pkg/ui/v1beta1/frontend). + +## Requirements + +To make changes to the UI you need to install: + +- Tools, defined [here](https://github.com/kubeflow/katib/blob/master/docs/developer-guide.md#requirements). + +- `Node` (10.13 or later) and `npm` (6.13 or later). You can find [here](https://nodejs.org/en/download/) how to download it. + +## Development + +While development you have different ways to run Katib UI. + +### First time + +1. Clone the repository. + +2. Go to `/frontend` folder. + +3. Run `npm install` to install all dependencies. + +It will create `/frontend/node_modules` folder with all dependencies from `package.json`. If you want to add new package, edit `/frontend/package.json` file with new dependency. + +### Start frontend server + +If you want to edit only frontend without connection to the backend, you can start frontend server in your local environment. For it, run `npm run start` under `/frontend` folder. You can access the UI using this URL: `http://localhost:3000/`. + +### Serve UI frontend and backend + +You can serve Katib UI locally. To make it you need to follow these steps: + +1. Run `npm run build` under `/frontend` folder. It will create `/frontend/build` directory with optimized production build. + +2. Go to `cmd/ui/v1beta1`. + +3. Run `main.go` file with appropriate flags. For example, if you clone Katib repository to `/home` folder, run this command: + +``` +go run main.go --build-dir=/home/katib/pkg/ui/v1beta1/frontend/build --port=8080 +``` + +After that, you can access the UI using this URL: `http://localhost:8080/katib/`. + +## Production + +To run Katib UI in Production, after all changes in frontend and backend, you need to create an image for the UI. Under `katib` repository run this: `docker build . -f cmd/ui/v1beta1/Dockerfile -t ` to build image. You can modify UI [deployment](https://github.com/kubeflow/katib/blob/master/manifests/v1beta1/ui/deployment.yaml#L24) with your new image. After this, follow [these steps](https://www.kubeflow.org/docs/components/hyperparameter-tuning/hyperparameter/#accessing-the-katib-ui) to access Katib UI. + +## Code style + +To make frontend code consistent and easy to review we use [Prettier](https://prettier.io/). You can find Prettier config [here](https://github.com/kubeflow/katib/tree/master/pkg/ui/v1beta1/frontend/.prettierrc.yaml). +Check [here](https://prettier.io/docs/en/install.html), how to install Prettier CLI to check and format your code. + +### IDE integration + +For VSCode you can install plugin: "Prettier - Code formatter" and it will pick Prettier config automatically. + +You can edit [settings.json](https://code.visualstudio.com/docs/getstarted/settings#_settings-file-locations) file for VSCode to autoformat on save. + +```json + "settings": { + "editor.formatOnSave": true + } +``` + +For others IDE see [this](https://prettier.io/docs/en/editors.html). + +### Check and format code + +Before submitting PR check and format your code. To check your code run `npm run format:check` under `/frontend` folder. To format your code run `npm run format:write` under `/frontend` folder. +If all files formatted you can submit the PR. + +If you don't want to format some code, [here](https://prettier.io/docs/en/ignore.html) is an instruction how to disable Prettier. diff --git a/pkg/ui/v1beta1/backend.go b/pkg/ui/v1beta1/backend.go new file mode 100644 index 00000000000..d65bf6b69ce --- /dev/null +++ b/pkg/ui/v1beta1/backend.go @@ -0,0 +1,291 @@ +package v1beta1 + +import ( + "encoding/json" + "log" + "net/http" + + "github.com/ghodss/yaml" + "google.golang.org/grpc" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/controller-runtime/pkg/client" + + experimentv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + api_pb_v1beta1 "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" + common_v1beta1 "github.com/kubeflow/katib/pkg/common/v1beta1" + "github.com/kubeflow/katib/pkg/util/v1beta1/katibclient" +) + +func NewKatibUIHandler() *KatibUIHandler { + kclient, err := katibclient.NewClient(client.Options{}) + if err != nil { + log.Printf("NewClient for Katib failed: %v", err) + panic(err) + } + return &KatibUIHandler{ + katibClient: kclient, + } +} + +func (k *KatibUIHandler) connectManager() (*grpc.ClientConn, api_pb_v1beta1.ManagerClient) { + conn, err := grpc.Dial(common_v1beta1.GetDBManagerAddr(), grpc.WithInsecure()) + if err != nil { + log.Printf("Dial to GRPC failed: %v", err) + return nil, nil + } + c := api_pb_v1beta1.NewManagerClient(conn) + return conn, c +} + +func (k *KatibUIHandler) SubmitYamlJob(w http.ResponseWriter, r *http.Request) { + //enableCors(&w) + var data map[string]interface{} + + json.NewDecoder(r.Body).Decode(&data) + + job := experimentv1beta1.Experiment{} + if yamlContent, ok := data["yaml"].(string); ok { + err := yaml.Unmarshal([]byte(yamlContent), &job) + if err != nil { + log.Printf("Unmarshal YAML content failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + err = k.katibClient.CreateExperiment(&job) + if err != nil { + log.Printf("CreateExperiment from YAML failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + } + +} + +func (k *KatibUIHandler) SubmitParamsJob(w http.ResponseWriter, r *http.Request) { + //enableCors(&w) + var data map[string]interface{} + + json.NewDecoder(r.Body).Decode(&data) + if data, ok := data["postData"]; ok { + jsonbody, err := json.Marshal(data) + if err != nil { + log.Printf("Marshal data for HP job failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + job := experimentv1beta1.Experiment{} + if err := json.Unmarshal(jsonbody, &job); err != nil { + log.Printf("Unmarshal HP job failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + dataMap := data.(map[string]interface{}) + job.TypeMeta = metav1.TypeMeta{ + APIVersion: "kubeflow.org/v1beta1", + Kind: "Experiment", + } + job.ObjectMeta = metav1.ObjectMeta{ + Name: dataMap["metadata"].(map[string]interface{})["name"].(string), + Namespace: dataMap["metadata"].(map[string]interface{})["namespace"].(string), + } + err = k.katibClient.CreateExperiment(&job) + if err != nil { + log.Printf("CreateExperiment for HP failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + } +} + +func (k *KatibUIHandler) DeleteExperiment(w http.ResponseWriter, r *http.Request) { + experimentName := r.URL.Query()["experimentName"][0] + namespace := r.URL.Query()["namespace"][0] + + experiment, err := k.katibClient.GetExperiment(experimentName, namespace) + if err != nil { + log.Printf("GetExperiment failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + err = k.katibClient.DeleteExperiment(experiment) + if err != nil { + log.Printf("DeleteExperiment failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } +} + +// FetchTrialTemplates gets all trial templates in all namespaces +func (k *KatibUIHandler) FetchTrialTemplates(w http.ResponseWriter, r *http.Request) { + + trialTemplatesViewList, err := k.getTrialTemplatesViewList() + if err != nil { + log.Printf("getTrialTemplatesViewList failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + TrialTemplatesResponse := TrialTemplatesResponse{ + Data: trialTemplatesViewList, + } + response, err := json.Marshal(TrialTemplatesResponse) + if err != nil { + log.Printf("Marshal templates failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Write(response) +} + +//AddTemplate adds template to ConfigMap +//TODO: Add functionality to create new ConfigMap +func (k *KatibUIHandler) AddTemplate(w http.ResponseWriter, r *http.Request) { + var data map[string]interface{} + json.NewDecoder(r.Body).Decode(&data) + + edittedNamespace := data["edittedNamespace"].(string) + edittedConfigMapName := data["edittedConfigMapName"].(string) + edittedName := data["edittedName"].(string) + edittedYaml := data["edittedYaml"].(string) + + newTemplates, err := k.updateTrialTemplates(edittedNamespace, edittedConfigMapName, edittedName, edittedYaml, "", ActionTypeAdd) + if err != nil { + log.Printf("updateTrialTemplates failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + TrialTemplatesResponse := TrialTemplatesResponse{ + Data: newTemplates, + } + response, err := json.Marshal(TrialTemplatesResponse) + if err != nil { + log.Printf("Marhal failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Write(response) + +} + +// EditTemplate edits template in ConfigMap +func (k *KatibUIHandler) EditTemplate(w http.ResponseWriter, r *http.Request) { + + var data map[string]interface{} + json.NewDecoder(r.Body).Decode(&data) + + edittedNamespace := data["edittedNamespace"].(string) + edittedConfigMapName := data["edittedConfigMapName"].(string) + edittedName := data["edittedName"].(string) + edittedYaml := data["edittedYaml"].(string) + currentName := data["currentName"].(string) + + newTemplates, err := k.updateTrialTemplates(edittedNamespace, edittedConfigMapName, edittedName, edittedYaml, currentName, ActionTypeEdit) + if err != nil { + log.Printf("updateTrialTemplates failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + TrialTemplatesResponse := TrialTemplatesResponse{ + Data: newTemplates, + } + response, err := json.Marshal(TrialTemplatesResponse) + if err != nil { + log.Printf("Marhal failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Write(response) +} + +// DeleteTemplate delete template in ConfigMap +// TODO: Add functionality to delete configMap if there is no templates +func (k *KatibUIHandler) DeleteTemplate(w http.ResponseWriter, r *http.Request) { + + var data map[string]interface{} + json.NewDecoder(r.Body).Decode(&data) + + edittedNamespace := data["edittedNamespace"].(string) + edittedConfigMapName := data["edittedConfigMapName"].(string) + edittedName := data["edittedName"].(string) + + newTemplates, err := k.updateTrialTemplates(edittedNamespace, edittedConfigMapName, edittedName, "", "", ActionTypeDelete) + if err != nil { + log.Printf("updateTrialTemplates failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + TrialTemplatesResponse := TrialTemplatesResponse{ + Data: newTemplates, + } + + response, err := json.Marshal(TrialTemplatesResponse) + if err != nil { + log.Printf("Marhal failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Write(response) +} + +func (k *KatibUIHandler) FetchNamespaces(w http.ResponseWriter, r *http.Request) { + + // Get all available namespaces + namespaces, err := k.getAvailableNamespaces() + if err != nil { + log.Printf("GetAvailableNamespaces failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + response, err := json.Marshal(namespaces) + if err != nil { + log.Printf("Marshal namespaces failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Write(response) +} + +// FetchExperiment gets experiment in specific namespace. +func (k *KatibUIHandler) FetchExperiment(w http.ResponseWriter, r *http.Request) { + experimentName := r.URL.Query()["experimentName"][0] + namespace := r.URL.Query()["namespace"][0] + + experiment, err := k.katibClient.GetExperiment(experimentName, namespace) + if err != nil { + log.Printf("GetExperiment failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + response, err := json.Marshal(experiment) + if err != nil { + log.Printf("Marshal Experiment failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Write(response) +} + +// FetchSuggestion gets suggestion in specific namespace +func (k *KatibUIHandler) FetchSuggestion(w http.ResponseWriter, r *http.Request) { + suggestionName := r.URL.Query()["suggestionName"][0] + namespace := r.URL.Query()["namespace"][0] + + suggestion, err := k.katibClient.GetSuggestion(suggestionName, namespace) + if err != nil { + log.Printf("GetSuggestion failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + response, err := json.Marshal(suggestion) + if err != nil { + log.Printf("Marshal Suggestion failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Write(response) +} diff --git a/pkg/ui/v1beta1/frontend/.gitignore b/pkg/ui/v1beta1/frontend/.gitignore new file mode 100755 index 00000000000..495881eb157 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/.gitignore @@ -0,0 +1,27 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# package-lock +package-lock.json + +# build +/build diff --git a/pkg/ui/v1beta1/frontend/.prettierrc.yaml b/pkg/ui/v1beta1/frontend/.prettierrc.yaml new file mode 100644 index 00000000000..669e14df18c --- /dev/null +++ b/pkg/ui/v1beta1/frontend/.prettierrc.yaml @@ -0,0 +1,5 @@ +singleQuote: true +printWidth: 100 +trailingComma: all +tabWidth: 2 +arrowParens: avoid diff --git a/pkg/ui/v1beta1/frontend/config/env.js b/pkg/ui/v1beta1/frontend/config/env.js new file mode 100644 index 00000000000..b0344c5a83e --- /dev/null +++ b/pkg/ui/v1beta1/frontend/config/env.js @@ -0,0 +1,93 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const paths = require('./paths'); + +// Make sure that including paths.js after env.js will read .env variables. +delete require.cache[require.resolve('./paths')]; + +const NODE_ENV = process.env.NODE_ENV; +if (!NODE_ENV) { + throw new Error( + 'The NODE_ENV environment variable is required but was not specified.' + ); +} + +// https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use +var dotenvFiles = [ + `${paths.dotenv}.${NODE_ENV}.local`, + `${paths.dotenv}.${NODE_ENV}`, + // Don't include `.env.local` for `test` environment + // since normally you expect tests to produce the same + // results for everyone + NODE_ENV !== 'test' && `${paths.dotenv}.local`, + paths.dotenv, +].filter(Boolean); + +// Load environment variables from .env* files. Suppress warnings using silent +// if this file is missing. dotenv will never modify any environment variables +// that have already been set. Variable expansion is supported in .env files. +// https://github.com/motdotla/dotenv +// https://github.com/motdotla/dotenv-expand +dotenvFiles.forEach(dotenvFile => { + if (fs.existsSync(dotenvFile)) { + require('dotenv-expand')( + require('dotenv').config({ + path: dotenvFile, + }) + ); + } +}); + +// We support resolving modules according to `NODE_PATH`. +// This lets you use absolute paths in imports inside large monorepos: +// https://github.com/facebook/create-react-app/issues/253. +// It works similar to `NODE_PATH` in Node itself: +// https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders +// Note that unlike in Node, only *relative* paths from `NODE_PATH` are honored. +// Otherwise, we risk importing Node.js core modules into an app instead of Webpack shims. +// https://github.com/facebook/create-react-app/issues/1023#issuecomment-265344421 +// We also resolve them to make sure all tools using them work consistently. +const appDirectory = fs.realpathSync(process.cwd()); +process.env.NODE_PATH = (process.env.NODE_PATH || '') + .split(path.delimiter) + .filter(folder => folder && !path.isAbsolute(folder)) + .map(folder => path.resolve(appDirectory, folder)) + .join(path.delimiter); + +// Grab NODE_ENV and REACT_APP_* environment variables and prepare them to be +// injected into the application via DefinePlugin in Webpack configuration. +const REACT_APP = /^REACT_APP_/i; + +function getClientEnvironment(publicUrl) { + const raw = Object.keys(process.env) + .filter(key => REACT_APP.test(key)) + .reduce( + (env, key) => { + env[key] = process.env[key]; + return env; + }, + { + // Useful for determining whether we’re running in production mode. + // Most importantly, it switches React into the correct mode. + NODE_ENV: process.env.NODE_ENV || 'development', + // Useful for resolving the correct path to static assets in `public`. + // For example, . + // This should only be used as an escape hatch. Normally you would put + // images into the `src` and `import` them in code to get their paths. + PUBLIC_URL: publicUrl, + } + ); + // Stringify all values so we can feed into Webpack DefinePlugin + const stringified = { + 'process.env': Object.keys(raw).reduce((env, key) => { + env[key] = JSON.stringify(raw[key]); + return env; + }, {}), + }; + + return { raw, stringified }; +} + +module.exports = getClientEnvironment; diff --git a/pkg/ui/v1beta1/frontend/config/jest/cssTransform.js b/pkg/ui/v1beta1/frontend/config/jest/cssTransform.js new file mode 100644 index 00000000000..8f65114812a --- /dev/null +++ b/pkg/ui/v1beta1/frontend/config/jest/cssTransform.js @@ -0,0 +1,14 @@ +'use strict'; + +// This is a custom Jest transformer turning style imports into empty objects. +// http://facebook.github.io/jest/docs/en/webpack.html + +module.exports = { + process() { + return 'module.exports = {};'; + }, + getCacheKey() { + // The output is always the same. + return 'cssTransform'; + }, +}; diff --git a/pkg/ui/v1beta1/frontend/config/jest/fileTransform.js b/pkg/ui/v1beta1/frontend/config/jest/fileTransform.js new file mode 100644 index 00000000000..4ed6bdb005d --- /dev/null +++ b/pkg/ui/v1beta1/frontend/config/jest/fileTransform.js @@ -0,0 +1,31 @@ +'use strict'; + +const path = require('path'); + +// This is a custom Jest transformer turning file imports into filenames. +// http://facebook.github.io/jest/docs/en/webpack.html + +module.exports = { + process(src, filename) { + const assetFilename = JSON.stringify(path.basename(filename)); + + if (filename.match(/\.svg$/)) { + return `const React = require('react'); + module.exports = { + __esModule: true, + default: ${assetFilename}, + ReactComponent: React.forwardRef((props, ref) => ({ + $$typeof: Symbol.for('react.element'), + type: 'svg', + ref: ref, + key: null, + props: Object.assign({}, props, { + children: ${assetFilename} + }) + })), + };`; + } + + return `module.exports = ${assetFilename};`; + }, +}; diff --git a/pkg/ui/v1beta1/frontend/config/paths.js b/pkg/ui/v1beta1/frontend/config/paths.js new file mode 100644 index 00000000000..c24b4dd1f84 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/config/paths.js @@ -0,0 +1,89 @@ +'use strict'; + +const path = require('path'); +const fs = require('fs'); +const url = require('url'); + +// Make sure any symlinks in the project folder are resolved: +// https://github.com/facebook/create-react-app/issues/637 +const appDirectory = fs.realpathSync(process.cwd()); +const resolveApp = relativePath => path.resolve(appDirectory, relativePath); + +const envPublicUrl = process.env.PUBLIC_URL; + +function ensureSlash(inputPath, needsSlash) { + const hasSlash = inputPath.endsWith('/'); + if (hasSlash && !needsSlash) { + return inputPath.substr(0, inputPath.length - 1); + } else if (!hasSlash && needsSlash) { + return `${inputPath}/`; + } else { + return inputPath; + } +} + +const getPublicUrl = appPackageJson => + envPublicUrl || require(appPackageJson).homepage; + +// We use `PUBLIC_URL` environment variable or "homepage" field to infer +// "public path" at which the app is served. +// Webpack needs to know it to put the right + + + + + + + + + + + + + + + + + + Katib UI + + + +
+ + + diff --git a/pkg/ui/v1beta1/frontend/public/logo.png b/pkg/ui/v1beta1/frontend/public/logo.png new file mode 100644 index 00000000000..a0120a54089 Binary files /dev/null and b/pkg/ui/v1beta1/frontend/public/logo.png differ diff --git a/pkg/ui/v1beta1/frontend/public/manifest.json b/pkg/ui/v1beta1/frontend/public/manifest.json new file mode 100755 index 00000000000..ea6f84a0909 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/public/manifest.json @@ -0,0 +1,15 @@ +{ + "short_name": "Katib UI", + "name": "Dashboard for Katib", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/pkg/ui/v1beta1/frontend/public/scripts/ace.js b/pkg/ui/v1beta1/frontend/public/scripts/ace.js new file mode 100644 index 00000000000..47f29365f85 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/public/scripts/ace.js @@ -0,0 +1,17 @@ +(function(){function o(n){var i=e;n&&(e[n]||(e[n]={}),i=e[n]);if(!i.define||!i.define.packaged)t.original=i.define,i.define=t,i.define.packaged=!0;if(!i.require||!i.require.packaged)r.original=i.require,i.require=r,i.require.packaged=!0}var ACE_NAMESPACE = "ace",e=function(){return this}();!e&&typeof window!="undefined"&&(e=window);if(!ACE_NAMESPACE&&typeof requirejs!="undefined")return;var t=function(e,n,r){if(typeof e!="string"){t.original?t.original.apply(this,arguments):(console.error("dropping module because define wasn't a string."),console.trace());return}arguments.length==2&&(r=n),t.modules[e]||(t.payloads[e]=r,t.modules[e]=null)};t.modules={},t.payloads={};var n=function(e,t,n){if(typeof t=="string"){var i=s(e,t);if(i!=undefined)return n&&n(),i}else if(Object.prototype.toString.call(t)==="[object Array]"){var o=[];for(var u=0,a=t.length;u1&&u(t,"")>-1&&(a=RegExp(this.source,r.replace.call(o(this),"g","")),r.replace.call(e.slice(t.index),a,function(){for(var e=1;et.index&&this.lastIndex--}return t},s||(RegExp.prototype.test=function(e){var t=r.exec.call(this,e);return t&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--,!!t})}),ace.define("ace/lib/es5-shim",["require","exports","module"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,"sentinel",{}),"sentinel"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t==="undefined"||t==="boolean"||t==="number"||t==="string"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n=="function"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r=="function"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!="function")throw new TypeError("Function.prototype.bind called on incompatible "+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,"__defineGetter__"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,"XXX"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+ta)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h>>0;if(a(t)!="[object Function]")throw new TypeError;while(++s>>0,s=Array(i),o=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var u=0;u>>0,s=[],o,u=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var f=0;f>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduce of empty array with no initial value");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError("reduce of empty array with no initial value")}while(!0);for(;s>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduceRight of empty array with no initial value");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError("reduceRight of empty array with no initial value")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)=="[object String]"?this.split(""):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!="object")throw new TypeError("typeof prototype["+typeof t+"] != 'object'");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document=="undefined"||w(document.createElement("div"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T="Property description must be an object: ",N="Object.defineProperty called on non-object: ",C="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(t,n,r){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(N+t);if(typeof r!="object"&&typeof r!="function"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,"value"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,"get")&&l(t,n,r.get),f(r,"set")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n=="function"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n="";while(f(t,n))n+="?";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!="object"&&typeof e!="function"||e===null)throw new TypeError("Object.keys called on a non-object");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n=0?parseFloat((s.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]):parseFloat((s.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]),t.isOldIE=t.isIE&&t.isIE<9,t.isGecko=t.isMozilla=s.match(/ Gecko\/\d+/),t.isOpera=typeof opera=="object"&&Object.prototype.toString.call(window.opera)=="[object Opera]",t.isWebKit=parseFloat(s.split("WebKit/")[1])||undefined,t.isChrome=parseFloat(s.split(" Chrome/")[1])||undefined,t.isEdge=parseFloat(s.split(" Edge/")[1])||undefined,t.isAIR=s.indexOf("AdobeAIR")>=0,t.isAndroid=s.indexOf("Android")>=0,t.isChromeOS=s.indexOf(" CrOS ")>=0,t.isIOS=/iPad|iPhone|iPod/.test(s)&&!window.MSStream,t.isIOS&&(t.isMac=!0),t.isMobile=t.isIOS||t.isAndroid}),ace.define("ace/lib/dom",["require","exports","module","ace/lib/useragent"],function(e,t,n){"use strict";var r=e("./useragent"),i="http://www.w3.org/1999/xhtml";t.buildDom=function o(e,t,n){if(typeof e=="string"&&e){var r=document.createTextNode(e);return t&&t.appendChild(r),r}if(!Array.isArray(e))return e;if(typeof e[0]!="string"||!e[0]){var i=[];for(var s=0;s=1.5:!0;if(typeof document!="undefined"){var s=document.createElement("div");t.HI_DPI&&s.style.transform!==undefined&&(t.HAS_CSS_TRANSFORMS=!0),!r.isEdge&&typeof s.style.animationName!="undefined"&&(t.HAS_CSS_ANIMATION=!0),s=null}t.HAS_CSS_TRANSFORMS?t.translate=function(e,t,n){e.style.transform="translate("+Math.round(t)+"px, "+Math.round(n)+"px)"}:t.translate=function(e,t,n){e.style.top=Math.round(n)+"px",e.style.left=Math.round(t)+"px"}}),ace.define("ace/lib/oop",["require","exports","module"],function(e,t,n){"use strict";t.inherits=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})},t.mixin=function(e,t){for(var n in t)e[n]=t[n];return e},t.implement=function(e,n){t.mixin(e,n)}}),ace.define("ace/lib/keys",["require","exports","module","ace/lib/oop"],function(e,t,n){"use strict";var r=e("./oop"),i=function(){var e={MODIFIER_KEYS:{16:"Shift",17:"Ctrl",18:"Alt",224:"Meta",91:"MetaLeft",92:"MetaRight",93:"ContextMenu"},KEY_MODS:{ctrl:1,alt:2,option:2,shift:4,"super":8,meta:8,command:8,cmd:8},FUNCTION_KEYS:{8:"Backspace",9:"Tab",13:"Return",19:"Pause",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"Print",45:"Insert",46:"Delete",96:"Numpad0",97:"Numpad1",98:"Numpad2",99:"Numpad3",100:"Numpad4",101:"Numpad5",102:"Numpad6",103:"Numpad7",104:"Numpad8",105:"Numpad9","-13":"NumpadEnter",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"Numlock",145:"Scrolllock"},PRINTABLE_KEYS:{32:" ",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",61:"=",65:"a",66:"b",67:"c",68:"d",69:"e",70:"f",71:"g",72:"h",73:"i",74:"j",75:"k",76:"l",77:"m",78:"n",79:"o",80:"p",81:"q",82:"r",83:"s",84:"t",85:"u",86:"v",87:"w",88:"x",89:"y",90:"z",107:"+",109:"-",110:".",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",111:"/",106:"*"}},t,n;for(n in e.FUNCTION_KEYS)t=e.FUNCTION_KEYS[n].toLowerCase(),e[t]=parseInt(n,10);for(n in e.PRINTABLE_KEYS)t=e.PRINTABLE_KEYS[n].toLowerCase(),e[t]=parseInt(n,10);return r.mixin(e,e.MODIFIER_KEYS),r.mixin(e,e.PRINTABLE_KEYS),r.mixin(e,e.FUNCTION_KEYS),e.enter=e["return"],e.escape=e.esc,e.del=e["delete"],e[173]="-",function(){var t=["cmd","ctrl","alt","shift"];for(var n=Math.pow(2,t.length);n--;)e.KEY_MODS[n]=t.filter(function(t){return n&e.KEY_MODS[t]}).join("-")+"-"}(),e.KEY_MODS[0]="",e.KEY_MODS[-1]="input-",e}();r.mixin(t,i),t.keyCodeToString=function(e){var t=i[e];return typeof t!="string"&&(t=String.fromCharCode(e)),t.toLowerCase()}}),ace.define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function a(e,t,n){var a=u(t);if(!i.isMac&&s){t.getModifierState&&(t.getModifierState("OS")||t.getModifierState("Win"))&&(a|=8);if(s.altGr){if((3&a)==3)return;s.altGr=0}if(n===18||n===17){var f="location"in t?t.location:t.keyLocation;if(n===17&&f===1)s[n]==1&&(o=t.timeStamp);else if(n===18&&a===3&&f===2){var l=t.timeStamp-o;l<50&&(s.altGr=!0)}}}n in r.MODIFIER_KEYS&&(n=-1);if(!a&&n===13){var f="location"in t?t.location:t.keyLocation;if(f===3){e(t,a,-n);if(t.defaultPrevented)return}}if(i.isChromeOS&&a&8){e(t,a,n);if(t.defaultPrevented)return;a&=-9}return!!a||n in r.FUNCTION_KEYS||n in r.PRINTABLE_KEYS?e(t,a,n):!1}function f(){s=Object.create(null)}var r=e("./keys"),i=e("./useragent"),s=null,o=0;t.addListener=function(e,t,n){if(e.addEventListener)return e.addEventListener(t,n,!1);if(e.attachEvent){var r=function(){n.call(e,window.event)};n._wrapper=r,e.attachEvent("on"+t,r)}},t.removeListener=function(e,t,n){if(e.removeEventListener)return e.removeEventListener(t,n,!1);e.detachEvent&&e.detachEvent("on"+t,n._wrapper||n)},t.stopEvent=function(e){return t.stopPropagation(e),t.preventDefault(e),!1},t.stopPropagation=function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},t.preventDefault=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1},t.getButton=function(e){return e.type=="dblclick"?0:e.type=="contextmenu"||i.isMac&&e.ctrlKey&&!e.altKey&&!e.shiftKey?2:e.preventDefault?e.button:{1:0,2:2,4:1}[e.button]},t.capture=function(e,n,r){function i(e){n&&n(e),r&&r(e),t.removeListener(document,"mousemove",n,!0),t.removeListener(document,"mouseup",i,!0),t.removeListener(document,"dragstart",i,!0)}return t.addListener(document,"mousemove",n,!0),t.addListener(document,"mouseup",i,!0),t.addListener(document,"dragstart",i,!0),i},t.addMouseWheelListener=function(e,n){"onmousewheel"in e?t.addListener(e,"mousewheel",function(e){var t=8;e.wheelDeltaX!==undefined?(e.wheelX=-e.wheelDeltaX/t,e.wheelY=-e.wheelDeltaY/t):(e.wheelX=0,e.wheelY=-e.wheelDelta/t),n(e)}):"onwheel"in e?t.addListener(e,"wheel",function(e){var t=.35;switch(e.deltaMode){case e.DOM_DELTA_PIXEL:e.wheelX=e.deltaX*t||0,e.wheelY=e.deltaY*t||0;break;case e.DOM_DELTA_LINE:case e.DOM_DELTA_PAGE:e.wheelX=(e.deltaX||0)*5,e.wheelY=(e.deltaY||0)*5}n(e)}):t.addListener(e,"DOMMouseScroll",function(e){e.axis&&e.axis==e.HORIZONTAL_AXIS?(e.wheelX=(e.detail||0)*5,e.wheelY=0):(e.wheelX=0,e.wheelY=(e.detail||0)*5),n(e)})},t.addMultiMouseDownListener=function(e,n,r,s){function c(e){t.getButton(e)!==0?o=0:e.detail>1?(o++,o>4&&(o=1)):o=1;if(i.isIE){var c=Math.abs(e.clientX-u)>5||Math.abs(e.clientY-a)>5;if(!f||c)o=1;f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),o==1&&(u=e.clientX,a=e.clientY)}e._clicks=o,r[s]("mousedown",e);if(o>4)o=0;else if(o>1)return r[s](l[o],e)}function h(e){o=2,f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),r[s]("mousedown",e),r[s](l[o],e)}var o=0,u,a,f,l={2:"dblclick",3:"tripleclick",4:"quadclick"};Array.isArray(e)||(e=[e]),e.forEach(function(e){t.addListener(e,"mousedown",c),i.isOldIE&&t.addListener(e,"dblclick",h)})};var u=!i.isMac||!i.isOpera||"KeyboardEvent"in window?function(e){return 0|(e.ctrlKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.metaKey?8:0)}:function(e){return 0|(e.metaKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.ctrlKey?8:0)};t.getModifierString=function(e){return r.KEY_MODS[u(e)]},t.addCommandKeyListener=function(e,n){var r=t.addListener;if(i.isOldGecko||i.isOpera&&!("KeyboardEvent"in window)){var o=null;r(e,"keydown",function(e){o=e.keyCode}),r(e,"keypress",function(e){return a(n,e,o)})}else{var u=null;r(e,"keydown",function(e){s[e.keyCode]=(s[e.keyCode]||0)+1;var t=a(n,e,e.keyCode);return u=e.defaultPrevented,t}),r(e,"keypress",function(e){u&&(e.ctrlKey||e.altKey||e.shiftKey||e.metaKey)&&(t.stopEvent(e),u=null)}),r(e,"keyup",function(e){s[e.keyCode]=null}),s||(f(),r(window,"focus",f))}};if(typeof window=="object"&&window.postMessage&&!i.isOldIE){var l=1;t.nextTick=function(e,n){n=n||window;var r="zero-timeout-message-"+l++,i=function(s){s.data==r&&(t.stopPropagation(s),t.removeListener(n,"message",i),e())};t.addListener(n,"message",i),n.postMessage(r,"*")}}t.$idleBlocked=!1,t.onIdle=function(e,n){return setTimeout(function r(){t.$idleBlocked?setTimeout(r,100):e()},n)},t.$idleBlockId=null,t.blockIdle=function(e){t.$idleBlockId&&clearTimeout(t.$idleBlockId),t.$idleBlocked=!0,t.$idleBlockId=setTimeout(function(){t.$idleBlocked=!1},e||100)},t.nextFrame=typeof window=="object"&&(window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame),t.nextFrame?t.nextFrame=t.nextFrame.bind(window):t.nextFrame=function(e){setTimeout(e,17)}}),ace.define("ace/range",["require","exports","module"],function(e,t,n){"use strict";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e=="object"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e=="object"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?tthis.end.column?1:0:ethis.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.rowt)var r={row:t+1,column:0};else if(this.start.row0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\s\s*/,i=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(r,"")},t.stringTrimRight=function(e){return e.replace(i,"")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;nDate.now()-50?!0:r=!1},cancel:function(){r=Date.now()}}}),ace.define("ace/keyboard/textinput",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/dom","ace/lib/lang","ace/clipboard","ace/lib/keys"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=e("../lib/dom"),o=e("../lib/lang"),u=e("../clipboard"),a=i.isChrome<18,f=i.isIE,l=i.isChrome>63,c=400,h=e("../lib/keys"),p=h.KEY_MODS,d=i.isIOS,v=d?/\s/:/\n/,m=function(e,t){function z(){S=!0,n.blur(),n.focus(),S=!1}function X(e){e.keyCode==27&&n.value.lengthN&&x[s]=="\n")o=h.end;else if(rN&&x.slice(0,s).split("\n").length>2)o=h.down;else if(s>N&&x[s-1]==" ")o=h.right,u=p.option;else if(s>N||s==N&&N!=T&&r==s)o=h.right;r!==s&&(u|=p.shift);if(o){var a=t.onCommandKey({},u,o);if(!a&&t.commands){o=h.keyCodeToString(o);var f=t.commands.findKeyCommand(u,o);f&&t.execCommand(f)}T=r,N=s,L("")}};document.addEventListener("selectionchange",s),t.on("destroy",function(){document.removeEventListener("selectionchange",s)})}var n=s.createElement("textarea");n.className="ace_text-input",n.setAttribute("wrap","off"),n.setAttribute("autocorrect","off"),n.setAttribute("autocapitalize","off"),n.setAttribute("spellcheck",!1),n.style.opacity="0",e.insertBefore(n,e.firstChild);var m=!1,g=!1,y=!1,b=!1,w="";i.isMobile||(n.style.fontSize="1px");var E=!1,S=!1,x="",T=0,N=0;try{var C=document.activeElement===n}catch(k){}r.addListener(n,"blur",function(e){if(S)return;t.onBlur(e),C=!1}),r.addListener(n,"focus",function(e){if(S)return;C=!0;if(i.isEdge)try{if(!document.hasFocus())return}catch(e){}t.onFocus(e),i.isEdge?setTimeout(L):L()}),this.$focusScroll=!1,this.focus=function(){if(w||l||this.$focusScroll=="browser")return n.focus({preventScroll:!0});var e=n.style.top;n.style.position="fixed",n.style.top="0px";try{var t=n.getBoundingClientRect().top!=0}catch(r){return}var i=[];if(t){var s=n.parentElement;while(s&&s.nodeType==1)i.push(s),s.setAttribute("ace_nocontext",!0),!s.parentElement&&s.getRootNode?s=s.getRootNode().host:s=s.parentElement}n.focus({preventScroll:!0}),t&&i.forEach(function(e){e.removeAttribute("ace_nocontext")}),setTimeout(function(){n.style.position="",n.style.top=="0px"&&(n.style.top=e)},0)},this.blur=function(){n.blur()},this.isFocused=function(){return C},t.on("beforeEndOperation",function(){if(t.curOp&&t.curOp.command.name=="insertstring")return;y&&(x=n.value="",U()),L()});var L=d?function(e){if(!C||m&&!e||b)return;e||(e="");var r="\n ab"+e+"cde fg\n";r!=n.value&&(n.value=x=r);var i=4,s=4+(e.length||(t.selection.isEmpty()?0:1));(T!=i||N!=s)&&n.setSelectionRange(i,s),T=i,N=s}:function(){if(y||b)return;if(!C&&!_)return;y=!0;var e=t.selection,r=e.getRange(),i=e.cursor.row,s=r.start.column,o=r.end.column,u=t.session.getLine(i);if(r.start.row!=i){var a=t.session.getLine(i-1);s=r.start.rowi+1?f.length:o,o+=u.length+1,u=u+"\n"+f}u.length>c&&(s=x.length&&e.value===x&&x&&e.selectionEnd!==N},O=function(e){if(y)return;m?m=!1:A(n)&&(t.selectAll(),L())},M=null;this.setInputHandler=function(e){M=e},this.getInputHandler=function(){return M};var _=!1,D=function(e,r){_&&(_=!1);if(g)return L(),e&&t.onPaste(e),g=!1,"";var i=n.selectionStart,s=n.selectionEnd,o=T,u=x.length-N,a=e,f=e.length-i,l=e.length-s,c=0;while(o>0&&x[c]==e[c])c++,o--;a=a.slice(c),c=1;while(u>0&&x.length-c>T-1&&x[x.length-c]==e[e.length-c])c++,u--;f-=c-1,l-=c-1;var h=a.length-c+1;return h<0&&(o=-h,h=0),a=a.slice(0,h),!r&&f==a.length&&!o&&!u&&!l?"":(b=!0,a&&!o&&!u&&!f&&!l||E?t.onTextInput(a):t.onTextInput(a,{extendLeft:o,extendRight:u,restoreStart:f,restoreEnd:l}),b=!1,x=e,T=i,N=s,a)},P=function(e){if(y)return R();if(e&&e.inputType){if(e.inputType=="historyUndo")return t.execCommand("undo");if(e.inputType=="historyRedo")return t.execCommand("redo")}var r=n.value,i=D(r,!0);(r.length>c+100||v.test(i))&&L()},H=function(e,t,n){var r=e.clipboardData||window.clipboardData;if(!r||a)return;var i=f||n?"Text":"text/plain";try{return t?r.setData(i,t)!==!1:r.getData(i)}catch(e){if(!n)return H(e,t,!0)}},B=function(e,i){var s=t.getCopyText();if(!s)return r.preventDefault(e);H(e,s)?(d&&(L(s),m=s,setTimeout(function(){m=!1},10)),i?t.onCut():t.onCopy(),r.preventDefault(e)):(m=!0,n.value=s,n.select(),setTimeout(function(){m=!1,L(),i?t.onCut():t.onCopy()}))},j=function(e){B(e,!0)},F=function(e){B(e,!1)},I=function(e){var s=H(e);if(u.pasteCancelled())return;typeof s=="string"?(s&&t.onPaste(s,e),i.isIE&&setTimeout(L),r.preventDefault(e)):(n.value="",g=!0)};r.addCommandKeyListener(n,t.onCommandKey.bind(t)),r.addListener(n,"select",O),r.addListener(n,"input",P),r.addListener(n,"cut",j),r.addListener(n,"copy",F),r.addListener(n,"paste",I),(!("oncut"in n)||!("oncopy"in n)||!("onpaste"in n))&&r.addListener(e,"keydown",function(e){if(i.isMac&&!e.metaKey||!e.ctrlKey)return;switch(e.keyCode){case 67:F(e);break;case 86:I(e);break;case 88:j(e)}});var q=function(e){if(y||!t.onCompositionStart||t.$readOnly)return;y={};if(E)return;setTimeout(R,0),t.on("mousedown",z);var r=t.getSelectionRange();r.end.row=r.start.row,r.end.column=r.start.column,y.markerRange=r,y.selectionStart=T,t.onCompositionStart(y),y.useTextareaForIME?(n.value="",x="",T=0,N=0):(n.msGetInputContext&&(y.context=n.msGetInputContext()),n.getInputContext&&(y.context=n.getInputContext()))},R=function(){if(!y||!t.onCompositionUpdate||t.$readOnly)return;if(E)return z();if(y.useTextareaForIME)t.onCompositionUpdate(n.value);else{var e=n.value;D(e),y.markerRange&&(y.context&&(y.markerRange.start.column=y.selectionStart=y.context.compositionStartOffset),y.markerRange.end.column=y.markerRange.start.column+N-y.selectionStart)}},U=function(e){if(!t.onCompositionEnd||t.$readOnly)return;y=!1,t.onCompositionEnd(),t.off("mousedown",z),e&&P()},W=o.delayedCall(R,50).schedule.bind(null,null);r.addListener(n,"compositionstart",q),r.addListener(n,"compositionupdate",R),r.addListener(n,"keyup",X),r.addListener(n,"keydown",W),r.addListener(n,"compositionend",U),this.getElement=function(){return n},this.setCommandMode=function(e){E=e,n.readOnly=!1},this.setReadOnly=function(e){E||(n.readOnly=e)},this.setCopyWithEmptySelection=function(e){},this.onContextMenu=function(e){_=!0,L(),t._emit("nativecontextmenu",{target:t,domEvent:e}),this.moveToMouse(e,!0)},this.moveToMouse=function(e,o){w||(w=n.style.cssText),n.style.cssText=(o?"z-index:100000;":"")+(i.isIE?"opacity:0.1;":"")+"text-indent: -"+(T+N)*t.renderer.characterWidth*.5+"px;";var u=t.container.getBoundingClientRect(),a=s.computedStyle(t.container),f=u.top+(parseInt(a.borderTopWidth)||0),l=u.left+(parseInt(u.borderLeftWidth)||0),c=u.bottom-f-n.clientHeight-2,h=function(e){s.translate(n,e.clientX-l-2,Math.min(e.clientY-f-2,c))};h(e);if(e.type!="mousedown")return;t.renderer.$isMousePressed=!0,clearTimeout(V),i.isWin&&r.capture(t.container,h,$)},this.onContextMenuClose=$;var V,J=function(e){t.textInput.onContextMenu(e),$()};r.addListener(n,"mouseup",J),r.addListener(n,"mousedown",function(e){e.preventDefault(),$()}),r.addListener(t.renderer.scroller,"contextmenu",J),r.addListener(n,"contextmenu",J),d&&K(e,t,n)};t.TextInput=m}),ace.define("ace/mouse/default_handlers",["require","exports","module","ace/lib/useragent"],function(e,t,n){"use strict";function o(e){e.$clickSelection=null;var t=e.editor;t.setDefaultHandler("mousedown",this.onMouseDown.bind(e)),t.setDefaultHandler("dblclick",this.onDoubleClick.bind(e)),t.setDefaultHandler("tripleclick",this.onTripleClick.bind(e)),t.setDefaultHandler("quadclick",this.onQuadClick.bind(e)),t.setDefaultHandler("mousewheel",this.onMouseWheel.bind(e));var n=["select","startSelect","selectEnd","selectAllEnd","selectByWordsEnd","selectByLinesEnd","dragWait","dragWaitEnd","focusWait"];n.forEach(function(t){e[t]=this[t]},this),e.selectByLines=this.extendSelectionBy.bind(e,"getLineRange"),e.selectByWords=this.extendSelectionBy.bind(e,"getWordRange")}function u(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}function a(e,t){if(e.start.row==e.end.row)var n=2*t.column-e.start.column-e.end.column;else if(e.start.row==e.end.row-1&&!e.start.column&&!e.end.column)var n=t.column-4;else var n=2*t.row-e.start.row-e.end.row;return n<0?{cursor:e.start,anchor:e.end}:{cursor:e.end,anchor:e.start}}var r=e("../lib/useragent"),i=0,s=550;(function(){this.onMouseDown=function(e){var t=e.inSelection(),n=e.getDocumentPosition();this.mousedownEvent=e;var i=this.editor,s=e.getButton();if(s!==0){var o=i.getSelectionRange(),u=o.isEmpty();(u||s==1)&&i.selection.moveToPosition(n),s==2&&(i.textInput.onContextMenu(e.domEvent),r.isMozilla||e.preventDefault());return}this.mousedownEvent.time=Date.now();if(t&&!i.isFocused()){i.focus();if(this.$focusTimeout&&!this.$clickSelection&&!i.inMultiSelectMode){this.setState("focusWait"),this.captureMouse(e);return}}return this.captureMouse(e),this.startSelect(n,e.domEvent._clicks>1),e.preventDefault()},this.startSelect=function(e,t){e=e||this.editor.renderer.screenToTextCoordinates(this.x,this.y);var n=this.editor;if(!this.mousedownEvent)return;this.mousedownEvent.getShiftKey()?n.selection.selectToPosition(e):t||n.selection.moveToPosition(e),t||this.select(),n.renderer.scroller.setCapture&&n.renderer.scroller.setCapture(),n.setStyle("ace_selecting"),this.setState("select")},this.select=function(){var e,t=this.editor,n=t.renderer.screenToTextCoordinates(this.x,this.y);if(this.$clickSelection){var r=this.$clickSelection.comparePoint(n);if(r==-1)e=this.$clickSelection.end;else if(r==1)e=this.$clickSelection.start;else{var i=a(this.$clickSelection,n);n=i.cursor,e=i.anchor}t.selection.setSelectionAnchor(e.row,e.column)}t.selection.selectToPosition(n),t.renderer.scrollCursorIntoView()},this.extendSelectionBy=function(e){var t,n=this.editor,r=n.renderer.screenToTextCoordinates(this.x,this.y),i=n.selection[e](r.row,r.column);if(this.$clickSelection){var s=this.$clickSelection.comparePoint(i.start),o=this.$clickSelection.comparePoint(i.end);if(s==-1&&o<=0){t=this.$clickSelection.end;if(i.end.row!=r.row||i.end.column!=r.column)r=i.start}else if(o==1&&s>=0){t=this.$clickSelection.start;if(i.start.row!=r.row||i.start.column!=r.column)r=i.end}else if(s==-1&&o==1)r=i.end,t=i.start;else{var u=a(this.$clickSelection,r);r=u.cursor,t=u.anchor}n.selection.setSelectionAnchor(t.row,t.column)}n.selection.selectToPosition(r),n.renderer.scrollCursorIntoView()},this.selectEnd=this.selectAllEnd=this.selectByWordsEnd=this.selectByLinesEnd=function(){this.$clickSelection=null,this.editor.unsetStyle("ace_selecting"),this.editor.renderer.scroller.releaseCapture&&this.editor.renderer.scroller.releaseCapture()},this.focusWait=function(){var e=u(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y),t=Date.now();(e>i||t-this.mousedownEvent.time>this.$focusTimeout)&&this.startSelect(this.mousedownEvent.getDocumentPosition())},this.onDoubleClick=function(e){var t=e.getDocumentPosition(),n=this.editor,r=n.session,i=r.getBracketRange(t);i?(i.isEmpty()&&(i.start.column--,i.end.column++),this.setState("select")):(i=n.selection.getWordRange(t.row,t.column),this.setState("selectByWords")),this.$clickSelection=i,this.select()},this.onTripleClick=function(e){var t=e.getDocumentPosition(),n=this.editor;this.setState("selectByLines");var r=n.getSelectionRange();r.isMultiLine()&&r.contains(t.row,t.column)?(this.$clickSelection=n.selection.getLineRange(r.start.row),this.$clickSelection.end=n.selection.getLineRange(r.end.row).end):this.$clickSelection=n.selection.getLineRange(t.row),this.select()},this.onQuadClick=function(e){var t=this.editor;t.selectAll(),this.$clickSelection=t.getSelectionRange(),this.setState("selectAll")},this.onMouseWheel=function(e){if(e.getAccelKey())return;e.getShiftKey()&&e.wheelY&&!e.wheelX&&(e.wheelX=e.wheelY,e.wheelY=0);var t=this.editor;this.$lastScroll||(this.$lastScroll={t:0,vx:0,vy:0,allowed:0});var n=this.$lastScroll,r=e.domEvent.timeStamp,i=r-n.t,o=i?e.wheelX/i:n.vx,u=i?e.wheelY/i:n.vy;i=1&&t.renderer.isScrollableBy(e.wheelX*e.speed,0)&&(f=!0),a<=1&&t.renderer.isScrollableBy(0,e.wheelY*e.speed)&&(f=!0);if(f)n.allowed=r;else if(r-n.allowedt.session.documentToScreenRow(l.row,l.column))return c()}if(f==s)return;f=s.text.join("
"),i.setHtml(f),i.show(),t._signal("showGutterTooltip",i),t.on("mousewheel",c);if(e.$tooltipFollowsMouse)h(u);else{var p=u.domEvent.target,d=p.getBoundingClientRect(),v=i.getElement().style;v.left=d.right+"px",v.top=d.bottom+"px"}}function c(){o&&(o=clearTimeout(o)),f&&(i.hide(),f=null,t._signal("hideGutterTooltip",i),t.removeEventListener("mousewheel",c))}function h(e){i.setPosition(e.x,e.y)}var t=e.editor,n=t.renderer.$gutterLayer,i=new a(t.container);e.editor.setDefaultHandler("guttermousedown",function(r){if(!t.isFocused()||r.getButton()!=0)return;var i=n.getRegion(r);if(i=="foldWidgets")return;var s=r.getDocumentPosition().row,o=t.session.selection;if(r.getShiftKey())o.selectTo(s,0);else{if(r.domEvent.detail==2)return t.selectAll(),r.preventDefault();e.$clickSelection=t.selection.getLineRange(s)}return e.setState("selectByLines"),e.captureMouse(r),r.preventDefault()});var o,u,f;e.editor.setDefaultHandler("guttermousemove",function(t){var n=t.domEvent.target||t.domEvent.srcElement;if(r.hasCssClass(n,"ace_fold-widget"))return c();f&&e.$tooltipFollowsMouse&&h(t),u=t;if(o)return;o=setTimeout(function(){o=null,u&&!e.isMousePressed?l():c()},50)}),s.addListener(t.renderer.$gutter,"mouseout",function(e){u=null;if(!f||o)return;o=setTimeout(function(){o=null,c()},50)}),t.on("changeSession",c)}function a(e){o.call(this,e)}var r=e("../lib/dom"),i=e("../lib/oop"),s=e("../lib/event"),o=e("../tooltip").Tooltip;i.inherits(a,o),function(){this.setPosition=function(e,t){var n=window.innerWidth||document.documentElement.clientWidth,r=window.innerHeight||document.documentElement.clientHeight,i=this.getWidth(),s=this.getHeight();e+=15,t+=15,e+i>n&&(e-=e+i-n),t+s>r&&(t-=20+s),o.prototype.setPosition.call(this,e,t)}}.call(a.prototype),t.GutterHandler=u}),ace.define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=t.MouseEvent=function(e,t){this.domEvent=e,this.editor=t,this.x=this.clientX=e.clientX,this.y=this.clientY=e.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};(function(){this.stopPropagation=function(){r.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){r.preventDefault(this.domEvent),this.defaultPrevented=!0},this.stop=function(){this.stopPropagation(),this.preventDefault()},this.getDocumentPosition=function(){return this.$pos?this.$pos:(this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY),this.$pos)},this.inSelection=function(){if(this.$inSelection!==null)return this.$inSelection;var e=this.editor,t=e.getSelectionRange();if(t.isEmpty())this.$inSelection=!1;else{var n=this.getDocumentPosition();this.$inSelection=t.contains(n.row,n.column)}return this.$inSelection},this.getButton=function(){return r.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey},this.getAccelKey=i.isMac?function(){return this.domEvent.metaKey}:function(){return this.domEvent.ctrlKey}}).call(s.prototype)}),ace.define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";function f(e){function T(e,n){var r=Date.now(),i=!n||e.row!=n.row,s=!n||e.column!=n.column;if(!S||i||s)t.moveCursorToPosition(e),S=r,x={x:p,y:d};else{var o=l(x.x,x.y,p,d);o>a?S=null:r-S>=u&&(t.renderer.scrollCursorIntoView(),S=null)}}function N(e,n){var r=Date.now(),i=t.renderer.layerConfig.lineHeight,s=t.renderer.layerConfig.characterWidth,u=t.renderer.scroller.getBoundingClientRect(),a={x:{left:p-u.left,right:u.right-p},y:{top:d-u.top,bottom:u.bottom-d}},f=Math.min(a.x.left,a.x.right),l=Math.min(a.y.top,a.y.bottom),c={row:e.row,column:e.column};f/s<=2&&(c.column+=a.x.left=o&&t.renderer.scrollCursorIntoView(c):E=r:E=null}function C(){var e=g;g=t.renderer.screenToTextCoordinates(p,d),T(g,e),N(g,e)}function k(){m=t.selection.toOrientedRange(),h=t.session.addMarker(m,"ace_selection",t.getSelectionStyle()),t.clearSelection(),t.isFocused()&&t.renderer.$cursorLayer.setBlinking(!1),clearInterval(v),C(),v=setInterval(C,20),y=0,i.addListener(document,"mousemove",O)}function L(){clearInterval(v),t.session.removeMarker(h),h=null,t.selection.fromOrientedRange(m),t.isFocused()&&!w&&t.$resetCursorStyle(),m=null,g=null,y=0,E=null,S=null,i.removeListener(document,"mousemove",O)}function O(){A==null&&(A=setTimeout(function(){A!=null&&h&&L()},20))}function M(e){var t=e.types;return!t||Array.prototype.some.call(t,function(e){return e=="text/plain"||e=="Text"})}function _(e){var t=["copy","copymove","all","uninitialized"],n=["move","copymove","linkmove","all","uninitialized"],r=s.isMac?e.altKey:e.ctrlKey,i="uninitialized";try{i=e.dataTransfer.effectAllowed.toLowerCase()}catch(e){}var o="none";return r&&t.indexOf(i)>=0?o="copy":n.indexOf(i)>=0?o="move":t.indexOf(i)>=0&&(o="copy"),o}var t=e.editor,n=r.createElement("img");n.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",s.isOpera&&(n.style.cssText="width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;");var f=["dragWait","dragWaitEnd","startDrag","dragReadyEnd","onMouseDrag"];f.forEach(function(t){e[t]=this[t]},this),t.addEventListener("mousedown",this.onMouseDown.bind(e));var c=t.container,h,p,d,v,m,g,y=0,b,w,E,S,x;this.onDragStart=function(e){if(this.cancelDrag||!c.draggable){var r=this;return setTimeout(function(){r.startSelect(),r.captureMouse(e)},0),e.preventDefault()}m=t.getSelectionRange();var i=e.dataTransfer;i.effectAllowed=t.getReadOnly()?"copy":"copyMove",s.isOpera&&(t.container.appendChild(n),n.scrollTop=0),i.setDragImage&&i.setDragImage(n,0,0),s.isOpera&&t.container.removeChild(n),i.clearData(),i.setData("Text",t.session.getTextRange()),w=!0,this.setState("drag")},this.onDragEnd=function(e){c.draggable=!1,w=!1,this.setState(null);if(!t.getReadOnly()){var n=e.dataTransfer.dropEffect;!b&&n=="move"&&t.session.remove(t.getSelectionRange()),t.$resetCursorStyle()}this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle("")},this.onDragEnter=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||k(),y++,e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragOver=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||(k(),y++),A!==null&&(A=null),e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragLeave=function(e){y--;if(y<=0&&h)return L(),b=null,i.preventDefault(e)},this.onDrop=function(e){if(!g)return;var n=e.dataTransfer;if(w)switch(b){case"move":m.contains(g.row,g.column)?m={start:g,end:g}:m=t.moveText(m,g);break;case"copy":m=t.moveText(m,g,!0)}else{var r=n.getData("Text");m={start:g,end:t.session.insert(g,r)},t.focus(),b=null}return L(),i.preventDefault(e)},i.addListener(c,"dragstart",this.onDragStart.bind(e)),i.addListener(c,"dragend",this.onDragEnd.bind(e)),i.addListener(c,"dragenter",this.onDragEnter.bind(e)),i.addListener(c,"dragover",this.onDragOver.bind(e)),i.addListener(c,"dragleave",this.onDragLeave.bind(e)),i.addListener(c,"drop",this.onDrop.bind(e));var A=null}function l(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}var r=e("../lib/dom"),i=e("../lib/event"),s=e("../lib/useragent"),o=200,u=200,a=5;(function(){this.dragWait=function(){var e=Date.now()-this.mousedownEvent.time;e>this.editor.getDragDelay()&&this.startDrag()},this.dragWaitEnd=function(){var e=this.editor.container;e.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()),this.selectEnd()},this.dragReadyEnd=function(e){this.editor.$resetCursorStyle(),this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle(""),this.dragWaitEnd()},this.startDrag=function(){this.cancelDrag=!1;var e=this.editor,t=e.container;t.draggable=!0,e.renderer.$cursorLayer.setBlinking(!1),e.setStyle("ace_dragging");var n=s.isWin?"default":"move";e.renderer.setCursorStyle(n),this.setState("dragReady")},this.onMouseDrag=function(e){var t=this.editor.container;if(s.isIE&&this.state=="dragReady"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>3&&t.dragDrop()}if(this.state==="dragWait"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>0&&(t.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()))}},this.onMouseDown=function(e){if(!this.$dragEnabled)return;this.mousedownEvent=e;var t=this.editor,n=e.inSelection(),r=e.getButton(),i=e.domEvent.detail||1;if(i===1&&r===0&&n){if(e.editor.inMultiSelectMode&&(e.getAccelKey()||e.getShiftKey()))return;this.mousedownEvent.time=Date.now();var o=e.domEvent.target||e.domEvent.srcElement;"unselectable"in o&&(o.unselectable="on");if(t.getDragDelay()){if(s.isWebKit){this.cancelDrag=!0;var u=t.container;u.draggable=!0}this.setState("dragWait")}else this.startDrag();this.captureMouse(e,this.onMouseDrag.bind(this)),e.defaultPrevented=!0}}}).call(f.prototype),t.DragdropHandler=f}),ace.define("ace/mouse/touch_handler",["require","exports","module","ace/mouse/mouse_event","ace/lib/dom"],function(e,t,n){"use strict";var r=e("./mouse_event").MouseEvent,i=e("../lib/dom");t.addTouchListeners=function(e,t){function y(){var e=window.navigator&&window.navigator.clipboard,r=!1,s=function(){var n=t.getCopyText(),s=t.session.getUndoManager().hasUndo();g.replaceChild(i.buildDom(r?["span",!n&&["span",{"class":"ace_mobile-button",action:"selectall"},"Select All"],n&&["span",{"class":"ace_mobile-button",action:"copy"},"Copy"],n&&["span",{"class":"ace_mobile-button",action:"cut"},"Cut"],e&&["span",{"class":"ace_mobile-button",action:"paste"},"Paste"],s&&["span",{"class":"ace_mobile-button",action:"undo"},"Undo"],["span",{"class":"ace_mobile-button",action:"find"},"Find"],["span",{"class":"ace_mobile-button",action:"openCommandPallete"},"Pallete"]]:["span"]),g.firstChild)},o=function(n){var i=n.target.getAttribute("action");if(i=="more"||!r)return r=!r,s();if(i=="paste")e.readText().then(function(e){t.execCommand(i,e)});else if(i){if(i=="cut"||i=="copy")e?e.writeText(t.getCopyText()):document.execCommand("copy");t.execCommand(i)}g.firstChild.style.display="none",r=!1,i!="openCommandPallete"&&t.focus()};g=i.buildDom(["div",{"class":"ace_mobile-menu",ontouchstart:function(e){n="menu",e.stopPropagation(),e.preventDefault(),t.textInput.focus()},ontouchend:function(e){e.stopPropagation(),e.preventDefault(),o(e)},onclick:o},["span"],["span",{"class":"ace_mobile-button",action:"more"},"..."]],t.container)}function b(){g||y();var e=t.selection.cursor,n=t.renderer.textToScreenCoordinates(e.row,e.column),r=t.container.getBoundingClientRect();g.style.top=n.pageY-r.top-3+"px",g.style.right="10px",g.style.display="",g.firstChild.style.display="none",t.on("input",w)}function w(e){g&&(g.style.display="none"),t.off("input",w)}function E(){f=null,clearTimeout(f);var e=t.selection.getRange(),r=e.contains(h.row,h.column);if(e.isEmpty()||!r)t.selection.moveToPosition(h),t.selection.selectWord();n="wait",b()}function S(){f=null,clearTimeout(f),t.selection.moveToPosition(h);var e=p>=2?t.selection.getLineRange(h.row):t.session.getBracketRange(h);e&&!e.isEmpty()?t.selection.setRange(e):t.selection.selectWord(),n="wait"}function x(){c+=60,l=setInterval(function(){c--<=0&&(clearInterval(l),l=null),Math.abs(d)<.01&&(d=0),Math.abs(v)<.01&&(v=0),c<20&&(d=.9*d),c<20&&(v=.9*v);var e=t.session.getScrollTop();t.renderer.scrollBy(10*d,10*v),e==t.session.getScrollTop()&&(c=0)},10)}var n="scroll",s,o,u,a,f,l,c=0,h,p=0,d=0,v=0,m,g;e.addEventListener("contextmenu",function(e){if(!m)return;var n=t.textInput.getElement();n.focus()}),e.addEventListener("touchstart",function(e){var i=e.touches;if(f||i.length>1){clearTimeout(f),f=null,u=-1,n="zoom";return}m=t.$mouseHandler.isMousePressed=!0;var l=t.renderer.layerConfig.lineHeight,g=t.renderer.layerConfig.lineHeight,y=e.timeStamp;a=y;var b=i[0],w=b.clientX,x=b.clientY;Math.abs(s-w)+Math.abs(o-x)>l&&(u=-1),s=e.clientX=w,o=e.clientY=x,d=v=0;var T=new r(e,t);h=T.getDocumentPosition();if(y-u<500&&i.length==1&&!c)p++,e.preventDefault(),e.button=0,S();else{p=0;var N=t.selection.cursor,C=t.selection.isEmpty()?N:t.selection.anchor,k=t.renderer.$cursorLayer.getPixelPosition(N,!0),L=t.renderer.$cursorLayer.getPixelPosition(C,!0),A=t.renderer.scroller.getBoundingClientRect(),O=function(e,t){return e/=g,t=t/l-.75,e*e+t*t};if(e.clientX_?"cursor":"anchor"),_<3.5?n="anchor":M<3.5?n="cursor":n="scroll",f=setTimeout(E,450)}u=y}),e.addEventListener("touchend",function(e){m=t.$mouseHandler.isMousePressed=!1,l&&clearInterval(l),n=="zoom"?(n="",c=0):f?(t.selection.moveToPosition(h),c=0,b()):n=="scroll"?(x(),e.preventDefault(),w()):b(),clearTimeout(f),f=null}),e.addEventListener("touchmove",function(e){f&&(clearTimeout(f),f=null);var i=e.touches;if(i.length>1||n=="zoom")return;var u=i[0],l=s-u.clientX,c=o-u.clientY;if(n=="wait"){if(!(l*l+c*c>4))return e.preventDefault();n="cursor"}s=u.clientX,o=u.clientY,e.clientX=u.clientX,e.clientY=u.clientY;var h=e.timeStamp,p=h-a;a=h;if(n=="scroll"){var m=new r(e,t);m.speed=1,m.wheelX=l,m.wheelY=c,10*Math.abs(l)1&&(i=n[n.length-2]);var o=a[t+"Path"];return o==null?o=a.basePath:r=="/"&&(t=r=""),o&&o.slice(-1)!="/"&&(o+="/"),o+t+r+i+this.get("suffix")},t.setModuleUrl=function(e,t){return a.$moduleUrls[e]=t},t.$loading={},t.loadModule=function(n,r){var i,o;Array.isArray(n)&&(o=n[0],n=n[1]);try{i=e(n)}catch(u){}if(i&&!t.$loading[n])return r&&r(i);t.$loading[n]||(t.$loading[n]=[]),t.$loading[n].push(r);if(t.$loading[n].length>1)return;var a=function(){e([n],function(e){t._emit("load.module",{name:n,module:e});var r=t.$loading[n];t.$loading[n]=null,r.forEach(function(t){t&&t(e)})})};if(!t.get("packaged"))return a();s.loadScript(t.moduleUrl(n,o),a),f()};var f=function(){!a.basePath&&!a.workerPath&&!a.modePath&&!a.themePath&&!Object.keys(a.$moduleUrls).length&&(console.error("Unable to infer path to ace from script src,","use ace.config.set('basePath', 'path') to enable dynamic loading of modes and themes","or with webpack use ace/webpack-resolver"),f=function(){})};t.init=l,t.version="1.4.6"}),ace.define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/mouse/touch_handler","ace/config"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=e("./default_handlers").DefaultHandlers,o=e("./default_gutter_handler").GutterHandler,u=e("./mouse_event").MouseEvent,a=e("./dragdrop_handler").DragdropHandler,f=e("./touch_handler").addTouchListeners,l=e("../config"),c=function(e){var t=this;this.editor=e,new s(this),new o(this),new a(this);var n=function(t){var n=!document.hasFocus||!document.hasFocus()||!e.isFocused()&&document.activeElement==(e.textInput&&e.textInput.getElement());n&&window.focus(),e.focus()},u=e.renderer.getMouseEventTarget();r.addListener(u,"click",this.onMouseEvent.bind(this,"click")),r.addListener(u,"mousemove",this.onMouseMove.bind(this,"mousemove")),r.addMultiMouseDownListener([u,e.renderer.scrollBarV&&e.renderer.scrollBarV.inner,e.renderer.scrollBarH&&e.renderer.scrollBarH.inner,e.textInput&&e.textInput.getElement()].filter(Boolean),[400,300,250],this,"onMouseEvent"),r.addMouseWheelListener(e.container,this.onMouseWheel.bind(this,"mousewheel")),f(e.container,e);var l=e.renderer.$gutter;r.addListener(l,"mousedown",this.onMouseEvent.bind(this,"guttermousedown")),r.addListener(l,"click",this.onMouseEvent.bind(this,"gutterclick")),r.addListener(l,"dblclick",this.onMouseEvent.bind(this,"gutterdblclick")),r.addListener(l,"mousemove",this.onMouseEvent.bind(this,"guttermousemove")),r.addListener(u,"mousedown",n),r.addListener(l,"mousedown",n),i.isIE&&e.renderer.scrollBarV&&(r.addListener(e.renderer.scrollBarV.element,"mousedown",n),r.addListener(e.renderer.scrollBarH.element,"mousedown",n)),e.on("mousemove",function(n){if(t.state||t.$dragDelay||!t.$dragEnabled)return;var r=e.renderer.screenToTextCoordinates(n.x,n.y),i=e.session.selection.getRange(),s=e.renderer;!i.isEmpty()&&i.insideStart(r.row,r.column)?s.setCursorStyle("default"):s.setCursorStyle("")})};(function(){this.onMouseEvent=function(e,t){this.editor._emit(e,new u(t,this.editor))},this.onMouseMove=function(e,t){var n=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;if(!n||!n.length)return;this.editor._emit(e,new u(t,this.editor))},this.onMouseWheel=function(e,t){var n=new u(t,this.editor);n.speed=this.$scrollSpeed*2,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.setState=function(e){this.state=e},this.captureMouse=function(e,t){this.x=e.x,this.y=e.y,this.isMousePressed=!0;var n=this.editor,s=this.editor.renderer;s.$isMousePressed=!0;var o=this,a=function(e){if(!e)return;if(i.isWebKit&&!e.which&&o.releaseMouse)return o.releaseMouse();o.x=e.clientX,o.y=e.clientY,t&&t(e),o.mouseEvent=new u(e,o.editor),o.$mouseMoved=!0},f=function(e){n.off("beforeEndOperation",c),clearInterval(h),l(),o[o.state+"End"]&&o[o.state+"End"](e),o.state="",o.isMousePressed=s.$isMousePressed=!1,s.$keepTextAreaAtCursor&&s.$moveTextAreaToCursor(),o.$onCaptureMouseMove=o.releaseMouse=null,e&&o.onMouseEvent("mouseup",e),n.endOperation()},l=function(){o[o.state]&&o[o.state](),o.$mouseMoved=!1};if(i.isOldIE&&e.domEvent.type=="dblclick")return setTimeout(function(){f(e)});var c=function(e){if(!o.releaseMouse)return;n.curOp.command.name&&n.curOp.selectionChanged&&(o[o.state+"End"]&&o[o.state+"End"](),o.state="",o.releaseMouse())};n.on("beforeEndOperation",c),n.startOperation({command:{name:"mouse"}}),o.$onCaptureMouseMove=a,o.releaseMouse=r.capture(this.editor.container,a,f);var h=setInterval(l,20)},this.releaseMouse=null,this.cancelContextMenu=function(){var e=function(t){if(t&&t.domEvent&&t.domEvent.type!="contextmenu")return;this.editor.off("nativecontextmenu",e),t&&t.domEvent&&r.stopEvent(t.domEvent)}.bind(this);setTimeout(e,10),this.editor.on("nativecontextmenu",e)}}).call(c.prototype),l.defineOptions(c.prototype,"mouseHandler",{scrollSpeed:{initialValue:2},dragDelay:{initialValue:i.isMac?150:0},dragEnabled:{initialValue:!0},focusTimeout:{initialValue:0},tooltipFollowsMouse:{initialValue:!0}}),t.MouseHandler=c}),ace.define("ace/mouse/fold_handler",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";function i(e){e.on("click",function(t){var n=t.getDocumentPosition(),i=e.session,s=i.getFoldAt(n.row,n.column,1);s&&(t.getAccelKey()?i.removeFold(s):i.expandFold(s),t.stop());var o=t.domEvent&&t.domEvent.target;o&&r.hasCssClass(o,"ace_inline_button")&&r.hasCssClass(o,"ace_toggle_wrap")&&(i.setOption("wrap",!i.getUseWrapMode()),e.renderer.scrollCursorIntoView())}),e.on("gutterclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session;i.foldWidgets&&i.foldWidgets[r]&&e.session.onFoldWidgetClick(r,t),e.isFocused()||e.focus(),t.stop()}}),e.on("gutterdblclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session,s=i.getParentFoldRangeData(r,!0),o=s.range||s.firstRange;if(o){r=o.start.row;var u=i.getFoldAt(r,i.getLine(r).length,1);u?i.removeFold(u):(i.addFold("...",o),e.renderer.scrollCursorIntoView({row:o.start.row,column:0}))}t.stop()}})}var r=e("../lib/dom");t.FoldHandler=i}),ace.define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"],function(e,t,n){"use strict";var r=e("../lib/keys"),i=e("../lib/event"),s=function(e){this.$editor=e,this.$data={editor:e},this.$handlers=[],this.setDefaultHandler(e.commands)};(function(){this.setDefaultHandler=function(e){this.removeKeyboardHandler(this.$defaultHandler),this.$defaultHandler=e,this.addKeyboardHandler(e,0)},this.setKeyboardHandler=function(e){var t=this.$handlers;if(t[t.length-1]==e)return;while(t[t.length-1]&&t[t.length-1]!=this.$defaultHandler)this.removeKeyboardHandler(t[t.length-1]);this.addKeyboardHandler(e,1)},this.addKeyboardHandler=function(e,t){if(!e)return;typeof e=="function"&&!e.handleKeyboard&&(e.handleKeyboard=e);var n=this.$handlers.indexOf(e);n!=-1&&this.$handlers.splice(n,1),t==undefined?this.$handlers.push(e):this.$handlers.splice(t,0,e),n==-1&&e.attach&&e.attach(this.$editor)},this.removeKeyboardHandler=function(e){var t=this.$handlers.indexOf(e);return t==-1?!1:(this.$handlers.splice(t,1),e.detach&&e.detach(this.$editor),!0)},this.getKeyboardHandler=function(){return this.$handlers[this.$handlers.length-1]},this.getStatusText=function(){var e=this.$data,t=e.editor;return this.$handlers.map(function(n){return n.getStatusText&&n.getStatusText(t,e)||""}).filter(Boolean).join(" ")},this.$callKeyboardHandlers=function(e,t,n,r){var s,o=!1,u=this.$editor.commands;for(var a=this.$handlers.length;a--;){s=this.$handlers[a].handleKeyboard(this.$data,e,t,n,r);if(!s||!s.command)continue;s.command=="null"?o=!0:o=u.exec(s.command,this.$editor,s.args,r),o&&r&&e!=-1&&s.passEvent!=1&&s.command.passEvent!=1&&i.stopEvent(r);if(o)break}return!o&&e==-1&&(s={command:"insertstring"},o=u.exec("insertstring",this.$editor,t)),o&&this.$editor._signal&&this.$editor._signal("keyboardActivity",s),o},this.onCommandKey=function(e,t,n){var i=r.keyCodeToString(n);return this.$callKeyboardHandlers(t,i,n,e)},this.onTextInput=function(e){return this.$callKeyboardHandlers(-1,e)}}).call(s.prototype),t.KeyBinding=s}),ace.define("ace/lib/bidiutil",["require","exports","module"],function(e,t,n){"use strict";function F(e,t,n,r){var i=s?d:p,c=null,h=null,v=null,m=0,g=null,y=null,b=-1,w=null,E=null,T=[];if(!r)for(w=0,r=[];w0)if(g==16){for(w=b;w-1){for(w=b;w=0;C--){if(r[C]!=N)break;t[C]=s}}}function I(e,t,n){if(o=e){u=i+1;while(u=e)u++;for(a=i,l=u-1;a=t.length||(o=n[r-1])!=b&&o!=w||(c=t[r+1])!=b&&c!=w)return E;return u&&(c=w),c==o?c:E;case k:o=r>0?n[r-1]:S;if(o==b&&r+10&&n[r-1]==b)return b;if(u)return E;p=r+1,h=t.length;while(p=1425&&d<=2303||d==64286;o=t[p];if(v&&(o==y||o==T))return y}if(r<1||(o=t[r-1])==S)return E;return n[r-1];case S:return u=!1,f=!0,s;case x:return l=!0,E;case O:case M:case D:case P:case _:u=!1;case H:return E}}function R(e){var t=e.charCodeAt(0),n=t>>8;return n==0?t>191?g:B[t]:n==5?/[\u0591-\u05f4]/.test(e)?y:g:n==6?/[\u0610-\u061a\u064b-\u065f\u06d6-\u06e4\u06e7-\u06ed]/.test(e)?A:/[\u0660-\u0669\u066b-\u066c]/.test(e)?w:t==1642?L:/[\u06f0-\u06f9]/.test(e)?b:T:n==32&&t<=8287?j[t&255]:n==254?t>=65136?T:E:E}function U(e){return e>="\u064b"&&e<="\u0655"}var r=["\u0621","\u0641"],i=["\u063a","\u064a"],s=0,o=0,u=!1,a=!1,f=!1,l=!1,c=!1,h=!1,p=[[0,3,0,1,0,0,0],[0,3,0,1,2,2,0],[0,3,0,17,2,0,1],[0,3,5,5,4,1,0],[0,3,21,21,4,0,1],[0,3,5,5,4,2,0]],d=[[2,0,1,1,0,1,0],[2,0,1,1,0,2,0],[2,0,2,1,3,2,0],[2,0,2,33,3,1,1]],v=0,m=1,g=0,y=1,b=2,w=3,E=4,S=5,x=6,T=7,N=8,C=9,k=10,L=11,A=12,O=13,M=14,_=15,D=16,P=17,H=18,B=[H,H,H,H,H,H,H,H,H,x,S,x,N,S,H,H,H,H,H,H,H,H,H,H,H,H,H,H,S,S,S,x,N,E,E,L,L,L,E,E,E,E,E,k,C,k,C,C,b,b,b,b,b,b,b,b,b,b,C,E,E,E,E,E,E,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,E,E,E,E,E,E,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,E,E,E,E,H,H,H,H,H,H,S,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,C,E,L,L,L,L,E,E,E,E,g,E,E,H,E,E,L,L,b,b,E,g,E,E,E,b,g,E,E,E,E,E],j=[N,N,N,N,N,N,N,N,N,N,N,H,H,H,g,y,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,N,S,O,M,_,D,P,C,L,L,L,L,L,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,C,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,N];t.L=g,t.R=y,t.EN=b,t.ON_R=3,t.AN=4,t.R_H=5,t.B=6,t.RLE=7,t.DOT="\u00b7",t.doBidiReorder=function(e,n,r){if(e.length<2)return{};var i=e.split(""),o=new Array(i.length),u=new Array(i.length),a=[];s=r?m:v,F(i,a,i.length,n);for(var f=0;fT&&n[f]0&&i[f-1]==="\u0644"&&/\u0622|\u0623|\u0625|\u0627/.test(i[f])&&(a[f-1]=a[f]=t.R_H,f++);i[i.length-1]===t.DOT&&(a[i.length-1]=t.B),i[0]==="\u202b"&&(a[0]=t.RLE);for(var f=0;f=0&&(e=this.session.$docRowCache[n])}return e},this.getSplitIndex=function(){var e=0,t=this.session.$screenRowCache;if(t.length){var n,r=this.session.$getRowCacheIndex(t,this.currentRow);while(this.currentRow-e>0){n=this.session.$getRowCacheIndex(t,this.currentRow-e-1);if(n!==r)break;r=n,e++}}else e=this.currentRow;return e},this.updateRowLine=function(e,t){e===undefined&&(e=this.getDocumentRow());var n=e===this.session.getLength()-1,s=n?this.EOF:this.EOL;this.wrapIndent=0,this.line=this.session.getLine(e),this.isRtlDir=this.$isRtl||this.line.charAt(0)===this.RLE;if(this.session.$useWrapMode){var o=this.session.$wrapData[e];o&&(t===undefined&&(t=this.getSplitIndex()),t>0&&o.length?(this.wrapIndent=o.indent,this.wrapOffset=this.wrapIndent*this.charWidths[r.L],this.line=tt?this.session.getOverwrite()?e:e-1:t,i=r.getVisualFromLogicalIdx(n,this.bidiMap),s=this.bidiMap.bidiLevels,o=0;!this.session.getOverwrite()&&e<=t&&s[i]%2!==0&&i++;for(var u=0;ut&&s[i]%2===0&&(o+=this.charWidths[s[i]]),this.wrapIndent&&(o+=this.isRtlDir?-1*this.wrapOffset:this.wrapOffset),this.isRtlDir&&(o+=this.rtlLineOffset),o},this.getSelections=function(e,t){var n=this.bidiMap,r=n.bidiLevels,i,s=[],o=0,u=Math.min(e,t)-this.wrapIndent,a=Math.max(e,t)-this.wrapIndent,f=!1,l=!1,c=0;this.wrapIndent&&(o+=this.isRtlDir?-1*this.wrapOffset:this.wrapOffset);for(var h,p=0;p=u&&hn+s/2){n+=s;if(r===i.length-1){s=0;break}s=this.charWidths[i[++r]]}return r>0&&i[r-1]%2!==0&&i[r]%2===0?(e0&&i[r-1]%2===0&&i[r]%2!==0?t=1+(e>n?this.bidiMap.logicalFromVisual[r]:this.bidiMap.logicalFromVisual[r-1]):this.isRtlDir&&r===i.length-1&&s===0&&i[r-1]%2===0||!this.isRtlDir&&r===0&&i[r]%2!==0?t=1+this.bidiMap.logicalFromVisual[r]:(r>0&&i[r-1]%2!==0&&s!==0&&r--,t=this.bidiMap.logicalFromVisual[r]),t===0&&this.isRtlDir&&t++,t+this.wrapIndent}}).call(o.prototype),t.BidiHandler=o}),ace.define("ace/selection",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/range"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/lang"),s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=function(e){this.session=e,this.doc=e.getDocument(),this.clearSelection(),this.cursor=this.lead=this.doc.createAnchor(0,0),this.anchor=this.doc.createAnchor(0,0),this.$silent=!1;var t=this;this.cursor.on("change",function(e){t.$cursorChanged=!0,t.$silent||t._emit("changeCursor"),!t.$isEmpty&&!t.$silent&&t._emit("changeSelection"),!t.$keepDesiredColumnOnChange&&e.old.column!=e.value.column&&(t.$desiredColumn=null)}),this.anchor.on("change",function(){t.$anchorChanged=!0,!t.$isEmpty&&!t.$silent&&t._emit("changeSelection")})};(function(){r.implement(this,s),this.isEmpty=function(){return this.$isEmpty||this.anchor.row==this.lead.row&&this.anchor.column==this.lead.column},this.isMultiLine=function(){return!this.$isEmpty&&this.anchor.row!=this.cursor.row},this.getCursor=function(){return this.lead.getPosition()},this.setSelectionAnchor=function(e,t){this.$isEmpty=!1,this.anchor.setPosition(e,t)},this.getAnchor=this.getSelectionAnchor=function(){return this.$isEmpty?this.getSelectionLead():this.anchor.getPosition()},this.getSelectionLead=function(){return this.lead.getPosition()},this.isBackwards=function(){var e=this.anchor,t=this.lead;return e.row>t.row||e.row==t.row&&e.column>t.column},this.getRange=function(){var e=this.anchor,t=this.lead;return this.$isEmpty?o.fromPoints(t,t):this.isBackwards()?o.fromPoints(t,e):o.fromPoints(e,t)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit("changeSelection"))},this.selectAll=function(){this.$setSelection(0,0,Number.MAX_VALUE,Number.MAX_VALUE)},this.setRange=this.setSelectionRange=function(e,t){var n=t?e.end:e.start,r=t?e.start:e.end;this.$setSelection(n.row,n.column,r.row,r.column)},this.$setSelection=function(e,t,n,r){var i=this.$isEmpty,s=this.inMultiSelectMode;this.$silent=!0,this.$cursorChanged=this.$anchorChanged=!1,this.anchor.setPosition(e,t),this.cursor.setPosition(n,r),this.$isEmpty=!o.comparePoints(this.anchor,this.cursor),this.$silent=!1,this.$cursorChanged&&this._emit("changeCursor"),(this.$cursorChanged||this.$anchorChanged||i!=this.$isEmpty||s)&&this._emit("changeSelection")},this.$moveSelection=function(e){var t=this.lead;this.$isEmpty&&this.setSelectionAnchor(t.row,t.column),e.call(this)},this.selectTo=function(e,t){this.$moveSelection(function(){this.moveCursorTo(e,t)})},this.selectToPosition=function(e){this.$moveSelection(function(){this.moveCursorToPosition(e)})},this.moveTo=function(e,t){this.clearSelection(),this.moveCursorTo(e,t)},this.moveToPosition=function(e){this.clearSelection(),this.moveCursorToPosition(e)},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.getWordRange=function(e,t){if(typeof t=="undefined"){var n=e||this.lead;e=n.row,t=n.column}return this.session.getWordRange(e,t)},this.selectWord=function(){this.setSelectionRange(this.getWordRange())},this.selectAWord=function(){var e=this.getCursor(),t=this.session.getAWordRange(e.row,e.column);this.setSelectionRange(t)},this.getLineRange=function(e,t){var n=typeof e=="number"?e:this.lead.row,r,i=this.session.getFoldLine(n);return i?(n=i.start.row,r=i.end.row):r=n,t===!0?new o(n,0,r,this.session.getLine(r).length):new o(n,0,r+1,0)},this.selectLine=function(){this.setSelectionRange(this.getLineRange())},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.wouldMoveIntoSoftTab=function(e,t,n){var r=e.column,i=e.column+t;return n<0&&(r=e.column-t,i=e.column),this.session.isTabStop(e)&&this.doc.getLine(e.row).slice(r,i).split(" ").length-1==t},this.moveCursorLeft=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,-1))this.moveCursorTo(t.start.row,t.start.column);else if(e.column===0)e.row>0&&this.moveCursorTo(e.row-1,this.doc.getLine(e.row-1).length);else{var n=this.session.getTabSize();this.wouldMoveIntoSoftTab(e,n,-1)&&!this.session.getNavigateWithinSoftTabs()?this.moveCursorBy(0,-n):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,1))this.moveCursorTo(t.end.row,t.end.column);else if(this.lead.column==this.doc.getLine(this.lead.row).length)this.lead.row0&&(t.column=r)}}this.moveCursorTo(t.row,t.column)},this.moveCursorFileEnd=function(){var e=this.doc.getLength()-1,t=this.doc.getLine(e).length;this.moveCursorTo(e,t)},this.moveCursorFileStart=function(){this.moveCursorTo(0,0)},this.moveCursorLongWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t);this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;var i=this.session.getFoldAt(e,t,1);if(i){this.moveCursorTo(i.end.row,i.end.column);return}this.session.nonTokenRe.exec(r)&&(t+=this.session.nonTokenRe.lastIndex,this.session.nonTokenRe.lastIndex=0,r=n.substring(t));if(t>=n.length){this.moveCursorTo(e,n.length),this.moveCursorRight(),e0&&this.moveCursorWordLeft();return}this.session.tokenRe.exec(s)&&(t-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0),this.moveCursorTo(e,t)},this.$shortWordEndIndex=function(e){var t=0,n,r=/\s/,i=this.session.tokenRe;i.lastIndex=0;if(this.session.tokenRe.exec(e))t=this.session.tokenRe.lastIndex;else{while((n=e[t])&&r.test(n))t++;if(t<1){i.lastIndex=0;while((n=e[t])&&!i.test(n)){i.lastIndex=0,t++;if(r.test(n)){if(t>2){t--;break}while((n=e[t])&&r.test(n))t++;if(t>2)break}}}}return i.lastIndex=0,t},this.moveCursorShortWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i=this.session.getFoldAt(e,t,1);if(i)return this.moveCursorTo(i.end.row,i.end.column);if(t==n.length){var s=this.doc.getLength();do e++,r=this.doc.getLine(e);while(e0&&/^\s*$/.test(r));t=r.length,/\s+$/.test(r)||(r="")}var s=i.stringReverse(r),o=this.$shortWordEndIndex(s);return this.moveCursorTo(e,t-o)},this.moveCursorWordRight=function(){this.session.$selectLongWords?this.moveCursorLongWordRight():this.moveCursorShortWordRight()},this.moveCursorWordLeft=function(){this.session.$selectLongWords?this.moveCursorLongWordLeft():this.moveCursorShortWordLeft()},this.moveCursorBy=function(e,t){var n=this.session.documentToScreenPosition(this.lead.row,this.lead.column),r;t===0&&(e!==0&&(this.session.$bidiHandler.isBidiRow(n.row,this.lead.row)?(r=this.session.$bidiHandler.getPosLeft(n.column),n.column=Math.round(r/this.session.$bidiHandler.charWidths[0])):r=n.column*this.session.$bidiHandler.charWidths[0]),this.$desiredColumn?n.column=this.$desiredColumn:this.$desiredColumn=n.column);var i=this.session.screenToDocumentPosition(n.row+e,n.column,r);e!==0&&t===0&&i.row===this.lead.row&&i.column===this.lead.column&&this.session.lineWidgets&&this.session.lineWidgets[i.row]&&(i.row>0||e>0)&&i.row++,this.moveCursorTo(i.row,i.column+t,t===0)},this.moveCursorToPosition=function(e){this.moveCursorTo(e.row,e.column)},this.moveCursorTo=function(e,t,n){var r=this.session.getFoldAt(e,t,1);r&&(e=r.start.row,t=r.start.column),this.$keepDesiredColumnOnChange=!0;var i=this.session.getLine(e);/[\uDC00-\uDFFF]/.test(i.charAt(t))&&i.charAt(t-1)&&(this.lead.row==e&&this.lead.column==t+1?t-=1:t+=1),this.lead.setPosition(e,t),this.$keepDesiredColumnOnChange=!1,n||(this.$desiredColumn=null)},this.moveCursorToScreen=function(e,t,n){var r=this.session.screenToDocumentPosition(e,t);this.moveCursorTo(r.row,r.column,n)},this.detach=function(){this.lead.detach(),this.anchor.detach(),this.session=this.doc=null},this.fromOrientedRange=function(e){this.setSelectionRange(e,e.cursor==e.start),this.$desiredColumn=e.desiredColumn||this.$desiredColumn},this.toOrientedRange=function(e){var t=this.getRange();return e?(e.start.column=t.start.column,e.start.row=t.start.row,e.end.column=t.end.column,e.end.row=t.end.row):e=t,e.cursor=this.isBackwards()?e.start:e.end,e.desiredColumn=this.$desiredColumn,e},this.getRangeOfMovements=function(e){var t=this.getCursor();try{e(this);var n=this.getCursor();return o.fromPoints(t,n)}catch(r){return o.fromPoints(t,t)}finally{this.moveCursorToPosition(t)}},this.toJSON=function(){if(this.rangeCount)var e=this.ranges.map(function(e){var t=e.clone();return t.isBackwards=e.cursor==e.start,t});else{var e=this.getRange();e.isBackwards=this.isBackwards()}return e},this.fromJSON=function(e){if(e.start==undefined){if(this.rangeList&&e.length>1){this.toSingleRange(e[0]);for(var t=e.length;t--;){var n=o.fromPoints(e[t].start,e[t].end);e[t].isBackwards&&(n.cursor=n.start),this.addRange(n,!0)}return}e=e[0]}this.rangeList&&this.toSingleRange(e),this.setSelectionRange(e,e.isBackwards)},this.isEqual=function(e){if((e.length||this.rangeCount)&&e.length!=this.rangeCount)return!1;if(!e.length||!this.ranges)return this.getRange().isEqual(e);for(var t=this.ranges.length;t--;)if(!this.ranges[t].isEqual(e[t]))return!1;return!0}}).call(u.prototype),t.Selection=u}),ace.define("ace/tokenizer",["require","exports","module","ace/config"],function(e,t,n){"use strict";var r=e("./config"),i=2e3,s=function(e){this.states=e,this.regExps={},this.matchMappings={};for(var t in this.states){var n=this.states[t],r=[],i=0,s=this.matchMappings[t]={defaultToken:"text"},o="g",u=[];for(var a=0;a1?f.onMatch=this.$applyToken:f.onMatch=f.token),c>1&&(/\\\d/.test(f.regex)?l=f.regex.replace(/\\([0-9]+)/g,function(e,t){return"\\"+(parseInt(t,10)+i+1)}):(c=1,l=this.removeCapturingGroups(f.regex)),!f.splitRegex&&typeof f.token!="string"&&u.push(f)),s[i]=a,i+=c,r.push(l),f.onMatch||(f.onMatch=null)}r.length||(s[0]=0,r.push("$")),u.forEach(function(e){e.splitRegex=this.createSplitterRegexp(e.regex,o)},this),this.regExps[t]=new RegExp("("+r.join(")|(")+")|($)",o)}};(function(){this.$setMaxTokenCount=function(e){i=e|0},this.$applyToken=function(e){var t=this.splitRegex.exec(e).slice(1),n=this.token.apply(this,t);if(typeof n=="string")return[{type:n,value:e}];var r=[];for(var i=0,s=n.length;il){var g=e.substring(l,m-v.length);h.type==p?h.value+=g:(h.type&&f.push(h),h={type:p,value:g})}for(var y=0;yi){c>2*e.length&&this.reportError("infinite loop with in ace tokenizer",{startState:t,line:e});while(l1&&n[0]!==r&&n.unshift("#tmp",r),{tokens:f,state:n.length?n:r}},this.reportError=r.reportError}).call(s.prototype),t.Tokenizer=s}),ace.define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../lib/lang"),i=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{defaultToken:"text"}]}};(function(){this.addRules=function(e,t){if(!t){for(var n in e)this.$rules[n]=e[n];return}for(var n in e){var r=e[n];for(var i=0;i=this.$rowTokens.length){this.$row+=1,e||(e=this.$session.getLength());if(this.$row>=e)return this.$row=e-1,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var e=this.$rowTokens,t=this.$tokenIndex,n=e[t].start;if(n!==undefined)return n;n=0;while(t>0)t-=1,n+=e[t].value.length;return n},this.getCurrentTokenPosition=function(){return{row:this.$row,column:this.getCurrentTokenColumn()}},this.getCurrentTokenRange=function(){var e=this.$rowTokens[this.$tokenIndex],t=this.getCurrentTokenColumn();return new r(this.$row,t,this.$row,t+e.value.length)}}).call(i.prototype),t.TokenIterator=i}),ace.define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),u=["text","paren.rparen","rparen","paren","punctuation.operator"],a=["text","paren.rparen","rparen","paren","punctuation.operator","comment"],f,l={},c={'"':'"',"'":"'"},h=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}},p=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},d=function(e){this.add("braces","insertion",function(t,n,r,i,s){var u=r.getCursorPosition(),a=i.doc.getLine(u.row);if(s=="{"){h(r);var l=r.getSelectionRange(),c=i.doc.getTextRange(l);if(c!==""&&c!=="{"&&r.getWrapBehavioursEnabled())return p(l,c,"{","}");if(d.isSaneInsertion(r,i))return/[\]\}\)]/.test(a[u.column])||r.inMultiSelectMode||e&&e.braces?(d.recordAutoInsert(r,i,"}"),{text:"{}",selection:[1,1]}):(d.recordMaybeInsert(r,i,"{"),{text:"{",selection:[1,1]})}else if(s=="}"){h(r);var v=a.substring(u.column,u.column+1);if(v=="}"){var m=i.$findOpeningBracket("}",{column:u.column+1,row:u.row});if(m!==null&&d.isAutoInsertedClosing(u,a,s))return d.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if(s=="\n"||s=="\r\n"){h(r);var g="";d.isMaybeInsertedClosing(u,a)&&(g=o.stringRepeat("}",f.maybeInsertedBrackets),d.clearMaybeInsertedClosing());var v=a.substring(u.column,u.column+1);if(v==="}"){var y=i.findMatchingBracket({row:u.row,column:u.column+1},"}");if(!y)return null;var b=this.$getIndent(i.getLine(y.row))}else{if(!g){d.clearMaybeInsertedClosing();return}var b=this.$getIndent(a)}var w=b+i.getTabString();return{text:"\n"+w+"\n"+b+g,selection:[1,w.length,1,w.length]}}d.clearMaybeInsertedClosing()}}),this.add("braces","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="{"){h(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u=="}")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add("parens","insertion",function(e,t,n,r,i){if(i=="("){h(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return p(s,o,"(",")");if(d.isSaneInsertion(n,r))return d.recordAutoInsert(n,r,")"),{text:"()",selection:[1,1]}}else if(i==")"){h(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==")"){var l=r.$findOpeningBracket(")",{column:u.column+1,row:u.row});if(l!==null&&d.isAutoInsertedClosing(u,a,i))return d.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="("){h(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==")")return i.end.column++,i}}),this.add("brackets","insertion",function(e,t,n,r,i){if(i=="["){h(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return p(s,o,"[","]");if(d.isSaneInsertion(n,r))return d.recordAutoInsert(n,r,"]"),{text:"[]",selection:[1,1]}}else if(i=="]"){h(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f=="]"){var l=r.$findOpeningBracket("]",{column:u.column+1,row:u.row});if(l!==null&&d.isAutoInsertedClosing(u,a,i))return d.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="["){h(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u=="]")return i.end.column++,i}}),this.add("string_dquotes","insertion",function(e,t,n,r,i){var s=r.$mode.$quotes||c;if(i.length==1&&s[i]){if(this.lineCommentStart&&this.lineCommentStart.indexOf(i)!=-1)return;h(n);var o=i,u=n.getSelectionRange(),a=r.doc.getTextRange(u);if(a!==""&&(a.length!=1||!s[a])&&n.getWrapBehavioursEnabled())return p(u,a,o,o);if(!a){var f=n.getCursorPosition(),l=r.doc.getLine(f.row),d=l.substring(f.column-1,f.column),v=l.substring(f.column,f.column+1),m=r.getTokenAt(f.row,f.column),g=r.getTokenAt(f.row,f.column+1);if(d=="\\"&&m&&/escape/.test(m.type))return null;var y=m&&/string|escape/.test(m.type),b=!g||/string|escape/.test(g.type),w;if(v==o)w=y!==b,w&&/string\.end/.test(g.type)&&(w=!1);else{if(y&&!b)return null;if(y&&b)return null;var E=r.$mode.tokenRe;E.lastIndex=0;var S=E.test(d);E.lastIndex=0;var x=E.test(d);if(S||x)return null;if(v&&!/[\s;,.})\]\\]/.test(v))return null;var T=l[f.column-2];if(!(d!=o||T!=o&&!E.test(T)))return null;w=!0}return{text:w?o+o:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.$mode.$quotes||c,o=r.doc.getTextRange(i);if(!i.isMultiLine()&&s.hasOwnProperty(o)){h(n);var u=r.doc.getLine(i.start.row),a=u.substring(i.start.column+1,i.start.column+2);if(a==o)return i.end.column++,i}})};d.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||"text",u)){if(/[)}\]]/.test(e.session.getLine(n.row)[n.column]))return!0;var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||"text",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||"text",a)},d.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},d.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},d.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},d.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},d.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},d.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},d.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(d,i),t.CstyleBehaviour=d}),ace.define("ace/unicode",["require","exports","module"],function(e,t,n){"use strict";var r=[48,9,8,25,5,0,2,25,48,0,11,0,5,0,6,22,2,30,2,457,5,11,15,4,8,0,2,0,18,116,2,1,3,3,9,0,2,2,2,0,2,19,2,82,2,138,2,4,3,155,12,37,3,0,8,38,10,44,2,0,2,1,2,1,2,0,9,26,6,2,30,10,7,61,2,9,5,101,2,7,3,9,2,18,3,0,17,58,3,100,15,53,5,0,6,45,211,57,3,18,2,5,3,11,3,9,2,1,7,6,2,2,2,7,3,1,3,21,2,6,2,0,4,3,3,8,3,1,3,3,9,0,5,1,2,4,3,11,16,2,2,5,5,1,3,21,2,6,2,1,2,1,2,1,3,0,2,4,5,1,3,2,4,0,8,3,2,0,8,15,12,2,2,8,2,2,2,21,2,6,2,1,2,4,3,9,2,2,2,2,3,0,16,3,3,9,18,2,2,7,3,1,3,21,2,6,2,1,2,4,3,8,3,1,3,2,9,1,5,1,2,4,3,9,2,0,17,1,2,5,4,2,2,3,4,1,2,0,2,1,4,1,4,2,4,11,5,4,4,2,2,3,3,0,7,0,15,9,18,2,2,7,2,2,2,22,2,9,2,4,4,7,2,2,2,3,8,1,2,1,7,3,3,9,19,1,2,7,2,2,2,22,2,9,2,4,3,8,2,2,2,3,8,1,8,0,2,3,3,9,19,1,2,7,2,2,2,22,2,15,4,7,2,2,2,3,10,0,9,3,3,9,11,5,3,1,2,17,4,23,2,8,2,0,3,6,4,0,5,5,2,0,2,7,19,1,14,57,6,14,2,9,40,1,2,0,3,1,2,0,3,0,7,3,2,6,2,2,2,0,2,0,3,1,2,12,2,2,3,4,2,0,2,5,3,9,3,1,35,0,24,1,7,9,12,0,2,0,2,0,5,9,2,35,5,19,2,5,5,7,2,35,10,0,58,73,7,77,3,37,11,42,2,0,4,328,2,3,3,6,2,0,2,3,3,40,2,3,3,32,2,3,3,6,2,0,2,3,3,14,2,56,2,3,3,66,5,0,33,15,17,84,13,619,3,16,2,25,6,74,22,12,2,6,12,20,12,19,13,12,2,2,2,1,13,51,3,29,4,0,5,1,3,9,34,2,3,9,7,87,9,42,6,69,11,28,4,11,5,11,11,39,3,4,12,43,5,25,7,10,38,27,5,62,2,28,3,10,7,9,14,0,89,75,5,9,18,8,13,42,4,11,71,55,9,9,4,48,83,2,2,30,14,230,23,280,3,5,3,37,3,5,3,7,2,0,2,0,2,0,2,30,3,52,2,6,2,0,4,2,2,6,4,3,3,5,5,12,6,2,2,6,67,1,20,0,29,0,14,0,17,4,60,12,5,0,4,11,18,0,5,0,3,9,2,0,4,4,7,0,2,0,2,0,2,3,2,10,3,3,6,4,5,0,53,1,2684,46,2,46,2,132,7,6,15,37,11,53,10,0,17,22,10,6,2,6,2,6,2,6,2,6,2,6,2,6,2,6,2,31,48,0,470,1,36,5,2,4,6,1,5,85,3,1,3,2,2,89,2,3,6,40,4,93,18,23,57,15,513,6581,75,20939,53,1164,68,45,3,268,4,27,21,31,3,13,13,1,2,24,9,69,11,1,38,8,3,102,3,1,111,44,25,51,13,68,12,9,7,23,4,0,5,45,3,35,13,28,4,64,15,10,39,54,10,13,3,9,7,22,4,1,5,66,25,2,227,42,2,1,3,9,7,11171,13,22,5,48,8453,301,3,61,3,105,39,6,13,4,6,11,2,12,2,4,2,0,2,1,2,1,2,107,34,362,19,63,3,53,41,11,5,15,17,6,13,1,25,2,33,4,2,134,20,9,8,25,5,0,2,25,12,88,4,5,3,5,3,5,3,2],i=0,s=[];for(var o=0;o2?r%f!=f-1:r%f==0}}var E=Infinity;w(function(e,t){var n=e.search(/\S/);n!==-1?(ne.length&&(E=e.length)}),u==Infinity&&(u=E,s=!1,o=!1),l&&u%f!=0&&(u=Math.floor(u/f)*f),w(o?m:v)},this.toggleBlockComment=function(e,t,n,r){var i=this.blockComment;if(!i)return;!i.start&&i[0]&&(i=i[0]);var s=new f(t,r.row,r.column),o=s.getCurrentToken(),u=t.selection,a=t.selection.toOrientedRange(),c,h;if(o&&/comment/.test(o.type)){var p,d;while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.start);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;p=new l(m,g,m,g+i.start.length);break}o=s.stepBackward()}var s=new f(t,r.row,r.column),o=s.getCurrentToken();while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.end);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;d=new l(m,g,m,g+i.end.length);break}o=s.stepForward()}d&&t.remove(d),p&&(t.remove(p),c=p.start.row,h=-i.start.length)}else h=i.start.length,c=n.start.row,t.insert(n.end,i.end),t.insert(n.start,i.start);a.start.row==c&&(a.start.column+=h),a.end.row==c&&(a.end.column+=h),t.selection.fromOrientedRange(a)},this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.autoOutdent=function(e,t,n){},this.$getIndent=function(e){return e.match(/^\s*/)[0]},this.createWorker=function(e){return null},this.createModeDelegates=function(e){this.$embeds=[],this.$modes={};for(var t in e)if(e[t]){var n=e[t],i=n.prototype.$id,s=r.$modes[i];s||(r.$modes[i]=s=new n),r.$modes[t]||(r.$modes[t]=s),this.$embeds.push(t),this.$modes[t]=s}var o=["toggleBlockComment","toggleCommentLines","getNextLineIndent","checkOutdent","autoOutdent","transformAction","getCompletions"];for(var t=0;t=0&&t.row=0&&t.column<=e[t.row].length}function s(e,t){t.action!="insert"&&t.action!="remove"&&r(t,"delta.action must be 'insert' or 'remove'"),t.lines instanceof Array||r(t,"delta.lines must be an Array"),(!t.start||!t.end)&&r(t,"delta.start/end must be an present");var n=t.start;i(e,t.start)||r(t,"delta.start must be contained in document");var s=t.end;t.action=="remove"&&!i(e,s)&&r(t,"delta.end must contained in document for 'remove' actions");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,"delta.range must match delta lines")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||"";switch(t.action){case"insert":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case"remove":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),ace.define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=t.Anchor=function(e,t,n){this.$onChange=this.onChange.bind(this),this.attach(e),typeof n=="undefined"?this.setPosition(t.row,t.column):this.setPosition(t,n)};(function(){function e(e,t,n){var r=n?e.column<=t.column:e.columnthis.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal("change",{old:i,value:r})},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./apply_delta").applyDelta,s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=e("./anchor").Anchor,a=function(e){this.$lines=[""],e.length===0?this.$lines=[""]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},"aaa".split(/a/).length===0?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=t?t[1]:"\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal("changeNewLineMode")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e=="\r\n"||e=="\r"||e=="\n"},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||"").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."),this.insertMergedLines(e,["",""])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:"insert",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e0,r=t=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:"remove",lines:["",""]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action=="insert";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4?this.$splitAndapplyLargeDelta(e,2e4):(i(this.$lines,e,t),this._signal("change",e))},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length-t+1,i=e.start.row,s=e.start.column;for(var o=0,u=0;o20){n.running=setTimeout(n.$worker,20);break}}n.currentLine=t,r==-1&&(r=t),s<=r&&n.fireUpdateEvent(s,r)}};(function(){r.implement(this,i),this.setTokenizer=function(e){this.tokenizer=e,this.lines=[],this.states=[],this.start(0)},this.setDocument=function(e){this.doc=e,this.lines=[],this.states=[],this.stop()},this.fireUpdateEvent=function(e,t){var n={first:e,last:t};this._signal("update",{data:n})},this.start=function(e){this.currentLine=Math.min(e||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.states.splice(this.currentLine,this.states.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.scheduleStart=function(){this.running||(this.running=setTimeout(this.$worker,700))},this.$updateOnChange=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.lines[t]=null;else if(e.action=="remove")this.lines.splice(t,n+1,null),this.states.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.lines.splice.apply(this.lines,r),this.states.splice.apply(this.states,r)}this.currentLine=Math.min(t,this.currentLine,this.doc.getLength()),this.stop()},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(e){return this.lines[e]||this.$tokenizeRow(e)},this.getState=function(e){return this.currentLine==e&&this.$tokenizeRow(e),this.states[e]||"start"},this.$tokenizeRow=function(e){var t=this.doc.getLine(e),n=this.states[e-1],r=this.tokenizer.getLineTokens(t,n,e);return this.states[e]+""!=r.state+""?(this.states[e]=r.state,this.lines[e+1]=null,this.currentLine>e+1&&(this.currentLine=e+1)):this.currentLine==e&&(this.currentLine=e+1),this.lines[e]=r.tokens}}).call(s.prototype),t.BackgroundTokenizer=s}),ace.define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(e,t,n){this.setRegexp(e),this.clazz=t,this.type=n||"text"};(function(){this.MAX_RANGES=500,this.setRegexp=function(e){if(this.regExp+""==e+"")return;this.regExp=e,this.cache=[]},this.update=function(e,t,n,i){if(!this.regExp)return;var o=i.firstRow,u=i.lastRow;for(var a=o;a<=u;a++){var f=this.cache[a];f==null&&(f=r.getMatchOffsets(n.getLine(a),this.regExp),f.length>this.MAX_RANGES&&(f=f.slice(0,this.MAX_RANGES)),f=f.map(function(e){return new s(a,e.offset,a,e.offset+e.length)}),this.cache[a]=f.length?f:"");for(var l=f.length;l--;)t.drawSingleLineMarker(e,f[l].toScreenRange(n),this.clazz,i)}}}).call(o.prototype),t.SearchHighlight=o}),ace.define("ace/edit_session/fold_line",["require","exports","module","ace/range"],function(e,t,n){"use strict";function i(e,t){this.foldData=e,Array.isArray(t)?this.folds=t:t=this.folds=[t];var n=t[t.length-1];this.range=new r(t[0].start.row,t[0].start.column,n.end.row,n.end.column),this.start=this.range.start,this.end=this.range.end,this.folds.forEach(function(e){e.setFoldLine(this)},this)}var r=e("../range").Range;(function(){this.shiftRow=function(e){this.start.row+=e,this.end.row+=e,this.folds.forEach(function(t){t.start.row+=e,t.end.row+=e})},this.addFold=function(e){if(e.sameRow){if(e.start.rowthis.endRow)throw new Error("Can't add a fold to this FoldLine as it has no connection");this.folds.push(e),this.folds.sort(function(e,t){return-e.range.compareEnd(t.start.row,t.start.column)}),this.range.compareEnd(e.start.row,e.start.column)>0?(this.end.row=e.end.row,this.end.column=e.end.column):this.range.compareStart(e.end.row,e.end.column)<0&&(this.start.row=e.start.row,this.start.column=e.start.column)}else if(e.start.row==this.end.row)this.folds.push(e),this.end.row=e.end.row,this.end.column=e.end.column;else{if(e.end.row!=this.start.row)throw new Error("Trying to add fold to FoldRow that doesn't have a matching row");this.folds.unshift(e),this.start.row=e.start.row,this.start.column=e.start.column}e.foldLine=this},this.containsRow=function(e){return e>=this.start.row&&e<=this.end.row},this.walk=function(e,t,n){var r=0,i=this.folds,s,o,u,a=!0;t==null&&(t=this.end.row,n=this.end.column);for(var f=0;f0)continue;var a=i(e,o.start);return u===0?t&&a!==0?-s-2:s:a>0||a===0&&!t?s:-s-1}return-s-1},this.add=function(e){var t=!e.isEmpty(),n=this.pointIndex(e.start,t);n<0&&(n=-n-1);var r=this.pointIndex(e.end,t,n);return r<0?r=-r-1:r++,this.ranges.splice(n,r-n,e)},this.addList=function(e){var t=[];for(var n=e.length;n--;)t.push.apply(t,this.add(e[n]));return t},this.substractPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges.splice(t,1)},this.merge=function(){var e=[],t=this.ranges;t=t.sort(function(e,t){return i(e.start,t.start)});var n=t[0],r;for(var s=1;s=0},this.containsPoint=function(e){return this.pointIndex(e)>=0},this.rangeAtPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges[t]},this.clipRows=function(e,t){var n=this.ranges;if(n[0].start.row>t||n[n.length-1].start.row=r)break}if(e.action=="insert"){var f=i-r,l=-t.column+n.column;for(;or)break;a.start.row==r&&a.start.column>=t.column&&(a.start.column==t.column&&this.$bias<=0||(a.start.column+=l,a.start.row+=f));if(a.end.row==r&&a.end.column>=t.column){if(a.end.column==t.column&&this.$bias<0)continue;a.end.column==t.column&&l>0&&oa.start.column&&a.end.column==s[o+1].start.column&&(a.end.column-=l),a.end.column+=l,a.end.row+=f}}}else{var f=r-i,l=t.column-n.column;for(;oi)break;if(a.end.rowt.column)a.end.column=t.column,a.end.row=t.row}else a.end.column+=l,a.end.row+=f;else a.end.row>i&&(a.end.row+=f);if(a.start.rowt.column)a.start.column=t.column,a.start.row=t.row}else a.start.column+=l,a.start.row+=f;else a.start.row>i&&(a.start.row+=f)}}if(f!=0&&o=e)return i;if(i.end.row>e)return null}return null},this.getNextFoldLine=function(e,t){var n=this.$foldData,r=0;t&&(r=n.indexOf(t)),r==-1&&(r=0);for(r;r=e)return i}return null},this.getFoldedRowCount=function(e,t){var n=this.$foldData,r=t-e+1;for(var i=0;i=t){u=e?r-=t-u:r=0);break}o>=e&&(u>=e?r-=o-u:r-=o-e+1)}return r},this.$addFoldLine=function(e){return this.$foldData.push(e),this.$foldData.sort(function(e,t){return e.start.row-t.start.row}),e},this.addFold=function(e,t){var n=this.$foldData,r=!1,o;e instanceof s?o=e:(o=new s(t,e),o.collapseChildren=t.collapseChildren),this.$clipRangeToDocument(o.range);var u=o.start.row,a=o.start.column,f=o.end.row,l=o.end.column,c=this.getFoldAt(u,a,1),h=this.getFoldAt(f,l,-1);if(c&&h==c)return c.addSubFold(o);c&&!c.range.isStart(u,a)&&this.removeFold(c),h&&!h.range.isEnd(f,l)&&this.removeFold(h);var p=this.getFoldsInRange(o.range);p.length>0&&(this.removeFolds(p),p.forEach(function(e){o.addSubFold(e)}));for(var d=0;d0&&this.foldAll(e.start.row+1,e.end.row,e.collapseChildren-1),e.subFolds=[]},this.expandFolds=function(e){e.forEach(function(e){this.expandFold(e)},this)},this.unfold=function(e,t){var n,i;e==null?(n=new r(0,0,this.getLength(),0),t=!0):typeof e=="number"?n=new r(e,0,e,this.getLine(e).length):"row"in e?n=r.fromPoints(e,e):n=e,i=this.getFoldsInRangeList(n);if(t)this.removeFolds(i);else{var s=i;while(s.length)this.expandFolds(s),s=this.getFoldsInRangeList(n)}if(i.length)return i},this.isRowFolded=function(e,t){return!!this.getFoldLine(e,t)},this.getRowFoldEnd=function(e,t){var n=this.getFoldLine(e,t);return n?n.end.row:e},this.getRowFoldStart=function(e,t){var n=this.getFoldLine(e,t);return n?n.start.row:e},this.getFoldDisplayLine=function(e,t,n,r,i){r==null&&(r=e.start.row),i==null&&(i=0),t==null&&(t=e.end.row),n==null&&(n=this.getLine(t).length);var s=this.doc,o="";return e.walk(function(e,t,n,u){if(tl)break}while(s&&a.test(s.type));s=i.stepBackward()}else s=i.getCurrentToken();return f.end.row=i.getCurrentTokenRow(),f.end.column=i.getCurrentTokenColumn()+s.value.length-2,f}},this.foldAll=function(e,t,n){n==undefined&&(n=1e5);var r=this.foldWidgets;if(!r)return;t=t||this.getLength(),e=e||0;for(var i=e;i=e){i=s.end.row;try{var o=this.addFold("...",s);o&&(o.collapseChildren=n)}catch(u){}}}},this.$foldStyles={manual:1,markbegin:1,markbeginend:1},this.$foldStyle="markbegin",this.setFoldStyle=function(e){if(!this.$foldStyles[e])throw new Error("invalid fold style: "+e+"["+Object.keys(this.$foldStyles).join(", ")+"]");if(this.$foldStyle==e)return;this.$foldStyle=e,e=="manual"&&this.unfold();var t=this.$foldMode;this.$setFolding(null),this.$setFolding(t)},this.$setFolding=function(e){if(this.$foldMode==e)return;this.$foldMode=e,this.off("change",this.$updateFoldWidgets),this.off("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets),this._signal("changeAnnotation");if(!e||this.$foldStyle=="manual"){this.foldWidgets=null;return}this.foldWidgets=[],this.getFoldWidget=e.getFoldWidget.bind(e,this,this.$foldStyle),this.getFoldWidgetRange=e.getFoldWidgetRange.bind(e,this,this.$foldStyle),this.$updateFoldWidgets=this.updateFoldWidgets.bind(this),this.$tokenizerUpdateFoldWidgets=this.tokenizerUpdateFoldWidgets.bind(this),this.on("change",this.$updateFoldWidgets),this.on("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets)},this.getParentFoldRangeData=function(e,t){var n=this.foldWidgets;if(!n||t&&n[e])return{};var r=e-1,i;while(r>=0){var s=n[r];s==null&&(s=n[r]=this.getFoldWidget(r));if(s=="start"){var o=this.getFoldWidgetRange(r);i||(i=o);if(o&&o.end.row>=e)break}r--}return{range:r!==-1&&o,firstRange:i}},this.onFoldWidgetClick=function(e,t){t=t.domEvent;var n={children:t.shiftKey,all:t.ctrlKey||t.metaKey,siblings:t.altKey},r=this.$toggleFoldWidget(e,n);if(!r){var i=t.target||t.srcElement;i&&/ace_fold-widget/.test(i.className)&&(i.className+=" ace_invalid")}},this.$toggleFoldWidget=function(e,t){if(!this.getFoldWidget)return;var n=this.getFoldWidget(e),r=this.getLine(e),i=n==="end"?-1:1,s=this.getFoldAt(e,i===-1?0:r.length,i);if(s)return t.children||t.all?this.removeFold(s):this.expandFold(s),s;var o=this.getFoldWidgetRange(e,!0);if(o&&!o.isMultiLine()){s=this.getFoldAt(o.start.row,o.start.column,1);if(s&&o.isEqual(s.range))return this.removeFold(s),s}if(t.siblings){var u=this.getParentFoldRangeData(e);if(u.range)var a=u.range.start.row+1,f=u.range.end.row;this.foldAll(a,f,t.all?1e4:0)}else t.children?(f=o?o.end.row:this.getLength(),this.foldAll(e+1,f,t.all?1e4:0)):o&&(t.all&&(o.collapseChildren=1e4),this.addFold("...",o));return o},this.toggleFoldWidget=function(e){var t=this.selection.getCursor().row;t=this.getRowFoldStart(t);var n=this.$toggleFoldWidget(t,{});if(n)return;var r=this.getParentFoldRangeData(t,!0);n=r.range||r.firstRange;if(n){t=n.start.row;var i=this.getFoldAt(t,this.getLine(t).length,1);i?this.removeFold(i):this.addFold("...",n)}},this.updateFoldWidgets=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.foldWidgets[t]=null;else if(e.action=="remove")this.foldWidgets.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.foldWidgets.splice.apply(this.foldWidgets,r)}},this.tokenizerUpdateFoldWidgets=function(e){var t=e.data;t.first!=t.last&&this.foldWidgets.length>t.first&&this.foldWidgets.splice(t.first,this.foldWidgets.length)}}var r=e("../range").Range,i=e("./fold_line").FoldLine,s=e("./fold").Fold,o=e("../token_iterator").TokenIterator;t.Folding=u}),ace.define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"],function(e,t,n){"use strict";function s(){this.findMatchingBracket=function(e,t){if(e.column==0)return null;var n=t||this.getLine(e.row).charAt(e.column-1);if(n=="")return null;var r=n.match(/([\(\[\{])|([\)\]\}])/);return r?r[1]?this.$findClosingBracket(r[1],e):this.$findOpeningBracket(r[2],e):null},this.getBracketRange=function(e){var t=this.getLine(e.row),n=!0,r,s=t.charAt(e.column-1),o=s&&s.match(/([\(\[\{])|([\)\]\}])/);o||(s=t.charAt(e.column),e={row:e.row,column:e.column+1},o=s&&s.match(/([\(\[\{])|([\)\]\}])/),n=!1);if(!o)return null;if(o[1]){var u=this.$findClosingBracket(o[1],e);if(!u)return null;r=i.fromPoints(e,u),n||(r.end.column++,r.start.column--),r.cursor=r.end}else{var u=this.$findOpeningBracket(o[2],e);if(!u)return null;r=i.fromPoints(u,e),n||(r.start.column++,r.end.column--),r.cursor=r.start}return r},this.$brackets={")":"(","(":")","]":"[","[":"]","{":"}","}":"{","<":">",">":"<"},this.$findOpeningBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("rparen",".paren").replace(/\b(?:end)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn()-2,f=u.value;for(;;){while(a>=0){var l=f.charAt(a);if(l==i){s-=1;if(s==0)return{row:o.getCurrentTokenRow(),column:a+o.getCurrentTokenColumn()}}else l==e&&(s+=1);a-=1}do u=o.stepBackward();while(u&&!n.test(u.type));if(u==null)break;f=u.value,a=f.length-1}return null},this.$findClosingBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("lparen",".paren").replace(/\b(?:start|begin)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn();for(;;){var f=u.value,l=f.length;while(a=4352&&e<=4447||e>=4515&&e<=4519||e>=4602&&e<=4607||e>=9001&&e<=9002||e>=11904&&e<=11929||e>=11931&&e<=12019||e>=12032&&e<=12245||e>=12272&&e<=12283||e>=12288&&e<=12350||e>=12353&&e<=12438||e>=12441&&e<=12543||e>=12549&&e<=12589||e>=12593&&e<=12686||e>=12688&&e<=12730||e>=12736&&e<=12771||e>=12784&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=13054||e>=13056&&e<=19903||e>=19968&&e<=42124||e>=42128&&e<=42182||e>=43360&&e<=43388||e>=44032&&e<=55203||e>=55216&&e<=55238||e>=55243&&e<=55291||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=65281&&e<=65376||e>=65504&&e<=65510}r.implement(this,u),this.setDocument=function(e){this.doc&&this.doc.removeListener("change",this.$onChange),this.doc=e,e.on("change",this.$onChange),this.bgTokenizer&&this.bgTokenizer.setDocument(this.getDocument()),this.resetCaches()},this.getDocument=function(){return this.doc},this.$resetRowCache=function(e){if(!e){this.$docRowCache=[],this.$screenRowCache=[];return}var t=this.$docRowCache.length,n=this.$getRowCacheIndex(this.$docRowCache,e)+1;t>n&&(this.$docRowCache.splice(n,t),this.$screenRowCache.splice(n,t))},this.$getRowCacheIndex=function(e,t){var n=0,r=e.length-1;while(n<=r){var i=n+r>>1,s=e[i];if(t>s)n=i+1;else{if(!(t=t)break}return r=n[s],r?(r.index=s,r.start=i-r.value.length,r):null},this.setUndoManager=function(e){this.$undoManager=e,this.$informUndoManager&&this.$informUndoManager.cancel();if(e){var t=this;e.addSession(this),this.$syncInformUndoManager=function(){t.$informUndoManager.cancel(),t.mergeUndoDeltas=!1},this.$informUndoManager=i.delayedCall(this.$syncInformUndoManager)}else this.$syncInformUndoManager=function(){}},this.markUndoGroup=function(){this.$syncInformUndoManager&&this.$syncInformUndoManager()},this.$defaultUndoManager={undo:function(){},redo:function(){},hasUndo:function(){},hasRedo:function(){},reset:function(){},add:function(){},addSelection:function(){},startNewGroup:function(){},addSession:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?i.stringRepeat(" ",this.getTabSize()):" "},this.setUseSoftTabs=function(e){this.setOption("useSoftTabs",e)},this.getUseSoftTabs=function(){return this.$useSoftTabs&&!this.$mode.$indentWithTabs},this.setTabSize=function(e){this.setOption("tabSize",e)},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(e){return this.$useSoftTabs&&e.column%this.$tabSize===0},this.setNavigateWithinSoftTabs=function(e){this.setOption("navigateWithinSoftTabs",e)},this.getNavigateWithinSoftTabs=function(){return this.$navigateWithinSoftTabs},this.$overwrite=!1,this.setOverwrite=function(e){this.setOption("overwrite",e)},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.addGutterDecoration=function(e,t){this.$decorations[e]||(this.$decorations[e]=""),this.$decorations[e]+=" "+t,this._signal("changeBreakpoint",{})},this.removeGutterDecoration=function(e,t){this.$decorations[e]=(this.$decorations[e]||"").replace(" "+t,""),this._signal("changeBreakpoint",{})},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(e){this.$breakpoints=[];for(var t=0;t0&&(r=!!n.charAt(t-1).match(this.tokenRe)),r||(r=!!n.charAt(t).match(this.tokenRe));if(r)var i=this.tokenRe;else if(/^\s+$/.test(n.slice(t-1,t+1)))var i=/\s/;else var i=this.nonTokenRe;var s=t;if(s>0){do s--;while(s>=0&&n.charAt(s).match(i));s++}var o=t;while(oe&&(e=t.screenWidth)}),this.lineWidgetWidth=e},this.$computeWidth=function(e){if(this.$modified||e){this.$modified=!1;if(this.$useWrapMode)return this.screenWidth=this.$wrapLimit;var t=this.doc.getAllLines(),n=this.$rowLengthCache,r=0,i=0,s=this.$foldData[i],o=s?s.start.row:Infinity,u=t.length;for(var a=0;ao){a=s.end.row+1;if(a>=u)break;s=this.$foldData[i++],o=s?s.start.row:Infinity}n[a]==null&&(n[a]=this.$getStringScreenWidth(t[a])[0]),n[a]>r&&(r=n[a])}this.screenWidth=r}},this.getLine=function(e){return this.doc.getLine(e)},this.getLines=function(e,t){return this.doc.getLines(e,t)},this.getLength=function(){return this.doc.getLength()},this.getTextRange=function(e){return this.doc.getTextRange(e||this.selection.getRange())},this.insert=function(e,t){return this.doc.insert(e,t)},this.remove=function(e){return this.doc.remove(e)},this.removeFullLines=function(e,t){return this.doc.removeFullLines(e,t)},this.undoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;for(var n=e.length-1;n!=-1;n--){var r=e[n];r.action=="insert"||r.action=="remove"?this.doc.revertDelta(r):r.folds&&this.addFolds(r.folds)}!t&&this.$undoSelect&&(e.selectionBefore?this.selection.fromJSON(e.selectionBefore):this.selection.setRange(this.$getUndoSelection(e,!0))),this.$fromUndo=!1},this.redoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;for(var n=0;ne.end.column&&(s.start.column+=u),s.end.row==e.end.row&&s.end.column>e.end.column&&(s.end.column+=u)),o&&s.start.row>=e.end.row&&(s.start.row+=o,s.end.row+=o)}s.end=this.insert(s.start,r);if(i.length){var a=e.start,f=s.start,o=f.row-a.row,u=f.column-a.column;this.addFolds(i.map(function(e){return e=e.clone(),e.start.row==a.row&&(e.start.column+=u),e.end.row==a.row&&(e.end.column+=u),e.start.row+=o,e.end.row+=o,e}))}return s},this.indentRows=function(e,t,n){n=n.replace(/\t/g,this.getTabString());for(var r=e;r<=t;r++)this.doc.insertInLine({row:r,column:0},n)},this.outdentRows=function(e){var t=e.collapseRows(),n=new l(0,0,0,0),r=this.getTabSize();for(var i=t.start.row;i<=t.end.row;++i){var s=this.getLine(i);n.start.row=i,n.end.row=i;for(var o=0;o0){var r=this.getRowFoldEnd(t+n);if(r>this.doc.getLength()-1)return 0;var i=r-t}else{e=this.$clipRowToDocument(e),t=this.$clipRowToDocument(t);var i=t-e+1}var s=new l(e,0,t,Number.MAX_VALUE),o=this.getFoldsInRange(s).map(function(e){return e=e.clone(),e.start.row+=i,e.end.row+=i,e}),u=n==0?this.doc.getLines(e,t):this.doc.removeFullLines(e,t);return this.doc.insertFullLines(e+i,u),o.length&&this.addFolds(o),i},this.moveLinesUp=function(e,t){return this.$moveLines(e,t,-1)},this.moveLinesDown=function(e,t){return this.$moveLines(e,t,1)},this.duplicateLines=function(e,t){return this.$moveLines(e,t,0)},this.$clipRowToDocument=function(e){return Math.max(0,Math.min(e,this.doc.getLength()-1))},this.$clipColumnToRow=function(e,t){return t<0?0:Math.min(this.doc.getLine(e).length,t)},this.$clipPositionToDocument=function(e,t){t=Math.max(0,t);if(e<0)e=0,t=0;else{var n=this.doc.getLength();e>=n?(e=n-1,t=this.doc.getLine(n-1).length):t=Math.min(this.doc.getLine(e).length,t)}return{row:e,column:t}},this.$clipRangeToDocument=function(e){e.start.row<0?(e.start.row=0,e.start.column=0):e.start.column=this.$clipColumnToRow(e.start.row,e.start.column);var t=this.doc.getLength()-1;return e.end.row>t?(e.end.row=t,e.end.column=this.doc.getLine(t).length):e.end.column=this.$clipColumnToRow(e.end.row,e.end.column),e},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(e){if(e!=this.$useWrapMode){this.$useWrapMode=e,this.$modified=!0,this.$resetRowCache(0);if(e){var t=this.getLength();this.$wrapData=Array(t),this.$updateWrapData(0,t-1)}this._signal("changeWrapMode")}},this.getUseWrapMode=function(){return this.$useWrapMode},this.setWrapLimitRange=function(e,t){if(this.$wrapLimitRange.min!==e||this.$wrapLimitRange.max!==t)this.$wrapLimitRange={min:e,max:t},this.$modified=!0,this.$bidiHandler.markAsDirty(),this.$useWrapMode&&this._signal("changeWrapMode")},this.adjustWrapLimit=function(e,t){var n=this.$wrapLimitRange;n.max<0&&(n={min:t,max:t});var r=this.$constrainWrapLimit(e,n.min,n.max);return r!=this.$wrapLimit&&r>1?(this.$wrapLimit=r,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._signal("changeWrapLimit")),!0):!1},this.$constrainWrapLimit=function(e,t,n){return t&&(e=Math.max(t,e)),n&&(e=Math.min(n,e)),e},this.getWrapLimit=function(){return this.$wrapLimit},this.setWrapLimit=function(e){this.setWrapLimitRange(e,e)},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(e){var t=this.$useWrapMode,n=e.action,r=e.start,i=e.end,s=r.row,o=i.row,u=o-s,a=null;this.$updating=!0;if(u!=0)if(n==="remove"){this[t?"$wrapData":"$rowLengthCache"].splice(s,u);var f=this.$foldData;a=this.getFoldsInRange(e),this.removeFolds(a);var l=this.getFoldLine(i.row),c=0;if(l){l.addRemoveChars(i.row,i.column,r.column-i.column),l.shiftRow(-u);var h=this.getFoldLine(s);h&&h!==l&&(h.merge(l),l=h),c=f.indexOf(l)+1}for(c;c=i.row&&l.shiftRow(-u)}o=s}else{var p=Array(u);p.unshift(s,0);var d=t?this.$wrapData:this.$rowLengthCache;d.splice.apply(d,p);var f=this.$foldData,l=this.getFoldLine(s),c=0;if(l){var v=l.range.compareInside(r.row,r.column);v==0?(l=l.split(r.row,r.column),l&&(l.shiftRow(u),l.addRemoveChars(o,0,i.column-r.column))):v==-1&&(l.addRemoveChars(s,0,i.column-r.column),l.shiftRow(u)),c=f.indexOf(l)+1}for(c;c=s&&l.shiftRow(u)}}else{u=Math.abs(e.start.column-e.end.column),n==="remove"&&(a=this.getFoldsInRange(e),this.removeFolds(a),u=-u);var l=this.getFoldLine(s);l&&l.addRemoveChars(s,r.column,u)}return t&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),this.$updating=!1,t?this.$updateWrapData(s,o):this.$updateRowLengthCache(s,o),a},this.$updateRowLengthCache=function(e,t,n){this.$rowLengthCache[e]=null,this.$rowLengthCache[t]=null},this.$updateWrapData=function(e,t){var r=this.doc.getAllLines(),i=this.getTabSize(),o=this.$wrapData,u=this.$wrapLimit,a,f,l=e;t=Math.min(t,r.length-1);while(l<=t)f=this.getFoldLine(l,f),f?(a=[],f.walk(function(e,t,i,o){var u;if(e!=null){u=this.$getDisplayTokens(e,a.length),u[0]=n;for(var f=1;fr-b){var w=f+r-b;if(e[w-1]>=c&&e[w]>=c){y(w);continue}if(e[w]==n||e[w]==s){for(w;w!=f-1;w--)if(e[w]==n)break;if(w>f){y(w);continue}w=f+r;for(w;w>2)),f-1);while(w>E&&e[w]E&&e[w]E&&e[w]==a)w--}else while(w>E&&e[w]E){y(++w);continue}w=f+r,e[w]==t&&w--,y(w-b)}return o},this.$getDisplayTokens=function(n,r){var i=[],s;r=r||0;for(var o=0;o39&&u<48||u>57&&u<64?i.push(a):u>=4352&&m(u)?i.push(e,t):i.push(e)}return i},this.$getStringScreenWidth=function(e,t,n){if(t==0)return[0,0];t==null&&(t=Infinity),n=n||0;var r,i;for(i=0;i=4352&&m(r)?n+=2:n+=1;if(n>t)break}return[n,i]},this.lineWidgets=null,this.getRowLength=function(e){if(this.lineWidgets)var t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0;else t=0;return!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.getRowLineCount=function(e){return!this.$useWrapMode||!this.$wrapData[e]?1:this.$wrapData[e].length+1},this.getRowWrapIndent=function(e){if(this.$useWrapMode){var t=this.screenToDocumentPosition(e,Number.MAX_VALUE),n=this.$wrapData[t.row];return n.length&&n[0]=0)var u=f[l],i=this.$docRowCache[l],h=e>f[c-1];else var h=!c;var p=this.getLength()-1,d=this.getNextFoldLine(i),v=d?d.start.row:Infinity;while(u<=e){a=this.getRowLength(i);if(u+a>e||i>=p)break;u+=a,i++,i>v&&(i=d.end.row+1,d=this.getNextFoldLine(i,d),v=d?d.start.row:Infinity),h&&(this.$docRowCache.push(i),this.$screenRowCache.push(u))}if(d&&d.start.row<=i)r=this.getFoldDisplayLine(d),i=d.start.row;else{if(u+a<=e||i>p)return{row:p,column:this.getLine(p).length};r=this.getLine(i),d=null}var m=0,g=Math.floor(e-u);if(this.$useWrapMode){var y=this.$wrapData[i];y&&(o=y[g],g>0&&y.length&&(m=y.indent,s=y[g-1]||y[y.length-1],r=r.substring(s)))}return n!==undefined&&this.$bidiHandler.isBidiRow(u+g,i,g)&&(t=this.$bidiHandler.offsetToCol(n)),s+=this.$getStringScreenWidth(r,t-m)[1],this.$useWrapMode&&s>=o&&(s=o-1),d?d.idxToPosition(s):{row:i,column:s}},this.documentToScreenPosition=function(e,t){if(typeof t=="undefined")var n=this.$clipPositionToDocument(e.row,e.column);else n=this.$clipPositionToDocument(e,t);e=n.row,t=n.column;var r=0,i=null,s=null;s=this.getFoldAt(e,t,1),s&&(e=s.start.row,t=s.start.column);var o,u=0,a=this.$docRowCache,f=this.$getRowCacheIndex(a,e),l=a.length;if(l&&f>=0)var u=a[f],r=this.$screenRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getNextFoldLine(u),p=h?h.start.row:Infinity;while(u=p){o=h.end.row+1;if(o>e)break;h=this.getNextFoldLine(o,h),p=h?h.start.row:Infinity}else o=u+1;r+=this.getRowLength(u),u=o,c&&(this.$docRowCache.push(u),this.$screenRowCache.push(r))}var d="";h&&u>=p?(d=this.getFoldDisplayLine(h,e,t),i=h.start.row):(d=this.getLine(e).substring(0,t),i=e);var v=0;if(this.$useWrapMode){var m=this.$wrapData[i];if(m){var g=0;while(d.length>=m[g])r++,g++;d=d.substring(m[g-1]||0,d.length),v=g>0?m.indent:0}}return{row:r,column:v+this.$getStringScreenWidth(d)[0]}},this.documentToScreenColumn=function(e,t){return this.documentToScreenPosition(e,t).column},this.documentToScreenRow=function(e,t){return this.documentToScreenPosition(e,t).row},this.getScreenLength=function(){var e=0,t=null;if(!this.$useWrapMode){e=this.getLength();var n=this.$foldData;for(var r=0;ro&&(s=t.end.row+1,t=this.$foldData[r++],o=t?t.start.row:Infinity)}}return this.lineWidgets&&(e+=this.$getWidgetScreenLength()),e},this.$setFontMetrics=function(e){if(!this.$enableVarChar)return;this.$getStringScreenWidth=function(t,n,r){if(n===0)return[0,0];n||(n=Infinity),r=r||0;var i,s;for(s=0;sn)break}return[r,s]}},this.destroy=function(){this.bgTokenizer&&(this.bgTokenizer.setDocument(null),this.bgTokenizer=null),this.$stopWorker()},this.isFullWidth=m}.call(d.prototype),e("./edit_session/folding").Folding.call(d.prototype),e("./edit_session/bracket_match").BracketMatch.call(d.prototype),o.defineOptions(d.prototype,"session",{wrap:{set:function(e){!e||e=="off"?e=!1:e=="free"?e=!0:e=="printMargin"?e=-1:typeof e=="string"&&(e=parseInt(e,10)||!1);if(this.$wrap==e)return;this.$wrap=e;if(!e)this.setUseWrapMode(!1);else{var t=typeof e=="number"?e:null;this.setWrapLimitRange(t,t),this.setUseWrapMode(!0)}},get:function(){return this.getUseWrapMode()?this.$wrap==-1?"printMargin":this.getWrapLimitRange().min?this.$wrap:"free":"off"},handlesSet:!0},wrapMethod:{set:function(e){e=e=="auto"?this.$mode.type!="text":e!="text",e!=this.$wrapAsCode&&(this.$wrapAsCode=e,this.$useWrapMode&&(this.$useWrapMode=!1,this.setUseWrapMode(!0)))},initialValue:"auto"},indentedSoftWrap:{set:function(){this.$useWrapMode&&(this.$useWrapMode=!1,this.setUseWrapMode(!0))},initialValue:!0},firstLineNumber:{set:function(){this._signal("changeBreakpoint")},initialValue:1},useWorker:{set:function(e){this.$useWorker=e,this.$stopWorker(),e&&this.$startWorker()},initialValue:!0},useSoftTabs:{initialValue:!0},tabSize:{set:function(e){e=parseInt(e),e>0&&this.$tabSize!==e&&(this.$modified=!0,this.$rowLengthCache=[],this.$tabSize=e,this._signal("changeTabSize"))},initialValue:4,handlesSet:!0},navigateWithinSoftTabs:{initialValue:!1},foldStyle:{set:function(e){this.setFoldStyle(e)},handlesSet:!0},overwrite:{set:function(e){this._signal("changeOverwrite")},initialValue:!1},newLineMode:{set:function(e){this.doc.setNewLineMode(e)},get:function(){return this.doc.getNewLineMode()},handlesSet:!0},mode:{set:function(e){this.setMode(e)},get:function(){return this.$modeId},handlesSet:!0}}),t.EditSession=d}),ace.define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";function u(e,t){function n(e){return/\w/.test(e)||t.regExp?"\\b":""}return n(e[0])+e+n(e[e.length-1])}var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(){this.$options={}};(function(){this.set=function(e){return i.mixin(this.$options,e),this},this.getOptions=function(){return r.copyObject(this.$options)},this.setOptions=function(e){this.$options=e},this.find=function(e){var t=this.$options,n=this.$matchIterator(e,t);if(!n)return!1;var r=null;return n.forEach(function(e,n,i,o){return r=new s(e,n,i,o),n==o&&t.start&&t.start.start&&t.skipCurrent!=0&&r.isEqual(t.start)?(r=null,!1):!0}),r},this.findAll=function(e){var t=this.$options;if(!t.needle)return[];this.$assembleRegExp(t);var n=t.range,i=n?e.getLines(n.start.row,n.end.row):e.doc.getAllLines(),o=[],u=t.re;if(t.$isMultiLine){var a=u.length,f=i.length-a,l;e:for(var c=u.offset||0;c<=f;c++){for(var h=0;hv)continue;o.push(l=new s(c,v,c+a-1,m)),a>2&&(c=c+a-2)}}else for(var g=0;gE&&o[h].end.row==n.end.row)h--;o=o.slice(g,h+1);for(g=0,h=o.length;g=u;n--)if(c(n,Number.MAX_VALUE,e))return;if(t.wrap==0)return;for(n=a,u=o.row;n>=u;n--)if(c(n,Number.MAX_VALUE,e))return};else var f=function(e){var n=o.row;if(c(n,o.column,e))return;for(n+=1;n<=a;n++)if(c(n,0,e))return;if(t.wrap==0)return;for(n=u,a=o.row;n<=a;n++)if(c(n,0,e))return};if(t.$isMultiLine)var l=n.length,c=function(t,i,s){var o=r?t-l+1:t;if(o<0)return;var u=e.getLine(o),a=u.search(n[0]);if(!r&&ai)return;if(s(o,a,o+l-1,c))return!0};else if(r)var c=function(t,r,i){var s=e.getLine(t),o=[],u,a=0;n.lastIndex=0;while(u=n.exec(s)){var f=u[0].length;a=u.index;if(!f){if(a>=s.length)break;n.lastIndex=a+=1}if(u.index+f>r)break;o.push(u.index,f)}for(var l=o.length-1;l>=0;l-=2){var c=o[l-1],f=o[l];if(i(t,c,t,c+f))return!0}};else var c=function(t,r,i){var s=e.getLine(t),o,u;n.lastIndex=r;while(u=n.exec(s)){var a=u[0].length;o=u.index;if(i(t,o,t,o+a))return!0;if(!a){n.lastIndex=o+=1;if(o>=s.length)return!1}}};return{forEach:f}}}).call(o.prototype),t.Search=o}),ace.define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function o(e,t){this.platform=t||(i.isMac?"mac":"win"),this.commands={},this.commandKeyBinding={},this.addCommands(e),this.$singleCommand=!0}function u(e,t){o.call(this,e,t),this.$singleCommand=!1}var r=e("../lib/keys"),i=e("../lib/useragent"),s=r.KEY_MODS;u.prototype=o.prototype,function(){function e(e){return typeof e=="object"&&e.bindKey&&e.bindKey.position||(e.isDefault?-100:0)}this.addCommand=function(e){this.commands[e.name]&&this.removeCommand(e),this.commands[e.name]=e,e.bindKey&&this._buildKeyHash(e)},this.removeCommand=function(e,t){var n=e&&(typeof e=="string"?e:e.name);e=this.commands[n],t||delete this.commands[n];var r=this.commandKeyBinding;for(var i in r){var s=r[i];if(s==e)delete r[i];else if(Array.isArray(s)){var o=s.indexOf(e);o!=-1&&(s.splice(o,1),s.length==1&&(r[i]=s[0]))}}},this.bindKey=function(e,t,n){typeof e=="object"&&e&&(n==undefined&&(n=e.position),e=e[this.platform]);if(!e)return;if(typeof t=="function")return this.addCommand({exec:t,bindKey:e,name:t.name||e});e.split("|").forEach(function(e){var r="";if(e.indexOf(" ")!=-1){var i=e.split(/\s+/);e=i.pop(),i.forEach(function(e){var t=this.parseKeys(e),n=s[t.hashId]+t.key;r+=(r?" ":"")+n,this._addCommandToBinding(r,"chainKeys")},this),r+=" "}var o=this.parseKeys(e),u=s[o.hashId]+o.key;this._addCommandToBinding(r+u,t,n)},this)},this._addCommandToBinding=function(t,n,r){var i=this.commandKeyBinding,s;if(!n)delete i[t];else if(!i[t]||this.$singleCommand)i[t]=n;else{Array.isArray(i[t])?(s=i[t].indexOf(n))!=-1&&i[t].splice(s,1):i[t]=[i[t]],typeof r!="number"&&(r=e(n));var o=i[t];for(s=0;sr)break}o.splice(s,0,n)}},this.addCommands=function(e){e&&Object.keys(e).forEach(function(t){var n=e[t];if(!n)return;if(typeof n=="string")return this.bindKey(n,t);typeof n=="function"&&(n={exec:n});if(typeof n!="object")return;n.name||(n.name=t),this.addCommand(n)},this)},this.removeCommands=function(e){Object.keys(e).forEach(function(t){this.removeCommand(e[t])},this)},this.bindKeys=function(e){Object.keys(e).forEach(function(t){this.bindKey(t,e[t])},this)},this._buildKeyHash=function(e){this.bindKey(e.bindKey,e)},this.parseKeys=function(e){var t=e.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(e){return e}),n=t.pop(),i=r[n];if(r.FUNCTION_KEYS[i])n=r.FUNCTION_KEYS[i].toLowerCase();else{if(!t.length)return{key:n,hashId:-1};if(t.length==1&&t[0]=="shift")return{key:n.toUpperCase(),hashId:-1}}var s=0;for(var o=t.length;o--;){var u=r.KEY_MODS[t[o]];if(u==null)return typeof console!="undefined"&&console.error("invalid modifier "+t[o]+" in "+e),!1;s|=u}return{key:n,hashId:s}},this.findKeyCommand=function(t,n){var r=s[t]+n;return this.commandKeyBinding[r]},this.handleKeyboard=function(e,t,n,r){if(r<0)return;var i=s[t]+n,o=this.commandKeyBinding[i];e.$keyChain&&(e.$keyChain+=" "+i,o=this.commandKeyBinding[e.$keyChain]||o);if(o)if(o=="chainKeys"||o[o.length-1]=="chainKeys")return e.$keyChain=e.$keyChain||i,{command:"null"};if(e.$keyChain)if(!!t&&t!=4||n.length!=1){if(t==-1||r>0)e.$keyChain=""}else e.$keyChain=e.$keyChain.slice(0,-i.length-1);return{command:o}},this.getStatusText=function(e,t){return t.$keyChain||""}}.call(o.prototype),t.HashHandler=o,t.MultiHashHandler=u}),ace.define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../keyboard/hash_handler").MultiHashHandler,s=e("../lib/event_emitter").EventEmitter,o=function(e,t){i.call(this,t,e),this.byName=this.commands,this.setDefaultHandler("exec",function(e){return e.command.exec(e.editor,e.args||{})})};r.inherits(o,i),function(){r.implement(this,s),this.exec=function(e,t,n){if(Array.isArray(e)){for(var r=e.length;r--;)if(this.exec(e[r],t,n))return!0;return!1}typeof e=="string"&&(e=this.commands[e]);if(!e)return!1;if(t&&t.$readOnly&&!e.readOnly)return!1;if(this.$checkCommandState!=0&&e.isAvailable&&!e.isAvailable(t))return!1;var i={editor:t,command:e,args:n};return i.returnValue=this._emit("exec",i),this._signal("afterExec",i),i.returnValue===!1?!1:!0},this.toggleRecording=function(e){if(this.$inReplay)return;return e&&e._emit("changeStatus"),this.recording?(this.macro.pop(),this.removeEventListener("exec",this.$addCommandToMacro),this.macro.length||(this.macro=this.oldMacro),this.recording=!1):(this.$addCommandToMacro||(this.$addCommandToMacro=function(e){this.macro.push([e.command,e.args])}.bind(this)),this.oldMacro=this.macro,this.macro=[],this.on("exec",this.$addCommandToMacro),this.recording=!0)},this.replay=function(e){if(this.$inReplay||!this.macro)return;if(this.recording)return this.toggleRecording(e);try{this.$inReplay=!0,this.macro.forEach(function(t){typeof t=="string"?this.exec(t,e):this.exec(t[0],e,t[1])},this)}finally{this.$inReplay=!1}},this.trimMacro=function(e){return e.map(function(e){return typeof e[0]!="string"&&(e[0]=e[0].name),e[1]||(e=e[0]),e})}}.call(o.prototype),t.CommandManager=o}),ace.define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"],function(e,t,n){"use strict";function o(e,t){return{win:e,mac:t}}var r=e("../lib/lang"),i=e("../config"),s=e("../range").Range;t.commands=[{name:"showSettingsMenu",bindKey:o("Ctrl-,","Command-,"),exec:function(e){i.loadModule("ace/ext/settings_menu",function(t){t.init(e),e.showSettingsMenu()})},readOnly:!0},{name:"goToNextError",bindKey:o("Alt-E","F4"),exec:function(e){i.loadModule("./ext/error_marker",function(t){t.showErrorMarker(e,1)})},scrollIntoView:"animate",readOnly:!0},{name:"goToPreviousError",bindKey:o("Alt-Shift-E","Shift-F4"),exec:function(e){i.loadModule("./ext/error_marker",function(t){t.showErrorMarker(e,-1)})},scrollIntoView:"animate",readOnly:!0},{name:"selectall",description:"Select all",bindKey:o("Ctrl-A","Command-A"),exec:function(e){e.selectAll()},readOnly:!0},{name:"centerselection",description:"Center selection",bindKey:o(null,"Ctrl-L"),exec:function(e){e.centerSelection()},readOnly:!0},{name:"gotoline",description:"Go to line...",bindKey:o("Ctrl-L","Command-L"),exec:function(e,t){typeof t=="number"&&!isNaN(t)&&e.gotoLine(t),e.prompt({$type:"gotoLine"})},readOnly:!0},{name:"fold",bindKey:o("Alt-L|Ctrl-F1","Command-Alt-L|Command-F1"),exec:function(e){e.session.toggleFold(!1)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"unfold",bindKey:o("Alt-Shift-L|Ctrl-Shift-F1","Command-Alt-Shift-L|Command-Shift-F1"),exec:function(e){e.session.toggleFold(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleFoldWidget",bindKey:o("F2","F2"),exec:function(e){e.session.toggleFoldWidget()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleParentFoldWidget",bindKey:o("Alt-F2","Alt-F2"),exec:function(e){e.session.toggleFoldWidget(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"foldall",description:"Fold all",bindKey:o(null,"Ctrl-Command-Option-0"),exec:function(e){e.session.foldAll()},scrollIntoView:"center",readOnly:!0},{name:"foldOther",description:"Fold other",bindKey:o("Alt-0","Command-Option-0"),exec:function(e){e.session.foldAll(),e.session.unfold(e.selection.getAllRanges())},scrollIntoView:"center",readOnly:!0},{name:"unfoldall",description:"Unfold all",bindKey:o("Alt-Shift-0","Command-Option-Shift-0"),exec:function(e){e.session.unfold()},scrollIntoView:"center",readOnly:!0},{name:"findnext",description:"Find next",bindKey:o("Ctrl-K","Command-G"),exec:function(e){e.findNext()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"findprevious",description:"Find previous",bindKey:o("Ctrl-Shift-K","Command-Shift-G"),exec:function(e){e.findPrevious()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"selectOrFindNext",description:"Select or find next",bindKey:o("Alt-K","Ctrl-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findNext()},readOnly:!0},{name:"selectOrFindPrevious",description:"Select or find previous",bindKey:o("Alt-Shift-K","Ctrl-Shift-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findPrevious()},readOnly:!0},{name:"find",description:"Find",bindKey:o("Ctrl-F","Command-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e)})},readOnly:!0},{name:"overwrite",description:"Overwrite",bindKey:"Insert",exec:function(e){e.toggleOverwrite()},readOnly:!0},{name:"selecttostart",description:"Select to start",bindKey:o("Ctrl-Shift-Home","Command-Shift-Home|Command-Shift-Up"),exec:function(e){e.getSelection().selectFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotostart",description:"Go to start",bindKey:o("Ctrl-Home","Command-Home|Command-Up"),exec:function(e){e.navigateFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectup",description:"Select up",bindKey:o("Shift-Up","Shift-Up|Ctrl-Shift-P"),exec:function(e){e.getSelection().selectUp()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golineup",description:"Go line up",bindKey:o("Up","Up|Ctrl-P"),exec:function(e,t){e.navigateUp(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttoend",description:"Select to end",bindKey:o("Ctrl-Shift-End","Command-Shift-End|Command-Shift-Down"),exec:function(e){e.getSelection().selectFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotoend",description:"Go to end",bindKey:o("Ctrl-End","Command-End|Command-Down"),exec:function(e){e.navigateFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectdown",description:"Select down",bindKey:o("Shift-Down","Shift-Down|Ctrl-Shift-N"),exec:function(e){e.getSelection().selectDown()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golinedown",description:"Go line down",bindKey:o("Down","Down|Ctrl-N"),exec:function(e,t){e.navigateDown(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordleft",description:"Select word left",bindKey:o("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(e){e.getSelection().selectWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordleft",description:"Go to word left",bindKey:o("Ctrl-Left","Option-Left"),exec:function(e){e.navigateWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolinestart",description:"Select to line start",bindKey:o("Alt-Shift-Left","Command-Shift-Left|Ctrl-Shift-A"),exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolinestart",description:"Go to line start",bindKey:o("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(e){e.navigateLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectleft",description:"Select left",bindKey:o("Shift-Left","Shift-Left|Ctrl-Shift-B"),exec:function(e){e.getSelection().selectLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoleft",description:"Go to left",bindKey:o("Left","Left|Ctrl-B"),exec:function(e,t){e.navigateLeft(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordright",description:"Select word right",bindKey:o("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(e){e.getSelection().selectWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordright",description:"Go to word right",bindKey:o("Ctrl-Right","Option-Right"),exec:function(e){e.navigateWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolineend",description:"Select to line end",bindKey:o("Alt-Shift-Right","Command-Shift-Right|Shift-End|Ctrl-Shift-E"),exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolineend",description:"Go to line end",bindKey:o("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(e){e.navigateLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectright",description:"Select right",bindKey:o("Shift-Right","Shift-Right"),exec:function(e){e.getSelection().selectRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoright",description:"Go to right",bindKey:o("Right","Right|Ctrl-F"),exec:function(e,t){e.navigateRight(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectpagedown",description:"Select page down",bindKey:"Shift-PageDown",exec:function(e){e.selectPageDown()},readOnly:!0},{name:"pagedown",description:"Page down",bindKey:o(null,"Option-PageDown"),exec:function(e){e.scrollPageDown()},readOnly:!0},{name:"gotopagedown",description:"Go to page down",bindKey:o("PageDown","PageDown|Ctrl-V"),exec:function(e){e.gotoPageDown()},readOnly:!0},{name:"selectpageup",description:"Select page up",bindKey:"Shift-PageUp",exec:function(e){e.selectPageUp()},readOnly:!0},{name:"pageup",description:"Page up",bindKey:o(null,"Option-PageUp"),exec:function(e){e.scrollPageUp()},readOnly:!0},{name:"gotopageup",description:"Go to page up",bindKey:"PageUp",exec:function(e){e.gotoPageUp()},readOnly:!0},{name:"scrollup",description:"Scroll up",bindKey:o("Ctrl-Up",null),exec:function(e){e.renderer.scrollBy(0,-2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"scrolldown",description:"Scroll down",bindKey:o("Ctrl-Down",null),exec:function(e){e.renderer.scrollBy(0,2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"selectlinestart",description:"Select line start",bindKey:"Shift-Home",exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectlineend",description:"Select line end",bindKey:"Shift-End",exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"togglerecording",description:"Toggle recording",bindKey:o("Ctrl-Alt-E","Command-Option-E"),exec:function(e){e.commands.toggleRecording(e)},readOnly:!0},{name:"replaymacro",description:"Replay macro",bindKey:o("Ctrl-Shift-E","Command-Shift-E"),exec:function(e){e.commands.replay(e)},readOnly:!0},{name:"jumptomatching",description:"Jump to matching",bindKey:o("Ctrl-\\|Ctrl-P","Command-\\"),exec:function(e){e.jumpToMatching()},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"selecttomatching",description:"Select to matching",bindKey:o("Ctrl-Shift-\\|Ctrl-Shift-P","Command-Shift-\\"),exec:function(e){e.jumpToMatching(!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"expandToMatching",description:"Expand to matching",bindKey:o("Ctrl-Shift-M","Ctrl-Shift-M"),exec:function(e){e.jumpToMatching(!0,!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"passKeysToBrowser",description:"Pass keys to browser",bindKey:o(null,null),exec:function(){},passEvent:!0,readOnly:!0},{name:"copy",description:"Copy",exec:function(e){},readOnly:!0},{name:"cut",description:"Cut",exec:function(e){var t=e.$copyWithEmptySelection&&e.selection.isEmpty(),n=t?e.selection.getLineRange():e.selection.getRange();e._emit("cut",n),n.isEmpty()||e.session.remove(n),e.clearSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"paste",description:"Paste",exec:function(e,t){e.$handlePaste(t)},scrollIntoView:"cursor"},{name:"removeline",description:"Remove line",bindKey:o("Ctrl-D","Command-D"),exec:function(e){e.removeLines()},scrollIntoView:"cursor",multiSelectAction:"forEachLine"},{name:"duplicateSelection",description:"Duplicate selection",bindKey:o("Ctrl-Shift-D","Command-Shift-D"),exec:function(e){e.duplicateSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"sortlines",description:"Sort lines",bindKey:o("Ctrl-Alt-S","Command-Alt-S"),exec:function(e){e.sortLines()},scrollIntoView:"selection",multiSelectAction:"forEachLine"},{name:"togglecomment",description:"Toggle comment",bindKey:o("Ctrl-/","Command-/"),exec:function(e){e.toggleCommentLines()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"toggleBlockComment",description:"Toggle block comment",bindKey:o("Ctrl-Shift-/","Command-Shift-/"),exec:function(e){e.toggleBlockComment()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"modifyNumberUp",description:"Modify number up",bindKey:o("Ctrl-Shift-Up","Alt-Shift-Up"),exec:function(e){e.modifyNumber(1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"modifyNumberDown",description:"Modify number down",bindKey:o("Ctrl-Shift-Down","Alt-Shift-Down"),exec:function(e){e.modifyNumber(-1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"replace",description:"Replace",bindKey:o("Ctrl-H","Command-Option-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e,!0)})}},{name:"undo",description:"Undo",bindKey:o("Ctrl-Z","Command-Z"),exec:function(e){e.undo()}},{name:"redo",description:"Redo",bindKey:o("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(e){e.redo()}},{name:"copylinesup",description:"Copy lines up",bindKey:o("Alt-Shift-Up","Command-Option-Up"),exec:function(e){e.copyLinesUp()},scrollIntoView:"cursor"},{name:"movelinesup",description:"Move lines up",bindKey:o("Alt-Up","Option-Up"),exec:function(e){e.moveLinesUp()},scrollIntoView:"cursor"},{name:"copylinesdown",description:"Copy lines down",bindKey:o("Alt-Shift-Down","Command-Option-Down"),exec:function(e){e.copyLinesDown()},scrollIntoView:"cursor"},{name:"movelinesdown",description:"Move lines down",bindKey:o("Alt-Down","Option-Down"),exec:function(e){e.moveLinesDown()},scrollIntoView:"cursor"},{name:"del",description:"Delete",bindKey:o("Delete","Delete|Ctrl-D|Shift-Delete"),exec:function(e){e.remove("right")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"backspace",description:"Backspace",bindKey:o("Shift-Backspace|Backspace","Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(e){e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"cut_or_delete",description:"Cut or delete",bindKey:o("Shift-Delete",null),exec:function(e){if(!e.selection.isEmpty())return!1;e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestart",description:"Remove to line start",bindKey:o("Alt-Backspace","Command-Backspace"),exec:function(e){e.removeToLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineend",description:"Remove to line end",bindKey:o("Alt-Delete","Ctrl-K|Command-Delete"),exec:function(e){e.removeToLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestarthard",description:"Remove to line start hard",bindKey:o("Ctrl-Shift-Backspace",null),exec:function(e){var t=e.selection.getRange();t.start.column=0,e.session.remove(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineendhard",description:"Remove to line end hard",bindKey:o("Ctrl-Shift-Delete",null),exec:function(e){var t=e.selection.getRange();t.end.column=Number.MAX_VALUE,e.session.remove(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordleft",description:"Remove word left",bindKey:o("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(e){e.removeWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordright",description:"Remove word right",bindKey:o("Ctrl-Delete","Alt-Delete"),exec:function(e){e.removeWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"outdent",description:"Outdent",bindKey:o("Shift-Tab","Shift-Tab"),exec:function(e){e.blockOutdent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"indent",description:"Indent",bindKey:o("Tab","Tab"),exec:function(e){e.indent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"blockoutdent",description:"Block outdent",bindKey:o("Ctrl-[","Ctrl-["),exec:function(e){e.blockOutdent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"blockindent",description:"Block indent",bindKey:o("Ctrl-]","Ctrl-]"),exec:function(e){e.blockIndent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"insertstring",description:"Insert string",exec:function(e,t){e.insert(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"inserttext",description:"Insert text",exec:function(e,t){e.insert(r.stringRepeat(t.text||"",t.times||1))},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"splitline",description:"Split line",bindKey:o(null,"Ctrl-O"),exec:function(e){e.splitLine()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"transposeletters",description:"Transpose letters",bindKey:o("Alt-Shift-X","Ctrl-T"),exec:function(e){e.transposeLetters()},multiSelectAction:function(e){e.transposeSelections(1)},scrollIntoView:"cursor"},{name:"touppercase",description:"To uppercase",bindKey:o("Ctrl-U","Ctrl-U"),exec:function(e){e.toUpperCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"tolowercase",description:"To lowercase",bindKey:o("Ctrl-Shift-U","Ctrl-Shift-U"),exec:function(e){e.toLowerCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"expandtoline",description:"Expand to line",bindKey:o("Ctrl-Shift-L","Command-Shift-L"),exec:function(e){var t=e.selection.getRange();t.start.column=t.end.column=0,t.end.row++,e.selection.setRange(t,!1)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"joinlines",description:"Join lines",bindKey:o(null,null),exec:function(e){var t=e.selection.isBackwards(),n=t?e.selection.getSelectionLead():e.selection.getSelectionAnchor(),i=t?e.selection.getSelectionAnchor():e.selection.getSelectionLead(),o=e.session.doc.getLine(n.row).length,u=e.session.doc.getTextRange(e.selection.getRange()),a=u.replace(/\n\s*/," ").length,f=e.session.doc.getLine(n.row);for(var l=n.row+1;l<=i.row+1;l++){var c=r.stringTrimLeft(r.stringTrimRight(e.session.doc.getLine(l)));c.length!==0&&(c=" "+c),f+=c}i.row+10?(e.selection.moveCursorTo(n.row,n.column),e.selection.selectTo(n.row,n.column+a)):(o=e.session.doc.getLine(n.row).length>o?o+1:o,e.selection.moveCursorTo(n.row,o))},multiSelectAction:"forEach",readOnly:!0},{name:"invertSelection",description:"Invert selection",bindKey:o(null,null),exec:function(e){var t=e.session.doc.getLength()-1,n=e.session.doc.getLine(t).length,r=e.selection.rangeList.ranges,i=[];r.length<1&&(r=[e.selection.getRange()]);for(var o=0;o=i.lastRow||r.end.row<=i.firstRow)&&this.renderer.scrollSelectionIntoView(this.selection.anchor,this.selection.lead);break;default:}n=="animate"&&this.renderer.animateScrolling(this.curOp.scrollTop)}var s=this.selection.toJSON();this.curOp.selectionAfter=s,this.$lastSel=this.selection.toJSON(),this.session.getUndoManager().addSelection(s),this.prevOp=this.curOp,this.curOp=null}},this.$mergeableCommands=["backspace","del","insertstring"],this.$historyTracker=function(e){if(!this.$mergeUndoDeltas)return;var t=this.prevOp,n=this.$mergeableCommands,r=t.command&&e.command.name==t.command.name;if(e.command.name=="insertstring"){var i=e.args;this.mergeNextCommand===undefined&&(this.mergeNextCommand=!0),r=r&&this.mergeNextCommand&&(!/\s/.test(i)||/\s/.test(t.args)),this.mergeNextCommand=!0}else r=r&&n.indexOf(e.command.name)!==-1;this.$mergeUndoDeltas!="always"&&Date.now()-this.sequenceStartTime>2e3&&(r=!1),r?this.session.mergeUndoDeltas=!0:n.indexOf(e.command.name)!==-1&&(this.sequenceStartTime=Date.now())},this.setKeyboardHandler=function(e,t){if(e&&typeof e=="string"&&e!="ace"){this.$keybindingId=e;var n=this;g.loadModule(["keybinding",e],function(r){n.$keybindingId==e&&n.keyBinding.setKeyboardHandler(r&&r.handler),t&&t()})}else this.$keybindingId=null,this.keyBinding.setKeyboardHandler(e),t&&t()},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(e){if(this.session==e)return;this.curOp&&this.endOperation(),this.curOp={};var t=this.session;if(t){this.session.off("change",this.$onDocumentChange),this.session.off("changeMode",this.$onChangeMode),this.session.off("tokenizerUpdate",this.$onTokenizerUpdate),this.session.off("changeTabSize",this.$onChangeTabSize),this.session.off("changeWrapLimit",this.$onChangeWrapLimit),this.session.off("changeWrapMode",this.$onChangeWrapMode),this.session.off("changeFold",this.$onChangeFold),this.session.off("changeFrontMarker",this.$onChangeFrontMarker),this.session.off("changeBackMarker",this.$onChangeBackMarker),this.session.off("changeBreakpoint",this.$onChangeBreakpoint),this.session.off("changeAnnotation",this.$onChangeAnnotation),this.session.off("changeOverwrite",this.$onCursorChange),this.session.off("changeScrollTop",this.$onScrollTopChange),this.session.off("changeScrollLeft",this.$onScrollLeftChange);var n=this.session.getSelection();n.off("changeCursor",this.$onCursorChange),n.off("changeSelection",this.$onSelectionChange)}this.session=e,e?(this.$onDocumentChange=this.onDocumentChange.bind(this),e.on("change",this.$onDocumentChange),this.renderer.setSession(e),this.$onChangeMode=this.onChangeMode.bind(this),e.on("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),e.on("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.onChangeTabSize.bind(this.renderer),e.on("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),e.on("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),e.on("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),e.on("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.on("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.on("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.on("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.on("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.on("changeOverwrite",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.on("changeScrollTop",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.on("changeScrollLeft",this.$onScrollLeftChange),this.selection=e.getSelection(),this.selection.on("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.on("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.onCursorChange(),this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.updateFull()):(this.selection=null,this.renderer.setSession(e)),this._signal("changeSession",{session:e,oldSession:t}),this.curOp=null,t&&t._signal("changeEditor",{oldEditor:this}),e&&e._signal("changeEditor",{editor:this}),e&&e.bgTokenizer&&e.bgTokenizer.scheduleStart()},this.getSession=function(){return this.session},this.setValue=function(e,t){return this.session.doc.setValue(e),t?t==1?this.navigateFileEnd():t==-1&&this.navigateFileStart():this.selectAll(),e},this.getValue=function(){return this.session.getValue()},this.getSelection=function(){return this.selection},this.resize=function(e){this.renderer.onResize(e)},this.setTheme=function(e,t){this.renderer.setTheme(e,t)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(e){this.renderer.setStyle(e)},this.unsetStyle=function(e){this.renderer.unsetStyle(e)},this.getFontSize=function(){return this.getOption("fontSize")||i.computedStyle(this.container).fontSize},this.setFontSize=function(e){this.setOption("fontSize",e)},this.$highlightBrackets=function(){this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null);if(this.$highlightPending)return;var e=this;this.$highlightPending=!0,setTimeout(function(){e.$highlightPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=t.findMatchingBracket(e.getCursorPosition());if(n)var r=new p(n.row,n.column,n.row,n.column+1);else if(t.$mode.getMatching)var r=t.$mode.getMatching(e.session);r&&(t.$bracketHighlight=t.addMarker(r,"ace_bracket","text"))},50)},this.$highlightTags=function(){if(this.$highlightTagPending)return;var e=this;this.$highlightTagPending=!0,setTimeout(function(){e.$highlightTagPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=e.getCursorPosition(),r=new y(e.session,n.row,n.column),i=r.getCurrentToken();if(!i||!/\b(?:tag-open|tag-name)/.test(i.type)){t.removeMarker(t.$tagHighlight),t.$tagHighlight=null;return}if(i.type.indexOf("tag-open")!=-1){i=r.stepForward();if(!i)return}var s=i.value,o=0,u=r.stepBackward();if(u.value=="<"){do u=i,i=r.stepForward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value==="=0)}else{do i=u,u=r.stepBackward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value==="1)&&(t=!1)}if(e.$highlightLineMarker&&!t)e.removeMarker(e.$highlightLineMarker.id),e.$highlightLineMarker=null;else if(!e.$highlightLineMarker&&t){var n=new p(t.row,t.column,t.row,Infinity);n.id=e.addMarker(n,"ace_active-line","screenLine"),e.$highlightLineMarker=n}else t&&(e.$highlightLineMarker.start.row=t.row,e.$highlightLineMarker.end.row=t.row,e.$highlightLineMarker.start.column=t.column,e._signal("changeBackMarker"))},this.onSelectionChange=function(e){var t=this.session;t.$selectionMarker&&t.removeMarker(t.$selectionMarker),t.$selectionMarker=null;if(!this.selection.isEmpty()){var n=this.selection.getRange(),r=this.getSelectionStyle();t.$selectionMarker=t.addMarker(n,"ace_selection",r)}else this.$updateHighlightActiveLine();var i=this.$highlightSelectedWord&&this.$getSelectionHighLightRegexp();this.session.highlight(i),this._signal("changeSelection")},this.$getSelectionHighLightRegexp=function(){var e=this.session,t=this.getSelectionRange();if(t.isEmpty()||t.isMultiLine())return;var n=t.start.column,r=t.end.column,i=e.getLine(t.start.row),s=i.substring(n,r);if(s.length>5e3||!/[\w\d]/.test(s))return;var o=this.$search.$assembleRegExp({wholeWord:!0,caseSensitive:!0,needle:s}),u=i.substring(n-1,r+1);if(!o.test(u))return;return o},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.updateBreakpoints()},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(e){this.renderer.updateText(),this._emit("changeMode",e)},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getSelectedText=function(){return this.session.getTextRange(this.getSelectionRange())},this.getCopyText=function(){var e=this.getSelectedText(),t=this.session.doc.getNewLineCharacter(),n=!1;if(!e&&this.$copyWithEmptySelection){n=!0;var r=this.selection.getAllRanges();for(var i=0;iu.search(/\S|$/)){var a=u.substr(i.column).search(/\S|$/);n.doc.removeInLine(i.row,i.column,i.column+a)}}this.clearSelection();var f=i.column,l=n.getState(i.row),u=n.getLine(i.row),c=r.checkOutdent(l,u,e);n.insert(i,e),s&&s.selection&&(s.selection.length==2?this.selection.setSelectionRange(new p(i.row,f+s.selection[0],i.row,f+s.selection[1])):this.selection.setSelectionRange(new p(i.row+s.selection[0],s.selection[1],i.row+s.selection[2],s.selection[3])));if(n.getDocument().isNewLine(e)){var h=r.getNextLineIndent(l,u.slice(0,i.column),n.getTabString());n.insert({row:i.row+1,column:0},h)}c&&r.autoOutdent(l,n,i.row)},this.onTextInput=function(e,t){if(!t)return this.keyBinding.onTextInput(e);this.startOperation({command:{name:"insertstring"}});var n=this.applyComposition.bind(this,e,t);this.selection.rangeCount?this.forEachSelection(n):n(),this.endOperation()},this.applyComposition=function(e,t){if(t.extendLeft||t.extendRight){var n=this.selection.getRange();n.start.column-=t.extendLeft,n.end.column+=t.extendRight,this.selection.setRange(n),!e&&!n.isEmpty()&&this.remove()}(e||!this.selection.isEmpty())&&this.insert(e,!0);if(t.restoreStart||t.restoreEnd){var n=this.selection.getRange();n.start.column-=t.restoreStart,n.end.column-=t.restoreEnd,this.selection.setRange(n)}},this.onCommandKey=function(e,t,n){return this.keyBinding.onCommandKey(e,t,n)},this.setOverwrite=function(e){this.session.setOverwrite(e)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(e){this.setOption("scrollSpeed",e)},this.getScrollSpeed=function(){return this.getOption("scrollSpeed")},this.setDragDelay=function(e){this.setOption("dragDelay",e)},this.getDragDelay=function(){return this.getOption("dragDelay")},this.setSelectionStyle=function(e){this.setOption("selectionStyle",e)},this.getSelectionStyle=function(){return this.getOption("selectionStyle")},this.setHighlightActiveLine=function(e){this.setOption("highlightActiveLine",e)},this.getHighlightActiveLine=function(){return this.getOption("highlightActiveLine")},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.setHighlightSelectedWord=function(e){this.setOption("highlightSelectedWord",e)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setAnimatedScroll=function(e){this.renderer.setAnimatedScroll(e)},this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()},this.setShowInvisibles=function(e){this.renderer.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setDisplayIndentGuides=function(e){this.renderer.setDisplayIndentGuides(e)},this.getDisplayIndentGuides=function(){return this.renderer.getDisplayIndentGuides()},this.setShowPrintMargin=function(e){this.renderer.setShowPrintMargin(e)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(e){this.renderer.setPrintMarginColumn(e)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.setReadOnly=function(e){this.setOption("readOnly",e)},this.getReadOnly=function(){return this.getOption("readOnly")},this.setBehavioursEnabled=function(e){this.setOption("behavioursEnabled",e)},this.getBehavioursEnabled=function(){return this.getOption("behavioursEnabled")},this.setWrapBehavioursEnabled=function(e){this.setOption("wrapBehavioursEnabled",e)},this.getWrapBehavioursEnabled=function(){return this.getOption("wrapBehavioursEnabled")},this.setShowFoldWidgets=function(e){this.setOption("showFoldWidgets",e)},this.getShowFoldWidgets=function(){return this.getOption("showFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.remove=function(e){this.selection.isEmpty()&&(e=="left"?this.selection.selectLeft():this.selection.selectRight());var t=this.getSelectionRange();if(this.getBehavioursEnabled()){var n=this.session,r=n.getState(t.start.row),i=n.getMode().transformAction(r,"deletion",this,n,t);if(t.end.column===0){var s=n.getTextRange(t);if(s[s.length-1]=="\n"){var o=n.getLine(t.end.row);/^\s+$/.test(o)&&(t.end.column=o.length)}}i&&(t=i)}this.session.remove(t),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.selection.isEmpty()&&this.selection.selectLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var e=this.getSelectionRange();e.start.column==e.end.column&&e.start.row==e.end.row&&(e.end.column=0,e.end.row++),this.session.remove(e),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var e=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(e)},this.transposeLetters=function(){if(!this.selection.isEmpty())return;var e=this.getCursorPosition(),t=e.column;if(t===0)return;var n=this.session.getLine(e.row),r,i;tt.toLowerCase()?1:0});var i=new p(0,0,0,0);for(var r=e.first;r<=e.last;r++){var s=t.getLine(r);i.start.row=r,i.end.row=r,i.end.column=s.length,t.replace(i,n[r-e.first])}},this.toggleCommentLines=function(){var e=this.session.getState(this.getCursorPosition().row),t=this.$getSelectedRows();this.session.getMode().toggleCommentLines(e,this.session,t.first,t.last)},this.toggleBlockComment=function(){var e=this.getCursorPosition(),t=this.session.getState(e.row),n=this.getSelectionRange();this.session.getMode().toggleBlockComment(t,this.session,n,e)},this.getNumberAt=function(e,t){var n=/[\-]?[0-9]+(?:\.[0-9]+)?/g;n.lastIndex=0;var r=this.session.getLine(e);while(n.lastIndex=t){var s={value:i[0],start:i.index,end:i.index+i[0].length};return s}}return null},this.modifyNumber=function(e){var t=this.selection.getCursor().row,n=this.selection.getCursor().column,r=new p(t,n-1,t,n),i=this.session.getTextRange(r);if(!isNaN(parseFloat(i))&&isFinite(i)){var s=this.getNumberAt(t,n);if(s){var o=s.value.indexOf(".")>=0?s.start+s.value.indexOf(".")+1:s.end,u=s.start+s.value.length-o,a=parseFloat(s.value);a*=Math.pow(10,u),o!==s.end&&n=u&&o<=a&&(n=t,f.selection.clearSelection(),f.moveCursorTo(e,u+r),f.selection.selectTo(e,a+r)),u=a});var l=this.$toggleWordPairs,c;for(var h=0;hp+1)break;p=d.last}l--,u=this.session.$moveLines(h,p,t?0:e),t&&e==-1&&(c=l+1);while(c<=l)o[c].moveBy(u,0),c++;t||(u=0),a+=u}i.fromOrientedRange(i.ranges[0]),i.rangeList.attach(this.session),this.inVirtualSelectionMode=!1}},this.$getSelectedRows=function(e){return e=(e||this.getSelectionRange()).collapseRows(),{first:this.session.getRowFoldStart(e.start.row),last:this.session.getRowFoldEnd(e.end.row)}},this.onCompositionStart=function(e){this.renderer.showComposition(e)},this.onCompositionUpdate=function(e){this.renderer.setCompositionText(e)},this.onCompositionEnd=function(){this.renderer.hideComposition()},this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()},this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()},this.isRowVisible=function(e){return e>=this.getFirstVisibleRow()&&e<=this.getLastVisibleRow()},this.isRowFullyVisible=function(e){return e>=this.renderer.getFirstFullyVisibleRow()&&e<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$moveByPage=function(e,t){var n=this.renderer,r=this.renderer.layerConfig,i=e*Math.floor(r.height/r.lineHeight);t===!0?this.selection.$moveSelection(function(){this.moveCursorBy(i,0)}):t===!1&&(this.selection.moveCursorBy(i,0),this.selection.clearSelection());var s=n.scrollTop;n.scrollBy(0,i*r.lineHeight),t!=null&&n.scrollCursorIntoView(null,.5),n.animateScrolling(s)},this.selectPageDown=function(){this.$moveByPage(1,!0)},this.selectPageUp=function(){this.$moveByPage(-1,!0)},this.gotoPageDown=function(){this.$moveByPage(1,!1)},this.gotoPageUp=function(){this.$moveByPage(-1,!1)},this.scrollPageDown=function(){this.$moveByPage(1)},this.scrollPageUp=function(){this.$moveByPage(-1)},this.scrollToRow=function(e){this.renderer.scrollToRow(e)},this.scrollToLine=function(e,t,n,r){this.renderer.scrollToLine(e,t,n,r)},this.centerSelection=function(){var e=this.getSelectionRange(),t={row:Math.floor(e.start.row+(e.end.row-e.start.row)/2),column:Math.floor(e.start.column+(e.end.column-e.start.column)/2)};this.renderer.alignCursor(t,.5)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.selection.selectAll()},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(e,t){this.selection.moveCursorTo(e,t)},this.moveCursorToPosition=function(e){this.selection.moveCursorToPosition(e)},this.jumpToMatching=function(e,t){var n=this.getCursorPosition(),r=new y(this.session,n.row,n.column),i=r.getCurrentToken(),s=i||r.stepForward();if(!s)return;var o,u=!1,a={},f=n.column-s.start,l,c={")":"(","(":"(","]":"[","[":"[","{":"{","}":"{"};do{if(s.value.match(/[{}()\[\]]/g))for(;f=0;--s)this.$tryReplace(n[s],e)&&r++;return this.selection.setSelectionRange(i),r},this.$tryReplace=function(e,t){var n=this.session.getTextRange(e);return t=this.$search.replace(n,t),t!==null?(e.end=this.session.replace(e,t),e):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(e,t,n){t||(t={}),typeof e=="string"||e instanceof RegExp?t.needle=e:typeof e=="object"&&r.mixin(t,e);var i=this.selection.getRange();t.needle==null&&(e=this.session.getTextRange(i)||this.$search.$options.needle,e||(i=this.session.getWordRange(i.start.row,i.start.column),e=this.session.getTextRange(i)),this.$search.set({needle:e})),this.$search.set(t),t.start||this.$search.set({start:i});var s=this.$search.find(this.session);if(t.preventScroll)return s;if(s)return this.revealRange(s,n),s;t.backwards?i.start=i.end:i.end=i.start,this.selection.setRange(i)},this.findNext=function(e,t){this.find({skipCurrent:!0,backwards:!1},e,t)},this.findPrevious=function(e,t){this.find(e,{skipCurrent:!0,backwards:!0},t)},this.revealRange=function(e,t){this.session.unfold(e),this.selection.setSelectionRange(e);var n=this.renderer.scrollTop;this.renderer.scrollSelectionIntoView(e.start,e.end,.5),t!==!1&&this.renderer.animateScrolling(n)},this.undo=function(){this.session.getUndoManager().undo(this.session),this.renderer.scrollCursorIntoView(null,.5)},this.redo=function(){this.session.getUndoManager().redo(this.session),this.renderer.scrollCursorIntoView(null,.5)},this.destroy=function(){this.renderer.destroy(),this._signal("destroy",this),this.session&&this.session.destroy()},this.setAutoScrollEditorIntoView=function(e){if(!e)return;var t,n=this,r=!1;this.$scrollAnchor||(this.$scrollAnchor=document.createElement("div"));var i=this.$scrollAnchor;i.style.cssText="position:absolute",this.container.insertBefore(i,this.container.firstChild);var s=this.on("changeSelection",function(){r=!0}),o=this.renderer.on("beforeRender",function(){r&&(t=n.renderer.container.getBoundingClientRect())}),u=this.renderer.on("afterRender",function(){if(r&&t&&(n.isFocused()||n.searchBox&&n.searchBox.isFocused())){var e=n.renderer,s=e.$cursorLayer.$pixelPos,o=e.layerConfig,u=s.top-o.offset;s.top>=0&&u+t.top<0?r=!0:s.topwindow.innerHeight?r=!1:r=null,r!=null&&(i.style.top=u+"px",i.style.left=s.left+"px",i.style.height=o.lineHeight+"px",i.scrollIntoView(r)),r=t=null}});this.setAutoScrollEditorIntoView=function(e){if(e)return;delete this.setAutoScrollEditorIntoView,this.off("changeSelection",s),this.renderer.off("afterRender",u),this.renderer.off("beforeRender",o)}},this.$resetCursorStyle=function(){var e=this.$cursorStyle||"ace",t=this.renderer.$cursorLayer;if(!t)return;t.setSmoothBlinking(/smooth/.test(e)),t.isBlinking=!this.$readOnly&&e!="wide",i.setCssClass(t.element,"ace_slim-cursors",/slim/.test(e))},this.prompt=function(e,t,n){var r=this;g.loadModule("./ext/prompt",function(i){i.prompt(r,e,t,n)})}}.call(w.prototype),g.defineOptions(w.prototype,"editor",{selectionStyle:{set:function(e){this.onSelectionChange(),this._signal("changeSelectionStyle",{data:e})},initialValue:"line"},highlightActiveLine:{set:function(){this.$updateHighlightActiveLine()},initialValue:!0},highlightSelectedWord:{set:function(e){this.$onSelectionChange()},initialValue:!0},readOnly:{set:function(e){this.textInput.setReadOnly(e),this.$resetCursorStyle()},initialValue:!1},copyWithEmptySelection:{set:function(e){this.textInput.setCopyWithEmptySelection(e)},initialValue:!1},cursorStyle:{set:function(e){this.$resetCursorStyle()},values:["ace","slim","smooth","wide"],initialValue:"ace"},mergeUndoDeltas:{values:[!1,!0,"always"],initialValue:!0},behavioursEnabled:{initialValue:!0},wrapBehavioursEnabled:{initialValue:!0},autoScrollEditorIntoView:{set:function(e){this.setAutoScrollEditorIntoView(e)}},keyboardHandler:{set:function(e){this.setKeyboardHandler(e)},get:function(){return this.$keybindingId},handlesSet:!0},value:{set:function(e){this.session.setValue(e)},get:function(){return this.getValue()},handlesSet:!0,hidden:!0},session:{set:function(e){this.setSession(e)},get:function(){return this.session},handlesSet:!0,hidden:!0},showLineNumbers:{set:function(e){this.renderer.$gutterLayer.setShowLineNumbers(e),this.renderer.$loop.schedule(this.renderer.CHANGE_GUTTER),e&&this.$relativeLineNumbers?E.attach(this):E.detach(this)},initialValue:!0},relativeLineNumbers:{set:function(e){this.$showLineNumbers&&e?E.attach(this):E.detach(this)}},hScrollBarAlwaysVisible:"renderer",vScrollBarAlwaysVisible:"renderer",highlightGutterLine:"renderer",animatedScroll:"renderer",showInvisibles:"renderer",showPrintMargin:"renderer",printMarginColumn:"renderer",printMargin:"renderer",fadeFoldWidgets:"renderer",showFoldWidgets:"renderer",displayIndentGuides:"renderer",showGutter:"renderer",fontSize:"renderer",fontFamily:"renderer",maxLines:"renderer",minLines:"renderer",scrollPastEnd:"renderer",fixedWidthGutter:"renderer",theme:"renderer",hasCssTransforms:"renderer",maxPixelHeight:"renderer",useTextareaForIME:"renderer",scrollSpeed:"$mouseHandler",dragDelay:"$mouseHandler",dragEnabled:"$mouseHandler",focusTimeout:"$mouseHandler",tooltipFollowsMouse:"$mouseHandler",firstLineNumber:"session",overwrite:"session",newLineMode:"session",useWorker:"session",useSoftTabs:"session",navigateWithinSoftTabs:"session",tabSize:"session",wrap:"session",indentedSoftWrap:"session",foldStyle:"session",mode:"session"});var E={getText:function(e,t){return(Math.abs(e.selection.lead.row-t)||t+1+(t<9?"\u00b7":""))+""},getWidth:function(e,t,n){return Math.max(t.toString().length,(n.lastRow+1).toString().length,2)*n.characterWidth},update:function(e,t){t.renderer.$loop.schedule(t.renderer.CHANGE_GUTTER)},attach:function(e){e.renderer.$gutterLayer.$renderer=this,e.on("changeSelection",this.update),this.update(null,e)},detach:function(e){e.renderer.$gutterLayer.$renderer==this&&(e.renderer.$gutterLayer.$renderer=null),e.off("changeSelection",this.update),this.update(null,e)}};t.Editor=w}),ace.define("ace/undomanager",["require","exports","module","ace/range"],function(e,t,n){"use strict";function i(e,t){for(var n=t;n--;){var r=e[n];if(r&&!r[0].ignore){while(n0){a.row+=i,a.column+=a.row==r.row?s:0;continue}!t&&l<=0&&(a.row=n.row,a.column=n.column,l===0&&(a.bias=1))}}function f(e){return{row:e.row,column:e.column}}function l(e){return{start:f(e.start),end:f(e.end),action:e.action,lines:e.lines.slice()}}function c(e){e=e||this;if(Array.isArray(e))return e.map(c).join("\n");var t="";e.action?(t=e.action=="insert"?"+":"-",t+="["+e.lines+"]"):e.value&&(Array.isArray(e.value)?t=e.value.map(h).join("\n"):t=h(e.value)),e.start&&(t+=h(e));if(e.id||e.rev)t+=" ("+(e.id||e.rev)+")";return t}function h(e){return e.start.row+":"+e.start.column+"=>"+e.end.row+":"+e.end.column}function p(e,t){var n=e.action=="insert",r=t.action=="insert";if(n&&r)if(o(t.start,e.end)>=0)m(t,e,-1);else{if(!(o(t.start,e.start)<=0))return null;m(e,t,1)}else if(n&&!r)if(o(t.start,e.end)>=0)m(t,e,-1);else{if(!(o(t.end,e.start)<=0))return null;m(e,t,-1)}else if(!n&&r)if(o(t.start,e.start)>=0)m(t,e,1);else{if(!(o(t.start,e.start)<=0))return null;m(e,t,1)}else if(!n&&!r)if(o(t.start,e.start)>=0)m(t,e,1);else{if(!(o(t.end,e.start)<=0))return null;m(e,t,-1)}return[t,e]}function d(e,t){for(var n=e.length;n--;)for(var r=0;r=0?m(e,t,-1):o(e.start,t.start)<=0?m(t,e,1):(m(e,s.fromPoints(t.start,e.start),-1),m(t,e,1));else if(!n&&r)o(t.start,e.end)>=0?m(t,e,-1):o(t.start,e.start)<=0?m(e,t,1):(m(t,s.fromPoints(e.start,t.start),-1),m(e,t,1));else if(!n&&!r)if(o(t.start,e.end)>=0)m(t,e,-1);else{if(!(o(t.end,e.start)<=0)){var i,u;return o(e.start,t.start)<0&&(i=e,e=y(e,t.start)),o(e.end,t.end)>0&&(u=y(e,t.end)),g(t.end,e.start,e.end,-1),u&&!i&&(e.lines=u.lines,e.start=u.start,e.end=u.end,u=e),[t,i,u].filter(Boolean)}m(e,t,-1)}return[t,e]}function m(e,t,n){g(e.start,t.start,t.end,n),g(e.end,t.start,t.end,n)}function g(e,t,n,r){e.row==(r==1?t:n).row&&(e.column+=r*(n.column-t.column)),e.row+=r*(n.row-t.row)}function y(e,t){var n=e.lines,r=e.end;e.end=f(t);var i=e.end.row-e.start.row,s=n.splice(i,n.length),o=i?t.column:t.column-e.start.column;n.push(s[0].substring(0,o)),s[0]=s[0].substr(o);var u={start:f(t),end:r,lines:s,action:e.action};return u}function b(e,t){t=l(t);for(var n=e.length;n--;){var r=e[n];for(var i=0;i0},this.canRedo=function(){return this.$redoStack.length>0},this.bookmark=function(e){e==undefined&&(e=this.$rev),this.mark=e},this.isAtBookmark=function(){return this.$rev===this.mark},this.toJSON=function(){},this.fromJSON=function(){},this.hasUndo=this.canUndo,this.hasRedo=this.canRedo,this.isClean=this.isAtBookmark,this.markClean=this.bookmark,this.$prettyPrint=function(e){return e?c(e):c(this.$undoStack)+"\n---\n"+c(this.$redoStack)}}).call(r.prototype);var s=e("./range").Range,o=s.comparePoints,u=s.comparePoints;t.UndoManager=r}),ace.define("ace/layer/lines",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../lib/dom"),i=function(e,t){this.element=e,this.canvasHeight=t||5e5,this.element.style.height=this.canvasHeight*2+"px",this.cells=[],this.cellCache=[],this.$offsetCoefficient=0};(function(){this.moveContainer=function(e){r.translate(this.element,0,-(e.firstRowScreen*e.lineHeight%this.canvasHeight)-e.offset*this.$offsetCoefficient)},this.pageChanged=function(e,t){return Math.floor(e.firstRowScreen*e.lineHeight/this.canvasHeight)!==Math.floor(t.firstRowScreen*t.lineHeight/this.canvasHeight)},this.computeLineTop=function(e,t,n){var r=t.firstRowScreen*t.lineHeight,i=Math.floor(r/this.canvasHeight),s=n.documentToScreenRow(e,0)*t.lineHeight;return s-i*this.canvasHeight},this.computeLineHeight=function(e,t,n){return t.lineHeight*n.getRowLength(e)},this.getLength=function(){return this.cells.length},this.get=function(e){return this.cells[e]},this.shift=function(){this.$cacheCell(this.cells.shift())},this.pop=function(){this.$cacheCell(this.cells.pop())},this.push=function(e){if(Array.isArray(e)){this.cells.push.apply(this.cells,e);var t=r.createFragment(this.element);for(var n=0;ns&&(a=i.end.row+1,i=t.getNextFoldLine(a,i),s=i?i.start.row:Infinity);if(a>r){while(this.$lines.getLength()>u+1)this.$lines.pop();break}o=this.$lines.get(++u),o?o.row=a:(o=this.$lines.createCell(a,e,this.session,f),this.$lines.push(o)),this.$renderCell(o,e,i,a),a++}this._signal("afterRender"),this.$updateGutterWidth(e)},this.$updateGutterWidth=function(e){var t=this.session,n=t.gutterRenderer||this.$renderer,r=t.$firstLineNumber,i=this.$lines.last()?this.$lines.last().text:"";if(this.$fixedWidth||t.$useWrapMode)i=t.getLength()+r-1;var s=n?n.getWidth(t,i,e):i.toString().length*e.characterWidth,o=this.$padding||this.$computePadding();s+=o.left+o.right,s!==this.gutterWidth&&!isNaN(s)&&(this.gutterWidth=s,this.element.parentNode.style.width=this.element.style.width=Math.ceil(this.gutterWidth)+"px",this._signal("changeGutterWidth",s))},this.$updateCursorRow=function(){if(!this.$highlightGutterLine)return;var e=this.session.selection.getCursor();if(this.$cursorRow===e.row)return;this.$cursorRow=e.row},this.updateLineHighlight=function(){if(!this.$highlightGutterLine)return;var e=this.session.selection.cursor.row;this.$cursorRow=e;if(this.$cursorCell&&this.$cursorCell.row==e)return;this.$cursorCell&&(this.$cursorCell.element.className=this.$cursorCell.element.className.replace("ace_gutter-active-line ",""));var t=this.$lines.cells;this.$cursorCell=null;for(var n=0;n=this.$cursorRow){if(r.row>this.$cursorRow){var i=this.session.getFoldLine(this.$cursorRow);if(!(n>0&&i&&i.start.row==t[n-1].row))break;r=t[n-1]}r.element.className="ace_gutter-active-line "+r.element.className,this.$cursorCell=r;break}}},this.scrollLines=function(e){var t=this.config;this.config=e,this.$updateCursorRow();if(this.$lines.pageChanged(t,e))return this.update(e);this.$lines.moveContainer(e);var n=Math.min(e.lastRow+e.gutterOffset,this.session.getLength()-1),r=this.oldLastRow;this.oldLastRow=n;if(!t||r0;i--)this.$lines.shift();if(r>n)for(var i=this.session.getFoldedRowCount(n+1,r);i>0;i--)this.$lines.pop();e.firstRowr&&this.$lines.push(this.$renderLines(e,r+1,n)),this.updateLineHighlight(),this._signal("afterRender"),this.$updateGutterWidth(e)},this.$renderLines=function(e,t,n){var r=[],i=t,s=this.session.getNextFoldLine(i),o=s?s.start.row:Infinity;for(;;){i>o&&(i=s.end.row+1,s=this.session.getNextFoldLine(i,s),o=s?s.start.row:Infinity);if(i>n)break;var u=this.$lines.createCell(i,e,this.session,f);this.$renderCell(u,e,s,i),r.push(u),i++}return r},this.$renderCell=function(e,t,n,i){var s=e.element,o=this.session,u=s.childNodes[0],a=s.childNodes[1],f=o.$firstLineNumber,l=o.$breakpoints,c=o.$decorations,h=o.gutterRenderer||this.$renderer,p=this.$showFoldWidgets&&o.foldWidgets,d=n?n.start.row:Number.MAX_VALUE,v="ace_gutter-cell ";this.$highlightGutterLine&&(i==this.$cursorRow||n&&i=d&&this.$cursorRow<=n.end.row)&&(v+="ace_gutter-active-line ",this.$cursorCell!=e&&(this.$cursorCell&&(this.$cursorCell.element.className=this.$cursorCell.element.className.replace("ace_gutter-active-line ","")),this.$cursorCell=e)),l[i]&&(v+=l[i]),c[i]&&(v+=c[i]),this.$annotations[i]&&(v+=this.$annotations[i].className),s.className!=v&&(s.className=v);if(p){var m=p[i];m==null&&(m=p[i]=o.getFoldWidget(i))}if(m){var v="ace_fold-widget ace_"+m;m=="start"&&i==d&&in.right-t.right)return"foldWidgets"}}).call(a.prototype),t.Gutter=a}),ace.define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../range").Range,i=e("../lib/dom"),s=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_marker-layer",e.appendChild(this.element)};(function(){function e(e,t,n,r){return(e?1:0)|(t?2:0)|(n?4:0)|(r?8:0)}this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setMarkers=function(e){this.markers=e},this.elt=function(e,t){var n=this.i!=-1&&this.element.childNodes[this.i];n?this.i++:(n=document.createElement("div"),this.element.appendChild(n),this.i=-1),n.style.cssText=t,n.className=e},this.update=function(e){if(!e)return;this.config=e,this.i=0;var t;for(var n in this.markers){var r=this.markers[n];if(!r.range){r.update(t,this,this.session,e);continue}var i=r.range.clipRows(e.firstRow,e.lastRow);if(i.isEmpty())continue;i=i.toScreenRange(this.session);if(r.renderer){var s=this.$getTop(i.start.row,e),o=this.$padding+i.start.column*e.characterWidth;r.renderer(t,i,o,s,e)}else r.type=="fullLine"?this.drawFullLineMarker(t,i,r.clazz,e):r.type=="screenLine"?this.drawScreenLineMarker(t,i,r.clazz,e):i.isMultiLine()?r.type=="text"?this.drawTextMarker(t,i,r.clazz,e):this.drawMultiLineMarker(t,i,r.clazz,e):this.drawSingleLineMarker(t,i,r.clazz+" ace_start"+" ace_br15",e)}if(this.i!=-1)while(this.ip,l==f),s,l==f?0:1,o)},this.drawMultiLineMarker=function(e,t,n,r,i){var s=this.$padding,o=r.lineHeight,u=this.$getTop(t.start.row,r),a=s+t.start.column*r.characterWidth;i=i||"";if(this.session.$bidiHandler.isBidiRow(t.start.row)){var f=t.clone();f.end.row=f.start.row,f.end.column=this.session.getLine(f.start.row).length,this.drawBidiSingleLineMarker(e,f,n+" ace_br1 ace_start",r,null,i)}else this.elt(n+" ace_br1 ace_start","height:"+o+"px;"+"right:0;"+"top:"+u+"px;left:"+a+"px;"+(i||""));if(this.session.$bidiHandler.isBidiRow(t.end.row)){var f=t.clone();f.start.row=f.end.row,f.start.column=0,this.drawBidiSingleLineMarker(e,f,n+" ace_br12",r,null,i)}else{u=this.$getTop(t.end.row,r);var l=t.end.column*r.characterWidth;this.elt(n+" ace_br12","height:"+o+"px;"+"width:"+l+"px;"+"top:"+u+"px;"+"left:"+s+"px;"+(i||""))}o=(t.end.row-t.start.row-1)*r.lineHeight;if(o<=0)return;u=this.$getTop(t.start.row+1,r);var c=(t.start.column?1:0)|(t.end.column?0:8);this.elt(n+(c?" ace_br"+c:""),"height:"+o+"px;"+"right:0;"+"top:"+u+"px;"+"left:"+s+"px;"+(i||""))},this.drawSingleLineMarker=function(e,t,n,r,i,s){if(this.session.$bidiHandler.isBidiRow(t.start.row))return this.drawBidiSingleLineMarker(e,t,n,r,i,s);var o=r.lineHeight,u=(t.end.column+(i||0)-t.start.column)*r.characterWidth,a=this.$getTop(t.start.row,r),f=this.$padding+t.start.column*r.characterWidth;this.elt(n,"height:"+o+"px;"+"width:"+u+"px;"+"top:"+a+"px;"+"left:"+f+"px;"+(s||""))},this.drawBidiSingleLineMarker=function(e,t,n,r,i,s){var o=r.lineHeight,u=this.$getTop(t.start.row,r),a=this.$padding,f=this.session.$bidiHandler.getSelections(t.start.column,t.end.column);f.forEach(function(e){this.elt(n,"height:"+o+"px;"+"width:"+e.width+(i||0)+"px;"+"top:"+u+"px;"+"left:"+(a+e.left)+"px;"+(s||""))},this)},this.drawFullLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;t.start.row!=t.end.row&&(o+=this.$getTop(t.end.row,r)-s),this.elt(n,"height:"+o+"px;"+"top:"+s+"px;"+"left:0;right:0;"+(i||""))},this.drawScreenLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;this.elt(n,"height:"+o+"px;"+"top:"+s+"px;"+"left:0;right:0;"+(i||""))}}).call(s.prototype),t.Marker=s}),ace.define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/layer/lines","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("./lines").Lines,u=e("../lib/event_emitter").EventEmitter,a=function(e){this.dom=i,this.element=this.dom.createElement("div"),this.element.className="ace_layer ace_text-layer",e.appendChild(this.element),this.$updateEolChar=this.$updateEolChar.bind(this),this.$lines=new o(this.element)};(function(){r.implement(this,u),this.EOF_CHAR="\u00b6",this.EOL_CHAR_LF="\u00ac",this.EOL_CHAR_CRLF="\u00a4",this.EOL_CHAR=this.EOL_CHAR_LF,this.TAB_CHAR="\u2014",this.SPACE_CHAR="\u00b7",this.$padding=0,this.MAX_LINE_LENGTH=1e4,this.$updateEolChar=function(){var e=this.session.doc,t=e.getNewLineCharacter()=="\n"&&e.getNewLineMode()!="windows",n=t?this.EOL_CHAR_LF:this.EOL_CHAR_CRLF;if(this.EOL_CHAR!=n)return this.EOL_CHAR=n,!0},this.setPadding=function(e){this.$padding=e,this.element.style.margin="0 "+e+"px"},this.getLineHeight=function(){return this.$fontMetrics.$characterSize.height||0},this.getCharacterWidth=function(){return this.$fontMetrics.$characterSize.width||0},this.$setFontMetrics=function(e){this.$fontMetrics=e,this.$fontMetrics.on("changeCharacterSize",function(e){this._signal("changeCharacterSize",e)}.bind(this)),this.$pollSizeChanges()},this.checkForSizeChanges=function(){this.$fontMetrics.checkForSizeChanges()},this.$pollSizeChanges=function(){return this.$pollSizeChangesTimer=this.$fontMetrics.$pollSizeChanges()},this.setSession=function(e){this.session=e,e&&this.$computeTabString()},this.showInvisibles=!1,this.setShowInvisibles=function(e){return this.showInvisibles==e?!1:(this.showInvisibles=e,this.$computeTabString(),!0)},this.displayIndentGuides=!0,this.setDisplayIndentGuides=function(e){return this.displayIndentGuides==e?!1:(this.displayIndentGuides=e,this.$computeTabString(),!0)},this.$tabStrings=[],this.onChangeTabSize=this.$computeTabString=function(){var e=this.session.getTabSize();this.tabSize=e;var t=this.$tabStrings=[0];for(var n=1;nl&&(u=a.end.row+1,a=this.session.getNextFoldLine(u,a),l=a?a.start.row:Infinity);if(u>i)break;var c=s[o++];if(c){this.dom.removeChildren(c),this.$renderLine(c,u,u==l?a:!1),f&&(c.style.top=this.$lines.computeLineTop(u,e,this.session)+"px");var h=e.lineHeight*this.session.getRowLength(u)+"px";c.style.height!=h&&(f=!0,c.style.height=h)}u++}if(f)while(o0;i--)this.$lines.shift();if(t.lastRow>e.lastRow)for(var i=this.session.getFoldedRowCount(e.lastRow+1,t.lastRow);i>0;i--)this.$lines.pop();e.firstRowt.lastRow&&this.$lines.push(this.$renderLinesFragment(e,t.lastRow+1,e.lastRow))},this.$renderLinesFragment=function(e,t,n){var r=[],s=t,o=this.session.getNextFoldLine(s),u=o?o.start.row:Infinity;for(;;){s>u&&(s=o.end.row+1,o=this.session.getNextFoldLine(s,o),u=o?o.start.row:Infinity);if(s>n)break;var a=this.$lines.createCell(s,e,this.session),f=a.element;this.dom.removeChildren(f),i.setStyle(f.style,"height",this.$lines.computeLineHeight(s,e,this.session)+"px"),i.setStyle(f.style,"top",this.$lines.computeLineTop(s,e,this.session)+"px"),this.$renderLine(f,s,s==u?o:!1),this.$useLineGroups()?f.className="ace_line_group":f.className="ace_line",r.push(a),s++}return r},this.update=function(e){this.$lines.moveContainer(e),this.config=e;var t=e.firstRow,n=e.lastRow,r=this.$lines;while(r.getLength())r.pop();r.push(this.$renderLinesFragment(e,t,n))},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(e,t,n,r){var i=this,o=/(\t)|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\uFEFF\uFFF9-\uFFFC]+)|(\u3000)|([\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3001-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]|[\uD800-\uDBFF][\uDC00-\uDFFF])/g,u=this.dom.createFragment(this.element),a,f=0;while(a=o.exec(r)){var l=a[1],c=a[2],h=a[3],p=a[4],d=a[5];if(!i.showInvisibles&&c)continue;var v=f!=a.index?r.slice(f,a.index):"";f=a.index+a[0].length,v&&u.appendChild(this.dom.createTextNode(v,this.element));if(l){var m=i.session.getScreenTabSize(t+a.index);u.appendChild(i.$tabStrings[m].cloneNode(!0)),t+=m-1}else if(c)if(i.showInvisibles){var g=this.dom.createElement("span");g.className="ace_invisible ace_invisible_space",g.textContent=s.stringRepeat(i.SPACE_CHAR,c.length),u.appendChild(g)}else u.appendChild(this.com.createTextNode(c,this.element));else if(h){var g=this.dom.createElement("span");g.className="ace_invisible ace_invisible_space ace_invalid",g.textContent=s.stringRepeat(i.SPACE_CHAR,h.length),u.appendChild(g)}else if(p){t+=1;var g=this.dom.createElement("span");g.style.width=i.config.characterWidth*2+"px",g.className=i.showInvisibles?"ace_cjk ace_invisible ace_invisible_space":"ace_cjk",g.textContent=i.showInvisibles?i.SPACE_CHAR:p,u.appendChild(g)}else if(d){t+=1;var g=this.dom.createElement("span");g.style.width=i.config.characterWidth*2+"px",g.className="ace_cjk",g.textContent=d,u.appendChild(g)}}u.appendChild(this.dom.createTextNode(f?r.slice(f):r,this.element));if(!this.$textToken[n.type]){var y="ace_"+n.type.replace(/\./g," ace_"),g=this.dom.createElement("span");n.type=="fold"&&(g.style.width=n.value.length*this.config.characterWidth+"px"),g.className=y,g.appendChild(u),e.appendChild(g)}else e.appendChild(u);return t+r.length},this.renderIndentGuide=function(e,t,n){var r=t.search(this.$indentGuideRe);if(r<=0||r>=n)return t;if(t[0]==" "){r-=r%this.tabSize;var i=r/this.tabSize;for(var s=0;s=o)u=this.$renderToken(a,u,l,c.substring(0,o-r)),c=c.substring(o-r),r=o,a=this.$createLineElement(),e.appendChild(a),a.appendChild(this.dom.createTextNode(s.stringRepeat("\u00a0",n.indent),this.element)),i++,u=0,o=n[i]||Number.MAX_VALUE;c.length!=0&&(r+=c.length,u=this.$renderToken(a,u,l,c))}}n[n.length-1]>this.MAX_LINE_LENGTH&&this.$renderOverflowMessage(a,u,null,"",!0)},this.$renderSimpleLine=function(e,t){var n=0,r=t[0],i=r.value;this.displayIndentGuides&&(i=this.renderIndentGuide(e,i)),i&&(n=this.$renderToken(e,n,r,i));for(var s=1;sthis.MAX_LINE_LENGTH)return this.$renderOverflowMessage(e,n,r,i);n=this.$renderToken(e,n,r,i)}},this.$renderOverflowMessage=function(e,t,n,r,i){n&&this.$renderToken(e,t,n,r.slice(0,this.MAX_LINE_LENGTH-t));var s=this.dom.createElement("span");s.className="ace_inline_button ace_keyword ace_toggle_wrap",s.textContent=i?"":"",e.appendChild(s)},this.$renderLine=function(e,t,n){!n&&n!=0&&(n=this.session.getFoldLine(t));if(n)var r=this.$getFoldLineTokens(t,n);else var r=this.session.getTokens(t);var i=e;if(r.length){var s=this.session.getRowSplitData(t);if(s&&s.length){this.$renderWrappedLine(e,r,s);var i=e.lastChild}else{var i=e;this.$useLineGroups()&&(i=this.$createLineElement(),e.appendChild(i)),this.$renderSimpleLine(i,r)}}else this.$useLineGroups()&&(i=this.$createLineElement(),e.appendChild(i));if(this.showInvisibles&&i){n&&(t=n.end.row);var o=this.dom.createElement("span");o.className="ace_invisible ace_invisible_eol",o.textContent=t==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,i.appendChild(o)}},this.$getFoldLineTokens=function(e,t){function i(e,t,n){var i=0,s=0;while(s+e[i].value.lengthn-t&&(o=o.substring(0,n-t)),r.push({type:e[i].type,value:o}),s=t+o.length,i+=1}while(sn?r.push({type:e[i].type,value:o.substring(0,n-s)}):r.push(e[i]),s+=o.length,i+=1}}var n=this.session,r=[],s=n.getTokens(e);return t.walk(function(e,t,o,u,a){e!=null?r.push({type:"fold",value:e}):(a&&(s=n.getTokens(t)),s.length&&i(s,u,o))},t.end.row,this.session.getLine(t.end.row).length),r},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){}}).call(a.prototype),t.Text=a}),ace.define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../lib/dom"),i=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_cursor-layer",e.appendChild(this.element),this.isVisible=!1,this.isBlinking=!0,this.blinkInterval=1e3,this.smoothBlinking=!1,this.cursors=[],this.cursor=this.addCursor(),r.addCssClass(this.element,"ace_hidden-cursors"),this.$updateCursors=this.$updateOpacity.bind(this)};(function(){this.$updateOpacity=function(e){var t=this.cursors;for(var n=t.length;n--;)r.setStyle(t[n].style,"opacity",e?"":"0")},this.$startCssAnimation=function(){var e=this.cursors;for(var t=e.length;t--;)e[t].style.animationDuration=this.blinkInterval+"ms";setTimeout(function(){r.addCssClass(this.element,"ace_animate-blinking")}.bind(this))},this.$stopCssAnimation=function(){r.removeCssClass(this.element,"ace_animate-blinking")},this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setBlinking=function(e){e!=this.isBlinking&&(this.isBlinking=e,this.restartTimer())},this.setBlinkInterval=function(e){e!=this.blinkInterval&&(this.blinkInterval=e,this.restartTimer())},this.setSmoothBlinking=function(e){e!=this.smoothBlinking&&(this.smoothBlinking=e,r.setCssClass(this.element,"ace_smooth-blinking",e),this.$updateCursors(!0),this.restartTimer())},this.addCursor=function(){var e=r.createElement("div");return e.className="ace_cursor",this.element.appendChild(e),this.cursors.push(e),e},this.removeCursor=function(){if(this.cursors.length>1){var e=this.cursors.pop();return e.parentNode.removeChild(e),e}},this.hideCursor=function(){this.isVisible=!1,r.addCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.showCursor=function(){this.isVisible=!0,r.removeCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.restartTimer=function(){var e=this.$updateCursors;clearInterval(this.intervalId),clearTimeout(this.timeoutId),this.$stopCssAnimation(),this.smoothBlinking&&r.removeCssClass(this.element,"ace_smooth-blinking"),e(!0);if(!this.isBlinking||!this.blinkInterval||!this.isVisible){this.$stopCssAnimation();return}this.smoothBlinking&&setTimeout(function(){r.addCssClass(this.element,"ace_smooth-blinking")}.bind(this));if(r.HAS_CSS_ANIMATION)this.$startCssAnimation();else{var t=function(){this.timeoutId=setTimeout(function(){e(!1)},.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval(function(){e(!0),t()},this.blinkInterval),t()}},this.getPixelPosition=function(e,t){if(!this.config||!this.session)return{left:0,top:0};e||(e=this.session.selection.getCursor());var n=this.session.documentToScreenPosition(e),r=this.$padding+(this.session.$bidiHandler.isBidiRow(n.row,e.row)?this.session.$bidiHandler.getPosLeft(n.column):n.column*this.config.characterWidth),i=(n.row-(t?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:r,top:i}},this.isCursorInView=function(e,t){return e.top>=0&&e.tope.height+e.offset||o.top<0)&&n>1)continue;var u=this.cursors[i++]||this.addCursor(),a=u.style;this.drawCursor?this.drawCursor(u,o,e,t[n],this.session):this.isCursorInView(o,e)?(r.setStyle(a,"display","block"),r.translate(u,o.left,o.top),r.setStyle(a,"width",Math.round(e.characterWidth)+"px"),r.setStyle(a,"height",e.lineHeight+"px")):r.setStyle(a,"display","none")}while(this.cursors.length>i)this.removeCursor();var f=this.session.getOverwrite();this.$setOverwrite(f),this.$pixelPos=o,this.restartTimer()},this.drawCursor=null,this.$setOverwrite=function(e){e!=this.overwrite&&(this.overwrite=e,e?r.addCssClass(this.element,"ace_overwrite-cursors"):r.removeCssClass(this.element,"ace_overwrite-cursors"))},this.destroy=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId)}}).call(i.prototype),t.Cursor=i}),ace.define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./lib/event"),o=e("./lib/event_emitter").EventEmitter,u=32768,a=function(e){this.element=i.createElement("div"),this.element.className="ace_scrollbar ace_scrollbar"+this.classSuffix,this.inner=i.createElement("div"),this.inner.className="ace_scrollbar-inner",this.inner.textContent="\u00a0",this.element.appendChild(this.inner),e.appendChild(this.element),this.setVisible(!1),this.skipEvent=!1,s.addListener(this.element,"scroll",this.onScroll.bind(this)),s.addListener(this.element,"mousedown",s.preventDefault)};(function(){r.implement(this,o),this.setVisible=function(e){this.element.style.display=e?"":"none",this.isVisible=e,this.coeff=1}}).call(a.prototype);var f=function(e,t){a.call(this,e),this.scrollTop=0,this.scrollHeight=0,t.$scrollbarWidth=this.width=i.scrollbarWidth(e.ownerDocument),this.inner.style.width=this.element.style.width=(this.width||15)+5+"px",this.$minWidth=0};r.inherits(f,a),function(){this.classSuffix="-v",this.onScroll=function(){if(!this.skipEvent){this.scrollTop=this.element.scrollTop;if(this.coeff!=1){var e=this.element.clientHeight/this.scrollHeight;this.scrollTop=this.scrollTop*(1-e)/(this.coeff-e)}this._emit("scroll",{data:this.scrollTop})}this.skipEvent=!1},this.getWidth=function(){return Math.max(this.isVisible?this.width:0,this.$minWidth||0)},this.setHeight=function(e){this.element.style.height=e+"px"},this.setInnerHeight=this.setScrollHeight=function(e){this.scrollHeight=e,e>u?(this.coeff=u/e,e=u):this.coeff!=1&&(this.coeff=1),this.inner.style.height=e+"px"},this.setScrollTop=function(e){this.scrollTop!=e&&(this.skipEvent=!0,this.scrollTop=e,this.element.scrollTop=e*this.coeff)}}.call(f.prototype);var l=function(e,t){a.call(this,e),this.scrollLeft=0,this.height=t.$scrollbarWidth,this.inner.style.height=this.element.style.height=(this.height||15)+5+"px"};r.inherits(l,a),function(){this.classSuffix="-h",this.onScroll=function(){this.skipEvent||(this.scrollLeft=this.element.scrollLeft,this._emit("scroll",{data:this.scrollLeft})),this.skipEvent=!1},this.getHeight=function(){return this.isVisible?this.height:0},this.setWidth=function(e){this.element.style.width=e+"px"},this.setInnerWidth=function(e){this.inner.style.width=e+"px"},this.setScrollWidth=function(e){this.inner.style.width=e+"px"},this.setScrollLeft=function(e){this.scrollLeft!=e&&(this.skipEvent=!0,this.scrollLeft=this.element.scrollLeft=e)}}.call(l.prototype),t.ScrollBar=f,t.ScrollBarV=f,t.ScrollBarH=l,t.VScrollBar=f,t.HScrollBar=l}),ace.define("ace/renderloop",["require","exports","module","ace/lib/event"],function(e,t,n){"use strict";var r=e("./lib/event"),i=function(e,t){this.onRender=e,this.pending=!1,this.changes=0,this.$recursionLimit=2,this.window=t||window;var n=this;this._flush=function(e){n.pending=!1;var t=n.changes;t&&(r.blockIdle(100),n.changes=0,n.onRender(t));if(n.changes){if(n.$recursionLimit--<0)return;n.schedule()}else n.$recursionLimit=2}};(function(){this.schedule=function(e){this.changes=this.changes|e,this.changes&&!this.pending&&(r.nextFrame(this._flush),this.pending=!0)},this.clear=function(e){var t=this.changes;return this.changes=0,t}}).call(i.prototype),t.RenderLoop=i}),ace.define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,n){var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("../lib/event"),u=e("../lib/useragent"),a=e("../lib/event_emitter").EventEmitter,f=256,l=typeof ResizeObserver=="function",c=200,h=t.FontMetrics=function(e){this.el=i.createElement("div"),this.$setMeasureNodeStyles(this.el.style,!0),this.$main=i.createElement("div"),this.$setMeasureNodeStyles(this.$main.style),this.$measureNode=i.createElement("div"),this.$setMeasureNodeStyles(this.$measureNode.style),this.el.appendChild(this.$main),this.el.appendChild(this.$measureNode),e.appendChild(this.el),this.$measureNode.innerHTML=s.stringRepeat("X",f),this.$characterSize={width:0,height:0},l?this.$addObserver():this.checkForSizeChanges()};(function(){r.implement(this,a),this.$characterSize={width:0,height:0},this.$setMeasureNodeStyles=function(e,t){e.width=e.height="auto",e.left=e.top="0px",e.visibility="hidden",e.position="absolute",e.whiteSpace="pre",u.isIE<8?e["font-family"]="inherit":e.font="inherit",e.overflow=t?"hidden":"visible"},this.checkForSizeChanges=function(e){e===undefined&&(e=this.$measureSizes());if(e&&(this.$characterSize.width!==e.width||this.$characterSize.height!==e.height)){this.$measureNode.style.fontWeight="bold";var t=this.$measureSizes();this.$measureNode.style.fontWeight="",this.$characterSize=e,this.charSizes=Object.create(null),this.allowBoldFonts=t&&t.width===e.width&&t.height===e.height,this._emit("changeCharacterSize",{data:e})}},this.$addObserver=function(){var e=this;this.$observer=new window.ResizeObserver(function(t){var n=t[0].contentRect;e.checkForSizeChanges({height:n.height,width:n.width/f})}),this.$observer.observe(this.$measureNode)},this.$pollSizeChanges=function(){if(this.$pollSizeChangesTimer||this.$observer)return this.$pollSizeChangesTimer;var e=this;return this.$pollSizeChangesTimer=o.onIdle(function t(){e.checkForSizeChanges(),o.onIdle(t,500)},500)},this.setPolling=function(e){e?this.$pollSizeChanges():this.$pollSizeChangesTimer&&(clearInterval(this.$pollSizeChangesTimer),this.$pollSizeChangesTimer=0)},this.$measureSizes=function(e){var t={height:(e||this.$measureNode).clientHeight,width:(e||this.$measureNode).clientWidth/f};return t.width===0||t.height===0?null:t},this.$measureCharWidth=function(e){this.$main.innerHTML=s.stringRepeat(e,f);var t=this.$main.getBoundingClientRect();return t.width/f},this.getCharacterWidth=function(e){var t=this.charSizes[e];return t===undefined&&(t=this.charSizes[e]=this.$measureCharWidth(e)/this.$characterSize.width),t},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$observer&&this.$observer.disconnect(),this.el&&this.el.parentNode&&this.el.parentNode.removeChild(this.el)},this.$getZoom=function e(t){return t?(window.getComputedStyle(t).zoom||1)*e(t.parentElement):1},this.$initTransformMeasureNodes=function(){var e=function(e,t){return["div",{style:"position: absolute;top:"+e+"px;left:"+t+"px;"}]};this.els=i.buildDom([e(0,0),e(c,0),e(0,c),e(c,c)],this.el)},this.transformCoordinates=function(e,t){function r(e,t,n){var r=e[1]*t[0]-e[0]*t[1];return[(-t[1]*n[0]+t[0]*n[1])/r,(+e[1]*n[0]-e[0]*n[1])/r]}function i(e,t){return[e[0]-t[0],e[1]-t[1]]}function s(e,t){return[e[0]+t[0],e[1]+t[1]]}function o(e,t){return[e*t[0],e*t[1]]}function u(e){var t=e.getBoundingClientRect();return[t.left,t.top]}if(e){var n=this.$getZoom(this.el);e=o(1/n,e)}this.els||this.$initTransformMeasureNodes();var a=u(this.els[0]),f=u(this.els[1]),l=u(this.els[2]),h=u(this.els[3]),p=r(i(h,f),i(h,l),i(s(f,l),s(h,a))),d=o(1+p[0],i(f,a)),v=o(1+p[1],i(l,a));if(t){var m=t,g=p[0]*m[0]/c+p[1]*m[1]/c+1,y=s(o(m[0],d),o(m[1],v));return s(o(1/g/c,y),a)}var b=i(e,a),w=r(i(d,o(p[0],b)),i(v,o(p[1],b)),b);return o(c,w)}}).call(h.prototype)}),ace.define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter","ace/lib/useragent"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./config"),o=e("./layer/gutter").Gutter,u=e("./layer/marker").Marker,a=e("./layer/text").Text,f=e("./layer/cursor").Cursor,l=e("./scrollbar").HScrollBar,c=e("./scrollbar").VScrollBar,h=e("./renderloop").RenderLoop,p=e("./layer/font_metrics").FontMetrics,d=e("./lib/event_emitter").EventEmitter,v='.ace_br1 {border-top-left-radius : 3px;}.ace_br2 {border-top-right-radius : 3px;}.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}.ace_br4 {border-bottom-right-radius: 3px;}.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}.ace_br8 {border-bottom-left-radius : 3px;}.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_editor {position: relative;overflow: hidden;font: 12px/normal \'Monaco\', \'Menlo\', \'Ubuntu Mono\', \'Consolas\', \'source-code-pro\', monospace;direction: ltr;text-align: left;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);}.ace_scroller {position: absolute;overflow: hidden;top: 0;bottom: 0;background-color: inherit;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;cursor: text;}.ace_content {position: absolute;box-sizing: border-box;min-width: 100%;contain: style size layout;}.ace_dragging .ace_scroller:before{position: absolute;top: 0;left: 0;right: 0;bottom: 0;content: \'\';background: rgba(250, 250, 250, 0.01);z-index: 1000;}.ace_dragging.ace_dark .ace_scroller:before{background: rgba(0, 0, 0, 0.01);}.ace_selecting, .ace_selecting * {cursor: text !important;}.ace_gutter {position: absolute;overflow : hidden;width: auto;top: 0;bottom: 0;left: 0;cursor: default;z-index: 4;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;contain: style size layout;}.ace_gutter-active-line {position: absolute;left: 0;right: 0;}.ace_scroller.ace_scroll-left {box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;}.ace_gutter-cell {position: absolute;top: 0;left: 0;right: 0;padding-left: 19px;padding-right: 6px;background-repeat: no-repeat;}.ace_gutter-cell.ace_error {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: 2px center;}.ace_gutter-cell.ace_warning {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");background-position: 2px center;}.ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");background-position: 2px center;}.ace_dark .ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC");}.ace_scrollbar {contain: strict;position: absolute;right: 0;bottom: 0;z-index: 6;}.ace_scrollbar-inner {position: absolute;cursor: text;left: 0;top: 0;}.ace_scrollbar-v{overflow-x: hidden;overflow-y: scroll;top: 0;}.ace_scrollbar-h {overflow-x: scroll;overflow-y: hidden;left: 0;}.ace_print-margin {position: absolute;height: 100%;}.ace_text-input {position: absolute;z-index: 0;width: 0.5em;height: 1em;opacity: 0;background: transparent;-moz-appearance: none;appearance: none;border: none;resize: none;outline: none;overflow: hidden;font: inherit;padding: 0 1px;margin: 0 -1px;contain: strict;-ms-user-select: text;-moz-user-select: text;-webkit-user-select: text;user-select: text;white-space: pre!important;}.ace_text-input.ace_composition {background: transparent;color: inherit;z-index: 1000;opacity: 1;}.ace_composition_placeholder { color: transparent }.ace_composition_marker { border-bottom: 1px solid;position: absolute;border-radius: 0;margin-top: 1px;}[ace_nocontext=true] {transform: none!important;filter: none!important;perspective: none!important;clip-path: none!important;mask : none!important;contain: none!important;perspective: none!important;mix-blend-mode: initial!important;z-index: auto;}.ace_layer {z-index: 1;position: absolute;overflow: hidden;word-wrap: normal;white-space: pre;height: 100%;width: 100%;box-sizing: border-box;pointer-events: none;}.ace_gutter-layer {position: relative;width: auto;text-align: right;pointer-events: auto;height: 1000000px;contain: style size layout;}.ace_text-layer {font: inherit !important;position: absolute;height: 1000000px;width: 1000000px;contain: style size layout;}.ace_text-layer > .ace_line, .ace_text-layer > .ace_line_group {contain: style size layout;position: absolute;top: 0;left: 0;right: 0;}.ace_hidpi .ace_text-layer,.ace_hidpi .ace_gutter-layer,.ace_hidpi .ace_content,.ace_hidpi .ace_gutter {contain: strict;will-change: transform;}.ace_hidpi .ace_text-layer > .ace_line, .ace_hidpi .ace_text-layer > .ace_line_group {contain: strict;}.ace_cjk {display: inline-block;text-align: center;}.ace_cursor-layer {z-index: 4;}.ace_cursor {z-index: 4;position: absolute;box-sizing: border-box;border-left: 2px solid;transform: translatez(0);}.ace_multiselect .ace_cursor {border-left-width: 1px;}.ace_slim-cursors .ace_cursor {border-left-width: 1px;}.ace_overwrite-cursors .ace_cursor {border-left-width: 0;border-bottom: 1px solid;}.ace_hidden-cursors .ace_cursor {opacity: 0.2;}.ace_smooth-blinking .ace_cursor {transition: opacity 0.18s;}.ace_animate-blinking .ace_cursor {animation-duration: 1000ms;animation-timing-function: step-end;animation-name: blink-ace-animate;animation-iteration-count: infinite;}.ace_animate-blinking.ace_smooth-blinking .ace_cursor {animation-duration: 1000ms;animation-timing-function: ease-in-out;animation-name: blink-ace-animate-smooth;}@keyframes blink-ace-animate {from, to { opacity: 1; }60% { opacity: 0; }}@keyframes blink-ace-animate-smooth {from, to { opacity: 1; }45% { opacity: 1; }60% { opacity: 0; }85% { opacity: 0; }}.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {position: absolute;z-index: 3;}.ace_marker-layer .ace_selection {position: absolute;z-index: 5;}.ace_marker-layer .ace_bracket {position: absolute;z-index: 6;}.ace_marker-layer .ace_active-line {position: absolute;z-index: 2;}.ace_marker-layer .ace_selected-word {position: absolute;z-index: 4;box-sizing: border-box;}.ace_line .ace_fold {box-sizing: border-box;display: inline-block;height: 11px;margin-top: -2px;vertical-align: middle;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");background-repeat: no-repeat, repeat-x;background-position: center center, top left;color: transparent;border: 1px solid black;border-radius: 2px;cursor: pointer;pointer-events: auto;}.ace_dark .ace_fold {}.ace_fold:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC");}.ace_tooltip {background-color: #FFF;background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));border: 1px solid gray;border-radius: 1px;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);color: black;max-width: 100%;padding: 3px 4px;position: fixed;z-index: 999999;box-sizing: border-box;cursor: default;white-space: pre;word-wrap: break-word;line-height: normal;font-style: normal;font-weight: normal;letter-spacing: normal;pointer-events: none;}.ace_folding-enabled > .ace_gutter-cell {padding-right: 13px;}.ace_fold-widget {box-sizing: border-box;margin: 0 -12px 0 1px;display: none;width: 11px;vertical-align: top;background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: center;border-radius: 3px;border: 1px solid transparent;cursor: pointer;}.ace_folding-enabled .ace_fold-widget {display: inline-block; }.ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==");}.ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==");}.ace_fold-widget:hover {border: 1px solid rgba(0, 0, 0, 0.3);background-color: rgba(255, 255, 255, 0.2);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);}.ace_fold-widget:active {border: 1px solid rgba(0, 0, 0, 0.4);background-color: rgba(0, 0, 0, 0.05);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);}.ace_dark .ace_fold-widget {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC");}.ace_dark .ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget:hover {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);background-color: rgba(255, 255, 255, 0.1);}.ace_dark .ace_fold-widget:active {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);}.ace_inline_button {border: 1px solid lightgray;display: inline-block;margin: -1px 8px;padding: 0 5px;pointer-events: auto;cursor: pointer;}.ace_inline_button:hover {border-color: gray;background: rgba(200,200,200,0.2);display: inline-block;pointer-events: auto;}.ace_fold-widget.ace_invalid {background-color: #FFB4B4;border-color: #DE5555;}.ace_fade-fold-widgets .ace_fold-widget {transition: opacity 0.4s ease 0.05s;opacity: 0;}.ace_fade-fold-widgets:hover .ace_fold-widget {transition: opacity 0.05s ease 0.05s;opacity:1;}.ace_underline {text-decoration: underline;}.ace_bold {font-weight: bold;}.ace_nobold .ace_bold {font-weight: normal;}.ace_italic {font-style: italic;}.ace_error-marker {background-color: rgba(255, 0, 0,0.2);position: absolute;z-index: 9;}.ace_highlight-marker {background-color: rgba(255, 255, 0,0.2);position: absolute;z-index: 8;}.ace_mobile-menu {position: absolute;line-height: 1.5;border-radius: 4px;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;background: white;box-shadow: 1px 3px 2px grey;border: 1px solid #dcdcdc;color: black;}.ace_dark > .ace_mobile-menu {background: #333;color: #ccc;box-shadow: 1px 3px 2px grey;border: 1px solid #444;}.ace_mobile-button {padding: 2px;cursor: pointer;overflow: hidden;}.ace_mobile-button:hover {background-color: #eee;opacity:1;}.ace_mobile-button:active {background-color: #ddd;}',m=e("./lib/useragent"),g=m.isIE;i.importCssString(v,"ace_editor.css");var y=function(e,t){var n=this;this.container=e||i.createElement("div"),i.addCssClass(this.container,"ace_editor"),i.HI_DPI&&i.addCssClass(this.container,"ace_hidpi"),this.setTheme(t),this.$gutter=i.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.$gutter.setAttribute("aria-hidden",!0),this.scroller=i.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=i.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new o(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onGutterResize.bind(this)),this.$markerBack=new u(this.content);var r=this.$textLayer=new a(this.content);this.canvas=r.element,this.$markerFront=new u(this.content),this.$cursorLayer=new f(this.content),this.$horizScroll=!1,this.$vScroll=!1,this.scrollBar=this.scrollBarV=new c(this.container,this),this.scrollBarH=new l(this.container,this),this.scrollBarV.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollTop(e.data-n.scrollMargin.top)}),this.scrollBarH.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollLeft(e.data-n.scrollMargin.left)}),this.scrollTop=0,this.scrollLeft=0,this.cursorPos={row:0,column:0},this.$fontMetrics=new p(this.container),this.$textLayer.$setFontMetrics(this.$fontMetrics),this.$textLayer.addEventListener("changeCharacterSize",function(e){n.updateCharacterSize(),n.onResize(!0,n.gutterWidth,n.$size.width,n.$size.height),n._signal("changeCharacterSize",e)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0,$dirty:!0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:0,characterWidth:0,minHeight:1,maxHeight:1,offset:0,height:1,gutterOffset:1},this.scrollMargin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.margin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.$keepTextAreaAtCursor=!m.isIOS,this.$loop=new h(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.updateCharacterSize(),this.setPadding(4),s.resetOptions(this),s._signal("renderer",this)};(function(){this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,r.implement(this,d),this.updateCharacterSize=function(){this.$textLayer.allowBoldFonts!=this.$allowBoldFonts&&(this.$allowBoldFonts=this.$textLayer.allowBoldFonts,this.setStyle("ace_nobold",!this.$allowBoldFonts)),this.layerConfig.characterWidth=this.characterWidth=this.$textLayer.getCharacterWidth(),this.layerConfig.lineHeight=this.lineHeight=this.$textLayer.getLineHeight(),this.$updatePrintMargin(),i.setStyle(this.scroller.style,"line-height",this.lineHeight+"px")},this.setSession=function(e){this.session&&this.session.doc.off("changeNewLineMode",this.onChangeNewLineMode),this.session=e,e&&this.scrollMargin.top&&e.getScrollTop()<=0&&e.setScrollTop(-this.scrollMargin.top),this.$cursorLayer.setSession(e),this.$markerBack.setSession(e),this.$markerFront.setSession(e),this.$gutterLayer.setSession(e),this.$textLayer.setSession(e);if(!e)return;this.$loop.schedule(this.CHANGE_FULL),this.session.$setFontMetrics(this.$fontMetrics),this.scrollBarH.scrollLeft=this.scrollBarV.scrollTop=null,this.onChangeNewLineMode=this.onChangeNewLineMode.bind(this),this.onChangeNewLineMode(),this.session.doc.on("changeNewLineMode",this.onChangeNewLineMode)},this.updateLines=function(e,t,n){t===undefined&&(t=Infinity),this.$changedLines?(this.$changedLines.firstRow>e&&(this.$changedLines.firstRow=e),this.$changedLines.lastRowthis.layerConfig.lastRow)return;this.$loop.schedule(this.CHANGE_LINES)},this.onChangeNewLineMode=function(){this.$loop.schedule(this.CHANGE_TEXT),this.$textLayer.$updateEolChar(),this.session.$bidiHandler.setEolChar(this.$textLayer.EOL_CHAR)},this.onChangeTabSize=function(){this.$loop.schedule(this.CHANGE_TEXT|this.CHANGE_MARKER),this.$textLayer.onChangeTabSize()},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(e){e?this.$renderChanges(this.CHANGE_FULL,!0):this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.$changes=0,this.$updateSizeAsync=function(){this.$loop.pending?this.$size.$dirty=!0:this.onResize()},this.onResize=function(e,t,n,r){if(this.resizing>2)return;this.resizing>0?this.resizing++:this.resizing=e?1:0;var i=this.container;r||(r=i.clientHeight||i.scrollHeight),n||(n=i.clientWidth||i.scrollWidth);var s=this.$updateCachedSize(e,t,n,r);if(!this.$size.scrollerHeight||!n&&!r)return this.resizing=0;e&&(this.$gutterLayer.$padding=null),e?this.$renderChanges(s|this.$changes,!0):this.$loop.schedule(s|this.$changes),this.resizing&&(this.resizing=0),this.scrollBarV.scrollLeft=this.scrollBarV.scrollTop=null},this.$updateCachedSize=function(e,t,n,r){r-=this.$extraHeight||0;var s=0,o=this.$size,u={width:o.width,height:o.height,scrollerHeight:o.scrollerHeight,scrollerWidth:o.scrollerWidth};r&&(e||o.height!=r)&&(o.height=r,s|=this.CHANGE_SIZE,o.scrollerHeight=o.height,this.$horizScroll&&(o.scrollerHeight-=this.scrollBarH.getHeight()),this.scrollBarV.element.style.bottom=this.scrollBarH.getHeight()+"px",s|=this.CHANGE_SCROLL);if(n&&(e||o.width!=n)){s|=this.CHANGE_SIZE,o.width=n,t==null&&(t=this.$showGutter?this.$gutter.offsetWidth:0),this.gutterWidth=t,i.setStyle(this.scrollBarH.element.style,"left",t+"px"),i.setStyle(this.scroller.style,"left",t+this.margin.left+"px"),o.scrollerWidth=Math.max(0,n-t-this.scrollBarV.getWidth()-this.margin.h),i.setStyle(this.$gutter.style,"left",this.margin.left+"px");var a=this.scrollBarV.getWidth()+"px";i.setStyle(this.scrollBarH.element.style,"right",a),i.setStyle(this.scroller.style,"right",a),i.setStyle(this.scroller.style,"bottom",this.scrollBarH.getHeight());if(this.session&&this.session.getUseWrapMode()&&this.adjustWrapLimit()||e)s|=this.CHANGE_FULL}return o.$dirty=!n||!r,s&&this._signal("resize",u),s},this.onGutterResize=function(e){var t=this.$showGutter?e:0;t!=this.gutterWidth&&(this.$changes|=this.$updateCachedSize(!0,t,this.$size.width,this.$size.height)),this.session.getUseWrapMode()&&this.adjustWrapLimit()?this.$loop.schedule(this.CHANGE_FULL):this.$size.$dirty?this.$loop.schedule(this.CHANGE_FULL):this.$computeLayerConfig()},this.adjustWrapLimit=function(){var e=this.$size.scrollerWidth-this.$padding*2,t=Math.floor(e/this.characterWidth);return this.session.adjustWrapLimit(t,this.$showPrintMargin&&this.$printMarginColumn)},this.setAnimatedScroll=function(e){this.setOption("animatedScroll",e)},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(e){this.setOption("showInvisibles",e),this.session.$bidiHandler.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.getOption("showInvisibles")},this.getDisplayIndentGuides=function(){return this.getOption("displayIndentGuides")},this.setDisplayIndentGuides=function(e){this.setOption("displayIndentGuides",e)},this.setShowPrintMargin=function(e){this.setOption("showPrintMargin",e)},this.getShowPrintMargin=function(){return this.getOption("showPrintMargin")},this.setPrintMarginColumn=function(e){this.setOption("printMarginColumn",e)},this.getPrintMarginColumn=function(){return this.getOption("printMarginColumn")},this.getShowGutter=function(){return this.getOption("showGutter")},this.setShowGutter=function(e){return this.setOption("showGutter",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.$updatePrintMargin=function(){if(!this.$showPrintMargin&&!this.$printMarginEl)return;if(!this.$printMarginEl){var e=i.createElement("div");e.className="ace_layer ace_print-margin-layer",this.$printMarginEl=i.createElement("div"),this.$printMarginEl.className="ace_print-margin",e.appendChild(this.$printMarginEl),this.content.insertBefore(e,this.content.firstChild)}var t=this.$printMarginEl.style;t.left=Math.round(this.characterWidth*this.$printMarginColumn+this.$padding)+"px",t.visibility=this.$showPrintMargin?"visible":"hidden",this.session&&this.session.$wrap==-1&&this.adjustWrapLimit()},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.scroller},this.getTextAreaContainer=function(){return this.container},this.$moveTextAreaToCursor=function(){if(this.$isMousePressed)return;var e=this.textarea.style,t=this.$composition;if(!this.$keepTextAreaAtCursor&&!t){i.translate(this.textarea,-100,0);return}var n=this.$cursorLayer.$pixelPos;if(!n)return;t&&t.markerRange&&(n=this.$cursorLayer.getPixelPosition(t.markerRange.start,!0));var r=this.layerConfig,s=n.top,o=n.left;s-=r.offset;var u=t&&t.useTextareaForIME?this.lineHeight:g?0:1;if(s<0||s>r.height-u){i.translate(this.textarea,0,0);return}var a=1,f=this.$size.height-u;if(!t)s+=this.lineHeight;else if(t.useTextareaForIME){var l=this.textarea.value;a=this.characterWidth*this.session.$getStringScreenWidth(l)[0],u+=2}else s+=this.lineHeight+2;o-=this.scrollLeft,o>this.$size.scrollerWidth-a&&(o=this.$size.scrollerWidth-a),o+=this.gutterWidth+this.margin.left,i.setStyle(e,"height",u+"px"),i.setStyle(e,"width",a+"px"),i.translate(this.textarea,Math.min(o,this.$size.scrollerWidth-a),Math.min(s,f))},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(this.layerConfig.offset===0?0:1)},this.getLastFullyVisibleRow=function(){var e=this.layerConfig,t=e.lastRow,n=this.session.documentToScreenRow(t,0)*e.lineHeight;return n-this.session.getScrollTop()>e.height-e.lineHeight?t-1:t},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(e){this.$padding=e,this.$textLayer.setPadding(e),this.$cursorLayer.setPadding(e),this.$markerFront.setPadding(e),this.$markerBack.setPadding(e),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.setScrollMargin=function(e,t,n,r){var i=this.scrollMargin;i.top=e|0,i.bottom=t|0,i.right=r|0,i.left=n|0,i.v=i.top+i.bottom,i.h=i.left+i.right,i.top&&this.scrollTop<=0&&this.session&&this.session.setScrollTop(-i.top),this.updateFull()},this.setMargin=function(e,t,n,r){var i=this.margin;i.top=e|0,i.bottom=t|0,i.right=r|0,i.left=n|0,i.v=i.top+i.bottom,i.h=i.left+i.right,this.$updateCachedSize(!0,this.gutterWidth,this.$size.width,this.$size.height),this.updateFull()},this.getHScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible},this.setHScrollBarAlwaysVisible=function(e){this.setOption("hScrollBarAlwaysVisible",e)},this.getVScrollBarAlwaysVisible=function(){return this.$vScrollBarAlwaysVisible},this.setVScrollBarAlwaysVisible=function(e){this.setOption("vScrollBarAlwaysVisible",e)},this.$updateScrollBarV=function(){var e=this.layerConfig.maxHeight,t=this.$size.scrollerHeight;!this.$maxLines&&this.$scrollPastEnd&&(e-=(t-this.lineHeight)*this.$scrollPastEnd,this.scrollTop>e-t&&(e=this.scrollTop+t,this.scrollBarV.scrollTop=null)),this.scrollBarV.setScrollHeight(e+this.scrollMargin.v),this.scrollBarV.setScrollTop(this.scrollTop+this.scrollMargin.top)},this.$updateScrollBarH=function(){this.scrollBarH.setScrollWidth(this.layerConfig.width+2*this.$padding+this.scrollMargin.h),this.scrollBarH.setScrollLeft(this.scrollLeft+this.scrollMargin.left)},this.$frozen=!1,this.freeze=function(){this.$frozen=!0},this.unfreeze=function(){this.$frozen=!1},this.$renderChanges=function(e,t){this.$changes&&(e|=this.$changes,this.$changes=0);if(!this.session||!this.container.offsetWidth||this.$frozen||!e&&!t){this.$changes|=e;return}if(this.$size.$dirty)return this.$changes|=e,this.onResize(!0);this.lineHeight||this.$textLayer.checkForSizeChanges(),this._signal("beforeRender"),this.session&&this.session.$bidiHandler&&this.session.$bidiHandler.updateCharacterWidths(this.$fontMetrics);var n=this.layerConfig;if(e&this.CHANGE_FULL||e&this.CHANGE_SIZE||e&this.CHANGE_TEXT||e&this.CHANGE_LINES||e&this.CHANGE_SCROLL||e&this.CHANGE_H_SCROLL){e|=this.$computeLayerConfig()|this.$loop.clear();if(n.firstRow!=this.layerConfig.firstRow&&n.firstRowScreen==this.layerConfig.firstRowScreen){var r=this.scrollTop+(n.firstRow-this.layerConfig.firstRow)*this.lineHeight;r>0&&(this.scrollTop=r,e|=this.CHANGE_SCROLL,e|=this.$computeLayerConfig()|this.$loop.clear())}n=this.layerConfig,this.$updateScrollBarV(),e&this.CHANGE_H_SCROLL&&this.$updateScrollBarH(),i.translate(this.content,-this.scrollLeft,-n.offset);var s=n.width+2*this.$padding+"px",o=n.minHeight+"px";i.setStyle(this.content.style,"width",s),i.setStyle(this.content.style,"height",o)}e&this.CHANGE_H_SCROLL&&(i.translate(this.content,-this.scrollLeft,-n.offset),this.scroller.className=this.scrollLeft<=0?"ace_scroller":"ace_scroller ace_scroll-left");if(e&this.CHANGE_FULL){this.$changedLines=null,this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this._signal("afterRender");return}if(e&this.CHANGE_SCROLL){this.$changedLines=null,e&this.CHANGE_TEXT||e&this.CHANGE_LINES?this.$textLayer.update(n):this.$textLayer.scrollLines(n),this.$showGutter&&(e&this.CHANGE_GUTTER||e&this.CHANGE_LINES?this.$gutterLayer.update(n):this.$gutterLayer.scrollLines(n)),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this._signal("afterRender");return}e&this.CHANGE_TEXT?(this.$changedLines=null,this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n)):e&this.CHANGE_LINES?(this.$updateLines()||e&this.CHANGE_GUTTER&&this.$showGutter)&&this.$gutterLayer.update(n):e&this.CHANGE_TEXT||e&this.CHANGE_GUTTER?this.$showGutter&&this.$gutterLayer.update(n):e&this.CHANGE_CURSOR&&this.$highlightGutterLine&&this.$gutterLayer.updateLineHighlight(n),e&this.CHANGE_CURSOR&&(this.$cursorLayer.update(n),this.$moveTextAreaToCursor()),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(n),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(n),this._signal("afterRender")},this.$autosize=function(){var e=this.session.getScreenLength()*this.lineHeight,t=this.$maxLines*this.lineHeight,n=Math.min(t,Math.max((this.$minLines||1)*this.lineHeight,e))+this.scrollMargin.v+(this.$extraHeight||0);this.$horizScroll&&(n+=this.scrollBarH.getHeight()),this.$maxPixelHeight&&n>this.$maxPixelHeight&&(n=this.$maxPixelHeight);var r=n<=2*this.lineHeight,i=!r&&e>t;if(n!=this.desiredHeight||this.$size.height!=this.desiredHeight||i!=this.$vScroll){i!=this.$vScroll&&(this.$vScroll=i,this.scrollBarV.setVisible(i));var s=this.container.clientWidth;this.container.style.height=n+"px",this.$updateCachedSize(!0,this.$gutterWidth,s,n),this.desiredHeight=n,this._signal("autosize")}},this.$computeLayerConfig=function(){var e=this.session,t=this.$size,n=t.height<=2*this.lineHeight,r=this.session.getScreenLength(),i=r*this.lineHeight,s=this.$getLongestLine(),o=!n&&(this.$hScrollBarAlwaysVisible||t.scrollerWidth-s-2*this.$padding<0),u=this.$horizScroll!==o;u&&(this.$horizScroll=o,this.scrollBarH.setVisible(o));var a=this.$vScroll;this.$maxLines&&this.lineHeight>1&&this.$autosize();var f=t.scrollerHeight+this.lineHeight,l=!this.$maxLines&&this.$scrollPastEnd?(t.scrollerHeight-this.lineHeight)*this.$scrollPastEnd:0;i+=l;var c=this.scrollMargin;this.session.setScrollTop(Math.max(-c.top,Math.min(this.scrollTop,i-t.scrollerHeight+c.bottom))),this.session.setScrollLeft(Math.max(-c.left,Math.min(this.scrollLeft,s+2*this.$padding-t.scrollerWidth+c.right)));var h=!n&&(this.$vScrollBarAlwaysVisible||t.scrollerHeight-i+l<0||this.scrollTop>c.top),p=a!==h;p&&(this.$vScroll=h,this.scrollBarV.setVisible(h));var d=this.scrollTop%this.lineHeight,v=Math.ceil(f/this.lineHeight)-1,m=Math.max(0,Math.round((this.scrollTop-d)/this.lineHeight)),g=m+v,y,b,w=this.lineHeight;m=e.screenToDocumentRow(m,0);var E=e.getFoldLine(m);E&&(m=E.start.row),y=e.documentToScreenRow(m,0),b=e.getRowLength(m)*w,g=Math.min(e.screenToDocumentRow(g,0),e.getLength()-1),f=t.scrollerHeight+e.getRowLength(g)*w+b,d=this.scrollTop-y*w;var S=0;if(this.layerConfig.width!=s||u)S=this.CHANGE_H_SCROLL;if(u||p)S|=this.$updateCachedSize(!0,this.gutterWidth,t.width,t.height),this._signal("scrollbarVisibilityChanged"),p&&(s=this.$getLongestLine());return this.layerConfig={width:s,padding:this.$padding,firstRow:m,firstRowScreen:y,lastRow:g,lineHeight:w,characterWidth:this.characterWidth,minHeight:f,maxHeight:i,offset:d,gutterOffset:w?Math.max(0,Math.ceil((d+t.height-t.scrollerHeight)/w)):0,height:this.$size.scrollerHeight},this.session.$bidiHandler&&this.session.$bidiHandler.setContentWidth(s-this.$padding),S},this.$updateLines=function(){if(!this.$changedLines)return;var e=this.$changedLines.firstRow,t=this.$changedLines.lastRow;this.$changedLines=null;var n=this.layerConfig;if(e>n.lastRow+1)return;if(tthis.$textLayer.MAX_LINE_LENGTH&&(e=this.$textLayer.MAX_LINE_LENGTH+30),Math.max(this.$size.scrollerWidth-2*this.$padding,Math.round(e*this.characterWidth))},this.updateFrontMarkers=function(){this.$markerFront.setMarkers(this.session.getMarkers(!0)),this.$loop.schedule(this.CHANGE_MARKER_FRONT)},this.updateBackMarkers=function(){this.$markerBack.setMarkers(this.session.getMarkers()),this.$loop.schedule(this.CHANGE_MARKER_BACK)},this.addGutterDecoration=function(e,t){this.$gutterLayer.addGutterDecoration(e,t)},this.removeGutterDecoration=function(e,t){this.$gutterLayer.removeGutterDecoration(e,t)},this.updateBreakpoints=function(e){this.$loop.schedule(this.CHANGE_GUTTER)},this.setAnnotations=function(e){this.$gutterLayer.setAnnotations(e),this.$loop.schedule(this.CHANGE_GUTTER)},this.updateCursor=function(){this.$loop.schedule(this.CHANGE_CURSOR)},this.hideCursor=function(){this.$cursorLayer.hideCursor()},this.showCursor=function(){this.$cursorLayer.showCursor()},this.scrollSelectionIntoView=function(e,t,n){this.scrollCursorIntoView(e,n),this.scrollCursorIntoView(t,n)},this.scrollCursorIntoView=function(e,t,n){if(this.$size.scrollerHeight===0)return;var r=this.$cursorLayer.getPixelPosition(e),i=r.left,s=r.top,o=n&&n.top||0,u=n&&n.bottom||0,a=this.$scrollAnimation?this.session.getScrollTop():this.scrollTop;a+o>s?(t&&a+o>s+this.lineHeight&&(s-=t*this.$size.scrollerHeight),s===0&&(s=-this.scrollMargin.top),this.session.setScrollTop(s)):a+this.$size.scrollerHeight-ui?(i=1-this.scrollMargin.top)return!0;if(t>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight<-1+this.scrollMargin.bottom)return!0;if(e<0&&this.session.getScrollLeft()>=1-this.scrollMargin.left)return!0;if(e>0&&this.session.getScrollLeft()+this.$size.scrollerWidth-this.layerConfig.width<-1+this.scrollMargin.right)return!0},this.pixelToScreenCoordinates=function(e,t){var n;if(this.$hasCssTransforms){n={top:0,left:0};var r=this.$fontMetrics.transformCoordinates([e,t]);e=r[1]-this.gutterWidth-this.margin.left,t=r[0]}else n=this.scroller.getBoundingClientRect();var i=e+this.scrollLeft-n.left-this.$padding,s=i/this.characterWidth,o=Math.floor((t+this.scrollTop-n.top)/this.lineHeight),u=this.$blockCursor?Math.floor(s):Math.round(s);return{row:o,column:u,side:s-u>0?1:-1,offsetX:i}},this.screenToTextCoordinates=function(e,t){var n;if(this.$hasCssTransforms){n={top:0,left:0};var r=this.$fontMetrics.transformCoordinates([e,t]);e=r[1]-this.gutterWidth-this.margin.left,t=r[0]}else n=this.scroller.getBoundingClientRect();var i=e+this.scrollLeft-n.left-this.$padding,s=i/this.characterWidth,o=this.$blockCursor?Math.floor(s):Math.round(s),u=Math.floor((t+this.scrollTop-n.top)/this.lineHeight);return this.session.screenToDocumentPosition(u,Math.max(o,0),i)},this.textToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=this.session.documentToScreenPosition(e,t),i=this.$padding+(this.session.$bidiHandler.isBidiRow(r.row,e)?this.session.$bidiHandler.getPosLeft(r.column):Math.round(r.column*this.characterWidth)),s=r.row*this.lineHeight;return{pageX:n.left+i-this.scrollLeft,pageY:n.top+s-this.scrollTop}},this.visualizeFocus=function(){i.addCssClass(this.container,"ace_focus")},this.visualizeBlur=function(){i.removeCssClass(this.container,"ace_focus")},this.showComposition=function(e){this.$composition=e,e.cssText||(e.cssText=this.textarea.style.cssText),e.useTextareaForIME=this.$useTextareaForIME,this.$useTextareaForIME?(i.addCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText="",this.$moveTextAreaToCursor(),this.$cursorLayer.element.style.display="none"):e.markerId=this.session.addMarker(e.markerRange,"ace_composition_marker","text")},this.setCompositionText=function(e){var t=this.session.selection.cursor;this.addToken(e,"composition_placeholder",t.row,t.column),this.$moveTextAreaToCursor()},this.hideComposition=function(){if(!this.$composition)return;this.$composition.markerId&&this.session.removeMarker(this.$composition.markerId),i.removeCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText=this.$composition.cssText,this.$composition=null,this.$cursorLayer.element.style.display=""},this.addToken=function(e,t,n,r){var i=this.session;i.bgTokenizer.lines[n]=null;var s={type:t,value:e},o=i.getTokens(n);if(r==null)o.push(s);else{var u=0;for(var a=0;a50&&e.length>this.$doc.getLength()>>1?this.call("setValue",[this.$doc.getValue()]):this.emit("change",{data:e})}}).call(f.prototype);var l=function(e,t,n){var r=null,i=!1,u=Object.create(s),a=[],l=new f({messageBuffer:a,terminate:function(){},postMessage:function(e){a.push(e);if(!r)return;i?setTimeout(c):c()}});l.setEmitSync=function(e){i=e};var c=function(){var e=a.shift();e.command?r[e.command].apply(r,e.args):e.event&&u._signal(e.event,e.data)};return u.postMessage=function(e){l.onMessage({data:e})},u.callback=function(e,t){this.postMessage({type:"call",id:t,data:e})},u.emit=function(e,t){this.postMessage({type:"event",name:e,data:t})},o.loadModule(["worker",t],function(e){r=new e[n](u);while(a.length)c()}),l};t.UIWorkerClient=l,t.WorkerClient=f,t.createWorker=a}),ace.define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],function(e,t,n){"use strict";var r=e("./range").Range,i=e("./lib/event_emitter").EventEmitter,s=e("./lib/oop"),o=function(e,t,n,r,i,s){var o=this;this.length=t,this.session=e,this.doc=e.getDocument(),this.mainClass=i,this.othersClass=s,this.$onUpdate=this.onUpdate.bind(this),this.doc.on("change",this.$onUpdate),this.$others=r,this.$onCursorChange=function(){setTimeout(function(){o.onCursorChange()})},this.$pos=n;var u=e.getUndoManager().$undoStack||e.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=u.length,this.setup(),e.selection.on("changeCursor",this.$onCursorChange)};(function(){s.implement(this,i),this.setup=function(){var e=this,t=this.doc,n=this.session;this.selectionBefore=n.selection.toJSON(),n.selection.inMultiSelectMode&&n.selection.toSingleRange(),this.pos=t.createAnchor(this.$pos.row,this.$pos.column);var i=this.pos;i.$insertRight=!0,i.detach(),i.markerId=n.addMarker(new r(i.row,i.column,i.row,i.column+this.length),this.mainClass,null,!1),this.others=[],this.$others.forEach(function(n){var r=t.createAnchor(n.row,n.column);r.$insertRight=!0,r.detach(),e.others.push(r)}),n.setUndoSelect(!1)},this.showOtherMarkers=function(){if(this.othersActive)return;var e=this.session,t=this;this.othersActive=!0,this.others.forEach(function(n){n.markerId=e.addMarker(new r(n.row,n.column,n.row,n.column+t.length),t.othersClass,null,!1)})},this.hideOtherMarkers=function(){if(!this.othersActive)return;this.othersActive=!1;for(var e=0;e=this.pos.column&&t.start.column<=this.pos.column+this.length+1,s=t.start.column-this.pos.column;this.updateAnchors(e),i&&(this.length+=n);if(i&&!this.session.$fromUndo)if(e.action==="insert")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.insertMergedLines(a,e.lines)}else if(e.action==="remove")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.remove(new r(a.row,a.column,a.row,a.column-n))}this.$updating=!1,this.updateMarkers()},this.updateAnchors=function(e){this.pos.onChange(e);for(var t=this.others.length;t--;)this.others[t].onChange(e);this.updateMarkers()},this.updateMarkers=function(){if(this.$updating)return;var e=this,t=this.session,n=function(n,i){t.removeMarker(n.markerId),n.markerId=t.addMarker(new r(n.row,n.column,n.row,n.column+e.length),i,null,!1)};n(this.pos,this.mainClass);for(var i=this.others.length;i--;)n(this.others[i],this.othersClass)},this.onCursorChange=function(e){if(this.$updating||!this.session)return;var t=this.session.selection.getCursor();t.row===this.pos.row&&t.column>=this.pos.column&&t.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit("cursorEnter",e)):(this.hideOtherMarkers(),this._emit("cursorLeave",e))},this.detach=function(){this.session.removeMarker(this.pos&&this.pos.markerId),this.hideOtherMarkers(),this.doc.removeEventListener("change",this.$onUpdate),this.session.selection.removeEventListener("changeCursor",this.$onCursorChange),this.session.setUndoSelect(!0),this.session=null},this.cancel=function(){if(this.$undoStackDepth===-1)return;var e=this.session.getUndoManager(),t=(e.$undoStack||e.$undostack).length-this.$undoStackDepth;for(var n=0;n1&&!this.inMultiSelectMode&&(this._signal("multiSelect"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session)),t||this.fromOrientedRange(e)},this.toSingleRange=function(e){e=e||this.ranges[0];var t=this.rangeList.removeAll();t.length&&this.$onRemoveRange(t),e&&this.fromOrientedRange(e)},this.substractPoint=function(e){var t=this.rangeList.substractPoint(e);if(t)return this.$onRemoveRange(t),t[0]},this.mergeOverlappingRanges=function(){var e=this.rangeList.merge();e.length&&this.$onRemoveRange(e)},this.$onAddRange=function(e){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(e),this._signal("addRange",{range:e})},this.$onRemoveRange=function(e){this.rangeCount=this.rangeList.ranges.length;if(this.rangeCount==1&&this.inMultiSelectMode){var t=this.rangeList.ranges.pop();e.push(t),this.rangeCount=0}for(var n=e.length;n--;){var r=this.ranges.indexOf(e[n]);this.ranges.splice(r,1)}this._signal("removeRange",{ranges:e}),this.rangeCount===0&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._signal("singleSelect"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),t=t||this.ranges[0],t&&!t.isEqual(this.getRange())&&this.fromOrientedRange(t)},this.$initRangeList=function(){if(this.rangeList)return;this.rangeList=new r,this.ranges=[],this.rangeCount=0},this.getAllRanges=function(){return this.rangeCount?this.rangeList.ranges.concat():[this.getRange()]},this.splitIntoLines=function(){if(this.rangeCount>1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var n=this.getRange(),r=this.isBackwards(),s=n.start.row,o=n.end.row;if(s==o){if(r)var u=n.end,a=n.start;else var u=n.start,a=n.end;this.addRange(i.fromPoints(a,a)),this.addRange(i.fromPoints(u,u));return}var f=[],l=this.getLineRange(s,!0);l.start.column=n.start.column,f.push(l);for(var c=s+1;c1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var r=this.session.documentToScreenPosition(this.cursor),s=this.session.documentToScreenPosition(this.anchor),o=this.rectangularRangeBlock(r,s);o.forEach(this.addRange,this)}},this.rectangularRangeBlock=function(e,t,n){var r=[],s=e.column0)g--;if(g>0){var y=0;while(r[y].isEmpty())y++}for(var b=g;b>=y;b--)r[b].isEmpty()&&r.splice(b,1)}return r}}.call(s.prototype);var d=e("./editor").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(e){e.cursor||(e.cursor=e.end);var t=this.getSelectionStyle();return e.marker=this.session.addMarker(e,"ace_selection",t),this.session.$selectionMarkers.push(e),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,e},this.removeSelectionMarker=function(e){if(!e.marker)return;this.session.removeMarker(e.marker);var t=this.session.$selectionMarkers.indexOf(e);t!=-1&&this.session.$selectionMarkers.splice(t,1),this.session.selectionMarkerCount=this.session.$selectionMarkers.length},this.removeSelectionMarkers=function(e){var t=this.session.$selectionMarkers;for(var n=e.length;n--;){var r=e[n];if(!r.marker)continue;this.session.removeMarker(r.marker);var i=t.indexOf(r);i!=-1&&t.splice(i,1)}this.session.selectionMarkerCount=t.length},this.$onAddRange=function(e){this.addSelectionMarker(e.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(e){this.removeSelectionMarkers(e.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(e){if(this.inMultiSelectMode)return;this.inMultiSelectMode=!0,this.setStyle("ace_multiselect"),this.keyBinding.addKeyboardHandler(f.keyboardHandler),this.commands.setDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onSingleSelect=function(e){if(this.session.multiSelect.inVirtualMode)return;this.inMultiSelectMode=!1,this.unsetStyle("ace_multiselect"),this.keyBinding.removeKeyboardHandler(f.keyboardHandler),this.commands.removeDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers(),this._emit("changeSelection")},this.$onMultiSelectExec=function(e){var t=e.command,n=e.editor;if(!n.multiSelect)return;if(!t.multiSelectAction){var r=t.exec(n,e.args||{});n.multiSelect.addRange(n.multiSelect.toOrientedRange()),n.multiSelect.mergeOverlappingRanges()}else t.multiSelectAction=="forEach"?r=n.forEachSelection(t,e.args):t.multiSelectAction=="forEachLine"?r=n.forEachSelection(t,e.args,!0):t.multiSelectAction=="single"?(n.exitMultiSelectMode(),r=t.exec(n,e.args||{})):r=t.multiSelectAction(n,e.args||{});return r},this.forEachSelection=function(e,t,n){if(this.inVirtualSelectionMode)return;var r=n&&n.keepOrder,i=n==1||n&&n.$byLines,o=this.session,u=this.selection,a=u.rangeList,f=(r?u:a).ranges,l;if(!f.length)return e.exec?e.exec(this,t||{}):e(this,t||{});var c=u._eventRegistry;u._eventRegistry={};var h=new s(o);this.inVirtualSelectionMode=!0;for(var p=f.length;p--;){if(i)while(p>0&&f[p].start.row==f[p-1].end.row)p--;h.fromOrientedRange(f[p]),h.index=p,this.selection=o.selection=h;var d=e.exec?e.exec(this,t||{}):e(this,t||{});!l&&d!==undefined&&(l=d),h.toOrientedRange(f[p])}h.detach(),this.selection=o.selection=u,this.inVirtualSelectionMode=!1,u._eventRegistry=c,u.mergeOverlappingRanges(),u.ranges[0]&&u.fromOrientedRange(u.ranges[0]);var v=this.renderer.$scrollAnimation;return this.onCursorChange(),this.onSelectionChange(),v&&v.from==v.to&&this.renderer.animateScrolling(v.from),l},this.exitMultiSelectMode=function(){if(!this.inMultiSelectMode||this.inVirtualSelectionMode)return;this.multiSelect.toSingleRange()},this.getSelectedText=function(){var e="";if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){var t=this.multiSelect.rangeList.ranges,n=[];for(var r=0;r0);u<0&&(u=0),f>=c&&(f=c-1)}var p=this.session.removeFullLines(u,f);p=this.$reAlignText(p,l),this.session.insert({row:u,column:0},p.join("\n")+"\n"),l||(o.start.column=0,o.end.column=p[p.length-1].length),this.selection.setRange(o)}else{s.forEach(function(e){t.substractPoint(e.cursor)});var d=0,v=Infinity,m=n.map(function(t){var n=t.cursor,r=e.getLine(n.row),i=r.substr(n.column).search(/\S/g);return i==-1&&(i=0),n.column>d&&(d=n.column),io?e.insert(r,a.stringRepeat(" ",s-o)):e.remove(new i(r.row,r.column,r.row,r.column-s+o)),t.start.column=t.end.column=d,t.start.row=t.end.row=r.row,t.cursor=t.end}),t.fromOrientedRange(n[0]),this.renderer.updateCursor(),this.renderer.updateBackMarkers()}},this.$reAlignText=function(e,t){function u(e){return a.stringRepeat(" ",e)}function f(e){return e[2]?u(i)+e[2]+u(s-e[2].length+o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function l(e){return e[2]?u(i+s-e[2].length)+e[2]+u(o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function c(e){return e[2]?u(i)+e[2]+u(o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}var n=!0,r=!0,i,s,o;return e.map(function(e){var t=e.match(/(\s*)(.*?)(\s*)([=:].*)/);return t?i==null?(i=t[1].length,s=t[2].length,o=t[3].length,t):(i+s+o!=t[1].length+t[2].length+t[3].length&&(r=!1),i!=t[1].length&&(n=!1),i>t[1].length&&(i=t[1].length),st[3].length&&(o=t[3].length),t):[e]}).map(t?f:n?r?l:f:c)}}).call(d.prototype),t.onSessionChange=function(e){var t=e.session;t&&!t.multiSelect&&(t.$selectionMarkers=[],t.selection.$initRangeList(),t.multiSelect=t.selection),this.multiSelect=t&&t.multiSelect;var n=e.oldSession;n&&(n.multiSelect.off("addRange",this.$onAddRange),n.multiSelect.off("removeRange",this.$onRemoveRange),n.multiSelect.off("multiSelect",this.$onMultiSelect),n.multiSelect.off("singleSelect",this.$onSingleSelect),n.multiSelect.lead.off("change",this.$checkMultiselectChange),n.multiSelect.anchor.off("change",this.$checkMultiselectChange)),t&&(t.multiSelect.on("addRange",this.$onAddRange),t.multiSelect.on("removeRange",this.$onRemoveRange),t.multiSelect.on("multiSelect",this.$onMultiSelect),t.multiSelect.on("singleSelect",this.$onSingleSelect),t.multiSelect.lead.on("change",this.$checkMultiselectChange),t.multiSelect.anchor.on("change",this.$checkMultiselectChange)),t&&this.inMultiSelectMode!=t.selection.inMultiSelectMode&&(t.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},t.MultiSelect=m,e("./config").defineOptions(d.prototype,"editor",{enableMultiselect:{set:function(e){m(this),e?(this.on("changeSession",this.$multiselectOnSessionChange),this.on("mousedown",o)):(this.off("changeSession",this.$multiselectOnSessionChange),this.off("mousedown",o))},value:!0},enableBlockSelect:{set:function(e){this.$blockSelectEnabled=e},value:!0}})}),ace.define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../../range").Range,i=t.FoldMode=function(){};(function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);return this.foldingStartMarker.test(r)?"start":t=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(r)?"end":""},this.getFoldWidgetRange=function(e,t,n){return null},this.indentationBlock=function(e,t,n){var i=/\S/,s=e.getLine(t),o=s.search(i);if(o==-1)return;var u=n||s.length,a=e.getLength(),f=t,l=t;while(++tf){var p=e.getLine(l).length;return new r(f,u,l,p)}},this.openingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i+1},u=e.$findClosingBracket(t,o,s);if(!u)return;var a=e.foldWidgets[u.row];return a==null&&(a=e.getFoldWidget(u.row)),a=="start"&&u.row>o.row&&(u.row--,u.column=e.getLine(u.row).length),r.fromPoints(o,u)},this.closingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i},u=e.$findOpeningBracket(t,o);if(!u)return;return u.column++,o.column--,r.fromPoints(u,o)}}).call(i.prototype)}),ace.define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";t.isDark=!1,t.cssClass="ace-tm",t.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}',t.$id="ace/theme/textmate";var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}),ace.define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e){this.session=e,this.session.widgetManager=this,this.session.getRowLength=this.getRowLength,this.session.$getWidgetScreenLength=this.$getWidgetScreenLength,this.updateOnChange=this.updateOnChange.bind(this),this.renderWidgets=this.renderWidgets.bind(this),this.measureWidgets=this.measureWidgets.bind(this),this.session._changedWidgets=[],this.$onChangeEditor=this.$onChangeEditor.bind(this),this.session.on("change",this.updateOnChange),this.session.on("changeFold",this.updateOnFold),this.session.on("changeEditor",this.$onChangeEditor)}var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./range").Range;(function(){this.getRowLength=function(e){var t;return this.lineWidgets?t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0:t=0,!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.$getWidgetScreenLength=function(){var e=0;return this.lineWidgets.forEach(function(t){t&&t.rowCount&&!t.hidden&&(e+=t.rowCount)}),e},this.$onChangeEditor=function(e){this.attach(e.editor)},this.attach=function(e){e&&e.widgetManager&&e.widgetManager!=this&&e.widgetManager.detach();if(this.editor==e)return;this.detach(),this.editor=e,e&&(e.widgetManager=this,e.renderer.on("beforeRender",this.measureWidgets),e.renderer.on("afterRender",this.renderWidgets))},this.detach=function(e){var t=this.editor;if(!t)return;this.editor=null,t.widgetManager=null,t.renderer.off("beforeRender",this.measureWidgets),t.renderer.off("afterRender",this.renderWidgets);var n=this.session.lineWidgets;n&&n.forEach(function(e){e&&e.el&&e.el.parentNode&&(e._inDocument=!1,e.el.parentNode.removeChild(e.el))})},this.updateOnFold=function(e,t){var n=t.lineWidgets;if(!n||!e.action)return;var r=e.data,i=r.start.row,s=r.end.row,o=e.action=="add";for(var u=i+1;u0&&!r[i])i--;this.firstRow=n.firstRow,this.lastRow=n.lastRow,t.$cursorLayer.config=n;for(var o=i;o<=s;o++){var u=r[o];if(!u||!u.el)continue;if(u.hidden){u.el.style.top=-100-(u.pixelHeight||0)+"px";continue}u._inDocument||(u._inDocument=!0,t.container.appendChild(u.el));var a=t.$cursorLayer.getPixelPosition({row:o,column:0},!0).top;u.coverLine||(a+=n.lineHeight*this.session.getRowLineCount(u.row)),u.el.style.top=a-n.offset+"px";var f=u.coverGutter?0:t.gutterWidth;u.fixedWidth||(f-=t.scrollLeft),u.el.style.left=f+"px",u.fullWidth&&u.screenWidth&&(u.el.style.minWidth=n.width+2*n.padding+"px"),u.fixedWidth?u.el.style.right=t.scrollBar.getWidth()+"px":u.el.style.right=""}}}).call(o.prototype),t.LineWidgets=o}),ace.define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e,t,n){var r=0,i=e.length-1;while(r<=i){var s=r+i>>1,o=n(t,e[s]);if(o>0)r=s+1;else{if(!(o<0))return s;i=s-1}}return-(r+1)}function u(e,t,n){var r=e.getAnnotations().sort(s.comparePoints);if(!r.length)return;var i=o(r,{row:t,column:-1},s.comparePoints);i<0&&(i=-i-1),i>=r.length?i=n>0?0:r.length-1:i===0&&n<0&&(i=r.length-1);var u=r[i];if(!u||!n)return;if(u.row===t){do u=r[i+=n];while(u&&u.row===t);if(!u)return r.slice()}var a=[];t=u.row;do a[n<0?"unshift":"push"](u),u=r[i+=n];while(u&&u.row==t);return a.length&&a}var r=e("../line_widgets").LineWidgets,i=e("../lib/dom"),s=e("../range").Range;t.showErrorMarker=function(e,t){var n=e.session;n.widgetManager||(n.widgetManager=new r(n),n.widgetManager.attach(e));var s=e.getCursorPosition(),o=s.row,a=n.widgetManager.getWidgetsAtRow(o).filter(function(e){return e.type=="errorMarker"})[0];a?a.destroy():o-=t;var f=u(n,o,t),l;if(f){var c=f[0];s.column=(c.pos&&typeof c.column!="number"?c.pos.sc:c.column)||0,s.row=c.row,l=e.renderer.$gutterLayer.$annotations[s.row]}else{if(a)return;l={text:["Looks good!"],className:"ace_ok"}}e.session.unfold(s.row),e.selection.moveToPosition(s);var h={row:s.row,fixedWidth:!0,coverGutter:!0,el:i.createElement("div"),type:"errorMarker"},p=h.el.appendChild(i.createElement("div")),d=h.el.appendChild(i.createElement("div"));d.className="error_widget_arrow "+l.className;var v=e.renderer.$cursorLayer.getPixelPosition(s).left;d.style.left=v+e.renderer.gutterWidth-5+"px",h.el.className="error_widget_wrapper",p.className="error_widget "+l.className,p.innerHTML=l.text.join("
"),p.appendChild(i.createElement("div"));var m=function(e,t,n){if(t===0&&(n==="esc"||n==="return"))return h.destroy(),{command:"null"}};h.destroy=function(){if(e.$mouseHandler.isMousePressed)return;e.keyBinding.removeKeyboardHandler(m),n.widgetManager.removeLineWidget(h),e.off("changeSelection",h.destroy),e.off("changeSession",h.destroy),e.off("mouseup",h.destroy),e.off("change",h.destroy)},e.keyBinding.addKeyboardHandler(m),e.on("changeSelection",h.destroy),e.on("changeSession",h.destroy),e.on("mouseup",h.destroy),e.on("change",h.destroy),e.session.widgetManager.addLineWidget(h),h.el.onmousedown=e.focus.bind(e),e.renderer.scrollCursorIntoView(null,.5,{bottom:h.el.offsetHeight})},i.importCssString(" .error_widget_wrapper { background: inherit; color: inherit; border:none } .error_widget { border-top: solid 2px; border-bottom: solid 2px; margin: 5px 0; padding: 10px 40px; white-space: pre-wrap; } .error_widget.ace_error, .error_widget_arrow.ace_error{ border-color: #ff5a5a } .error_widget.ace_warning, .error_widget_arrow.ace_warning{ border-color: #F1D817 } .error_widget.ace_info, .error_widget_arrow.ace_info{ border-color: #5a5a5a } .error_widget.ace_ok, .error_widget_arrow.ace_ok{ border-color: #5aaa5a } .error_widget_arrow { position: absolute; border: solid 5px; border-top-color: transparent!important; border-right-color: transparent!important; border-left-color: transparent!important; top: -5px; }","")}),ace.define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/range","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"],function(e,t,n){"use strict";e("./lib/fixoldbrowsers");var r=e("./lib/dom"),i=e("./lib/event"),s=e("./range").Range,o=e("./editor").Editor,u=e("./edit_session").EditSession,a=e("./undomanager").UndoManager,f=e("./virtual_renderer").VirtualRenderer;e("./worker/worker_client"),e("./keyboard/hash_handler"),e("./placeholder"),e("./multi_select"),e("./mode/folding/fold_mode"),e("./theme/textmate"),e("./ext/error_marker"),t.config=e("./config"),t.require=e,typeof define=="function"&&(t.define=define),t.edit=function(e,n){if(typeof e=="string"){var s=e;e=document.getElementById(s);if(!e)throw new Error("ace.edit can't find div #"+s)}if(e&&e.env&&e.env.editor instanceof o)return e.env.editor;var u="";if(e&&/input|textarea/i.test(e.tagName)){var a=e;u=a.value,e=r.createElement("pre"),a.parentNode.replaceChild(e,a)}else e&&(u=e.textContent,e.innerHTML="");var l=t.createEditSession(u),c=new o(new f(e),l,n),h={document:l,editor:c,onResize:c.resize.bind(c,null)};return a&&(h.textarea=a),i.addListener(window,"resize",h.onResize),c.on("destroy",function(){i.removeListener(window,"resize",h.onResize),h.editor.container.env=null}),c.container.env=c.env=h,c},t.createEditSession=function(e,t){var n=new u(e,t);return n.setUndoManager(new a),n},t.Range=s,t.Editor=o,t.EditSession=u,t.UndoManager=a,t.VirtualRenderer=f,t.version=t.config.version}); (function() { + ace.require(["ace/ace"], function(a) { + if (a) { + a.config.init(true); + a.define = ace.define; + } + if (!window.ace) + window.ace = a; + for (var key in a) if (a.hasOwnProperty(key)) + window.ace[key] = a[key]; + window.ace["default"] = window.ace; + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = window.ace; + } + }); + })(); + \ No newline at end of file diff --git a/pkg/ui/v1beta1/frontend/public/scripts/bootstrap.min.js b/pkg/ui/v1beta1/frontend/public/scripts/bootstrap.min.js new file mode 100644 index 00000000000..534d533433a --- /dev/null +++ b/pkg/ui/v1beta1/frontend/public/scripts/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.0.0 (https://getbootstrap.com) + * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e(t.bootstrap={},t.jQuery,t.Popper)}(this,function(t,e,n){"use strict";function i(t,e){for(var n=0;n0?i:null}catch(t){return null}},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(n){t(n).trigger(e.end)},supportsTransitionEnd:function(){return Boolean(e)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var s in n)if(Object.prototype.hasOwnProperty.call(n,s)){var r=n[s],o=e[s],a=o&&i.isElement(o)?"element":(l=o,{}.toString.call(l).match(/\s([a-zA-Z]+)/)[1].toLowerCase());if(!new RegExp(r).test(a))throw new Error(t.toUpperCase()+': Option "'+s+'" provided type "'+a+'" but expected type "'+r+'".')}var l}};return e=("undefined"==typeof window||!window.QUnit)&&{end:"transitionend"},t.fn.emulateTransitionEnd=n,i.supportsTransitionEnd()&&(t.event.special[i.TRANSITION_END]={bindType:e.end,delegateType:e.end,handle:function(e){if(t(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}}),i}(e),L=(a="alert",h="."+(l="bs.alert"),c=(o=e).fn[a],u={CLOSE:"close"+h,CLOSED:"closed"+h,CLICK_DATA_API:"click"+h+".data-api"},f="alert",d="fade",_="show",g=function(){function t(t){this._element=t}var e=t.prototype;return e.close=function(t){t=t||this._element;var e=this._getRootElement(t);this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.dispose=function(){o.removeData(this._element,l),this._element=null},e._getRootElement=function(t){var e=P.getSelectorFromElement(t),n=!1;return e&&(n=o(e)[0]),n||(n=o(t).closest("."+f)[0]),n},e._triggerCloseEvent=function(t){var e=o.Event(u.CLOSE);return o(t).trigger(e),e},e._removeElement=function(t){var e=this;o(t).removeClass(_),P.supportsTransitionEnd()&&o(t).hasClass(d)?o(t).one(P.TRANSITION_END,function(n){return e._destroyElement(t,n)}).emulateTransitionEnd(150):this._destroyElement(t)},e._destroyElement=function(t){o(t).detach().trigger(u.CLOSED).remove()},t._jQueryInterface=function(e){return this.each(function(){var n=o(this),i=n.data(l);i||(i=new t(this),n.data(l,i)),"close"===e&&i[e](this)})},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},s(t,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),t}(),o(document).on(u.CLICK_DATA_API,'[data-dismiss="alert"]',g._handleDismiss(new g)),o.fn[a]=g._jQueryInterface,o.fn[a].Constructor=g,o.fn[a].noConflict=function(){return o.fn[a]=c,g._jQueryInterface},g),R=(m="button",E="."+(v="bs.button"),T=".data-api",y=(p=e).fn[m],C="active",I="btn",A="focus",b='[data-toggle^="button"]',D='[data-toggle="buttons"]',S="input",w=".active",N=".btn",O={CLICK_DATA_API:"click"+E+T,FOCUS_BLUR_DATA_API:"focus"+E+T+" blur"+E+T},k=function(){function t(t){this._element=t}var e=t.prototype;return e.toggle=function(){var t=!0,e=!0,n=p(this._element).closest(D)[0];if(n){var i=p(this._element).find(S)[0];if(i){if("radio"===i.type)if(i.checked&&p(this._element).hasClass(C))t=!1;else{var s=p(n).find(w)[0];s&&p(s).removeClass(C)}if(t){if(i.hasAttribute("disabled")||n.hasAttribute("disabled")||i.classList.contains("disabled")||n.classList.contains("disabled"))return;i.checked=!p(this._element).hasClass(C),p(i).trigger("change")}i.focus(),e=!1}}e&&this._element.setAttribute("aria-pressed",!p(this._element).hasClass(C)),t&&p(this._element).toggleClass(C)},e.dispose=function(){p.removeData(this._element,v),this._element=null},t._jQueryInterface=function(e){return this.each(function(){var n=p(this).data(v);n||(n=new t(this),p(this).data(v,n)),"toggle"===e&&n[e]()})},s(t,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),t}(),p(document).on(O.CLICK_DATA_API,b,function(t){t.preventDefault();var e=t.target;p(e).hasClass(I)||(e=p(e).closest(N)),k._jQueryInterface.call(p(e),"toggle")}).on(O.FOCUS_BLUR_DATA_API,b,function(t){var e=p(t.target).closest(N)[0];p(e).toggleClass(A,/^focus(in)?$/.test(t.type))}),p.fn[m]=k._jQueryInterface,p.fn[m].Constructor=k,p.fn[m].noConflict=function(){return p.fn[m]=y,k._jQueryInterface},k),j=function(t){var e="carousel",n="bs.carousel",i="."+n,o=t.fn[e],a={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},l={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},h="next",c="prev",u="left",f="right",d={SLIDE:"slide"+i,SLID:"slid"+i,KEYDOWN:"keydown"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i,TOUCHEND:"touchend"+i,LOAD_DATA_API:"load"+i+".data-api",CLICK_DATA_API:"click"+i+".data-api"},_="carousel",g="active",p="slide",m="carousel-item-right",v="carousel-item-left",E="carousel-item-next",T="carousel-item-prev",y={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},C=function(){function o(e,n){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(n),this._element=t(e)[0],this._indicatorsElement=t(this._element).find(y.INDICATORS)[0],this._addEventListeners()}var C=o.prototype;return C.next=function(){this._isSliding||this._slide(h)},C.nextWhenVisible=function(){!document.hidden&&t(this._element).is(":visible")&&"hidden"!==t(this._element).css("visibility")&&this.next()},C.prev=function(){this._isSliding||this._slide(c)},C.pause=function(e){e||(this._isPaused=!0),t(this._element).find(y.NEXT_PREV)[0]&&P.supportsTransitionEnd()&&(P.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},C.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},C.to=function(e){var n=this;this._activeElement=t(this._element).find(y.ACTIVE_ITEM)[0];var i=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0))if(this._isSliding)t(this._element).one(d.SLID,function(){return n.to(e)});else{if(i===e)return this.pause(),void this.cycle();var s=e>i?h:c;this._slide(s,this._items[e])}},C.dispose=function(){t(this._element).off(i),t.removeData(this._element,n),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},C._getConfig=function(t){return t=r({},a,t),P.typeCheckConfig(e,t,l),t},C._addEventListeners=function(){var e=this;this._config.keyboard&&t(this._element).on(d.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&(t(this._element).on(d.MOUSEENTER,function(t){return e.pause(t)}).on(d.MOUSELEAVE,function(t){return e.cycle(t)}),"ontouchstart"in document.documentElement&&t(this._element).on(d.TOUCHEND,function(){e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout(function(t){return e.cycle(t)},500+e._config.interval)}))},C._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},C._getItemIndex=function(e){return this._items=t.makeArray(t(e).parent().find(y.ITEM)),this._items.indexOf(e)},C._getItemByDirection=function(t,e){var n=t===h,i=t===c,s=this._getItemIndex(e),r=this._items.length-1;if((i&&0===s||n&&s===r)&&!this._config.wrap)return e;var o=(s+(t===c?-1:1))%this._items.length;return-1===o?this._items[this._items.length-1]:this._items[o]},C._triggerSlideEvent=function(e,n){var i=this._getItemIndex(e),s=this._getItemIndex(t(this._element).find(y.ACTIVE_ITEM)[0]),r=t.Event(d.SLIDE,{relatedTarget:e,direction:n,from:s,to:i});return t(this._element).trigger(r),r},C._setActiveIndicatorElement=function(e){if(this._indicatorsElement){t(this._indicatorsElement).find(y.ACTIVE).removeClass(g);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&t(n).addClass(g)}},C._slide=function(e,n){var i,s,r,o=this,a=t(this._element).find(y.ACTIVE_ITEM)[0],l=this._getItemIndex(a),c=n||a&&this._getItemByDirection(e,a),_=this._getItemIndex(c),C=Boolean(this._interval);if(e===h?(i=v,s=E,r=u):(i=m,s=T,r=f),c&&t(c).hasClass(g))this._isSliding=!1;else if(!this._triggerSlideEvent(c,r).isDefaultPrevented()&&a&&c){this._isSliding=!0,C&&this.pause(),this._setActiveIndicatorElement(c);var I=t.Event(d.SLID,{relatedTarget:c,direction:r,from:l,to:_});P.supportsTransitionEnd()&&t(this._element).hasClass(p)?(t(c).addClass(s),P.reflow(c),t(a).addClass(i),t(c).addClass(i),t(a).one(P.TRANSITION_END,function(){t(c).removeClass(i+" "+s).addClass(g),t(a).removeClass(g+" "+s+" "+i),o._isSliding=!1,setTimeout(function(){return t(o._element).trigger(I)},0)}).emulateTransitionEnd(600)):(t(a).removeClass(g),t(c).addClass(g),this._isSliding=!1,t(this._element).trigger(I)),C&&this.cycle()}},o._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s=r({},a,t(this).data());"object"==typeof e&&(s=r({},s,e));var l="string"==typeof e?e:s.slide;if(i||(i=new o(this,s),t(this).data(n,i)),"number"==typeof e)i.to(e);else if("string"==typeof l){if("undefined"==typeof i[l])throw new TypeError('No method named "'+l+'"');i[l]()}else s.interval&&(i.pause(),i.cycle())})},o._dataApiClickHandler=function(e){var i=P.getSelectorFromElement(this);if(i){var s=t(i)[0];if(s&&t(s).hasClass(_)){var a=r({},t(s).data(),t(this).data()),l=this.getAttribute("data-slide-to");l&&(a.interval=!1),o._jQueryInterface.call(t(s),a),l&&t(s).data(n).to(l),e.preventDefault()}}},s(o,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),o}();return t(document).on(d.CLICK_DATA_API,y.DATA_SLIDE,C._dataApiClickHandler),t(window).on(d.LOAD_DATA_API,function(){t(y.DATA_RIDE).each(function(){var e=t(this);C._jQueryInterface.call(e,e.data())})}),t.fn[e]=C._jQueryInterface,t.fn[e].Constructor=C,t.fn[e].noConflict=function(){return t.fn[e]=o,C._jQueryInterface},C}(e),H=function(t){var e="collapse",n="bs.collapse",i="."+n,o=t.fn[e],a={toggle:!0,parent:""},l={toggle:"boolean",parent:"(string|element)"},h={SHOW:"show"+i,SHOWN:"shown"+i,HIDE:"hide"+i,HIDDEN:"hidden"+i,CLICK_DATA_API:"click"+i+".data-api"},c="show",u="collapse",f="collapsing",d="collapsed",_="width",g="height",p={ACTIVES:".show, .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},m=function(){function i(e,n){this._isTransitioning=!1,this._element=e,this._config=this._getConfig(n),this._triggerArray=t.makeArray(t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var i=t(p.DATA_TOGGLE),s=0;s0&&(this._selector=o,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var o=i.prototype;return o.toggle=function(){t(this._element).hasClass(c)?this.hide():this.show()},o.show=function(){var e,s,r=this;if(!this._isTransitioning&&!t(this._element).hasClass(c)&&(this._parent&&0===(e=t.makeArray(t(this._parent).find(p.ACTIVES).filter('[data-parent="'+this._config.parent+'"]'))).length&&(e=null),!(e&&(s=t(e).not(this._selector).data(n))&&s._isTransitioning))){var o=t.Event(h.SHOW);if(t(this._element).trigger(o),!o.isDefaultPrevented()){e&&(i._jQueryInterface.call(t(e).not(this._selector),"hide"),s||t(e).data(n,null));var a=this._getDimension();t(this._element).removeClass(u).addClass(f),this._element.style[a]=0,this._triggerArray.length>0&&t(this._triggerArray).removeClass(d).attr("aria-expanded",!0),this.setTransitioning(!0);var l=function(){t(r._element).removeClass(f).addClass(u).addClass(c),r._element.style[a]="",r.setTransitioning(!1),t(r._element).trigger(h.SHOWN)};if(P.supportsTransitionEnd()){var _="scroll"+(a[0].toUpperCase()+a.slice(1));t(this._element).one(P.TRANSITION_END,l).emulateTransitionEnd(600),this._element.style[a]=this._element[_]+"px"}else l()}}},o.hide=function(){var e=this;if(!this._isTransitioning&&t(this._element).hasClass(c)){var n=t.Event(h.HIDE);if(t(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();if(this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",P.reflow(this._element),t(this._element).addClass(f).removeClass(u).removeClass(c),this._triggerArray.length>0)for(var s=0;s0&&t(n).toggleClass(d,!i).attr("aria-expanded",i)}},i._getTargetFromElement=function(e){var n=P.getSelectorFromElement(e);return n?t(n)[0]:null},i._jQueryInterface=function(e){return this.each(function(){var s=t(this),o=s.data(n),l=r({},a,s.data(),"object"==typeof e&&e);if(!o&&l.toggle&&/show|hide/.test(e)&&(l.toggle=!1),o||(o=new i(this,l),s.data(n,o)),"string"==typeof e){if("undefined"==typeof o[e])throw new TypeError('No method named "'+e+'"');o[e]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),i}();return t(document).on(h.CLICK_DATA_API,p.DATA_TOGGLE,function(e){"A"===e.currentTarget.tagName&&e.preventDefault();var i=t(this),s=P.getSelectorFromElement(this);t(s).each(function(){var e=t(this),s=e.data(n)?"toggle":i.data();m._jQueryInterface.call(e,s)})}),t.fn[e]=m._jQueryInterface,t.fn[e].Constructor=m,t.fn[e].noConflict=function(){return t.fn[e]=o,m._jQueryInterface},m}(e),W=function(t){var e="dropdown",i="bs.dropdown",o="."+i,a=".data-api",l=t.fn[e],h=new RegExp("38|40|27"),c={HIDE:"hide"+o,HIDDEN:"hidden"+o,SHOW:"show"+o,SHOWN:"shown"+o,CLICK:"click"+o,CLICK_DATA_API:"click"+o+a,KEYDOWN_DATA_API:"keydown"+o+a,KEYUP_DATA_API:"keyup"+o+a},u="disabled",f="show",d="dropup",_="dropright",g="dropleft",p="dropdown-menu-right",m="dropdown-menu-left",v="position-static",E='[data-toggle="dropdown"]',T=".dropdown form",y=".dropdown-menu",C=".navbar-nav",I=".dropdown-menu .dropdown-item:not(.disabled)",A="top-start",b="top-end",D="bottom-start",S="bottom-end",w="right-start",N="left-start",O={offset:0,flip:!0,boundary:"scrollParent"},k={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)"},L=function(){function a(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var l=a.prototype;return l.toggle=function(){if(!this._element.disabled&&!t(this._element).hasClass(u)){var e=a._getParentFromElement(this._element),i=t(this._menu).hasClass(f);if(a._clearMenus(),!i){var s={relatedTarget:this._element},r=t.Event(c.SHOW,s);if(t(e).trigger(r),!r.isDefaultPrevented()){if(!this._inNavbar){if("undefined"==typeof n)throw new TypeError("Bootstrap dropdown require Popper.js (https://popper.js.org)");var o=this._element;t(e).hasClass(d)&&(t(this._menu).hasClass(m)||t(this._menu).hasClass(p))&&(o=e),"scrollParent"!==this._config.boundary&&t(e).addClass(v),this._popper=new n(o,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===t(e).closest(C).length&&t("body").children().on("mouseover",null,t.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),t(this._menu).toggleClass(f),t(e).toggleClass(f).trigger(t.Event(c.SHOWN,s))}}}},l.dispose=function(){t.removeData(this._element,i),t(this._element).off(o),this._element=null,this._menu=null,null!==this._popper&&(this._popper.destroy(),this._popper=null)},l.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},l._addEventListeners=function(){var e=this;t(this._element).on(c.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},l._getConfig=function(n){return n=r({},this.constructor.Default,t(this._element).data(),n),P.typeCheckConfig(e,n,this.constructor.DefaultType),n},l._getMenuElement=function(){if(!this._menu){var e=a._getParentFromElement(this._element);this._menu=t(e).find(y)[0]}return this._menu},l._getPlacement=function(){var e=t(this._element).parent(),n=D;return e.hasClass(d)?(n=A,t(this._menu).hasClass(p)&&(n=b)):e.hasClass(_)?n=w:e.hasClass(g)?n=N:t(this._menu).hasClass(p)&&(n=S),n},l._detectNavbar=function(){return t(this._element).closest(".navbar").length>0},l._getPopperConfig=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t._config.offset(e.offsets)||{}),e}:e.offset=this._config.offset,{placement:this._getPlacement(),modifiers:{offset:e,flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}}},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i);if(n||(n=new a(this,"object"==typeof e?e:null),t(this).data(i,n)),"string"==typeof e){if("undefined"==typeof n[e])throw new TypeError('No method named "'+e+'"');n[e]()}})},a._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var n=t.makeArray(t(E)),s=0;s0&&r--,40===e.which&&rdocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},p._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},p._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent"},f="show",d="out",_={HIDE:"hide"+o,HIDDEN:"hidden"+o,SHOW:"show"+o,SHOWN:"shown"+o,INSERTED:"inserted"+o,CLICK:"click"+o,FOCUSIN:"focusin"+o,FOCUSOUT:"focusout"+o,MOUSEENTER:"mouseenter"+o,MOUSELEAVE:"mouseleave"+o},g="fade",p="show",m=".tooltip-inner",v=".arrow",E="hover",T="focus",y="click",C="manual",I=function(){function a(t,e){if("undefined"==typeof n)throw new TypeError("Bootstrap tooltips require Popper.js (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var I=a.prototype;return I.enable=function(){this._isEnabled=!0},I.disable=function(){this._isEnabled=!1},I.toggleEnabled=function(){this._isEnabled=!this._isEnabled},I.toggle=function(e){if(this._isEnabled)if(e){var n=this.constructor.DATA_KEY,i=t(e.currentTarget).data(n);i||(i=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(t(this.getTipElement()).hasClass(p))return void this._leave(null,this);this._enter(null,this)}},I.dispose=function(){clearTimeout(this._timeout),t.removeData(this.element,this.constructor.DATA_KEY),t(this.element).off(this.constructor.EVENT_KEY),t(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&t(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,null!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},I.show=function(){var e=this;if("none"===t(this.element).css("display"))throw new Error("Please use show on visible elements");var i=t.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){t(this.element).trigger(i);var s=t.contains(this.element.ownerDocument.documentElement,this.element);if(i.isDefaultPrevented()||!s)return;var r=this.getTipElement(),o=P.getUID(this.constructor.NAME);r.setAttribute("id",o),this.element.setAttribute("aria-describedby",o),this.setContent(),this.config.animation&&t(r).addClass(g);var l="function"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,h=this._getAttachment(l);this.addAttachmentClass(h);var c=!1===this.config.container?document.body:t(this.config.container);t(r).data(this.constructor.DATA_KEY,this),t.contains(this.element.ownerDocument.documentElement,this.tip)||t(r).appendTo(c),t(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new n(this.element,r,{placement:h,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:v},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){e._handlePopperPlacementChange(t)}}),t(r).addClass(p),"ontouchstart"in document.documentElement&&t("body").children().on("mouseover",null,t.noop);var u=function(){e.config.animation&&e._fixTransition();var n=e._hoverState;e._hoverState=null,t(e.element).trigger(e.constructor.Event.SHOWN),n===d&&e._leave(null,e)};P.supportsTransitionEnd()&&t(this.tip).hasClass(g)?t(this.tip).one(P.TRANSITION_END,u).emulateTransitionEnd(a._TRANSITION_DURATION):u()}},I.hide=function(e){var n=this,i=this.getTipElement(),s=t.Event(this.constructor.Event.HIDE),r=function(){n._hoverState!==f&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),t(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),e&&e()};t(this.element).trigger(s),s.isDefaultPrevented()||(t(i).removeClass(p),"ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),this._activeTrigger[y]=!1,this._activeTrigger[T]=!1,this._activeTrigger[E]=!1,P.supportsTransitionEnd()&&t(this.tip).hasClass(g)?t(i).one(P.TRANSITION_END,r).emulateTransitionEnd(150):r(),this._hoverState="")},I.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},I.isWithContent=function(){return Boolean(this.getTitle())},I.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-tooltip-"+e)},I.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},I.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(m),this.getTitle()),e.removeClass(g+" "+p)},I.setElementContent=function(e,n){var i=this.config.html;"object"==typeof n&&(n.nodeType||n.jquery)?i?t(n).parent().is(e)||e.empty().append(n):e.text(t(n).text()):e[i?"html":"text"](n)},I.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},I._getAttachment=function(t){return c[t.toUpperCase()]},I._setListeners=function(){var e=this;this.config.trigger.split(" ").forEach(function(n){if("click"===n)t(e.element).on(e.constructor.Event.CLICK,e.config.selector,function(t){return e.toggle(t)});else if(n!==C){var i=n===E?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,s=n===E?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;t(e.element).on(i,e.config.selector,function(t){return e._enter(t)}).on(s,e.config.selector,function(t){return e._leave(t)})}t(e.element).closest(".modal").on("hide.bs.modal",function(){return e.hide()})}),this.config.selector?this.config=r({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},I._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},I._enter=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusin"===e.type?T:E]=!0),t(n.getTipElement()).hasClass(p)||n._hoverState===f?n._hoverState=f:(clearTimeout(n._timeout),n._hoverState=f,n.config.delay&&n.config.delay.show?n._timeout=setTimeout(function(){n._hoverState===f&&n.show()},n.config.delay.show):n.show())},I._leave=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusout"===e.type?T:E]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState=d,n.config.delay&&n.config.delay.hide?n._timeout=setTimeout(function(){n._hoverState===d&&n.hide()},n.config.delay.hide):n.hide())},I._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},I._getConfig=function(n){return"number"==typeof(n=r({},this.constructor.Default,t(this.element).data(),n)).delay&&(n.delay={show:n.delay,hide:n.delay}),"number"==typeof n.title&&(n.title=n.title.toString()),"number"==typeof n.content&&(n.content=n.content.toString()),P.typeCheckConfig(e,n,this.constructor.DefaultType),n},I._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},I._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(l);null!==n&&n.length>0&&e.removeClass(n.join(""))},I._handlePopperPlacementChange=function(t){this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},I._fixTransition=function(){var e=this.getTipElement(),n=this.config.animation;null===e.getAttribute("x-placement")&&(t(e).removeClass(g),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i),s="object"==typeof e&&e;if((n||!/dispose|hide/.test(e))&&(n||(n=new a(this,s),t(this).data(i,n)),"string"==typeof e)){if("undefined"==typeof n[e])throw new TypeError('No method named "'+e+'"');n[e]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return u}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return i}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return o}},{key:"DefaultType",get:function(){return h}}]),a}();return t.fn[e]=I._jQueryInterface,t.fn[e].Constructor=I,t.fn[e].noConflict=function(){return t.fn[e]=a,I._jQueryInterface},I}(e),x=function(t){var e="popover",n="bs.popover",i="."+n,o=t.fn[e],a=new RegExp("(^|\\s)bs-popover\\S+","g"),l=r({},U.Default,{placement:"right",trigger:"click",content:"",template:''}),h=r({},U.DefaultType,{content:"(string|element|function)"}),c="fade",u="show",f=".popover-header",d=".popover-body",_={HIDE:"hide"+i,HIDDEN:"hidden"+i,SHOW:"show"+i,SHOWN:"shown"+i,INSERTED:"inserted"+i,CLICK:"click"+i,FOCUSIN:"focusin"+i,FOCUSOUT:"focusout"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i},g=function(r){var o,g;function p(){return r.apply(this,arguments)||this}g=r,(o=p).prototype=Object.create(g.prototype),o.prototype.constructor=o,o.__proto__=g;var m=p.prototype;return m.isWithContent=function(){return this.getTitle()||this._getContent()},m.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-popover-"+e)},m.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},m.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(f),this.getTitle());var n=this._getContent();"function"==typeof n&&(n=n.call(this.element)),this.setElementContent(e.find(d),n),e.removeClass(c+" "+u)},m._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},m._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(a);null!==n&&n.length>0&&e.removeClass(n.join(""))},p._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s="object"==typeof e?e:null;if((i||!/destroy|hide/.test(e))&&(i||(i=new p(this,s),t(this).data(n,i)),"string"==typeof e)){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}})},s(p,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return l}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return n}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return i}},{key:"DefaultType",get:function(){return h}}]),p}(U);return t.fn[e]=g._jQueryInterface,t.fn[e].Constructor=g,t.fn[e].noConflict=function(){return t.fn[e]=o,g._jQueryInterface},g}(e),K=function(t){var e="scrollspy",n="bs.scrollspy",i="."+n,o=t.fn[e],a={offset:10,method:"auto",target:""},l={offset:"number",method:"string",target:"(string|element)"},h={ACTIVATE:"activate"+i,SCROLL:"scroll"+i,LOAD_DATA_API:"load"+i+".data-api"},c="dropdown-item",u="active",f={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",NAV_LIST_GROUP:".nav, .list-group",NAV_LINKS:".nav-link",NAV_ITEMS:".nav-item",LIST_ITEMS:".list-group-item",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},d="offset",_="position",g=function(){function o(e,n){var i=this;this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(n),this._selector=this._config.target+" "+f.NAV_LINKS+","+this._config.target+" "+f.LIST_ITEMS+","+this._config.target+" "+f.DROPDOWN_ITEMS,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,t(this._scrollElement).on(h.SCROLL,function(t){return i._process(t)}),this.refresh(),this._process()}var g=o.prototype;return g.refresh=function(){var e=this,n=this._scrollElement===this._scrollElement.window?d:_,i="auto"===this._config.method?n:this._config.method,s=i===_?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),t.makeArray(t(this._selector)).map(function(e){var n,r=P.getSelectorFromElement(e);if(r&&(n=t(r)[0]),n){var o=n.getBoundingClientRect();if(o.width||o.height)return[t(n)[i]().top+s,r]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},g.dispose=function(){t.removeData(this._element,n),t(this._scrollElement).off(i),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},g._getConfig=function(n){if("string"!=typeof(n=r({},a,n)).target){var i=t(n.target).attr("id");i||(i=P.getUID(e),t(n.target).attr("id",i)),n.target="#"+i}return P.typeCheckConfig(e,n,l),n},g._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},g._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},g._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},g._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var s=this._offsets.length;s--;){this._activeTarget!==this._targets[s]&&t>=this._offsets[s]&&("undefined"==typeof this._offsets[s+1]||t=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(e),t.Util=P,t.Alert=L,t.Button=R,t.Carousel=j,t.Collapse=H,t.Dropdown=W,t.Modal=M,t.Popover=x,t.Scrollspy=K,t.Tab=V,t.Tooltip=U,Object.defineProperty(t,"__esModule",{value:!0})}); +//# sourceMappingURL=bootstrap.min.js.map \ No newline at end of file diff --git a/pkg/ui/v1beta1/frontend/public/scripts/d3.v5.min.js b/pkg/ui/v1beta1/frontend/public/scripts/d3.v5.min.js new file mode 100644 index 00000000000..e9db321be9b --- /dev/null +++ b/pkg/ui/v1beta1/frontend/public/scripts/d3.v5.min.js @@ -0,0 +1,2 @@ +// https://d3js.org v5.12.0 Copyright 2019 Mike Bostock +!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((t=t||self).d3=t.d3||{})}(this,function(t){"use strict";function n(t,n){return tn?1:t>=n?0:NaN}function e(t){var e;return 1===t.length&&(e=t,t=function(t,r){return n(e(t),r)}),{left:function(n,e,r,i){for(null==r&&(r=0),null==i&&(i=n.length);r>>1;t(n[o],e)<0?r=o+1:i=o}return r},right:function(n,e,r,i){for(null==r&&(r=0),null==i&&(i=n.length);r>>1;t(n[o],e)>0?i=o:r=o+1}return r}}}var r=e(n),i=r.right,o=r.left;function a(t,n){return[t,n]}function u(t){return null===t?NaN:+t}function c(t,n){var e,r,i=t.length,o=0,a=-1,c=0,f=0;if(null==n)for(;++a1)return f/(o-1)}function f(t,n){var e=c(t,n);return e?Math.sqrt(e):e}function s(t,n){var e,r,i,o=t.length,a=-1;if(null==n){for(;++a=e)for(r=i=e;++ae&&(r=e),i=e)for(r=i=e;++ae&&(r=e),i0)return[t];if((r=n0)for(t=Math.ceil(t/a),n=Math.floor(n/a),o=new Array(i=Math.ceil(n-t+1));++u=0?(o>=y?10:o>=_?5:o>=b?2:1)*Math.pow(10,i):-Math.pow(10,-i)/(o>=y?10:o>=_?5:o>=b?2:1)}function w(t,n,e){var r=Math.abs(n-t)/Math.max(0,e),i=Math.pow(10,Math.floor(Math.log(r)/Math.LN10)),o=r/i;return o>=y?i*=10:o>=_?i*=5:o>=b&&(i*=2),n=1)return+e(t[r-1],r-1,t);var r,i=(r-1)*n,o=Math.floor(i),a=+e(t[o],o,t);return a+(+e(t[o+1],o+1,t)-a)*(i-o)}}function A(t,n){var e,r,i=t.length,o=-1;if(null==n){for(;++o=e)for(r=e;++or&&(r=e)}else for(;++o=e)for(r=e;++or&&(r=e);return r}function T(t){for(var n,e,r,i=t.length,o=-1,a=0;++o=0;)for(n=(r=t[i]).length;--n>=0;)e[--a]=r[n];return e}function S(t,n){var e,r,i=t.length,o=-1;if(null==n){for(;++o=e)for(r=e;++oe&&(r=e)}else for(;++o=e)for(r=e;++oe&&(r=e);return r}function k(t){if(!(i=t.length))return[];for(var n=-1,e=S(t,E),r=new Array(e);++n=0&&(e=t.slice(r+1),t=t.slice(0,r)),t&&!n.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:e}})}function X(t,n){for(var e,r=0,i=t.length;r0)for(var e,r,i=new Array(e),o=0;o=0&&"xmlns"!==(n=t.slice(0,e))&&(t=t.slice(e+1)),$.hasOwnProperty(n)?{space:$[n],local:t}:t}function Z(t){var n=W(t);return(n.local?function(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}:function(t){return function(){var n=this.ownerDocument,e=this.namespaceURI;return e===V&&n.documentElement.namespaceURI===V?n.createElement(t):n.createElementNS(e,t)}})(n)}function Q(){}function K(t){return null==t?Q:function(){return this.querySelector(t)}}function J(){return[]}function tt(t){return null==t?J:function(){return this.querySelectorAll(t)}}function nt(t){return function(){return this.matches(t)}}function et(t){return new Array(t.length)}function rt(t,n){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=n}rt.prototype={constructor:rt,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,n){return this._parent.insertBefore(t,n)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}};var it="$";function ot(t,n,e,r,i,o){for(var a,u=0,c=n.length,f=o.length;un?1:t>=n?0:NaN}function ct(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function ft(t,n){return t.style.getPropertyValue(n)||ct(t).getComputedStyle(t,null).getPropertyValue(n)}function st(t){return t.trim().split(/^|\s+/)}function lt(t){return t.classList||new ht(t)}function ht(t){this._node=t,this._names=st(t.getAttribute("class")||"")}function dt(t,n){for(var e=lt(t),r=-1,i=n.length;++r=0&&(this._names.splice(n,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var Mt={};(t.event=null,"undefined"!=typeof document)&&("onmouseenter"in document.documentElement||(Mt={mouseenter:"mouseover",mouseleave:"mouseout"}));function Nt(t,n,e){return t=At(t,n,e),function(n){var e=n.relatedTarget;e&&(e===this||8&e.compareDocumentPosition(this))||t.call(this,n)}}function At(n,e,r){return function(i){var o=t.event;t.event=i;try{n.call(this,this.__data__,e,r)}finally{t.event=o}}}function Tt(t){return function(){var n=this.__on;if(n){for(var e,r=0,i=-1,o=n.length;r=m&&(m=b+1);!(_=g[m])&&++m=0;)(r=i[o])&&(a&&4^r.compareDocumentPosition(a)&&a.parentNode.insertBefore(r,a),a=r);return this},sort:function(t){function n(n,e){return n&&e?t(n.__data__,e.__data__):!n-!e}t||(t=ut);for(var e=this._groups,r=e.length,i=new Array(r),o=0;o1?this.each((null==n?function(t){return function(){this.style.removeProperty(t)}}:"function"==typeof n?function(t,n,e){return function(){var r=n.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,e)}}:function(t,n,e){return function(){this.style.setProperty(t,n,e)}})(t,n,null==e?"":e)):ft(this.node(),t)},property:function(t,n){return arguments.length>1?this.each((null==n?function(t){return function(){delete this[t]}}:"function"==typeof n?function(t,n){return function(){var e=n.apply(this,arguments);null==e?delete this[t]:this[t]=e}}:function(t,n){return function(){this[t]=n}})(t,n)):this.node()[t]},classed:function(t,n){var e=st(t+"");if(arguments.length<2){for(var r=lt(this.node()),i=-1,o=e.length;++i=0&&(n=t.slice(e+1),t=t.slice(0,e)),{type:t,name:n}})}(t+""),a=o.length;if(!(arguments.length<2)){for(u=n?St:Tt,null==e&&(e=!1),r=0;r>8&15|n>>4&240,n>>4&15|240&n,(15&n)<<4|15&n,1):(n=on.exec(t))?gn(parseInt(n[1],16)):(n=an.exec(t))?new mn(n[1],n[2],n[3],1):(n=un.exec(t))?new mn(255*n[1]/100,255*n[2]/100,255*n[3]/100,1):(n=cn.exec(t))?yn(n[1],n[2],n[3],n[4]):(n=fn.exec(t))?yn(255*n[1]/100,255*n[2]/100,255*n[3]/100,n[4]):(n=sn.exec(t))?Nn(n[1],n[2]/100,n[3]/100,1):(n=ln.exec(t))?Nn(n[1],n[2]/100,n[3]/100,n[4]):hn.hasOwnProperty(t)?gn(hn[t]):"transparent"===t?new mn(NaN,NaN,NaN,0):null}function gn(t){return new mn(t>>16&255,t>>8&255,255&t,1)}function yn(t,n,e,r){return r<=0&&(t=n=e=NaN),new mn(t,n,e,r)}function _n(t){return t instanceof Jt||(t=vn(t)),t?new mn((t=t.rgb()).r,t.g,t.b,t.opacity):new mn}function bn(t,n,e,r){return 1===arguments.length?_n(t):new mn(t,n,e,null==r?1:r)}function mn(t,n,e,r){this.r=+t,this.g=+n,this.b=+e,this.opacity=+r}function xn(){return"#"+Mn(this.r)+Mn(this.g)+Mn(this.b)}function wn(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(1===t?")":", "+t+")")}function Mn(t){return((t=Math.max(0,Math.min(255,Math.round(t)||0)))<16?"0":"")+t.toString(16)}function Nn(t,n,e,r){return r<=0?t=n=e=NaN:e<=0||e>=1?t=n=NaN:n<=0&&(t=NaN),new Sn(t,n,e,r)}function An(t){if(t instanceof Sn)return new Sn(t.h,t.s,t.l,t.opacity);if(t instanceof Jt||(t=vn(t)),!t)return new Sn;if(t instanceof Sn)return t;var n=(t=t.rgb()).r/255,e=t.g/255,r=t.b/255,i=Math.min(n,e,r),o=Math.max(n,e,r),a=NaN,u=o-i,c=(o+i)/2;return u?(a=n===o?(e-r)/u+6*(e0&&c<1?0:a,new Sn(a,u,c,t.opacity)}function Tn(t,n,e,r){return 1===arguments.length?An(t):new Sn(t,n,e,null==r?1:r)}function Sn(t,n,e,r){this.h=+t,this.s=+n,this.l=+e,this.opacity=+r}function kn(t,n,e){return 255*(t<60?n+(e-n)*t/60:t<180?e:t<240?n+(e-n)*(240-t)/60:n)}Qt(Jt,vn,{copy:function(t){return Object.assign(new this.constructor,this,t)},displayable:function(){return this.rgb().displayable()},hex:dn,formatHex:dn,formatHsl:function(){return An(this).formatHsl()},formatRgb:pn,toString:pn}),Qt(mn,bn,Kt(Jt,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new mn(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new mn(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},displayable:function(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:xn,formatHex:xn,formatRgb:wn,toString:wn})),Qt(Sn,Tn,Kt(Jt,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new Sn(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new Sn(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),n=isNaN(t)||isNaN(this.s)?0:this.s,e=this.l,r=e+(e<.5?e:1-e)*n,i=2*e-r;return new mn(kn(t>=240?t-240:t+120,i,r),kn(t,i,r),kn(t<120?t+240:t-120,i,r),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"hsl(":"hsla(")+(this.h||0)+", "+100*(this.s||0)+"%, "+100*(this.l||0)+"%"+(1===t?")":", "+t+")")}}));var En=Math.PI/180,Cn=180/Math.PI,Pn=.96422,zn=1,Rn=.82521,Dn=4/29,qn=6/29,Ln=3*qn*qn,Un=qn*qn*qn;function On(t){if(t instanceof Yn)return new Yn(t.l,t.a,t.b,t.opacity);if(t instanceof Vn)return $n(t);t instanceof mn||(t=_n(t));var n,e,r=jn(t.r),i=jn(t.g),o=jn(t.b),a=Fn((.2225045*r+.7168786*i+.0606169*o)/zn);return r===i&&i===o?n=e=a:(n=Fn((.4360747*r+.3850649*i+.1430804*o)/Pn),e=Fn((.0139322*r+.0971045*i+.7141733*o)/Rn)),new Yn(116*a-16,500*(n-a),200*(a-e),t.opacity)}function Bn(t,n,e,r){return 1===arguments.length?On(t):new Yn(t,n,e,null==r?1:r)}function Yn(t,n,e,r){this.l=+t,this.a=+n,this.b=+e,this.opacity=+r}function Fn(t){return t>Un?Math.pow(t,1/3):t/Ln+Dn}function In(t){return t>qn?t*t*t:Ln*(t-Dn)}function Hn(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function jn(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function Xn(t){if(t instanceof Vn)return new Vn(t.h,t.c,t.l,t.opacity);if(t instanceof Yn||(t=On(t)),0===t.a&&0===t.b)return new Vn(NaN,0=1?(e=1,n-1):Math.floor(e*n),i=t[r],o=t[r+1],a=r>0?t[r-1]:2*i-o,u=r180||e<-180?e-360*Math.round(e/360):e):ce(isNaN(t)?n:t)}function le(t){return 1==(t=+t)?he:function(n,e){return e-n?function(t,n,e){return t=Math.pow(t,e),n=Math.pow(n,e)-t,e=1/e,function(r){return Math.pow(t+r*n,e)}}(n,e,t):ce(isNaN(n)?e:n)}}function he(t,n){var e=n-t;return e?fe(t,e):ce(isNaN(t)?n:t)}Qt(ie,re,Kt(Jt,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new ie(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new ie(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=isNaN(this.h)?0:(this.h+120)*En,n=+this.l,e=isNaN(this.s)?0:this.s*n*(1-n),r=Math.cos(t),i=Math.sin(t);return new mn(255*(n+e*(Wn*r+Zn*i)),255*(n+e*(Qn*r+Kn*i)),255*(n+e*(Jn*r)),this.opacity)}}));var de=function t(n){var e=le(n);function r(t,n){var r=e((t=bn(t)).r,(n=bn(n)).r),i=e(t.g,n.g),o=e(t.b,n.b),a=he(t.opacity,n.opacity);return function(n){return t.r=r(n),t.g=i(n),t.b=o(n),t.opacity=a(n),t+""}}return r.gamma=t,r}(1);function pe(t){return function(n){var e,r,i=n.length,o=new Array(i),a=new Array(i),u=new Array(i);for(e=0;eo&&(i=n.slice(o,i),u[a]?u[a]+=i:u[++a]=i),(e=e[0])===(r=r[0])?u[a]?u[a]+=r:u[++a]=r:(u[++a]=null,c.push({i:a,x:be(e,r)})),o=we.lastIndex;return o180?n+=360:n-t>180&&(t+=360),o.push({i:e.push(i(e)+"rotate(",null,r)-2,x:be(t,n)})):n&&e.push(i(e)+"rotate("+n+r)}(o.rotate,a.rotate,u,c),function(t,n,e,o){t!==n?o.push({i:e.push(i(e)+"skewX(",null,r)-2,x:be(t,n)}):n&&e.push(i(e)+"skewX("+n+r)}(o.skewX,a.skewX,u,c),function(t,n,e,r,o,a){if(t!==e||n!==r){var u=o.push(i(o)+"scale(",null,",",null,")");a.push({i:u-4,x:be(t,e)},{i:u-2,x:be(n,r)})}else 1===e&&1===r||o.push(i(o)+"scale("+e+","+r+")")}(o.scaleX,o.scaleY,a.scaleX,a.scaleY,u,c),o=a=null,function(t){for(var n,e=-1,r=c.length;++e=0&&n._call.call(null,t),n=n._next;--Je}function dr(){ir=(rr=ar.now())+or,Je=tr=0;try{hr()}finally{Je=0,function(){var t,n,e=Qe,r=1/0;for(;e;)e._call?(r>e._time&&(r=e._time),t=e,e=e._next):(n=e._next,e._next=null,e=t?t._next=n:Qe=n);Ke=t,vr(r)}(),ir=0}}function pr(){var t=ar.now(),n=t-rr;n>er&&(or-=n,rr=t)}function vr(t){Je||(tr&&(tr=clearTimeout(tr)),t-ir>24?(t<1/0&&(tr=setTimeout(dr,t-ar.now()-or)),nr&&(nr=clearInterval(nr))):(nr||(rr=ar.now(),nr=setInterval(pr,er)),Je=1,ur(dr)))}function gr(t,n,e){var r=new sr;return n=null==n?0:+n,r.restart(function(e){r.stop(),t(e+n)},n,e),r}sr.prototype=lr.prototype={constructor:sr,restart:function(t,n,e){if("function"!=typeof t)throw new TypeError("callback is not a function");e=(null==e?cr():+e)+(null==n?0:+n),this._next||Ke===this||(Ke?Ke._next=this:Qe=this,Ke=this),this._call=t,this._time=e,vr()},stop:function(){this._call&&(this._call=null,this._time=1/0,vr())}};var yr=I("start","end","cancel","interrupt"),_r=[],br=0,mr=1,xr=2,wr=3,Mr=4,Nr=5,Ar=6;function Tr(t,n,e,r,i,o){var a=t.__transition;if(a){if(e in a)return}else t.__transition={};!function(t,n,e){var r,i=t.__transition;function o(c){var f,s,l,h;if(e.state!==mr)return u();for(f in i)if((h=i[f]).name===e.name){if(h.state===wr)return gr(o);h.state===Mr?(h.state=Ar,h.timer.stop(),h.on.call("interrupt",t,t.__data__,h.index,h.group),delete i[f]):+fbr)throw new Error("too late; already scheduled");return e}function kr(t,n){var e=Er(t,n);if(e.state>wr)throw new Error("too late; already running");return e}function Er(t,n){var e=t.__transition;if(!e||!(e=e[n]))throw new Error("transition not found");return e}function Cr(t,n){var e,r,i,o=t.__transition,a=!0;if(o){for(i in n=null==n?null:n+"",o)(e=o[i]).name===n?(r=e.state>xr&&e.state=0&&(t=t.slice(0,n)),!t||"start"===t})}(n)?Sr:kr;return function(){var a=o(this,t),u=a.on;u!==r&&(i=(r=u).copy()).on(n,e),a.on=i}}(e,t,n))},attr:function(t,n){var e=W(t),r="transform"===e?qe:zr;return this.attrTween(t,"function"==typeof n?(e.local?function(t,n,e){var r,i,o;return function(){var a,u,c=e(this);if(null!=c)return(a=this.getAttributeNS(t.space,t.local))===(u=c+"")?null:a===r&&u===i?o:(i=u,o=n(r=a,c));this.removeAttributeNS(t.space,t.local)}}:function(t,n,e){var r,i,o;return function(){var a,u,c=e(this);if(null!=c)return(a=this.getAttribute(t))===(u=c+"")?null:a===r&&u===i?o:(i=u,o=n(r=a,c));this.removeAttribute(t)}})(e,r,Pr(this,"attr."+t,n)):null==n?(e.local?function(t){return function(){this.removeAttributeNS(t.space,t.local)}}:function(t){return function(){this.removeAttribute(t)}})(e):(e.local?function(t,n,e){var r,i,o=e+"";return function(){var a=this.getAttributeNS(t.space,t.local);return a===o?null:a===r?i:i=n(r=a,e)}}:function(t,n,e){var r,i,o=e+"";return function(){var a=this.getAttribute(t);return a===o?null:a===r?i:i=n(r=a,e)}})(e,r,n))},attrTween:function(t,n){var e="attr."+t;if(arguments.length<2)return(e=this.tween(e))&&e._value;if(null==n)return this.tween(e,null);if("function"!=typeof n)throw new Error;var r=W(t);return this.tween(e,(r.local?function(t,n){var e,r;function i(){var i=n.apply(this,arguments);return i!==r&&(e=(r=i)&&function(t,n){return function(e){this.setAttributeNS(t.space,t.local,n(e))}}(t,i)),e}return i._value=n,i}:function(t,n){var e,r;function i(){var i=n.apply(this,arguments);return i!==r&&(e=(r=i)&&function(t,n){return function(e){this.setAttribute(t,n(e))}}(t,i)),e}return i._value=n,i})(r,n))},style:function(t,n,e){var r="transform"==(t+="")?De:zr;return null==n?this.styleTween(t,function(t,n){var e,r,i;return function(){var o=ft(this,t),a=(this.style.removeProperty(t),ft(this,t));return o===a?null:o===e&&a===r?i:i=n(e=o,r=a)}}(t,r)).on("end.style."+t,Dr(t)):"function"==typeof n?this.styleTween(t,function(t,n,e){var r,i,o;return function(){var a=ft(this,t),u=e(this),c=u+"";return null==u&&(this.style.removeProperty(t),c=u=ft(this,t)),a===c?null:a===r&&c===i?o:(i=c,o=n(r=a,u))}}(t,r,Pr(this,"style."+t,n))).each(function(t,n){var e,r,i,o,a="style."+n,u="end."+a;return function(){var c=kr(this,t),f=c.on,s=null==c.value[a]?o||(o=Dr(n)):void 0;f===e&&i===s||(r=(e=f).copy()).on(u,i=s),c.on=r}}(this._id,t)):this.styleTween(t,function(t,n,e){var r,i,o=e+"";return function(){var a=ft(this,t);return a===o?null:a===r?i:i=n(r=a,e)}}(t,r,n),e).on("end.style."+t,null)},styleTween:function(t,n,e){var r="style."+(t+="");if(arguments.length<2)return(r=this.tween(r))&&r._value;if(null==n)return this.tween(r,null);if("function"!=typeof n)throw new Error;return this.tween(r,function(t,n,e){var r,i;function o(){var o=n.apply(this,arguments);return o!==i&&(r=(i=o)&&function(t,n,e){return function(r){this.style.setProperty(t,n(r),e)}}(t,o,e)),r}return o._value=n,o}(t,n,null==e?"":e))},text:function(t){return this.tween("text","function"==typeof t?function(t){return function(){var n=t(this);this.textContent=null==n?"":n}}(Pr(this,"text",t)):function(t){return function(){this.textContent=t}}(null==t?"":t+""))},remove:function(){return this.on("end.remove",function(t){return function(){var n=this.parentNode;for(var e in this.__transition)if(+e!==t)return;n&&n.removeChild(this)}}(this._id))},tween:function(t,n){var e=this._id;if(t+="",arguments.length<2){for(var r,i=Er(this.node(),e).tween,o=0,a=i.length;o0&&(r=o-P),M<0?d=p-z:M>0&&(u=c-z),x=wi,B.attr("cursor",Ci.selection),I());break;default:return}mi()},!0).on("keyup.brush",function(){switch(t.event.keyCode){case 16:R&&(g=y=R=!1,I());break;case 18:x===Ni&&(w<0?f=h:w>0&&(r=o),M<0?d=p:M>0&&(u=c),x=Mi,I());break;case 32:x===wi&&(t.event.altKey?(w&&(f=h-P*w,r=o+P*w),M&&(d=p-z*M,u=c+z*M),x=Ni):(w<0?f=h:w>0&&(r=o),M<0?d=p:M>0&&(u=c),x=Mi),B.attr("cursor",Ci[m]),I());break;default:return}mi()},!0),Ht(t.event.view)}bi(),Cr(b),s.call(b),U.start()}function F(){var t=D(b);!R||g||y||(Math.abs(t[0]-L[0])>Math.abs(t[1]-L[1])?y=!0:g=!0),L=t,v=!0,mi(),I()}function I(){var t;switch(P=L[0]-q[0],z=L[1]-q[1],x){case wi:case xi:w&&(P=Math.max(S-r,Math.min(E-f,P)),o=r+P,h=f+P),M&&(z=Math.max(k-u,Math.min(C-d,z)),c=u+z,p=d+z);break;case Mi:w<0?(P=Math.max(S-r,Math.min(E-r,P)),o=r+P,h=f):w>0&&(P=Math.max(S-f,Math.min(E-f,P)),o=r,h=f+P),M<0?(z=Math.max(k-u,Math.min(C-u,z)),c=u+z,p=d):M>0&&(z=Math.max(k-d,Math.min(C-d,z)),c=u,p=d+z);break;case Ni:w&&(o=Math.max(S,Math.min(E,r-P*w)),h=Math.max(S,Math.min(E,f+P*w))),M&&(c=Math.max(k,Math.min(C,u-z*M)),p=Math.max(k,Math.min(C,d+z*M)))}h1e-6)if(Math.abs(s*u-c*f)>1e-6&&i){var h=e-o,d=r-a,p=u*u+c*c,v=h*h+d*d,g=Math.sqrt(p),y=Math.sqrt(l),_=i*Math.tan((Zi-Math.acos((p+l-v)/(2*g*y)))/2),b=_/y,m=_/g;Math.abs(b-1)>1e-6&&(this._+="L"+(t+b*f)+","+(n+b*s)),this._+="A"+i+","+i+",0,0,"+ +(s*h>f*d)+","+(this._x1=t+m*u)+","+(this._y1=n+m*c)}else this._+="L"+(this._x1=t)+","+(this._y1=n);else;},arc:function(t,n,e,r,i,o){t=+t,n=+n,o=!!o;var a=(e=+e)*Math.cos(r),u=e*Math.sin(r),c=t+a,f=n+u,s=1^o,l=o?r-i:i-r;if(e<0)throw new Error("negative radius: "+e);null===this._x1?this._+="M"+c+","+f:(Math.abs(this._x1-c)>1e-6||Math.abs(this._y1-f)>1e-6)&&(this._+="L"+c+","+f),e&&(l<0&&(l=l%Qi+Qi),l>Ki?this._+="A"+e+","+e+",0,1,"+s+","+(t-a)+","+(n-u)+"A"+e+","+e+",0,1,"+s+","+(this._x1=c)+","+(this._y1=f):l>1e-6&&(this._+="A"+e+","+e+",0,"+ +(l>=Zi)+","+s+","+(this._x1=t+e*Math.cos(i))+","+(this._y1=n+e*Math.sin(i))))},rect:function(t,n,e,r){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+n)+"h"+ +e+"v"+ +r+"h"+-e+"Z"},toString:function(){return this._}};function ao(){}function uo(t,n){var e=new ao;if(t instanceof ao)t.each(function(t,n){e.set(n,t)});else if(Array.isArray(t)){var r,i=-1,o=t.length;if(null==n)for(;++ir!=d>r&&e<(h-f)*(r-s)/(d-s)+f&&(i=-i)}return i}function xo(t,n,e){var r,i,o,a;return function(t,n,e){return(n[0]-t[0])*(e[1]-t[1])==(e[0]-t[0])*(n[1]-t[1])}(t,n,e)&&(i=t[r=+(t[0]===n[0])],o=e[r],a=n[r],i<=o&&o<=a||a<=o&&o<=i)}function wo(){}var Mo=[[],[[[1,1.5],[.5,1]]],[[[1.5,1],[1,1.5]]],[[[1.5,1],[.5,1]]],[[[1,.5],[1.5,1]]],[[[1,1.5],[.5,1]],[[1,.5],[1.5,1]]],[[[1,.5],[1,1.5]]],[[[1,.5],[.5,1]]],[[[.5,1],[1,.5]]],[[[1,1.5],[1,.5]]],[[[.5,1],[1,.5]],[[1.5,1],[1,1.5]]],[[[1.5,1],[1,.5]]],[[[.5,1],[1.5,1]]],[[[1,1.5],[1.5,1]]],[[[.5,1],[1,1.5]]],[]];function No(){var t=1,n=1,e=M,r=u;function i(t){var n=e(t);if(Array.isArray(n))n=n.slice().sort(yo);else{var r=s(t),i=r[0],a=r[1];n=w(i,a,n),n=g(Math.floor(i/n)*n,Math.floor(a/n)*n,n)}return n.map(function(n){return o(t,n)})}function o(e,i){var o=[],u=[];return function(e,r,i){var o,u,c,f,s,l,h=new Array,d=new Array;o=u=-1,f=e[0]>=r,Mo[f<<1].forEach(p);for(;++o=r,Mo[c|f<<1].forEach(p);Mo[f<<0].forEach(p);for(;++u=r,s=e[u*t]>=r,Mo[f<<1|s<<2].forEach(p);++o=r,l=s,s=e[u*t+o+1]>=r,Mo[c|f<<1|s<<2|l<<3].forEach(p);Mo[f|s<<3].forEach(p)}o=-1,s=e[u*t]>=r,Mo[s<<2].forEach(p);for(;++o=r,Mo[s<<2|l<<3].forEach(p);function p(t){var n,e,r=[t[0][0]+o,t[0][1]+u],c=[t[1][0]+o,t[1][1]+u],f=a(r),s=a(c);(n=d[f])?(e=h[s])?(delete d[n.end],delete h[e.start],n===e?(n.ring.push(c),i(n.ring)):h[n.start]=d[e.end]={start:n.start,end:e.end,ring:n.ring.concat(e.ring)}):(delete d[n.end],n.ring.push(c),d[n.end=s]=n):(n=h[s])?(e=d[f])?(delete h[n.start],delete d[e.end],n===e?(n.ring.push(c),i(n.ring)):h[e.start]=d[n.end]={start:e.start,end:n.end,ring:e.ring.concat(n.ring)}):(delete h[n.start],n.ring.unshift(r),h[n.start=f]=n):h[f]=d[s]={start:f,end:s,ring:[r,c]}}Mo[s<<3].forEach(p)}(e,i,function(t){r(t,e,i),function(t){for(var n=0,e=t.length,r=t[e-1][1]*t[0][0]-t[e-1][0]*t[0][1];++n0?o.push([t]):u.push(t)}),u.forEach(function(t){for(var n,e=0,r=o.length;e0&&a0&&u0&&o>0))throw new Error("invalid size");return t=r,n=o,i},i.thresholds=function(t){return arguments.length?(e="function"==typeof t?t:Array.isArray(t)?_o(go.call(t)):_o(t),i):e},i.smooth=function(t){return arguments.length?(r=t?u:wo,i):r===u},i}function Ao(t,n,e){for(var r=t.width,i=t.height,o=1+(e<<1),a=0;a=e&&(u>=o&&(c-=t.data[u-o+a*r]),n.data[u-e+a*r]=c/Math.min(u+1,r-1+o-u,o))}function To(t,n,e){for(var r=t.width,i=t.height,o=1+(e<<1),a=0;a=e&&(u>=o&&(c-=t.data[a+(u-o)*r]),n.data[a+(u-e)*r]=c/Math.min(u+1,i-1+o-u,o))}function So(t){return t[0]}function ko(t){return t[1]}function Eo(){return 1}var Co={},Po={},zo=34,Ro=10,Do=13;function qo(t){return new Function("d","return {"+t.map(function(t,n){return JSON.stringify(t)+": d["+n+"]"}).join(",")+"}")}function Lo(t){var n=Object.create(null),e=[];return t.forEach(function(t){for(var r in t)r in n||e.push(n[r]=r)}),e}function Uo(t,n){var e=t+"",r=e.length;return r9999?"+"+Uo(t,6):Uo(t,4)}(t.getUTCFullYear())+"-"+Uo(t.getUTCMonth()+1,2)+"-"+Uo(t.getUTCDate(),2)+(i?"T"+Uo(n,2)+":"+Uo(e,2)+":"+Uo(r,2)+"."+Uo(i,3)+"Z":r?"T"+Uo(n,2)+":"+Uo(e,2)+":"+Uo(r,2)+"Z":e||n?"T"+Uo(n,2)+":"+Uo(e,2)+"Z":"")}function Bo(t){var n=new RegExp('["'+t+"\n\r]"),e=t.charCodeAt(0);function r(t,n){var r,i=[],o=t.length,a=0,u=0,c=o<=0,f=!1;function s(){if(c)return Po;if(f)return f=!1,Co;var n,r,i=a;if(t.charCodeAt(i)===zo){for(;a++=o?c=!0:(r=t.charCodeAt(a++))===Ro?f=!0:r===Do&&(f=!0,t.charCodeAt(a)===Ro&&++a),t.slice(i+1,n-1).replace(/""/g,'"')}for(;a=(o=(v+y)/2))?v=o:y=o,(s=e>=(a=(g+_)/2))?g=a:_=a,i=d,!(d=d[l=s<<1|f]))return i[l]=p,t;if(u=+t._x.call(null,d.data),c=+t._y.call(null,d.data),n===u&&e===c)return p.next=d,i?i[l]=p:t._root=p,t;do{i=i?i[l]=new Array(4):t._root=new Array(4),(f=n>=(o=(v+y)/2))?v=o:y=o,(s=e>=(a=(g+_)/2))?g=a:_=a}while((l=s<<1|f)==(h=(c>=a)<<1|u>=o));return i[h]=d,i[l]=p,t}function da(t,n,e,r,i){this.node=t,this.x0=n,this.y0=e,this.x1=r,this.y1=i}function pa(t){return t[0]}function va(t){return t[1]}function ga(t,n,e){var r=new ya(null==n?pa:n,null==e?va:e,NaN,NaN,NaN,NaN);return null==t?r:r.addAll(t)}function ya(t,n,e,r,i,o){this._x=t,this._y=n,this._x0=e,this._y0=r,this._x1=i,this._y1=o,this._root=void 0}function _a(t){for(var n={data:t.data},e=n;t=t.next;)e=e.next={data:t.data};return n}var ba=ga.prototype=ya.prototype;function ma(t){return t.x+t.vx}function xa(t){return t.y+t.vy}function wa(t){return t.index}function Ma(t,n){var e=t.get(n);if(!e)throw new Error("missing: "+n);return e}function Na(t){return t.x}function Aa(t){return t.y}ba.copy=function(){var t,n,e=new ya(this._x,this._y,this._x0,this._y0,this._x1,this._y1),r=this._root;if(!r)return e;if(!r.length)return e._root=_a(r),e;for(t=[{source:r,target:e._root=new Array(4)}];r=t.pop();)for(var i=0;i<4;++i)(n=r.source[i])&&(n.length?t.push({source:n,target:r.target[i]=new Array(4)}):r.target[i]=_a(n));return e},ba.add=function(t){var n=+this._x.call(null,t),e=+this._y.call(null,t);return ha(this.cover(n,e),n,e,t)},ba.addAll=function(t){var n,e,r,i,o=t.length,a=new Array(o),u=new Array(o),c=1/0,f=1/0,s=-1/0,l=-1/0;for(e=0;es&&(s=r),il&&(l=i));if(c>s||f>l)return this;for(this.cover(c,f).cover(s,l),e=0;et||t>=i||r>n||n>=o;)switch(u=(nh||(o=c.y0)>d||(a=c.x1)=y)<<1|t>=g)&&(c=p[p.length-1],p[p.length-1]=p[p.length-1-f],p[p.length-1-f]=c)}else{var _=t-+this._x.call(null,v.data),b=n-+this._y.call(null,v.data),m=_*_+b*b;if(m=(u=(p+g)/2))?p=u:g=u,(s=a>=(c=(v+y)/2))?v=c:y=c,n=d,!(d=d[l=s<<1|f]))return this;if(!d.length)break;(n[l+1&3]||n[l+2&3]||n[l+3&3])&&(e=n,h=l)}for(;d.data!==t;)if(r=d,!(d=d.next))return this;return(i=d.next)&&delete d.next,r?(i?r.next=i:delete r.next,this):n?(i?n[l]=i:delete n[l],(d=n[0]||n[1]||n[2]||n[3])&&d===(n[3]||n[2]||n[1]||n[0])&&!d.length&&(e?e[h]=d:this._root=d),this):(this._root=i,this)},ba.removeAll=function(t){for(var n=0,e=t.length;n1?r[0]+r.slice(2):r,+t.slice(e+1)]}function Ea(t){return(t=ka(Math.abs(t)))?t[1]:NaN}var Ca,Pa=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function za(t){if(!(n=Pa.exec(t)))throw new Error("invalid format: "+t);var n;return new Ra({fill:n[1],align:n[2],sign:n[3],symbol:n[4],zero:n[5],width:n[6],comma:n[7],precision:n[8]&&n[8].slice(1),trim:n[9],type:n[10]})}function Ra(t){this.fill=void 0===t.fill?" ":t.fill+"",this.align=void 0===t.align?">":t.align+"",this.sign=void 0===t.sign?"-":t.sign+"",this.symbol=void 0===t.symbol?"":t.symbol+"",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?"":t.type+""}function Da(t,n){var e=ka(t,n);if(!e)return t+"";var r=e[0],i=e[1];return i<0?"0."+new Array(-i).join("0")+r:r.length>i+1?r.slice(0,i+1)+"."+r.slice(i+1):r+new Array(i-r.length+2).join("0")}za.prototype=Ra.prototype,Ra.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};var qa={"%":function(t,n){return(100*t).toFixed(n)},b:function(t){return Math.round(t).toString(2)},c:function(t){return t+""},d:function(t){return Math.round(t).toString(10)},e:function(t,n){return t.toExponential(n)},f:function(t,n){return t.toFixed(n)},g:function(t,n){return t.toPrecision(n)},o:function(t){return Math.round(t).toString(8)},p:function(t,n){return Da(100*t,n)},r:Da,s:function(t,n){var e=ka(t,n);if(!e)return t+"";var r=e[0],i=e[1],o=i-(Ca=3*Math.max(-8,Math.min(8,Math.floor(i/3))))+1,a=r.length;return o===a?r:o>a?r+new Array(o-a+1).join("0"):o>0?r.slice(0,o)+"."+r.slice(o):"0."+new Array(1-o).join("0")+ka(t,Math.max(0,n+o-1))[0]},X:function(t){return Math.round(t).toString(16).toUpperCase()},x:function(t){return Math.round(t).toString(16)}};function La(t){return t}var Ua,Oa=Array.prototype.map,Ba=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function Ya(t){var n,e,r=void 0===t.grouping||void 0===t.thousands?La:(n=Oa.call(t.grouping,Number),e=t.thousands+"",function(t,r){for(var i=t.length,o=[],a=0,u=n[0],c=0;i>0&&u>0&&(c+u+1>r&&(u=Math.max(1,r-c)),o.push(t.substring(i-=u,i+u)),!((c+=u+1)>r));)u=n[a=(a+1)%n.length];return o.reverse().join(e)}),i=void 0===t.currency?"":t.currency[0]+"",o=void 0===t.currency?"":t.currency[1]+"",a=void 0===t.decimal?".":t.decimal+"",u=void 0===t.numerals?La:function(t){return function(n){return n.replace(/[0-9]/g,function(n){return t[+n]})}}(Oa.call(t.numerals,String)),c=void 0===t.percent?"%":t.percent+"",f=void 0===t.minus?"-":t.minus+"",s=void 0===t.nan?"NaN":t.nan+"";function l(t){var n=(t=za(t)).fill,e=t.align,l=t.sign,h=t.symbol,d=t.zero,p=t.width,v=t.comma,g=t.precision,y=t.trim,_=t.type;"n"===_?(v=!0,_="g"):qa[_]||(void 0===g&&(g=12),y=!0,_="g"),(d||"0"===n&&"="===e)&&(d=!0,n="0",e="=");var b="$"===h?i:"#"===h&&/[boxX]/.test(_)?"0"+_.toLowerCase():"",m="$"===h?o:/[%p]/.test(_)?c:"",x=qa[_],w=/[defgprs%]/.test(_);function M(t){var i,o,c,h=b,M=m;if("c"===_)M=x(t)+M,t="";else{var N=(t=+t)<0;if(t=isNaN(t)?s:x(Math.abs(t),g),y&&(t=function(t){t:for(var n,e=t.length,r=1,i=-1;r0){if(!+t[r])break t;i=0}}return i>0?t.slice(0,i)+t.slice(n+1):t}(t)),N&&0==+t&&(N=!1),h=(N?"("===l?l:f:"-"===l||"("===l?"":l)+h,M=("s"===_?Ba[8+Ca/3]:"")+M+(N&&"("===l?")":""),w)for(i=-1,o=t.length;++i(c=t.charCodeAt(i))||c>57){M=(46===c?a+t.slice(i+1):t.slice(i))+M,t=t.slice(0,i);break}}v&&!d&&(t=r(t,1/0));var A=h.length+t.length+M.length,T=A>1)+h+t+M+T.slice(A);break;default:t=T+h+t+M}return u(t)}return g=void 0===g?6:/[gprs]/.test(_)?Math.max(1,Math.min(21,g)):Math.max(0,Math.min(20,g)),M.toString=function(){return t+""},M}return{format:l,formatPrefix:function(t,n){var e=l(((t=za(t)).type="f",t)),r=3*Math.max(-8,Math.min(8,Math.floor(Ea(n)/3))),i=Math.pow(10,-r),o=Ba[8+r/3];return function(t){return e(i*t)+o}}}}function Fa(n){return Ua=Ya(n),t.format=Ua.format,t.formatPrefix=Ua.formatPrefix,Ua}function Ia(t){return Math.max(0,-Ea(Math.abs(t)))}function Ha(t,n){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(Ea(n)/3)))-Ea(Math.abs(t)))}function ja(t,n){return t=Math.abs(t),n=Math.abs(n)-t,Math.max(0,Ea(n)-Ea(t))+1}function Xa(){return new Ga}function Ga(){this.reset()}Fa({decimal:".",thousands:",",grouping:[3],currency:["$",""],minus:"-"}),Ga.prototype={constructor:Ga,reset:function(){this.s=this.t=0},add:function(t){$a(Va,t,this.t),$a(this,Va.s,this.s),this.s?this.t+=Va.t:this.s=Va.t},valueOf:function(){return this.s}};var Va=new Ga;function $a(t,n,e){var r=t.s=n+e,i=r-n,o=r-i;t.t=n-o+(e-i)}var Wa=1e-6,Za=1e-12,Qa=Math.PI,Ka=Qa/2,Ja=Qa/4,tu=2*Qa,nu=180/Qa,eu=Qa/180,ru=Math.abs,iu=Math.atan,ou=Math.atan2,au=Math.cos,uu=Math.ceil,cu=Math.exp,fu=Math.log,su=Math.pow,lu=Math.sin,hu=Math.sign||function(t){return t>0?1:t<0?-1:0},du=Math.sqrt,pu=Math.tan;function vu(t){return t>1?0:t<-1?Qa:Math.acos(t)}function gu(t){return t>1?Ka:t<-1?-Ka:Math.asin(t)}function yu(t){return(t=lu(t/2))*t}function _u(){}function bu(t,n){t&&xu.hasOwnProperty(t.type)&&xu[t.type](t,n)}var mu={Feature:function(t,n){bu(t.geometry,n)},FeatureCollection:function(t,n){for(var e=t.features,r=-1,i=e.length;++r=0?1:-1,i=r*e,o=au(n=(n*=eu)/2+Ja),a=lu(n),u=Eu*a,c=ku*o+u*au(i),f=u*r*lu(i);Cu.add(ou(f,c)),Su=t,ku=o,Eu=a}function Uu(t){return[ou(t[1],t[0]),gu(t[2])]}function Ou(t){var n=t[0],e=t[1],r=au(e);return[r*au(n),r*lu(n),lu(e)]}function Bu(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]}function Yu(t,n){return[t[1]*n[2]-t[2]*n[1],t[2]*n[0]-t[0]*n[2],t[0]*n[1]-t[1]*n[0]]}function Fu(t,n){t[0]+=n[0],t[1]+=n[1],t[2]+=n[2]}function Iu(t,n){return[t[0]*n,t[1]*n,t[2]*n]}function Hu(t){var n=du(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=n,t[1]/=n,t[2]/=n}var ju,Xu,Gu,Vu,$u,Wu,Zu,Qu,Ku,Ju,tc,nc,ec,rc,ic,oc,ac,uc,cc,fc,sc,lc,hc,dc,pc,vc,gc=Xa(),yc={point:_c,lineStart:mc,lineEnd:xc,polygonStart:function(){yc.point=wc,yc.lineStart=Mc,yc.lineEnd=Nc,gc.reset(),zu.polygonStart()},polygonEnd:function(){zu.polygonEnd(),yc.point=_c,yc.lineStart=mc,yc.lineEnd=xc,Cu<0?(ju=-(Gu=180),Xu=-(Vu=90)):gc>Wa?Vu=90:gc<-Wa&&(Xu=-90),Ju[0]=ju,Ju[1]=Gu},sphere:function(){ju=-(Gu=180),Xu=-(Vu=90)}};function _c(t,n){Ku.push(Ju=[ju=t,Gu=t]),nVu&&(Vu=n)}function bc(t,n){var e=Ou([t*eu,n*eu]);if(Qu){var r=Yu(Qu,e),i=Yu([r[1],-r[0],0],r);Hu(i),i=Uu(i);var o,a=t-$u,u=a>0?1:-1,c=i[0]*nu*u,f=ru(a)>180;f^(u*$uVu&&(Vu=o):f^(u*$u<(c=(c+360)%360-180)&&cVu&&(Vu=n)),f?t<$u?Ac(ju,t)>Ac(ju,Gu)&&(Gu=t):Ac(t,Gu)>Ac(ju,Gu)&&(ju=t):Gu>=ju?(tGu&&(Gu=t)):t>$u?Ac(ju,t)>Ac(ju,Gu)&&(Gu=t):Ac(t,Gu)>Ac(ju,Gu)&&(ju=t)}else Ku.push(Ju=[ju=t,Gu=t]);nVu&&(Vu=n),Qu=e,$u=t}function mc(){yc.point=bc}function xc(){Ju[0]=ju,Ju[1]=Gu,yc.point=_c,Qu=null}function wc(t,n){if(Qu){var e=t-$u;gc.add(ru(e)>180?e+(e>0?360:-360):e)}else Wu=t,Zu=n;zu.point(t,n),bc(t,n)}function Mc(){zu.lineStart()}function Nc(){wc(Wu,Zu),zu.lineEnd(),ru(gc)>Wa&&(ju=-(Gu=180)),Ju[0]=ju,Ju[1]=Gu,Qu=null}function Ac(t,n){return(n-=t)<0?n+360:n}function Tc(t,n){return t[0]-n[0]}function Sc(t,n){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nQa?t+Math.round(-t/tu)*tu:t,n]}function Ic(t,n,e){return(t%=tu)?n||e?Yc(jc(t),Xc(n,e)):jc(t):n||e?Xc(n,e):Fc}function Hc(t){return function(n,e){return[(n+=t)>Qa?n-tu:n<-Qa?n+tu:n,e]}}function jc(t){var n=Hc(t);return n.invert=Hc(-t),n}function Xc(t,n){var e=au(t),r=lu(t),i=au(n),o=lu(n);function a(t,n){var a=au(n),u=au(t)*a,c=lu(t)*a,f=lu(n),s=f*e+u*r;return[ou(c*i-s*o,u*e-f*r),gu(s*i+c*o)]}return a.invert=function(t,n){var a=au(n),u=au(t)*a,c=lu(t)*a,f=lu(n),s=f*i-c*o;return[ou(c*i+f*o,u*e+s*r),gu(s*e-u*r)]},a}function Gc(t){function n(n){return(n=t(n[0]*eu,n[1]*eu))[0]*=nu,n[1]*=nu,n}return t=Ic(t[0]*eu,t[1]*eu,t.length>2?t[2]*eu:0),n.invert=function(n){return(n=t.invert(n[0]*eu,n[1]*eu))[0]*=nu,n[1]*=nu,n},n}function Vc(t,n,e,r,i,o){if(e){var a=au(n),u=lu(n),c=r*e;null==i?(i=n+r*tu,o=n-c/2):(i=$c(a,i),o=$c(a,o),(r>0?io)&&(i+=r*tu));for(var f,s=i;r>0?s>o:s1&&n.push(n.pop().concat(n.shift()))},result:function(){var e=n;return n=[],t=null,e}}}function Zc(t,n){return ru(t[0]-n[0])=0;--o)i.point((s=f[o])[0],s[1]);else r(h.x,h.p.x,-1,i);h=h.p}f=(h=h.o).z,d=!d}while(!h.v);i.lineEnd()}}}function Jc(t){if(n=t.length){for(var n,e,r=0,i=t[0];++r=0?1:-1,A=N*M,T=A>Qa,S=v*x;if(tf.add(ou(S*N*lu(A),g*w+S*au(A))),a+=T?M+N*tu:M,T^d>=e^b>=e){var k=Yu(Ou(h),Ou(_));Hu(k);var E=Yu(o,k);Hu(E);var C=(T^M>=0?-1:1)*gu(E[2]);(r>C||r===C&&(k[0]||k[1]))&&(u+=T^M>=0?1:-1)}}return(a<-Wa||a0){for(l||(i.polygonStart(),l=!0),i.lineStart(),t=0;t1&&2&c&&h.push(h.pop().concat(h.shift())),a.push(h.filter(of))}return h}}function of(t){return t.length>1}function af(t,n){return((t=t.x)[0]<0?t[1]-Ka-Wa:Ka-t[1])-((n=n.x)[0]<0?n[1]-Ka-Wa:Ka-n[1])}var uf=rf(function(){return!0},function(t){var n,e=NaN,r=NaN,i=NaN;return{lineStart:function(){t.lineStart(),n=1},point:function(o,a){var u=o>0?Qa:-Qa,c=ru(o-e);ru(c-Qa)0?Ka:-Ka),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(u,r),t.point(o,r),n=0):i!==u&&c>=Qa&&(ru(e-i)Wa?iu((lu(n)*(o=au(r))*lu(e)-lu(r)*(i=au(n))*lu(t))/(i*o*a)):(n+r)/2}(e,r,o,a),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(u,r),n=0),t.point(e=o,r=a),i=u},lineEnd:function(){t.lineEnd(),e=r=NaN},clean:function(){return 2-n}}},function(t,n,e,r){var i;if(null==t)i=e*Ka,r.point(-Qa,i),r.point(0,i),r.point(Qa,i),r.point(Qa,0),r.point(Qa,-i),r.point(0,-i),r.point(-Qa,-i),r.point(-Qa,0),r.point(-Qa,i);else if(ru(t[0]-n[0])>Wa){var o=t[0]0,i=ru(n)>Wa;function o(t,e){return au(t)*au(e)>n}function a(t,e,r){var i=[1,0,0],o=Yu(Ou(t),Ou(e)),a=Bu(o,o),u=o[0],c=a-u*u;if(!c)return!r&&t;var f=n*a/c,s=-n*u/c,l=Yu(i,o),h=Iu(i,f);Fu(h,Iu(o,s));var d=l,p=Bu(h,d),v=Bu(d,d),g=p*p-v*(Bu(h,h)-1);if(!(g<0)){var y=du(g),_=Iu(d,(-p-y)/v);if(Fu(_,h),_=Uu(_),!r)return _;var b,m=t[0],x=e[0],w=t[1],M=e[1];x0^_[1]<(ru(_[0]-m)Qa^(m<=_[0]&&_[0]<=x)){var T=Iu(d,(-p+y)/v);return Fu(T,h),[_,Uu(T)]}}}function u(n,e){var i=r?t:Qa-t,o=0;return n<-i?o|=1:n>i&&(o|=2),e<-i?o|=4:e>i&&(o|=8),o}return rf(o,function(t){var n,e,c,f,s;return{lineStart:function(){f=c=!1,s=1},point:function(l,h){var d,p=[l,h],v=o(l,h),g=r?v?0:u(l,h):v?u(l+(l<0?Qa:-Qa),h):0;if(!n&&(f=c=v)&&t.lineStart(),v!==c&&(!(d=a(n,p))||Zc(n,d)||Zc(p,d))&&(p[0]+=Wa,p[1]+=Wa,v=o(p[0],p[1])),v!==c)s=0,v?(t.lineStart(),d=a(p,n),t.point(d[0],d[1])):(d=a(n,p),t.point(d[0],d[1]),t.lineEnd()),n=d;else if(i&&n&&r^v){var y;g&e||!(y=a(p,n,!0))||(s=0,r?(t.lineStart(),t.point(y[0][0],y[0][1]),t.point(y[1][0],y[1][1]),t.lineEnd()):(t.point(y[1][0],y[1][1]),t.lineEnd(),t.lineStart(),t.point(y[0][0],y[0][1])))}!v||n&&Zc(n,p)||t.point(p[0],p[1]),n=p,c=v,e=g},lineEnd:function(){c&&t.lineEnd(),n=null},clean:function(){return s|(f&&c)<<1}}},function(n,r,i,o){Vc(o,t,e,i,n,r)},r?[0,-t]:[-Qa,t-Qa])}var ff=1e9,sf=-ff;function lf(t,n,e,r){function i(i,o){return t<=i&&i<=e&&n<=o&&o<=r}function o(i,o,u,f){var s=0,l=0;if(null==i||(s=a(i,u))!==(l=a(o,u))||c(i,o)<0^u>0)do{f.point(0===s||3===s?t:e,s>1?r:n)}while((s=(s+u+4)%4)!==l);else f.point(o[0],o[1])}function a(r,i){return ru(r[0]-t)0?0:3:ru(r[0]-e)0?2:1:ru(r[1]-n)0?1:0:i>0?3:2}function u(t,n){return c(t.x,n.x)}function c(t,n){var e=a(t,1),r=a(n,1);return e!==r?e-r:0===e?n[1]-t[1]:1===e?t[0]-n[0]:2===e?t[1]-n[1]:n[0]-t[0]}return function(a){var c,f,s,l,h,d,p,v,g,y,_,b=a,m=Wc(),x={point:w,lineStart:function(){x.point=M,f&&f.push(s=[]);y=!0,g=!1,p=v=NaN},lineEnd:function(){c&&(M(l,h),d&&g&&m.rejoin(),c.push(m.result()));x.point=w,g&&b.lineEnd()},polygonStart:function(){b=m,c=[],f=[],_=!0},polygonEnd:function(){var n=function(){for(var n=0,e=0,i=f.length;er&&(h-o)*(r-a)>(d-a)*(t-o)&&++n:d<=r&&(h-o)*(r-a)<(d-a)*(t-o)&&--n;return n}(),e=_&&n,i=(c=T(c)).length;(e||i)&&(a.polygonStart(),e&&(a.lineStart(),o(null,null,1,a),a.lineEnd()),i&&Kc(c,u,n,o,a),a.polygonEnd());b=a,c=f=s=null}};function w(t,n){i(t,n)&&b.point(t,n)}function M(o,a){var u=i(o,a);if(f&&s.push([o,a]),y)l=o,h=a,d=u,y=!1,u&&(b.lineStart(),b.point(o,a));else if(u&&g)b.point(o,a);else{var c=[p=Math.max(sf,Math.min(ff,p)),v=Math.max(sf,Math.min(ff,v))],m=[o=Math.max(sf,Math.min(ff,o)),a=Math.max(sf,Math.min(ff,a))];!function(t,n,e,r,i,o){var a,u=t[0],c=t[1],f=0,s=1,l=n[0]-u,h=n[1]-c;if(a=e-u,l||!(a>0)){if(a/=l,l<0){if(a0){if(a>s)return;a>f&&(f=a)}if(a=i-u,l||!(a<0)){if(a/=l,l<0){if(a>s)return;a>f&&(f=a)}else if(l>0){if(a0)){if(a/=h,h<0){if(a0){if(a>s)return;a>f&&(f=a)}if(a=o-c,h||!(a<0)){if(a/=h,h<0){if(a>s)return;a>f&&(f=a)}else if(h>0){if(a0&&(t[0]=u+f*l,t[1]=c+f*h),s<1&&(n[0]=u+s*l,n[1]=c+s*h),!0}}}}}(c,m,t,n,e,r)?u&&(b.lineStart(),b.point(o,a),_=!1):(g||(b.lineStart(),b.point(c[0],c[1])),b.point(m[0],m[1]),u||b.lineEnd(),_=!1)}p=o,v=a,g=u}return x}}var hf,df,pf,vf=Xa(),gf={sphere:_u,point:_u,lineStart:function(){gf.point=_f,gf.lineEnd=yf},lineEnd:_u,polygonStart:_u,polygonEnd:_u};function yf(){gf.point=gf.lineEnd=_u}function _f(t,n){hf=t*=eu,df=lu(n*=eu),pf=au(n),gf.point=bf}function bf(t,n){t*=eu;var e=lu(n*=eu),r=au(n),i=ru(t-hf),o=au(i),a=r*lu(i),u=pf*e-df*r*o,c=df*e+pf*r*o;vf.add(ou(du(a*a+u*u),c)),hf=t,df=e,pf=r}function mf(t){return vf.reset(),Nu(t,gf),+vf}var xf=[null,null],wf={type:"LineString",coordinates:xf};function Mf(t,n){return xf[0]=t,xf[1]=n,mf(wf)}var Nf={Feature:function(t,n){return Tf(t.geometry,n)},FeatureCollection:function(t,n){for(var e=t.features,r=-1,i=e.length;++r0&&(i=Mf(t[o],t[o-1]))>0&&e<=i&&r<=i&&(e+r-i)*(1-Math.pow((e-r)/i,2))Wa}).map(c)).concat(g(uu(o/d)*d,i,d).filter(function(t){return ru(t%v)>Wa}).map(f))}return _.lines=function(){return b().map(function(t){return{type:"LineString",coordinates:t}})},_.outline=function(){return{type:"Polygon",coordinates:[s(r).concat(l(a).slice(1),s(e).reverse().slice(1),l(u).reverse().slice(1))]}},_.extent=function(t){return arguments.length?_.extentMajor(t).extentMinor(t):_.extentMinor()},_.extentMajor=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],u=+t[0][1],a=+t[1][1],r>e&&(t=r,r=e,e=t),u>a&&(t=u,u=a,a=t),_.precision(y)):[[r,u],[e,a]]},_.extentMinor=function(e){return arguments.length?(n=+e[0][0],t=+e[1][0],o=+e[0][1],i=+e[1][1],n>t&&(e=n,n=t,t=e),o>i&&(e=o,o=i,i=e),_.precision(y)):[[n,o],[t,i]]},_.step=function(t){return arguments.length?_.stepMajor(t).stepMinor(t):_.stepMinor()},_.stepMajor=function(t){return arguments.length?(p=+t[0],v=+t[1],_):[p,v]},_.stepMinor=function(t){return arguments.length?(h=+t[0],d=+t[1],_):[h,d]},_.precision=function(h){return arguments.length?(y=+h,c=zf(o,i,90),f=Rf(n,t,y),s=zf(u,a,90),l=Rf(r,e,y),_):y},_.extentMajor([[-180,-90+Wa],[180,90-Wa]]).extentMinor([[-180,-80-Wa],[180,80+Wa]])}function qf(t){return t}var Lf,Uf,Of,Bf,Yf=Xa(),Ff=Xa(),If={point:_u,lineStart:_u,lineEnd:_u,polygonStart:function(){If.lineStart=Hf,If.lineEnd=Gf},polygonEnd:function(){If.lineStart=If.lineEnd=If.point=_u,Yf.add(ru(Ff)),Ff.reset()},result:function(){var t=Yf/2;return Yf.reset(),t}};function Hf(){If.point=jf}function jf(t,n){If.point=Xf,Lf=Of=t,Uf=Bf=n}function Xf(t,n){Ff.add(Bf*t-Of*n),Of=t,Bf=n}function Gf(){Xf(Lf,Uf)}var Vf=1/0,$f=Vf,Wf=-Vf,Zf=Wf,Qf={point:function(t,n){tWf&&(Wf=t);n<$f&&($f=n);n>Zf&&(Zf=n)},lineStart:_u,lineEnd:_u,polygonStart:_u,polygonEnd:_u,result:function(){var t=[[Vf,$f],[Wf,Zf]];return Wf=Zf=-($f=Vf=1/0),t}};var Kf,Jf,ts,ns,es=0,rs=0,is=0,os=0,as=0,us=0,cs=0,fs=0,ss=0,ls={point:hs,lineStart:ds,lineEnd:gs,polygonStart:function(){ls.lineStart=ys,ls.lineEnd=_s},polygonEnd:function(){ls.point=hs,ls.lineStart=ds,ls.lineEnd=gs},result:function(){var t=ss?[cs/ss,fs/ss]:us?[os/us,as/us]:is?[es/is,rs/is]:[NaN,NaN];return es=rs=is=os=as=us=cs=fs=ss=0,t}};function hs(t,n){es+=t,rs+=n,++is}function ds(){ls.point=ps}function ps(t,n){ls.point=vs,hs(ts=t,ns=n)}function vs(t,n){var e=t-ts,r=n-ns,i=du(e*e+r*r);os+=i*(ts+t)/2,as+=i*(ns+n)/2,us+=i,hs(ts=t,ns=n)}function gs(){ls.point=hs}function ys(){ls.point=bs}function _s(){ms(Kf,Jf)}function bs(t,n){ls.point=ms,hs(Kf=ts=t,Jf=ns=n)}function ms(t,n){var e=t-ts,r=n-ns,i=du(e*e+r*r);os+=i*(ts+t)/2,as+=i*(ns+n)/2,us+=i,cs+=(i=ns*t-ts*n)*(ts+t),fs+=i*(ns+n),ss+=3*i,hs(ts=t,ns=n)}function xs(t){this._context=t}xs.prototype={_radius:4.5,pointRadius:function(t){return this._radius=t,this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._context.closePath(),this._point=NaN},point:function(t,n){switch(this._point){case 0:this._context.moveTo(t,n),this._point=1;break;case 1:this._context.lineTo(t,n);break;default:this._context.moveTo(t+this._radius,n),this._context.arc(t,n,this._radius,0,tu)}},result:_u};var ws,Ms,Ns,As,Ts,Ss=Xa(),ks={point:_u,lineStart:function(){ks.point=Es},lineEnd:function(){ws&&Cs(Ms,Ns),ks.point=_u},polygonStart:function(){ws=!0},polygonEnd:function(){ws=null},result:function(){var t=+Ss;return Ss.reset(),t}};function Es(t,n){ks.point=Cs,Ms=As=t,Ns=Ts=n}function Cs(t,n){As-=t,Ts-=n,Ss.add(du(As*As+Ts*Ts)),As=t,Ts=n}function Ps(){this._string=[]}function zs(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" 0 1,1 0,"+2*t+"z"}function Rs(t){return function(n){var e=new Ds;for(var r in t)e[r]=t[r];return e.stream=n,e}}function Ds(){}function qs(t,n,e){var r=t.clipExtent&&t.clipExtent();return t.scale(150).translate([0,0]),null!=r&&t.clipExtent(null),Nu(e,t.stream(Qf)),n(Qf.result()),null!=r&&t.clipExtent(r),t}function Ls(t,n,e){return qs(t,function(e){var r=n[1][0]-n[0][0],i=n[1][1]-n[0][1],o=Math.min(r/(e[1][0]-e[0][0]),i/(e[1][1]-e[0][1])),a=+n[0][0]+(r-o*(e[1][0]+e[0][0]))/2,u=+n[0][1]+(i-o*(e[1][1]+e[0][1]))/2;t.scale(150*o).translate([a,u])},e)}function Us(t,n,e){return Ls(t,[[0,0],n],e)}function Os(t,n,e){return qs(t,function(e){var r=+n,i=r/(e[1][0]-e[0][0]),o=(r-i*(e[1][0]+e[0][0]))/2,a=-i*e[0][1];t.scale(150*i).translate([o,a])},e)}function Bs(t,n,e){return qs(t,function(e){var r=+n,i=r/(e[1][1]-e[0][1]),o=-i*e[0][0],a=(r-i*(e[1][1]+e[0][1]))/2;t.scale(150*i).translate([o,a])},e)}Ps.prototype={_radius:4.5,_circle:zs(4.5),pointRadius:function(t){return(t=+t)!==this._radius&&(this._radius=t,this._circle=null),this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._string.push("Z"),this._point=NaN},point:function(t,n){switch(this._point){case 0:this._string.push("M",t,",",n),this._point=1;break;case 1:this._string.push("L",t,",",n);break;default:null==this._circle&&(this._circle=zs(this._radius)),this._string.push("M",t,",",n,this._circle)}},result:function(){if(this._string.length){var t=this._string.join("");return this._string=[],t}return null}},Ds.prototype={constructor:Ds,point:function(t,n){this.stream.point(t,n)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}};var Ys=16,Fs=au(30*eu);function Is(t,n){return+n?function(t,n){function e(r,i,o,a,u,c,f,s,l,h,d,p,v,g){var y=f-r,_=s-i,b=y*y+_*_;if(b>4*n&&v--){var m=a+h,x=u+d,w=c+p,M=du(m*m+x*x+w*w),N=gu(w/=M),A=ru(ru(w)-1)n||ru((y*E+_*C)/b-.5)>.3||a*h+u*d+c*p2?t[2]%360*eu:0,S()):[g*nu,y*nu,_*nu]},A.angle=function(t){return arguments.length?(b=t%360*eu,S()):b*nu},A.precision=function(t){return arguments.length?(a=Is(u,N=t*t),k()):du(N)},A.fitExtent=function(t,n){return Ls(A,t,n)},A.fitSize=function(t,n){return Us(A,t,n)},A.fitWidth=function(t,n){return Os(A,t,n)},A.fitHeight=function(t,n){return Bs(A,t,n)},function(){return n=t.apply(this,arguments),A.invert=n.invert&&T,S()}}function Vs(t){var n=0,e=Qa/3,r=Gs(t),i=r(n,e);return i.parallels=function(t){return arguments.length?r(n=t[0]*eu,e=t[1]*eu):[n*nu,e*nu]},i}function $s(t,n){var e=lu(t),r=(e+lu(n))/2;if(ru(r)0?n<-Ka+Wa&&(n=-Ka+Wa):n>Ka-Wa&&(n=Ka-Wa);var e=i/su(rl(n),r);return[e*lu(r*t),i-e*au(r*t)]}return o.invert=function(t,n){var e=i-n,o=hu(r)*du(t*t+e*e);return[ou(t,ru(e))/r*hu(e),2*iu(su(i/o,1/r))-Ka]},o}function ol(t,n){return[t,n]}function al(t,n){var e=au(t),r=t===n?lu(t):(e-au(n))/(n-t),i=e/r+t;if(ru(r)=0;)n+=e[r].value;else n=1;t.value=n}function Ml(t,n){var e,r,i,o,a,u=new Sl(t),c=+t.value&&(u.value=t.value),f=[u];for(null==n&&(n=Nl);e=f.pop();)if(c&&(e.value=+e.data.value),(i=n(e.data))&&(a=i.length))for(e.children=new Array(a),o=a-1;o>=0;--o)f.push(r=e.children[o]=new Sl(i[o])),r.parent=e,r.depth=e.depth+1;return u.eachBefore(Tl)}function Nl(t){return t.children}function Al(t){t.data=t.data.data}function Tl(t){var n=0;do{t.height=n}while((t=t.parent)&&t.height<++n)}function Sl(t){this.data=t,this.depth=this.height=0,this.parent=null}hl.invert=function(t,n){for(var e,r=n,i=r*r,o=i*i*i,a=0;a<12&&(o=(i=(r-=e=(r*(ul+cl*i+o*(fl+sl*i))-n)/(ul+3*cl*i+o*(7*fl+9*sl*i)))*r)*i*i,!(ru(e)Wa&&--i>0);return[t/(.8707+(o=r*r)*(o*(o*o*o*(.003971-.001529*o)-.013791)-.131979)),r]},gl.invert=Ks(gu),yl.invert=Ks(function(t){return 2*iu(t)}),_l.invert=function(t,n){return[-n,2*iu(cu(t))-Ka]},Sl.prototype=Ml.prototype={constructor:Sl,count:function(){return this.eachAfter(wl)},each:function(t){var n,e,r,i,o=this,a=[o];do{for(n=a.reverse(),a=[];o=n.pop();)if(t(o),e=o.children)for(r=0,i=e.length;r=0;--e)i.push(n[e]);return this},sum:function(t){return this.eachAfter(function(n){for(var e=+t(n.data)||0,r=n.children,i=r&&r.length;--i>=0;)e+=r[i].value;n.value=e})},sort:function(t){return this.eachBefore(function(n){n.children&&n.children.sort(t)})},path:function(t){for(var n=this,e=function(t,n){if(t===n)return t;var e=t.ancestors(),r=n.ancestors(),i=null;for(t=e.pop(),n=r.pop();t===n;)i=t,t=e.pop(),n=r.pop();return i}(n,t),r=[n];n!==e;)n=n.parent,r.push(n);for(var i=r.length;t!==e;)r.splice(i,0,t),t=t.parent;return r},ancestors:function(){for(var t=this,n=[t];t=t.parent;)n.push(t);return n},descendants:function(){var t=[];return this.each(function(n){t.push(n)}),t},leaves:function(){var t=[];return this.eachBefore(function(n){n.children||t.push(n)}),t},links:function(){var t=this,n=[];return t.each(function(e){e!==t&&n.push({source:e.parent,target:e})}),n},copy:function(){return Ml(this).eachBefore(Al)}};var kl=Array.prototype.slice;function El(t){for(var n,e,r=0,i=(t=function(t){for(var n,e,r=t.length;r;)e=Math.random()*r--|0,n=t[r],t[r]=t[e],t[e]=n;return t}(kl.call(t))).length,o=[];r0&&e*e>r*r+i*i}function Rl(t,n){for(var e=0;e(a*=a)?(r=(f+a-i)/(2*f),o=Math.sqrt(Math.max(0,a/f-r*r)),e.x=t.x-r*u-o*c,e.y=t.y-r*c+o*u):(r=(f+i-a)/(2*f),o=Math.sqrt(Math.max(0,i/f-r*r)),e.x=n.x+r*u-o*c,e.y=n.y+r*c+o*u)):(e.x=n.x+e.r,e.y=n.y)}function Ol(t,n){var e=t.r+n.r-1e-6,r=n.x-t.x,i=n.y-t.y;return e>0&&e*e>r*r+i*i}function Bl(t){var n=t._,e=t.next._,r=n.r+e.r,i=(n.x*e.r+e.x*n.r)/r,o=(n.y*e.r+e.y*n.r)/r;return i*i+o*o}function Yl(t){this._=t,this.next=null,this.previous=null}function Fl(t){if(!(i=t.length))return 0;var n,e,r,i,o,a,u,c,f,s,l;if((n=t[0]).x=0,n.y=0,!(i>1))return n.r;if(e=t[1],n.x=-e.r,e.x=n.r,e.y=0,!(i>2))return n.r+e.r;Ul(e,n,r=t[2]),n=new Yl(n),e=new Yl(e),r=new Yl(r),n.next=r.previous=e,e.next=n.previous=r,r.next=e.previous=n;t:for(u=3;uh&&(h=u),g=s*s*v,(d=Math.max(h/g,g/l))>p){s-=u;break}p=d}y.push(a={value:s,dice:c1?n:1)},e}(sh);var dh=function t(n){function e(t,e,r,i,o){if((a=t._squarify)&&a.ratio===n)for(var a,u,c,f,s,l=-1,h=a.length,d=t.value;++l1?n:1)},e}(sh);function ph(t,n,e){return(n[0]-t[0])*(e[1]-t[1])-(n[1]-t[1])*(e[0]-t[0])}function vh(t,n){return t[0]-n[0]||t[1]-n[1]}function gh(t){for(var n=t.length,e=[0,1],r=2,i=2;i1&&ph(t[e[r-2]],t[e[r-1]],t[i])<=0;)--r;e[r++]=i}return e.slice(0,r)}function yh(){return Math.random()}var _h=function t(n){function e(t,e){return t=null==t?0:+t,e=null==e?1:+e,1===arguments.length?(e=t,t=0):e-=t,function(){return n()*e+t}}return e.source=t,e}(yh),bh=function t(n){function e(t,e){var r,i;return t=null==t?0:+t,e=null==e?1:+e,function(){var o;if(null!=r)o=r,r=null;else do{r=2*n()-1,o=2*n()-1,i=r*r+o*o}while(!i||i>1);return t+e*o*Math.sqrt(-2*Math.log(i)/i)}}return e.source=t,e}(yh),mh=function t(n){function e(){var t=bh.source(n).apply(this,arguments);return function(){return Math.exp(t())}}return e.source=t,e}(yh),xh=function t(n){function e(t){return function(){for(var e=0,r=0;rr&&(n=e,e=r,r=n),function(t){return Math.max(e,Math.min(r,t))}}function Uh(t,n,e){var r=t[0],i=t[1],o=n[0],a=n[1];return i2?Oh:Uh,i=o=null,l}function l(n){return isNaN(n=+n)?e:(i||(i=r(a.map(t),u,c)))(t(f(n)))}return l.invert=function(e){return f(n((o||(o=r(u,a.map(t),be)))(e)))},l.domain=function(t){return arguments.length?(a=Sh.call(t,zh),f===Dh||(f=Lh(a)),s()):a.slice()},l.range=function(t){return arguments.length?(u=kh.call(t),s()):u.slice()},l.rangeRound=function(t){return u=kh.call(t),c=Ae,s()},l.clamp=function(t){return arguments.length?(f=t?Lh(a):Dh,l):f!==Dh},l.interpolate=function(t){return arguments.length?(c=t,s()):c},l.unknown=function(t){return arguments.length?(e=t,l):e},function(e,r){return t=e,n=r,s()}}function Fh(t,n){return Yh()(t,n)}function Ih(n,e,r,i){var o,a=w(n,e,r);switch((i=za(null==i?",f":i)).type){case"s":var u=Math.max(Math.abs(n),Math.abs(e));return null!=i.precision||isNaN(o=Ha(a,u))||(i.precision=o),t.formatPrefix(i,u);case"":case"e":case"g":case"p":case"r":null!=i.precision||isNaN(o=ja(a,Math.max(Math.abs(n),Math.abs(e))))||(i.precision=o-("e"===i.type));break;case"f":case"%":null!=i.precision||isNaN(o=Ia(a))||(i.precision=o-2*("%"===i.type))}return t.format(i)}function Hh(t){var n=t.domain;return t.ticks=function(t){var e=n();return m(e[0],e[e.length-1],null==t?10:t)},t.tickFormat=function(t,e){var r=n();return Ih(r[0],r[r.length-1],null==t?10:t,e)},t.nice=function(e){null==e&&(e=10);var r,i=n(),o=0,a=i.length-1,u=i[o],c=i[a];return c0?r=x(u=Math.floor(u/r)*r,c=Math.ceil(c/r)*r,e):r<0&&(r=x(u=Math.ceil(u*r)/r,c=Math.floor(c*r)/r,e)),r>0?(i[o]=Math.floor(u/r)*r,i[a]=Math.ceil(c/r)*r,n(i)):r<0&&(i[o]=Math.ceil(u*r)/r,i[a]=Math.floor(c*r)/r,n(i)),t},t}function jh(t,n){var e,r=0,i=(t=t.slice()).length-1,o=t[r],a=t[i];return a0){for(;hc)break;v.push(l)}}else for(;h=1;--s)if(!((l=f*s)c)break;v.push(l)}}else v=m(h,d,Math.min(d-h,p)).map(r);return n?v.reverse():v},i.tickFormat=function(n,o){if(null==o&&(o=10===a?".0e":","),"function"!=typeof o&&(o=t.format(o)),n===1/0)return o;null==n&&(n=10);var u=Math.max(1,a*n/i.ticks().length);return function(t){var n=t/r(Math.round(e(t)));return n*a0))return u;do{u.push(a=new Date(+e)),n(e,o),t(e)}while(a=n)for(;t(n),!e(n);)n.setTime(n-1)},function(t,r){if(t>=t)if(r<0)for(;++r<=0;)for(;n(t,-1),!e(t););else for(;--r>=0;)for(;n(t,1),!e(t););})},e&&(i.count=function(n,r){return ad.setTime(+n),ud.setTime(+r),t(ad),t(ud),Math.floor(e(ad,ud))},i.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?i.filter(r?function(n){return r(n)%t==0}:function(n){return i.count(0,n)%t==0}):i:null}),i}var fd=cd(function(){},function(t,n){t.setTime(+t+n)},function(t,n){return n-t});fd.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?cd(function(n){n.setTime(Math.floor(n/t)*t)},function(n,e){n.setTime(+n+e*t)},function(n,e){return(e-n)/t}):fd:null};var sd=fd.range,ld=6e4,hd=6048e5,dd=cd(function(t){t.setTime(t-t.getMilliseconds())},function(t,n){t.setTime(+t+1e3*n)},function(t,n){return(n-t)/1e3},function(t){return t.getUTCSeconds()}),pd=dd.range,vd=cd(function(t){t.setTime(t-t.getMilliseconds()-1e3*t.getSeconds())},function(t,n){t.setTime(+t+n*ld)},function(t,n){return(n-t)/ld},function(t){return t.getMinutes()}),gd=vd.range,yd=cd(function(t){t.setTime(t-t.getMilliseconds()-1e3*t.getSeconds()-t.getMinutes()*ld)},function(t,n){t.setTime(+t+36e5*n)},function(t,n){return(n-t)/36e5},function(t){return t.getHours()}),_d=yd.range,bd=cd(function(t){t.setHours(0,0,0,0)},function(t,n){t.setDate(t.getDate()+n)},function(t,n){return(n-t-(n.getTimezoneOffset()-t.getTimezoneOffset())*ld)/864e5},function(t){return t.getDate()-1}),md=bd.range;function xd(t){return cd(function(n){n.setDate(n.getDate()-(n.getDay()+7-t)%7),n.setHours(0,0,0,0)},function(t,n){t.setDate(t.getDate()+7*n)},function(t,n){return(n-t-(n.getTimezoneOffset()-t.getTimezoneOffset())*ld)/hd})}var wd=xd(0),Md=xd(1),Nd=xd(2),Ad=xd(3),Td=xd(4),Sd=xd(5),kd=xd(6),Ed=wd.range,Cd=Md.range,Pd=Nd.range,zd=Ad.range,Rd=Td.range,Dd=Sd.range,qd=kd.range,Ld=cd(function(t){t.setDate(1),t.setHours(0,0,0,0)},function(t,n){t.setMonth(t.getMonth()+n)},function(t,n){return n.getMonth()-t.getMonth()+12*(n.getFullYear()-t.getFullYear())},function(t){return t.getMonth()}),Ud=Ld.range,Od=cd(function(t){t.setMonth(0,1),t.setHours(0,0,0,0)},function(t,n){t.setFullYear(t.getFullYear()+n)},function(t,n){return n.getFullYear()-t.getFullYear()},function(t){return t.getFullYear()});Od.every=function(t){return isFinite(t=Math.floor(t))&&t>0?cd(function(n){n.setFullYear(Math.floor(n.getFullYear()/t)*t),n.setMonth(0,1),n.setHours(0,0,0,0)},function(n,e){n.setFullYear(n.getFullYear()+e*t)}):null};var Bd=Od.range,Yd=cd(function(t){t.setUTCSeconds(0,0)},function(t,n){t.setTime(+t+n*ld)},function(t,n){return(n-t)/ld},function(t){return t.getUTCMinutes()}),Fd=Yd.range,Id=cd(function(t){t.setUTCMinutes(0,0,0)},function(t,n){t.setTime(+t+36e5*n)},function(t,n){return(n-t)/36e5},function(t){return t.getUTCHours()}),Hd=Id.range,jd=cd(function(t){t.setUTCHours(0,0,0,0)},function(t,n){t.setUTCDate(t.getUTCDate()+n)},function(t,n){return(n-t)/864e5},function(t){return t.getUTCDate()-1}),Xd=jd.range;function Gd(t){return cd(function(n){n.setUTCDate(n.getUTCDate()-(n.getUTCDay()+7-t)%7),n.setUTCHours(0,0,0,0)},function(t,n){t.setUTCDate(t.getUTCDate()+7*n)},function(t,n){return(n-t)/hd})}var Vd=Gd(0),$d=Gd(1),Wd=Gd(2),Zd=Gd(3),Qd=Gd(4),Kd=Gd(5),Jd=Gd(6),tp=Vd.range,np=$d.range,ep=Wd.range,rp=Zd.range,ip=Qd.range,op=Kd.range,ap=Jd.range,up=cd(function(t){t.setUTCDate(1),t.setUTCHours(0,0,0,0)},function(t,n){t.setUTCMonth(t.getUTCMonth()+n)},function(t,n){return n.getUTCMonth()-t.getUTCMonth()+12*(n.getUTCFullYear()-t.getUTCFullYear())},function(t){return t.getUTCMonth()}),cp=up.range,fp=cd(function(t){t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},function(t,n){t.setUTCFullYear(t.getUTCFullYear()+n)},function(t,n){return n.getUTCFullYear()-t.getUTCFullYear()},function(t){return t.getUTCFullYear()});fp.every=function(t){return isFinite(t=Math.floor(t))&&t>0?cd(function(n){n.setUTCFullYear(Math.floor(n.getUTCFullYear()/t)*t),n.setUTCMonth(0,1),n.setUTCHours(0,0,0,0)},function(n,e){n.setUTCFullYear(n.getUTCFullYear()+e*t)}):null};var sp=fp.range;function lp(t){if(0<=t.y&&t.y<100){var n=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return n.setFullYear(t.y),n}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function hp(t){if(0<=t.y&&t.y<100){var n=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return n.setUTCFullYear(t.y),n}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function dp(t){return{y:t,m:0,d:1,H:0,M:0,S:0,L:0}}function pp(t){var n=t.dateTime,e=t.date,r=t.time,i=t.periods,o=t.days,a=t.shortDays,u=t.months,c=t.shortMonths,f=wp(i),s=Mp(i),l=wp(o),h=Mp(o),d=wp(a),p=Mp(a),v=wp(u),g=Mp(u),y=wp(c),_=Mp(c),b={a:function(t){return a[t.getDay()]},A:function(t){return o[t.getDay()]},b:function(t){return c[t.getMonth()]},B:function(t){return u[t.getMonth()]},c:null,d:Hp,e:Hp,f:$p,H:jp,I:Xp,j:Gp,L:Vp,m:Wp,M:Zp,p:function(t){return i[+(t.getHours()>=12)]},Q:Nv,s:Av,S:Qp,u:Kp,U:Jp,V:tv,w:nv,W:ev,x:null,X:null,y:rv,Y:iv,Z:ov,"%":Mv},m={a:function(t){return a[t.getUTCDay()]},A:function(t){return o[t.getUTCDay()]},b:function(t){return c[t.getUTCMonth()]},B:function(t){return u[t.getUTCMonth()]},c:null,d:av,e:av,f:lv,H:uv,I:cv,j:fv,L:sv,m:hv,M:dv,p:function(t){return i[+(t.getUTCHours()>=12)]},Q:Nv,s:Av,S:pv,u:vv,U:gv,V:yv,w:_v,W:bv,x:null,X:null,y:mv,Y:xv,Z:wv,"%":Mv},x={a:function(t,n,e){var r=d.exec(n.slice(e));return r?(t.w=p[r[0].toLowerCase()],e+r[0].length):-1},A:function(t,n,e){var r=l.exec(n.slice(e));return r?(t.w=h[r[0].toLowerCase()],e+r[0].length):-1},b:function(t,n,e){var r=y.exec(n.slice(e));return r?(t.m=_[r[0].toLowerCase()],e+r[0].length):-1},B:function(t,n,e){var r=v.exec(n.slice(e));return r?(t.m=g[r[0].toLowerCase()],e+r[0].length):-1},c:function(t,e,r){return N(t,n,e,r)},d:Rp,e:Rp,f:Bp,H:qp,I:qp,j:Dp,L:Op,m:zp,M:Lp,p:function(t,n,e){var r=f.exec(n.slice(e));return r?(t.p=s[r[0].toLowerCase()],e+r[0].length):-1},Q:Fp,s:Ip,S:Up,u:Ap,U:Tp,V:Sp,w:Np,W:kp,x:function(t,n,r){return N(t,e,n,r)},X:function(t,n,e){return N(t,r,n,e)},y:Cp,Y:Ep,Z:Pp,"%":Yp};function w(t,n){return function(e){var r,i,o,a=[],u=-1,c=0,f=t.length;for(e instanceof Date||(e=new Date(+e));++u53)return null;"w"in o||(o.w=1),"Z"in o?(i=(r=hp(dp(o.y))).getUTCDay(),r=i>4||0===i?$d.ceil(r):$d(r),r=jd.offset(r,7*(o.V-1)),o.y=r.getUTCFullYear(),o.m=r.getUTCMonth(),o.d=r.getUTCDate()+(o.w+6)%7):(i=(r=n(dp(o.y))).getDay(),r=i>4||0===i?Md.ceil(r):Md(r),r=bd.offset(r,7*(o.V-1)),o.y=r.getFullYear(),o.m=r.getMonth(),o.d=r.getDate()+(o.w+6)%7)}else("W"in o||"U"in o)&&("w"in o||(o.w="u"in o?o.u%7:"W"in o?1:0),i="Z"in o?hp(dp(o.y)).getUTCDay():n(dp(o.y)).getDay(),o.m=0,o.d="W"in o?(o.w+6)%7+7*o.W-(i+5)%7:o.w+7*o.U-(i+6)%7);return"Z"in o?(o.H+=o.Z/100|0,o.M+=o.Z%100,hp(o)):n(o)}}function N(t,n,e,r){for(var i,o,a=0,u=n.length,c=e.length;a=c)return-1;if(37===(i=n.charCodeAt(a++))){if(i=n.charAt(a++),!(o=x[i in gp?n.charAt(a++):i])||(r=o(t,e,r))<0)return-1}else if(i!=e.charCodeAt(r++))return-1}return r}return b.x=w(e,b),b.X=w(r,b),b.c=w(n,b),m.x=w(e,m),m.X=w(r,m),m.c=w(n,m),{format:function(t){var n=w(t+="",b);return n.toString=function(){return t},n},parse:function(t){var n=M(t+="",lp);return n.toString=function(){return t},n},utcFormat:function(t){var n=w(t+="",m);return n.toString=function(){return t},n},utcParse:function(t){var n=M(t,hp);return n.toString=function(){return t},n}}}var vp,gp={"-":"",_:" ",0:"0"},yp=/^\s*\d+/,_p=/^%/,bp=/[\\^$*+?|[\]().{}]/g;function mp(t,n,e){var r=t<0?"-":"",i=(r?-t:t)+"",o=i.length;return r+(o68?1900:2e3),e+r[0].length):-1}function Pp(t,n,e){var r=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(n.slice(e,e+6));return r?(t.Z=r[1]?0:-(r[2]+(r[3]||"00")),e+r[0].length):-1}function zp(t,n,e){var r=yp.exec(n.slice(e,e+2));return r?(t.m=r[0]-1,e+r[0].length):-1}function Rp(t,n,e){var r=yp.exec(n.slice(e,e+2));return r?(t.d=+r[0],e+r[0].length):-1}function Dp(t,n,e){var r=yp.exec(n.slice(e,e+3));return r?(t.m=0,t.d=+r[0],e+r[0].length):-1}function qp(t,n,e){var r=yp.exec(n.slice(e,e+2));return r?(t.H=+r[0],e+r[0].length):-1}function Lp(t,n,e){var r=yp.exec(n.slice(e,e+2));return r?(t.M=+r[0],e+r[0].length):-1}function Up(t,n,e){var r=yp.exec(n.slice(e,e+2));return r?(t.S=+r[0],e+r[0].length):-1}function Op(t,n,e){var r=yp.exec(n.slice(e,e+3));return r?(t.L=+r[0],e+r[0].length):-1}function Bp(t,n,e){var r=yp.exec(n.slice(e,e+6));return r?(t.L=Math.floor(r[0]/1e3),e+r[0].length):-1}function Yp(t,n,e){var r=_p.exec(n.slice(e,e+1));return r?e+r[0].length:-1}function Fp(t,n,e){var r=yp.exec(n.slice(e));return r?(t.Q=+r[0],e+r[0].length):-1}function Ip(t,n,e){var r=yp.exec(n.slice(e));return r?(t.Q=1e3*+r[0],e+r[0].length):-1}function Hp(t,n){return mp(t.getDate(),n,2)}function jp(t,n){return mp(t.getHours(),n,2)}function Xp(t,n){return mp(t.getHours()%12||12,n,2)}function Gp(t,n){return mp(1+bd.count(Od(t),t),n,3)}function Vp(t,n){return mp(t.getMilliseconds(),n,3)}function $p(t,n){return Vp(t,n)+"000"}function Wp(t,n){return mp(t.getMonth()+1,n,2)}function Zp(t,n){return mp(t.getMinutes(),n,2)}function Qp(t,n){return mp(t.getSeconds(),n,2)}function Kp(t){var n=t.getDay();return 0===n?7:n}function Jp(t,n){return mp(wd.count(Od(t),t),n,2)}function tv(t,n){var e=t.getDay();return t=e>=4||0===e?Td(t):Td.ceil(t),mp(Td.count(Od(t),t)+(4===Od(t).getDay()),n,2)}function nv(t){return t.getDay()}function ev(t,n){return mp(Md.count(Od(t),t),n,2)}function rv(t,n){return mp(t.getFullYear()%100,n,2)}function iv(t,n){return mp(t.getFullYear()%1e4,n,4)}function ov(t){var n=t.getTimezoneOffset();return(n>0?"-":(n*=-1,"+"))+mp(n/60|0,"0",2)+mp(n%60,"0",2)}function av(t,n){return mp(t.getUTCDate(),n,2)}function uv(t,n){return mp(t.getUTCHours(),n,2)}function cv(t,n){return mp(t.getUTCHours()%12||12,n,2)}function fv(t,n){return mp(1+jd.count(fp(t),t),n,3)}function sv(t,n){return mp(t.getUTCMilliseconds(),n,3)}function lv(t,n){return sv(t,n)+"000"}function hv(t,n){return mp(t.getUTCMonth()+1,n,2)}function dv(t,n){return mp(t.getUTCMinutes(),n,2)}function pv(t,n){return mp(t.getUTCSeconds(),n,2)}function vv(t){var n=t.getUTCDay();return 0===n?7:n}function gv(t,n){return mp(Vd.count(fp(t),t),n,2)}function yv(t,n){var e=t.getUTCDay();return t=e>=4||0===e?Qd(t):Qd.ceil(t),mp(Qd.count(fp(t),t)+(4===fp(t).getUTCDay()),n,2)}function _v(t){return t.getUTCDay()}function bv(t,n){return mp($d.count(fp(t),t),n,2)}function mv(t,n){return mp(t.getUTCFullYear()%100,n,2)}function xv(t,n){return mp(t.getUTCFullYear()%1e4,n,4)}function wv(){return"+0000"}function Mv(){return"%"}function Nv(t){return+t}function Av(t){return Math.floor(+t/1e3)}function Tv(n){return vp=pp(n),t.timeFormat=vp.format,t.timeParse=vp.parse,t.utcFormat=vp.utcFormat,t.utcParse=vp.utcParse,vp}Tv({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});var Sv=Date.prototype.toISOString?function(t){return t.toISOString()}:t.utcFormat("%Y-%m-%dT%H:%M:%S.%LZ");var kv=+new Date("2000-01-01T00:00:00.000Z")?function(t){var n=new Date(t);return isNaN(n)?null:n}:t.utcParse("%Y-%m-%dT%H:%M:%S.%LZ"),Ev=1e3,Cv=60*Ev,Pv=60*Cv,zv=24*Pv,Rv=7*zv,Dv=30*zv,qv=365*zv;function Lv(t){return new Date(t)}function Uv(t){return t instanceof Date?+t:+new Date(+t)}function Ov(t,n,r,i,o,a,u,c,f){var s=Fh(Dh,Dh),l=s.invert,h=s.domain,d=f(".%L"),p=f(":%S"),v=f("%I:%M"),g=f("%I %p"),y=f("%a %d"),_=f("%b %d"),b=f("%B"),m=f("%Y"),x=[[u,1,Ev],[u,5,5*Ev],[u,15,15*Ev],[u,30,30*Ev],[a,1,Cv],[a,5,5*Cv],[a,15,15*Cv],[a,30,30*Cv],[o,1,Pv],[o,3,3*Pv],[o,6,6*Pv],[o,12,12*Pv],[i,1,zv],[i,2,2*zv],[r,1,Rv],[n,1,Dv],[n,3,3*Dv],[t,1,qv]];function M(e){return(u(e)=1?Ny:t<=-1?-Ny:Math.asin(t)}function Sy(t){return t.innerRadius}function ky(t){return t.outerRadius}function Ey(t){return t.startAngle}function Cy(t){return t.endAngle}function Py(t){return t&&t.padAngle}function zy(t,n,e,r,i,o,a){var u=t-e,c=n-r,f=(a?o:-o)/xy(u*u+c*c),s=f*c,l=-f*u,h=t+s,d=n+l,p=e+s,v=r+l,g=(h+p)/2,y=(d+v)/2,_=p-h,b=v-d,m=_*_+b*b,x=i-o,w=h*v-p*d,M=(b<0?-1:1)*xy(_y(0,x*x*m-w*w)),N=(w*b-_*M)/m,A=(-w*_-b*M)/m,T=(w*b+_*M)/m,S=(-w*_+b*M)/m,k=N-g,E=A-y,C=T-g,P=S-y;return k*k+E*E>C*C+P*P&&(N=T,A=S),{cx:N,cy:A,x01:-s,y01:-l,x11:N*(i/x-1),y11:A*(i/x-1)}}function Ry(t){this._context=t}function Dy(t){return new Ry(t)}function qy(t){return t[0]}function Ly(t){return t[1]}function Uy(){var t=qy,n=Ly,e=py(!0),r=null,i=Dy,o=null;function a(a){var u,c,f,s=a.length,l=!1;for(null==r&&(o=i(f=to())),u=0;u<=s;++u)!(u=s;--l)u.point(g[l],y[l]);u.lineEnd(),u.areaEnd()}v&&(g[f]=+t(h,f,c),y[f]=+e(h,f,c),u.point(n?+n(h,f,c):g[f],r?+r(h,f,c):y[f]))}if(d)return u=null,d+""||null}function f(){return Uy().defined(i).curve(a).context(o)}return c.x=function(e){return arguments.length?(t="function"==typeof e?e:py(+e),n=null,c):t},c.x0=function(n){return arguments.length?(t="function"==typeof n?n:py(+n),c):t},c.x1=function(t){return arguments.length?(n=null==t?null:"function"==typeof t?t:py(+t),c):n},c.y=function(t){return arguments.length?(e="function"==typeof t?t:py(+t),r=null,c):e},c.y0=function(t){return arguments.length?(e="function"==typeof t?t:py(+t),c):e},c.y1=function(t){return arguments.length?(r=null==t?null:"function"==typeof t?t:py(+t),c):r},c.lineX0=c.lineY0=function(){return f().x(t).y(e)},c.lineY1=function(){return f().x(t).y(r)},c.lineX1=function(){return f().x(n).y(e)},c.defined=function(t){return arguments.length?(i="function"==typeof t?t:py(!!t),c):i},c.curve=function(t){return arguments.length?(a=t,null!=o&&(u=a(o)),c):a},c.context=function(t){return arguments.length?(null==t?o=u=null:u=a(o=t),c):o},c}function By(t,n){return nt?1:n>=t?0:NaN}function Yy(t){return t}Ry.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;default:this._context.lineTo(t,n)}}};var Fy=Hy(Dy);function Iy(t){this._curve=t}function Hy(t){function n(n){return new Iy(t(n))}return n._curve=t,n}function jy(t){var n=t.curve;return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t.curve=function(t){return arguments.length?n(Hy(t)):n()._curve},t}function Xy(){return jy(Uy().curve(Fy))}function Gy(){var t=Oy().curve(Fy),n=t.curve,e=t.lineX0,r=t.lineX1,i=t.lineY0,o=t.lineY1;return t.angle=t.x,delete t.x,t.startAngle=t.x0,delete t.x0,t.endAngle=t.x1,delete t.x1,t.radius=t.y,delete t.y,t.innerRadius=t.y0,delete t.y0,t.outerRadius=t.y1,delete t.y1,t.lineStartAngle=function(){return jy(e())},delete t.lineX0,t.lineEndAngle=function(){return jy(r())},delete t.lineX1,t.lineInnerRadius=function(){return jy(i())},delete t.lineY0,t.lineOuterRadius=function(){return jy(o())},delete t.lineY1,t.curve=function(t){return arguments.length?n(Hy(t)):n()._curve},t}function Vy(t,n){return[(n=+n)*Math.cos(t-=Math.PI/2),n*Math.sin(t)]}Iy.prototype={areaStart:function(){this._curve.areaStart()},areaEnd:function(){this._curve.areaEnd()},lineStart:function(){this._curve.lineStart()},lineEnd:function(){this._curve.lineEnd()},point:function(t,n){this._curve.point(n*Math.sin(t),n*-Math.cos(t))}};var $y=Array.prototype.slice;function Wy(t){return t.source}function Zy(t){return t.target}function Qy(t){var n=Wy,e=Zy,r=qy,i=Ly,o=null;function a(){var a,u=$y.call(arguments),c=n.apply(this,u),f=e.apply(this,u);if(o||(o=a=to()),t(o,+r.apply(this,(u[0]=c,u)),+i.apply(this,u),+r.apply(this,(u[0]=f,u)),+i.apply(this,u)),a)return o=null,a+""||null}return a.source=function(t){return arguments.length?(n=t,a):n},a.target=function(t){return arguments.length?(e=t,a):e},a.x=function(t){return arguments.length?(r="function"==typeof t?t:py(+t),a):r},a.y=function(t){return arguments.length?(i="function"==typeof t?t:py(+t),a):i},a.context=function(t){return arguments.length?(o=null==t?null:t,a):o},a}function Ky(t,n,e,r,i){t.moveTo(n,e),t.bezierCurveTo(n=(n+r)/2,e,n,i,r,i)}function Jy(t,n,e,r,i){t.moveTo(n,e),t.bezierCurveTo(n,e=(e+i)/2,r,e,r,i)}function t_(t,n,e,r,i){var o=Vy(n,e),a=Vy(n,e=(e+i)/2),u=Vy(r,e),c=Vy(r,i);t.moveTo(o[0],o[1]),t.bezierCurveTo(a[0],a[1],u[0],u[1],c[0],c[1])}var n_={draw:function(t,n){var e=Math.sqrt(n/My);t.moveTo(e,0),t.arc(0,0,e,0,Ay)}},e_={draw:function(t,n){var e=Math.sqrt(n/5)/2;t.moveTo(-3*e,-e),t.lineTo(-e,-e),t.lineTo(-e,-3*e),t.lineTo(e,-3*e),t.lineTo(e,-e),t.lineTo(3*e,-e),t.lineTo(3*e,e),t.lineTo(e,e),t.lineTo(e,3*e),t.lineTo(-e,3*e),t.lineTo(-e,e),t.lineTo(-3*e,e),t.closePath()}},r_=Math.sqrt(1/3),i_=2*r_,o_={draw:function(t,n){var e=Math.sqrt(n/i_),r=e*r_;t.moveTo(0,-e),t.lineTo(r,0),t.lineTo(0,e),t.lineTo(-r,0),t.closePath()}},a_=Math.sin(My/10)/Math.sin(7*My/10),u_=Math.sin(Ay/10)*a_,c_=-Math.cos(Ay/10)*a_,f_={draw:function(t,n){var e=Math.sqrt(.8908130915292852*n),r=u_*e,i=c_*e;t.moveTo(0,-e),t.lineTo(r,i);for(var o=1;o<5;++o){var a=Ay*o/5,u=Math.cos(a),c=Math.sin(a);t.lineTo(c*e,-u*e),t.lineTo(u*r-c*i,c*r+u*i)}t.closePath()}},s_={draw:function(t,n){var e=Math.sqrt(n),r=-e/2;t.rect(r,r,e,e)}},l_=Math.sqrt(3),h_={draw:function(t,n){var e=-Math.sqrt(n/(3*l_));t.moveTo(0,2*e),t.lineTo(-l_*e,-e),t.lineTo(l_*e,-e),t.closePath()}},d_=Math.sqrt(3)/2,p_=1/Math.sqrt(12),v_=3*(p_/2+1),g_={draw:function(t,n){var e=Math.sqrt(n/v_),r=e/2,i=e*p_,o=r,a=e*p_+e,u=-o,c=a;t.moveTo(r,i),t.lineTo(o,a),t.lineTo(u,c),t.lineTo(-.5*r-d_*i,d_*r+-.5*i),t.lineTo(-.5*o-d_*a,d_*o+-.5*a),t.lineTo(-.5*u-d_*c,d_*u+-.5*c),t.lineTo(-.5*r+d_*i,-.5*i-d_*r),t.lineTo(-.5*o+d_*a,-.5*a-d_*o),t.lineTo(-.5*u+d_*c,-.5*c-d_*u),t.closePath()}},y_=[n_,e_,o_,s_,f_,h_,g_];function __(){}function b_(t,n,e){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+n)/6,(t._y0+4*t._y1+e)/6)}function m_(t){this._context=t}function x_(t){this._context=t}function w_(t){this._context=t}function M_(t,n){this._basis=new m_(t),this._beta=n}m_.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:b_(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:b_(this,t,n)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n}},x_.prototype={areaStart:__,areaEnd:__,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath();break;case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break;case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4)}},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._x2=t,this._y2=n;break;case 1:this._point=2,this._x3=t,this._y3=n;break;case 2:this._point=3,this._x4=t,this._y4=n,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+n)/6);break;default:b_(this,t,n)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n}},w_.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var e=(this._x0+4*this._x1+t)/6,r=(this._y0+4*this._y1+n)/6;this._line?this._context.lineTo(e,r):this._context.moveTo(e,r);break;case 3:this._point=4;default:b_(this,t,n)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n}},M_.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var t=this._x,n=this._y,e=t.length-1;if(e>0)for(var r,i=t[0],o=n[0],a=t[e]-i,u=n[e]-o,c=-1;++c<=e;)r=c/e,this._basis.point(this._beta*t[c]+(1-this._beta)*(i+r*a),this._beta*n[c]+(1-this._beta)*(o+r*u));this._x=this._y=null,this._basis.lineEnd()},point:function(t,n){this._x.push(+t),this._y.push(+n)}};var N_=function t(n){function e(t){return 1===n?new m_(t):new M_(t,n)}return e.beta=function(n){return t(+n)},e}(.85);function A_(t,n,e){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-n),t._y2+t._k*(t._y1-e),t._x2,t._y2)}function T_(t,n){this._context=t,this._k=(1-n)/6}T_.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:A_(this,this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2,this._x1=t,this._y1=n;break;case 2:this._point=3;default:A_(this,t,n)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var S_=function t(n){function e(t){return new T_(t,n)}return e.tension=function(n){return t(+n)},e}(0);function k_(t,n){this._context=t,this._k=(1-n)/6}k_.prototype={areaStart:__,areaEnd:__,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._x3=t,this._y3=n;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=n);break;case 2:this._point=3,this._x5=t,this._y5=n;break;default:A_(this,t,n)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var E_=function t(n){function e(t){return new k_(t,n)}return e.tension=function(n){return t(+n)},e}(0);function C_(t,n){this._context=t,this._k=(1-n)/6}C_.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:A_(this,t,n)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var P_=function t(n){function e(t){return new C_(t,n)}return e.tension=function(n){return t(+n)},e}(0);function z_(t,n,e){var r=t._x1,i=t._y1,o=t._x2,a=t._y2;if(t._l01_a>wy){var u=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,c=3*t._l01_a*(t._l01_a+t._l12_a);r=(r*u-t._x0*t._l12_2a+t._x2*t._l01_2a)/c,i=(i*u-t._y0*t._l12_2a+t._y2*t._l01_2a)/c}if(t._l23_a>wy){var f=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,s=3*t._l23_a*(t._l23_a+t._l12_a);o=(o*f+t._x1*t._l23_2a-n*t._l12_2a)/s,a=(a*f+t._y1*t._l23_2a-e*t._l12_2a)/s}t._context.bezierCurveTo(r,i,o,a,t._x2,t._y2)}function R_(t,n){this._context=t,this._alpha=n}R_.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){if(t=+t,n=+n,this._point){var e=this._x2-t,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(e*e+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;break;case 2:this._point=3;default:z_(this,t,n)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var D_=function t(n){function e(t){return n?new R_(t,n):new T_(t,0)}return e.alpha=function(n){return t(+n)},e}(.5);function q_(t,n){this._context=t,this._alpha=n}q_.prototype={areaStart:__,areaEnd:__,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,n){if(t=+t,n=+n,this._point){var e=this._x2-t,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(e*e+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=n;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=n);break;case 2:this._point=3,this._x5=t,this._y5=n;break;default:z_(this,t,n)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var L_=function t(n){function e(t){return n?new q_(t,n):new k_(t,0)}return e.alpha=function(n){return t(+n)},e}(.5);function U_(t,n){this._context=t,this._alpha=n}U_.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){if(t=+t,n=+n,this._point){var e=this._x2-t,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(e*e+r*r,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:z_(this,t,n)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var O_=function t(n){function e(t){return n?new U_(t,n):new C_(t,0)}return e.alpha=function(n){return t(+n)},e}(.5);function B_(t){this._context=t}function Y_(t){return t<0?-1:1}function F_(t,n,e){var r=t._x1-t._x0,i=n-t._x1,o=(t._y1-t._y0)/(r||i<0&&-0),a=(e-t._y1)/(i||r<0&&-0),u=(o*i+a*r)/(r+i);return(Y_(o)+Y_(a))*Math.min(Math.abs(o),Math.abs(a),.5*Math.abs(u))||0}function I_(t,n){var e=t._x1-t._x0;return e?(3*(t._y1-t._y0)/e-n)/2:n}function H_(t,n,e){var r=t._x0,i=t._y0,o=t._x1,a=t._y1,u=(o-r)/3;t._context.bezierCurveTo(r+u,i+u*n,o-u,a-u*e,o,a)}function j_(t){this._context=t}function X_(t){this._context=new G_(t)}function G_(t){this._context=t}function V_(t){this._context=t}function $_(t){var n,e,r=t.length-1,i=new Array(r),o=new Array(r),a=new Array(r);for(i[0]=0,o[0]=2,a[0]=t[0]+2*t[1],n=1;n=0;--n)i[n]=(a[n]-i[n+1])/o[n];for(o[r-1]=(t[r]+i[r-1])/2,n=0;n1)for(var e,r,i,o=1,a=t[n[0]],u=a.length;o=0;)e[n]=n;return e}function K_(t,n){return t[n]}function J_(t){var n=t.map(tb);return Q_(t).sort(function(t,e){return n[t]-n[e]})}function tb(t){for(var n,e=-1,r=0,i=t.length,o=-1/0;++eo&&(o=n,r=e);return r}function nb(t){var n=t.map(eb);return Q_(t).sort(function(t,e){return n[t]-n[e]})}function eb(t){for(var n,e=0,r=-1,i=t.length;++r0)){if(o/=h,h<0){if(o0){if(o>l)return;o>s&&(s=o)}if(o=r-c,h||!(o<0)){if(o/=h,h<0){if(o>l)return;o>s&&(s=o)}else if(h>0){if(o0)){if(o/=d,d<0){if(o0){if(o>l)return;o>s&&(s=o)}if(o=i-f,d||!(o<0)){if(o/=d,d<0){if(o>l)return;o>s&&(s=o)}else if(d>0){if(o0||l<1)||(s>0&&(t[0]=[c+s*h,f+s*d]),l<1&&(t[1]=[c+l*h,f+l*d]),!0)}}}}}function vb(t,n,e,r,i){var o=t[1];if(o)return!0;var a,u,c=t[0],f=t.left,s=t.right,l=f[0],h=f[1],d=s[0],p=s[1],v=(l+d)/2,g=(h+p)/2;if(p===h){if(v=r)return;if(l>d){if(c){if(c[1]>=i)return}else c=[v,e];o=[v,i]}else{if(c){if(c[1]1)if(l>d){if(c){if(c[1]>=i)return}else c=[(e-u)/a,e];o=[(i-u)/a,i]}else{if(c){if(c[1]=r)return}else c=[n,a*n+u];o=[r,a*r+u]}else{if(c){if(c[0]=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,n),this._context.lineTo(t,n);else{var e=this._x*(1-this._t)+t*this._t;this._context.lineTo(e,this._y),this._context.lineTo(e,n)}}this._x=t,this._y=n}},ab.prototype={constructor:ab,insert:function(t,n){var e,r,i;if(t){if(n.P=t,n.N=t.N,t.N&&(t.N.P=n),t.N=n,t.R){for(t=t.R;t.L;)t=t.L;t.L=n}else t.R=n;e=t}else this._?(t=sb(this._),n.P=null,n.N=t,t.P=t.L=n,e=t):(n.P=n.N=null,this._=n,e=null);for(n.L=n.R=null,n.U=e,n.C=!0,t=n;e&&e.C;)e===(r=e.U).L?(i=r.R)&&i.C?(e.C=i.C=!1,r.C=!0,t=r):(t===e.R&&(cb(this,e),e=(t=e).U),e.C=!1,r.C=!0,fb(this,r)):(i=r.L)&&i.C?(e.C=i.C=!1,r.C=!0,t=r):(t===e.L&&(fb(this,e),e=(t=e).U),e.C=!1,r.C=!0,cb(this,r)),e=t.U;this._.C=!1},remove:function(t){t.N&&(t.N.P=t.P),t.P&&(t.P.N=t.N),t.N=t.P=null;var n,e,r,i=t.U,o=t.L,a=t.R;if(e=o?a?sb(a):o:a,i?i.L===t?i.L=e:i.R=e:this._=e,o&&a?(r=e.C,e.C=t.C,e.L=o,o.U=e,e!==a?(i=e.U,e.U=t.U,t=e.R,i.L=t,e.R=a,a.U=e):(e.U=i,i=e,t=e.R)):(r=t.C,t=e),t&&(t.U=i),!r)if(t&&t.C)t.C=!1;else{do{if(t===this._)break;if(t===i.L){if((n=i.R).C&&(n.C=!1,i.C=!0,cb(this,i),n=i.R),n.L&&n.L.C||n.R&&n.R.C){n.R&&n.R.C||(n.L.C=!1,n.C=!0,fb(this,n),n=i.R),n.C=i.C,i.C=n.R.C=!1,cb(this,i),t=this._;break}}else if((n=i.L).C&&(n.C=!1,i.C=!0,fb(this,i),n=i.L),n.L&&n.L.C||n.R&&n.R.C){n.L&&n.L.C||(n.R.C=!1,n.C=!0,cb(this,n),n=i.L),n.C=i.C,i.C=n.L.C=!1,fb(this,i),t=this._;break}n.C=!0,t=i,i=i.U}while(!t.C);t&&(t.C=!1)}}};var bb,mb=[];function xb(){ub(this),this.x=this.y=this.arc=this.site=this.cy=null}function wb(t){var n=t.P,e=t.N;if(n&&e){var r=n.site,i=t.site,o=e.site;if(r!==o){var a=i[0],u=i[1],c=r[0]-a,f=r[1]-u,s=o[0]-a,l=o[1]-u,h=2*(c*l-f*s);if(!(h>=-Ub)){var d=c*c+f*f,p=s*s+l*l,v=(l*d-f*p)/h,g=(c*p-s*d)/h,y=mb.pop()||new xb;y.arc=t,y.site=i,y.x=v+a,y.y=(y.cy=g+u)+Math.sqrt(v*v+g*g),t.circle=y;for(var _=null,b=Db._;b;)if(y.yLb)u=u.L;else{if(!((i=o-Pb(u,a))>Lb)){r>-Lb?(n=u.P,e=u):i>-Lb?(n=u,e=u.N):n=e=u;break}if(!u.R){n=u;break}u=u.R}!function(t){Rb[t.index]={site:t,halfedges:[]}}(t);var c=Tb(t);if(zb.insert(n,c),n||e){if(n===e)return Mb(n),e=Tb(n.site),zb.insert(c,e),c.edge=e.edge=lb(n.site,c.site),wb(n),void wb(e);if(e){Mb(n),Mb(e);var f=n.site,s=f[0],l=f[1],h=t[0]-s,d=t[1]-l,p=e.site,v=p[0]-s,g=p[1]-l,y=2*(h*g-d*v),_=h*h+d*d,b=v*v+g*g,m=[(g*_-d*b)/y+s,(h*b-v*_)/y+l];db(e.edge,f,p,m),c.edge=lb(f,t,null,m),e.edge=lb(t,p,null,m),wb(n),wb(e)}else c.edge=lb(n.site,c.site)}}function Cb(t,n){var e=t.site,r=e[0],i=e[1],o=i-n;if(!o)return r;var a=t.P;if(!a)return-1/0;var u=(e=a.site)[0],c=e[1],f=c-n;if(!f)return u;var s=u-r,l=1/o-1/f,h=s/f;return l?(-h+Math.sqrt(h*h-2*l*(s*s/(-2*f)-c+f/2+i-o/2)))/l+r:(r+u)/2}function Pb(t,n){var e=t.N;if(e)return Cb(e,n);var r=t.site;return r[1]===n?r[0]:1/0}var zb,Rb,Db,qb,Lb=1e-6,Ub=1e-12;function Ob(t,n,e){return(t[0]-e[0])*(n[1]-t[1])-(t[0]-n[0])*(e[1]-t[1])}function Bb(t,n){return n[1]-t[1]||n[0]-t[0]}function Yb(t,n){var e,r,i,o=t.sort(Bb).pop();for(qb=[],Rb=new Array(t.length),zb=new ab,Db=new ab;;)if(i=bb,o&&(!i||o[1]Lb||Math.abs(i[0][1]-i[1][1])>Lb)||delete qb[o]}(a,u,c,f),function(t,n,e,r){var i,o,a,u,c,f,s,l,h,d,p,v,g=Rb.length,y=!0;for(i=0;iLb||Math.abs(v-h)>Lb)&&(c.splice(u,0,qb.push(hb(a,d,Math.abs(p-t)Lb?[t,Math.abs(l-t)Lb?[Math.abs(h-r)Lb?[e,Math.abs(l-e)Lb?[Math.abs(h-n)=u)return null;var c=t-i.site[0],f=n-i.site[1],s=c*c+f*f;do{i=o.cells[r=a],a=null,i.halfedges.forEach(function(e){var r=o.edges[e],u=r.left;if(u!==i.site&&u||(u=r.right)){var c=t-u[0],f=n-u[1],l=c*c+f*f;lr?(r+i)/2:Math.min(0,r)||Math.max(0,i),a>o?(o+a)/2:Math.min(0,o)||Math.max(0,a))}Xb.prototype=Hb.prototype,t.FormatSpecifier=Ra,t.active=function(t,n){var e,r,i=t.__transition;if(i)for(r in n=null==n?null:n+"",i)if((e=i[r]).state>mr&&e.name===n)return new Lr([[t]],gi,n,+r);return null},t.arc=function(){var t=Sy,n=ky,e=py(0),r=null,i=Ey,o=Cy,a=Py,u=null;function c(){var c,f,s=+t.apply(this,arguments),l=+n.apply(this,arguments),h=i.apply(this,arguments)-Ny,d=o.apply(this,arguments)-Ny,p=vy(d-h),v=d>h;if(u||(u=c=to()),lwy)if(p>Ay-wy)u.moveTo(l*yy(h),l*my(h)),u.arc(0,0,l,h,d,!v),s>wy&&(u.moveTo(s*yy(d),s*my(d)),u.arc(0,0,s,d,h,v));else{var g,y,_=h,b=d,m=h,x=d,w=p,M=p,N=a.apply(this,arguments)/2,A=N>wy&&(r?+r.apply(this,arguments):xy(s*s+l*l)),T=by(vy(l-s)/2,+e.apply(this,arguments)),S=T,k=T;if(A>wy){var E=Ty(A/s*my(N)),C=Ty(A/l*my(N));(w-=2*E)>wy?(m+=E*=v?1:-1,x-=E):(w=0,m=x=(h+d)/2),(M-=2*C)>wy?(_+=C*=v?1:-1,b-=C):(M=0,_=b=(h+d)/2)}var P=l*yy(_),z=l*my(_),R=s*yy(x),D=s*my(x);if(T>wy){var q,L=l*yy(b),U=l*my(b),O=s*yy(m),B=s*my(m);if(p1?0:t<-1?My:Math.acos(t)}((Y*I+F*H)/(xy(Y*Y+F*F)*xy(I*I+H*H)))/2),X=xy(q[0]*q[0]+q[1]*q[1]);S=by(T,(s-X)/(j-1)),k=by(T,(l-X)/(j+1))}}M>wy?k>wy?(g=zy(O,B,P,z,l,k,v),y=zy(L,U,R,D,l,k,v),u.moveTo(g.cx+g.x01,g.cy+g.y01),kwy&&w>wy?S>wy?(g=zy(R,D,L,U,s,-S,v),y=zy(P,z,O,B,s,-S,v),u.lineTo(g.cx+g.x01,g.cy+g.y01),S>a,f=i+2*u>>a,s=_o(20);function l(r){var i=new Float32Array(c*f),l=new Float32Array(c*f);r.forEach(function(r,o,s){var l=+t(r,o,s)+u>>a,h=+n(r,o,s)+u>>a,d=+e(r,o,s);l>=0&&l=0&&h>a),To({width:c,height:f,data:l},{width:c,height:f,data:i},o>>a),Ao({width:c,height:f,data:i},{width:c,height:f,data:l},o>>a),To({width:c,height:f,data:l},{width:c,height:f,data:i},o>>a),Ao({width:c,height:f,data:i},{width:c,height:f,data:l},o>>a),To({width:c,height:f,data:l},{width:c,height:f,data:i},o>>a);var d=s(i);if(!Array.isArray(d)){var p=A(i);d=w(0,p,d),(d=g(0,Math.floor(p/d)*d,d)).shift()}return No().thresholds(d).size([c,f])(i).map(h)}function h(t){return t.value*=Math.pow(2,-2*a),t.coordinates.forEach(d),t}function d(t){t.forEach(p)}function p(t){t.forEach(v)}function v(t){t[0]=t[0]*Math.pow(2,a)-u,t[1]=t[1]*Math.pow(2,a)-u}function y(){return c=r+2*(u=3*o)>>a,f=i+2*u>>a,l}return l.x=function(n){return arguments.length?(t="function"==typeof n?n:_o(+n),l):t},l.y=function(t){return arguments.length?(n="function"==typeof t?t:_o(+t),l):n},l.weight=function(t){return arguments.length?(e="function"==typeof t?t:_o(+t),l):e},l.size=function(t){if(!arguments.length)return[r,i];var n=Math.ceil(t[0]),e=Math.ceil(t[1]);if(!(n>=0||n>=0))throw new Error("invalid size");return r=n,i=e,y()},l.cellSize=function(t){if(!arguments.length)return 1<=1))throw new Error("invalid cell size");return a=Math.floor(Math.log(t)/Math.LN2),y()},l.thresholds=function(t){return arguments.length?(s="function"==typeof t?t:Array.isArray(t)?_o(go.call(t)):_o(t),l):s},l.bandwidth=function(t){if(!arguments.length)return Math.sqrt(o*(o+1));if(!((t=+t)>=0))throw new Error("invalid bandwidth");return o=Math.round((Math.sqrt(4*t*t+1)-1)/2),y()},l},t.contours=No,t.create=function(t){return Rt(Z(t).call(document.documentElement))},t.creator=Z,t.cross=function(t,n,e){var r,i,o,u,c=t.length,f=n.length,s=new Array(c*f);for(null==e&&(e=a),r=o=0;rt?1:n>=t?0:NaN},t.deviation=f,t.dispatch=I,t.drag=function(){var n,e,r,i,o=Vt,a=$t,u=Wt,c=Zt,f={},s=I("start","drag","end"),l=0,h=0;function d(t){t.on("mousedown.drag",p).filter(c).on("touchstart.drag",y).on("touchmove.drag",_).on("touchend.drag touchcancel.drag",b).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function p(){if(!i&&o.apply(this,arguments)){var u=m("mouse",a.apply(this,arguments),Bt,this,arguments);u&&(Rt(t.event.view).on("mousemove.drag",v,!0).on("mouseup.drag",g,!0),Ht(t.event.view),Ft(),r=!1,n=t.event.clientX,e=t.event.clientY,u("start"))}}function v(){if(It(),!r){var i=t.event.clientX-n,o=t.event.clientY-e;r=i*i+o*o>h}f.mouse("drag")}function g(){Rt(t.event.view).on("mousemove.drag mouseup.drag",null),jt(t.event.view,r),It(),f.mouse("end")}function y(){if(o.apply(this,arguments)){var n,e,r=t.event.changedTouches,i=a.apply(this,arguments),u=r.length;for(n=0;nc+d||if+d||ou.index){var p=c-a.x-a.vx,v=f-a.y-a.vy,g=p*p+v*v;gt.r&&(t.r=t[n].r)}function u(){if(n){var r,i,o=n.length;for(e=new Array(o),r=0;r=a)){(t.data!==n||t.next)&&(0===s&&(d+=(s=la())*s),0===l&&(d+=(l=la())*l),d1?(null==e?u.remove(t):u.set(t,d(e)),n):u.get(t)},find:function(n,e,r){var i,o,a,u,c,f=0,s=t.length;for(null==r?r=1/0:r*=r,f=0;f1?(f.on(t,e),n):f.on(t)}}},t.forceX=function(t){var n,e,r,i=sa(.1);function o(t){for(var i,o=0,a=n.length;o=.12&&i<.234&&r>=-.425&&r<-.214?u:i>=.166&&i<.234&&r>=-.214&&r<-.115?c:a).invert(t)},s.stream=function(e){return t&&n===e?t:(r=[a.stream(n=e),u.stream(e),c.stream(e)],i=r.length,t={point:function(t,n){for(var e=-1;++eAc(r[0],r[1])&&(r[1]=i[1]),Ac(i[0],r[1])>Ac(r[0],r[1])&&(r[0]=i[0])):o.push(r=i);for(a=-1/0,n=0,r=o[e=o.length-1];n<=e;r=i,++n)i=o[n],(u=Ac(r[1],i[0]))>a&&(a=u,ju=i[0],Gu=r[1])}return Ku=Ju=null,ju===1/0||Xu===1/0?[[NaN,NaN],[NaN,NaN]]:[[ju,Xu],[Gu,Vu]]},t.geoCentroid=function(t){tc=nc=ec=rc=ic=oc=ac=uc=cc=fc=sc=0,Nu(t,kc);var n=cc,e=fc,r=sc,i=n*n+e*e+r*r;return i2?t[2]+90:90]):[(t=e())[0],t[1],t[2]-90]},e([0,0,90]).scale(159.155)},t.geoTransverseMercatorRaw=_l,t.gray=function(t,n){return new Yn(t,0,0,null==n?1:n)},t.hcl=Gn,t.hierarchy=Ml,t.histogram=function(){var t=v,n=s,e=M;function r(r){var o,a,u=r.length,c=new Array(u);for(o=0;ol;)h.pop(),--d;var p,v=new Array(d+1);for(o=0;o<=d;++o)(p=v[o]=[]).x0=o>0?h[o-1]:s,p.x1=o1)&&(t-=Math.floor(t));var n=Math.abs(t-.5);return oy.h=360*t-100,oy.s=1.5-1.5*n,oy.l=.8-.9*n,oy+""},t.interpolateRdBu=lg,t.interpolateRdGy=dg,t.interpolateRdPu=qg,t.interpolateRdYlBu=vg,t.interpolateRdYlGn=yg,t.interpolateReds=Jg,t.interpolateRgb=de,t.interpolateRgbBasis=ve,t.interpolateRgbBasisClosed=ge,t.interpolateRound=Ae,t.interpolateSinebow=function(t){var n;return t=(.5-t)*Math.PI,ay.r=255*(n=Math.sin(t))*n,ay.g=255*(n=Math.sin(t+uy))*n,ay.b=255*(n=Math.sin(t+cy))*n,ay+""},t.interpolateSpectral=bg,t.interpolateString=Me,t.interpolateTransformCss=De,t.interpolateTransformSvg=qe,t.interpolateTurbo=function(t){return t=Math.max(0,Math.min(1,t)),"rgb("+Math.max(0,Math.min(255,Math.round(34.61+t*(1172.33-t*(10793.56-t*(33300.12-t*(38394.49-14825.05*t)))))))+", "+Math.max(0,Math.min(255,Math.round(23.31+t*(557.33+t*(1225.33-t*(3574.96-t*(1073.77+707.56*t)))))))+", "+Math.max(0,Math.min(255,Math.round(27.2+t*(3211.1-t*(15327.97-t*(27814-t*(22569.18-6838.66*t)))))))+")"},t.interpolateViridis=sy,t.interpolateWarm=ry,t.interpolateYlGn=Bg,t.interpolateYlGnBu=Ug,t.interpolateYlOrBr=Fg,t.interpolateYlOrRd=Hg,t.interpolateZoom=Fe,t.interrupt=Cr,t.interval=function(t,n,e){var r=new sr,i=n;return null==n?(r.restart(t,n,e),r):(n=+n,e=null==e?cr():+e,r.restart(function o(a){a+=i,r.restart(o,i+=n,e),t(a)},n,e),r)},t.isoFormat=Sv,t.isoParse=kv,t.json=function(t,n){return fetch(t,n).then(oa)},t.keys=function(t){var n=[];for(var e in t)n.push(e);return n},t.lab=Bn,t.lch=function(t,n,e,r){return 1===arguments.length?Xn(t):new Vn(e,n,t,null==r?1:r)},t.line=Uy,t.lineRadial=Xy,t.linkHorizontal=function(){return Qy(Ky)},t.linkRadial=function(){var t=Qy(t_);return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t},t.linkVertical=function(){return Qy(Jy)},t.local=qt,t.map=uo,t.matcher=nt,t.max=A,t.mean=function(t,n){var e,r=t.length,i=r,o=-1,a=0;if(null==n)for(;++o=r.length)return null!=t&&e.sort(t),null!=n?n(e):e;for(var c,f,s,l=-1,h=e.length,d=r[i++],p=uo(),v=a();++lr.length)return e;var a,u=i[o-1];return null!=n&&o>=r.length?a=e.entries():(a=[],e.each(function(n,e){a.push({key:e,values:t(n,o)})})),null!=u?a.sort(function(t,n){return u(t.key,n.key)}):a}(o(t,0,so,lo),0)},key:function(t){return r.push(t),e},sortKeys:function(t){return i[r.length-1]=t,e},sortValues:function(n){return t=n,e},rollup:function(t){return n=t,e}}},t.now=cr,t.pack=function(){var t=null,n=1,e=1,r=jl;function i(i){return i.x=n/2,i.y=e/2,t?i.eachBefore(Vl(t)).eachAfter($l(r,.5)).eachBefore(Wl(1)):i.eachBefore(Vl(Gl)).eachAfter($l(jl,1)).eachAfter($l(r,i.r/Math.min(n,e))).eachBefore(Wl(Math.min(n,e)/(2*i.r))),i}return i.radius=function(n){return arguments.length?(t=Il(n),i):t},i.size=function(t){return arguments.length?(n=+t[0],e=+t[1],i):[n,e]},i.padding=function(t){return arguments.length?(r="function"==typeof t?t:Xl(+t),i):r},i},t.packEnclose=El,t.packSiblings=function(t){return Fl(t),t},t.pairs=function(t,n){null==n&&(n=a);for(var e=0,r=t.length-1,i=t[0],o=new Array(r<0?0:r);e0&&(d+=l);for(null!=n?p.sort(function(t,e){return n(v[t],v[e])}):null!=e&&p.sort(function(t,n){return e(a[t],a[n])}),u=0,f=d?(y-h*b)/d:0;u0?l*f:0)+b,v[c]={data:a[c],index:u,value:l,startAngle:g,endAngle:s,padAngle:_};return v}return a.value=function(n){return arguments.length?(t="function"==typeof n?n:py(+n),a):t},a.sortValues=function(t){return arguments.length?(n=t,e=null,a):n},a.sort=function(t){return arguments.length?(e=t,n=null,a):e},a.startAngle=function(t){return arguments.length?(r="function"==typeof t?t:py(+t),a):r},a.endAngle=function(t){return arguments.length?(i="function"==typeof t?t:py(+t),a):i},a.padAngle=function(t){return arguments.length?(o="function"==typeof t?t:py(+t),a):o},a},t.piecewise=function(t,n){for(var e=0,r=n.length-1,i=n[0],o=new Array(r<0?0:r);eu!=f>u&&a<(c-e)*(u-r)/(f-r)+e&&(s=!s),c=e,f=r;return s},t.polygonHull=function(t){if((e=t.length)<3)return null;var n,e,r=new Array(e),i=new Array(e);for(n=0;n=0;--n)f.push(t[r[o[n]][2]]);for(n=+u;n0?a[n-1]:r[0],n=o?[a[o-1],r]:[a[n-1],a[n]]},c.unknown=function(t){return arguments.length?(n=t,c):c},c.thresholds=function(){return a.slice()},c.copy=function(){return t().domain([e,r]).range(u).unknown(n)},Nh.apply(Hh(c),arguments)},t.scaleSequential=function t(){var n=Hh(Bv()(Dh));return n.copy=function(){return Yv(n,t())},Ah.apply(n,arguments)},t.scaleSequentialLog=function t(){var n=Qh(Bv()).domain([1,10]);return n.copy=function(){return Yv(n,t()).base(n.base())},Ah.apply(n,arguments)},t.scaleSequentialPow=Fv,t.scaleSequentialQuantile=function t(){var e=[],r=Dh;function o(t){if(!isNaN(t=+t))return r((i(e,t)-1)/(e.length-1))}return o.domain=function(t){if(!arguments.length)return e.slice();e=[];for(var r,i=0,a=t.length;i0)for(var e,r,i,o,a,u,c=0,f=t[n[0]].length;c=0?(r[0]=o,r[1]=o+=i):i<0?(r[1]=a,r[0]=a+=i):r[0]=o},t.stackOffsetExpand=function(t,n){if((r=t.length)>0){for(var e,r,i,o=0,a=t[0].length;o0){for(var e,r=0,i=t[n[0]],o=i.length;r0&&(r=(e=t[n[0]]).length)>0){for(var e,r,i,o=0,a=1;a0)throw new Error("cycle");return o}return e.id=function(n){return arguments.length?(t=Hl(n),e):t},e.parentId=function(t){return arguments.length?(n=Hl(t),e):n},e},t.style=ft,t.sum=function(t,n){var e,r=t.length,i=-1,o=0;if(null==n)for(;++i=0;--i)u.push(e=n.children[i]=new ch(r[i],i)),e.parent=n;return(a.parent=new ch(null,0)).children=[a],a}(i);if(c.eachAfter(o),c.parent.m=-c.z,c.eachBefore(a),r)i.eachBefore(u);else{var f=i,s=i,l=i;i.eachBefore(function(t){t.xs.x&&(s=t),t.depth>l.depth&&(l=t)});var h=f===s?1:t(f,s)/2,d=h-f.x,p=n/(s.x+h+d),v=e/(l.depth||1);i.eachBefore(function(t){t.x=(t.x+d)*p,t.y=t.depth*v})}return i}function o(n){var e=n.children,r=n.parent.children,i=n.i?r[n.i-1]:null;if(e){!function(t){for(var n,e=0,r=0,i=t.children,o=i.length;--o>=0;)(n=i[o]).z+=e,n.m+=e,e+=n.s+(r+=n.c)}(n);var o=(e[0].z+e[e.length-1].z)/2;i?(n.z=i.z+t(n._,i._),n.m=n.z-o):n.z=o}else i&&(n.z=i.z+t(n._,i._));n.parent.A=function(n,e,r){if(e){for(var i,o=n,a=n,u=e,c=o.parent.children[0],f=o.m,s=a.m,l=u.m,h=c.m;u=oh(u),o=ih(o),u&&o;)c=ih(c),(a=oh(a)).a=n,(i=u.z+l-o.z-f+t(u._,o._))>0&&(ah(uh(u,n,r),n,i),f+=i,s+=i),l+=u.m,f+=o.m,h+=c.m,s+=a.m;u&&!oh(a)&&(a.t=u,a.m+=l-s),o&&!ih(c)&&(c.t=o,c.m+=f-h,r=n)}return r}(n,i,n.parent.A||r[0])}function a(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function u(t){t.x*=n,t.y=t.depth*e}return i.separation=function(n){return arguments.length?(t=n,i):t},i.size=function(t){return arguments.length?(r=!1,n=+t[0],e=+t[1],i):r?null:[n,e]},i.nodeSize=function(t){return arguments.length?(r=!0,n=+t[0],e=+t[1],i):r?[n,e]:null},i},t.treemap=function(){var t=hh,n=!1,e=1,r=1,i=[0],o=jl,a=jl,u=jl,c=jl,f=jl;function s(t){return t.x0=t.y0=0,t.x1=e,t.y1=r,t.eachBefore(l),i=[0],n&&t.eachBefore(Zl),t}function l(n){var e=i[n.depth],r=n.x0+e,s=n.y0+e,l=n.x1-e,h=n.y1-e;l=e-1){var s=u[n];return s.x0=i,s.y0=o,s.x1=a,void(s.y1=c)}for(var l=f[n],h=r/2+l,d=n+1,p=e-1;d>>1;f[v]c-o){var _=(i*y+a*g)/r;t(n,d,g,i,o,_,c),t(d,e,y,_,o,a,c)}else{var b=(o*y+c*g)/r;t(n,d,g,i,o,a,b),t(d,e,y,i,b,a,c)}}(0,c,t.value,n,e,r,i)},t.treemapDice=Ql,t.treemapResquarify=dh,t.treemapSlice=fh,t.treemapSliceDice=function(t,n,e,r,i){(1&t.depth?fh:Ql)(t,n,e,r,i)},t.treemapSquarify=hh,t.tsv=ia,t.tsvFormat=Wo,t.tsvFormatBody=Zo,t.tsvFormatRows=Qo,t.tsvParse=Vo,t.tsvParseRows=$o,t.utcDay=jd,t.utcDays=Xd,t.utcFriday=Kd,t.utcFridays=op,t.utcHour=Id,t.utcHours=Hd,t.utcMillisecond=fd,t.utcMilliseconds=sd,t.utcMinute=Yd,t.utcMinutes=Fd,t.utcMonday=$d,t.utcMondays=np,t.utcMonth=up,t.utcMonths=cp,t.utcSaturday=Jd,t.utcSaturdays=ap,t.utcSecond=dd,t.utcSeconds=pd,t.utcSunday=Vd,t.utcSundays=tp,t.utcThursday=Qd,t.utcThursdays=ip,t.utcTuesday=Wd,t.utcTuesdays=ep,t.utcWednesday=Zd,t.utcWednesdays=rp,t.utcWeek=Vd,t.utcWeeks=tp,t.utcYear=fp,t.utcYears=sp,t.values=function(t){var n=[];for(var e in t)n.push(t[e]);return n},t.variance=c,t.version="5.12.0",t.voronoi=function(){var t=ib,n=ob,e=null;function r(r){return new Yb(r.map(function(e,i){var o=[Math.round(t(e,i,r)/Lb)*Lb,Math.round(n(e,i,r)/Lb)*Lb];return o.index=i,o.data=e,o}),e)}return r.polygons=function(t){return r(t).polygons()},r.links=function(t){return r(t).links()},r.triangles=function(t){return r(t).triangles()},r.x=function(n){return arguments.length?(t="function"==typeof n?n:rb(+n),r):t},r.y=function(t){return arguments.length?(n="function"==typeof t?t:rb(+t),r):n},r.extent=function(t){return arguments.length?(e=null==t?null:[[+t[0][0],+t[0][1]],[+t[1][0],+t[1][1]]],r):e&&[[e[0][0],e[0][1]],[e[1][0],e[1][1]]]},r.size=function(t){return arguments.length?(e=null==t?null:[[0,0],[+t[0],+t[1]]],r):e&&[e[1][0]-e[0][0],e[1][1]-e[0][1]]},r},t.window=ct,t.xml=ua,t.zip=function(){return k(arguments)},t.zoom=function(){var n,e,r=$b,i=Wb,o=Jb,a=Qb,u=Kb,c=[0,1/0],f=[[-1/0,-1/0],[1/0,1/0]],s=250,l=Fe,h=I("start","zoom","end"),d=500,p=150,v=0;function g(t){t.property("__zoom",Zb).on("wheel.zoom",M).on("mousedown.zoom",N).on("dblclick.zoom",A).filter(u).on("touchstart.zoom",T).on("touchmove.zoom",S).on("touchend.zoom touchcancel.zoom",k).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function y(t,n){return(n=Math.max(c[0],Math.min(c[1],n)))===t.k?t:new Hb(n,t.x,t.y)}function _(t,n,e){var r=n[0]-e[0]*t.k,i=n[1]-e[1]*t.k;return r===t.x&&i===t.y?t:new Hb(t.k,r,i)}function b(t){return[(+t[0][0]+ +t[1][0])/2,(+t[0][1]+ +t[1][1])/2]}function m(t,n,e){t.on("start.zoom",function(){x(this,arguments).start()}).on("interrupt.zoom end.zoom",function(){x(this,arguments).end()}).tween("zoom",function(){var t=this,r=arguments,o=x(t,r),a=i.apply(t,r),u=null==e?b(a):"function"==typeof e?e.apply(t,r):e,c=Math.max(a[1][0]-a[0][0],a[1][1]-a[0][1]),f=t.__zoom,s="function"==typeof n?n.apply(t,r):n,h=l(f.invert(u).concat(c/f.k),s.invert(u).concat(c/s.k));return function(t){if(1===t)t=s;else{var n=h(t),e=c/n[2];t=new Hb(e,u[0]-n[0]*e,u[1]-n[1]*e)}o.zoom(null,t)}})}function x(t,n,e){return!e&&t.__zooming||new w(t,n)}function w(t,n){this.that=t,this.args=n,this.active=0,this.extent=i.apply(t,n),this.taps=0}function M(){if(r.apply(this,arguments)){var t=x(this,arguments),n=this.__zoom,e=Math.max(c[0],Math.min(c[1],n.k*Math.pow(2,a.apply(this,arguments)))),i=Bt(this);if(t.wheel)t.mouse[0][0]===i[0]&&t.mouse[0][1]===i[1]||(t.mouse[1]=n.invert(t.mouse[0]=i)),clearTimeout(t.wheel);else{if(n.k===e)return;t.mouse=[i,n.invert(i)],Cr(this),t.start()}Vb(),t.wheel=setTimeout(function(){t.wheel=null,t.end()},p),t.zoom("mouse",o(_(y(n,e),t.mouse[0],t.mouse[1]),t.extent,f))}}function N(){if(!e&&r.apply(this,arguments)){var n=x(this,arguments,!0),i=Rt(t.event.view).on("mousemove.zoom",function(){if(Vb(),!n.moved){var e=t.event.clientX-u,r=t.event.clientY-c;n.moved=e*e+r*r>v}n.zoom("mouse",o(_(n.that.__zoom,n.mouse[0]=Bt(n.that),n.mouse[1]),n.extent,f))},!0).on("mouseup.zoom",function(){i.on("mousemove.zoom mouseup.zoom",null),jt(t.event.view,n.moved),Vb(),n.end()},!0),a=Bt(this),u=t.event.clientX,c=t.event.clientY;Ht(t.event.view),Gb(),n.mouse=[a,this.__zoom.invert(a)],Cr(this),n.start()}}function A(){if(r.apply(this,arguments)){var n=this.__zoom,e=Bt(this),a=n.invert(e),u=n.k*(t.event.shiftKey?.5:2),c=o(_(y(n,u),e,a),i.apply(this,arguments),f);Vb(),s>0?Rt(this).transition().duration(s).call(m,c,e):Rt(this).call(g.transform,c)}}function T(){if(r.apply(this,arguments)){var e,i,o,a,u=t.event.touches,c=u.length,f=x(this,arguments,t.event.changedTouches.length===c);for(Gb(),i=0;i=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a); +}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S),a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}}),r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var _a,ab=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return T(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?_a:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),_a={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ab[b]||r.find.attr;ab[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=ab[g],ab[g]=e,e=null!=c(a,b,d)?g:null,ab[g]=f),e}});var bb=/^(?:input|select|textarea|button)$/i,cb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function db(a){var b=a.match(L)||[];return b.join(" ")}function eb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,eb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=eb(c),d=1===c.nodeType&&" "+db(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=db(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,eb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=eb(c),d=1===c.nodeType&&" "+db(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=db(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,eb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=eb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+db(eb(c))+" ").indexOf(b)>-1)return!0;return!1}});var fb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(fb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:db(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var gb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!gb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,gb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var hb=/\[\]$/,ib=/\r?\n/g,jb=/^(?:submit|button|image|reset|file)$/i,kb=/^(?:input|select|textarea|keygen)/i;function lb(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||hb.test(a)?d(a,e):lb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d); +});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)lb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)lb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&kb.test(this.nodeName)&&!jb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ib,"\r\n")}}):{name:b.name,value:c.replace(ib,"\r\n")}}).get()}}),r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="
",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=C.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=qa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),b=f.ownerDocument,c=b.documentElement,e=b.defaultView,{top:d.top+e.pageYOffset-c.clientTop,left:d.left+e.pageXOffset-c.clientLeft}):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),B(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||ra})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return T(this,function(a,d,e){var f;return r.isWindow(a)?f=a:9===a.nodeType&&(f=a.defaultView),void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Pa(o.pixelPosition,function(a,c){if(c)return c=Oa(a,b),Ma.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return T(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.holdReady=function(a){a?r.readyWait++:r.ready(!0)},r.isArray=Array.isArray,r.parseJSON=JSON.parse,r.nodeName=B,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var mb=a.jQuery,nb=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=nb),b&&a.jQuery===r&&(a.jQuery=mb),r},b||(a.jQuery=a.$=r),r}); diff --git a/pkg/ui/v1beta1/frontend/public/scripts/mode-xml.js b/pkg/ui/v1beta1/frontend/public/scripts/mode-xml.js new file mode 100644 index 00000000000..709c38bf526 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/public/scripts/mode-xml.js @@ -0,0 +1,8 @@ +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(e){var t="[_:a-zA-Z\u00c0-\uffff][-_:.a-zA-Z0-9\u00c0-\uffff]*";this.$rules={start:[{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\[",next:"cdata"},{token:["punctuation.instruction.xml","keyword.instruction.xml"],regex:"(<\\?)("+t+")",next:"processing_instruction"},{token:"comment.start.xml",regex:"<\\!--",next:"comment"},{token:["xml-pe.doctype.xml","xml-pe.doctype.xml"],regex:"(<\\!)(DOCTYPE)(?=[\\s])",next:"doctype",caseInsensitive:!0},{include:"tag"},{token:"text.end-tag-open.xml",regex:"",next:"start"}],doctype:[{include:"whitespace"},{include:"string"},{token:"xml-pe.doctype.xml",regex:">",next:"start"},{token:"xml-pe.xml",regex:"[-_a-zA-Z0-9:]+"},{token:"punctuation.int-subset",regex:"\\[",push:"int_subset"}],int_subset:[{token:"text.xml",regex:"\\s+"},{token:"punctuation.int-subset.xml",regex:"]",next:"pop"},{token:["punctuation.markup-decl.xml","keyword.markup-decl.xml"],regex:"(<\\!)("+t+")",push:[{token:"text",regex:"\\s+"},{token:"punctuation.markup-decl.xml",regex:">",next:"pop"},{include:"string"}]}],cdata:[{token:"string.cdata.xml",regex:"\\]\\]>",next:"start"},{token:"text.xml",regex:"\\s+"},{token:"text.xml",regex:"(?:[^\\]]|\\](?!\\]>))+"}],comment:[{token:"comment.end.xml",regex:"-->",next:"start"},{defaultToken:"comment.xml"}],reference:[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],attr_reference:[{token:"constant.language.escape.reference.attribute-value.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],tag:[{token:["meta.tag.punctuation.tag-open.xml","meta.tag.punctuation.end-tag-open.xml","meta.tag.tag-name.xml"],regex:"(?:(<)|(",next:"start"}]}],tag_whitespace:[{token:"text.tag-whitespace.xml",regex:"\\s+"}],whitespace:[{token:"text.whitespace.xml",regex:"\\s+"}],string:[{token:"string.xml",regex:"'",push:[{token:"string.xml",regex:"'",next:"pop"},{defaultToken:"string.xml"}]},{token:"string.xml",regex:'"',push:[{token:"string.xml",regex:'"',next:"pop"},{defaultToken:"string.xml"}]}],attributes:[{token:"entity.other.attribute-name.xml",regex:t},{token:"keyword.operator.attribute-equals.xml",regex:"="},{include:"tag_whitespace"},{include:"attribute_value"}],attribute_value:[{token:"string.attribute-value.xml",regex:"'",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:["meta.tag.punctuation.tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(<)("+n+"(?=\\s|>|$))",next:[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:t+"start"}]}),this.$rules[n+"-end"]=[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:"start",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:["meta.tag.punctuation.end-tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(|$))",next:n+"-end"},{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\["},{token:"string.cdata.xml",regex:"\\]\\]>"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";function u(e,t){return e&&e.type.lastIndexOf(t+".xml")>-1}var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),a=function(){this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==""&&a!=="'"&&a!='"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,"attribute-value")||u(p,"string")))return{text:"",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,"tag-whitespace")||u(p,"whitespace"))p=h.stepBackward();var d=!c||c.match(/\s/);if(u(p,"attribute-equals")&&(d||c==">")||u(p,"decl-attribute-equals")&&(d||c=="?"))return{text:o+o,selection:[1,1]}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add("autoclosing","insertion",function(e,t,n,r,i){if(i==">"){var o=n.getSelectionRange().start,a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,"tag-name")||u(f,"tag-whitespace")||u(f,"attribute-name")||u(f,"attribute-equals")||u(f,"attribute-value")))return;if(u(f,"reference.attribute-value"))return;if(u(f,"attribute-value")){var l=a.getCurrentTokenColumn()+f.value.length;if(o.column/.test(r.getLine(o.row).slice(o.column)))return;while(!u(f,"tag-name")){f=a.stepBackward();if(f.value=="<"){f=a.stepForward();break}}var h=a.getCurrentTokenRow(),p=a.getCurrentTokenColumn();if(u(a.stepBackward(),"end-tag-open"))return;var d=f.value;h==o.row&&(d=d.substring(0,o.column-p));if(this.voidElements.hasOwnProperty(d.toLowerCase()))return;return{text:">",selection:[1,1]}}}),this.add("autoindent","insertion",function(e,t,n,r,i){if(i=="\n"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf("tag-close")!==-1){if(f.value=="/>")return;while(f&&f.type.indexOf("tag-name")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf("end-tag")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value==="-1}var r=e("../../lib/oop"),i=e("../../lib/lang"),s=e("../../range").Range,o=e("./fold_mode").FoldMode,u=e("../../token_iterator").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName="",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t=="markbeginend"?"end":"":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?"":this._findEndTagInLine(e,n,r.tagName,r.end.column)?"":"start":this.getCommentFoldWidget(e,n)},this.getCommentFoldWidget=function(e,t){return/comment/.test(e.getState(t))&&/";break}}return r}if(l(s,"tag-close"))return r.selfClosing=s.value=="/>",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,"tag-open"))return n.closing=l(t,"end-tag-open"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,"tag-name")?n.tagName=t.value:l(t,"tag-close")&&(n.selfClosing=t.value=="/>",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return this.getCommentFoldWidget(e,n)&&e.getCommentFoldRange(n,e.getLine(n).length);var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column"},this.createWorker=function(e){var t=new f(["ace"],"ace/mode/xml_worker","Worker");return t.attachToDocument(e.getDocument()),t.on("error",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/xml"}.call(l.prototype),t.Mode=l}); (function() { + ace.require(["ace/mode/xml"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/pkg/ui/v1beta1/frontend/public/scripts/popper.min.js b/pkg/ui/v1beta1/frontend/public/scripts/popper.min.js new file mode 100644 index 00000000000..0f20d2a8959 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/public/scripts/popper.min.js @@ -0,0 +1,5 @@ +/* + Copyright (C) Federico Zivolo 2017 + Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT). + */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=getComputedStyle(e,null);return t?o[t]:o}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll)/.test(r+s+p)?e:n(o(e))}function r(e){var o=e&&e.offsetParent,i=o&&o.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TD','TABLE'].indexOf(o.nodeName)&&'static'===t(o,'position')?r(o):o:e?e.ownerDocument.documentElement:document.documentElement}function p(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||r(e.firstElementChild)===e)}function s(e){return null===e.parentNode?e:s(e.parentNode)}function d(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,i=o?e:t,n=o?t:e,a=document.createRange();a.setStart(i,0),a.setEnd(n,0);var l=a.commonAncestorContainer;if(e!==l&&t!==l||i.contains(n))return p(l)?l:r(l);var f=s(e);return f.host?d(f.host,t):d(e,s(t).host)}function a(e){var t=1=o.clientWidth&&i>=o.clientHeight}),l=0i[e]&&!t.escapeWithReference&&(n=_(p[o],i[e]-('right'===e?p.width:p.height))),pe({},o,n)}};return n.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';p=se({},p,s[t](e))}),e.offsets.popper=p,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,i=t.reference,n=e.placement.split('-')[0],r=X,p=-1!==['top','bottom'].indexOf(n),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(i[s])&&(e.offsets.popper[d]=r(i[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var i;if(!F(e.instance.modifiers,'arrow','keepTogether'))return e;var n=o.element;if('string'==typeof n){if(n=e.instance.popper.querySelector(n),!n)return e;}else if(!e.instance.popper.contains(n))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',g=a?'bottom':'right',u=L(n)[l];d[g]-us[g]&&(e.offsets.popper[m]+=d[m]+u-s[g]),e.offsets.popper=c(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f],10),E=parseFloat(w['border'+f+'Width'],10),v=b-e.offsets.popper[m]-y-E;return v=J(_(s[l]-u,v),0),e.arrowElement=n,e.offsets.arrow=(i={},pe(i,m,Math.round(v)),pe(i,h,''),i),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(k(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=y(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement),i=e.placement.split('-')[0],n=x(i),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case le.FLIP:p=[i,n];break;case le.CLOCKWISE:p=q(i);break;case le.COUNTERCLOCKWISE:p=q(i,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(i!==s||p.length===d+1)return e;i=e.placement.split('-')[0],n=x(i);var a=e.offsets.popper,l=e.offsets.reference,f=X,m='left'===i&&f(a.right)>f(l.left)||'right'===i&&f(a.left)f(l.top)||'bottom'===i&&f(a.top)f(o.right),g=f(a.top)f(o.bottom),b='left'===i&&h||'right'===i&&c||'top'===i&&g||'bottom'===i&&u,w=-1!==['top','bottom'].indexOf(i),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u);(m||b||y)&&(e.flipped=!0,(m||b)&&(i=p[d+1]),y&&(r=K(r)),e.placement=i+(r?'-'+r:''),e.offsets.popper=se({},e.offsets.popper,S(e.instance.popper,e.offsets.reference,e.placement)),e=C(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],i=e.offsets,n=i.popper,r=i.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return n[p?'left':'top']=r[o]-(s?n[p?'width':'height']:0),e.placement=x(t),e.offsets.popper=c(n),e}},hide:{order:800,enabled:!0,fn:function(e){if(!F(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=T(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.right":">",'"':""","'":"'","`":"`"},P=h.invert(L),W=function(r){var t=function(n){return r[n]},n="(?:"+h.keys(r).join("|")+")",e=RegExp(n),u=RegExp(n,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};h.escape=W(L),h.unescape=W(P),h.result=function(n,r,t){h.isArray(r)||(r=[r]);var e=r.length;if(!e)return h.isFunction(t)?t.call(n):t;for(var u=0;u/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var J=/(.)^/,U={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},V=/\\|'|\r|\n|\u2028|\u2029/g,$=function(n){return"\\"+U[n]};h.template=function(i,n,r){!n&&r&&(n=r),n=h.defaults({},n,h.templateSettings);var t,e=RegExp([(n.escape||J).source,(n.interpolate||J).source,(n.evaluate||J).source].join("|")+"|$","g"),o=0,a="__p+='";i.replace(e,function(n,r,t,e,u){return a+=i.slice(o,u).replace(V,$),o=u+n.length,r?a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":t?a+="'+\n((__t=("+t+"))==null?'':__t)+\n'":e&&(a+="';\n"+e+"\n__p+='"),n}),a+="';\n",n.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{t=new Function(n.variable||"obj","_",a)}catch(n){throw n.source=a,n}var u=function(n){return t.call(this,n,h)},c=n.variable||"obj";return u.source="function("+c+"){\n"+a+"}",u},h.chain=function(n){var r=h(n);return r._chain=!0,r};var G=function(n,r){return n._chain?h(r).chain():r};h.mixin=function(t){return h.each(h.functions(t),function(n){var r=h[n]=t[n];h.prototype[n]=function(){var n=[this._wrapped];return u.apply(n,arguments),G(this,r.apply(h,n))}}),h},h.mixin(h),h.each(["pop","push","reverse","shift","sort","splice","unshift"],function(r){var t=e[r];h.prototype[r]=function(){var n=this._wrapped;return t.apply(n,arguments),"shift"!==r&&"splice"!==r||0!==n.length||delete n[0],G(this,n)}}),h.each(["concat","join","slice"],function(n){var r=e[n];h.prototype[n]=function(){return G(this,r.apply(this._wrapped,arguments))}}),h.prototype.value=function(){return this._wrapped},h.prototype.valueOf=h.prototype.toJSON=h.prototype.value,h.prototype.toString=function(){return String(this._wrapped)},"function"==typeof define&&define.amd&&define("underscore",[],function(){return h})}(); \ No newline at end of file diff --git a/pkg/ui/v1beta1/frontend/public/scripts/viz.js b/pkg/ui/v1beta1/frontend/public/scripts/viz.js new file mode 100644 index 00000000000..dcea5d4d2e6 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/public/scripts/viz.js @@ -0,0 +1,213 @@ +/* +Viz.js 1.7.1 (Graphviz 2.40.1, Expat 2.1.0, Emscripten 1.37.9) +Copyright (c) 2014-2017 Michael Daines +Licensed under MIT license + +This distribution contains other software in object code form: + +Graphviz +Licensed under Eclipse Public License - v 1.0 +http://www.graphviz.org + +Expat +Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd and Clark Cooper +Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers. +Licensed under MIT license +http://www.libexpat.org + +zlib +Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler +http://www.zlib.net/zlib_license.html +*/ +(function(global) { +var Module = function(Module) { + Module = Module || {}; + var Module = Module; + +var Module;if(!Module)Module=(typeof Module!=="undefined"?Module:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module["ENVIRONMENT"]){if(Module["ENVIRONMENT"]==="WEB"){ENVIRONMENT_IS_WEB=true}else if(Module["ENVIRONMENT"]==="WORKER"){ENVIRONMENT_IS_WORKER=true}else if(Module["ENVIRONMENT"]==="NODE"){ENVIRONMENT_IS_NODE=true}else if(Module["ENVIRONMENT"]==="SHELL"){ENVIRONMENT_IS_SHELL=true}else{throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.")}}else{ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){if(!Module["print"])Module["print"]=console.log;if(!Module["printErr"])Module["printErr"]=console.warn;var nodeFS;var nodePath;Module["read"]=function read(filename,binary){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);var ret=nodeFS["readFileSync"](filename);return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module["load"]=function load(f){globalEval(read(f))};if(!Module["thisProgram"]){if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}else{Module["thisProgram"]="unknown-program"}}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(!Module["print"])Module["print"]=print;if(typeof printErr!="undefined")Module["printErr"]=printErr;if(typeof read!="undefined"){Module["read"]=read}else{Module["read"]=function read(){throw"no read() available"}}Module["readBinary"]=function readBinary(f){if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}var data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return xhr.response}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof console!=="undefined"){if(!Module["print"])Module["print"]=function print(x){console.log(x)};if(!Module["printErr"])Module["printErr"]=function printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module["print"])Module["print"]=TRY_USE_DUMP&&typeof dump!=="undefined"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module["load"]=importScripts}if(typeof Module["setWindowTitle"]==="undefined"){Module["setWindowTitle"]=(function(title){document.title=title})}}else{throw"Unknown runtime environment. Where are we?"}function globalEval(x){abort("NO_DYNAMIC_EXECUTION=1 was set, cannot eval")}if(!Module["load"]&&Module["read"]){Module["load"]=function load(f){globalEval(Module["read"](f))}}if(!Module["print"]){Module["print"]=(function(){})}if(!Module["printErr"]){Module["printErr"]=Module["print"]}if(!Module["arguments"]){Module["arguments"]=[]}if(!Module["thisProgram"]){Module["thisProgram"]="./this.program"}if(!Module["quit"]){Module["quit"]=(function(status,toThrow){throw toThrow})}Module.print=Module["print"];Module.printErr=Module["printErr"];Module["preRun"]=[];Module["postRun"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var Runtime={setTempRet0:(function(value){tempRet0=value;return value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return Runtime.QUANTUM_SIZE}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type==="double"||type==="i64"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type=="i64"||type=="double"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i>2];var end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];if(!func){abort("NO_DYNAMIC_EXECUTION=1 was set, cannot eval")}assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)");return func}var ccall;((function(){var JSfuncs={"stackSave":(function(){Runtime.stackSave()}),"stackRestore":(function(){Runtime.stackRestore()}),"arrayToC":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}function getValue(ptr,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];default:abort("invalid type for setValue: "+type)}return null}var ALLOC_NORMAL=0;var ALLOC_STATIC=2;var ALLOC_NONE=4;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc==="function"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr>2]=0}stop=ret+size;while(ptr>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module["UTF8ToString"](ptr)}Module["Pointer_stringify"]=Pointer_stringify;var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module["UTF8ToString"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function demangle(func){var __cxa_demangle_func=Module["___cxa_demangle"]||Module["__cxa_demangle"];if(__cxa_demangle_func){try{var s=func.substr(1);var len=lengthBytesUTF8(s)+1;var buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4);var ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,"i32")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}return func}Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling");return func}function demangleAll(text){var regex=/__Z[\w\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module["extraStackTrace"])js+="\n"+Module["extraStackTrace"]();return demangleAll(js)}var PAGE_SIZE=16384;var HEAP;var buffer;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which adjusts the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;if(TOTAL_MEMORY0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}if(!Math["imul"]||Math["imul"](4294967295,5)!==-5)Math["imul"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math["imul"];if(!Math["clz32"])Math["clz32"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math["clz32"];if(!Math["trunc"])Math["trunc"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math["trunc"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var ASM_CONSTS=[(function($0,$1){{var path=Pointer_stringify($0);var data=Pointer_stringify($1);FS.createPath("/",PATH.dirname(path));FS.writeFile(PATH.join("/",path),data)}})];function _emscripten_asm_const_iii(code,a0,a1){return ASM_CONSTS[code](a0,a1)}STATIC_BASE=8;STATICTOP=STATIC_BASE+197520;__ATINIT__.push();allocate([0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,32,193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,0,32,193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,2,16,0,0,0,0,0,0,0,0,0,0,0,0,16,64,200,47,0,0,8,0,0,0,1,0,0,0,0,0,0,0,2,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,150,64,0,0,0,0,0,128,150,64,4,144,195,0,0,0,0,0,0,0,0,0,0,0,16,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,64,0,0,0,0,0,0,88,64,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,64,0,0,0,0,0,0,88,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,0,32,3,2,0,0,0,0,0,0,0,0,0,0,16,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0,0,0,0,0,0,0,0,0,0,0,0,0,66,64,0,0,0,0,0,0,66,64,0,0,0,0,0,32,131,64,0,0,0,0,0,192,136,64,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66,64,0,0,0,0,0,0,66,64,0,0,0,0,0,32,131,64,0,0,0,0,0,192,136,64,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,0,176,193,0,0,0,0,0,0,0,0,0,0,0,16,64,104,54,0,0,147,0,0,0,1,0,0,0,0,0,0,0,64,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,0,16,0,2,0,0,0,0,0,0,0,0,0,0,16,64,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,64,0,0,0,0,0,0,88,64,0,176,193,0,0,0,0,0,0,0,0,0,0,0,0,0,68,58,0,0,16,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,64,0,0,0,0,0,0,88,64,64,32,62,3,0,0,0,0,0,0,0,0,0,0,16,64,76,59,0,0,122,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,255,255,255,255,255,255,239,127,255,255,255,255,255,255,239,127,255,255,255,255,255,255,239,255,255,255,255,255,255,255,239,255,0,0,0,0,0,0,248,63,51,51,51,51,51,51,211,63,60,0,0,0,0,0,0,0,154,153,153,153,153,153,169,63,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,2,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,224,63,3,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,4,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,51,51,51,51,51,51,243,63,5,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,154,153,153,153,153,153,233,63,6,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,7,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,224,63,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,255,255,255,255,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,51,51,51,51,51,211,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,128,70,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,154,153,153,153,153,153,217,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,51,51,51,51,51,227,63,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,20,174,71,225,122,228,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,1,0,0,0,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,40,86,0,0,1,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,128,102,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,128,102,64,154,153,153,153,153,153,217,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,128,102,64,123,20,174,71,225,122,228,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,128,70,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,0,1,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,88,168,53,205,59,78,213,63,37,117,2,154,8,27,218,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,44,212,154,230,29,167,234,63,106,222,113,138,142,228,232,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,224,63,93,220,70,3,120,11,226,63,0,0,0,0,0,0,208,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,208,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,93,220,70,3,120,11,226,63,93,220,70,3,120,11,226,63,93,220,70,3,120,11,226,63,13,113,172,139,219,104,220,63,100,93,220,70,3,120,237,63,210,111,95,7,206,25,231,63,16,122,54,171,62,87,229,63,16,122,54,171,62,87,229,63,210,111,95,7,206,25,231,63,120,11,36,40,126,140,227,63,181,21,251,203,238,201,225,63,210,111,95,7,206,25,231,63,210,111,95,7,206,25,231,63,88,168,53,205,59,78,213,63,136,133,90,211,188,227,216,63,210,111,95,7,206,25,231,63,120,11,36,40,126,140,227,63,196,66,173,105,222,113,236,63,210,111,95,7,206,25,231,63,210,111,95,7,206,25,231,63,181,21,251,203,238,201,225,63,210,111,95,7,206,25,231,63,16,122,54,171,62,87,229,63,181,21,251,203,238,201,225,63,120,11,36,40,126,140,227,63,210,111,95,7,206,25,231,63,210,111,95,7,206,25,231,63,134,56,214,197,109,52,238,63,210,111,95,7,206,25,231,63,210,111,95,7,206,25,231,63,120,11,36,40,126,140,227,63,88,168,53,205,59,78,213,63,211,188,227,20,29,201,209,63,88,168,53,205,59,78,213,63,166,10,70,37,117,2,222,63,0,0,0,0,0,0,224,63,88,168,53,205,59,78,213,63,13,113,172,139,219,104,220,63,0,0,0,0,0,0,224,63,13,113,172,139,219,104,220,63,0,0,0,0,0,0,224,63,13,113,172,139,219,104,220,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,224,63,211,188,227,20,29,201,209,63,106,222,113,138,142,228,232,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,88,168,53,205,59,78,213,63,136,133,90,211,188,227,216,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,210,111,95,7,206,25,231,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,13,113,172,139,219,104,220,63,244,108,86,125,174,182,222,63,17,54,60,189,82,150,201,63,244,108,86,125,174,182,222,63,59,1,77,132,13,79,225,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,62,232,217,172,250,92,197,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,130,115,70,148,246,6,199,63,13,113,172,139,219,104,220,63,0,0,0,0,0,0,224,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,7,240,22,72,80,252,220,63,162,180,55,248,194,100,214,63,88,168,53,205,59,78,213,63,13,113,172,139,219,104,220,63,13,113,172,139,219,104,220,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,208,63,13,113,172,139,219,104,220,63,0,0,0,0,0,0,208,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,208,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,208,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,196,66,173,105,222,113,236,63,0,0,0,0,0,0,208,63,127,217,61,121,88,168,209,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,120,11,36,40,126,140,227,63,210,111,95,7,206,25,231,63,196,66,173,105,222,113,236,63,19,242,65,207,102,213,211,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,16,122,54,171,62,87,229,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,224,63,210,111,95,7,206,25,231,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,244,108,86,125,174,182,214,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,196,66,173,105,222,113,236,63,16,122,54,171,62,87,229,63,245,219,215,129,115,70,204,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,136,133,90,211,188,227,216,63,1,77,132,13,79,175,226,63,211,188,227,20,29,201,209,63,88,168,53,205,59,78,213,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,1,77,132,13,79,175,226,63,1,77,132,13,79,175,226,63,1,77,132,13,79,175,226,63,181,21,251,203,238,201,225,63,204,93,75,200,7,61,240,63,16,122,54,171,62,87,229,63,16,122,54,171,62,87,229,63,210,111,95,7,206,25,231,63,210,111,95,7,206,25,231,63,16,122,54,171,62,87,229,63,120,11,36,40,126,140,227,63,106,222,113,138,142,228,232,63,210,111,95,7,206,25,231,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,224,63,16,122,54,171,62,87,229,63,181,21,251,203,238,201,225,63,44,212,154,230,29,167,234,63,210,111,95,7,206,25,231,63,106,222,113,138,142,228,232,63,16,122,54,171,62,87,229,63,106,222,113,138,142,228,232,63,210,111,95,7,206,25,231,63,16,122,54,171,62,87,229,63,120,11,36,40,126,140,227,63,210,111,95,7,206,25,231,63,16,122,54,171,62,87,229,63,134,56,214,197,109,52,238,63,16,122,54,171,62,87,229,63,16,122,54,171,62,87,229,63,120,11,36,40,126,140,227,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,166,10,70,37,117,2,222,63,181,21,251,203,238,201,225,63,72,191,125,29,56,103,204,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,0,0,0,0,0,0,224,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,211,188,227,20,29,201,209,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,72,191,125,29,56,103,204,63,72,191,125,29,56,103,204,63,0,0,0,0,0,0,224,63,72,191,125,29,56,103,204,63,44,212,154,230,29,167,234,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,224,63,211,188,227,20,29,201,209,63,181,21,251,203,238,201,225,63,0,0,0,0,0,0,224,63,210,111,95,7,206,25,231,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,2,154,8,27,158,94,213,63,224,190,14,156,51,162,208,63,2,154,8,27,158,94,213,63,1,77,132,13,79,175,226,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,88,168,53,205,59,78,213,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,62,232,217,172,250,92,197,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,29,56,103,68,105,111,200,63,88,168,53,205,59,78,213,63,181,21,251,203,238,201,225,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,211,188,227,20,29,201,209,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,231,29,167,232,72,46,225,63,162,180,55,248,194,100,214,63,72,191,125,29,56,103,204,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,181,21,251,203,238,201,225,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,211,188,227,20,29,201,209,63,120,11,36,40,126,140,227,63,211,188,227,20,29,201,209,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,211,188,227,20,29,201,209,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,211,188,227,20,29,201,209,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,240,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,240,63,211,188,227,20,29,201,209,63,234,149,178,12,113,172,215,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);allocate([181,21,251,203,238,201,225,63,106,222,113,138,142,228,232,63,0,0,0,0,0,0,240,63,152,221,147,135,133,90,215,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,196,66,173,105,222,113,236,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,72,191,125,29,56,103,204,63,120,11,36,40,126,140,227,63,134,56,214,197,109,52,238,63,120,11,36,40,126,140,227,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,81,160,79,228,73,210,14,64,180,200,118,190,159,58,53,192,58,34,223,165,212,37,213,191,243,130,62,71,154,46,138,63,159,229,121,112,119,214,249,191,126,253,16,27,44,156,230,63,150,236,216,8,196,235,204,63,205,206,162,119,42,224,208,63,176,227,191,64,16,32,237,191,173,161,212,94,68,219,216,63,59,161,124,230,81,150,118,63,211,110,112,249,122,132,123,63,129,204,206,162,119,42,228,191,209,173,215,244,160,160,200,63,106,223,55,25,176,63,132,63,190,202,144,25,94,255,132,63,28,150,6,126,84,195,196,191,165,73,41,232,246,226,35,64,169,217,3,173,192,144,193,63,8,196,144,65,147,105,137,63,250,68,158,36,93,51,208,191,1,240,153,54,45,194,94,63,13,156,125,47,207,148,151,63,137,181,248,20,0,227,137,63,229,169,88,70,52,203,177,191,143,0,201,207,161,103,166,191,92,181,198,251,204,180,136,63,77,164,143,84,58,179,144,63,230,199,4,161,97,214,160,191,199,105,103,28,19,247,130,191,42,127,107,229,45,112,92,191,228,87,98,84,8,154,117,63,209,241,135,85,114,4,183,63,149,212,9,104,34,60,51,192,100,35,16,175,235,119,16,192,167,33,170,240,103,120,199,63,218,255,0,107,213,174,193,63,78,40,68,192,33,84,247,191,170,72,133,177,133,32,245,63,157,104,87,33,229,39,246,63,77,46,198,192,58,142,205,63,89,107,40,181,23,209,220,191,3,63,170,97,191,39,204,63,166,71,83,61,153,127,218,63,182,129,59,80,167,60,174,63,81,76,222,0,51,223,185,191,245,118,149,255,218,11,166,63,212,165,53,188,15,246,148,63,31,173,32,188,44,220,144,63,40,44,241,128,178,201,35,64,35,90,225,76,2,138,183,63,72,163,101,81,150,41,127,63,187,180,134,247,193,158,147,63,23,168,123,83,71,125,160,191,33,43,174,224,109,148,139,63,51,115,220,132,214,30,181,191,160,120,132,137,245,252,143,63,105,53,36,238,177,244,145,191,184,205,51,122,94,191,106,63,146,62,173,162,63,52,205,191,126,176,231,198,79,62,152,191,7,35,155,80,45,199,164,63,62,24,194,123,88,185,145,191,45,124,125,173,75,141,198,63,0,0,0,64,251,33,249,63,0,0,0,0,45,68,116,62,0,0,0,128,152,70,248,60,0,0,0,96,81,204,120,59,0,0,0,128,131,27,240,57,0,0,0,64,32,37,122,56,0,0,0,128,34,130,227,54,0,0,0,0,29,243,105,53,204,5,1,0,16,43,0,0,3,0,0,0,56,45,0,0,3,0,0,0,16,48,0,0,3,0,0,0,216,48,0,0,3,0,0,0,40,50,0,0,3,0,0,0,160,53,0,0,3,0,0,0,220,56,0,0,3,0,0,0,236,46,0,0,3,0,0,0,164,57,0,0,3,0,0,0,172,58,0,0,3,0,0,0,56,63,0,0,3,0,0,0,92,61,0,0,0,0,0,0,252,44,0,0,0,0,0,0,232,47,0,0,0,0,0,0,56,48,0,0,0,0,0,0,0,50,0,0,0,0,0,0,80,50,0,0,0,0,0,0,180,56,0,0,0,0,0,0,136,46,0,0,0,0,0,0,124,57,0,0,0,0,0,0,132,58,0,0,0,0,0,0,16,63,0,0,0,0,0,0,52,61,0,0,4,0,0,0,96,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,176,217,2,0,192,217,2,0,208,217,2,0,224,217,2,0,240,217,2,0,0,218,2,0,16,218,2,0,32,218,2,0,192,217,2,0,192,217,2,0,0,218,2,0,0,218,2,0,31,0,0,0,63,0,0,0,127,0,0,0,0,0,0,0,207,134,1,0,1,0,0,0,208,43,0,0,104,0,0,0,4,0,0,0,229,9,1,0,1,0,0,0,72,44,0,0,136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,6,1,0,1,0,0,0,0,0,0,0,224,0,0,0,0,0,0,0,136,6,1,0,1,0,0,0,0,0,0,0,224,0,0,0,1,0,0,0,143,6,1,0,1,0,0,0,0,0,0,0,168,0,0,0,2,0,0,0,153,6,1,0,1,0,0,0,0,0,0,0,224,0,0,0,3,0,0,0,163,6,1,0,1,0,0,0,0,0,0,0,224,0,0,0,4,0,0,0,177,6,1,0,1,0,0,0,0,0,0,0,224,0,0,0,5,0,0,0,187,6,1,0,1,0,0,0,0,0,0,0,224,0,0,0,6,0,0,0,200,6,1,0,1,0,0,0,0,0,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,234,9,1,0,1,0,0,0,236,45,0,0,24,1,0,0,1,0,0,0,239,9,1,0,1,0,0,0,236,45,0,0,24,1,0,0,2,0,0,0,245,9,1,0,1,0,0,0,236,45,0,0,24,1,0,0,3,0,0,0,254,9,1,0,1,0,0,0,236,45,0,0,24,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,10,1,0,1,0,0,0,0,0,0,0,112,1,0,0,1,0,0,0,18,10,1,0,1,0,0,0,0,0,0,0,112,1,0,0,2,0,0,0,29,10,1,0,1,0,0,0,0,0,0,0,56,1,0,0,3,0,0,0,43,10,1,0,1,0,0,0,0,0,0,0,56,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,12,0,0,0,13,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,1,0,0,0,6,0,0,0,2,0,0,0,2,0,0,0,7,0,0,0,2,0,0,0,0,0,0,0,143,25,2,0,148,2,2,0,37,4,2,0,101,10,2,0,92,17,2,0,155,21,2,0,27,25,2,0,44,25,2,0,0,0,0,0,114,10,1,0,1,0,0,0,80,47,0,0,168,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,118,10,1,0,1,0,0,0,0,0,0,0,200,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,126,10,1,0,1,0,0,0,96,48,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,182,11,1,0,1,0,0,0,0,0,0,0,32,2,0,0,2,0,0,0,192,11,1,0,1,0,0,0,0,0,0,0,88,2,0,0,0,0,0,0,201,11,1,0,1,0,0,0,0,0,0,0,88,2,0,0,3,0,0,0,210,11,1,0,1,0,0,0,0,0,0,0,88,2,0,0,0,0,0,0,220,11,1,0,1,0,0,0,0,0,0,0,32,2,0,0,3,0,0,0,232,11,1,0,1,0,0,0,0,0,0,0,32,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,21,0,0,0,22,0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,3,0,0,0,9,0,0,0,3,0,0,0,3,0,0,0,10,0,0,0,4,0,0,0,0,0,0,0,143,25,2,0,148,2,2,0,101,10,2,0,37,4,2,0,155,21,2,0,92,17,2,0,44,25,2,0,27,25,2,0,0,0,0,0,0,0,0,0,165,13,1,0,255,255,255,255,100,49,0,0,144,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,13,1,0,255,255,255,255,0,0,0,0,176,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,142,1,0,1,0,0,0,120,50,0,0,232,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,25,0,0,0,26,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,32,0,0,0,33,0,0,0,34,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,12,0,0,0,5,0,0,0,4,0,0,0,13,0,0,0,5,0,0,0,3,0,0,0,165,17,1,0,179,17,1,0,201,17,1,0,13,251,2,0,215,17,1,0,230,17,1,0,235,17,1,0,9,18,1,0,13,251,2,0,27,18,1,0,75,18,1,0,13,251,2,0,105,18,1,0,145,18,1,0,159,18,1,0,206,18,1,0,2,19,1,0,19,19,1,0,56,19,1,0,91,19,1,0,97,19,1,0,125,19,1,0,154,19,1,0,181,19,1,0,214,19,1,0,240,19,1,0,18,20,1,0,49,20,1,0,87,20,1,0,111,20,1,0,143,20,1,0,172,20,1,0,208,20,1,0,220,20,1,0,13,251,2,0,231,20,1,0,13,21,1,0,49,21,1,0,87,21,1,0,13,251,2,0,141,21,1,0,165,21,1,0,178,21,1,0,225,21,1,0,220,20,1,0,13,251,2,0,238,21,1,0,247,21,1,0,24,22,1,0,83,22,1,0,158,22,1,0,242,22,1,0,20,23,1,0,41,23,1,0,64,23,1,0,86,23,1,0,110,23,1,0,13,251,2,0,132,23,1,0,159,23,1,0,195,23,1,0,231,23,1,0,12,24,1,0,13,251,2,0,45,24,1,0,71,24,1,0,89,24,1,0,102,24,1,0,115,24,1,0,135,24,1,0,150,24,1,0,158,24,1,0,179,24,1,0,193,24,1,0,255,24,1,0,10,25,1,0,220,20,1,0,13,251,2,0,16,25,1,0,28,25,1,0,43,25,1,0,91,19,1,0,13,251,2,0,62,25,1,0,103,25,1,0,133,25,1,0,149,25,1,0,166,25,1,0,173,25,1,0,188,25,1,0,204,25,1,0,16,26,1,0,23,26,1,0,91,19,1,0,13,251,2,0,33,26,1,0,77,26,1,0,88,26,1,0,97,26,1,0,106,26,1,0,123,26,1,0,140,26,1,0,160,26,1,0,220,20,1,0,13,251,2,0,172,26,1,0,188,26,1,0,202,26,1,0,216,26,1,0,229,26,1,0,242,26,1,0,8,27,1,0,17,27,1,0,32,27,1,0,45,27,1,0,62,27,1,0,220,20,1,0,13,251,2,0,73,27,1,0,104,27,1,0,13,251,2,0,122,27,1,0,137,27,1,0,185,27,1,0,195,27,1,0,208,27,1,0,221,27,1,0,234,27,1,0,247,27,1,0,250,27,1,0,13,251,2,0,254,27,1,0,13,251,2,0,33,28,1,0,82,28,1,0,129,28,1,0,152,28,1,0,179,28,1,0,206,28,1,0,220,20,1,0,13,251,2,0,234,28,1,0,13,251,2,0,18,29,1,0,30,29,1,0,49,29,1,0,68,29,1,0,89,29,1,0,110,29,1,0,114,29,1,0,91,19,1,0,13,251,2,0,126,29,1,0,13,251,2,0,142,29,1,0,156,29,1,0,168,29,1,0,181,29,1,0,213,29,1,0,235,29,1,0,13,251,2,0,255,29,1,0,72,30,1,0,142,30,1,0,190,30,1,0,241,30,1,0,248,30,1,0,31,31,1,0,70,31,1,0,13,251,2,0,75,31,1,0,0,0,0,0,0,0,0,0,0,73,1,0,1,0,0,0,0,0,0,0,8,3,0,0,1,0,0,0,191,31,1,0,1,0,0,0,0,0,0,0,8,3,0,0,2,0,0,0,249,72,1,0,1,0,0,0,0,0,0,0,64,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,0,0,0,0,0,0,0,36,0,0,0,37,0,0,0,6,0,0,0,38,0,0,0,39,0,0,0,40,0,0,0,41,0,0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,43,0,0,0,44,0,0,0,45,0,0,0,46,0,0,0,4,0,0,0,47,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,15,0,0,0,7,0,0,0,5,0,0,0,16,0,0,0,6,0,0,0,0,0,0,0,172,1,2,0,182,1,2,0,137,50,1,0,251,1,2,0,54,2,2,0,88,2,2,0,94,2,2,0,143,25,2,0,133,2,2,0,148,2,2,0,177,2,2,0,188,2,2,0,222,2,2,0,20,3,2,0,74,3,2,0,133,3,2,0,187,3,2,0,221,3,2,0,236,3,2,0,29,4,2,0,37,4,2,0,79,38,1,0,88,38,1,0,66,4,2,0,97,38,1,0,140,4,2,0,106,38,1,0,150,4,2,0,115,38,1,0,160,4,2,0,239,4,2,0,42,5,2,0,127,38,1,0,101,5,2,0,112,5,2,0,181,5,2,0,195,5,2,0,13,6,2,0,27,6,2,0,41,6,2,0,52,6,2,0,101,6,2,0,165,6,2,0,173,6,2,0,181,6,2,0,240,6,2,0,38,7,2,0,50,7,2,0,142,50,1,0,62,7,2,0,72,7,2,0,83,7,2,0,112,7,2,0,166,7,2,0,101,10,2,0,135,10,2,0,147,10,2,0,82,13,2,0,131,13,2,0,175,13,2,0,229,13,2,0,242,13,2,0,20,14,2,0,54,14,2,0,63,14,2,0,137,14,2,0,147,14,2,0,216,14,2,0,14,15,2,0,25,15,2,0,158,15,2,0,179,15,2,0,135,38,1,0,189,15,2,0,199,15,2,0,253,15,2,0,61,16,2,0,75,16,2,0,159,16,2,0,174,16,2,0,189,16,2,0,12,17,2,0,150,50,1,0,76,17,2,0,86,17,2,0,92,17,2,0,136,17,2,0,175,17,2,0,192,17,2,0,203,17,2,0,16,18,2,0,85,18,2,0,100,18,2,0,116,18,2,0,134,18,2,0,150,18,2,0,166,18,2,0,179,18,2,0,189,18,2,0,243,18,2,0,252,18,2,0,60,19,2,0,79,19,2,0,155,50,1,0,87,19,2,0,141,19,2,0,180,19,2,0,234,19,2,0,17,20,2,0,31,20,2,0,85,20,2,0,159,20,2,0,233,20,2,0,244,20,2,0,42,21,2,0,47,21,2,0,76,21,2,0,105,21,2,0,116,21,2,0,155,21,2,0,179,21,2,0,233,21,2,0,31,22,2,0,43,22,2,0,82,22,2,0,93,22,2,0,142,22,2,0,191,22,2,0,136,61,1,0,230,22,2,0,18,23,2,0,72,23,2,0,126,23,2,0,136,23,2,0,165,23,2,0,229,23,2,0,27,24,2,0,161,50,1,0,51,24,2,0,95,24,2,0,134,24,2,0,188,24,2,0,249,24,2,0,27,25,2,0,33,25,2,0,44,25,2,0,83,25,2,0,0,0,0,0,216,142,1,0,1,0,0,0,240,53,0,0,120,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,215,73,1,0,1,0,0,0,0,0,0,0,152,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,0,0,0,0,0,0,0,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,0,0,0,0,0,0,0,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,18,0,0,0,8,0,0,0,6,0,0,0,19,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,189,39,1,0,1,0,0,0,4,57,0,0,208,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,39,1,0,1,0,0,0,0,0,0,0,240,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,0,0,0,0,0,0,0,53,0,0,0,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,55,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,21,0,0,0,9,0,0,0,7,0,0,0,22,0,0,0,8,0,0,0,0,0,0,0,137,50,1,0,143,25,2,0,148,2,2,0,142,50,1,0,166,7,2,0,101,10,2,0,150,50,1,0,136,17,2,0,60,19,2,0,155,50,1,0,116,21,2,0,155,21,2,0,136,61,1,0,161,50,1,0,27,25,2,0,44,25,2,0,0,0,0,0,166,50,1,0,1,0,0,0,204,57,0,0,40,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,170,50,1,0,1,0,0,0,0,0,0,0,72,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,0,0,0,0,0,0,0,57,0,0,0,58,0,0,0,10,0,0,0,59,0,0,0,60,0,0,0,61,0,0,0,62,0,0,0,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,65,0,0,0,66,0,0,0,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,24,0,0,0,11,0,0,0,8,0,0,0,25,0,0,0,9,0,0,0,0,0,0,0,251,1,2,0,30,60,1,0,143,25,2,0,148,2,2,0,177,2,2,0,41,60,1,0,47,60,1,0,58,60,1,0,65,60,1,0,188,2,2,0,20,3,2,0,73,60,1,0,79,60,1,0,90,60,1,0,187,3,2,0,221,3,2,0,37,4,2,0,97,60,1,0,140,4,2,0,160,4,2,0,42,5,2,0,107,60,1,0,181,5,2,0,195,5,2,0,13,6,2,0,118,60,1,0,27,6,2,0,126,60,1,0,135,60,1,0,149,60,1,0,159,60,1,0,240,6,2,0,168,60,1,0,50,7,2,0,83,7,2,0,112,7,2,0,174,60,1,0,183,7,2,0,226,7,2,0,11,8,2,0,46,8,2,0,87,8,2,0,122,8,2,0,163,8,2,0,198,8,2,0,239,8,2,0,18,9,2,0,59,9,2,0,94,9,2,0,135,9,2,0,170,9,2,0,211,9,2,0,246,9,2,0,31,10,2,0,66,10,2,0,101,10,2,0,181,60,1,0,135,10,2,0,193,60,1,0,175,13,2,0,20,14,2,0,216,14,2,0,206,60,1,0,189,16,2,0,219,60,1,0,76,17,2,0,92,17,2,0,229,60,1,0,136,17,2,0,175,17,2,0,192,17,2,0,244,60,1,0,6,61,1,0,203,17,2,0,85,18,2,0,100,18,2,0,116,18,2,0,134,18,2,0,150,18,2,0,22,61,1,0,33,61,1,0,44,61,1,0,166,18,2,0,60,19,2,0,65,19,2,0,49,61,1,0,58,61,1,0,67,61,1,0,83,61,1,0,90,61,1,0,141,19,2,0,180,19,2,0,234,19,2,0,31,20,2,0,47,21,2,0,76,21,2,0,98,61,1,0,155,21,2,0,105,61,1,0,43,22,2,0,114,61,1,0,93,22,2,0,122,61,1,0,191,22,2,0,136,61,1,0,230,22,2,0,18,23,2,0,143,61,1,0,165,23,2,0,229,23,2,0,153,61,1,0,27,24,2,0,51,24,2,0,134,24,2,0,163,61,1,0,177,61,1,0,188,24,2,0,195,24,2,0,249,24,2,0,27,25,2,0,44,25,2,0,83,25,2,0,0,0,0,0,195,61,1,0,1,0,0,0,212,58,0,0,128,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199,61,1,0,1,0,0,0,0,0,0,0,160,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,0,0,0,69,0,0,0,0,0,0,0,0,0,0,0,70,0,0,0,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,0,0,0,0,0,0,0,27,0,0,0,12,0,0,0,9,0,0,0,28,0,0,0,10,0,0,0,0,0,0,0,65,66,0,0,221,162,1,0,65,73,0,0,183,162,1,0,65,82,0,0,138,162,1,0,65,88,0,0,242,162,1,0,66,32,0,0,46,165,1,0,66,73,0,0,63,165,1,0,67,66,0,0,119,163,1,0,67,79,0,0,101,163,1,0,67,88,0,0,132,163,1,0,72,32,0,0,168,163,1,0,72,66,0,0,178,163,1,0,72,73,0,0,62,164,1,0,72,88,0,0,193,163,1,0,72,98,0,0,242,163,1,0,72,105,0,0,37,164,1,0,72,114,0,0,215,163,1,0,72,120,0,0,8,164,1,0,73,32,0,0,80,165,1,0,75,66,0,0,9,163,1,0,75,73,0,0,81,163,1,0,75,82,0,0,61,163,1,0,75,88,0,0,42,163,1,0,78,66,0,0,80,164,1,0,78,73,0,0,151,164,1,0,78,82,0,0,175,164,1,0,78,88,0,0,123,164,1,0,80,65,0,0,16,165,1,0,80,66,0,0,204,164,1,0,80,73,0,0,0,165,1,0,80,88,0,0,236,164,1,0,82,32,0,0,7,167,1,0,83,32,0,0,31,165,1,0,90,68,0,0,141,165,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,109,72,1,0,255,255,255,255,132,61,0,0,216,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,113,72,1,0,255,255,255,255,0,0,0,0,248,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,121,72,1,0,1,0,0,0,72,67,0,0,0,0,0,0,16,0,0,0,129,72,1,0,1,0,0,0,72,67,0,0,0,0,0,0,17,0,0,0,137,72,1,0,1,0,0,0,72,67,0,0,0,0,0,0,17,0,0,0,146,72,1,0,1,0,0,0,72,67,0,0,0,0,0,0,17,0,0,0,154,72,1,0,1,0,0,0,72,67,0,0,0,0,0,0,19,0,0,0,162,72,1,0,1,0,0,0,76,67,0,0,0,0,0,0,20,0,0,0,170,72,1,0,1,0,0,0,76,67,0,0,0,0,0,0,21,0,0,0,178,72,1,0,1,0,0,0,76,67,0,0,0,0,0,0,21,0,0,0,187,72,1,0,1,0,0,0,76,67,0,0,0,0,0,0,21,0,0,0,195,72,1,0,1,0,0,0,76,67,0,0,0,0,0,0,22,0,0,0,203,72,1,0,1,0,0,0,80,67,0,0,0,0,0,0,23,0,0,0,212,72,1,0,1,0,0,0,80,67,0,0,0,0,0,0,24,0,0,0,221,72,1,0,1,0,0,0,80,67,0,0,0,0,0,0,24,0,0,0,231,72,1,0,1,0,0,0,80,67,0,0,0,0,0,0,24,0,0,0,240,72,1,0,1,0,0,0,80,67,0,0,0,0,0,0,25,0,0,0,249,72,1,0,1,0,0,0,84,67,0,0,0,0,0,0,25,0,0,0,0,73,1,0,1,0,0,0,84,67,0,0,0,0,0,0,26,0,0,0,6,73,1,0,1,0,0,0,88,67,0,0,0,0,0,0,10,0,0,0,15,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,11,0,0,0,23,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,12,0,0,0,31,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,12,0,0,0,40,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,12,0,0,0,48,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,14,0,0,0,56,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,14,0,0,0,63,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,13,0,0,0,71,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,5,0,0,0,79,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,6,0,0,0,87,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,7,0,0,0,95,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,7,0,0,0,104,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,7,0,0,0,112,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,9,0,0,0,120,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,9,0,0,0,127,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,8,0,0,0,135,73,1,0,1,0,0,0,92,67,0,0,0,0,0,0,0,0,0,0,143,73,1,0,1,0,0,0,96,67,0,0,0,0,0,0,1,0,0,0,152,73,1,0,1,0,0,0,96,67,0,0,0,0,0,0,2,0,0,0,161,73,1,0,1,0,0,0,96,67,0,0,0,0,0,0,2,0,0,0,171,73,1,0,1,0,0,0,96,67,0,0,0,0,0,0,2,0,0,0,180,73,1,0,1,0,0,0,96,67,0,0,0,0,0,0,4,0,0,0,189,73,1,0,1,0,0,0,96,67,0,0,0,0,0,0,4,0,0,0,197,73,1,0,1,0,0,0,96,67,0,0,0,0,0,0,3,0,0,0,206,73,1,0,1,0,0,0,96,67,0,0,0,0,0,0,18,0,0,0,215,73,1,0,1,0,0,0,72,67,0,0,0,0,0,0,27,0,0,0,223,73,1,0,1,0,0,0,100,67,0,0,0,0,0,0,28,0,0,0,231,73,1,0,1,0,0,0,100,67,0,0,0,0,0,0,29,0,0,0,239,73,1,0,1,0,0,0,100,67,0,0,0,0,0,0,29,0,0,0,248,73,1,0,1,0,0,0,100,67,0,0,0,0,0,0,29,0,0,0,0,74,1,0,1,0,0,0,100,67,0,0,0,0,0,0,30,0,0,0,8,74,1,0,1,0,0,0,104,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,16,0,0,0,17,0,0,0,18,0,0,0,19,0,0,0,20,0,0,0,21,0,0,0,115,77,1,0,116,67,0,0,1,0,0,0,144,67,0,0,0,0,0,0,0,0,0,0,72,0,0,0,73,0,0,0,1,0,0,0,0,0,0,0,207,134,1,0,0,0,0,0,132,67,0,0,140,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,4,0,0,0,24,1,0,0,48,1,0,0,176,0,0,0,152,85,1,0,157,85,1,0,161,85,1,0,168,85,1,0,172,85,1,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,0,0,0,0,29,0,0,0,0,0,0,0,0,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,0,0,0,0,161,90,1,0,80,68,0,0,1,0,0,0,168,68,0,0,0,0,0,0,0,0,0,0,74,0,0,0,75,0,0,0,76,0,0,0,77,0,0,0,78,0,0,0,79,0,0,0,80,0,0,0,81,0,0,0,82,0,0,0,83,0,0,0,84,0,0,0,75,0,0,0,85,0,0,0,75,0,0,0,86,0,0,0,87,0,0,0,88,0,0,0,89,0,0,0,0,0,0,0,174,90,1,0,0,0,0,0,96,68,0,0,208,219,2,0,1,0,0,0,180,90,1,0,0,0,0,0,104,68,0,0,208,219,2,0,2,0,0,0,184,90,1,0,0,0,0,0,112,68,0,0,208,219,2,0,3,0,0,0,189,90,1,0,0,0,0,0,120,68,0,0,208,219,2,0,4,0,0,0,195,90,1,0,0,0,0,0,128,68,0,0,208,219,2,0,5,0,0,0,201,90,1,0,0,0,0,0,152,68,0,0,208,219,2,0,6,0,0,0,211,90,1,0,0,0,0,0,160,68,0,0,208,219,2,0,7,0,0,0,217,90,1,0,0,0,0,0,136,68,0,0,208,219,2,0,7,0,0,0,221,90,1,0,0,0,0,0,136,68,0,0,208,219,2,0,7,0,0,0,226,90,1,0,0,0,0,0,144,68,0,0,208,219,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,48,0,0,0,0,0,0,0,1,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0,0,0,0,0,0,105,104,1,0,129,104,1,0,160,104,1,0,189,104,1,0,220,104,1,0,227,104,1,0,236,104,1,0,105,104,1,0,110,104,1,0,117,104,1,0,122,104,1,0,11,104,1,0,29,104,1,0,43,104,1,0,57,104,1,0,71,104,1,0,78,104,1,0,93,104,1,0,105,104,1,0,0,0,0,0,13,251,2,0,0,0,0,0,74,19,2,0,1,0,0,0,37,107,1,0,7,0,0,0,233,106,1,0,3,0,0,0,245,38,2,0,5,0,0,0,45,107,1,0,15,0,0,0,189,142,1,0,8,0,0,0,189,142,1,0,16,0,0,0,53,107,1,0,4,0,0,0,53,107,1,0,17,0,0,0,58,107,1,0,5,0,0,0,58,107,1,0,2,0,0,0,64,107,1,0,6,0,0,0,71,107,1,0,4,0,0,0,83,107,1,0,7,0,0,0,91,107,1,0,7,0,0,0,107,107,1,0,5,0,0,0,113,107,1,0,8,0,0,0,136,107,1,0,8,0,0,0,113,107,1,0,9,0,0,0,145,107,1,0,7,0,0,0,153,107,1,0,10,0,0,0,179,107,1,0,7,0,0,0,187,107,1,0,11,0,0,0,213,107,1,0,6,0,0,0,220,107,1,0,12,0,0,0,250,107,1,0,9,0,0,0,220,107,1,0,13,0,0,0,4,108,1,0,8,0,0,0,13,108,1,0,14,0,0,0,46,108,1,0,8,0,0,0,55,108,1,0,18,0,0,0,88,108,1,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,12,0,0,0,2,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,4,0,0,0,0,0,0,0,3,0,0,0,33,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,4,0,0,0,0,0,0,0,4,0,0,0,34,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,64,0,0,0,176,71,0,0,192,71,0,0,6,0,0,0,4,0,0,0,204,71,0,0,6,0,0,0,8,0,0,0,6,0,0,0,4,0,0,0,212,71,0,0,0,4,0,0,8,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,193,121,1,0,53,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,9,0,0,0,11,0,0,0,8,0,0,0,10,0,0,0,92,73,0,0,224,72,0,0,68,73,0,0,1,0,0,0,1,0,0,0,10,0,0,0,22,0,0,0,11,0,0,0,90,0,0,0,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,7,0,0,0,2,0,0,0,5,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,3,0,0,0,14,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,0,16,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,8,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,39,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,4,0,0,0,5,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,6,0,0,0,1,0,0,0,1,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,1,0,0,0,1,0,0,0,11,0,0,0,1,0,0,0,12,0,0,0,1,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,16,0,0,0,17,0,0,0,18,0,0,0,19,0,0,0,20,0,0,0,21,0,0,0,22,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,23,0,0,0,24,0,0,0,25,0,0,0,19,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,1,0,0,0,30,0,0,0,1,0,0,0,1,0,0,0,19,0,0,0,1,0,0,0,31,0,0,0,32,0,0,0,33,0,0,0,34,0,0,0,35,0,0,0,19,0,0,0,36,0,0,0,37,0,0,0,38,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,39,0,0,0,40,0,0,0,41,0,0,0,19,0,0,0,42,0,0,0,43,0,0,0,44,0,0,0,45,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,46,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,47,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,48,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,5,0,0,0,1,0,0,0,6,0,0,0,7,0,0,0,7,0,0,0,1,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,3,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,128,0,0,0,166,180,1,0,135,180,1,0,77,125,1,0,179,180,1,0,171,180,1,0,185,180,1,0,0,0,0,0,83,129,1,0,92,129,1,0,99,129,1,0,113,129,1,0,167,179,1,0,207,180,1,0,120,129,1,0,127,129,1,0,1,0,0,0,8,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,131,1,0,8,0,0,0,3,0,0,0,38,131,1,0,42,131,1,0,11,0,0,0,6,0,0,0,213,142,1,0,54,131,1,0,2,0,0,0,1,0,0,0,57,131,1,0,61,131,1,0,4,0,0,0,2,0,0,0,66,131,1,0,70,131,1,0,4,0,0,0,4,0,0,0,75,131,1,0,80,131,1,0,5,0,0,0,5,0,0,0,86,131,1,0,90,131,1,0,4,0,0,0,7,0,0,0,95,131,1,0,99,131,1,0,5,0,0,0,9,0,0,0,105,131,1,0,109,131,1,0,4,0,0,0,10,0,0,0,114,131,1,0,119,131,1,0,4,0,0,0,12,0,0,0,124,131,1,0,15,136,1,0,0,0,0,0,1,0,0,0,23,136,1,0,1,0,0,0,0,0,0,0,162,179,1,0,1,0,0,0,1,0,0,0,74,19,2],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+10240);allocate([248,134,1,0,49,0,0,0,0,0,0,0,0,0,0,0,208,174,1,0,16,0,0,0,116,31,2,0,128,0,0,0,241,134,1,0,64,0,0,0,59,161,1,0,16,0,0,0,243,134,1,0,64,0,0,0,0,0,0,0,0,0,0,0,191,134,1,0,1,0,0,0,198,134,1,0,2,0,0,0,203,134,1,0,3,0,0,0,249,167,1,0,4,0,0,0,93,158,1,0,5,0,0,0,207,134,1,0,6,0,0,0,74,19,2,0,8,0,0,0,211,134,1,0,33,0,0,0,215,134,1,0,34,0,0,0,219,134,1,0,34,0,0,0,223,134,1,0,1,0,0,0,228,134,1,0,7,0,0,0,234,134,1,0,39,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,140,1,0,49,140,1,0,0,0,0,0,80,6,0,0,210,142,1,0,213,142,1,0,216,142,1,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,255,255,255,255,149,142,1,0,155,142,1,0,74,19,2,0,0,0,0,0,100,0,0,0,101,0,0,0,102,0,0,0,100,0,0,0,8,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,8,0,0,0,0,0,0,0,9,0,0,0,43,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249,167,1,0,144,85,0,0,176,6,0,0,0,0,0,0,38,158,1,0,144,85,0,0,224,6,0,0,0,0,0,0,255,166,1,0,144,85,0,0,16,7,0,0,0,0,0,0,46,158,1,0,144,85,0,0,16,7,0,0,0,0,0,0,51,158,1,0,144,85,0,0,64,7,0,0,0,0,0,0,58,158,1,0,168,85,0,0,64,7,0,0,0,0,0,0,64,158,1,0,144,85,0,0,112,7,0,0,0,0,0,0,68,158,1,0,144,85,0,0,160,7,0,0,0,0,0,0,74,19,2,0,144,85,0,0,208,7,0,0,0,0,0,0,77,158,1,0,144,85,0,0,208,7,0,0,0,0,0,0,87,158,1,0,144,85,0,0,128,6,0,0,0,0,0,0,93,158,1,0,144,85,0,0,0,8,0,0,0,0,0,0,101,158,1,0,144,85,0,0,48,8,0,0,0,0,0,0,111,158,1,0,144,85,0,0,96,8,0,0,0,0,0,0,125,158,1,0,144,85,0,0,144,8,0,0,0,0,0,0,131,158,1,0,144,85,0,0,192,8,0,0,0,0,0,0,140,158,1,0,144,85,0,0,240,8,0,0,0,0,0,0,148,158,1,0,144,85,0,0,32,9,0,0,0,0,0,0,157,158,1,0,144,85,0,0,80,9,0,0,0,0,0,0,165,158,1,0,144,85,0,0,128,9,0,0,0,0,0,0,170,158,1,0,144,85,0,0,176,9,0,0,0,0,0,0,174,158,1,0,144,85,0,0,224,9,0,0,0,0,0,0,181,158,1,0,144,85,0,0,16,10,0,0,0,0,0,0,187,158,1,0,144,85,0,0,64,10,0,0,0,0,0,0,197,158,1,0,192,85,0,0,112,10,0,0,0,0,0,0,206,158,1,0,144,85,0,0,176,6,0,0,0,0,0,0,211,158,1,0,144,85,0,0,176,6,0,0,0,0,0,0,221,158,1,0,144,85,0,0,160,10,0,0,0,0,0,0,228,158,1,0,144,85,0,0,208,10,0,0,0,0,0,0,241,158,1,0,144,85,0,0,0,11,0,0,0,0,0,0,255,158,1,0,144,85,0,0,48,11,0,0,0,0,0,0,13,159,1,0,144,85,0,0,96,11,0,0,0,0,0,0,25,159,1,0,144,85,0,0,144,11,0,0,0,0,0,0,38,159,1,0,144,85,0,0,192,11,0,0,0,0,0,0,47,159,1,0,144,85,0,0,240,11,0,0,0,0,0,0,57,159,1,0,144,85,0,0,32,12,0,0,0,0,0,0,66,159,1,0,144,85,0,0,80,12,0,0,0,0,0,0,74,159,1,0,144,85,0,0,128,12,0,0,0,0,0,0,82,159,1,0,144,85,0,0,176,12,0,0,0,0,0,0,91,159,1,0,144,85,0,0,224,12,0,0,0,0,0,0,95,159,1,0,144,85,0,0,16,13,0,0,0,0,0,0,106,159,1,0,144,85,0,0,64,13,0,0,0,0,0,0,110,159,1,0,144,85,0,0,112,13,0,0,0,0,0,0,120,159,1,0,144,85,0,0,160,13,0,0,0,0,0,0,129,159,1,0,144,85,0,0,208,13,0,0,0,0,0,0,137,159,1,0,144,85,0,0,0,14,0,0,0,0,0,0,150,159,1,0,144,85,0,0,48,14,0,0,0,0,0,0,162,159,1,0,144,85,0,0,96,14,0,0,0,0,0,0,173,159,1,0,144,85,0,0,144,14,0,0,0,0,0,0,189,159,1,0,144,85,0,0,192,14,0,0,0,0,0,0,203,159,1,0,144,85,0,0,240,14,0,0,0,0,0,0,218,159,1,0,144,85,0,0,32,15,0,0,0,0,0,0,228,159,1,0,144,85,0,0,80,15,0,0,0,0,0,0,237,159,1,0,144,85,0,0,128,15,0,0,0,0,0,0,247,159,1,0,144,85,0,0,176,15,0,0,0,0,0,0,1,160,1,0,144,85,0,0,224,15,0,0,0,0,0,0,8,160,1,0,144,85,0,0,16,16,0,0,0,0,0,0,15,160,1,0,144,85,0,0,64,16,0,0,0,0,0,0,25,160,1,0,216,85,0,0,0,0,0,0,0,0,0,0,32,160,1,0,216,85,0,0,0,0,0,0,0,0,0,0,2,158,1,0,240,85,0,0,0,0,0,0,0,0,0,0,40,160,1,0,8,86,0,0,112,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,91,0,0,0,92,0,0,0,23,0,0,0,4,0,0,0,2,0,0,0,12,0,0,0,93,0,0,0,92,0,0,0,23,0,0,0,5,0,0,0,0,0,0,0,13,0,0,0,91,0,0,0,92,0,0,0,23,0,0,0,4,0,0,0,2,0,0,0,12,0,0,0,94,0,0,0,95,0,0,0,24,0,0,0,6,0,0,0,3,0,0,0,14,0,0,0,96,0,0,0,97,0,0,0,23,0,0,0,7,0,0,0,0,0,0,0,15,0,0,0,91,0,0,0,92,0,0,0,23,0,0,0,8,0,0,0,2,0,0,0,12,0,0,0,16,0,0,0,17,0,0,0,18,0,0,0,19,0,0,0,42,161,1,0,49,161,1,0,0,0,0,0,57,161,1,0,59,161,1,0,174,31,2,0,61,161,1,0,12,0,0,0,4,0,0,0,6,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,9,0,0,0,8,0,0,0,11,0,0,0,12,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,16,0,0,0,17,0,0,0,18,0,0,0,21,0,0,0,22,0,0,0,23,0,0,0,24,0,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,31,0,0,0,32,0,0,0,33,0,0,0,34,0,0,0,35,0,0,0,36,0,0,0,37,0,0,0,38,0,0,0,41,0,0,0,42,0,0,0,43,0,0,0,44,0,0,0,45,0,0,0,46,0,0,0,47,0,0,0,48,0,0,0,51,0,0,0,52,0,0,0,53,0,0,0,54,0,0,0,55,0,0,0,56,0,0,0,57,0,0,0,58,0,0,0,61,0,0,0,62,0,0,0,63,0,0,0,64,0,0,0,65,0,0,0,66,0,0,0,67,0,0,0,68,0,0,0,71,0,0,0,72,0,0,0,73,0,0,0,74,0,0,0,75,0,0,0,76,0,0,0,77,0,0,0,78,0,0,0,81,0,0,0,82,0,0,0,83,0,0,0,84,0,0,0,85,0,0,0,86,0,0,0,87,0,0,0,88,0,0,0,138,162,1,0,154,162,1,0,167,162,1,0,0,0,0,0,0,0,0,0,4,0,0,0,172,162,1,0,0,0,0,0,0,0,0,0,183,162,1,0,154,162,1,0,167,162,1,0,0,0,0,0,206,162,1,0,5,0,0,0,172,162,1,0,0,0,0,0,214,162,1,0,221,162,1,0,154,162,1,0,237,162,1,0,0,0,0,0,0,0,0,0,6,0,0,0,172,162,1,0,24,179,1,0,0,0,0,0,242,162,1,0,154,162,1,0,237,162,1,0,0,0,0,0,206,162,1,0,7,0,0,0,172,162,1,0,24,179,1,0,214,162,1,0,9,163,1,0,22,163,1,0,237,162,1,0,0,0,0,0,0,0,0,0,10,0,0,0,36,163,1,0,24,179,1,0,0,0,0,0,42,163,1,0,22,163,1,0,237,162,1,0,0,0,0,0,214,162,1,0,11,0,0,0,36,163,1,0,24,179,1,0,214,162,1,0,61,163,1,0,22,163,1,0,75,163,1,0,0,0,0,0,0,0,0,0,8,0,0,0,36,163,1,0,0,0,0,0,0,0,0,0,81,163,1,0,22,163,1,0,75,163,1,0,0,0,0,0,214,162,1,0,9,0,0,0,36,163,1,0,0,0,0,0,214,162,1,0,101,163,1,0,101,163,1,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,109,163,1,0,0,0,0,0,0,0,0,0,119,163,1,0,101,163,1,0,24,179,1,0,0,0,0,0,0,0,0,0,14,0,0,0,109,163,1,0,24,179,1,0,0,0,0,0,132,163,1,0,101,163,1,0,24,179,1,0,0,0,0,0,206,162,1,0,15,0,0,0,109,163,1,0,24,179,1,0,214,162,1,0,152,163,1,0,101,163,1,0,0,0,0,0,0,0,0,0,206,162,1,0,13,0,0,0,109,163,1,0,0,0,0,0,214,162,1,0,168,163,1,0,168,163,1,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,172,162,1,0,0,0,0,0,0,0,0,0,178,163,1,0,168,163,1,0,24,179,1,0,0,0,0,0,0,0,0,0,18,0,0,0,172,162,1,0,24,179,1,0,0,0,0,0,193,163,1,0,168,163,1,0,24,179,1,0,0,0,0,0,206,162,1,0,19,0,0,0,172,162,1,0,24,179,1,0,214,162,1,0,215,163,1,0,168,163,1,0,0,0,0,0,232,163,1,0,0,0,0,0,20,0,0,0,172,162,1,0,0,0,0,0,0,0,0,0,242,163,1,0,168,163,1,0,24,179,1,0,232,163,1,0,0,0,0,0,22,0,0,0,172,162,1,0,24,179,1,0,0,0,0,0,8,164,1,0,168,163,1,0,24,179,1,0,232,163,1,0,206,162,1,0,23,0,0,0,172,162,1,0,24,179,1,0,214,162,1,0,37,164,1,0,168,163,1,0,0,0,0,0,232,163,1,0,206,162,1,0,21,0,0,0,172,162,1,0,0,0,0,0,214,162,1,0,62,164,1,0,168,163,1,0,0,0,0,0,0,0,0,0,206,162,1,0,17,0,0,0,172,162,1,0,0,0,0,0,214,162,1,0,80,164,1,0,102,164,1,0,24,179,1,0,0,0,0,0,0,0,0,0,26,0,0,0,36,163,1,0,24,179,1,0,0,0,0,0,123,164,1,0,102,164,1,0,24,179,1,0,0,0,0,0,214,162,1,0,27,0,0,0,36,163,1,0,24,179,1,0,214,162,1,0,151,164,1,0,102,164,1,0,0,0,0,0,0,0,0,0,214,162,1,0,25,0,0,0,36,163,1,0,0,0,0,0,214,162,1,0,175,164,1,0,102,164,1,0,198,164,1,0,0,0,0,0,0,0,0,0,24,0,0,0,36,163,1,0,0,0,0,0,0,0,0,0,204,164,1,0,218,164,1,0,24,179,1,0,0,0,0,0,0,0,0,0,30,0,0,0,36,163,1,0,24,179,1,0,0,0,0,0,236,164,1,0,218,164,1,0,24,179,1,0,0,0,0,0,214,162,1,0,31,0,0,0,36,163,1,0,24,179,1,0,214,162,1,0,0,165,1,0,218,164,1,0,0,0,0,0,0,0,0,0,214,162,1,0,29,0,0,0,36,163,1,0,0,0,0,0,214,162,1,0,16,165,1,0,218,164,1,0,198,164,1,0,0,0,0,0,0,0,0,0,28,0,0,0,36,163,1,0,0,0,0,0,0,0,0,0,31,165,1,0,31,165,1,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,38,165,1,0,0,0,0,0,0,0,0,0,46,165,1,0,57,165,1,0,24,179,1,0,0,0,0,0,0,0,0,0,2,0,0,0,36,163,1,0,24,179,1,0,0,0,0,0,63,165,1,0,57,165,1,0,24,179,1,0,0,0,0,0,214,162,1,0,3,0,0,0,36,163,1,0,24,179,1,0,214,162,1,0,80,165,1,0,57,165,1,0,0,0,0,0,0,0,0,0,214,162,1,0,1,0,0,0,36,163,1,0,0,0,0,0,214,162,1,0,7,167,1,0,57,165,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,163,1,0,0,0,0,0,0,0,0,0,93,165,1,0,119,165,1,0,134,165,1,0,0,0,0,0,214,162,1,0,33,0,0,0,36,163,1,0,0,0,0,0,214,162,1,0,141,165,1,0,154,165,1,0,0,0,0,0,0,0,0,0,0,0,0,0,34,0,0,0,38,165,1,0,0,0,0,0,0,0,0,0,8,0,0,0,4,0,0,0,0,0,0,0,10,0,0,0,45,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,168,1,0,198,0,0,0,60,168,1,0,193,0,0,0,67,168,1,0,194,0,0,0,73,168,1,0,192,0,0,0,80,168,1,0,145,3,0,0,86,168,1,0,197,0,0,0,92,168,1,0,195,0,0,0,99,168,1,0,196,0,0,0,104,168,1,0,146,3,0,0,109,168,1,0,199,0,0,0,116,168,1,0,167,3,0,0,120,168,1,0,33,32,0,0,127,168,1,0,148,3,0,0,133,168,1,0,208,0,0,0,137,168,1,0,201,0,0,0,144,168,1,0,202,0,0,0,150,168,1,0,200,0,0,0,157,168,1,0,149,3,0,0,165,168,1,0,151,3,0,0,169,168,1,0,203,0,0,0,174,168,1,0,147,3,0,0,180,168,1,0,205,0,0,0,187,168,1,0,206,0,0,0,193,168,1,0,204,0,0,0,200,168,1,0,153,3,0,0,205,168,1,0,207,0,0,0,210,168,1,0,154,3,0,0,216,168,1,0,155,3,0,0,223,168,1,0,156,3,0,0,226,168,1,0,209,0,0,0,233,168,1,0,157,3,0,0,236,168,1,0,82,1,0,0,242,168,1,0,211,0,0,0,249,168,1,0,212,0,0,0,255,168,1,0,210,0,0,0,6,169,1,0,169,3,0,0,12,169,1,0,159,3,0,0,20,169,1,0,216,0,0,0,27,169,1,0,213,0,0,0,34,169,1,0,214,0,0,0,39,169,1,0,166,3,0,0,43,169,1,0,160,3,0,0,46,169,1,0,51,32,0,0,52,169,1,0,168,3,0,0,56,169,1,0,161,3,0,0,60,169,1,0,96,1,0,0,67,169,1,0,163,3,0,0,73,169,1,0,222,0,0,0,79,169,1,0,164,3,0,0,83,169,1,0,152,3,0,0,89,169,1,0,218,0,0,0,96,169,1,0,219,0,0,0,102,169,1,0,217,0,0,0,109,169,1,0,165,3,0,0,117,169,1,0,220,0,0,0,122,169,1,0,158,3,0,0,125,169,1,0,221,0,0,0,132,169,1,0,120,1,0,0,137,169,1,0,150,3,0,0,142,169,1,0,225,0,0,0,149,169,1,0,226,0,0,0,155,169,1,0,180,0,0,0,161,169,1,0,230,0,0,0,167,169,1,0,224,0,0,0,174,169,1,0,53,33,0,0,182,169,1,0,177,3,0,0,188,169,1,0,38,0,0,0,192,169,1,0,39,34,0,0,196,169,1,0,32,34,0,0,200,169,1,0,229,0,0,0,206,169,1,0,72,34,0,0,212,169,1,0,227,0,0,0,219,169,1,0,228,0,0,0,224,169,1,0,30,32,0,0,230,169,1,0,178,3,0,0,235,169,1,0,166,0,0,0,242,169,1,0,34,32,0,0,247,169,1,0,41,34,0,0,251,169,1,0,231,0,0,0,2,170,1,0,184,0,0,0,8,170,1,0,162,0,0,0,13,170,1,0,199,3,0,0,17,170,1,0,198,2,0,0,22,170,1,0,99,38,0,0,28,170,1,0,69,34,0,0,33,170,1,0,169,0,0,0,38,170,1,0,181,33,0,0,44,170,1,0,42,34,0,0,48,170,1,0,164,0,0,0,55,170,1,0,211,33,0,0,60,170,1,0,32,32,0,0,67,170,1,0,147,33,0,0,72,170,1,0,176,0,0,0,76,170,1,0,180,3,0,0,82,170,1,0,102,38,0,0,88,170,1,0,247,0,0,0,95,170,1,0,233,0,0,0,102,170,1,0,234,0,0,0,108,170,1,0,232,0,0,0,115,170,1,0,5,34,0,0,121,170,1,0,3,32,0,0,126,170,1,0,2,32,0,0,131,170,1,0,181,3,0,0,139,170,1,0,97,34,0,0,145,170,1,0,183,3,0,0,149,170,1,0,240,0,0,0,153,170,1,0,235,0,0,0,158,170,1,0,172,32,0,0,163,170,1,0,3,34,0,0,169,170,1,0,146,1,0,0,174,170,1,0,0,34,0,0,181,170,1,0,189,0,0,0,188,170,1,0,188,0,0,0,195,170,1,0,190,0,0,0,202,170,1,0,68,32,0,0,208,170,1,0,179,3,0,0,214,170,1,0,101,34,0,0,217,170,1,0,62,0,0,0,220,170,1,0,212,33,0,0,225,170,1,0,148,33,0,0,230,170,1,0,101,38,0,0,237,170,1,0,38,32,0,0,244,170,1,0,237,0,0,0,251,170,1,0,238,0,0,0,1,171,1,0,161,0,0,0,7,171,1,0,236,0,0,0,14,171,1,0,17,33,0,0,20,171,1,0,30,34,0,0,26,171,1,0,43,34,0,0,30,171,1,0,185,3,0,0,35,171,1,0,191,0,0,0,42,171,1,0,8,34,0,0,47,171,1,0,239,0,0,0,52,171,1,0,186,3,0,0,58,171,1,0,208,33,0,0,63,171,1,0,187,3,0,0,70,171,1,0,41,35,0,0,75,171,1,0,171,0,0,0,81,171,1,0,144,33,0,0,86,171,1,0,8,35,0,0,92,171,1,0,28,32,0,0,98,171,1,0,100,34,0,0,101,171,1,0,10,35,0,0,108,171,1,0,23,34,0,0,115,171,1,0,202,37,0,0,119,171,1,0,14,32,0,0,123,171,1,0,57,32,0,0,130,171,1,0,24,32,0,0,136,171,1,0,60,0,0,0,139,171,1,0,175,0,0,0,144,171,1,0,20,32,0,0,150,171,1,0,181,0,0,0,156,171,1,0,183,0,0,0,115,180,1,0,18,34,0,0,163,171,1,0,188,3,0,0,166,171,1,0,7,34,0,0,172,171,1,0,160,0,0,0,177,171,1,0,19,32,0,0,183,171,1,0,96,34,0,0,186,171,1,0,11,34,0,0,189,171,1,0,172,0,0,0,193,171,1,0,9,34,0,0,199,171,1,0,132,34,0,0,204,171,1,0,241,0,0,0,211,171,1,0,189,3,0,0,214,171,1,0,243,0,0,0,221,171,1,0,244,0,0,0,227,171,1,0,83,1,0,0,233,171,1,0,242,0,0,0,240,171,1,0,62,32,0,0,246,171,1,0,201,3,0,0,252,171,1,0,191,3,0,0,4,172,1,0,149,34,0,0,10,172,1,0,40,34,0,0,13,172,1,0,170,0,0,0,18,172,1,0,186,0,0,0,23,172,1,0,248,0,0,0,30,172,1,0,245,0,0,0,37,172,1,0,151,34,0,0,44,172,1,0,246,0,0,0,49,172,1,0,182,0,0,0,54,172,1,0,2,34,0,0,59,172,1,0,48,32,0,0,66,172,1,0,165,34,0,0,71,172,1,0,198,3,0,0,75,172,1,0,192,3,0,0,78,172,1,0,214,3,0,0,82,172,1,0,177,0,0,0,89,172,1,0,163,0,0,0,95,172,1,0,50,32,0,0,101,172,1,0,15,34,0,0,106,172,1,0,29,34,0,0,111,172,1,0,200,3,0,0,115,172,1,0,34,0,0,0,120,172,1,0,210,33,0,0,125,172,1,0,26,34,0,0,131,172,1,0,42,35,0,0,136,172,1,0,187,0,0,0,142,172,1,0,146,33,0,0,147,172,1,0,9,35,0,0,153,172,1,0,29,32,0,0,159,172,1,0,28,33,0,0,164,172,1,0,174,0,0,0,168,172,1,0,11,35,0,0,175,172,1,0,193,3,0,0,179,172,1,0,15,32,0,0,183,172,1,0,58,32,0,0,190,172,1,0,25,32,0,0,196,172,1,0,26,32,0,0,202,172,1,0,97,1,0,0,209,172,1,0,197,34,0,0,214,172,1,0,167,0,0,0,219,172,1,0,173,0,0,0,223,172,1,0,195,3,0,0,229,172,1,0,194,3,0,0,236,172,1,0,60,34,0,0,240,172,1,0,96,38,0,0,247,172,1,0,130,34,0,0,251,172,1,0,134,34,0,0,0,173,1,0,17,34,0,0,4,173,1,0,131,34,0,0,8,173,1,0,185,0,0,0,13,173,1,0,178,0,0,0,18,173,1,0,179,0,0,0,23,173,1,0,135,34,0,0,28,173,1,0,223,0,0,0,34,173,1,0,196,3,0,0,38,173,1,0,52,34,0,0,45,173,1,0,184,3,0,0,51,173,1,0,209,3,0,0,60,173,1,0,9,32,0,0,67,173,1,0,254,0,0,0,73,173,1,0,220,2,0,0,79,173,1,0,215,0,0,0,85,173,1,0,34,33,0,0,91,173,1,0,209,33,0,0,96,173,1,0,250,0,0,0,103,173,1,0,145,33,0,0,108,173,1,0,251,0,0,0,114,173,1,0,249,0,0,0,121,173,1,0,168,0,0,0,125,173,1,0,210,3,0,0,131,173,1,0,197,3,0,0,139,173,1,0,252,0,0,0,144,173,1,0,24,33,0,0,151,173,1,0,190,3,0,0,154,173,1,0,253,0,0,0,161,173,1,0,165,0,0,0,165,173,1,0,255,0,0,0,170,173,1,0,182,3,0,0,175,173,1,0,13,32,0,0,179,173,1,0,12,32,0,0,7,0,0,0,8,0,0,0,1,1,0,0,8,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,47,0,0,0,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,48,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,180,1,0,9,0,0,0,53,180,1,0,10,0,0,0,58,180,1,0,10,0,0,0,66,180,1,0,11,0,0,0,72,180,1,0,11,0,0,0,81,180,1,0,12,0,0,0,84,180,1,0,12,0,0,0,90,180,1,0,13,0,0,0,95,180,1,0,13,0,0,0,103,180,1,0,14,0,0,0,108,180,1,0,14,0,0,0,115,180,1,0,15,0,0,0,121,180,1,0,15,0,0,0,133,180,1,0,16,0,0,0,14,0,0,0,98,0,0,0,49,0,0,0,50,0,0,0,20,0,0,0,51,0,0,0,99,0,0,0,52,0,0,0,21,0,0,0,53,0,0,0,8,0,0,0,4,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,208,181,1,0,85,93,201,127,201,127,255,0,219,181,1,0,187,45,212,190,174,212,255,0,230,181,1,0,20,119,253,253,192,134,255,0,241,181,1,0,85,93,201,127,201,127,255,0,252,181,1,0,187,45,212,190,174,212,255,0,7,182,1,0,20,119,253,253,192,134,255,0,18,182,1,0,42,102,255,255,255,153,255,0,29,182,1,0,85,93,201,127,201,127,255,0,40,182,1,0,187,45,212,190,174,212,255,0,51,182,1,0,20,119,253,253,192,134,255,0,62,182,1,0,42,102,255,255,255,153,255,0,73,182,1,0,151,173,176,56,108,176,255,0,84,182,1,0,85,93,201,127,201,127,255,0,95,182,1,0,187,45,212,190,174,212,255,0,106,182,1,0,20,119,253,253,192,134,255,0,117,182,1,0,42,102,255,255,255,153,255,0,128,182,1,0,151,173,176,56,108,176,255,0,139,182,1,0,232,252,240,240,2,127,255,0,150,182,1,0,85,93,201,127,201,127,255,0,161,182,1,0,187,45,212,190,174,212,255,0,172,182,1,0,20,119,253,253,192,134,255,0,183,182,1,0,42,102,255,255,255,153,255,0,194,182,1,0,151,173,176,56,108,176,255,0,205,182,1,0,232,252,240,240,2,127,255,0,216,182,1,0,17,224,191,191,91,23,255,0,227,182,1,0,85,93,201,127,201,127,255,0,238,182,1,0,187,45,212,190,174,212,255,0,249,182,1,0,20,119,253,253,192,134,255,0,4,183,1,0,42,102,255,255,255,153,255,0,15,183,1,0,151,173,176,56,108,176,255,0,26,183,1,0,232,252,240,240,2,127,255,0,37,183,1,0,17,224,191,191,91,23,255,0,48,183,1,0,0,0,102,102,102,102,255,0,59,183,1,0,147,25,247,222,235,247,255,0,69,183,1,0,142,75,225,158,202,225,255,0,79,183,1,0,145,188,189,49,130,189,255,0,89,183,1,0,159,16,255,239,243,255,255,0,99,183,1,0,143,46,231,189,215,231,255,0,109,183,1,0,143,127,214,107,174,214,255,0,119,183,1,0,147,208,181,33,113,181,255,0,129,183,1,0,159,16,255,239,243,255,255,0,139,183,1,0,143,46,231,189,215,231,255,0,149,183,1,0,143,127,214,107,174,214,255,0,159,183,1,0,145,188,189,49,130,189,255,0,169,183,1,0,149,241,156,8,81,156,255,0,179,183,1,0,159,16,255,239,243,255,255,0,189,183,1,0,148,43,239,198,219,239,255,0,199,183,1,0,142,75,225,158,202,225,255,0,209,183,1,0,143,127,214,107,174,214,255,0,219,183,1,0,145,188,189,49,130,189,255,0,229,183,1,0,149,241,156,8,81,156,255,0,239,183,1,0,159,16,255,239,243,255,255,0,249,183,1,0,148,43,239,198,219,239,255,0,3,184,1,0,142,75,225,158,202,225,255,0,13,184,1,0,143,127,214,107,174,214,255,0,23,184,1,0,144,169,198,66,146,198,255,0,33,184,1,0,147,208,181,33,113,181,255,0,43,184,1,0,151,241,148,8,69,148,255,0,53,184,1,0,148,8,255,247,251,255,255,0,63,184,1,0,147,25,247,222,235,247,255,0,73,184,1,0,148,43,239,198,219,239,255,0,83,184,1,0,142,75,225,158,202,225,255,0,93,184,1,0,143,127,214,107,174,214,255,0,103,184,1,0,144,169,198,66,146,198,255,0,113,184,1,0,147,208,181,33,113,181,255,0,123,184,1,0,151,241,148,8,69,148,255,0,133,184,1,0,148,8,255,247,251,255,255,0,143,184,1,0,147,25,247,222,235,247,255,0,153,184,1,0,148,43,239,198,219,239,255,0,163,184,1,0,142,75,225,158,202,225,255,0,173,184,1,0,143,127,214,107,174,214,255,0,183,184,1,0,144,169,198,66,146,198,255,0,193,184,1,0,147,208,181,33,113,181,255,0,203,184,1,0,149,241,156,8,81,156,255,0,213,184,1,0,152,235,107,8,48,107,255,0,223,184,1,0,23,239,84,84,48,5,255,0,233,184,1,0,119,255,60,0,60,48,255,0,244,184,1,0,23,236,140,140,81,10,255,0,254,184,1,0,24,194,191,191,129,45,255,0,8,185,1,0,29,112,223,223,194,125,255,0,18,185,1,0,30,52,246,246,232,195,255,0,28,185,1,0,121,38,234,199,234,229,255,0,38,185,1,0,120,95,205,128,205,193,255,0,48,185,1,0,124,165,151,53,151,143,255,0,58,185,1,0,124,252,102,1,102,94,255,0,68,185,1,0,23,239,84,84,48,5,255,0,78,185,1,0,124,252,102,1,102,94,255,0,89,185,1,0,119,255,60,0,60,48,255,0,100,185,1,0,23,236,140,140,81,10,255,0,110,185,1,0,24,194,191,191,129,45,255,0,120,185,1,0,29,112,223,223,194,125,255,0,130,185,1,0,30,52,246,246,232,195,255,0,140,185,1,0,0,0,245,245,245,245,255,0,150,185,1,0,121,38,234,199,234,229,255,0,160,185,1,0,120,95,205,128,205,193,255,0,170,185,1,0,124,165,151,53,151,143,255,0,180,185,1,0,28,135,216,216,179,101,255,0,189,185,1,0,0,0,245,245,245,245,255,0,198,185,1,0,123,127,180,90,180,172,255,0,207,185,1,0,21,215,166,166,97,26,255,0,216,185,1,0,29,112,223,223,194,125,255,0,225,185,1,0,120,95,205,128,205,193,255,0,234,185,1,0,121,253,133,1,133,113,255,0,243,185,1,0,21,215,166,166,97,26,255,0,252,185,1,0,29,112,223,223,194,125,255,0,5,186,1,0,0,0,245,245,245,245,255,0,14,186,1,0,120,95,205,128,205,193,255,0,23,186,1,0,121,253,133,1,133,113,255,0,32,186,1,0,23,236,140,140,81,10,255,0,41,186,1,0,28,135,216,216,179,101,255,0,50,186,1,0,30,52,246,246,232,195,255,0,59,186,1,0,121,38,234,199,234,229,255,0,68,186,1,0,123,127,180,90,180,172,255,0,77,186,1,0,124,252,102,1,102,94,255,0,86,186,1,0,23,236,140,140,81,10,255,0,95,186,1,0,28,135,216,216,179,101,255,0,104,186,1,0,30,52,246,246,232,195,255,0,113,186,1,0,0,0,245,245,245,245,255,0,122,186,1,0,121,38,234,199,234,229,255,0,131,186,1,0,123,127,180,90,180,172,255,0,140,186,1,0,124,252,102,1,102,94,255,0,149,186,1,0,23,236,140,140,81,10,255,0,158,186,1,0,24,194,191,191,129,45,255,0,167,186,1,0,29,112,223,223,194,125,255,0,176,186,1,0,30,52,246,246,232,195,255,0,185,186,1,0,121,38,234,199,234,229,255,0,194,186,1,0,120,95,205,128,205,193,255,0,203,186,1,0,124,165,151,53,151,143,255,0,212,186,1,0,124,252,102,1,102,94,255,0,221,186,1,0,23,236,140,140,81,10,255,0,230,186,1,0,24,194,191,191,129,45,255,0,239,186,1,0,29,112,223,223,194,125,255,0,248,186,1,0,30,52,246,246,232,195,255,0,1,187,1,0,0,0,245,245,245,245,255,0,10,187,1,0,121,38,234,199,234,229,255,0,19,187,1,0,120,95,205,128,205,193,255,0,28,187,1,0,124,165,151,53,151,143,255,0,37,187,1,0,124,252,102,1,102,94,255,0,46,187,1,0,135,20,249,229,245,249,255,0,55,187,1,0,117,74,216,153,216,201,255,0,64,187,1,0,103,185,162,44,162,95,255,0,73,187,1,0,136,14,251,237,248,251,255,0,82,187,1,0,127,54,226,178,226,226,255,0,91,187,1,0,113,120,194,102,194,164,255,0,100,187,1,0,98,190,139,35,139,69,255,0,109,187,1,0,136,14,251,237,248,251,255,0,118,187,1,0,127,54,226,178,226,226,255,0,127,187,1,0,113,120,194,102,194,164,255,0,136,187,1,0,103,185,162,44,162,95,255,0,145,187,1,0,102,255,109,0,109,44,255,0,154,187,1,0,136,14,251,237,248,251,255,0,163,187,1,0,119,34,236,204,236,230,255,0,172,187,1,0,117,74,216,153,216,201,255,0,181,187,1,0,113,120,194,102,194,164,255,0,190,187,1,0,103,185,162,44,162,95,255,0,199,187,1,0,102,255,109,0,109,44,255,0,208,187,1,0,136,14,251,237,248,251,255,0,217,187,1,0,119,34,236,204,236,230,255,0,226,187,1,0,117,74,216,153,216,201,255,0,235,187,1,0,113,120,194,102,194,164,255,0,244,187,1,0,105,159,174,65,174,118,255,0,253,187,1,0,98,190,139,35,139,69,255,0,6,188,1,0,102,255,88,0,88,36,255,0,15,188,1,0,134,6,253,247,252,253,255,0,24,188,1,0,135,20,249,229,245,249,255,0,33,188,1,0,119,34,236,204,236,230,255,0,42,188,1,0,117,74,216,153,216,201,255,0,51,188,1,0,113,120,194,102,194,164,255,0,60,188,1,0,105,159,174,65,174,118,255,0,69,188,1,0,98,190,139,35,139,69,255,0,78,188,1,0,102,255,88,0,88,36,255,0,87,188,1,0,134,6,253,247,252,253,255,0,96,188,1,0,135,20,249,229,245,249,255,0,105,188,1,0,119,34,236,204,236,230,255,0,114,188,1,0,117,74,216,153,216,201,255,0,123,188,1,0,113,120,194,102,194,164,255,0,132,188,1,0,105,159,174,65,174,118,255,0,141,188,1,0,98,190,139,35,139,69,255,0,150,188,1,0,102,255,109,0,109,44,255,0,159,188,1,0,101,255,68,0,68,27,255,0,168,188,1,0,144,20,244,224,236,244,255,0,177,188,1,0,148,70,218,158,188,218,255,0,186,188,1,0,196,123,167,136,86,167,255,0,195,188,1,0,136,14,251,237,248,251,255,0,204,188,1,0,146,53,227,179,205,227,255,0,213,188,1,0,162,74,198,140,150,198,255,0,222,188,1,0,202,149,157,136,65,157,255,0,231,188,1,0,136,14,251,237,248,251,255,0,240,188,1,0,146,53,227,179,205,227,255,0,249,188,1,0,162,74,198,140,150,198,255,0,2,189,1,0,196,123,167,136,86,167,255,0,11,189,1,0,214,225,129,129,15,124,255,0,20,189,1,0,136,14,251,237,248,251,255,0,29,189,1,0,148,43,230,191,211,230,255,0,38,189,1,0,148,70,218,158,188,218,255,0,47,189,1,0,162,74,198,140,150,198,255,0,56,189,1,0,196,123,167,136,86,167,255,0,65,189,1,0,214,225,129,129,15,124,255,0,74,189,1,0,136,14,251,237,248,251,255,0,83,189,1,0,148,43,230,191,211,230,255,0,92,189,1,0,148,70,218,158,188,218,255,0,101,189,1,0,162,74,198,140,150,198,255,0,110,189,1,0,190,100,177,140,107,177,255,0,119,189,1,0,202,149,157,136,65,157,255,0,128,189,1,0,213,252,110,110,1,107,255,0,137,189,1,0,134,6,253,247,252,253,255,0,146,189,1,0,144,20,244,224,236,244,255,0,155,189,1,0,148,43,230,191,211,230,255,0,164,189,1,0,148,70,218,158,188,218,255,0,173,189,1,0,162,74,198,140,150,198,255,0,182,189,1,0,190,100,177,140,107,177,255,0,191,189,1,0,202,149,157,136,65,157,255,0,200,189,1,0,213,252,110,110,1,107,255,0,209,189,1,0,134,6,253,247,252,253,255,0,218,189,1,0,144,20,244,224,236,244,255,0,227,189,1,0,148,43,230,191,211,230,255,0,236,189,1,0,148,70,218,158,188,218,255,0,245,189,1,0,162,74,198,140,150,198,255,0,254,189,1,0,190,100,177,140,107,177,255,0,7,190,1,0,202,149,157,136,65,157,255,0,16,190,1,0,214,225,129,129,15,124,255,0,25,190,1,0,213,255,77,77,0,75,255,0,34,190,1,0,114,211,158,27,158,119,255,0,44,190,1,0,18,252,217,217,95,2,255,0,54,190,1,0,173,95,179,117,112,179,255,0,64,190,1,0,114,211,158,27,158,119,255,0,74,190,1,0,18,252,217,217,95,2,255,0,84,190,1,0,173,95,179,117,112,179,255,0,94,190,1,0,233,209,231,231,41,138,255,0,104,190,1,0,114,211,158,27,158,119,255,0,114,190,1,0,18,252,217,217,95,2,255,0,124,190,1,0,173,95,179,117,112,179,255,0,134,190,1,0,233,209,231,231,41,138,255,0,144,190,1,0,62,208,166,102,166,30,255,0,154,190,1,0,114,211,158,27,158,119,255,0,164,190,1,0,18,252,217,217,95,2,255,0,174,190,1,0,173,95,179,117,112,179,255,0,184,190,1,0,233,209,231,231,41,138,255,0,194,190,1,0,62,208,166,102,166,30,255,0,204,190,1,0,31,252,230,230,171,2,255,0,214,190,1,0,114,211,158,27,158,119,255,0,224,190,1,0,18,252,217,217,95,2,255,0,234,190,1,0,173,95,179,117,112,179,255,0,244,190,1,0,233,209,231,231,41,138,255,0,254,190,1,0,62,208,166,102,166,30,255,0,8,191,1,0,31,252,230,230,171,2,255,0,18,191,1,0,27,210,166,166,118,29,255,0,28,191,1,0,114,211,158,27,158,119,255,0,38,191,1,0,18,252,217,217,95,2,255,0,48,191,1,0,173,95,179,117,112,179,255,0,58,191,1,0,233,209,231,231,41,138,255,0,68,191,1,0,62,208,166,102,166,30,255,0,78,191,1,0,31,252,230,230,171,2,255,0,88,191,1,0,27,210,166,166,118,29,255,0,98,191,1,0,0,0,102,102,102,102,255,0,108,191,1,0,76,25,243,224,243,219,255,0,117,191,1,0,95,61,221,168,221,181,255,0,126,191,1,0,140,170,202,67,162,202,255,0,135,191,1,0,65,17,249,240,249,232,255,0,144,191,1,0,87,46,228,186,228,188,255,0,153,191,1,0,123,101,204,123,204,196,255,0,162,191,1,0,141,197,190,43,140,190,255,0,171,191,1,0,65,17,249,240,249,232,255,0,180,191,1,0,87,46,228,186,228,188,255,0,189,191,1,0,123,101,204,123,204,196,255,0,198,191,1,0,140,170,202,67,162,202,255,0,207,191,1,0,145,243,172,8,104,172,255,0,216,191,1,0,65,17,249,240,249,232,255,0,225,191,1,0,77,41,235,204,235,197,255,0,234,191,1,0,95,61,221,168,221,181,255,0,243,191,1,0,123,101,204,123,204,196,255,0,252,191,1,0,140,170,202,67,162,202,255,0,5,192,1,0,145,243,172,8,104,172,255,0,14,192,1,0,65,17,249,240,249,232,255,0,23,192,1,0,77,41,235,204,235,197,255,0,32,192,1,0,95,61,221,168,221,181,255,0,41,192,1,0,123,101,204,123,204,196,255,0,50,192,1,0,137,160,211,78,179,211,255,0,59,192,1,0,141,197,190,43,140,190,255,0,68,192,1,0,147,242,158,8,88,158,255,0,77,192,1,0,60,12,252,247,252,240,255,0,86,192,1,0,76,25,243,224,243,219,255,0,95,192,1,0,77,41,235,204,235,197,255,0,104,192,1,0,95,61,221,168,221,181,255,0,113,192,1,0,123,101,204,123,204,196,255,0,122,192,1,0,137,160,211,78,179,211,255,0,131,192,1,0,141,197,190,43,140,190,255,0,140,192,1,0,147,242,158,8,88,158,255,0,149,192,1,0,60,12,252,247,252,240,255,0,158,192,1,0,76,25,243,224,243,219,255,0,167,192,1,0,77,41,235,204,235,197,255,0,176,192,1,0,95,61,221,168,221,181,255,0,185,192,1,0,123,101,204,123,204,196,255,0,194,192,1,0,137,160,211,78,179,211,255,0,203,192,1,0,141,197,190,43,140,190,255,0,212,192,1,0,145,243,172,8,104,172,255,0,221,192,1,0,150,239,129,8,64,129,255,0,230,192,1,0,74,21,245,229,245,224,255,0,241,192,1,0,80,72,217,161,217,155,255,0,252,192,1,0,98,178,163,49,163,84,255,0,7,193,1,0,73,15,248,237,248,233,255,0,18,193,1,0,78,54,228,186,228,179,255,0,29,193,1,0,86,104,196,116,196,118,255,0,40,193,1,0,98,190,139,35,139,69,255,0,51,193,1,0,73,15,248,237,248,233,255,0,62,193,1,0,78,54,228,186,228,179,255,0,73,193,1,0,86,104,196,116,196,118,255,0,84,193,1,0,98,178,163,49,163,84,255,0,95,193,1,0,102,255,109,0,109,44,255,0,106,193,1,0,73,15,248,237,248,233,255,0,117,193,1,0,77,44,233,199,233,192,255,0,128,193,1,0,80,72,217,161,217,155,255,0,139,193,1,0,86,104,196,116,196,118,255,0,150,193,1,0,98,178,163,49,163,84,255,0,161,193,1,0,102,255,109,0,109,44,255,0,172,193,1,0,73,15,248,237,248,233,255,0,183,193,1,0,77,44,233,199,233,192,255,0,194,193,1,0,80,72,217,161,217,155,255,0,205,193,1,0,86,104,196,116,196,118,255,0,216,193,1,0,96,158,171,65,171,93,255,0,227,193,1,0,98,190,139,35,139,69,255,0,238,193,1,0,108,255,90,0,90,50,255,0,249,193,1,0,72,7,252,247,252,245,255,0,4,194,1,0,74,21,245,229,245,224,255,0,15,194,1,0,77,44,233,199,233,192,255,0,26,194,1,0,80,72,217,161,217,155,255,0,37,194,1,0,86,104,196,116,196,118,255,0,48,194,1,0,96,158,171,65,171,93,255,0,59,194,1,0,98,190,139,35,139,69,255,0,70,194,1,0,108,255,90,0,90,50,255,0,81,194,1,0,72,7,252,247,252,245,255,0,92,194,1,0,74,21,245,229,245,224,255,0,103,194,1,0,77,44,233,199,233,192,255,0,114,194,1,0,80,72,217,161,217,155,255,0,125,194,1,0,86,104,196,116,196,118,255,0,136,194,1,0,96,158,171,65,171,93,255,0,147,194,1,0,98,190,139,35,139,69,255,0,158,194,1,0,102,255,109,0,109,44,255,0,169,194,1,0,101,255,68,0,68,27,255,0,180,194,1,0,0,0,240,240,240,240,255,0,190,194,1,0,0,0,189,189,189,189,255,0,200,194,1,0,0,0,99,99,99,99,255,0,210,194,1,0,0,0,247,247,247,247,255,0,220,194,1,0,0,0,204,204,204,204,255,0,230,194,1,0,0,0,150,150,150,150,255,0,240,194,1,0,0,0,82,82,82,82,255,0,250,194,1,0,0,0,247,247,247,247,255,0,4,195,1,0,0,0,204,204,204,204,255,0,14,195,1,0,0,0,150,150,150,150,255,0,24,195,1,0,0,0,99,99,99,99,255,0,34,195,1,0,0,0,37,37,37,37,255,0,44,195,1,0,0,0,247,247,247,247,255,0,54,195,1,0,0,0,217,217,217,217,255,0,64,195,1,0,0,0,189,189,189,189,255,0,74,195,1,0,0,0,150,150,150,150,255,0,84,195,1,0,0,0,99,99,99,99,255,0,94,195,1,0,0,0,37,37,37,37,255,0,104,195,1,0,0,0,247,247,247,247,255,0,114,195,1,0,0,0,217,217,217,217,255,0,124,195,1,0,0,0,189,189,189,189,255,0,134,195,1,0,0,0,150,150,150,150,255,0,144,195,1,0,0,0,115,115,115,115,255,0,154,195,1,0,0,0,82,82,82,82,255,0,164,195,1,0,0,0,37,37,37,37,255,0,174,195,1,0,0,0,255,255,255,255,255,0,184,195,1,0,0,0,240,240,240,240,255,0,194,195,1,0,0,0,217,217,217,217,255,0,204,195,1,0,0,0,189,189,189,189,255,0,214,195,1,0,0,0,150,150,150,150,255,0,224,195,1,0,0,0,115,115,115,115,255,0,234,195,1,0,0,0,82,82,82,82,255,0,244,195,1,0,0,0,37,37,37,37,255,0,254,195,1,0,0,0,255,255,255,255,255,0,8,196,1,0,0,0,240,240,240,240,255,0,18,196,1,0,0,0,217,217,217,217,255,0,28,196,1,0,0,0,189,189,189,189,255,0,38,196,1,0,0,0,150,150,150,150,255,0,48,196,1,0,0,0,115,115,115,115,255,0,58,196,1,0,0,0,82,82,82,82,255,0,68,196,1,0,0,0,37,37,37,37,255,0,78,196,1,0,0,0,0,0,0,0,255,0,88,196,1,0,21,48,254,254,230,206,255,0,100,196,1,0,19,147,253,253,174,107,255,0,112,196,1,0,14,240,230,230,85,13,255,0,124,196,1,0,19,32,254,254,237,222,255,0,136,196,1,0,20,120,253,253,190,133,255,0,148,196,1,0,17,194,253,253,141,60,255,0,160,196,1,0,13,253,217,217,71,1,255,0,172,196,1,0,19,32,254,254,237,222,255,0,184,196,1,0,20,120,253,253,190,133,255,0,196,196,1,0,17,194,253,253,141,60,255,0,208,196,1,0,14,240,230,230,85,13,255,0,220,196,1,0,13,250,166,166,54,3,255,0,232,196,1,0,19,32,254,254,237,222,255,0,244,196,1],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+20484);allocate([21,91,253,253,208,162,255,0,0,197,1,0,19,147,253,253,174,107,255,0,12,197,1,0,17,194,253,253,141,60,255,0,24,197,1,0,14,240,230,230,85,13,255,0,36,197,1,0,13,250,166,166,54,3,255,0,48,197,1,0,19,32,254,254,237,222,255,0,60,197,1,0,21,91,253,253,208,162,255,0,72,197,1,0,19,147,253,253,174,107,255,0,84,197,1,0,17,194,253,253,141,60,255,0,96,197,1,0,16,234,241,241,105,19,255,0,108,197,1,0,13,253,217,217,72,1,255,0,120,197,1,0,12,247,140,140,45,4,255,0,132,197,1,0,21,20,255,255,245,235,255,0,144,197,1,0,21,48,254,254,230,206,255,0,156,197,1,0,21,91,253,253,208,162,255,0,168,197,1,0,19,147,253,253,174,107,255,0,180,197,1,0,17,194,253,253,141,60,255,0,192,197,1,0,16,234,241,241,105,19,255,0,204,197,1,0,13,253,217,217,72,1,255,0,216,197,1,0,12,247,140,140,45,4,255,0,228,197,1,0,21,20,255,255,245,235,255,0,240,197,1,0,21,48,254,254,230,206,255,0,252,197,1,0,21,91,253,253,208,162,255,0,8,198,1,0,19,147,253,253,174,107,255,0,20,198,1,0,17,194,253,253,141,60,255,0,32,198,1,0,16,234,241,241,105,19,255,0,44,198,1,0,13,253,217,217,72,1,255,0,56,198,1,0,13,250,166,166,54,3,255,0,68,198,1,0,12,246,127,127,39,4,255,0,80,198,1,0,25,54,254,254,232,200,255,0,89,198,1,0,19,121,253,253,187,132,255,0,98,198,1,0,5,197,227,227,74,51,255,0,107,198,1,0,26,37,254,254,240,217,255,0,116,198,1,0,24,115,253,253,204,138,255,0,125,198,1,0,13,164,252,252,141,89,255,0,134,198,1,0,3,218,215,215,48,31,255,0,143,198,1,0,26,37,254,254,240,217,255,0,152,198,1,0,24,115,253,253,204,138,255,0,161,198,1,0,13,164,252,252,141,89,255,0,170,198,1,0,5,197,227,227,74,51,255,0,179,198,1,0,0,255,179,179,0,0,255,0,188,198,1,0,26,37,254,254,240,217,255,0,197,198,1,0,24,95,253,253,212,158,255,0,206,198,1,0,19,121,253,253,187,132,255,0,215,198,1,0,13,164,252,252,141,89,255,0,224,198,1,0,5,197,227,227,74,51,255,0,233,198,1,0,0,255,179,179,0,0,255,0,242,198,1,0,26,37,254,254,240,217,255,0,251,198,1,0,24,95,253,253,212,158,255,0,4,199,1,0,19,121,253,253,187,132,255,0,13,199,1,0,13,164,252,252,141,89,255,0,22,199,1,0,7,178,239,239,101,72,255,0,31,199,1,0,3,218,215,215,48,31,255,0,40,199,1,0,0,255,153,153,0,0,255,0,49,199,1,0,24,18,255,255,247,236,255,0,58,199,1,0,25,54,254,254,232,200,255,0,67,199,1,0,24,95,253,253,212,158,255,0,76,199,1,0,19,121,253,253,187,132,255,0,85,199,1,0,13,164,252,252,141,89,255,0,94,199,1,0,7,178,239,239,101,72,255,0,103,199,1,0,3,218,215,215,48,31,255,0,112,199,1,0,0,255,153,153,0,0,255,0,121,199,1,0,24,18,255,255,247,236,255,0,130,199,1,0,25,54,254,254,232,200,255,0,139,199,1,0,24,95,253,253,212,158,255,0,148,199,1,0,19,121,253,253,187,132,255,0,157,199,1,0,13,164,252,252,141,89,255,0,166,199,1,0,7,178,239,239,101,72,255,0,175,199,1,0,3,218,215,215,48,31,255,0,184,199,1,0,0,255,179,179,0,0,255,0,193,199,1,0,0,255,127,127,0,0,255,0,202,199,1,0,142,68,227,166,206,227,255,0,214,199,1,0,190,153,154,106,61,154,255,0,227,199,1,0,144,211,180,31,120,180,255,0,239,199,1,0,65,97,223,178,223,138,255,0,251,199,1,0,82,184,160,51,160,44,255,0,7,200,1,0,0,99,251,251,154,153,255,0,19,200,1,0,254,225,227,227,26,28,255,0,31,200,1,0,23,143,253,253,191,111,255,0,43,200,1,0,21,255,255,255,127,0,255,0,55,200,1,0,198,42,214,202,178,214,255,0,67,200,1,0,142,68,227,166,206,227,255,0,79,200,1,0,190,153,154,106,61,154,255,0,92,200,1,0,42,102,255,255,255,153,255,0,105,200,1,0,144,211,180,31,120,180,255,0,117,200,1,0,65,97,223,178,223,138,255,0,129,200,1,0,82,184,160,51,160,44,255,0,141,200,1,0,0,99,251,251,154,153,255,0,153,200,1,0,254,225,227,227,26,28,255,0,165,200,1,0,23,143,253,253,191,111,255,0,177,200,1,0,21,255,255,255,127,0,255,0,189,200,1,0,198,42,214,202,178,214,255,0,201,200,1,0,142,68,227,166,206,227,255,0,213,200,1,0,190,153,154,106,61,154,255,0,226,200,1,0,42,102,255,255,255,153,255,0,239,200,1,0,15,197,177,177,89,40,255,0,252,200,1,0,144,211,180,31,120,180,255,0,8,201,1,0,65,97,223,178,223,138,255,0,20,201,1,0,82,184,160,51,160,44,255,0,32,201,1,0,0,99,251,251,154,153,255,0,44,201,1,0,254,225,227,227,26,28,255,0,56,201,1,0,23,143,253,253,191,111,255,0,68,201,1,0,21,255,255,255,127,0,255,0,80,201,1,0,198,42,214,202,178,214,255,0,92,201,1,0,142,68,227,166,206,227,255,0,103,201,1,0,144,211,180,31,120,180,255,0,114,201,1,0,65,97,223,178,223,138,255,0,125,201,1,0,142,68,227,166,206,227,255,0,136,201,1,0,144,211,180,31,120,180,255,0,147,201,1,0,65,97,223,178,223,138,255,0,158,201,1,0,82,184,160,51,160,44,255,0,169,201,1,0,142,68,227,166,206,227,255,0,180,201,1,0,144,211,180,31,120,180,255,0,191,201,1,0,65,97,223,178,223,138,255,0,202,201,1,0,82,184,160,51,160,44,255,0,213,201,1,0,0,99,251,251,154,153,255,0,224,201,1,0,142,68,227,166,206,227,255,0,235,201,1,0,144,211,180,31,120,180,255,0,246,201,1,0,65,97,223,178,223,138,255,0,1,202,1,0,82,184,160,51,160,44,255,0,12,202,1,0,0,99,251,251,154,153,255,0,23,202,1,0,254,225,227,227,26,28,255,0,34,202,1,0,142,68,227,166,206,227,255,0,45,202,1,0,144,211,180,31,120,180,255,0,56,202,1,0,65,97,223,178,223,138,255,0,67,202,1,0,82,184,160,51,160,44,255,0,78,202,1,0,0,99,251,251,154,153,255,0,89,202,1,0,254,225,227,227,26,28,255,0,100,202,1,0,23,143,253,253,191,111,255,0,111,202,1,0,142,68,227,166,206,227,255,0,122,202,1,0,144,211,180,31,120,180,255,0,133,202,1,0,65,97,223,178,223,138,255,0,144,202,1,0,82,184,160,51,160,44,255,0,155,202,1,0,0,99,251,251,154,153,255,0,166,202,1,0,254,225,227,227,26,28,255,0,177,202,1,0,23,143,253,253,191,111,255,0,188,202,1,0,21,255,255,255,127,0,255,0,199,202,1,0,142,68,227,166,206,227,255,0,210,202,1,0,144,211,180,31,120,180,255,0,221,202,1,0,65,97,223,178,223,138,255,0,232,202,1,0,82,184,160,51,160,44,255,0,243,202,1,0,0,99,251,251,154,153,255,0,254,202,1,0,254,225,227,227,26,28,255,0,9,203,1,0,23,143,253,253,191,111,255,0,20,203,1,0,21,255,255,255,127,0,255,0,31,203,1,0,198,42,214,202,178,214,255,0,42,203,1,0,3,78,251,251,180,174,255,0,54,203,1,0,146,53,227,179,205,227,255,0,66,203,1,0,77,41,235,204,235,197,255,0,78,203,1,0,3,78,251,251,180,174,255,0,90,203,1,0,146,53,227,179,205,227,255,0,102,203,1,0,77,41,235,204,235,197,255,0,114,203,1,0,202,27,228,222,203,228,255,0,126,203,1,0,3,78,251,251,180,174,255,0,138,203,1,0,146,53,227,179,205,227,255,0,150,203,1,0,77,41,235,204,235,197,255,0,162,203,1,0,202,27,228,222,203,228,255,0,174,203,1,0,24,88,254,254,217,166,255,0,186,203,1,0,3,78,251,251,180,174,255,0,198,203,1,0,146,53,227,179,205,227,255,0,210,203,1,0,77,41,235,204,235,197,255,0,222,203,1,0,202,27,228,222,203,228,255,0,234,203,1,0,24,88,254,254,217,166,255,0,246,203,1,0,42,50,255,255,255,204,255,0,2,204,1,0,3,78,251,251,180,174,255,0,14,204,1,0,146,53,227,179,205,227,255,0,26,204,1,0,77,41,235,204,235,197,255,0,38,204,1,0,202,27,228,222,203,228,255,0,50,204,1,0,24,88,254,254,217,166,255,0,62,204,1,0,42,50,255,255,255,204,255,0,74,204,1,0,28,44,229,229,216,189,255,0,86,204,1,0,3,78,251,251,180,174,255,0,98,204,1,0,146,53,227,179,205,227,255,0,110,204,1,0,77,41,235,204,235,197,255,0,122,204,1,0,202,27,228,222,203,228,255,0,134,204,1,0,24,88,254,254,217,166,255,0,146,204,1,0,42,50,255,255,255,204,255,0,158,204,1,0,28,44,229,229,216,189,255,0,170,204,1,0,233,35,253,253,218,236,255,0,182,204,1,0,3,78,251,251,180,174,255,0,194,204,1,0,146,53,227,179,205,227,255,0,206,204,1,0,77,41,235,204,235,197,255,0,218,204,1,0,202,27,228,222,203,228,255,0,230,204,1,0,24,88,254,254,217,166,255,0,242,204,1,0,42,50,255,255,255,204,255,0,254,204,1,0,28,44,229,229,216,189,255,0,10,205,1,0,233,35,253,253,218,236,255,0,22,205,1,0,0,0,242,242,242,242,255,0,34,205,1,0,108,53,226,179,226,205,255,0,46,205,1,0,17,81,253,253,205,172,255,0,58,205,1,0,155,31,232,203,213,232,255,0,70,205,1,0,108,53,226,179,226,205,255,0,82,205,1,0,17,81,253,253,205,172,255,0,94,205,1,0,155,31,232,203,213,232,255,0,106,205,1,0,228,43,244,244,202,228,255,0,118,205,1,0,108,53,226,179,226,205,255,0,130,205,1,0,17,81,253,253,205,172,255,0,142,205,1,0,155,31,232,203,213,232,255,0,154,205,1,0,228,43,244,244,202,228,255,0,166,205,1,0,56,45,245,230,245,201,255,0,178,205,1,0,108,53,226,179,226,205,255,0,190,205,1,0,17,81,253,253,205,172,255,0,202,205,1,0,155,31,232,203,213,232,255,0,214,205,1,0,228,43,244,244,202,228,255,0,226,205,1,0,56,45,245,230,245,201,255,0,238,205,1,0,35,81,255,255,242,174,255,0,250,205,1,0,108,53,226,179,226,205,255,0,6,206,1,0,17,81,253,253,205,172,255,0,18,206,1,0,155,31,232,203,213,232,255,0,30,206,1,0,228,43,244,244,202,228,255,0,42,206,1,0,56,45,245,230,245,201,255,0,54,206,1,0,35,81,255,255,242,174,255,0,66,206,1,0,25,39,241,241,226,204,255,0,78,206,1,0,108,53,226,179,226,205,255,0,90,206,1,0,17,81,253,253,205,172,255,0,102,206,1,0,155,31,232,203,213,232,255,0,114,206,1,0,228,43,244,244,202,228,255,0,126,206,1,0,56,45,245,230,245,201,255,0,138,206,1,0,35,81,255,255,242,174,255,0,150,206,1,0,25,39,241,241,226,204,255,0,162,206,1,0,0,0,204,204,204,204,255,0,174,206,1,0,230,253,142,142,1,82,255,0,184,206,1,0,77,191,100,39,100,25,255,0,195,206,1,0,230,220,197,197,27,125,255,0,205,206,1,0,232,118,222,222,119,174,255,0,215,206,1,0,229,62,241,241,182,218,255,0,225,206,1,0,233,29,253,253,224,239,255,0,235,206,1,0,59,38,245,230,245,208,255,0,245,206,1,0,61,103,225,184,225,134,255,0,255,206,1,0,63,166,188,127,188,65,255,0,9,207,1,0,68,197,146,77,146,33,255,0,19,207,1,0,230,253,142,142,1,82,255,0,29,207,1,0,68,197,146,77,146,33,255,0,40,207,1,0,77,191,100,39,100,25,255,0,51,207,1,0,230,220,197,197,27,125,255,0,61,207,1,0,232,118,222,222,119,174,255,0,71,207,1,0,229,62,241,241,182,218,255,0,81,207,1,0,233,29,253,253,224,239,255,0,91,207,1,0,0,0,247,247,247,247,255,0,101,207,1,0,59,38,245,230,245,208,255,0,111,207,1,0,61,103,225,184,225,134,255,0,121,207,1,0,63,166,188,127,188,65,255,0,131,207,1,0,231,76,233,233,163,201,255,0,140,207,1,0,0,0,247,247,247,247,255,0,149,207,1,0,63,129,215,161,215,106,255,0,158,207,1,0,228,220,208,208,28,139,255,0,167,207,1,0,229,62,241,241,182,218,255,0,176,207,1,0,61,103,225,184,225,134,255,0,185,207,1,0,72,198,172,77,172,38,255,0,194,207,1,0,228,220,208,208,28,139,255,0,203,207,1,0,229,62,241,241,182,218,255,0,212,207,1,0,0,0,247,247,247,247,255,0,221,207,1,0,61,103,225,184,225,134,255,0,230,207,1,0,72,198,172,77,172,38,255,0,239,207,1,0,230,220,197,197,27,125,255,0,248,207,1,0,231,76,233,233,163,201,255,0,1,208,1,0,233,29,253,253,224,239,255,0,10,208,1,0,59,38,245,230,245,208,255,0,19,208,1,0,63,129,215,161,215,106,255,0,28,208,1,0,68,197,146,77,146,33,255,0,37,208,1,0,230,220,197,197,27,125,255,0,46,208,1,0,231,76,233,233,163,201,255,0,55,208,1,0,233,29,253,253,224,239,255,0,64,208,1,0,0,0,247,247,247,247,255,0,73,208,1,0,59,38,245,230,245,208,255,0,82,208,1,0,63,129,215,161,215,106,255,0,91,208,1,0,68,197,146,77,146,33,255,0,100,208,1,0,230,220,197,197,27,125,255,0,109,208,1,0,232,118,222,222,119,174,255,0,118,208,1,0,229,62,241,241,182,218,255,0,127,208,1,0,233,29,253,253,224,239,255,0,136,208,1,0,59,38,245,230,245,208,255,0,145,208,1,0,61,103,225,184,225,134,255,0,154,208,1,0,63,166,188,127,188,65,255,0,163,208,1,0,68,197,146,77,146,33,255,0,172,208,1,0,230,220,197,197,27,125,255,0,181,208,1,0,232,118,222,222,119,174,255,0,190,208,1,0,229,62,241,241,182,218,255,0,199,208,1,0,233,29,253,253,224,239,255,0,208,208,1,0,0,0,247,247,247,247,255,0,217,208,1,0,59,38,245,230,245,208,255,0,226,208,1,0,61,103,225,184,225,134,255,0,235,208,1,0,63,166,188,127,188,65,255,0,244,208,1,0,68,197,146,77,146,33,255,0,253,208,1,0,206,255,75,64,0,75,255,0,7,209,1,0,101,255,68,0,68,27,255,0,18,209,1,0,206,173,131,118,42,131,255,0,28,209,1,0,199,87,171,153,112,171,255,0,38,209,1,0,199,51,207,194,165,207,255,0,48,209,1,0,210,21,232,231,212,232,255,0,58,209,1,0,76,30,240,217,240,211,255,0,68,209,1,0,80,68,219,166,219,160,255,0,78,209,1,0,88,123,174,90,174,97,255,0,88,209,1,0,97,197,120,27,120,55,255,0,98,209,1,0,206,255,75,64,0,75,255,0,108,209,1,0,97,197,120,27,120,55,255,0,119,209,1,0,101,255,68,0,68,27,255,0,130,209,1,0,206,173,131,118,42,131,255,0,140,209,1,0,199,87,171,153,112,171,255,0,150,209,1,0,199,51,207,194,165,207,255,0,160,209,1,0,210,21,232,231,212,232,255,0,170,209,1,0,0,0,247,247,247,247,255,0,180,209,1,0,76,30,240,217,240,211,255,0,190,209,1,0,80,68,219,166,219,160,255,0,200,209,1,0,88,123,174,90,174,97,255,0,210,209,1,0,196,70,195,175,141,195,255,0,219,209,1,0,0,0,247,247,247,247,255,0,228,209,1,0,82,90,191,127,191,123,255,0,237,209,1,0,201,168,148,123,50,148,255,0,246,209,1,0,199,51,207,194,165,207,255,0,255,209,1,0,80,68,219,166,219,160,255,0,8,210,1,0,102,255,136,0,136,55,255,0,17,210,1,0,201,168,148,123,50,148,255,0,26,210,1,0,199,51,207,194,165,207,255,0,35,210,1,0,0,0,247,247,247,247,255,0,44,210,1,0,80,68,219,166,219,160,255,0,53,210,1,0,102,255,136,0,136,55,255,0,62,210,1,0,206,173,131,118,42,131,255,0,71,210,1,0,196,70,195,175,141,195,255,0,80,210,1,0,210,21,232,231,212,232,255,0,89,210,1,0,76,30,240,217,240,211,255,0,98,210,1,0,82,90,191,127,191,123,255,0,107,210,1,0,97,197,120,27,120,55,255,0,116,210,1,0,206,173,131,118,42,131,255,0,125,210,1,0,196,70,195,175,141,195,255,0,134,210,1,0,210,21,232,231,212,232,255,0,143,210,1,0,0,0,247,247,247,247,255,0,152,210,1,0,76,30,240,217,240,211,255,0,161,210,1,0,82,90,191,127,191,123,255,0,170,210,1,0,97,197,120,27,120,55,255,0,179,210,1,0,206,173,131,118,42,131,255,0,188,210,1,0,199,87,171,153,112,171,255,0,197,210,1,0,199,51,207,194,165,207,255,0,206,210,1,0,210,21,232,231,212,232,255,0,215,210,1,0,76,30,240,217,240,211,255,0,224,210,1,0,80,68,219,166,219,160,255,0,233,210,1,0,88,123,174,90,174,97,255,0,242,210,1,0,97,197,120,27,120,55,255,0,251,210,1,0,206,173,131,118,42,131,255,0,4,211,1,0,199,87,171,153,112,171,255,0,13,211,1,0,199,51,207,194,165,207,255,0,22,211,1,0,210,21,232,231,212,232,255,0,31,211,1,0,0,0,247,247,247,247,255,0,40,211,1,0,76,30,240,217,240,211,255,0,49,211,1,0,80,68,219,166,219,160,255,0,58,211,1,0,88,123,174,90,174,97,255,0,67,211,1,0,97,197,120,27,120,55,255,0,76,211,1,0,189,11,242,236,231,242,255,0,85,211,1,0,151,61,219,166,189,219,255,0,94,211,1,0,141,197,190,43,140,190,255,0,103,211,1,0,185,8,246,241,238,246,255,0,112,211,1,0,155,40,225,189,201,225,255,0,121,211,1,0,145,112,207,116,169,207,255,0,130,211,1,0,143,247,176,5,112,176,255,0,139,211,1,0,185,8,246,241,238,246,255,0,148,211,1,0,155,40,225,189,201,225,255,0,157,211,1,0,145,112,207,116,169,207,255,0,166,211,1,0,141,197,190,43,140,190,255,0,175,211,1,0,143,247,141,4,90,141,255,0,184,211,1,0,185,8,246,241,238,246,255,0,193,211,1,0,168,24,230,208,209,230,255,0,202,211,1,0,151,61,219,166,189,219,255,0,211,211,1,0,145,112,207,116,169,207,255,0,220,211,1,0,141,197,190,43,140,190,255,0,229,211,1,0,143,247,141,4,90,141,255,0,238,211,1,0,185,8,246,241,238,246,255,0,247,211,1,0,168,24,230,208,209,230,255,0,0,212,1,0,151,61,219,166,189,219,255,0,9,212,1,0,145,112,207,116,169,207,255,0,18,212,1,0,142,183,192,54,144,192,255,0,27,212,1,0,143,247,176,5,112,176,255,0,36,212,1,0,143,248,123,3,78,123,255,0,45,212,1,0,233,8,255,255,247,251,255,0,54,212,1,0,189,11,242,236,231,242,255,0,63,212,1,0,168,24,230,208,209,230,255,0,72,212,1,0,151,61,219,166,189,219,255,0,81,212,1,0,145,112,207,116,169,207,255,0,90,212,1,0,142,183,192,54,144,192,255,0,99,212,1,0,143,247,176,5,112,176,255,0,108,212,1,0,143,248,123,3,78,123,255,0,117,212,1,0,233,8,255,255,247,251,255,0,126,212,1,0,189,11,242,236,231,242,255,0,135,212,1,0,168,24,230,208,209,230,255,0,144,212,1,0,151,61,219,166,189,219,255,0,153,212,1,0,145,112,207,116,169,207,255,0,162,212,1,0,142,183,192,54,144,192,255,0,171,212,1,0,143,247,176,5,112,176,255,0,180,212,1,0,143,247,141,4,90,141,255,0,189,212,1,0,143,249,88,2,56,88,255,0,198,212,1,0,200,14,240,236,226,240,255,0,209,212,1,0,151,61,219,166,189,219,255,0,220,212,1,0,130,208,153,28,144,153,255,0,231,212,1,0,207,8,247,246,239,247,255,0,242,212,1,0,155,40,225,189,201,225,255,0,253,212,1,0,143,128,207,103,169,207,255,0,8,213,1,0,130,251,138,2,129,138,255,0,19,213,1,0,207,8,247,246,239,247,255,0,30,213,1,0,155,40,225,189,201,225,255,0,41,213,1,0,143,128,207,103,169,207,255,0,52,213,1,0,130,208,153,28,144,153,255,0,63,213,1,0,119,252,108,1,108,89,255,0,74,213,1,0,207,8,247,246,239,247,255,0,85,213,1,0,168,24,230,208,209,230,255,0,96,213,1,0,151,61,219,166,189,219,255,0,107,213,1,0,143,128,207,103,169,207,255,0,118,213,1,0,130,208,153,28,144,153,255,0,129,213,1,0,119,252,108,1,108,89,255,0,140,213,1,0,207,8,247,246,239,247,255,0,151,213,1,0,168,24,230,208,209,230,255,0,162,213,1,0,151,61,219,166,189,219,255,0,173,213,1,0,143,128,207,103,169,207,255,0,184,213,1,0,142,183,192,54,144,192,255,0,195,213,1,0,130,251,138,2,129,138,255,0,206,213,1,0,118,252,100,1,100,80,255,0,217,213,1,0,233,8,255,255,247,251,255,0,228,213,1,0,200,14,240,236,226,240,255,0,239,213,1,0,168,24,230,208,209,230,255,0,250,213,1,0,151,61,219,166,189,219,255,0,5,214,1,0,143,128,207,103,169,207,255,0,16,214,1,0,142,183,192,54,144,192,255,0,27,214,1,0,130,251,138,2,129,138,255,0,38,214,1,0,118,252,100,1,100,80,255,0,49,214,1,0,233,8,255,255,247,251,255,0,60,214,1,0,200,14,240,236,226,240,255,0,71,214,1,0,168,24,230,208,209,230,255,0,82,214,1,0,151,61,219,166,189,219,255,0,93,214,1,0,143,128,207,103,169,207,255,0,104,214,1,0,142,183,192,54,144,192,255,0,115,214,1,0,130,251,138,2,129,138,255,0,126,214,1,0,119,252,108,1,108,89,255,0,137,214,1,0,117,251,70,1,70,54,255,0,148,214,1,0,18,238,127,127,59,8,255,0,158,214,1,0,195,255,75,45,0,75,255,0,169,214,1,0,20,246,179,179,88,6,255,0,179,214,1,0,22,232,224,224,130,20,255,0,189,214,1,0,23,155,253,253,184,99,255,0,199,214,1,0,24,72,254,254,224,182,255,0,209,214,1,0,165,20,235,216,218,235,255,0,219,214,1,0,177,47,210,178,171,210,255,0,229,214,1,0,179,84,172,128,115,172,255,0,239,214,1,0,189,181,136,84,39,136,255,0,249,214,1,0,18,238,127,127,59,8,255,0,3,215,1,0,189,181,136,84,39,136,255,0,14,215,1,0,195,255,75,45,0,75,255,0,25,215,1,0,20,246,179,179,88,6,255,0,35,215,1,0,22,232,224,224,130,20,255,0,45,215,1,0,23,155,253,253,184,99,255,0,55,215,1,0,24,72,254,254,224,182,255,0,65,215,1,0,0,0,247,247,247,247,255,0,75,215,1,0,165,20,235,216,218,235,255,0,85,215,1,0,177,47,210,178,171,210,255,0,95,215,1,0,179,84,172,128,115,172,255,0,105,215,1,0,23,187,241,241,163,64,255,0,114,215,1,0,0,0,247,247,247,247,255,0,123,215,1,0,178,69,195,153,142,195,255,0,132,215,1,0,17,253,230,230,97,1,255,0,141,215,1,0,23,155,253,253,184,99,255,0,150,215,1,0,177,47,210,178,171,210,255,0,159,215,1,0,185,155,153,94,60,153,255,0,168,215,1,0,17,253,230,230,97,1,255,0,177,215,1,0,23,155,253,253,184,99,255,0,186,215,1,0,0,0,247,247,247,247,255,0,195,215,1,0,177,47,210,178,171,210,255,0,204,215,1,0,185,155,153,94,60,153,255,0,213,215,1,0,20,246,179,179,88,6,255,0,222,215,1,0,23,187,241,241,163,64,255,0,231,215,1,0,24,72,254,254,224,182,255,0,240,215,1,0,165,20,235,216,218,235,255,0,249,215,1,0,178,69,195,153,142,195,255,0,2,216,1,0,189,181,136,84,39,136,255,0,11,216,1,0,20,246,179,179,88,6,255,0,20,216,1,0,23,187,241,241,163,64,255,0,29,216,1,0,24,72,254,254,224,182,255,0,38,216,1,0,0,0,247,247,247,247,255,0,47,216,1,0,165,20,235,216,218,235,255,0,56,216,1,0,178,69,195,153,142,195,255,0,65,216,1,0,189,181,136,84,39,136,255,0,74,216,1,0,20,246,179,179,88,6,255,0,83,216,1,0,22,232,224,224,130,20,255,0,92,216,1,0,23,155,253,253,184,99,255,0,101,216,1,0,24,72,254,254,224,182,255,0,110,216,1,0,165,20,235,216,218,235,255,0,119,216,1,0,177,47,210,178,171,210,255,0,128,216,1,0,179,84,172,128,115,172,255,0,137,216,1,0,189,181,136,84,39,136,255,0,146,216,1,0,20,246,179,179,88,6,255,0,155,216,1,0,22,232,224,224,130,20,255,0,164,216,1,0,23,155,253,253,184,99,255,0,173,216,1,0,24,72,254,254,224,182,255,0,182,216,1,0,0,0,247,247,247,247,255,0,191,216,1,0,165,20,235,216,218,235,255,0,200,216,1,0,177,47,210,178,171,210,255,0,209,216,1,0,179,84,172,128,115,172,255,0,218,216,1,0,189,181,136,84,39,136,255,0,227,216,1,0,188,14,239,231,225,239,255,0,236,216,1,0,214,67,201,201,148,199,255,0,245,216,1,0,234,222,221,221,28,119,255,0,254,216,1,0,185,8,246,241,238,246,255,0,7,217,1,0,211,41,216,215,181,216,255,0,16,217,1,0,228,139,223,223,101,176,255,0,25,217,1,0,239,232,206,206,18,86,255,0,34,217,1,0,185,8,246,241,238,246,255,0,43,217,1,0,211,41,216,215,181,216,255,0,52,217,1,0,228,139,223,223,101,176,255,0,61,217,1,0,234,222,221,221,28,119,255,0,70,217,1,0,236,255,152,152,0,67,255,0,79,217,1,0,185,8,246,241,238,246,255,0,88,217,1,0,204,38,218,212,185,218,255,0,97,217,1,0,214,67,201,201,148,199,255,0,106,217,1,0,228,139,223,223,101,176,255,0,115,217,1,0,234,222,221,221,28,119,255,0,124,217,1,0,236,255,152,152,0,67,255,0,133,217,1,0,185,8,246,241,238,246,255,0,142,217,1,0,204,38,218,212,185,218,255,0,151,217,1,0,214,67,201,201,148,199,255,0,160,217,1,0,228,139,223,223,101,176,255,0,169,217,1,0,233,209,231,231,41,138,255,0,178,217,1,0,239,232,206,206,18,86,255,0,187,217,1,0,236,255,145,145,0,63,255,0,196,217,1,0,195,5,249,247,244,249,255,0,205,217,1,0,188,14,239,231,225,239,255,0,214,217,1,0,204,38,218,212,185,218,255,0,223,217,1,0,214,67,201,201,148,199,255,0,232,217,1,0,228,139,223,223,101,176,255,0,241,217,1,0,233,209,231,231,41,138,255,0,250,217,1,0,239,232,206,206,18,86,255,0,3,218,1,0,236,255,145,145,0,63,255,0,12,218,1,0,195,5,249,247,244,249,255,0,21,218,1,0,188,14,239,231,225,239,255,0,30,218,1,0,204,38,218,212,185,218,255,0,39,218,1,0,214,67,201,201,148,199,255,0,48,218,1,0,228,139,223,223,101,176,255,0,57,218,1,0,233,209,231,231,41,138,255,0,66,218,1,0,239,232,206,206,18,86,255,0,75,218,1,0,236,255,152,152,0,67,255,0,84,218,1,0,242,255,103,103,0,31,255,0,93,218,1,0,180,8,245,239,237,245,255,0,105,218,1,0,168,37,220,188,189,220,255,0,117,218,1,0,176,100,177,117,107,177,255,0,129,218,1,0,182,7,247,242,240,247,255,0,141,218,1,0,173,28,226,203,201,226,255,0,153,218,1,0,173,58,200,158,154,200,255,0,165,218,1,0,182,128,163,106,81,163,255,0,177,218,1,0,182,7,247,242,240,247,255,0,189,218,1,0,173,28,226,203,201,226,255,0,201,218,1,0,173,58,200,158,154,200,255,0,213,218,1,0,176,100,177,117,107,177,255,0,225,218,1,0,188,185,143,84,39,143,255,0,237,218,1,0,182,7,247,242,240,247,255,0,249,218,1,0,170,18,235,218,218,235,255,0,5,219,1,0,168,37,220,188,189,220,255,0,17,219,1,0,173,58,200,158,154,200,255,0,29,219,1,0,176,100,177,117,107,177,255,0,41,219,1,0,188,185,143,84,39,143,255,0,53,219,1,0,182,7,247,242,240,247,255,0,65,219,1,0,170,18,235,218,218,235,255,0,77,219,1,0,168,37,220,188,189,220,255,0,89,219,1,0,173,58,200,158,154,200,255,0,101,219,1,0,172,83,186,128,125,186,255,0,113,219,1,0,182,128,163,106,81,163,255,0,125,219,1,0,190,216,134,74,20,134,255,0,137,219,1,0,191,2,253,252,251,253,255,0,149,219,1,0,180,8,245,239,237,245,255,0,161,219,1,0,170,18,235,218,218,235,255,0,173,219,1,0,168,37,220,188,189,220,255,0,185,219,1,0,173,58,200,158,154,200,255,0,197,219,1,0,172,83,186,128,125,186,255,0,209,219,1,0,182,128,163,106,81,163,255,0,221,219,1,0,190,216,134,74,20,134,255,0,233,219,1,0,191,2,253,252,251,253,255,0,245,219,1,0,180,8,245,239,237,245,255,0,1,220,1,0,170,18,235,218,218,235,255,0,13,220,1,0,168,37,220,188,189,220,255,0,25,220,1,0,173,58,200,158,154,200,255,0,37,220,1,0,172,83,186,128,125,186,255,0,49,220,1,0,182,128,163,106,81,163,255,0,61,220,1,0,188,185,143,84,39,143,255,0,73,220,1,0,191,255,125,63,0,125,255,0,85,220,1,0,242,255,103,103,0,31,255,0,95,220,1,0,150,241,97,5,48,97,255,0,106,220,1,0,249,220,178,178,24,43,255,0,116,220,1,0,5,163,214,214,96,77,255,0,126,220,1,0,13,119,244,244,165,130,255,0,136,220,1,0,15,54,253,253,219,199,255,0,146,220,1,0,142,32,240,209,229,240,255,0,156,220,1,0,141,87,222,146,197,222,255,0,166,220,1,0,143,167,195,67,147,195,255,0,176,220,1,0,148,206,172,33,102,172,255,0,186,220,1,0,242,255,103,103,0,31,255,0,196,220,1,0,148,206,172,33,102,172,255,0,207,220,1,0,150,241,97,5,48,97,255,0,218,220,1,0,249,220,178,178,24,43,255,0,228,220,1,0,5,163,214,214,96,77,255,0,238,220,1,0,13,119,244,244,165,130,255,0,248,220,1,0,15,54,253,253,219,199,255,0,2,221,1,0,0,0,247,247,247,247,255,0,12,221,1,0,142,32,240,209,229,240,255,0,22,221,1,0,141,87,222,146,197,222,255,0,32,221,1,0,143,167,195,67,147,195,255,0,42,221,1,0,12,150,239,239,138,98,255,0,51,221,1,0,0,0,247,247,247,247,255,0,60,221,1,0,143,128,207,103,169,207,255,0,69,221,1,0,248,255,202,202,0,32,255,0,78,221,1,0,13,119,244,244,165,130,255,0,87,221,1,0,141,87,222,146,197,222,255,0,96,221,1,0,143,247,176,5,113,176,255,0,105,221,1,0,248,255,202,202,0,32,255,0,114,221,1,0,13,119,244,244,165,130,255,0,123,221,1,0,0,0,247,247,247,247,255,0,132,221,1,0,141,87,222,146,197,222,255,0,141,221,1,0,143,247,176,5,113,176,255,0,150,221,1,0,249,220,178,178,24,43,255,0,159,221,1,0,12,150,239,239,138,98,255,0,168,221,1,0,15,54,253,253,219,199,255,0,177,221,1,0,142,32,240,209,229,240,255,0,186,221,1,0,143,128,207,103,169,207,255,0,195,221,1,0,148,206,172,33,102,172,255,0,204,221,1,0,249,220,178,178,24,43,255,0,213,221,1,0,12,150,239,239,138,98,255,0,222,221,1,0,15,54,253,253,219,199,255,0,231,221,1,0,0,0,247,247,247,247,255,0,240,221,1,0,142,32,240,209,229,240,255,0,249,221,1,0,143,128,207,103,169,207,255,0,2,222,1,0,148,206,172,33,102,172,255,0,11,222,1,0,249,220,178,178,24,43,255,0,20,222,1,0,5,163,214,214,96,77,255,0,29,222,1,0,13,119,244,244,165,130,255,0,38,222,1,0,15,54,253,253,219,199,255,0,47,222,1,0,142,32,240,209,229,240,255,0,56,222,1,0,141,87,222,146,197,222,255,0,65,222,1,0,143,167,195,67,147,195,255,0,74,222,1,0,148,206,172,33,102,172,255,0,83,222,1,0,249,220,178,178,24,43,255,0,92,222,1,0,5,163,214,214,96,77,255,0,101,222,1,0,13,119,244,244,165,130,255,0,110,222,1,0,15,54,253,253,219,199,255,0,119,222,1,0,0,0,247,247,247,247,255,0,128,222,1,0,142,32,240,209,229,240,255,0,137,222,1,0,141,87,222,146,197,222,255,0,146,222,1,0,143,167,195,67,147,195,255,0,155,222,1,0,148,206,172,33,102,172,255,0,164,222,1,0,242,255,103,103,0,31,255,0,174,222,1,0,0,0,26,26,26,26,255,0,185,222,1,0,249,220,178,178,24,43,255,0,195,222,1,0,5,163,214,214,96,77,255,0,205,222,1,0,13,119,244,244,165,130,255,0,215,222,1,0,15,54,253,253,219,199,255,0,225,222,1,0,0,0,224,224,224,224,255,0,235,222,1,0,0,0,186,186,186,186,255,0,245,222,1,0,0,0,135,135,135,135,255,0,255,222,1,0,0,0,77,77,77,77,255,0,9,223,1,0,242,255,103,103,0,31,255,0,19,223,1,0,0,0,77,77,77,77,255,0,30,223,1,0,0,0,26,26,26,26,255,0,41,223,1,0,249,220,178,178,24,43,255,0,51,223,1,0,5,163,214,214,96,77,255,0,61,223,1,0,13,119,244,244,165,130,255,0,71,223,1,0,15,54,253,253,219,199,255,0,81,223,1,0,0,0,255,255,255,255,255,0,91,223,1,0,0,0,224,224,224,224,255,0,101,223,1,0,0,0,186,186,186,186,255,0,111,223,1,0,0,0,135,135,135,135,255,0,121,223,1,0,12,150,239,239,138,98,255,0,130,223,1,0,0,0,255,255,255,255,255,0,139,223,1,0,0,0,153,153,153,153,255,0,148,223,1,0,248,255,202,202,0,32,255,0,157,223,1,0,13,119,244,244,165,130,255,0,166,223,1,0,0,0,186,186,186,186,255,0,175,223,1,0,0,0,64,64,64,64,255,0,184,223,1,0,248,255,202,202,0,32,255,0,193,223,1,0,13,119,244,244,165,130,255,0,202,223,1,0,0,0,255,255,255,255,255,0,211,223,1,0,0,0,186,186,186,186,255,0,220,223,1,0,0,0,64,64,64,64,255,0,229,223,1,0,249,220,178,178,24,43,255,0,238,223,1,0,12,150,239,239,138,98,255,0,247,223,1,0,15,54,253,253,219,199,255,0,0,224,1,0,0,0,224,224,224,224,255,0,9,224,1,0,0,0,153,153,153,153,255,0,18,224,1,0,0,0,77,77,77,77,255,0,27,224,1,0,249,220,178,178,24,43,255,0,36,224,1,0,12,150,239,239,138,98,255,0,45,224,1,0,15,54,253,253,219,199,255,0,54,224,1,0,0,0,255,255,255,255,255,0,63,224,1,0,0,0,224,224,224,224,255,0,72,224,1,0,0,0,153,153,153,153,255,0,81,224,1,0,0,0,77,77,77,77,255,0,90,224,1,0,249,220,178,178,24,43,255,0,99,224,1,0,5,163,214,214,96,77,255,0,108,224,1,0,13,119,244,244,165,130,255,0,117,224,1,0,15,54,253,253,219,199,255,0,126,224,1,0,0,0,224,224,224,224,255,0,135,224,1,0,0,0,186,186,186,186,255,0,144,224,1,0,0,0,135,135,135,135,255,0,153,224,1,0,0,0,77,77,77,77,255,0,162,224,1,0,249,220,178,178,24,43,255,0,171,224,1,0,5,163,214,214,96,77,255,0,180,224,1,0,13,119,244,244,165,130,255,0,189,224,1,0,15,54,253,253,219,199,255,0,198,224,1,0,0,0,255,255,255,255,255,0,207,224,1,0,0,0,224,224,224,224,255,0,216,224,1,0,0,0,186,186,186,186,255,0,225,224,1,0,0,0,135,135,135,135,255,0,234,224,1,0,0,0,77,77,77,77,255,0,243,224,1,0,3,32,253,253,224,221,255,0,252,224,1,0,244,92,250,250,159,181,255,0,5,225,1,0,227,220,197,197,27,138,255,0,14,225,1,0,13,28,254,254,235,226,255,0,23,225,1,0,252,72,251,251,180,185,255,0,32,225,1,0,238,147,247,247,104,161,255,0,41,225,1,0,224,253,174,174,1,126,255,0,50,225,1,0,13,28,254,254,235,226,255,0,59,225,1,0,252,72,251,251,180,185,255,0,68,225,1,0,238,147,247,247,104,161,255,0,77,225,1,0,227,220,197,197,27,138,255,0,86,225,1,0,213,252,122,122,1,119,255,0,95,225,1,0,13,28,254,254,235,226,255,0,104,225,1,0,3,60,252,252,197,192,255,0,113,225,1,0,244,92,250,250,159,181,255,0,122,225,1,0,238,147,247,247,104,161,255,0,131,225,1,0,227,220,197,197,27,138,255,0,140,225,1,0,213,252,122,122,1,119,255,0,149,225,1,0,13,28,254,254,235,226,255,0,158,225,1,0,3,60,252,252,197,192,255,0,167,225,1,0,244,92,250,250,159,181,255,0,176,225,1,0,238,147,247,247,104,161,255,0,185,225,1,0,230,195,221,221,52,151,255,0,194,225,1,0,224,253,174,174,1,126,255,0,203,225,1,0,213,252,122,122,1,119,255,0,212,225,1,0,14,12,255,255,247,243,255,0,221,225,1,0,3,32,253,253,224,221,255,0,230,225,1,0,3,60,252,252,197,192,255,0,239,225,1,0,244,92,250,250,159,181,255,0,248,225,1,0,238,147,247,247,104,161,255,0,1,226,1,0,230,195,221,221,52,151,255,0,10,226,1,0,224,253,174,174,1,126,255,0,19,226,1,0,213,252,122,122,1,119,255,0,28,226,1,0,14,12,255,255,247,243,255,0,37,226,1,0,3,32,253,253,224,221,255,0,46,226,1,0,3,60,252,252,197,192,255,0,55,226,1,0,244,92,250,250,159,181,255,0,64,226,1,0,238,147,247,247,104,161,255,0,73,226,1,0,230,195,221,221,52,151,255,0,82,226,1,0,224,253,174,174,1,126,255,0,91,226,1,0,213,252,122,122,1,119,255,0,100,226,1,0,199,255,106,73,0,106,255,0,109,226,1,0,245,255,165,165,0,38,255,0,121,226,1,0,167,171,149,49,54,149,255,0,134,226,1,0,2,208,215,215,48,39,255,0,146,226,1,0,10,184,244,244,109,67,255,0,158,226,1,0,20,157,253,253,174,97,255,0,170,226,1,0,30,110,254,254,224,144,255,0,182,226,1,0,136,24,248,224,243,248,255,0,194,226,1,0,138,67,233,171,217,233,255,0,206,226,1,0,143,113,209,116,173,209,255,0,218,226,1,0,151,157,180,69,117,180,255,0,230,226,1,0,245,255,165,165,0,38,255,0,242,226,1,0,151,157,180,69,117,180,255,0,255,226,1,0,167,171,149,49,54,149,255,0,12,227,1,0,2,208,215,215,48,39,255,0,24,227,1,0,10,184,244,244,109,67,255,0,36,227,1,0,20,157,253,253,174,97,255,0,48,227,1,0,30,110,254,254,224,144,255,0,60,227,1,0,42,64,255,255,255,191,255,0,72,227,1,0,136,24,248,224,243,248,255,0,84,227,1,0,138,67,233,171,217,233,255,0,96,227,1,0,143,113,209,116,173,209,255,0,108,227,1,0,13,164,252,252,141,89,255,0,119,227,1,0,42,64,255,255,255,191,255,0,130,227,1,0,143,86,219,145,191,219,255,0,141,227,1,0,254,225,215,215,25,28,255,0,152,227,1,0,20,157,253,253,174,97,255,0,163,227,1,0,138,67,233,171,217,233,255,0,174,227,1,0,145,193,182,44,123,182,255,0,185,227,1,0,254,225,215,215,25,28,255,0,196,227,1,0,20,157,253,253,174,97,255,0,207,227,1,0,42,64,255,255,255,191,255,0,218,227,1,0,138,67,233,171,217,233,255,0,229,227,1,0,145,193,182,44,123,182,255,0,240,227,1,0,2,208,215,215,48,39,255,0,251,227,1,0,13,164,252,252,141,89,255,0,6,228,1,0,30,110,254,254,224,144,255,0,17,228,1,0,136,24,248,224,243,248,255,0,28,228,1,0,143,86,219,145,191,219,255,0,39,228,1,0,151,157,180,69,117,180,255,0,50,228,1,0,2,208,215,215,48,39,255,0,61,228,1,0,13,164,252,252,141,89,255,0,72,228,1,0,30,110,254,254,224,144,255,0,83,228,1,0,42,64,255,255,255,191,255,0,94,228,1,0,136,24,248,224,243,248,255,0,105,228,1,0,143,86,219,145,191,219,255,0,116,228,1,0,151,157,180,69,117,180,255,0,127,228,1,0,2,208,215,215,48,39,255,0,138,228,1,0,10,184,244,244,109,67,255,0,149,228,1,0,20,157,253,253,174,97,255,0,160,228,1,0,30,110,254,254,224,144,255,0,171,228,1,0,136,24,248,224,243,248,255,0,182,228,1,0,138,67,233,171,217,233,255,0,193,228,1,0,143,113,209,116,173,209,255,0,204,228,1,0,151,157,180,69,117,180,255,0,215,228,1,0,2,208,215,215,48,39,255,0,226,228,1,0,10,184,244,244,109,67,255,0,237,228,1,0,20,157,253,253,174,97,255,0,248,228,1,0,30,110,254,254,224,144,255,0,3,229,1,0,42,64,255,255,255,191,255,0,14,229,1,0,136,24,248,224,243,248,255,0,25,229,1,0,138,67,233,171,217,233,255,0,36,229,1,0,143,113,209,116,173,209,255,0,47,229,1,0,151,157,180,69,117,180,255,0,58,229,1,0,245,255,165,165,0,38,255,0,70,229,1,0,107,255,104,0,104,55,255,0,83,229,1,0,2,208,215,215,48,39,255,0,95,229,1,0,10,184,244,244,109,67,255,0,107,229,1,0,20,157,253,253,174,97,255,0,119,229,1,0,31,115,254,254,224,139,255,0,131,229,1,0,51,106,239,217,239,139,255,0,143,229,1,0,62,130,217,166,217,106,255,0,155,229,1,0,83,121,189,102,189,99,255,0,167,229,1,0,103,211,152,26,152,80,255,0,179,229,1,0,245,255,165,165,0,38,255,0,191,229,1,0,103,211,152,26,152,80,255,0,204,229,1,0,107,255,104,0,104,55,255,0,217,229,1,0,2,208,215,215,48,39,255,0,229,229,1,0,10,184,244,244,109,67,255,0,241,229,1,0,20,157,253,253,174,97,255,0,253,229,1,0,31,115,254,254,224,139,255,0,9,230,1,0,42,64,255,255,255,191,255,0,21,230,1,0,51,106,239,217,239,139,255,0,33,230,1,0,62,130,217,166,217,106,255,0,45,230,1,0,83,121,189,102,189,99,255,0,57,230,1,0,13,164,252,252,141,89,255,0,68,230,1,0,42,64,255,255,255,191,255,0,79,230,1,0,66,136,207,145,207,96,255,0,90,230,1,0,254,225,215,215,25,28,255,0,101,230,1,0,20,157,253,253,174,97,255,0,112,230,1,0,62,130,217,166,217,106,255,0,123,230,1,0,98,210,150,26,150,65,255,0,134,230,1,0,254,225,215,215,25,28,255,0,145,230,1,0,20,157,253,253,174,97,255,0,156,230,1,0,42,64,255,255,255,191,255,0,167,230,1,0,62,130,217,166,217,106,255,0,178,230,1,0,98,210,150,26,150,65,255,0,189,230,1,0,2,208,215,215,48,39,255,0,200,230,1,0,13,164,252,252,141,89,255,0,211,230,1,0,31,115,254,254,224,139,255,0,222,230,1,0,51,106,239,217,239,139,255,0,233,230,1,0,66,136,207,145,207,96,255,0,244,230,1,0,103,211,152,26,152,80,255,0,255,230,1,0,2,208,215,215,48,39,255,0,10,231,1,0,13,164,252,252,141,89,255,0,21,231,1,0,31,115,254,254,224,139,255,0,32,231,1,0,42,64,255,255,255,191,255,0,43,231,1,0,51,106,239,217,239,139,255,0,54,231,1,0,66,136,207,145],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+30724);allocate([207,96,255,0,65,231,1,0,103,211,152,26,152,80,255,0,76,231,1,0,2,208,215,215,48,39,255,0,87,231,1,0,10,184,244,244,109,67,255,0,98,231,1,0,20,157,253,253,174,97,255,0,109,231,1,0,31,115,254,254,224,139,255,0,120,231,1,0,51,106,239,217,239,139,255,0,131,231,1,0,62,130,217,166,217,106,255,0,142,231,1,0,83,121,189,102,189,99,255,0,153,231,1,0,103,211,152,26,152,80,255,0,164,231,1,0,2,208,215,215,48,39,255,0,175,231,1,0,10,184,244,244,109,67,255,0,186,231,1,0,20,157,253,253,174,97,255,0,197,231,1,0,31,115,254,254,224,139,255,0,208,231,1,0,42,64,255,255,255,191,255,0,219,231,1,0,51,106,239,217,239,139,255,0,230,231,1,0,62,130,217,166,217,106,255,0,241,231,1,0,83,121,189,102,189,99,255,0,252,231,1,0,103,211,152,26,152,80,255,0,7,232,1,0,13,44,254,254,224,210,255,0,16,232,1,0,9,139,252,252,146,114,255,0,25,232,1,0,1,211,222,222,45,38,255,0,34,232,1,0,13,37,254,254,229,217,255,0,43,232,1,0,11,108,252,252,174,145,255,0,52,232,1,0,7,179,251,251,106,74,255,0,61,232,1,0,253,224,203,203,24,29,255,0,70,232,1,0,13,37,254,254,229,217,255,0,79,232,1,0,11,108,252,252,174,145,255,0,88,232,1,0,7,179,251,251,106,74,255,0,97,232,1,0,1,211,222,222,45,38,255,0,106,232,1,0,253,231,165,165,15,21,255,0,115,232,1,0,13,37,254,254,229,217,255,0,124,232,1,0,12,92,252,252,187,161,255,0,133,232,1,0,9,139,252,252,146,114,255,0,142,232,1,0,7,179,251,251,106,74,255,0,151,232,1,0,1,211,222,222,45,38,255,0,160,232,1,0,253,231,165,165,15,21,255,0,169,232,1,0,13,37,254,254,229,217,255,0,178,232,1,0,12,92,252,252,187,161,255,0,187,232,1,0,9,139,252,252,146,114,255,0,196,232,1,0,7,179,251,251,106,74,255,0,205,232,1,0,3,208,239,239,59,44,255,0,214,232,1,0,253,224,203,203,24,29,255,0,223,232,1,0,251,255,153,153,0,13,255,0,232,232,1,0,14,15,255,255,245,240,255,0,241,232,1,0,13,44,254,254,224,210,255,0,250,232,1,0,12,92,252,252,187,161,255,0,3,233,1,0,9,139,252,252,146,114,255,0,12,233,1,0,7,179,251,251,106,74,255,0,21,233,1,0,3,208,239,239,59,44,255,0,30,233,1,0,253,224,203,203,24,29,255,0,39,233,1,0,251,255,153,153,0,13,255,0,48,233,1,0,14,15,255,255,245,240,255,0,57,233,1,0,13,44,254,254,224,210,255,0,66,233,1,0,12,92,252,252,187,161,255,0,75,233,1,0,9,139,252,252,146,114,255,0,84,233,1,0,7,179,251,251,106,74,255,0,93,233,1,0,3,208,239,239,59,44,255,0,102,233,1,0,253,224,203,203,24,29,255,0,111,233,1,0,253,231,165,165,15,21,255,0,120,233,1,0,249,255,103,103,0,13,255,0,129,233,1,0,254,225,228,228,26,28,255,0,138,233,1,0,146,178,184,55,126,184,255,0,147,233,1,0,83,147,175,77,175,74,255,0,156,233,1,0,254,225,228,228,26,28,255,0,165,233,1,0,146,178,184,55,126,184,255,0,174,233,1,0,83,147,175,77,175,74,255,0,183,233,1,0,207,132,163,152,78,163,255,0,192,233,1,0,254,225,228,228,26,28,255,0,201,233,1,0,146,178,184,55,126,184,255,0,210,233,1,0,83,147,175,77,175,74,255,0,219,233,1,0,207,132,163,152,78,163,255,0,228,233,1,0,21,255,255,255,127,0,255,0,237,233,1,0,254,225,228,228,26,28,255,0,246,233,1,0,146,178,184,55,126,184,255,0,255,233,1,0,83,147,175,77,175,74,255,0,8,234,1,0,207,132,163,152,78,163,255,0,17,234,1,0,21,255,255,255,127,0,255,0,26,234,1,0,42,204,255,255,255,51,255,0,35,234,1,0,254,225,228,228,26,28,255,0,44,234,1,0,146,178,184,55,126,184,255,0,53,234,1,0,83,147,175,77,175,74,255,0,62,234,1,0,207,132,163,152,78,163,255,0,71,234,1,0,21,255,255,255,127,0,255,0,80,234,1,0,42,204,255,255,255,51,255,0,89,234,1,0,15,193,166,166,86,40,255,0,98,234,1,0,254,225,228,228,26,28,255,0,107,234,1,0,146,178,184,55,126,184,255,0,116,234,1,0,83,147,175,77,175,74,255,0,125,234,1,0,207,132,163,152,78,163,255,0,134,234,1,0,21,255,255,255,127,0,255,0,143,234,1,0,42,204,255,255,255,51,255,0,152,234,1,0,15,193,166,166,86,40,255,0,161,234,1,0,232,121,247,247,129,191,255,0,170,234,1,0,254,225,228,228,26,28,255,0,179,234,1,0,146,178,184,55,126,184,255,0,188,234,1,0,83,147,175,77,175,74,255,0,197,234,1,0,207,132,163,152,78,163,255,0,206,234,1,0,21,255,255,255,127,0,255,0,215,234,1,0,42,204,255,255,255,51,255,0,224,234,1,0,15,193,166,166,86,40,255,0,233,234,1,0,232,121,247,247,129,191,255,0,242,234,1,0,0,0,153,153,153,153,255,0,251,234,1,0,114,120,194,102,194,165,255,0,4,235,1,0,11,155,252,252,141,98,255,0,13,235,1,0,156,77,203,141,160,203,255,0,22,235,1,0,114,120,194,102,194,165,255,0,31,235,1,0,11,155,252,252,141,98,255,0,40,235,1,0,156,77,203,141,160,203,255,0,49,235,1,0,228,102,231,231,138,195,255,0,58,235,1,0,114,120,194,102,194,165,255,0,67,235,1,0,11,155,252,252,141,98,255,0,76,235,1,0,156,77,203,141,160,203,255,0,85,235,1,0,228,102,231,231,138,195,255,0,94,235,1,0,58,155,216,166,216,84,255,0,103,235,1,0,114,120,194,102,194,165,255,0,112,235,1,0,11,155,252,252,141,98,255,0,121,235,1,0,156,77,203,141,160,203,255,0,130,235,1,0,228,102,231,231,138,195,255,0,139,235,1,0,58,155,216,166,216,84,255,0,148,235,1,0,34,208,255,255,217,47,255,0,157,235,1,0,114,120,194,102,194,165,255,0,166,235,1,0,11,155,252,252,141,98,255,0,175,235,1,0,156,77,203,141,160,203,255,0,184,235,1,0,228,102,231,231,138,195,255,0,193,235,1,0,58,155,216,166,216,84,255,0,202,235,1,0,34,208,255,255,217,47,255,0,211,235,1,0,25,90,229,229,196,148,255,0,220,235,1,0,114,120,194,102,194,165,255,0,229,235,1,0,11,155,252,252,141,98,255,0,238,235,1,0,156,77,203,141,160,203,255,0,247,235,1,0,228,102,231,231,138,195,255,0,0,236,1,0,58,155,216,166,216,84,255,0,9,236,1,0,34,208,255,255,217,47,255,0,18,236,1,0,25,90,229,229,196,148,255,0,27,236,1,0,0,0,179,179,179,179,255,0,36,236,1,0,120,84,211,141,211,199,255,0,46,236,1,0,211,82,189,188,128,189,255,0,57,236,1,0,42,76,255,255,255,179,255,0,67,236,1,0,175,37,218,190,186,218,255,0,77,236,1,0,4,139,251,251,128,114,255,0,87,236,1,0,144,100,211,128,177,211,255,0,97,236,1,0,22,156,253,253,180,98,255,0,107,236,1,0,58,134,222,179,222,105,255,0,117,236,1,0,233,47,252,252,205,229,255,0,127,236,1,0,0,0,217,217,217,217,255,0,137,236,1,0,120,84,211,141,211,199,255,0,147,236,1,0,211,82,189,188,128,189,255,0,158,236,1,0,77,41,235,204,235,197,255,0,169,236,1,0,42,76,255,255,255,179,255,0,179,236,1,0,175,37,218,190,186,218,255,0,189,236,1,0,4,139,251,251,128,114,255,0,199,236,1,0,144,100,211,128,177,211,255,0,209,236,1,0,22,156,253,253,180,98,255,0,219,236,1,0,58,134,222,179,222,105,255,0,229,236,1,0,233,47,252,252,205,229,255,0,239,236,1,0,0,0,217,217,217,217,255,0,249,236,1,0,120,84,211,141,211,199,255,0,3,237,1,0,211,82,189,188,128,189,255,0,14,237,1,0,77,41,235,204,235,197,255,0,25,237,1,0,37,144,255,255,237,111,255,0,36,237,1,0,42,76,255,255,255,179,255,0,46,237,1,0,175,37,218,190,186,218,255,0,56,237,1,0,4,139,251,251,128,114,255,0,66,237,1,0,144,100,211,128,177,211,255,0,76,237,1,0,22,156,253,253,180,98,255,0,86,237,1,0,58,134,222,179,222,105,255,0,96,237,1,0,233,47,252,252,205,229,255,0,106,237,1,0,0,0,217,217,217,217,255,0,116,237,1,0,120,84,211,141,211,199,255,0,125,237,1,0,42,76,255,255,255,179,255,0,134,237,1,0,175,37,218,190,186,218,255,0,143,237,1,0,120,84,211,141,211,199,255,0,152,237,1,0,42,76,255,255,255,179,255,0,161,237,1,0,175,37,218,190,186,218,255,0,170,237,1,0,4,139,251,251,128,114,255,0,179,237,1,0,120,84,211,141,211,199,255,0,188,237,1,0,42,76,255,255,255,179,255,0,197,237,1,0,175,37,218,190,186,218,255,0,206,237,1,0,4,139,251,251,128,114,255,0,215,237,1,0,144,100,211,128,177,211,255,0,224,237,1,0,120,84,211,141,211,199,255,0,233,237,1,0,42,76,255,255,255,179,255,0,242,237,1,0,175,37,218,190,186,218,255,0,251,237,1,0,4,139,251,251,128,114,255,0,4,238,1,0,144,100,211,128,177,211,255,0,13,238,1,0,22,156,253,253,180,98,255,0,22,238,1,0,120,84,211,141,211,199,255,0,31,238,1,0,42,76,255,255,255,179,255,0,40,238,1,0,175,37,218,190,186,218,255,0,49,238,1,0,4,139,251,251,128,114,255,0,58,238,1,0,144,100,211,128,177,211,255,0,67,238,1,0,22,156,253,253,180,98,255,0,76,238,1,0,58,134,222,179,222,105,255,0,85,238,1,0,120,84,211,141,211,199,255,0,94,238,1,0,42,76,255,255,255,179,255,0,103,238,1,0,175,37,218,190,186,218,255,0,112,238,1,0,4,139,251,251,128,114,255,0,121,238,1,0,144,100,211,128,177,211,255,0,130,238,1,0,22,156,253,253,180,98,255,0,139,238,1,0,58,134,222,179,222,105,255,0,148,238,1,0,233,47,252,252,205,229,255,0,157,238,1,0,120,84,211,141,211,199,255,0,166,238,1,0,42,76,255,255,255,179,255,0,175,238,1,0,175,37,218,190,186,218,255,0,184,238,1,0,4,139,251,251,128,114,255,0,193,238,1,0,144,100,211,128,177,211,255,0,202,238,1,0,22,156,253,253,180,98,255,0,211,238,1,0,58,134,222,179,222,105,255,0,220,238,1,0,233,47,252,252,205,229,255,0,229,238,1,0,0,0,217,217,217,217,255,0,238,238,1,0,237,253,158,158,1,66,255,0,252,238,1,0,177,130,162,94,79,162,255,0,11,239,1,0,250,180,213,213,62,79,255,0,25,239,1,0,10,184,244,244,109,67,255,0,39,239,1,0,20,157,253,253,174,97,255,0,53,239,1,0,31,115,254,254,224,139,255,0,67,239,1,0,49,96,245,230,245,152,255,0,81,239,1,0,79,65,221,171,221,164,255,0,95,239,1,0,114,120,194,102,194,165,255,0,109,239,1,0,143,187,189,50,136,189,255,0,123,239,1,0,237,253,158,158,1,66,255,0,137,239,1,0,143,187,189,50,136,189,255,0,152,239,1,0,177,130,162,94,79,162,255,0,167,239,1,0,250,180,213,213,62,79,255,0,181,239,1,0,10,184,244,244,109,67,255,0,195,239,1,0,20,157,253,253,174,97,255,0,209,239,1,0,31,115,254,254,224,139,255,0,223,239,1,0,42,64,255,255,255,191,255,0,237,239,1,0,49,96,245,230,245,152,255,0,251,239,1,0,79,65,221,171,221,164,255,0,9,240,1,0,114,120,194,102,194,165,255,0,23,240,1,0,13,164,252,252,141,89,255,0,36,240,1,0,42,64,255,255,255,191,255,0,49,240,1,0,81,77,213,153,213,148,255,0,62,240,1,0,254,225,215,215,25,28,255,0,75,240,1,0,20,157,253,253,174,97,255,0,88,240,1,0,79,65,221,171,221,164,255,0,101,240,1,0,143,196,186,43,131,186,255,0,114,240,1,0,254,225,215,215,25,28,255,0,127,240,1,0,20,157,253,253,174,97,255,0,140,240,1,0,42,64,255,255,255,191,255,0,153,240,1,0,79,65,221,171,221,164,255,0,166,240,1,0,143,196,186,43,131,186,255,0,179,240,1,0,250,180,213,213,62,79,255,0,192,240,1,0,13,164,252,252,141,89,255,0,205,240,1,0,31,115,254,254,224,139,255,0,218,240,1,0,49,96,245,230,245,152,255,0,231,240,1,0,81,77,213,153,213,148,255,0,244,240,1,0,143,187,189,50,136,189,255,0,1,241,1,0,250,180,213,213,62,79,255,0,14,241,1,0,13,164,252,252,141,89,255,0,27,241,1,0,31,115,254,254,224,139,255,0,40,241,1,0,42,64,255,255,255,191,255,0,53,241,1,0,49,96,245,230,245,152,255,0,66,241,1,0,81,77,213,153,213,148,255,0,79,241,1,0,143,187,189,50,136,189,255,0,92,241,1,0,250,180,213,213,62,79,255,0,105,241,1,0,10,184,244,244,109,67,255,0,118,241,1,0,20,157,253,253,174,97,255,0,131,241,1,0,31,115,254,254,224,139,255,0,144,241,1,0,49,96,245,230,245,152,255,0,157,241,1,0,79,65,221,171,221,164,255,0,170,241,1,0,114,120,194,102,194,165,255,0,183,241,1,0,143,187,189,50,136,189,255,0,196,241,1,0,250,180,213,213,62,79,255,0,209,241,1,0,10,184,244,244,109,67,255,0,222,241,1,0,20,157,253,253,174,97,255,0,235,241,1,0,31,115,254,254,224,139,255,0,248,241,1,0,42,64,255,255,255,191,255,0,5,242,1,0,49,96,245,230,245,152,255,0,18,242,1,0,79,65,221,171,221,164,255,0,31,242,1,0,114,120,194,102,194,165,255,0,44,242,1,0,143,187,189,50,136,189,255,0,57,242,1,0,147,15,255,240,248,255,255,0,72,242,1,0,24,35,250,250,235,215,255,0,90,242,1,0,127,255,255,0,255,255,255,0,100,242,1,0,113,128,255,127,255,212,255,0,116,242,1,0,127,15,255,240,255,255,255,0,127,242,1,0,42,26,245,245,245,220,255,0,138,242,1,0,23,58,255,255,228,196,255,0,150,242,1,0,0,0,0,0,0,0,255,0,161,242,1,0,25,49,255,255,235,205,255,0,181,242,1,0,170,255,255,0,0,255,255,0,191,242,1,0,192,206,226,138,43,226,255,0,207,242,1,0,0,190,165,165,42,42,255,0,218,242,1,0,23,99,222,222,184,135,255,0,233,242,1,0,128,103,160,95,158,160,255,0,248,242,1,0,63,255,255,127,255,0,255,0,8,243,1,0,17,218,210,210,105,30,255,0,23,243,1,0,11,175,255,255,127,80,255,0,34,243,1,0,154,147,237,100,149,237,255,0,54,243,1,0,33,34,255,255,248,220,255,0,68,243,1,0,246,231,220,220,20,60,255,0,81,243,1,0,127,255,255,0,255,255,255,0,91,243,1,0,170,255,139,0,0,139,255,0,105,243,1,0,127,255,139,0,139,139,255,0,119,243,1,0,30,239,184,184,134,11,255,0,138,243,1,0,0,0,169,169,169,169,255,0,152,243,1,0,85,255,100,0,100,0,255,0,167,243,1,0,0,0,169,169,169,169,255,0,181,243,1,0,39,110,189,189,183,107,255,0,196,243,1,0,212,255,139,139,0,139,255,0,213,243,1,0,58,142,107,85,107,47,255,0,233,243,1,0,23,255,255,255,140,0,255,0,249,243,1,0,198,192,204,153,50,204,255,0,9,244,1,0,0,255,139,139,0,0,255,0,22,244,1,0,10,121,233,233,150,122,255,0,38,244,1,0,85,61,188,143,188,143,255,0,56,244,1,0,175,143,139,72,61,139,255,0,75,244,1,0,127,103,79,47,79,79,255,0,94,244,1,0,127,103,79,47,79,79,255,0,113,244,1,0,128,255,209,0,206,209,255,0,132,244,1,0,199,255,211,148,0,211,255,0,148,244,1,0,232,235,255,255,20,147,255,0,162,244,1,0,138,255,255,0,191,255,255,0,179,244,1,0,0,0,105,105,105,105,255,0,192,244,1,0,0,0,105,105,105,105,255,0,205,244,1,0,148,225,255,30,144,255,255,0,221,244,1,0,0,206,178,178,34,34,255,0,236,244,1,0,28,15,255,255,250,240,255,0,253,244,1,0,85,192,139,34,139,34,255,0,14,245,1,0,212,255,255,255,0,255,255,0,27,245,1,0,0,0,220,220,220,220,255,0,42,245,1,0,170,7,255,248,248,255,255,0,58,245,1,0,35,255,255,255,215,0,255,0,68,245,1,0,30,217,218,218,165,32,255,0,83,245,1,0,0,0,128,128,128,128,255,0,93,245,1,0,85,255,128,0,128,0,255,0,104,245,1,0,59,208,255,173,255,47,255,0,121,245,1,0,0,0,128,128,128,128,255,0,131,245,1,0,85,15,255,240,255,240,255,0,145,245,1,0,233,150,255,255,105,180,255,0,158,245,1,0,0,140,205,205,92,92,255,0,173,245,1,0,194,255,130,75,0,130,255,0,185,245,1,0,42,15,255,255,255,240,255,0,196,245,1,0,38,106,240,240,230,140,255,0,207,245,1,0,170,20,250,230,230,250,255,0,221,245,1,0,240,15,255,255,240,245,255,0,240,245,1,0,64,255,252,124,252,0,255,0,255,245,1,0,38,49,255,255,250,205,255,0,17,246,1,0,137,63,230,173,216,230,255,0,32,246,1,0,0,119,240,240,128,128,255,0,48,246,1,0,127,31,255,224,255,255,255,0,63,246,1,0,42,40,250,250,250,210,255,0,89,246,1,0,0,0,211,211,211,211,255,0,104,246,1,0,85,100,238,144,238,144,255,0,120,246,1,0,0,0,211,211,211,211,255,0,135,246,1,0,248,73,255,255,182,193,255,0,150,246,1,0,12,132,255,255,160,122,255,0,167,246,1,0,125,209,178,32,178,170,255,0,186,246,1,0,143,117,250,135,206,250,255,0,204,246,1,0,148,56,153,119,136,153,255,0,224,246,1,0,148,56,153,119,136,153,255,0,244,246,1,0,151,52,222,176,196,222,255,0,8,247,1,0,42,31,255,255,255,224,255,0,25,247,1,0,85,255,255,0,255,0,255,0,35,247,1,0,85,192,205,50,205,50,255,0,50,247,1,0,21,20,250,250,240,230,255,0,61,247,1,0,212,255,255,255,0,255,255,0,74,247,1,0,0,255,128,128,0,0,255,0,86,247,1,0,113,128,205,102,205,170,255,0,108,247,1,0,170,255,205,0,0,205,255,0,124,247,1,0,204,152,211,186,85,211,255,0,142,247,1,0,183,124,219,147,112,219,255,0,160,247,1,0,103,169,179,60,179,113,255,0,180,247,1,0,176,143,238,123,104,238,255,0,201,247,1,0,111,255,250,0,250,154,255,0,224,247,1,0,125,167,209,72,209,204,255,0,245,247,1,0,228,228,199,199,21,133,255,0,10,248,1,0,170,198,112,25,25,112,255,0,28,248,1,0,106,9,255,245,255,250,255,0,43,248,1,0,4,30,255,255,228,225,255,0,58,248,1,0,26,73,255,255,228,181,255,0,72,248,1,0,25,81,255,255,222,173,255,0,89,248,1,0,170,255,128,0,0,128,255,0,99,248,1,0,27,23,253,253,245,230,255,0,112,248,1,0,42,255,128,128,128,0,255,0,123,248,1,0,56,192,142,107,142,35,255,0,138,248,1,0,27,255,255,255,165,0,255,0,150,248,1,0,11,255,255,255,69,0,255,0,165,248,1,0,214,123,218,218,112,214,255,0,177,248,1,0,38,72,238,238,232,170,255,0,196,248,1,0,85,100,251,152,251,152,255,0,211,248,1,0,127,67,238,175,238,238,255,0,230,248,1,0,241,124,219,219,112,147,255,0,249,248,1,0,26,41,255,255,239,213,255,0,9,249,1,0,20,70,255,255,218,185,255,0,24,249,1,0,20,176,205,205,133,63,255,0,34,249,1,0,247,63,255,255,192,203,255,0,44,249,1,0,212,70,221,221,160,221,255,0,54,249,1,0,132,59,230,176,224,230,255,0,70,249,1,0,212,255,128,128,0,128,255,0,82,249,1,0,0,255,255,255,0,0,255,0,91,249,1,0,0,61,188,188,143,143,255,0,106,249,1,0,159,181,225,65,105,225,255,0,121,249,1,0,17,220,139,139,69,19,255,0,138,249,1,0,4,138,250,250,128,114,255,0,150,249,1,0,19,154,244,244,164,96,255,0,166,249,1,0,103,170,139,46,139,87,255,0,180,249,1,0,17,16,255,255,245,238,255,0,194,249,1,0,13,183,160,160,82,45,255,0,206,249,1,0,0,0,192,192,192,192,255,0,218,249,1,0,139,108,235,135,206,235,255,0,231,249,1,0,175,143,205,106,90,205,255,0,246,249,1,0,148,56,144,112,128,144,255,0,5,250,1,0,148,56,144,112,128,144,255,0,20,250,1,0,0,5,255,255,250,250,255,0,30,250,1,0,106,255,255,0,255,127,255,0,47,250,1,0,146,155,180,70,130,180,255,0,62,250,1,0,24,84,210,210,180,140,255,0,71,250,1,0,127,255,128,0,128,128,255,0,81,250,1,0,212,29,216,216,191,216,255,0,94,250,1,0,6,184,255,255,99,71,255,0,106,250,1,0,123,182,224,64,224,208,255,0,121,250,1,0,212,115,238,238,130,238,255,0,133,250,1,0,27,68,245,245,222,179,255,0,144,250,1,0,0,0,255,255,255,255,255,0,155,250,1,0,0,0,245,245,245,245,255,0,171,250,1,0,42,255,255,255,255,0,255,0,183,250,1,0,56,192,205,154,205,50,255,0,200,250,1,0,45,67,252,247,252,185,255,0,209,250,1,0,68,91,221,173,221,142,255,0,218,250,1,0,98,178,163,49,163,84,255,0,227,250,1,0,42,50,255,255,255,204,255,0,236,250,1,0,62,85,230,194,230,153,255,0,245,250,1,0,85,100,198,120,198,121,255,0,254,250,1,0,99,187,132,35,132,67,255,0,7,251,1,0,42,50,255,255,255,204,255,0,16,251,1,0,62,85,230,194,230,153,255,0,25,251,1,0,85,100,198,120,198,121,255,0,34,251,1,0,98,178,163,49,163,84,255,0,43,251,1,0,107,255,104,0,104,55,255,0,52,251,1,0,42,50,255,255,255,204,255,0,61,251,1,0,55,81,240,217,240,163,255,0,70,251,1,0,68,91,221,173,221,142,255,0,79,251,1,0,85,100,198,120,198,121,255,0,88,251,1,0,98,178,163,49,163,84,255,0,97,251,1,0,107,255,104,0,104,55,255,0,106,251,1,0,42,50,255,255,255,204,255,0,115,251,1,0,55,81,240,217,240,163,255,0,124,251,1,0,68,91,221,173,221,142,255,0,133,251,1,0,85,100,198,120,198,121,255,0,142,251,1,0,96,158,171,65,171,93,255,0,151,251,1,0,99,187,132,35,132,67,255,0,160,251,1,0,108,255,90,0,90,50,255,0,169,251,1,0,42,25,255,255,255,229,255,0,178,251,1,0,45,67,252,247,252,185,255,0,187,251,1,0,55,81,240,217,240,163,255,0,196,251,1,0,68,91,221,173,221,142,255,0,205,251,1,0,85,100,198,120,198,121,255,0,214,251,1,0,96,158,171,65,171,93,255,0,223,251,1,0,99,187,132,35,132,67,255,0,232,251,1,0,108,255,90,0,90,50,255,0,241,251,1,0,42,25,255,255,255,229,255,0,250,251,1,0,45,67,252,247,252,185,255,0,3,252,1,0,55,81,240,217,240,163,255,0,12,252,1,0,68,91,221,173,221,142,255,0,21,252,1,0,85,100,198,120,198,121,255,0,30,252,1,0,96,158,171,65,171,93,255,0,39,252,1,0,99,187,132,35,132,67,255,0,48,252,1,0,107,255,104,0,104,55,255,0,57,252,1,0,110,255,69,0,69,41,255,0,66,252,1,0,49,73,248,237,248,177,255,0,77,252,1,0,117,97,205,127,205,187,255,0,88,252,1,0,144,194,184,44,127,184,255,0,99,252,1,0,42,50,255,255,255,204,255,0,110,252,1,0,99,66,218,161,218,180,255,0,121,252,1,0,132,170,196,65,182,196,255,0,132,252,1,0,150,203,168,34,94,168,255,0,143,252,1,0,42,50,255,255,255,204,255,0,154,252,1,0,99,66,218,161,218,180,255,0,165,252,1,0,132,170,196,65,182,196,255,0,176,252,1,0,144,194,184,44,127,184,255,0,187,252,1,0,164,191,148,37,52,148,255,0,198,252,1,0,42,50,255,255,255,204,255,0,209,252,1,0,69,58,233,199,233,180,255,0,220,252,1,0,117,97,205,127,205,187,255,0,231,252,1,0,132,170,196,65,182,196,255,0,242,252,1,0,144,194,184,44,127,184,255,0,253,252,1,0,164,191,148,37,52,148,255,0,8,253,1,0,42,50,255,255,255,204,255,0,19,253,1,0,69,58,233,199,233,180,255,0,30,253,1,0,117,97,205,127,205,187,255,0,41,253,1,0,132,170,196,65,182,196,255,0,52,253,1,0,139,216,192,29,145,192,255,0,63,253,1,0,150,203,168,34,94,168,255,0,74,253,1,0,158,231,132,12,44,132,255,0,85,253,1,0,42,38,255,255,255,217,255,0,96,253,1,0,49,73,248,237,248,177,255,0,107,253,1,0,69,58,233,199,233,180,255,0,118,253,1,0,117,97,205,127,205,187,255,0,129,253,1,0,132,170,196,65,182,196,255,0,140,253,1,0,139,216,192,29,145,192,255,0,151,253,1,0,150,203,168,34,94,168,255,0,162,253,1,0,158,231,132,12,44,132,255,0,173,253,1,0,42,38,255,255,255,217,255,0,184,253,1,0,49,73,248,237,248,177,255,0,195,253,1,0,69,58,233,199,233,180,255,0,206,253,1,0,117,97,205,127,205,187,255,0,217,253,1,0,132,170,196,65,182,196,255,0,228,253,1,0,139,216,192,29,145,192,255,0,239,253,1,0,150,203,168,34,94,168,255,0,250,253,1,0,164,191,148,37,52,148,255,0,5,254,1,0,158,231,88,8,29,88,255,0,16,254,1,0,37,66,255,255,247,188,255,0,27,254,1,0,28,175,254,254,196,79,255,0,38,254,1,0,16,238,217,217,95,14,255,0,49,254,1,0,42,42,255,255,255,212,255,0,60,254,1,0,28,112,254,254,217,142,255,0,71,254,1,0,22,213,254,254,153,41,255,0,82,254,1,0,15,252,204,204,76,2,255,0,93,254,1,0,42,42,255,255,255,212,255,0,104,254,1,0,28,112,254,254,217,142,255,0,115,254,1,0,22,213,254,254,153,41,255,0,126,254,1,0,16,238,217,217,95,14,255,0,137,254,1,0,13,248,153,153,52,4,255,0,148,254,1,0,42,42,255,255,255,212,255,0,159,254,1,0,31,109,254,254,227,145,255,0,170,254,1,0,28,175,254,254,196,79,255,0,181,254,1,0,22,213,254,254,153,41,255,0,192,254,1,0,16,238,217,217,95,14,255,0,203,254,1,0,13,248,153,153,52,4,255,0,214,254,1,0,42,42,255,255,255,212,255,0,225,254,1,0,31,109,254,254,227,145,255,0,236,254,1,0,28,175,254,254,196,79,255,0,247,254,1,0,22,213,254,254,153,41,255,0,2,255,1,0,18,233,236,236,112,20,255,0,13,255,1,0,15,252,204,204,76,2,255,0,24,255,1,0,12,247,140,140,45,4,255,0,35,255,1,0,42,25,255,255,255,229,255,0,46,255,1,0,37,66,255,255,247,188,255,0,57,255,1,0,31,109,254,254,227,145,255,0,68,255,1,0,28,175,254,254,196,79,255,0,79,255,1,0,22,213,254,254,153,41,255,0,90,255,1,0,18,233,236,236,112,20,255,0,101,255,1,0,15,252,204,204,76,2,255,0,112,255,1,0,12,247,140,140,45,4,255,0,123,255,1,0,42,25,255,255,255,229,255,0,134,255,1,0,37,66,255,255,247,188,255,0,145,255,1,0,31,109,254,254,227,145,255,0,156,255,1,0,28,175,254,254,196,79,255,0,167,255,1,0,22,213,254,254,153,41,255,0,178,255,1,0,18,233,236,236,112,20,255,0,189,255,1,0,15,252,204,204,76,2,255,0,200,255,1,0,13,248,153,153,52,4,255,0,211,255,1,0,13,240,102,102,37,6,255,0,222,255,1,0,34,95,255,255,237,160,255,0,233,255,1,0,24,178,254,254,178,76,255,0,244,255,1,0,5,221,240,240,59,32,255,0,255,255,1,0,42,77,255,255,255,178,255,0,10,0,2,0,29,162,254,254,204,92,255,0,21,0,2,0,17,194,253,253,141,60,255,0,32,0,2,0,254,225,227,227,26,28,255,0,43,0,2,0,42,77,255,255,255,178,255,0,54,0,2,0,29,162,254,254,204,92,255,0,65,0,2,0,17,194,253,253,141,60,255,0,76,0,2,0,5,221,240,240,59,32,255,0,87,0,2,0,246,255,189,189,0,38,255,0,98,0,2,0,42,77,255,255,255,178,255,0,109,0,2,0,30,136,254,254,217,118,255,0,120,0,2,0,24,178,254,254,178,76,255,0,131,0,2,0,17,194,253,253,141,60,255,0,142,0,2,0,5,221,240,240,59,32,255,0,153,0,2,0,246,255,189,189,0,38,255,0,164,0,2,0,42,77,255,255,255,178,255,0,175,0,2,0,30,136,254,254,217,118,255,0,186,0,2,0,24,178,254,254,178,76,255,0,197,0,2,0,17,194,253,253,141,60,255,0,208,0,2,0,7,212,252,252,78,42,255,0,219,0,2,0,254,225,227,227,26,28,255,0,230,0,2,0,245,255,177,177,0,38,255,0,241,0,2,0,42,50,255,255,255,204,255,0,252,0,2,0,34,95,255,255,237,160,255,0,7,1,2,0,30,136,254,254,217,118,255,0,18,1,2,0,24,178,254,254,178,76,255,0,29,1,2,0,17,194,253,253,141,60,255,0,40,1,2,0,7,212,252,252,78,42,255,0,51,1,2,0,254,225,227,227,26,28,255,0,62,1,2,0,245,255,177,177,0,38,255,0,73,1,2,0,42,50,255,255,255,204,255,0,84,1,2,0,34,95,255,255,237,160,255,0,95,1,2,0,30,136,254,254,217,118,255,0,106,1,2,0,24,178,254,254,178,76,255,0,117,1,2,0,17,194,253,253,141,60,255,0,128,1,2,0,7,212,252,252,78,42,255,0,139,1,2,0,254,225,227,227,26,28,255,0,150,1,2,0,246,255,189,189,0,38,255,0,161,1,2,0,242,255,128,128,0,38,255,0,172,1,2,0,147,15,255,240,248,255,255,0,182,1,2,0,24,35,250,250,235,215,255,0,195,1,2,0,23,36,255,255,239,219,255,0,209,1,2,0,23,36,238,238,223,204,255,0,223,1,2,0,23,36,205,205,192,176,255,0,237,1,2,0,24,34,139,139,131,120,255,0,251,1,2,0,113,128,255,127,255,212,255,0,6,2,2,0,113,128,255,127,255,212,255,0,18,2,2,0,113,128,238,118,238,198,255,0,30,2,2,0,113,128,205,102,205,170,255,0,42,2,2,0,113,128,139,69,139,116,255,0,54,2,2,0,127,15,255,240,255,255,255,0,60,2,2,0,127,15,255,240,255,255,255,0,67,2,2,0,127,15,238,224,238,238,255,0,74,2,2,0,127,14,205,193,205,205,255,0,81,2,2,0,127,14,139,131,139,139,255,0,88,2,2,0,42,26,245,245,245,220,255,0,94,2,2,0,23,58,255,255,228,196,255,0,101,2,2,0,23,58,255,255,228,196,255,0,109,2,2,0,23,58,238,238,213,183,255,0,117,2,2,0,22,58,205,205,183,158,255,0,125,2,2,0,23,58,139,139,125,107,255,0,143,25,2,0,0,0,0,0,0,0,255,0,133,2,2,0,25,49,255,255,235,205,255,0,148,2,2,0,170,255,255,0,0,255,255,0,153,2,2,0,170,255,255,0,0,255,255,0,159,2,2,0,170,255,238,0,0,238,255,0,165,2,2,0,170,255,205,0,0,205,255,0,171,2,2,0,170,255,139,0,0,139,255,0,177,2,2,0,192,206,226,138,43,226,255,0,188,2,2,0,0,190,165,165,42,42,255,0,194,2,2,0,0,191,255,255,64,64,255,0,201,2,2,0,0,191,238,238,59,59,255,0,208,2,2,0,0,191,205,205,51,51,255,0,215,2,2,0,0,190,139,139,35,35,255,0,222,2,2,0,23,99,222,222,184,135,255,0,232,2,2,0,23,100,255,255,211,155,255,0,243,2,2,0,23,99,238,238,197,145,255,0,254,2,2,0,23,99,205,205,170,125,255,0,9,3,2,0,23,99,139,139,115,85,255,0,20,3,2,0,128,103,160,95,158,160,255,0,30,3,2,0,131,103,255,152,245,255,255,0,41,3,2,0,131,102,238,142,229,238,255,0,52,3,2,0,131,103,205,122,197,205,255,0,63,3,2,0,131,102,139,83,134,139,255,0,74,3,2,0,63,255,255,127,255,0,255,0,85,3,2,0,63,255,255,127,255,0,255,0,97,3,2,0,63,255,238,118,238,0,255,0,109,3,2,0,63,255,205,102,205,0,255,0,121,3,2,0,63,255,139,69,139,0,255,0,133,3,2,0,17,218,210,210,105,30,255,0,143,3,2,0,17,219,255,255,127,36,255,0,154,3,2,0,17,219,238,238,118,33,255,0,165,3,2,0,17,218,205,205,102,29,255,0,176,3,2,0,17,220,139,139,69,19,255,0,187,3,2,0,11,175,255,255,127,80,255,0,193,3,2,0,7,169,255,255,114,86,255,0,200,3,2,0,6,169,238,238,106,80,255,0,207,3,2,0,6,169,205,205,91,69,255,0,214,3,2,0,6,168,139,139,62,47,255,0,221,3,2,0,154,147,237,100,149,237,255,0,236,3,2,0,33,34,255,255,248,220,255,0,245,3,2,0,33,34,255,255,248,220,255,0,255,3,2,0,34,35,238,238,232,205,255,0,9,4,2,0,34,34,205,205,200,177,255,0,19,4,2,0,35,34,139,139,136,120,255,0,29,4,2,0,246,231,220,220,20,60,255,0,37,4,2,0,127,255,255,0,255,255,255,0,42,4,2,0,127,255,255,0,255,255,255,0,48,4,2,0,127,255,238,0,238,238,255,0,54,4,2,0,127,255,205,0,205,205,255,0,60,4,2,0,127,255,139,0,139,139,255,0,66,4,2,0,30,239,184,184,134,11,255,0,80,4,2,0,30,240,255,255,185,15,255,0,95,4,2,0,30,240,238,238,173,14,255,0,110,4,2,0,30,240,205,205,149,12,255,0,125,4,2,0,30,240,139,139,101,8,255,0,140,4,2,0,85,255,100,0,100,0,255,0,150,4,2,0,39,110,189,189,183,107,255,0,160,4,2,0,58,142,107,85,107,47,255,0,175,4,2,0,58,143,255,202,255,112,255,0,191,4,2,0,58,143,238,188,238,104,255,0,207,4,2,0,58,143,205,162,205,90,255,0,223,4,2,0,58,143,139,110,139,61,255,0,239,4,2,0,23,255,255,255,140,0,255,0,250,4,2,0,21,255,255,255,127,0,255,0,6,5,2,0,21,255,238,238,118,0,255,0,18,5,2,0,21,255,205,205,102,0,255,0,30,5,2,0,21,255,139,139,69,0,255,0,42,5,2,0,198,192,204,153,50,204,255,0,53,5,2,0,198,193,255,191,62,255,255,0,65,5,2,0,198,192,238,178,58,238,255,0,77,5,2,0,198,192,205,154,50,205,255,0,89,5,2,0,198,192,139,104,34,139,255,0,101,5,2,0,10,121,233,233,150,122,255,0,112,5,2,0,85,61,188,143,188,143,255,0,125,5,2,0,85,62,255,193,255,193,255,0,139,5,2,0,85,62,238,180,238,180,255,0,153,5,2,0,85,62,205,155,205,155,255,0,167,5,2,0,85,62,139,105,139,105,255,0,181,5,2,0,175,143,139,72,61,139,255,0,195,5,2,0,127,103,79,47,79,79,255,0,209,5,2,0,127,104,255,151,255,255,255,0,224,5,2,0,127,103,238,141,238,238,255,0,239,5,2,0,127,104,205,121,205,205,255,0,254,5,2,0,127,104,139,82,139,139,255,0,13,6,2,0,127,103,79,47,79,79,255,0,27,6,2,0,128,255,209,0,206,209,255,0,41,6,2,0,199,255,211,148,0,211,255,0,52,6,2,0,232,235,255,255,20,147,255,0,61,6,2,0,232,235,255,255,20,147,255,0,71,6,2,0,232,235,238,238,18,137,255,0,81,6,2,0,232,235,205,205,16,118,255,0,91,6,2,0,231,236,139,139,10,80,255,0,101,6,2,0,138,255,255,0,191,255,255,0,113,6,2,0,138,255,255,0,191,255,255,0,126,6,2,0,138,255,238,0,178,238,255,0,139,6,2,0,138,255,205,0,154,205,255,0,152,6,2,0,138,255,139,0,104,139,255,0,165,6,2,0,0,0,105,105,105,105,255,0,173,6,2,0,0,0,105,105,105,105,255,0,181,6,2,0,148,225,255,30,144,255,255,0,192,6,2,0,148,225,255,30,144,255,255,0,204,6,2,0,148,225,238,28,134,238,255,0,216,6,2,0,148,225,205,24,116,205,255,0,228,6,2,0,148,225,139,16,78,139,255,0,240,6,2,0,0,206,178,178,34,34,255,0,250,6,2,0,0,207,255,255,48,48,255,0,5,7,2,0,0,207,238,238,44,44,255,0,16,7,2,0,0,207,205,205,38,38,255,0,27,7,2,0,0,207,139,139,26,26,255,0,38,7,2,0,28,15,255,255,250,240,255,0,50,7,2,0,85,192,139,34,139,34,255,0,62,7,2,0,0,0,220,220,220,220,255,0,72,7,2,0,170,7,255,248,248,255,255,0,83,7,2,0,35,255,255,255,215,0,255,0,88,7,2,0,35,255,255,255,215,0,255,0,94,7,2,0,35,255,238,238,201,0,255,0,100,7,2,0,35,255,205,205,173,0,255,0,106,7,2,0,35,255,139,139,117,0,255,0,112,7,2,0,30,217,218,218,165,32,255,0,122,7,2,0,30,218,255,255,193,37,255,0,133,7,2,0,30,218,238,238,180,34,255,0,144,7,2,0,30,218,205,205,155,29,255,0,155,7,2,0,30,218,139,139,105,20,255,0,166,7,2,0,0,0,192,192,192,192,255,0,171,7,2,0,0,0,0,0,0,0,255,0,177,7,2,0,0,0,3,3,3,3,255,0,183,7,2,0,0,0,26,26,26,26,255,0,190,7,2,0,0,0,255,255,255,255,255,0,198,7,2,0,0,0,28,28,28,28,255,0,205,7,2,0,0,0,31,31,31,31,255,0,212,7,2,0,0,0,33,33,33,33,255,0,219,7,2,0,0,0,36,36,36,36,255,0,226,7,2,0,0,0,38,38,38,38,255,0,233,7,2,0,0,0,41,41,41,41,255,0,240,7,2,0,0,0,43,43,43,43,255,0,247,7,2,0,0,0,46,46,46,46,255,0,254,7,2,0,0,0,48,48,48,48,255,0,5,8,2,0,0,0,5,5,5,5,255,0,11,8,2,0,0,0,51,51,51,51,255,0,18,8,2,0,0,0,54,54,54,54,255,0,25,8,2,0,0,0,56,56,56,56,255,0,32,8,2,0,0,0,59,59,59,59,255,0,39,8,2,0,0,0,61,61,61,61,255,0,46,8,2,0,0,0,64,64,64,64,255,0,53,8,2,0,0,0,66,66,66,66,255,0,60,8,2,0,0,0,69,69,69,69,255,0,67,8,2,0,0,0,71,71,71,71,255,0,74,8,2,0,0,0,74,74,74,74,255,0,81,8,2,0,0,0,8,8,8,8,255,0,87,8,2,0,0,0,77,77,77,77,255,0,94,8,2,0,0,0,79,79,79,79,255,0,101,8,2,0,0,0,82,82,82,82,255,0,108,8,2,0,0,0,84,84,84,84,255,0,115,8,2,0,0,0,87,87,87,87,255,0,122,8,2,0,0,0,89,89,89,89,255,0,129,8,2,0,0,0,92,92,92,92,255,0,136,8,2,0,0,0,94,94,94,94,255,0,143,8,2,0,0,0,97,97,97,97,255,0,150,8,2,0,0,0,99,99,99,99,255,0,157,8,2,0,0,0,10,10,10,10,255,0,163,8,2,0,0,0,102,102,102,102,255,0,170,8,2,0,0,0,105,105,105,105,255,0,177,8,2,0,0,0,107,107,107,107,255,0,184,8,2,0,0,0,110,110,110,110,255,0,191,8,2,0,0,0,112,112,112,112,255,0,198,8,2,0,0,0,115,115,115,115,255,0,205,8,2,0,0,0,117,117,117,117,255,0,212,8,2,0,0,0,120,120,120,120,255,0,219,8,2,0,0,0,122,122,122,122,255,0,226,8,2,0,0,0,125,125,125,125,255,0,233,8,2,0,0,0,13,13,13,13,255,0,239,8,2,0,0,0,127,127,127,127,255,0,246,8,2,0,0,0,130,130,130,130,255,0,253,8,2,0,0,0,133,133,133,133,255,0,4,9,2,0,0,0,135,135,135,135,255,0,11,9,2,0,0,0,138,138,138,138,255,0,18,9,2,0,0,0,140,140,140,140,255,0,25,9,2,0,0,0,143,143,143,143,255,0,32,9,2,0,0,0,145,145,145,145,255,0,39,9,2,0,0,0,148,148,148,148,255,0,46,9,2,0,0,0,150,150,150,150,255,0,53,9,2,0,0,0,15,15,15,15,255,0,59,9,2,0,0,0,153,153,153,153,255,0,66,9,2,0,0,0,156,156,156,156,255,0,73,9,2,0,0,0,158,158,158,158,255,0,80,9,2,0,0,0,161,161,161,161,255,0,87,9,2,0,0,0,163,163,163,163,255,0,94,9,2,0,0,0,166,166,166,166,255,0,101,9,2,0,0,0,168,168,168,168,255,0,108,9,2,0,0,0,171,171,171,171,255,0,115,9,2,0,0,0,173,173,173,173,255,0,122,9,2,0,0,0,176,176,176,176,255,0,129,9,2,0,0,0,18,18,18,18,255,0,135,9,2,0,0,0,179,179,179,179,255,0,142,9,2,0,0,0,181,181,181,181,255,0,149,9,2,0,0,0,184,184,184,184,255,0,156,9,2,0,0,0,186,186,186,186,255,0,163,9,2,0,0,0,189,189,189,189,255,0,170,9,2,0,0,0,191,191,191,191,255,0,177,9,2,0,0,0,194,194,194,194,255,0,184,9,2,0,0,0,196,196,196,196,255,0,191,9,2,0,0,0,199,199,199,199,255,0,198,9,2,0,0,0,201,201,201,201,255,0,205,9,2,0,0,0,20,20,20,20,255,0,211,9,2,0,0,0,204,204,204,204,255,0,218,9,2,0,0,0,207,207,207,207,255,0,225,9,2,0,0,0,209,209,209,209,255,0,232,9,2,0,0,0,212,212,212,212,255,0,239,9,2,0,0,0,214,214,214,214,255,0,246,9,2,0,0,0,217,217,217,217,255,0,253,9,2,0,0,0,219,219,219,219,255,0,4,10,2,0,0,0,222,222,222,222,255,0,11,10,2,0,0,0,224,224,224,224,255,0,18,10,2,0,0,0,227,227,227,227,255,0,25,10,2,0,0,0,23,23,23,23,255,0,31,10,2,0,0,0,229,229,229,229,255,0,38,10,2,0,0,0,232,232,232,232,255,0,45,10,2,0,0,0,235,235,235,235,255,0,52,10,2,0,0,0,237,237,237,237,255,0,59,10,2,0,0,0,240,240,240,240,255,0,66,10,2,0,0,0,242,242,242,242,255,0,73,10,2,0,0,0,245,245,245,245,255,0,80,10,2,0,0,0,247,247,247,247,255,0,87,10,2,0,0,0,250,250,250,250,255,0,94,10,2,0,0,0,252,252,252,252,255,0,101,10,2,0,85,255,255,0,255,0,255,0,107,10,2,0,85,255,255,0,255,0,255,0,114,10,2,0,85,255,238,0,238,0,255,0,121,10,2,0,85,255,205,0,205,0,255,0,128,10,2,0,85,255,139,0,139,0,255,0,135,10,2,0,59,208,255,173,255,47,255,0,147,10,2,0,0,0,192,192,192,192,255,0,152,10,2,0,0,0,0,0,0,0,255,0,158,10,2,0,0,0,3,3,3,3,255,0,164,10,2,0,0,0,26,26,26,26,255,0,171,10,2,0,0,0,255,255,255,255,255,0,179,10,2,0,0,0,28,28,28,28,255,0,186,10,2,0,0,0,31,31,31,31,255,0,193,10,2,0,0,0,33,33,33,33,255,0,200,10,2,0,0,0,36,36,36,36,255,0,207,10,2,0,0,0,38,38,38,38,255,0,214,10,2,0,0,0,41,41,41,41,255,0,221,10,2,0,0,0,43,43,43,43,255],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+40964);allocate([228,10,2,0,0,0,46,46,46,46,255,0,235,10,2,0,0,0,48,48,48,48,255,0,242,10,2,0,0,0,5,5,5,5,255,0,248,10,2,0,0,0,51,51,51,51,255,0,255,10,2,0,0,0,54,54,54,54,255,0,6,11,2,0,0,0,56,56,56,56,255,0,13,11,2,0,0,0,59,59,59,59,255,0,20,11,2,0,0,0,61,61,61,61,255,0,27,11,2,0,0,0,64,64,64,64,255,0,34,11,2,0,0,0,66,66,66,66,255,0,41,11,2,0,0,0,69,69,69,69,255,0,48,11,2,0,0,0,71,71,71,71,255,0,55,11,2,0,0,0,74,74,74,74,255,0,62,11,2,0,0,0,8,8,8,8,255,0,68,11,2,0,0,0,77,77,77,77,255,0,75,11,2,0,0,0,79,79,79,79,255,0,82,11,2,0,0,0,82,82,82,82,255,0,89,11,2,0,0,0,84,84,84,84,255,0,96,11,2,0,0,0,87,87,87,87,255,0,103,11,2,0,0,0,89,89,89,89,255,0,110,11,2,0,0,0,92,92,92,92,255,0,117,11,2,0,0,0,94,94,94,94,255,0,124,11,2,0,0,0,97,97,97,97,255,0,131,11,2,0,0,0,99,99,99,99,255,0,138,11,2,0,0,0,10,10,10,10,255,0,144,11,2,0,0,0,102,102,102,102,255,0,151,11,2,0,0,0,105,105,105,105,255,0,158,11,2,0,0,0,107,107,107,107,255,0,165,11,2,0,0,0,110,110,110,110,255,0,172,11,2,0,0,0,112,112,112,112,255,0,179,11,2,0,0,0,115,115,115,115,255,0,186,11,2,0,0,0,117,117,117,117,255,0,193,11,2,0,0,0,120,120,120,120,255,0,200,11,2,0,0,0,122,122,122,122,255,0,207,11,2,0,0,0,125,125,125,125,255,0,214,11,2,0,0,0,13,13,13,13,255,0,220,11,2,0,0,0,127,127,127,127,255,0,227,11,2,0,0,0,130,130,130,130,255,0,234,11,2,0,0,0,133,133,133,133,255,0,241,11,2,0,0,0,135,135,135,135,255,0,248,11,2,0,0,0,138,138,138,138,255,0,255,11,2,0,0,0,140,140,140,140,255,0,6,12,2,0,0,0,143,143,143,143,255,0,13,12,2,0,0,0,145,145,145,145,255,0,20,12,2,0,0,0,148,148,148,148,255,0,27,12,2,0,0,0,150,150,150,150,255,0,34,12,2,0,0,0,15,15,15,15,255,0,40,12,2,0,0,0,153,153,153,153,255,0,47,12,2,0,0,0,156,156,156,156,255,0,54,12,2,0,0,0,158,158,158,158,255,0,61,12,2,0,0,0,161,161,161,161,255,0,68,12,2,0,0,0,163,163,163,163,255,0,75,12,2,0,0,0,166,166,166,166,255,0,82,12,2,0,0,0,168,168,168,168,255,0,89,12,2,0,0,0,171,171,171,171,255,0,96,12,2,0,0,0,173,173,173,173,255,0,103,12,2,0,0,0,176,176,176,176,255,0,110,12,2,0,0,0,18,18,18,18,255,0,116,12,2,0,0,0,179,179,179,179,255,0,123,12,2,0,0,0,181,181,181,181,255,0,130,12,2,0,0,0,184,184,184,184,255,0,137,12,2,0,0,0,186,186,186,186,255,0,144,12,2,0,0,0,189,189,189,189,255,0,151,12,2,0,0,0,191,191,191,191,255,0,158,12,2,0,0,0,194,194,194,194,255,0,165,12,2,0,0,0,196,196,196,196,255,0,172,12,2,0,0,0,199,199,199,199,255,0,179,12,2,0,0,0,201,201,201,201,255,0,186,12,2,0,0,0,20,20,20,20,255,0,192,12,2,0,0,0,204,204,204,204,255,0,199,12,2,0,0,0,207,207,207,207,255,0,206,12,2,0,0,0,209,209,209,209,255,0,213,12,2,0,0,0,212,212,212,212,255,0,220,12,2,0,0,0,214,214,214,214,255,0,227,12,2,0,0,0,217,217,217,217,255,0,234,12,2,0,0,0,219,219,219,219,255,0,241,12,2,0,0,0,222,222,222,222,255,0,248,12,2,0,0,0,224,224,224,224,255,0,255,12,2,0,0,0,227,227,227,227,255,0,6,13,2,0,0,0,23,23,23,23,255,0,12,13,2,0,0,0,229,229,229,229,255,0,19,13,2,0,0,0,232,232,232,232,255,0,26,13,2,0,0,0,235,235,235,235,255,0,33,13,2,0,0,0,237,237,237,237,255,0,40,13,2,0,0,0,240,240,240,240,255,0,47,13,2,0,0,0,242,242,242,242,255,0,54,13,2,0,0,0,245,245,245,245,255,0,61,13,2,0,0,0,247,247,247,247,255,0,68,13,2,0,0,0,250,250,250,250,255,0,75,13,2,0,0,0,252,252,252,252,255,0,82,13,2,0,85,15,255,240,255,240,255,0,91,13,2,0,85,15,255,240,255,240,255,0,101,13,2,0,85,15,238,224,238,224,255,0,111,13,2,0,85,14,205,193,205,193,255,0,121,13,2,0,85,14,139,131,139,131,255,0,131,13,2,0,233,150,255,255,105,180,255,0,139,13,2,0,234,145,255,255,110,180,255,0,148,13,2,0,235,141,238,238,106,167,255,0,157,13,2,0,236,135,205,205,96,144,255,0,166,13,2,0,234,148,139,139,58,98,255,0,175,13,2,0,0,140,205,205,92,92,255,0,185,13,2,0,0,148,255,255,106,106,255,0,196,13,2,0,0,148,238,238,99,99,255,0,207,13,2,0,0,149,205,205,85,85,255,0,218,13,2,0,0,148,139,139,58,58,255,0,229,13,2,0,194,255,130,75,0,130,255,0,236,13,2,0,42,0,255,255,255,254,0,0,242,13,2,0,42,15,255,255,255,240,255,0,248,13,2,0,42,15,255,255,255,240,255,0,255,13,2,0,42,15,238,238,238,224,255,0,6,14,2,0,42,14,205,205,205,193,255,0,13,14,2,0,42,14,139,139,139,131,255,0,20,14,2,0,38,106,240,240,230,140,255,0,26,14,2,0,39,112,255,255,246,143,255,0,33,14,2,0,39,112,238,238,230,133,255,0,40,14,2,0,39,111,205,205,198,115,255,0,47,14,2,0,39,111,139,139,134,78,255,0,54,14,2,0,170,20,250,230,230,250,255,0,63,14,2,0,240,15,255,255,240,245,255,0,77,14,2,0,240,15,255,255,240,245,255,0,92,14,2,0,239,15,238,238,224,229,255,0,107,14,2,0,240,14,205,205,193,197,255,0,122,14,2,0,239,14,139,139,131,134,255,0,137,14,2,0,64,255,252,124,252,0,255,0,147,14,2,0,38,49,255,255,250,205,255,0,160,14,2,0,38,49,255,255,250,205,255,0,174,14,2,0,37,50,238,238,233,191,255,0,188,14,2,0,38,49,205,205,201,165,255,0,202,14,2,0,39,49,139,139,137,112,255,0,216,14,2,0,137,63,230,173,216,230,255,0,226,14,2,0,138,64,255,191,239,255,255,0,237,14,2,0,138,64,238,178,223,238,255,0,248,14,2,0,138,63,205,154,192,205,255,0,3,15,2,0,137,64,139,104,131,139,255,0,14,15,2,0,0,119,240,240,128,128,255,0,25,15,2,0,127,31,255,224,255,255,255,0,35,15,2,0,127,31,255,224,255,255,255,0,46,15,2,0,127,31,238,209,238,238,255,0,57,15,2,0,127,31,205,180,205,205,255,0,68,15,2,0,127,31,139,122,139,139,255,0,79,15,2,0,35,115,238,238,221,130,255,0,94,15,2,0,35,116,255,255,236,139,255,0,110,15,2,0,35,115,238,238,220,130,255,0,126,15,2,0,35,115,205,205,190,112,255,0,142,15,2,0,35,115,139,139,129,76,255,0,158,15,2,0,42,40,250,250,250,210,255,0,179,15,2,0,0,0,211,211,211,211,255,0,189,15,2,0,0,0,211,211,211,211,255,0,199,15,2,0,248,73,255,255,182,193,255,0,209,15,2,0,249,81,255,255,174,185,255,0,220,15,2,0,248,81,238,238,162,173,255,0,231,15,2,0,249,80,205,205,140,149,255,0,242,15,2,0,249,80,139,139,95,101,255,0,253,15,2,0,12,132,255,255,160,122,255,0,9,16,2,0,12,132,255,255,160,122,255,0,22,16,2,0,11,132,238,238,149,114,255,0,35,16,2,0,12,133,205,205,129,98,255,0,48,16,2,0,12,133,139,139,87,66,255,0,61,16,2,0,125,209,178,32,178,170,255,0,75,16,2,0,143,117,250,135,206,250,255,0,88,16,2,0,143,79,255,176,226,255,255,0,102,16,2,0,143,79,238,164,211,238,255,0,116,16,2,0,142,79,205,141,182,205,255,0,130,16,2,0,143,78,139,96,123,139,255,0,144,16,2,0,175,143,255,132,112,255,255,0,159,16,2,0,148,56,153,119,136,153,255,0,174,16,2,0,148,56,153,119,136,153,255,0,189,16,2,0,151,52,222,176,196,222,255,0,204,16,2,0,151,53,255,202,225,255,255,0,220,16,2,0,151,53,238,188,210,238,255,0,236,16,2,0,151,53,205,162,181,205,255,0,252,16,2,0,150,53,139,110,123,139,255,0,12,17,2,0,42,31,255,255,255,224,255,0,24,17,2,0,42,31,255,255,255,224,255,0,37,17,2,0,42,31,238,238,238,209,255,0,50,17,2,0,42,31,205,205,205,180,255,0,63,17,2,0,42,31,139,139,139,122,255,0,76,17,2,0,85,192,205,50,205,50,255,0,86,17,2,0,21,20,250,250,240,230,255,0,92,17,2,0,212,255,255,255,0,255,255,0,100,17,2,0,212,255,255,255,0,255,255,0,109,17,2,0,212,255,238,238,0,238,255,0,118,17,2,0,212,255,205,205,0,205,255,0,127,17,2,0,212,255,139,139,0,139,255,0,136,17,2,0,239,185,176,176,48,96,255,0,143,17,2,0,228,203,255,255,52,179,255,0,151,17,2,0,228,203,238,238,48,167,255,0,159,17,2,0,228,204,205,205,41,144,255,0,167,17,2,0,228,203,139,139,28,98,255,0,175,17,2,0,113,128,205,102,205,170,255,0,192,17,2,0,170,255,205,0,0,205,255,0,203,17,2,0,204,152,211,186,85,211,255,0,216,17,2,0,203,153,255,224,102,255,255,0,230,17,2,0,203,153,238,209,95,238,255,0,244,17,2,0,203,153,205,180,82,205,255,0,2,18,2,0,203,154,139,122,55,139,255,0,16,18,2,0,183,124,219,147,112,219,255,0,29,18,2,0,183,125,255,171,130,255,255,0,43,18,2,0,183,125,238,159,121,238,255,0,57,18,2,0,183,125,205,137,104,205,255,0,71,18,2,0,183,124,139,93,71,139,255,0,85,18,2,0,103,169,179,60,179,113,255,0,100,18,2,0,176,143,238,123,104,238,255,0,116,18,2,0,111,255,250,0,250,154,255,0,134,18,2,0,125,167,209,72,209,204,255,0,150,18,2,0,228,228,199,199,21,133,255,0,166,18,2,0,170,198,112,25,25,112,255,0,179,18,2,0,106,9,255,245,255,250,255,0,189,18,2,0,4,30,255,255,228,225,255,0,199,18,2,0,4,30,255,255,228,225,255,0,210,18,2,0,4,30,238,238,213,210,255,0,221,18,2,0,3,29,205,205,183,181,255,0,232,18,2,0,5,29,139,139,125,123,255,0,243,18,2,0,26,73,255,255,228,181,255,0,252,18,2,0,25,81,255,255,222,173,255,0,8,19,2,0,25,81,255,255,222,173,255,0,21,19,2,0,25,82,238,238,207,161,255,0,34,19,2,0,25,82,205,205,179,139,255,0,47,19,2,0,25,82,139,139,121,94,255,0,60,19,2,0,170,255,128,0,0,128,255,0,65,19,2,0,170,255,128,0,0,128,255,0,74,19,2,0,42,0,255,255,255,254,0,0,79,19,2,0,27,23,253,253,245,230,255,0,87,19,2,0,56,192,142,107,142,35,255,0,97,19,2,0,56,193,255,192,255,62,255,0,108,19,2,0,56,192,238,179,238,58,255,0,119,19,2,0,56,192,205,154,205,50,255,0,130,19,2,0,56,192,139,105,139,34,255,0,141,19,2,0,27,255,255,255,165,0,255,0,148,19,2,0,27,255,255,255,165,0,255,0,156,19,2,0,27,255,238,238,154,0,255,0,164,19,2,0,27,255,205,205,133,0,255,0,172,19,2,0,27,255,139,139,90,0,255,0,180,19,2,0,11,255,255,255,69,0,255,0,190,19,2,0,11,255,255,255,69,0,255,0,201,19,2,0,11,255,238,238,64,0,255,0,212,19,2,0,11,255,205,205,55,0,255,0,223,19,2,0,11,255,139,139,37,0,255,0,234,19,2,0,214,123,218,218,112,214,255,0,241,19,2,0,214,124,255,255,131,250,255,0,249,19,2,0,214,124,238,238,122,233,255,0,1,20,2,0,214,124,205,205,105,201,255,0,9,20,2,0,213,124,139,139,71,137,255,0,17,20,2,0,38,72,238,238,232,170,255,0,31,20,2,0,85,100,251,152,251,152,255,0,41,20,2,0,85,101,255,154,255,154,255,0,52,20,2,0,85,100,238,144,238,144,255,0,63,20,2,0,85,100,205,124,205,124,255,0,74,20,2,0,85,100,139,84,139,84,255,0,85,20,2,0,127,67,238,175,238,238,255,0,99,20,2,0,127,68,255,187,255,255,255,0,114,20,2,0,127,68,238,174,238,238,255,0,129,20,2,0,127,68,205,150,205,205,255,0,144,20,2,0,127,67,139,102,139,139,255,0,159,20,2,0,241,124,219,219,112,147,255,0,173,20,2,0,241,125,255,255,130,171,255,0,188,20,2,0,241,125,238,238,121,159,255,0,203,20,2,0,241,125,205,205,104,137,255,0,218,20,2,0,241,124,139,139,71,93,255,0,233,20,2,0,26,41,255,255,239,213,255,0,244,20,2,0,20,70,255,255,218,185,255,0,254,20,2,0,20,70,255,255,218,185,255,0,9,21,2,0,19,69,238,238,203,173,255,0,20,21,2,0,19,69,205,205,175,149,255,0,31,21,2,0,20,69,139,139,119,101,255,0,42,21,2,0,20,176,205,205,133,63,255,0,47,21,2,0,247,63,255,255,192,203,255,0,52,21,2,0,245,73,255,255,181,197,255,0,58,21,2,0,245,73,238,238,169,184,255,0,64,21,2,0,245,74,205,205,145,158,255,0,70,21,2,0,245,73,139,139,99,108,255,0,76,21,2,0,212,70,221,221,160,221,255,0,81,21,2,0,212,68,255,255,187,255,255,0,87,21,2,0,212,68,238,238,174,238,255,0,93,21,2,0,212,68,205,205,150,205,255,0,99,21,2,0,212,67,139,139,102,139,255,0,105,21,2,0,132,59,230,176,224,230,255,0,116,21,2,0,196,221,240,160,32,240,255,0,123,21,2,0,191,207,255,155,48,255,255,0,131,21,2,0,192,207,238,145,44,238,255,0,139,21,2,0,192,207,205,125,38,205,255,0,147,21,2,0,192,207,139,85,26,139,255,0,155,21,2,0,0,255,255,255,0,0,255,0,159,21,2,0,0,255,255,255,0,0,255,0,164,21,2,0,0,255,238,238,0,0,255,0,169,21,2,0,0,255,205,205,0,0,255,0,174,21,2,0,0,255,139,139,0,0,255,0,179,21,2,0,0,61,188,188,143,143,255,0,189,21,2,0,0,62,255,255,193,193,255,0,200,21,2,0,0,62,238,238,180,180,255,0,211,21,2,0,0,62,205,205,155,155,255,0,222,21,2,0,0,62,139,139,105,105,255,0,233,21,2,0,159,181,225,65,105,225,255,0,243,21,2,0,159,183,255,72,118,255,255,0,254,21,2,0,159,183,238,67,110,238,255,0,9,22,2,0,159,182,205,58,95,205,255,0,20,22,2,0,159,183,139,39,64,139,255,0,31,22,2,0,17,220,139,139,69,19,255,0,43,22,2,0,4,138,250,250,128,114,255,0,50,22,2,0,9,150,255,255,140,105,255,0,58,22,2,0,9,150,238,238,130,98,255,0,66,22,2,0,9,150,205,205,112,84,255,0,74,22,2,0,9,150,139,139,76,57,255,0,82,22,2,0,19,154,244,244,164,96,255,0,93,22,2,0,103,170,139,46,139,87,255,0,102,22,2,0,103,171,255,84,255,159,255,0,112,22,2,0,103,171,238,78,238,148,255,0,122,22,2,0,103,171,205,67,205,128,255,0,132,22,2,0,103,170,139,46,139,87,255,0,142,22,2,0,17,16,255,255,245,238,255,0,151,22,2,0,17,16,255,255,245,238,255,0,161,22,2,0,18,17,238,238,229,222,255,0,171,22,2,0,18,17,205,205,197,191,255,0,181,22,2,0,18,16,139,139,134,130,255,0,191,22,2,0,13,183,160,160,82,45,255,0,198,22,2,0,13,184,255,255,130,71,255,0,206,22,2,0,13,184,238,238,121,66,255,0,214,22,2,0,13,184,205,205,104,57,255,0,222,22,2,0,13,185,139,139,71,38,255,0,230,22,2,0,139,108,235,135,206,235,255,0,238,22,2,0,144,120,255,135,206,255,255,0,247,22,2,0,144,120,238,126,192,238,255,0,0,23,2,0,144,120,205,108,166,205,255,0,9,23,2,0,145,119,139,74,112,139,255,0,18,23,2,0,175,143,205,106,90,205,255,0,28,23,2,0,175,144,255,131,111,255,255,0,39,23,2,0,175,144,238,122,103,238,255,0,50,23,2,0,175,144,205,105,89,205,255,0,61,23,2,0,175,144,139,71,60,139,255,0,72,23,2,0,148,56,144,112,128,144,255,0,82,23,2,0,149,56,255,198,226,255,255,0,93,23,2,0,149,56,238,185,211,238,255,0,104,23,2,0,148,57,205,159,182,205,255,0,115,23,2,0,149,56,139,108,123,139,255,0,126,23,2,0,148,56,144,112,128,144,255,0,136,23,2,0,0,5,255,255,250,250,255,0,141,23,2,0,0,5,255,255,250,250,255,0,147,23,2,0,0,5,238,238,233,233,255,0,153,23,2,0,0,4,205,205,201,201,255,0,159,23,2,0,0,3,139,139,137,137,255,0,165,23,2,0,106,255,255,0,255,127,255,0,177,23,2,0,106,255,255,0,255,127,255,0,190,23,2,0,106,255,238,0,238,118,255,0,203,23,2,0,106,255,205,0,205,102,255,0,216,23,2,0,106,255,139,0,139,69,255,0,229,23,2,0,146,155,180,70,130,180,255,0,239,23,2,0,146,156,255,99,184,255,255,0,250,23,2,0,146,156,238,92,172,238,255,0,5,24,2,0,146,156,205,79,148,205,255,0,16,24,2,0,147,155,139,54,100,139,255,0,27,24,2,0,24,84,210,210,180,140,255,0,31,24,2,0,20,176,255,255,165,79,255,0,36,24,2,0,20,176,238,238,154,73,255,0,41,24,2,0,20,176,205,205,133,63,255,0,46,24,2,0,20,176,139,139,90,43,255,0,51,24,2,0,212,29,216,216,191,216,255,0,59,24,2,0,212,30,255,255,225,255,255,0,68,24,2,0,212,30,238,238,210,238,255,0,77,24,2,0,212,29,205,205,181,205,255,0,86,24,2,0,212,29,139,139,123,139,255,0,95,24,2,0,6,184,255,255,99,71,255,0,102,24,2,0,6,184,255,255,99,71,255,0,110,24,2,0,6,184,238,238,92,66,255,0,118,24,2,0,6,184,205,205,79,57,255,0,126,24,2,0,6,185,139,139,54,38,255,0,208,25,2,0,42,0,255,255,255,254,0,0,134,24,2,0,123,182,224,64,224,208,255,0,144,24,2,0,129,255,255,0,245,255,255,0,155,24,2,0,129,255,238,0,229,238,255,0,166,24,2,0,129,255,205,0,197,205,255,0,177,24,2,0,129,255,139,0,134,139,255,0,188,24,2,0,212,115,238,238,130,238,255,0,195,24,2,0,227,215,208,208,32,144,255,0,205,24,2,0,235,193,255,255,62,150,255,0,216,24,2,0,235,192,238,238,58,140,255,0,227,24,2,0,235,192,205,205,50,120,255,0,238,24,2,0,235,192,139,139,34,82,255,0,249,24,2,0,27,68,245,245,222,179,255,0,255,24,2,0,27,69,255,255,231,186,255,0,6,25,2,0,27,68,238,238,216,174,255,0,13,25,2,0,27,68,205,205,186,150,255,0,20,25,2,0,27,67,139,139,126,102,255,0,27,25,2,0,0,0,255,255,255,255,255,0,33,25,2,0,0,0,245,245,245,245,255,0,44,25,2,0,42,255,255,255,255,0,255,0,51,25,2,0,42,255,255,255,255,0,255,0,59,25,2,0,42,255,238,238,238,0,255,0,67,25,2,0,42,255,205,205,205,0,255,0,75,25,2,0,42,255,139,139,139,0,255,0,83,25,2,0,56,192,205,154,205,50,255,0,201,29,2,0,227,25,2,0,229,25,2,0,231,25,2,0,233,25,2,0,235,25,2,0,237,25,2,0,239,25,2,0,241,25,2,0,243,25,2,0,245,25,2,0,248,25,2,0,251,25,2,0,254,25,2,0,1,26,2,0,4,26,2,0,7,26,2,0,10,26,2,0,13,26,2,0,16,26,2,0,19,26,2,0,0,0,0,0,4,0,0,0,4,0,0,0,11,0,0,0,54,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,27,2,0,149,28,2,0,8,0,0,0,16,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,16,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,245,38,2,0,9,0,0,0,251,38,2,0,10,0,0,0,4,39,2,0,11,0,0,0,70,39,2,0,12,0,0,0,76,39,2,0,13,0,0,0,81,39,2,0,14,0,0,0,4,39,2,0,15,0,0,0,217,39,2,0,16,0,0,0,224,39,2,0,17,0,0,0,232,39,2,0,18,0,0,0,239,39,2,0,19,0,0,0,251,39,2,0,20,0,0,0,70,39,2,0,21,0,0,0,7,40,2,0,22,0,0,0,15,40,2,0,23,0,0,0,25,40,2,0,24,0,0,0,39,40,2,0,25,0,0,0,46,40,2,0,26,0,0,0,51,40,2,0,27,0,0,0,54,40,2,0,28,0,0,0,59,40,2,0,29,0,0,0,67,40,2,0,30,0,0,0,73,40,2,0,31,0,0,0,79,40,2,0,32,0,0,0,86,40,2,0,33,0,0,0,92,40,2,0,33,0,0,0,100,40,2,0,34,0,0,0,107,40,2,0,35,0,0,0,4,39,2,0,36,0,0,0,224,39,2,0,17,0,0,0,232,39,2,0,18,0,0,0,98,42,2,0,37,0,0,0,239,39,2,0,19,0,0,0,251,39,2,0,20,0,0,0,70,39,2,0,21,0,0,0,109,42,2,0,38,0,0,0,15,40,2,0,23,0,0,0,25,40,2,0,24,0,0,0,39,40,2,0,25,0,0,0,46,40,2,0,26,0,0,0,51,40,2,0,27,0,0,0,54,40,2,0,28,0,0,0,117,42,2,0,39,0,0,0,67,40,2,0,30,0,0,0,73,40,2,0,31,0,0,0,79,40,2,0,32,0,0,0,86,40,2,0,33,0,0,0,92,40,2,0,33,0,0,0,100,40,2,0,34,0,0,0,107,40,2,0,35,0,0,0,0,0,0,0,76,45,2,0,90,45,2,0,103,45,2,0,120,45,2,0,152,45,2,0,167,45,2,0,185,45,2,0,200,45,2,0,220,45,2,0,248,45,2,0,27,46,2,0,44,46,2,0,71,46,2,0,91,46,2,0,129,46,2,0,156,46,2,0,198,46,2,0,245,46,2,0,6,47,2,0,57,47,2,0,80,47,2,0,126,47,2,0,153,47,2,0,204,47,2,0,240,47,2,0,36,48,2,0,81,48,2,0,96,48,2,0,122,48,2,0,160,48,2,0,192,48,2,0,225,48,2,0,3,49,2,0,20,49,2,0,41,49,2,0,57,49,2,0,74,49,2,0,118,49,2,0,198,49,2,0,1,50,2,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,12,0,0,0,31,0,0,0,40,0,0,0,41,0,0,0,32,0,0,0,42,0,0,0,13,0,0,0,25,0,0,0,33,0,0,0,6,0,0,0,7,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,22,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,22,28,28,28,28,28,28,28,28,28,28,22,28,26,28,28,22,28,28,28,28,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,4,254,255,255,135,254,255,255,7,0,0,0,0,0,0,0,0,255,255,127,255,255,255,127,255,255,255,255,255,255,255,243,127,254,253,255,255,255,255,255,127,255,255,255,255,255,255,255,255,15,224,255,255,255,255,49,252,255,255,255,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,1,0,248,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,215,255,255,251,255,255,255,255,127,127,84,253,255,15,0,254,223,255,255,255,255,255,255,255,255,254,223,255,255,255,255,3,0,255,255,255,255,255,255,159,25,255,255,255,207,63,3,0,0,0,0,0,0,254,255,255,255,127,2,254,255,255,255,127,0,0,0,0,0,0,0,0,0,255,255,255,7,7,0,0,0,0,0,254,255,255,7,254,7,0,0,0,0,254,255,255,255,255,255,255,255,255,124,255,127,47,0,96,0,0,0,224,255,255,255,255,255,255,35,0,0,0,255,3,0,0,0,224,159,249,255,255,253,197,3,0,0,0,176,3,0,3,0,224,135,249,255,255,253,109,3,0,0,0,94,0,0,28,0,224,175,251,255,255,253,237,35,0,0,0,0,1,0,0,0,224,159,249,255,255,253,205,35,0,0,0,176,3,0,0,0,224,199,61,214,24,199,191,3,0,0,0,0,0,0,0,0,224,223,253,255,255,253,239,3,0,0,0,0,3,0,0,0,224,223,253,255,255,253,239,3,0,0,0,64,3,0,0,0,224,223,253,255,255,253,255,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,255,127,13,0,63,0,0,0,0,0,0,0,150,37,240,254,174,108,13,32,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,254,255,255,255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,63,0,255,255,255,255,127,0,237,218,7,0,0,0,0,80,1,80,49,130,171,98,44,0,0,0,0,64,0,201,128,245,7,0,0,0,0,8,1,2,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,15,255,255,255,255,255,255,255,255,255,255,255,3,255,255,63,63,255,255,255,255,63,63,255,170,255,255,255,63,255,255,255,255,255,255,223,95,220,31,207,15,255,31,220,31,0,0,0,0,64,76,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,254,3,0,0,254,255,255,255,255,255,255,255,255,255,31,0,254,255,255,255,255,255,255,255,255,255,255,7,224,255,255,255,255,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,255,7,254,255,255,135,254,255,255,7,0,0,0,0,0,0,128,0,255,255,127,255,255,255,127,255,255,255,255,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,1,0,248,3,0,3,0,0,0,0,0,255,255,255,255,255,255,255,255,63,0,0,0,3,0,0,0,192,215,255,255,251,255,255,255,255,127,127,84,253,255,15,0,254,223,255,255,255,255,255,255,255,255,254,223,255,255,255,255,123,0,255,255,255,255,255,255,159,25,255,255,255,207,63,3,0,0,0,0,0,0,254,255,255,255,127,2,254,255,255,255,127,0,254,255,251,255,255,187,22,0,255,255,255,7,7,0,0,0,0,0,254,255,255,7,255,255,7,0,255,3,255,255,255,255,255,255,255,255,255,124,255,127,239,255,255,61,255,3,238,255,255,255,255,255,255,243,255,63,30,255,207,255,0,0,238,159,249,255,255,253,197,211,159,57,128,176,207,255,3,0,228,135,249,255,255,253,109,211,135,57,0,94,192,255,31,0,238,175,251,255,255,253,237,243,191,59,0,0,193,255,0,0,238,159,249,255,255,253,205,243,143,57,192,176,195,255,0,0,236,199,61,214,24,199,191,195,199,61,128,0,128,255,0,0,238,223,253,255,255,253,239,195,223,61,96,0,195,255,0,0,236,223,253,255,255,253,239,195,223,61,96,64,195,255,0,0,236,223,253,255,255,253,255,195,207,61,128,0,195,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,255,127,255,7,255,127,255,3,0,0,0,0,150,37,240,254,174,108,255,59,95,63,255,3,0,0,0,0,0,0,0,3,255,3,160,194,255,254,255,255,255,3,254,255,223,15,191,254,255,63,254,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,31,2,0,0,0,160,0,0,0,254,255,62,0,254,255,255,255,255,255,255,255,255,255,31,102,254,255,255,255,255,255,255,255,255,255,255,119,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,12,0,0,0,31,0,0,0,40,0,0,0,41,0,0,0,32,0,0,0,42,0,0,0,13,0,0,0,25,0,0,0,33,0,0,0,8,0,0,0,9,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,22,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,0,0,0,0,0,0,0,0,0,1,1,43,0,0,0,44,0,0,0,45,0,0,0,46,0,0,0,47,0,0,0,45,0,0,0,48,0,0,0,49,0,0,0,50,0,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,12,0,0,0,31,0,0,0,40,0,0,0,41,0,0,0,32,0,0,0,42,0,0,0,13,0,0,0,25,0,0,0,33,0,0,0,8,0,0,0,9,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,22,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,0,0,0,0,0,0,0,0,0,1,1,43,0,0,0,44,0,0,0,45,0,0,0,46,0,0,0,47,0,0,0,45,0,0,0,48,0,0,0,49,0,0,0,50,0,0,0,224,221,0,0,76,231,0,0,192,229,0,0,188,232,0,0,188,232,0,0,44,234,0,0,192,229,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,12,0,0,0,31,0,0,0,40,0,0,0,41,0,0,0,32,0,0,0,42,0,0,0,13,0,0,0,25,0,0,0,33,0,0,0,10,0,0,0,7,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,22,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,34,0,0,0,35,0,0,0,36,0,0,0,37,0,0,0,38,0,0,0,39,0,0,0,14,0,0,0,40,0,0,0,51,0,0,0,52,0,0,0,41,0,0,0,53,0,0,0,15,0,0,0,26,0,0,0,42,0,0,0,11,0,0,0,12,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,22,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,22,28,28,28,28,28,28,28,28,28,28,22,28,26,28,28,22,28,28,28,28,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,43,0,0,0,44,0,0,0,45,0,0,0,46,0,0,0,47,0,0,0,48,0,0,0,16,0,0,0,49,0,0,0,54,0,0,0,55,0,0,0,50,0,0,0,56,0,0,0,17,0,0,0,27,0,0,0,51,0,0,0,13,0,0,0,14,0,0,0,2,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,22,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,22,28,28,28,28,28,28,28,28,28,28,22,28,26,28,28,22,28,28,28,28,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,142,1,0,71,52,2,0,128,143,1,0,80,52,2,0,87,52,2,0,96,52,2,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,12,0,0,0,31,0,0,0,40,0,0,0,41,0,0,0,32,0,0,0,42,0,0,0,13,0,0,0,25,0,0,0,33,0,0,0,8,0,0,0,9,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,23,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,0,0,0,0,0,0,0,0,0,1,1,43,0,0,0,44,0,0,0,45,0,0,0,46,0,0,0,47,0,0,0,45,0,0,0,48,0,0,0,49,0,0,0,50,0,0,0,64,237,0,0,176,238,0,0,32,240,0,0,144,241,0,0,144,241,0,0,0,243,0,0,32,240,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,12,0,0,0,31,0,0,0,40,0,0,0,41,0,0,0,32,0,0,0,42,0,0,0,13,0,0,0,25,0,0,0,33,0,0,0,6,0,0,0,7,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,23,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,22,28,28,28,28,28,28,28,28,28,28,22,28,26,28,28,22,28,28,28,28,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,12,0,0,0,31,0,0,0,40,0,0,0,41,0,0,0,32,0,0,0,42,0,0,0,13,0,0,0,25,0,0,0,33,0,0,0,10,0,0,0,7,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,23,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+51204);allocate([25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,12,0,0,0,31,0,0,0,40,0,0,0,41,0,0,0,32,0,0,0,42,0,0,0,13,0,0,0,25,0,0,0,33,0,0,0,8,0,0,0,9,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,23,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,0,0,0,0,0,0,0,0,0,1,1,43,0,0,0,44,0,0,0,45,0,0,0,46,0,0,0,47,0,0,0,45,0,0,0,48,0,0,0,49,0,0,0,50,0,0,0,34,0,0,0,35,0,0,0,36,0,0,0,37,0,0,0,38,0,0,0,39,0,0,0,14,0,0,0,40,0,0,0,51,0,0,0,52,0,0,0,41,0,0,0,53,0,0,0,15,0,0,0,26,0,0,0,42,0,0,0,11,0,0,0,12,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,23,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,22,28,28,28,28,28,28,28,28,28,28,22,28,26,28,28,22,28,28,28,28,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,43,0,0,0,44,0,0,0,45,0,0,0,46,0,0,0,47,0,0,0,48,0,0,0,16,0,0,0,49,0,0,0,54,0,0,0,55,0,0,0,50,0,0,0,56,0,0,0,17,0,0,0,27,0,0,0,51,0,0,0,13,0,0,0,14,0,0,0,2,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,23,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,22,28,28,28,28,28,28,28,28,28,28,22,28,26,28,28,22,28,28,28,28,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,242,52,2,0,248,52,2,0,251,52,2,0,1,53,2,0,155,52,2,0,8,53,2,0,17,53,2,0,25,53,2,0,172,244,0,0,20,0,0,0,67,46,85,84,70,45,56,0,0,0,0,0,0,0,0,0,0,0,0,0,222,18,4,149,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,2,0,0,192,3,0,0,192,4,0,0,192,5,0,0,192,6,0,0,192,7,0,0,192,8,0,0,192,9,0,0,192,10,0,0,192,11,0,0,192,12,0,0,192,13,0,0,192,14,0,0,192,15,0,0,192,16,0,0,192,17,0,0,192,18,0,0,192,19,0,0,192,20,0,0,192,21,0,0,192,22,0,0,192,23,0,0,192,24,0,0,192,25,0,0,192,26,0,0,192,27,0,0,192,28,0,0,192,29,0,0,192,30,0,0,192,31,0,0,192,0,0,0,179,1,0,0,195,2,0,0,195,3,0,0,195,4,0,0,195,5,0,0,195,6,0,0,195,7,0,0,195,8,0,0,195,9,0,0,195,10,0,0,195,11,0,0,195,12,0,0,195,13,0,0,211,14,0,0,195,15,0,0,195,0,0,12,187,1,0,12,195,2,0,12,195,3,0,12,195,4,0,12,211,144,245,0,0,5,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,19,0,0,0,22,251,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,231,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,247,0,0,9,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,19,0,0,0,30,251,2,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,247,0,0,5,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,19,0,0,0,38,255,2,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,9,0,0,0,10,0,0,0,13,0,0,0,11,0,0,0,12,0,0,0,133,0,0,0,0,32,0,0,1,32,0,0,2,32,0,0,3,32,0,0,4,32,0,0,5,32,0,0,6,32,0,0,8,32,0,0,9,32,0,0,10,32,0,0,40,32,0,0,41,32,0,0,95,32,0,0,0,48,0,0,0,0,0,0,10,0,0,0,100,0,0,0,232,3,0,0,16,39,0,0,160,134,1,0,64,66,15,0,128,150,152,0,0,225,245,5,95,112,137,0,255,9,47,15,3,0,0,0,4,0,0,0,4,0,0,0,6,0,0,0,131,249,162,0,68,78,110,0,252,41,21,0,209,87,39,0,221,52,245,0,98,219,192,0,60,153,149,0,65,144,67,0,99,81,254,0,187,222,171,0,183,97,197,0,58,110,36,0,210,77,66,0,73,6,224,0,9,234,46,0,28,146,209,0,235,29,254,0,41,177,28,0,232,62,167,0,245,53,130,0,68,187,46,0,156,233,132,0,180,38,112,0,65,126,95,0,214,145,57,0,83,131,57,0,156,244,57,0,139,95,132,0,40,249,189,0,248,31,59,0,222,255,151,0,15,152,5,0,17,47,239,0,10,90,139,0,109,31,109,0,207,126,54,0,9,203,39,0,70,79,183,0,158,102,63,0,45,234,95,0,186,39,117,0,229,235,199,0,61,123,241,0,247,57,7,0,146,82,138,0,251,107,234,0,31,177,95,0,8,93,141,0,48,3,86,0,123,252,70,0,240,171,107,0,32,188,207,0,54,244,154,0,227,169,29,0,94,97,145,0,8,27,230,0,133,153,101,0,160,20,95,0,141,64,104,0,128,216,255,0,39,115,77,0,6,6,49,0,202,86,21,0,201,168,115,0,123,226,96,0,107,140,192,0,116,0,0,0,146,88,2,0,110,0,0,0,148,88,2,0,114,0,0,0,150,88,2,0,102,0,0,0,152,88,2,0,97,0,0,0,154,88,2,0,101,0,0,0,156,88,2,0,119,0,0,0,158,88,2,0,87,0,0,0,171,88,2,0,115,0,0,0,185,88,2,0,83,0,0,0,197,88,2,0,100,0,0,0,210,88,2,0,68,0,0,0,222,88,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,4,0,27,0,27,0,32,0,32,0,35,0,33,0,10,0,2,0,22,0,9,0,33,0,33,0,33,0,21,0,28,0,1,0,20,0,20,0,20,0,20,0,20,0,20,0,20,0,8,0,4,0,5,0,27,0,2,0,23,0,27,0,32,0,31,0,30,0,29,0,9,0,19,0,0,0,21,0,18,0,21,0,3,0,7,0,21,0,21,0,20,0,20,0,20,0,20,0,20,0,20,0,20,0,20,0,8,0,4,0,5,0,5,0,6,0,27,0,26,0,24,0,25,0,32,0,7,0,21,0,20,0,20,0,20,0,20,0,20,0,20,0,11,0,20,0,13,0,20,0,12,0,20,0,20,0,20,0,14,0,20,0,20,0,20,0,16,0,20,0,15,0,20,0,17,0,0,0,0,0,0,0,174,0,46,0,47,0,51,0,53,0,48,0,55,0,170,0,219,0,219,0,219,0,219,0,0,0,61,0,135,0,55,0,55,0,219,0,219,0,0,0,40,0,53,0,46,0,50,0,47,0,98,0,0,0,0,0,71,0,0,0,0,0,219,0,81,0,0,0,219,0,219,0,219,0,0,0,219,0,132,0,85,0,219,0,130,0,219,0,0,0,129,0,219,0,0,0,62,0,66,0,65,0,72,0,68,0,82,0,91,0,0,0,0,0,94,0,95,0,219,0,0,0,219,0,219,0,219,0,0,0,0,0,123,0,73,0,87,0,82,0,90,0,90,0,93,0,0,0,95,0,0,0,95,0,0,0,101,0,93,0,95,0,0,0,93,0,110,0,106,0,0,0,105,0,0,0,110,0,0,0,219,0,147,0,154,0,161,0,168,0,171,0,112,0,177,0,184,0,191,0,198,0,205,0,211,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,4,0,7,0,3,0,4,0,5,0,5,0,6,0,6,0,8,0,7,0,7,0,17,0,22,0,18,0,17,0,18,0,8,0,8,0,15,0,15,0,23,0,15,0,24,0,15,0,25,0,26,0,26,0,30,0,22,0,52,0,30,0,5,0,50,0,6,0,34,0,34,0,51,0,23,0,24,0,53,0,25,0,26,0,26,0,42,0,54,0,42,0,52,0,55,0,50,0,69,0,59,0,60,0,51,0,59,0,60,0,70,0,53,0,71,0,72,0,76,0,54,0,34,0,73,0,74,0,55,0,69,0,78,0,80,0,98,0,81,0,82,0,84,0,70,0,71,0,85,0,72,0,76,0,86,0,73,0,74,0,88,0,90,0,78,0,68,0,80,0,81,0,82,0,84,0,56,0,47,0,44,0,85,0,41,0,86,0,27,0,16,0,88,0,90,0,93,0,93,0,93,0,93,0,93,0,93,0,93,0,94,0,94,0,94,0,94,0,94,0,94,0,94,0,95,0,95,0,95,0,95,0,95,0,95,0,95,0,96,0,9,0,96,0,96,0,96,0,96,0,96,0,97,0,97,0,99,0,2,0,99,0,99,0,99,0,99,0,99,0,100,0,0,0,100,0,0,0,100,0,100,0,100,0,101,0,0,0,101,0,101,0,101,0,101,0,101,0,102,0,102,0,0,0,102,0,102,0,102,0,102,0,103,0,0,0,103,0,103,0,103,0,103,0,104,0,0,0,104,0,104,0,104,0,104,0,104,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,0,0,92,0,1,0,93,0,93,0,94,0,94,0,95,0,95,0,92,0,92,0,92,0,92,0,92,0,96,0,92,0,92,0,92,0,97,0,92,0,92,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,99,0,100,0,101,0,102,0,102,0,92,0,92,0,103,0,92,0,92,0,92,0,96,0,92,0,92,0,97,0,92,0,97,0,92,0,104,0,97,0,92,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,99,0,100,0,101,0,101,0,92,0,102,0,92,0,92,0,92,0,103,0,104,0,97,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,98,0,0,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,0,0,10,0,11,0,12,0,13,0,14,0,10,0,15,0,16,0,17,0,18,0,19,0,10,0,20,0,21,0,21,0,21,0,22,0,23,0,21,0,24,0,21,0,21,0,25,0,21,0,21,0,21,0,26,0,21,0,21,0,10,0,21,0,21,0,21,0,22,0,23,0,24,0,21,0,21,0,25,0,21,0,21,0,21,0,26,0,21,0,21,0,21,0,21,0,27,0,12,0,12,0,36,0,30,0,30,0,32,0,33,0,32,0,33,0,36,0,37,0,38,0,45,0,50,0,47,0,46,0,42,0,37,0,38,0,40,0,41,0,51,0,42,0,52,0,43,0,53,0,54,0,55,0,60,0,50,0,71,0,61,0,34,0,69,0,34,0,63,0,64,0,70,0,51,0,52,0,72,0,53,0,54,0,55,0,47,0,73,0,42,0,71,0,74,0,69,0,76,0,92,0,60,0,70,0,92,0,61,0,77,0,72,0,78,0,79,0,82,0,73,0,65,0,80,0,81,0,74,0,76,0,83,0,84,0,49,0,85,0,86,0,87,0,77,0,78,0,88,0,79,0,82,0,89,0,80,0,81,0,90,0,91,0,83,0,68,0,84,0,85,0,86,0,87,0,75,0,68,0,44,0,88,0,44,0,89,0,56,0,44,0,90,0,91,0,29,0,29,0,29,0,29,0,29,0,29,0,29,0,31,0,31,0,31,0,31,0,31,0,31,0,31,0,35,0,35,0,35,0,35,0,35,0,35,0,35,0,39,0,92,0,39,0,39,0,39,0,39,0,39,0,48,0,48,0,57,0,28,0,57,0,57,0,57,0,57,0,57,0,58,0,92,0,58,0,92,0,58,0,58,0,58,0,59,0,92,0,59,0,59,0,59,0,59,0,59,0,62,0,62,0,92,0,62,0,62,0,62,0,62,0,66,0,92,0,66,0,66,0,66,0,66,0,67,0,92,0,67,0,67,0,67,0,67,0,67,0,9,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,92,0,8,0,174,255,209,0,10,0,174,255,174,255,11,0,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,5,0,209,0,174,255,209,0,209,0,209,0,209,0,209,0,209,0,209,0,209,0,174,255,251,255,174,255,14,0,236,255,174,255,174,255,174,255,174,255,209,0,209,0,209,0,209,0,209,0,13,0,37,0,12,0,66,0,16,0,80,0,19,0,109,0,123,0,20,0,152,0,15,0,166,0,195,0,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,23,0,174,255,119,0,174,255,7,0,46,0,174,255,38,0,174,255,23,0,17,0,35,0,174,255,13,0,174,255,174,255,174,255,174,255,58,0,174,255,174,255,53,0,174,255,174,255,174,255,40,0,174,255,7,0,174,255,59,0,69,0,174,255,72,0,174,255,174,255,174,255,174,255,174,255,174,255,174,255,252,255,232,0,246,255,255,255,26,0,0,0,39,0,1,0,50,0,174,255,174,255,2,0,36,0,3,0,47,0,174,255,174,255,174,255,174,255,174,255,254,255,148,0,174,255,9,0,27,0,174,255,188,255,174,255,174,255,175,255,174,255,174,255,174,255,174,255,174,255,174,255,174,255,0,0,0,0,0,0,109,230,236,222,5,0,11,0,73,0,49,1,83,0,127,1,48,1,105,0,120,1,255,0,129,1,83,2,130,1,131,1,132,1,133,1,134,1,84,2,135,1,136,1,137,1,86,2,138,1,87,2,139,1,140,1,142,1,221,1,143,1,89,2,144,1,91,2,145,1,146,1,147,1,96,2,148,1,99,2,150,1,105,2,151,1,104,2,152,1,153,1,156,1,111,2,157,1,114,2,159,1,117,2,166,1,128,2,167,1,168,1,169,1,131,2,172,1,173,1,174,1,136,2,175,1,176,1,177,1,138,2,178,1,139,2,183,1,146,2,184,1,185,1,188,1,189,1,196,1,198,1,196,1,197,1,197,1,198,1,199,1,201,1,199,1,200,1,200,1,201,1,202,1,204,1,202,1,203,1,203,1,204,1,241,1,243,1,241,1,242,1,242,1,243,1,244,1,245,1,246,1,149,1,247,1,191,1,32,2,158,1,134,3,172,3,136,3,173,3,137,3,174,3,138,3,175,3,140,3,204,3,142,3,205,3,143,3,206,3,153,3,69,3,153,3,190,31,163,3,194,3,247,3,248,3,250,3,251,3,96,30,155,30,158,30,223,0,89,31,81,31,91,31,83,31,93,31,85,31,95,31,87,31,188,31,179,31,204,31,195,31,236,31,229,31,252,31,243,31,58,2,101,44,59,2,60,2,61,2,154,1,62,2,102,44,65,2,66,2,67,2,128,1,68,2,137,2,69,2,140,2,244,3,184,3,249,3,242,3,253,3,123,3,254,3,124,3,255,3,125,3,192,4,207,4,38,33,201,3,42,33,107,0,43,33,229,0,50,33,78,33,131,33,132,33,96,44,97,44,98,44,107,2,99,44,125,29,100,44,125,2,109,44,81,2,110,44,113,2,111,44,80,2,112,44,82,2,114,44,115,44,117,44,118,44,126,44,63,2,127,44,64,2,242,44,243,44,125,167,121,29,139,167,140,167,141,167,101,2,170,167,102,2,199,16,39,45,205,16,45,45,118,3,119,3,156,3,181,0,146,3,208,3,152,3,209,3,166,3,213,3,160,3,214,3,154,3,240,3,161,3,241,3,149,3,245,3,207,3,215,3,0,0,0,0,65,0,32,26,192,0,32,31,0,1,1,47,50,1,1,5,57,1,1,15,74,1,1,45,121,1,1,5,112,3,1,3,145,3,32,17,163,3,32,9,0,4,80,16,16,4,32,32,96,4,1,33,138,4,1,53,193,4,1,13,208,4,1,63,20,5,1,19,49,5,48,38,160,1,1,5,179,1,1,3,205,1,1,15,222,1,1,17,248,1,1,39,34,2,1,17,216,3,1,23,0,30,1,149,160,30,1,95,8,31,248,8,24,31,248,6,40,31,248,8,56,31,248,8,72,31,248,6,104,31,248,8,136,31,248,8,152,31,248,8,168,31,248,8,184,31,248,2,186,31,182,2,200,31,170,4,216,31,248,2,218,31,156,2,232,31,248,2,234,31,144,2,248,31,128,2,250,31,130,2,70,2,1,9,16,5,1,3,96,33,16,16,0,44,48,47,103,44,1,5,128,44,1,99,235,44,1,3,64,166,1,45,128,166,1,23,34,167,1,13,50,167,1,61,121,167,1,3,126,167,1,9,144,167,1,3,160,167,1,9,33,255,32,26,0,0,0,0,123,32,118,97,114,32,112,97,116,104,32,61,32,80,111,105,110,116,101,114,95,115,116,114,105,110,103,105,102,121,40,36,48,41,59,32,118,97,114,32,100,97,116,97,32,61,32,80,111,105,110,116,101,114,95,115,116,114,105,110,103,105,102,121,40,36,49,41,59,32,70,83,46,99,114,101,97,116,101,80,97,116,104,40,34,47,34,44,32,80,65,84,72,46,100,105,114,110,97,109,101,40,112,97,116,104,41,41,59,32,70,83,46,119,114,105,116,101,70,105,108,101,40,80,65,84,72,46,106,111,105,110,40,34,47,34,44,32,112,97,116,104,41,44,32,100,97,116,97,41,59,32,125,0,99,111,114,101,0,120,100,111,116,118,101,114,115,105,111,110,0,49,46,55,0,49,46,52,0,49,46,50,0,95,108,100,114,97,119,95,0,95,104,100,114,97,119,95,0,95,116,100,114,97,119,95,0,95,104,108,100,114,97,119,95,0,95,116,108,100,114,97,119,95,0,120,100,111,116,32,118,101,114,115,105,111,110,32,34,37,115,34,32,116,111,111,32,108,111,110,103,0,32,37,100,32,0,37,46,48,50,102,0,37,115,37,100,32,45,0,35,37,48,50,120,37,48,50,120,37,48,50,120,37,48,50,120,0,115,101,116,108,105,110,101,119,105,100,116,104,40,0,37,46,51,102,0,83,32,0,67,32,0,50,32,0,69,32,0,101,32,0,70,32,0,116,32,37,117,32,0,84,32,0,100,111,116,58,100,111,116,0,103,118,58,100,111,116,0,99,97,110,111,110,58,100,111,116,0,112,108,97,105,110,58,100,111,116,0,112,108,97,105,110,45,101,120,116,58,100,111,116,0,120,100,111,116,58,120,100,111,116,0,120,100,111,116,49,46,50,58,120,100,111,116,0,120,100,111,116,49,46,52,58,120,100,111,116,0,73,32,0,34,95,115,117,98,103,114,97,112,104,95,99,110,116,34,58,32,37,100,0,34,95,103,118,105,100,34,58,32,37,100,0,34,101,100,103,101,115,34,58,32,91,10,0,34,95,103,118,105,100,34,58,32,37,100,44,10,0,34,116,97,105,108,34,58,32,37,100,44,10,0,34,104,101,97,100,34,58,32,37,100,0,34,111,98,106,101,99,116,115,34,58,32,91,10,0,34,110,111,100,101,115,34,58,32,91,10,0,34,110,97,109,101,34,58,32,34,37,115,34,0,92,34,0,92,47,0,92,98,0,92,102,0,92,110,0,92,114,0,92,116,0,34,115,117,98,103,114,97,112,104,115,34,58,32,91,10,0,34,37,115,34,58,32,0,34,37,115,34,0,67,111,117,108,100,32,110,111,116,32,112,97,114,115,101,32,120,100,111,116,32,34,37,115,34,10,0,91,10,0,34,111,112,34,58,32,34,37,99,34,44,10,0,34,114,101,99,116,34,58,32,91,37,46,48,51,102,44,37,46,48,51,102,44,37,46,48,51,102,44,37,46,48,51,102,93,10,0,34,111,112,34,58,32,34,76,34,44,10,0,34,111,112,34,58,32,34,84,34,44,10,0,34,112,116,34,58,32,91,37,46,48,51,102,44,37,46,48,51,102,93,44,10,0,34,97,108,105,103,110,34,58,32,34,37,99,34,44,10,0,34,119,105,100,116,104,34,58,32,37,46,48,51,102,44,10,0,34,116,101,120,116,34,58,32,34,37,115,34,10,0,34,103,114,97,100,34,58,32,34,110,111,110,101,34,44,10,0,34,99,111,108,111,114,34,58,32,34,37,115,34,10,0,34,103,114,97,100,34,58,32,34,108,105,110,101,97,114,34,44,10,0,34,103,114,97,100,34,58,32,34,114,97,100,105,97,108,34,44,10,0,34,111,112,34,58,32,34,70,34,44,10,0,34,115,105,122,101,34,58,32,37,46,48,51,102,44,10,0,34,102,97,99,101,34,58,32,34,37,115,34,10,0,34,111,112,34,58,32,34,83,34,44,10,0,34,115,116,121,108,101,34,58,32,34,37,115,34,10,0,34,111,112,34,58,32,34,116,34,44,10,0,34,102,111,110,116,99,104,97,114,34,58,32,37,100,10,0,34,112,48,34,58,32,91,37,46,48,51,102,44,37,46,48,51,102,44,37,46,48,51,102,93,44,10,0,34,112,49,34,58,32,91,37,46,48,51,102,44,37,46,48,51,102,44,37,46,48,51,102,93,44,10,0,34,115,116,111,112,115,34,58,32,91,0,123,34,102,114,97,99,34,58,32,37,46,48,51,102,44,32,34,99,111,108,111,114,34,58,32,34,37,115,34,125,0,93,10,0,34,112,48,34,58,32,91,37,46,48,51,102,44,37,46,48,51,102,93,44,10,0,34,112,49,34,58,32,91,37,46,48,51,102,44,37,46,48,51,102,93,44,10,0,34,112,111,105,110,116,115,34,58,32,91,0,91,37,46,48,51,102,44,37,46,48,51,102,93,0,100,114,97,119,95,0,108,100,114,97,119,95,0,104,100,114,97,119,95,0,116,100,114,97,119,95,0,104,108,100,114,97,119,95,0,116,108,100,114,97,119,95,0,34,100,105,114,101,99,116,101,100,34,58,32,37,115,44,10,0,34,115,116,114,105,99,116,34,58,32,37,115,0,68,117,112,108,105,99,97,116,101,32,99,108,117,115,116,101,114,32,110,97,109,101,32,34,37,115,34,10,0,120,100,111,116,0,106,115,111,110,0,106,115,111,110,48,0,100,111,116,95,106,115,111,110,0,120,100,111,116,95,106,115,111,110,0,106,115,111,110,58,106,115,111,110,0,106,115,111,110,48,58,106,115,111,110,0,100,111,116,95,106,115,111,110,58,106,115,111,110,0,120,100,111,116,95,106,115,111,110,58,106,115,111,110,0,110,32,62,61,32,52,0,103,118,114,101,110,100,101,114,95,99,111,114,101,95,102,105,103,46,99,0,102,105,103,95,98,101,122,105,101,114,0,102,105,103,95,114,101,115,111,108,118,101,95,99,111,108,111,114,0,102,105,103,0,102,105,103,58,102,105,103,0,109,97,112,0,114,101,99,116,32,37,115,32,37,100,44,37,100,32,37,100,44,37,100,10,0,99,105,114,99,108,101,32,37,115,32,37,100,44,37,100,44,37,100,10,0,112,111,108,121,32,37,115,0,32,37,100,44,37,100,0,103,118,114,101,110,100,101,114,95,99,111,114,101,95,109,97,112,46,99,0,109,97,112,95,111,117,116,112,117,116,95,115,104,97,112,101,0,114,101,99,116,97,110,103,108,101,32,40,37,100,44,37,100,41,32,40,37,100,44,37,100,41,32,37,115,32,37,115,10,0,60,97,114,101,97,32,115,104,97,112,101,61,34,99,105,114,99,108,101,34,0,60,97,114,101,97,32,115,104,97,112,101,61,34,114,101,99,116,34,0,60,97,114,101,97,32,115,104,97,112,101,61,34,112,111,108,121,34,0,32,104,114,101,102,61,34,0,32,116,105,116,108,101,61,34,0,32,97,108,116,61,34,34,0,32,99,111,111,114,100,115,61,34,0,37,100,44,37,100,44,37,100,0,37,100,44,37,100,44,37,100,44,37,100,0,37,100,44,37,100,0,44,37,100,44,37,100,0,34,62,10,0,60,47,109,97,112,62,10,0,98,97,115,101,32,114,101,102,101,114,101,114,10,0,100,101,102,97,117,108,116,32,0,60,109,97,112,32,105,100,61,34,0,34,32,110,97,109,101,61,34,0,105,115,109,97,112,58,109,97,112,0,99,109,97,112,58,109,97,112,0,105,109,97,112,58,109,97,112,0,99,109,97,112,120,58,109,97,112,0,105,109,97,112,95,110,112,58,109,97,112,0,99,109,97,112,120,95,110,112,58,109,97,112,0,35,32,37,115,10,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,46,49,102,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,46,49,102,32,37,100,32,37,100,32,37,100,32,37,100,10,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,46,51,102,32,37,100,32,37,46,52,102,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,0,37,100,32,37,100,32,35,37,48,50,120,37,48,50,120,37,48,50,120,10,0,103,118,114,101,110,100,101,114,95,99,111,114,101,95,109,112,46,99,0,109,112,95,114,101,115,111,108,118,101,95,99,111,108,111,114,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,46,49,102,32,37,46,52,102,32,37,100,32,37,46,49,102,32,37,46,49,102,32,37,100,32,37,100,32,37,115,92,48,48,49,10,0,35,32,101,110,100,32,111,102,32,70,73,71,32,102,105,108,101,10,0,35,70,73,71,32,51,46,50,10,0,35,32,71,101,110,101,114,97,116,101,100,32,98,121,32,37,115,32,118,101,114,115,105,111,110,32,37,115,32,40,37,115,41,10,0,35,32,84,105,116,108,101,58,32,37,115,10,0,35,32,80,97,103,101,115,58,32,37,100,10,0,80,111,114,116,114,97,105,116,10,0,67,101,110,116,101,114,10,0,73,110,99,104,101,115,10,0,76,101,116,116,101,114,10,0,49,48,48,46,48,48,10,0,83,105,110,103,108,101,10,0,45,50,10,0,49,50,48,48,0,32,50,10,0,109,112,0,109,112,58,109,112,0,32,93,32,32,37,100,32,116,114,117,101,32,37,115,10,0,32,93,32,32,37,100,32,102,97,108,115,101,32,37,115,10,0,32,115,101,116,108,105,110,101,119,105,100,116,104,10,0,37,115,32,0,115,101,116,104,115,98,0,37,46,53,103,32,37,46,53,103,32,37,46,53,103,32,37,115,99,111,108,111,114,10,0,37,32,0,110,101,119,112,97,116,104,32,0,32,109,111,118,101,116,111,10,0,32,108,105,110,101,116,111,10,0,115,116,114,111,107,101,10,0,32,99,117,114,118,101,116,111,10,0,99,108,111,115,101,112,97,116,104,32,102,105,108,108,10,0,99,108,111,115,101,112,97,116,104,32,115,116,114,111,107,101,10,0,32,101,108,108,105,112,115,101,95,112,97,116,104,32,102,105,108,108,10,0,32,101,108,108,105,112,115,101,95,112,97,116,104,32,115,116,114,111,107,101,10,0,32,47,37,115,32,115,101,116,95,102,111,110,116,10,0,32,109,111,118,101,116,111,32,0,32,37,115,32,97,108,105,103,110,101,100,116,101,120,116,10,0,91,32,47,82,101,99,116,32,91,32,0,32,93,10,0,32,32,47,66,111,114,100,101,114,32,91,32,48,32,48,32,48,32,93,10,32,32,47,65,99,116,105,111,110,32,60,60,32,47,83,117,98,116,121,112,101,32,47,85,82,73,32,47,85,82,73,32,37,115,32,62,62,10,32,32,47,83,117,98,116,121,112,101,32,47,76,105,110,107,10,47,65,78,78,32,112,100,102,109,97,114,107,10,0,103,115,97,118,101,10,0,37,37,32,37,115,10,0,48,32,48,32,48,32,101,100,103,101,99,111,108,111,114,10,0,101,110,100,112,97,103,101,10,115,104,111,119,112,97,103,101,10,103,114,101,115,116,111,114,101,10,0,37,37,80,97,103,101,84,114,97,105,108,101,114,10,0,37,37,37,37,69,110,100,80,97,103,101,58,32,37,100,10,0,37,37,37,37,80,97,103,101,58,32,37,100,32,37,100,10,0,37,37,37,37,80,97,103,101,66,111,117,110,100,105,110,103,66,111,120,58,32,37,100,32,37,100,32,37,100,32,37,100,10,0,76,97,110,100,115,99,97,112,101,0,80,111,114,116,114,97,105,116,0,37,37,37,37,80,97,103,101,79,114,105,101,110,116,97,116,105,111,110,58,32,37,115,10,0,60,60,32,47,80,97,103,101,83,105,122,101,32,91,37,100,32,37,100,93,32,62,62,32,115,101,116,112,97,103,101,100,101,118,105,99,101,10,0,37,100,32,37,100,32,37,100,32,98,101,103,105,110,112,97,103,101,10,0,103,115,97,118,101,10,37,100,32,37,100,32,37,100,32,37,100,32,98,111,120,112,114,105,109,32,99,108,105,112,32,110,101,119,112,97,116,104,10,0,37,103,32,37,103,32,115,101,116,95,115,99,97,108,101,32,37,100,32,114,111,116,97,116,101,32,37,103,32,37,103,32,116,114,97,110,115,108,97,116,101,10,0,99,97,110,118,97,115,32,115,105,122,101,32,40,37,100,44,37,100,41,32,101,120,99,101,101,100,115,32,80,68,70,32,108,105,109,105,116,32,40,37,100,41,10,9,40,115,117,103,103,101,115,116,32,115,101,116,116,105,110,103,32,97,32,98,111,117,110,100,105,110,103,32,98,111,120,32,115,105,122,101,44,32,115,101,101,32,100,111,116,40,49,41,41,10,0,91,32,47,67,114,111,112,66,111,120,32,91,37,100,32,37,100,32,37,100,32,37,100,93,32,47,80,65,71,69,83,32,112,100,102,109,97,114,107,10,0,37,100,32,37,100,32,115,101,116,108,97,121,101,114,10,0,37,37,37,37,84,105,116,108,101,58,32,37,115,10,0,37,37,80,97,103,101,115,58,32,40,97,116,101,110,100,41,10,0,37,37,80,97,103,101,115,58,32,49,10,0,37,37,66,111,117,110,100,105,110,103,66,111,120,58,32,40,97,116,101,110,100,41,10,0,37,37,37,37,66,111,117,110,100,105,110,103,66,111,120,58,32,37,100,32,37,100,32,37,100,32,37,100,10,0,37,37,69,110,100,67,111,109,109,101,110,116,115,10,115,97,118,101,10,0,115,101,116,117,112,76,97,116,105,110,49,10,0,91,32,123,67,97,116,97,108,111,103,125,32,60,60,32,47,85,82,73,32,60,60,32,47,66,97,115,101,32,37,115,32,62,62,32,62,62,10,47,80,85,84,32,112,100,102,109,97,114,107,10,0,37,37,66,101,103,105,110,80,114,111,108,111,103,0,47,68,111,116,68,105,99,116,32,50,48,48,32,100,105,99,116,32,100,101,102,0,68,111,116,68,105,99,116,32,98,101,103,105,110,0,47,115,101,116,117,112,76,97,116,105,110,49,32,123,0,109,97,114,107,0,47,69,110,99,111,100,105,110,103,86,101,99,116,111,114,32,50,53,54,32,97,114,114,97,121,32,100,101,102,0,32,69,110,99,111,100,105,110,103,86,101,99,116,111,114,32,48,0,73,83,79,76,97,116,105,110,49,69,110,99,111,100,105,110,103,32,48,32,50,53,53,32,103,101,116,105,110,116,101,114,118,97,108,32,112,117,116,105,110,116,101,114,118,97,108,0,69,110,99,111,100,105,110,103,86,101,99,116,111,114,32,52,53,32,47,104,121,112,104,101,110,32,112,117,116,0,37,32,83,101,116,32,117,112,32,73,83,79,32,76,97,116,105,110,32,49,32,99,104,97,114,97,99,116,101,114,32,101,110,99,111,100,105,110,103,0,47,115,116,97,114,110,101,116,73,83,79,32,123,0,32,32,32,32,32,32,32,32,100,117,112,32,100,117,112,32,102,105,110,100,102,111,110,116,32,100,117,112,32,108,101,110,103,116,104,32,100,105,99,116,32,98,101,103,105,110,0,32,32,32,32,32,32,32,32,123,32,49,32,105,110,100,101,120,32,47,70,73,68,32,110,101,32,123,32,100,101,102,32,125,123,32,112,111,112,32,112,111,112,32,125,32,105,102,101,108,115,101,0,32,32,32,32,32,32,32,32,125,32,102,111,114,97,108,108,0,32,32,32,32,32,32,32,32,47,69,110,99,111,100,105,110,103,32,69,110,99,111,100,105,110,103,86,101,99,116,111,114,32,100,101,102,0,32,32,32,32,32,32,32,32,99,117,114,114,101,110,116,100,105,99,116,32,101,110,100,32,100,101,102,105,110,101,102,111,110,116,0,125,32,100,101,102,0,47,84,105,109,101,115,45,82,111,109,97,110,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,47,84,105,109,101,115,45,73,116,97,108,105,99,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,47,84,105,109,101,115,45,66,111,108,100,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,47,84,105,109,101,115,45,66,111,108,100,73,116,97,108,105,99,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,47,72,101,108,118,101,116,105,99,97,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,47,72,101,108,118,101,116,105,99,97,45,79,98,108,105,113,117,101,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,47,72,101,108,118,101,116,105,99,97,45,66,111,108,100,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,47,72,101,108,118,101,116,105,99,97,45,66,111,108,100,79,98,108,105,113,117,101,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,47,67,111,117,114,105,101,114,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,47,67,111,117,114,105,101,114,45,79,98,108,105,113,117,101,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,47,67,111,117,114,105,101,114,45,66,111,108,100,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,47,67,111,117,114,105,101,114,45,66,111,108,100,79,98,108,105,113,117,101,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,99,108,101,97,114,116,111,109,97,114,107,0,125,32,98,105,110,100,32,100,101,102,0,37,37,66,101,103,105,110,82,101,115,111,117,114,99,101,58,32,112,114,111,99,115,101,116,32,103,114,97,112,104,118,105,122,32,48,32,48,0,47,99,111,111,114,100,45,102,111,110,116,45,102,97,109,105,108,121,32,47,84,105,109,101,115,45,82,111,109,97,110,32,100,101,102,0,47,100,101,102,97,117,108,116,45,102,111,110,116,45,102,97,109,105,108,121,32,47,84,105,109,101,115,45,82,111,109,97,110,32,100,101,102,0,47,99,111,111,114,100,102,111,110,116,32,99,111,111,114,100,45,102,111,110,116,45,102,97,109,105,108,121,32,102,105,110,100,102,111,110,116,32,56,32,115,99,97,108,101,102,111,110,116,32,100,101,102,0,47,73,110,118,83,99,97,108,101,70,97,99,116,111,114,32,49,46,48,32,100,101,102,0,47,115,101,116,95,115,99,97,108,101,32,123,0,32,32,32,32,32,32,32,100,117,112,32,49,32,101,120,99,104,32,100,105,118,32,47,73,110,118,83,99,97,108,101,70,97,99,116,111,114,32,101,120,99,104,32,100,101,102,0,32,32,32,32,32,32,32,115,99,97,108,101,0,37,32,115,116,121,108,101,115,0,47,115,111,108,105,100,32,123,32,91,93,32,48,32,115,101,116,100,97,115,104,32,125,32,98,105,110,100,32,100,101,102,0,47,100,97,115,104,101,100,32,123,32,91,57,32,73,110,118,83,99,97,108,101,70,97,99,116,111,114,32,109,117,108,32,100,117,112,32,93,32,48,32,115,101,116,100,97,115,104,32,125,32,98,105,110,100,32,100,101,102,0,47,100,111,116,116,101,100,32,123,32,91,49,32,73,110,118,83,99,97,108,101,70,97,99,116,111,114,32,109,117,108,32,54,32,73,110,118,83,99,97,108,101,70,97,99,116,111,114,32,109,117,108,93,32,48,32,115,101,116,100,97,115,104,32,125,32,98,105,110,100,32,100,101,102,0,47,105,110,118,105,115,32,123,47,102,105,108,108,32,123,110,101,119,112,97,116,104,125,32,100,101,102,32,47,115,116,114,111,107,101,32,123,110,101,119,112,97,116,104,125,32,100,101,102,32,47,115,104,111,119,32,123,112,111,112,32,110,101,119,112,97,116,104,125,32,100,101,102,125,32,98,105,110,100,32,100,101,102,0,47,98,111,108,100,32,123,32,50,32,115,101,116,108,105,110,101,119,105,100,116,104,32,125,32,98,105,110,100,32,100,101,102,0,47,102,105,108,108,101,100,32,123,32,125,32,98,105,110,100,32,100,101,102,0,47,117,110,102,105,108,108,101,100,32,123,32,125,32,98,105,110,100,32,100,101,102,0,47,114,111,117,110,100,101,100,32,123,32,125,32,98,105,110,100,32,100,101,102,0,47,100,105,97,103,111,110,97,108,115,32,123,32,125,32,98,105,110,100,32,100,101,102,0,47,116,97,112,101,114,101,100,32,123,32,125,32,98,105,110,100,32,100,101,102,0,37,32,104,111,111,107,115,32,102,111,114,32,115,101,116,116,105,110,103,32,99,111,108,111,114,32,0,47,110,111,100,101,99,111,108,111,114,32,123,32,115,101,116,104,115,98,99,111,108,111,114,32,125,32,98,105,110,100,32,100,101,102,0,47,101,100,103,101,99,111,108,111,114,32,123,32,115,101,116,104,115,98,99,111,108,111,114,32,125,32,98,105,110,100,32,100,101,102,0,47,103,114,97,112,104,99,111,108,111,114,32,123,32,115,101,116,104,115,98,99,111,108,111,114,32,125,32,98,105,110,100,32,100,101,102,0,47,110,111,112,99,111,108,111,114,32,123,112,111,112,32,112,111,112,32,112],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+61464);allocate([111,112,125,32,98,105,110,100,32,100,101,102,0,47,98,101,103,105,110,112,97,103,101,32,123,9,37,32,105,32,106,32,110,112,97,103,101,115,0,9,47,110,112,97,103,101,115,32,101,120,99,104,32,100,101,102,0,9,47,106,32,101,120,99,104,32,100,101,102,0,9,47,105,32,101,120,99,104,32,100,101,102,0,9,47,115,116,114,32,49,48,32,115,116,114,105,110,103,32,100,101,102,0,9,110,112,97,103,101,115,32,49,32,103,116,32,123,0,9,9,103,115,97,118,101,0,9,9,9,99,111,111,114,100,102,111,110,116,32,115,101,116,102,111,110,116,0,9,9,9,48,32,48,32,109,111,118,101,116,111,0,9,9,9,40,92,40,41,32,115,104,111,119,32,105,32,115,116,114,32,99,118,115,32,115,104,111,119,32,40,44,41,32,115,104,111,119,32,106,32,115,116,114,32,99,118,115,32,115,104,111,119,32,40,92,41,41,32,115,104,111,119,0,9,9,103,114,101,115,116,111,114,101,0,9,125,32,105,102,0,47,115,101,116,95,102,111,110,116,32,123,0,9,102,105,110,100,102,111,110,116,32,101,120,99,104,0,9,115,99,97,108,101,102,111,110,116,32,115,101,116,102,111,110,116,0,37,32,100,114,97,119,32,116,101,120,116,32,102,105,116,116,101,100,32,116,111,32,105,116,115,32,101,120,112,101,99,116,101,100,32,119,105,100,116,104,0,47,97,108,105,103,110,101,100,116,101,120,116,32,123,9,9,9,37,32,119,105,100,116,104,32,116,101,120,116,0,9,47,116,101,120,116,32,101,120,99,104,32,100,101,102,0,9,47,119,105,100,116,104,32,101,120,99,104,32,100,101,102,0,9,103,115,97,118,101,0,9,9,119,105,100,116,104,32,48,32,103,116,32,123,0,9,9,9,91,93,32,48,32,115,101,116,100,97,115,104,0,9,9,9,116,101,120,116,32,115,116,114,105,110,103,119,105,100,116,104,32,112,111,112,32,119,105,100,116,104,32,101,120,99,104,32,115,117,98,32,116,101,120,116,32,108,101,110,103,116,104,32,100,105,118,32,48,32,116,101,120,116,32,97,115,104,111,119,0,9,9,125,32,105,102,0,9,103,114,101,115,116,111,114,101,0,47,98,111,120,112,114,105,109,32,123,9,9,9,9,37,32,120,99,111,114,110,101,114,32,121,99,111,114,110,101,114,32,120,115,105,122,101,32,121,115,105,122,101,0,9,9,52,32,50,32,114,111,108,108,0,9,9,109,111,118,101,116,111,0,9,9,50,32,99,111,112,121,0,9,9,101,120,99,104,32,48,32,114,108,105,110,101,116,111,0,9,9,48,32,101,120,99,104,32,114,108,105,110,101,116,111,0,9,9,112,111,112,32,110,101,103,32,48,32,114,108,105,110,101,116,111,0,9,9,99,108,111,115,101,112,97,116,104,0,47,101,108,108,105,112,115,101,95,112,97,116,104,32,123,0,9,47,114,121,32,101,120,99,104,32,100,101,102,0,9,47,114,120,32,101,120,99,104,32,100,101,102,0,9,47,121,32,101,120,99,104,32,100,101,102,0,9,47,120,32,101,120,99,104,32,100,101,102,0,9,109,97,116,114,105,120,32,99,117,114,114,101,110,116,109,97,116,114,105,120,0,9,110,101,119,112,97,116,104,0,9,120,32,121,32,116,114,97,110,115,108,97,116,101,0,9,114,120,32,114,121,32,115,99,97,108,101,0,9,48,32,48,32,49,32,48,32,51,54,48,32,97,114,99,0,9,115,101,116,109,97,116,114,105,120,0,47,101,110,100,112,97,103,101,32,123,32,115,104,111,119,112,97,103,101,32,125,32,98,105,110,100,32,100,101,102,0,47,115,104,111,119,112,97,103,101,32,123,32,125,32,100,101,102,0,47,108,97,121,101,114,99,111,108,111,114,115,101,113,0,9,91,9,37,32,108,97,121,101,114,32,99,111,108,111,114,32,115,101,113,117,101,110,99,101,32,45,32,100,97,114,107,101,115,116,32,116,111,32,108,105,103,104,116,101,115,116,0,9,9,91,48,32,48,32,48,93,0,9,9,91,46,50,32,46,56,32,46,56,93,0,9,9,91,46,52,32,46,56,32,46,56,93,0,9,9,91,46,54,32,46,56,32,46,56,93,0,9,9,91,46,56,32,46,56,32,46,56,93,0,9,93,0,100,101,102,0,47,108,97,121,101,114,108,101,110,32,108,97,121,101,114,99,111,108,111,114,115,101,113,32,108,101,110,103,116,104,32,100,101,102,0,47,115,101,116,108,97,121,101,114,32,123,47,109,97,120,108,97,121,101,114,32,101,120,99,104,32,100,101,102,32,47,99,117,114,108,97,121,101,114,32,101,120,99,104,32,100,101,102,0,9,108,97,121,101,114,99,111,108,111,114,115,101,113,32,99,117,114,108,97,121,101,114,32,49,32,115,117,98,32,108,97,121,101,114,108,101,110,32,109,111,100,32,103,101,116,0,9,97,108,111,97,100,32,112,111,112,32,115,101,116,104,115,98,99,111,108,111,114,0,9,47,110,111,100,101,99,111,108,111,114,32,123,110,111,112,99,111,108,111,114,125,32,100,101,102,0,9,47,101,100,103,101,99,111,108,111,114,32,123,110,111,112,99,111,108,111,114,125,32,100,101,102,0,9,47,103,114,97,112,104,99,111,108,111,114,32,123,110,111,112,99,111,108,111,114,125,32,100,101,102,0,47,111,110,108,97,121,101,114,32,123,32,99,117,114,108,97,121,101,114,32,110,101,32,123,105,110,118,105,115,125,32,105,102,32,125,32,100,101,102,0,47,111,110,108,97,121,101,114,115,32,123,0,9,47,109,121,117,112,112,101,114,32,101,120,99,104,32,100,101,102,0,9,47,109,121,108,111,119,101,114,32,101,120,99,104,32,100,101,102,0,9,99,117,114,108,97,121,101,114,32,109,121,108,111,119,101,114,32,108,116,0,9,99,117,114,108,97,121,101,114,32,109,121,117,112,112,101,114,32,103,116,0,9,111,114,0,9,123,105,110,118,105,115,125,32,105,102,0,47,99,117,114,108,97,121,101,114,32,48,32,100,101,102,0,37,37,69,110,100,82,101,115,111,117,114,99,101,0,37,37,69,110,100,80,114,111,108,111,103,0,37,37,66,101,103,105,110,83,101,116,117,112,0,49,52,32,100,101,102,97,117,108,116,45,102,111,110,116,45,102,97,109,105,108,121,32,115,101,116,95,102,111,110,116,0,37,32,47,97,114,114,111,119,108,101,110,103,116,104,32,49,48,32,100,101,102,0,37,32,47,97,114,114,111,119,119,105,100,116,104,32,53,32,100,101,102,0,37,32,109,97,107,101,32,115,117,114,101,32,112,100,102,109,97,114,107,32,105,115,32,104,97,114,109,108,101,115,115,32,102,111,114,32,80,83,45,105,110,116,101,114,112,114,101,116,101,114,115,32,111,116,104,101,114,32,116,104,97,110,32,68,105,115,116,105,108,108,101,114,0,47,112,100,102,109,97,114,107,32,119,104,101,114,101,32,123,112,111,112,125,32,123,117,115,101,114,100,105,99,116,32,47,112,100,102,109,97,114,107,32,47,99,108,101,97,114,116,111,109,97,114,107,32,108,111,97,100,32,112,117,116,125,32,105,102,101,108,115,101,0,37,32,109,97,107,101,32,39,60,60,39,32,97,110,100,32,39,62,62,39,32,115,97,102,101,32,111,110,32,80,83,32,76,101,118,101,108,32,49,32,100,101,118,105,99,101,115,0,47,108,97,110,103,117,97,103,101,108,101,118,101,108,32,119,104,101,114,101,32,123,112,111,112,32,108,97,110,103,117,97,103,101,108,101,118,101,108,125,123,49,125,32,105,102,101,108,115,101,0,50,32,108,116,32,123,0,32,32,32,32,117,115,101,114,100,105,99,116,32,40,60,60,41,32,99,118,110,32,40,91,41,32,99,118,110,32,108,111,97,100,32,112,117,116,0,32,32,32,32,117,115,101,114,100,105,99,116,32,40,62,62,41,32,99,118,110,32,40,91,41,32,99,118,110,32,108,111,97,100,32,112,117,116,0,125,32,105,102,0,37,37,69,110,100,83,101,116,117,112,0,37,37,84,114,97,105,108,101,114,10,0,37,37,37,37,80,97,103,101,115,58,32,37,100,10,0,101,110,100,10,114,101,115,116,111,114,101,10,0,37,37,69,79,70,10,0,37,33,80,83,45,65,100,111,98,101,45,51,46,48,0,32,69,80,83,70,45,51,46,48,10,0,37,37,37,37,67,114,101,97,116,111,114,58,32,37,115,32,118,101,114,115,105,111,110,32,37,115,32,40,37,115,41,10,0,112,115,50,58,112,115,0,60,33,45,45,32,0,60,112,111,108,121,108,105,110,101,0,32,112,111,105,110,116,115,61,34,0,34,47,62,10,0,32,102,105,108,108,61,34,0,117,114,108,40,35,108,95,37,100,41,0,117,114,108,40,35,114,95,37,100,41,0,34,32,102,105,108,108,45,111,112,97,99,105,116,121,61,34,37,102,0,34,32,115,116,114,111,107,101,61,34,0,34,32,115,116,114,111,107,101,45,119,105,100,116,104,61,34,0,34,32,115,116,114,111,107,101,45,100,97,115,104,97,114,114,97,121,61,34,37,115,0,53,44,50,0,49,44,53,0,34,32,115,116,114,111,107,101,45,111,112,97,99,105,116,121,61,34,37,102,0,103,118,114,101,110,100,101,114,95,99,111,114,101,95,115,118,103,46,99,0,115,118,103,95,112,114,105,110,116,95,99,111,108,111,114,0,60,112,97,116,104,0,32,105,100,61,34,0,95,112,34,32,0,32,100,61,34,0,37,99,0,60,100,101,102,115,62,10,60,114,97,100,105,97,108,71,114,97,100,105,101,110,116,32,105,100,61,34,114,95,37,100,34,32,99,120,61,34,53,48,37,37,34,32,99,121,61,34,53,48,37,37,34,32,114,61,34,55,53,37,37,34,32,102,120,61,34,37,100,37,37,34,32,102,121,61,34,37,100,37,37,34,62,10,0,60,115,116,111,112,32,111,102,102,115,101,116,61,34,48,34,32,115,116,121,108,101,61,34,115,116,111,112,45,99,111,108,111,114,58,0,59,115,116,111,112,45,111,112,97,99,105,116,121,58,0,49,46,0,59,34,47,62,10,0,60,115,116,111,112,32,111,102,102,115,101,116,61,34,49,34,32,115,116,121,108,101,61,34,115,116,111,112,45,99,111,108,111,114,58,0,59,34,47,62,10,60,47,114,97,100,105,97,108,71,114,97,100,105,101,110,116,62,10,60,47,100,101,102,115,62,10,0,60,100,101,102,115,62,10,60,108,105,110,101,97,114,71,114,97,100,105,101,110,116,32,105,100,61,34,108,95,37,100,34,32,103,114,97,100,105,101,110,116,85,110,105,116,115,61,34,117,115,101,114,83,112,97,99,101,79,110,85,115,101,34,32,0,120,49,61,34,0,34,32,121,49,61,34,0,34,32,120,50,61,34,0,34,32,121,50,61,34,0,34,32,62,10,0,60,115,116,111,112,32,111,102,102,115,101,116,61,34,37,46,48,51,102,34,32,115,116,121,108,101,61,34,115,116,111,112,45,99,111,108,111,114,58,0,59,34,47,62,10,60,47,108,105,110,101,97,114,71,114,97,100,105,101,110,116,62,10,60,47,100,101,102,115,62,10,0,60,112,111,108,121,103,111,110,0,60,101,108,108,105,112,115,101,0,32,99,120,61,34,0,34,32,99,121,61,34,0,34,32,114,120,61,34,0,34,32,114,121,61,34,0,60,116,101,120,116,0,32,116,101,120,116,45,97,110,99,104,111,114,61,34,115,116,97,114,116,34,0,32,116,101,120,116,45,97,110,99,104,111,114,61,34,101,110,100,34,0,32,116,101,120,116,45,97,110,99,104,111,114,61,34,109,105,100,100,108,101,34,0,32,120,61,34,0,34,32,121,61,34,0,32,102,111,110,116,45,102,97,109,105,108,121,61,34,37,115,0,44,37,115,0,32,102,111,110,116,45,119,101,105,103,104,116,61,34,37,115,34,0,32,102,111,110,116,45,115,116,114,101,116,99,104,61,34,37,115,34,0,32,102,111,110,116,45,115,116,121,108,101,61,34,37,115,34,0,32,102,111,110,116,45,102,97,109,105,108,121,61,34,37,115,34,0,32,102,111,110,116,45,119,101,105,103,104,116,61,34,98,111,108,100,34,0,32,102,111,110,116,45,115,116,121,108,101,61,34,105,116,97,108,105,99,34,0,32,116,101,120,116,45,100,101,99,111,114,97,116,105,111,110,61,34,0,37,115,111,118,101,114,108,105,110,101,0,37,115,108,105,110,101,45,116,104,114,111,117,103,104,0,32,98,97,115,101,108,105,110,101,45,115,104,105,102,116,61,34,115,117,112,101,114,34,0,32,98,97,115,101,108,105,110,101,45,115,104,105,102,116,61,34,115,117,98,34,0,32,102,111,110,116,45,115,105,122,101,61,34,37,46,50,102,34,0,32,102,105,108,108,61,34,37,115,34,0,32,102,105,108,108,61,34,35,37,48,50,120,37,48,50,120,37,48,50,120,34,0,115,118,103,95,116,101,120,116,115,112,97,110,0,62,0,60,116,101,120,116,80,97,116,104,32,120,108,105,110,107,58,104,114,101,102,61,34,35,37,115,95,112,34,32,115,116,97,114,116,79,102,102,115,101,116,61,34,53,48,37,37,34,62,0,60,116,115,112,97,110,32,120,61,34,48,34,32,100,121,61,34,0,34,62,0,60,47,116,115,112,97,110,62,60,47,116,101,120,116,80,97,116,104,62,0,60,47,116,101,120,116,62,10,0,60,47,103,62,10,0,60,103,0,32,105,100,61,34,97,95,0,32,120,108,105,110,107,58,104,114,101,102,61,34,0,32,120,108,105,110,107,58,116,105,116,108,101,61,34,0,32,116,97,114,103,101,116,61,34,0,60,116,105,116,108,101,62,0,60,47,116,105,116,108,101,62,10,0,60,103,32,105,100,61,34,0,95,37,115,0,34,32,99,108,97,115,115,61,34,37,115,0,99,108,97,115,115,0,32,116,114,97,110,115,102,111,114,109,61,34,115,99,97,108,101,40,0,41,32,114,111,116,97,116,101,40,37,100,41,32,116,114,97,110,115,108,97,116,101,40,0,41,34,62,10,0,60,47,115,118,103,62,10,0,60,33,45,45,0,32,80,97,103,101,115,58,32,37,100,32,45,45,62,10,0,60,115,118,103,32,119,105,100,116,104,61,34,37,100,112,116,34,32,104,101,105,103,104,116,61,34,37,100,112,116,34,10,0,32,118,105,101,119,66,111,120,61,34,37,46,50,102,32,37,46,50,102,32,37,46,50,102,32,37,46,50,102,34,0,32,120,109,108,110,115,61,34,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,50,48,48,48,47,115,118,103,34,0,32,120,109,108,110,115,58,120,108,105,110,107,61,34,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,49,57,57,57,47,120,108,105,110,107,34,0,60,63,120,109,108,32,118,101,114,115,105,111,110,61,34,49,46,48,34,32,101,110,99,111,100,105,110,103,61,34,85,84,70,45,56,34,32,115,116,97,110,100,97,108,111,110,101,61,34,110,111,34,63,62,10,0,115,116,121,108,101,115,104,101,101,116,0,60,63,120,109,108,45,115,116,121,108,101,115,104,101,101,116,32,104,114,101,102,61,34,0,34,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,63,62,10,0,60,33,68,79,67,84,89,80,69,32,115,118,103,32,80,85,66,76,73,67,32,34,45,47,47,87,51,67,47,47,68,84,68,32,83,86,71,32,49,46,49,47,47,69,78,34,10,0,32,34,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,71,114,97,112,104,105,99,115,47,83,86,71,47,49,46,49,47,68,84,68,47,115,118,103,49,49,46,100,116,100,34,62,10,0,60,33,45,45,32,71,101,110,101,114,97,116,101,100,32,98,121,32,0,100,97,114,107,98,108,117,101,0,100,97,114,107,99,121,97,110,0,100,97,114,107,103,114,97,121,0,100,97,114,107,103,114,101,121,0,100,97,114,107,109,97,103,101,110,116,97,0,100,97,114,107,114,101,100,0,108,105,103,104,116,103,114,101,101,110,0,35,32,0,32,99,114,101,97,116,101,32,108,105,110,101,32,0,32,45,102,105,108,108,32,0,32,45,100,97,115,104,32,53,0,32,45,100,97,115,104,32,50,0,103,118,114,101,110,100,101,114,95,99,111,114,101,95,116,107,46,99,0,116,107,103,101,110,95,112,114,105,110,116,95,116,97,103,115,0,103,114,97,112,104,32,108,97,98,101,108,0,32,45,116,97,103,115,32,123,37,100,37,115,37,112,125,0,116,107,103,101,110,95,112,114,105,110,116,95,99,111,108,111,114,0,36,99,0,32,45,119,105,100,116,104,32,0,32,45,115,109,111,111,116,104,32,98,101,122,105,101,114,32,0,32,99,114,101,97,116,101,32,112,111,108,121,103,111,110,32,0,32,45,111,117,116,108,105,110,101,32,0,32,99,114,101,97,116,101,32,111,118,97,108,32,0,32,99,114,101,97,116,101,32,116,101,120,116,32,0,32,45,116,101,120,116,32,123,0,125,0,32,45,102,111,110,116,32,123,0,32,37,100,125,0,32,45,97,110,99,104,111,114,32,119,0,32,45,97,110,99,104,111,114,32,101,0,35,0,32,84,105,116,108,101,58,32,0,32,80,97,103,101,115,58,32,37,100,10,0,35,32,71,101,110,101,114,97,116,101,100,32,98,121,32,0,41,10,0,116,107,0,116,107,58,116,107,0,32,32,32,32,32,32,60,33,45,45,32,0,32,45,45,62,10,0,69,114,114,111,114,32,100,117,114,105,110,103,32,99,111,110,118,101,114,115,105,111,110,32,116,111,32,34,85,84,70,45,56,34,46,32,32,81,117,105,116,105,110,103,46,10,0,32,60,118,58,115,104,97,112,101,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,97,98,115,111,108,117,116,101,59,32,0,32,119,105,100,116,104,58,32,37,100,59,32,104,101,105,103,104,116,58,32,37,100,34,32,102,105,108,108,101,100,61,34,102,97,108,115,101,34,62,0,60,118,58,112,97,116,104,32,118,61,34,0,32,109,32,0,37,46,48,102,44,37,46,48,102,32,0,32,108,32,0,32,101,32,0,34,47,62,0,60,47,118,58,115,104,97,112,101,62,10,0,60,118,58,115,116,114,111,107,101,32,99,111,108,111,114,61,34,0,34,32,119,101,105,103,104,116,61,34,37,46,48,102,112,116,0,34,32,100,97,115,104,115,116,121,108,101,61,34,100,97,115,104,0,34,32,100,97,115,104,115,116,121,108,101,61,34,100,111,116,0,34,32,47,62,0,35,37,48,50,120,37,48,50,120,37,48,50,120,0,103,118,114,101,110,100,101,114,95,99,111,114,101,95,118,109,108,46,99,0,118,109,108,95,112,114,105,110,116,95,99,111,108,111,114,0,32,119,105,100,116,104,58,32,37,100,59,32,104,101,105,103,104,116,58,32,37,100,34,0,32,62,0,60,118,58,112,97,116,104,32,32,118,61,34,0,47,62,60,47,118,58,115,104,97,112,101,62,10,0,109,32,0,37,115,37,46,48,102,44,37,46,48,102,32,0,99,32,0,32,102,105,108,108,101,100,61,34,116,114,117,101,34,32,102,105,108,108,99,111,108,111,114,61,34,0,34,32,0,32,102,105,108,108,101,100,61,34,102,97,108,115,101,34,32,0,37,46,48,102,32,37,46,48,102,32,0,108,32,0,120,32,101,32,34,47,62,0,32,32,60,118,58,111,118,97,108,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,97,98,115,111,108,117,116,101,59,0,32,108,101,102,116,58,32,37,46,50,102,59,32,116,111,112,58,32,37,46,50,102,59,0,32,119,105,100,116,104,58,32,37,46,50,102,59,32,104,101,105,103,104,116,58,32,37,46,50,102,34,0,60,47,118,58,111,118,97,108,62,10,0,60,118,58,114,101,99,116,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,97,98,115,111,108,117,116,101,59,32,0,32,115,116,114,111,107,101,100,61,34,102,97,108,115,101,34,32,102,105,108,108,101,100,61,34,102,97,108,115,101,34,62,10,0,60,118,58,116,101,120,116,98,111,120,32,105,110,115,101,116,61,34,48,44,48,44,48,44,48,34,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,97,98,115,111,108,117,116,101,59,32,118,45,116,101,120,116,45,119,114,97,112,112,105,110,103,58,39,102,97,108,115,101,39,59,112,97,100,100,105,110,103,58,39,48,39,59,0,102,111,110,116,45,102,97,109,105,108,121,58,32,39,37,115,39,59,0,102,111,110,116,45,119,101,105,103,104,116,58,32,37,115,59,0,102,111,110,116,45,115,116,114,101,116,99,104,58,32,37,115,59,0,102,111,110,116,45,115,116,121,108,101,58,32,37,115,59,0,32,102,111,110,116,45,115,105,122,101,58,32,37,46,50,102,112,116,59,0,99,111,108,111,114,58,37,115,59,0,99,111,108,111,114,58,35,37,48,50,120,37,48,50,120,37,48,50,120,59,0,118,109,108,95,116,101,120,116,115,112,97,110,0,34,62,60,99,101,110,116,101,114,62,0,60,47,99,101,110,116,101,114,62,60,47,118,58,116,101,120,116,98,111,120,62,10,0,60,47,118,58,114,101,99,116,62,10,0,60,47,97,62,10,0,60,97,0,32,104,114,101,102,61,34,37,115,34,0,32,116,105,116,108,101,61,34,37,115,34,0,32,116,97,114,103,101,116,61,34,37,115,34,0,62,10,0,60,47,118,58,103,114,111,117,112,62,10,0,60,47,68,73,86,62,10,0,60,68,73,86,32,105,100,61,39,95,86,77,76,50,95,39,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,118,105,115,105,98,105,108,105,116,121,58,104,105,100,100,101,110,34,62,10,0,60,33,45,45,32,105,110,115,101,114,116,32,97,110,121,32,111,116,104,101,114,32,104,116,109,108,32,99,111,110,116,101,110,116,32,104,101,114,101,32,45,45,62,10,0,60,68,73,86,32,105,100,61,39,95,110,111,116,86,77,76,49,95,39,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,34,62,10,0,60,33,45,45,32,116,104,105,115,32,115,104,111,117,108,100,32,111,110,108,121,32,100,105,115,112,108,97,121,32,111,110,32,78,79,78,45,73,69,32,98,114,111,119,115,101,114,115,32,45,45,62,10,0,60,72,50,62,83,111,114,114,121,44,32,116,104,105,115,32,100,105,97,103,114,97,109,32,119,105,108,108,32,111,110,108,121,32,100,105,115,112,108,97,121,32,99,111,114,114,101,99,116,108,121,32,111,110,32,73,110,116,101,114,110,101,116,32,69,120,112,108,111,114,101,114,32,53,32,40,97,110,100,32,117,112,41,32,98,114,111,119,115,101,114,115,46,60,47,72,50,62,10,0,60,68,73,86,32,105,100,61,39,95,110,111,116,86,77,76,50,95,39,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,34,62,10,0,60,33,45,45,32,105,110,115,101,114,116,32,97,110,121,32,111,116,104,101,114,32,78,79,78,45,73,69,32,104,116,109,108,32,99,111,110,116,101,110,116,32,104,101,114,101,32,45,45,62,10,0,60,47,66,79,68,89,62,10,60,47,72,84,77,76,62,10,0,60,72,69,65,68,62,0,60,77,69,84,65,32,104,116,116,112,45,101,113,117,105,118,61,34,67,111,110,116,101,110,116,45,84,121,112,101,34,32,99,111,110,116,101,110,116,61,34,116,101,120,116,47,104,116,109,108,59,32,99,104,97,114,115,101,116,61,85,84,70,45,56,34,62,10,0,60,84,73,84,76,69,62,0,60,47,84,73,84,76,69,62,0,60,33,45,45,32,80,97,103,101,115,58,32,37,100,32,45,45,62,10,0,32,32,32,60,83,67,82,73,80,84,32,76,65,78,71,85,65,71,69,61,39,74,97,118,97,115,99,114,105,112,116,39,62,10,0,32,32,32,102,117,110,99,116,105,111,110,32,98,114,111,119,115,101,114,99,104,101,99,107,40,41,10,0,32,32,32,123,10,0,32,32,32,32,32,32,118,97,114,32,117,97,32,61,32,119,105,110,100,111,119,46,110,97,118,105,103,97,116,111,114,46,117,115,101,114,65,103,101,110,116,10,0,32,32,32,32,32,32,118,97,114,32,109,115,105,101,32,61,32,117,97,46,105,110,100,101,120,79,102,32,40,32,39,77,83,73,69,32,39,32,41,10,0,32,32,32,32,32,32,118,97,114,32,105,101,118,101,114,115,59,10,0,32,32,32,32,32,32,118,97,114,32,105,116,101,109,59,10,0,32,32,32,32,32,32,118,97,114,32,86,77,76,121,101,115,61,110,101,119,32,65,114,114,97,121,40,39,95,86,77,76,49,95,39,44,39,95,86,77,76,50,95,39,41,59,10,0,32,32,32,32,32,32,118,97,114,32,86,77,76,110,111,61,110,101,119,32,65,114,114,97,121,40,39,95,110,111,116,86,77,76,49,95,39,44,39,95,110,111,116,86,77,76,50,95,39,41,59,10,0,32,32,32,32,32,32,105,102,32,40,32,109,115,105,101,32,62,32,48,32,41,123,32,32,32,32,32,32,47,47,32,73,102,32,73,110,116,101,114,110,101,116,32,69,120,112,108,111,114,101,114,44,32,114,101,116,117,114,110,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,10,0,32,32,32,32,32,32,32,32,32,105,101,118,101,114,115,61,32,112,97,114,115,101,73,110,116,32,40,117,97,46,115,117,98,115,116,114,105,110,103,32,40,109,115,105,101,43,53,44,32,117,97,46,105,110,100,101,120,79,102,32,40,39,46,39,44,32,109,115,105,101,32,41,41,41,10,0,32,32,32,32,32,32,125,10,0,32,32,32,32,32,32,105,102,32,40,105,101,118,101,114,115,62,61,53,41,123,10,0,32,32,32,32,32,32,32,102,111,114,32,40,120,32,105,110,32,86,77,76,121,101,115,41,123,10,0,32,32,32,32,32,32,32,32,32,105,116,101,109,32,61,32,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,86,77,76,121,101,115,91,120,93,41,59,10,0,32,32,32,32,32,32,32,32,32,105,102,32,40,105,116,101,109,41,32,123,10,0,32,32,32,32,32,32,32,32,32,32,32,105,116,101,109,46,115,116,121,108,101,46,118,105,115,105,98,105,108,105,116,121,61,39,118,105,115,105,98,108,101,39,59,10,0,32,32,32,32,32,32,32,32,32,125,10,0,32,32,32,32,32,32,32,125,10,0,32,32,32,32,32,32,32,102,111,114,32,40,120,32,105,110,32,86,77,76,110,111,41,123,10,0,32,32,32,32,32,32,32,32,32,105,116,101,109,32,61,32,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,86,77,76,110,111,91,120,93,41,59,10,0,32,32,32,32,32,32,32,32,32,32,32,105,116,101,109,46,115,116,121,108,101,46,118,105,115,105,98,105,108,105,116,121,61,39,104,105,100,100,101,110,39,59,10,0,32,32,32,32,32,125,101,108,115,101,123,10,0,32,32,32,32,32,125,10,0,32,32,32,125,10,0,32,32,32,60,47,83,67,82,73,80,84,62,10,0,60,47,72,69,65,68,62,0,60,66,79,68,89,32,111,110,108,111,97,100,61,39,98,114,111,119,115,101,114,99,104,101,99,107,40,41,59,39,62,10,0,60,68,73,86,32,105,100,61,39,95,86,77,76,49,95,39,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,32,100,105,115,112,108,97,121,58,105,110,108,105,110,101,59,32,118,105,115,105,98,105,108,105,116,121,58,104,105,100,100,101,110,0,32,119,105,100,116,104,58,32,37,100,112,116,59,32,104,101,105,103,104,116,58,32,37,100,112,116,34,62,10,0,60,83,84,89,76,69,62,10,0,118,92,58,42,32,123,32,98,101,104,97,118,105,111,114,58,32,117,114,108,40,35,100,101,102,97,117,108,116,35,86,77,76,41,59,100,105,115,112,108,97,121,58,105,110,108,105,110,101,45,98,108,111,99,107,125,10,0,60,47,83,84,89,76,69,62,10,0,60,120,109,108,58,110,97,109,101,115,112,97,99,101,32,110,115,61,34,117,114,110,58,115,99,104,101,109,97,115,45,109,105,99,114,111,115,111,102,116,45,99,111,109,58,118,109,108,34,32,112,114,101,102,105,120,61,34,118,34,32,47,62,10,0,32,60,118,58,103,114,111,117,112,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,32,0,32,119,105,100,116,104,58,32,37,100,112,116,59,32,104,101,105,103,104,116,58,32,37,100,112,116,34,0,32,99,111,111,114,100,111,114,105,103,105,110,61,34,48,44,48,34,32,99,111,111,114,100,115,105,122,101,61,34,37,100,44,37,100,34,32,62,0,60,72,84,77,76,62,10,0,10,60,33,45,45,32,71,101,110,101,114,97,116,101,100,32,98,121,32,0,32,118,101,114,115,105,111,110,32,0,32,40,0,41,10,45,45,62,10,0,97,113,117,97,0,102,117,99,104,115,105,97,0,108,105,109,101,0,111,108,105,118,101,0,116,101,97,108,0,118,109,108,0,118,109,108,58,118,109,108,0,47,47,42,42,42,32,99,111,109,109,101,110,116,58,32,37,115,10,0,47,47,42,42,42,32,112,111,108,121,108,105,110,101,10,0,115,99,97,108,101,32,32,32,32,60,37,57,46,51,102,44,32,37,57,46,51,102,44,32,37,57,46,51,102,62,10,0,114,111,116,97,116,101,32,32,32,60,37,57,46,51,102,44,32,37,57,46,51,102,44,32,37,57,46,51,102,62,10,0,116,114,97,110,115,108,97,116,101,60,37,57,46,51,102,44,32,37,57,46,51,102,44,32,37,57,46,51,102,62,10,0,115,112,104,101,114,101,95,115,119,101,101,112,32,123,10,32,32,32,32,37,115,10,32,32,32,32,37,100,44,10,0,108,105,110,101,97,114,95,115,112,108,105,110,101,0,60,37,57,46,51,102,44,32,37,57,46,51,102,44,32,37,57,46,51,102,62,44,32,37,46,51,102,10,0,37,115,32,32,32,32,37,115,0,32,32,32,32,116,111,108,101,114,97,110,99,101,32,48,46,48,49,10,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,125,10,0,37,115,37,115,0,37,115,32,116,114,97,110,115,109,105,116,32,37,46,51,102,0,82,101,100,0,71,114,101,101,110,0,66,108,117,101,0,114,103,98,60,37,57,46,51,102,44,32,37,57,46,51,102,44,32,37,57,46,51,102,62,32,116,114,97,110,115,109,105,116,32,37,46,51,102,0,111,111,112,115,44,32,105,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,117,110,104,97,110,100,108,101,100,32,99,111,108,111,114,32,116,121,112,101,61,37,100,32,37,115,10,0,103,118,114,101,110,100,101,114,95,99,111,114,101,95,112,111,118,46,99,0,112,111,118,95,99,111,108,111,114,95,97,115,95,115,116,114,0,112,105,103,109,101,110,116,32,123,32,99,111,108,111,114,32,37,115,32,125,10,0,112,111,118,32,114,101,110,100,101,114,101,114,58,101,108,32,45,32,37,115,10,0,47,47,42,42,42,32,98,101,122,105,101,114,10,0,98,95,115,112,108,105,110,101,0,32,32,32,32,32,32,32,32,116,111,108,101,114,97,110,99,101,32,48,46,48,49,10,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,125,10,0,47,47,42,42,42,32,112,111,108,121,103,111,110,10,0,32,32,32,32,116,111,108,101,114,97,110,99,101,32,48,46,49,10,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,125,10,0,112,111,108,121,103,111,110,32,123,32,37,100,44,10,0,60,37,57,46,51,102,44,32,37,57,46,51,102,44,32,37,57,46,51,102,62,0,37,115,10,32,32,32,32,37,115,0,10,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,125,10,0,47,47,42,42,42,32,101,108,108,105,112,115,101,10,0,116,111,114,117,115,32,123,32,37,46,51,102,44,32,37,46,51,102,10,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,125,10,0,115,112,104,101,114,101,32,123,60,37,57,46,51,102,44,32,37,57,46,51,102,44,32,37,57,46,51,102,62,44,32,49,46,48,10,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,125,10,0,47,47,42,42,42,32,116,101,120,116,115,112,97,110,58,32,37,115,44,32,102,111,110,116,115,105,122,101,32,61,32,37,46,51,102,44,32,102,111,110,116,110,97,109,101,32,61,32,37,115,10,0,115,99,97,108,101,32,37,46,51,102,10,0,116,101,120,116,32,123,10,32,32,32,32,116,116,102,32,34,37,115,34,44,10,32,32,32,32,34,37,115,34,44,32,37,46,51,102,44,32,37,46,51,102,10,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,32,32,32,32,37,115,125,10,0,32,32,32,32,110,111,95,115,104,97,100,111,119,10,0,47,47,42,42,42,32,101,110,100,95,101,100,103,101,10,0,47,47,42,42,42,32,98,101,103,105,110,95,101,100,103,101,10,0,47,47,42,42,42,32,101,110,100,95,110,111,100,101,10,0,47,47,42,42,42,32,98,101,103,105,110,95,110,111,100,101,58,32,37,115,10,0,47,47,42,42,42,32,101,110,100,95,99,108,117,115,116,101,114,10,0,47,47,42,42,42,32,98,101,103,105,110,95,99,108,117,115,116,101,114,10,0,47,47,42,42,42,32,101,110,100,95,112,97,103,101,10,0,47,47,42,42,42,32,98,101,103,105,110,95,112,97,103,101,10,0,47,47,42,42,42,32,101,110,100,95,108,97,121,101,114,10,0,47,47,42,42,42,32,98,101,103,105,110,95,108,97,121,101,114,58,32,37,115,44,32,37,100,47,37,100,10,0,47,47,42,42,42,32,101,110,100,95,103,114,97,112,104,10,0,47,47,42,42,42,32,98,101,103,105,110,95,103,114,97,112,104,32,37,115,10,0,99,97,109,101,114,97,32,123,32,108,111,99,97,116,105,111,110,32,60,37,46,51,102,32,44,32,37,46,51,102,32,44,32,37,46,51,102,62,10,32,32,32,32,32,32,32,32,32,108,111,111,107,95,97,116,32,32,60,37,46,51,102,32,44,32,37,46,51,102,32,44,32,37,46,51,102,62,10,32,32,32,32,32,32,32,32,32,114,105,103,104,116,32,120,32,42,32,105,109,97,103,101,95,119,105,100,116,104,32,47,32,105,109,97,103,101,95,104,101,105,103,104,116,10,32,32,32,32,32,32,32,32,32,97,110,103,108,101,32,37,46,51,102,10,125,10,0,47,47,115,107,121,10,112,108,97,110,101,32,123,32,60,48,44,32,49,44,32,48,62,44,32,49,32,104,111,108,108,111,119,10,32,32,32,32,116,101,120,116,117,114,101,32,123,10,32,32,32,32,32,32,32,32,112,105,103,109,101,110,116,32,123,32,98,111,122,111,32,116,117,114,98,117,108,101,110,99,101,32,48,46,57,53,10,32,32,32,32,32,32,32,32,32,32,32,32,99,111,108,111,114,95,109,97,112,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,91,48,46,48,48,32,114,103,98,32,60,48,46,48,53,44,32,48,46,50,48,44,32,48,46,53,48,62,93,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,91,48,46,53,48,32,114,103,98,32,60,48,46,48,53,44,32,48,46,50,48,44,32,48,46,53,48,62,93,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,91,48,46,55,53,32,114,103,98,32,60,49,46,48,48,44,32,49,46,48,48,44,32,49,46,48,48,62,93,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,91,48,46,55,53,32,114,103,98,32,60,48,46,50,53,44,32,48,46,50,53,44,32,48,46,50,53,62,93,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,91,49,46,48,48,32,114,103,98,32,60,48,46,53,48,44,32,48,46,53,48,44,32,48,46,53,48,62,93,10,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,115,99,97,108,101,32,60,49,46,48,48,44,32,49,46,48,48,44,32,49,46,53,48,62,32,42,32,50,46,53,48,10,32,32,32,32,32,32,32,32,32,32,32,32,116,114,97,110,115,108,97,116,101,32,60,48,46,48,48,44,32,48,46,48,48,44,32,48,46,48,48,62,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,102,105,110,105,115,104,32,123,32,97,109,98,105,101,110,116,32,49,32,100,105,102,102,117,115,101,32,48,32,125,10,32,32,32,32,125,10,32,32,32,32,115,99,97,108,101,32,49,48,48,48,48,10,125,10,47,47,109,105,115,116,10,102,111,103,32,123,32,102,111,103,95,116,121,112,101,32,50,10,32,32,32,32,100,105,115,116,97,110,99,101,32,53,48,10,32,32,32,32,99,111,108,111,114,32,114,103,98,32,60,49,46,48,48,44,32,49,46,48,48,44,32,49,46,48,48,62,32,42,32,48,46,55,53,10,32,32,32,32,102,111,103,95,111,102,102,115,101,116,32,48,46,49,48,10,32,32,32,32,102,111,103,95,97,108,116,32,49,46,53,48,10,32,32,32,32,116,117,114,98,117,108,101,110,99,101,32,49,46,55,53,10,125,10,47,47,103,110,100,10,112,108,97,110,101,32,123,32,60,48,46,48,48,44,32,49,46,48,48,44,32,48,46,48,48,62,44,32,48,10,32,32,32,32,116,101,120,116,117,114,101,32,123,10,32,32,32,32,32,32,32,32,112,105,103,109,101,110,116,123,32,99,111,108,111,114,32,114,103,98,32,60,48,46,50,53,44,32,48,46,52,53,44,32,48,46,48,48,62,32,125,10,32,32,32,32,32,32,32,32,110,111,114,109,97,108,32,123,32,98,117,109,112,115,32,48,46,55,53,32,115,99,97,108,101,32,48,46,48,49,32,125,10,32,32,32,32,32,32,32,32,102,105,110,105,115,104,32,123,32,112,104,111,110,103,32,48,46,49,48,32,125,10,32,32,32,32,125,10,125,10,0,108,105,103,104,116,95,115,111,117,114,99,101,32,123,32,60,49,53,48,48,44,51,48,48,48,44,45,50,53,48,48,62,32,99,111,108,111,114,32,87,104,105,116,101,32,125,10,0,35,118,101,114,115,105,111,110,32,51,46,54,59,10,0,103,108,111,98,97,108,95,115,101,116,116,105,110,103,115,32,123,32,97,115,115,117,109,101,100,95,103,97,109,109,97,32,49,46,48,32,125,10,0,35,100,101,102,97,117,108,116,32,123,32,102,105,110,105,115,104,32,123,32,97,109,98,105,101,110,116,32,48,46,49,32,100,105,102,102,117,115,101,32,48,46,57,32,125,32,125,10,0,35,105,110,99,108,117,100,101,32,34,99,111,108,111,114,115,46,105,110,99,34,10,35,105,110,99,108,117,100,101,32,34,116,101,120,116,117,114,101,115,46,105,110,99,34,10,35,105,110,99,108,117,100,101,32,34,115,104,97,112,101,115,46,105,110,99,34,10,0,35,100,101,99,108,97,114,101,32,37,115,32,61,32,37,115,59,10,0,66,108,97,99,107,0,87,104,105,116,101,0,98,97,107,101,114,115,99,104,111,99,0,98,114,97,115,115,0,98,114,105,103,104,116,103,111,108,100,0,98,114,111,110,122,101,0,98,114,111,110,122,101,50,0,99,108,101,97,114,0,99,111,111,108,99,111,112,112,101,114,0,99,111,112,112,101,114,0,100,97,114,107,98,114,111,119,110,0,100,97,114,107,112,117,114,112,108,101,0,100,97,114,107,116,97,110,0,100,97,114,107,119,111,111,100,0,100,107,103,114,101,101,110,99,111,112,112,101,114,0,100,117,115,116,121,114,111,115,101,0,102,101,108,100,115,112,97,114,0,102,108,101,115,104,0,103,114,97,121,48,53,0,103,114,101,101,110,99,111,112,112,101,114,0,104,117,110,116,101,114,115,103,114,101,101,110,0,108,105,103,104,116,95,112,117,114,112,108,101,0,108,105,103,104,116,119,111,111,100,0,109,97,110,100,97,114,105,110,111,114,97,110,103,101,0,109,101,100,105,117,109,102,111,114,101,115,116,103,114,101,101,110,0,109,101,100,105,117,109,103,111,108,100,101,110,114,111,100,0,109,101,100,105,117,109,119,111,111,100,0,109,101,100,95,112,117,114,112,108,101,0,109,105,99,97,0,110,101,111,110,98,108,117,101,0,110,101,111,110,112,105,110,107,0,110,101,119,109,105,100,110,105,103,104,116,98,108,117,101,0,110,101,119,116,97,110,0,111,108,100,103,111,108,100,0,113,117,97,114,116,122,0,114,105,99,104,98,108,117,101,0,115,99,97,114,108,101,116,0,115,101,109,105,83,119,101,101,116,67,104,111,99,0,115,105,108,118,101,114,0,115,112,105,99,121,112,105,110,107,0,115,117,109,109,101,114,115,107,121,0,118,101,114,121,100,97,114,107,98,114,111,119,110,0,118,101,114,121,95,108,105,103,104,116,95,112,117,114,112,108,101,0,112,111,118,0,112,111,118,58,112,111,118,0,37,115,32,37,115,10,0,46,92,34,32,0,32,37,100,32,37,100,0,32,37,115,10,0,32,37,100,0,102,105,108,108,32,0,101,108,108,105,112,115,101,32,97,116,116,114,115,37,100,32,37,115,119,105,100,32,37,46,53,102,32,104,116,32,37,46,53,102,32,97,116,32,40,37,46,53,102,44,37,46,53,102,41,59,10,0,46,102,116,32,37,115,10,0,46,112,115,32,37,100,42,92,110,40,83,70,117,47,37,46,48,102,117,10,0,34,37,115,34,32,97,116,32,40,37,46,53,102,44,37,46,53,102,41,59,10,0,37,48,51,111,0,37,115,37,115,32,105,115,32,110,111,116,32,97,32,116,114,111,102,102,32,102,111,110,116,10,0,100,111,116,32,112,105,99,32,112,108,117,103,105,110,58,32,0,82,0,93,10,46,80,69,10,0,46,80,83,32,37,46,53,102,32,37,46,53,102,10,0,37,115,32,116,111,32,99,104,97,110,103,101,32,100,114,97,119,105,110,103,32,115,105,122,101,44,32,109,117,108,116,105,112,108,121,32,116,104,101,32,119,105,100,116,104,32,97,110,100,32,104,101,105,103,104,116,32,111,110,32,116,104,101,32,46,80,83,32,108,105,110,101,32,97,98,111,118,101,32,97,110,100,32,116,104,101,32,110,117,109,98,101,114,32,111,110,32,116,104,101,32,116,119,111,32,108,105,110,101,115,32,98,101,108,111,119,32,40,114,111,117,110,100,101,100,32,116,111,32,116,104,101,32,110,101,97,114,101,115,116,32,105,110,116,101,103,101,114,41,32,98,121,32,97,32,115,99,97,108,101,32,102,97,99,116,111,114,10,0,46,110,114,32,83,70,32,37,46,48,102,10,115,99,97,108,101,116,104,105,99,107,110,101,115,115,32,61,32,37,46,48,102,10,0,37,115,32,100,111,110,39,116,32,99,104,97,110,103,101,32,97,110,121,116,104,105,110,103,32,98,101,108,111,119,32,116,104,105,115,32,108,105,110,101,32,105,110,32,116,104,105,115,32,100,114,97,119,105,110,103,10,0,37,115,32,110,111,110,45,102,97,116,97,108,32,114,117,110,45,116,105,109,101,32,112,105,99,32,118,101,114,115,105,111,110,32,100,101,116,101,114,109,105,110,97,116,105,111,110,44,32,118,101,114,115,105,111,110,32,50,10,0,98,111,120,114,97,100,61,50,46,48,32,37,115,32,119,105,108,108,32,98,101,32,114,101,115,101,116,32,116,111,32,48,46,48,32,98,121,32,103,112,105,99,32,111,110,108,121,10,0,115,99,97,108,101,61,49,46,48,32,37,115,32],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+71704);allocate([114,101,113,117,105,114,101,100,32,102,111,114,32,99,111,109,112,97,114,105,115,111,110,115,10,0,37,115,32,98,111,120,114,97,100,32,105,115,32,110,111,119,32,48,46,48,32,105,110,32,103,112,105,99,44,32,101,108,115,101,32,105,116,32,114,101,109,97,105,110,115,32,50,46,48,10,0,37,115,32,100,97,115,104,119,105,100,32,105,115,32,48,46,49,32,105,110,32,49,48,116,104,32,69,100,105,116,105,111,110,44,32,48,46,48,53,32,105,110,32,68,87,66,32,50,32,97,110,100,32,105,110,32,103,112,105,99,10,0,37,115,32,102,105,108,108,118,97,108,32,105,115,32,48,46,51,32,105,110,32,49,48,116,104,32,69,100,105,116,105,111,110,32,40,102,105,108,108,32,48,32,109,101,97,110,115,32,98,108,97,99,107,41,44,32,48,46,53,32,105,110,32,103,112,105,99,32,40,102,105,108,108,32,48,32,109,101,97,110,115,32,119,104,105,116,101,41,44,32,117,110,100,101,102,105,110,101,100,32,105,110,32,68,87,66,32,50,10,0,37,115,32,102,105,108,108,32,104,97,115,32,110,111,32,109,101,97,110,105,110,103,32,105,110,32,68,87,66,32,50,44,32,103,112,105,99,32,99,97,110,32,117,115,101,32,102,105,108,108,32,111,114,32,102,105,108,108,101,100,44,32,49,48,116,104,32,69,100,105,116,105,111,110,32,117,115,101,115,32,102,105,108,108,32,111,110,108,121,10,0,37,115,32,68,87,66,32,50,32,100,111,101,115,110,39,116,32,117,115,101,32,102,105,108,108,32,97,110,100,32,100,111,101,115,110,39,116,32,100,101,102,105,110,101,32,102,105,108,108,118,97,108,10,0,37,115,32,114,101,115,101,116,32,119,111,114,107,115,32,105,110,32,103,112,105,99,32,97,110,100,32,49,48,116,104,32,101,100,105,116,105,111,110,44,32,98,117,116,32,105,115,110,39,116,32,100,101,102,105,110,101,100,32,105,110,32,68,87,66,32,50,10,0,37,115,32,68,87,66,32,50,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,100,101,102,105,110,105,116,105,111,110,115,10,0,105,102,32,98,111,120,114,97,100,32,62,32,49,46,48,32,38,38,32,100,97,115,104,119,105,100,32,60,32,48,46,48,55,53,32,116,104,101,110,32,88,10,9,102,105,108,108,118,97,108,32,61,32,49,59,10,9,100,101,102,105,110,101,32,102,105,108,108,32,89,32,89,59,10,9,100,101,102,105,110,101,32,115,111,108,105,100,32,89,32,89,59,10,9,100,101,102,105,110,101,32,114,101,115,101,116,32,89,32,115,99,97,108,101,61,49,46,48,32,89,59,10,88,10,0,114,101,115,101,116,32,37,115,32,115,101,116,32,116,111,32,107,110,111,119,110,32,115,116,97,116,101,10,0,37,115,32,71,78,85,32,112,105,99,32,118,115,46,32,49,48,116,104,32,69,100,105,116,105,111,110,32,100,92,40,101,39,116,101,110,116,101,10,0,105,102,32,102,105,108,108,118,97,108,32,62,32,48,46,52,32,116,104,101,110,32,88,10,9,100,101,102,105,110,101,32,115,101,116,102,105,108,108,118,97,108,32,89,32,102,105,108,108,118,97,108,32,61,32,49,32,45,32,89,59,10,9,100,101,102,105,110,101,32,98,111,108,100,32,89,32,116,104,105,99,107,110,101,115,115,32,50,32,89,59,10,0,9,37,115,32,105,102,32,121,111,117,32,117,115,101,32,103,112,105,99,32,97,110,100,32,105,116,32,98,97,114,102,115,32,111,110,32,101,110,99,111,117,110,116,101,114,105,110,103,32,34,115,111,108,105,100,34,44,10,0,9,37,115,9,105,110,115,116,97,108,108,32,97,32,109,111,114,101,32,114,101,99,101,110,116,32,118,101,114,115,105,111,110,32,111,102,32,103,112,105,99,32,111,114,32,115,119,105,116,99,104,32,116,111,32,68,87,66,32,111,114,32,49,48,116,104,32,69,100,105,116,105,111,110,32,112,105,99,59,10,0,9,37,115,9,115,111,114,114,121,44,32,116,104,101,32,103,114,111,102,102,32,102,111,108,107,115,32,99,104,97,110,103,101,100,32,103,112,105,99,59,32,115,101,110,100,32,97,110,121,32,99,111,109,112,108,97,105,110,116,32,116,111,32,116,104,101,109,59,10,0,88,32,101,108,115,101,32,90,10,9,100,101,102,105,110,101,32,115,101,116,102,105,108,108,118,97,108,32,89,32,102,105,108,108,118,97,108,32,61,32,89,59,10,9,100,101,102,105,110,101,32,98,111,108,100,32,89,32,89,59,10,9,100,101,102,105,110,101,32,102,105,108,108,101,100,32,89,32,102,105,108,108,32,89,59,10,90,10,0,37,115,32,97,114,114,111,119,104,101,97,100,32,104,97,115,32,110,111,32,109,101,97,110,105,110,103,32,105,110,32,68,87,66,32,50,44,32,97,114,114,111,119,104,101,97,100,32,61,32,55,32,109,97,107,101,115,32,102,105,108,108,101,100,32,97,114,114,111,119,104,101,97,100,115,32,105,110,32,103,112,105,99,32,97,110,100,32,105,110,32,49,48,116,104,32,69,100,105,116,105,111,110,10,0,37,115,32,97,114,114,111,119,104,101,97,100,32,105,115,32,117,110,100,101,102,105,110,101,100,32,105,110,32,68,87,66,32,50,44,32,105,110,105,116,105,97,108,108,121,32,49,32,105,110,32,103,112,105,99,44,32,50,32,105,110,32,49,48,116,104,32,69,100,105,116,105,111,110,10,0,97,114,114,111,119,104,101,97,100,32,61,32,55,32,37,115,32,110,111,116,32,117,115,101,100,32,98,121,32,103,114,97,112,104,118,105,122,10,0,37,115,32,71,78,85,32,112,105,99,32,115,117,112,112,111,114,116,115,32,97,32,98,111,120,114,97,100,32,118,97,114,105,97,98,108,101,32,116,111,32,100,114,97,119,32,98,111,120,101,115,32,119,105,116,104,32,114,111,117,110,100,101,100,32,99,111,114,110,101,114,115,59,32,68,87,66,32,97,110,100,32,49,48,116,104,32,69,100,46,32,100,111,32,110,111,116,10,0,98,111,120,114,97,100,32,61,32,48,32,37,115,32,110,111,32,114,111,117,110,100,101,100,32,99,111,114,110,101,114,115,32,105,110,32,103,114,97,112,104,118,105,122,10,0,37,115,32,71,78,85,32,112,105,99,32,115,117,112,112,111,114,116,115,32,97,32,108,105,110,101,116,104,105,99,107,32,118,97,114,105,97,98,108,101,32,116,111,32,115,101,116,32,108,105,110,101,32,116,104,105,99,107,110,101,115,115,59,32,68,87,66,32,97,110,100,32,49,48,116,104,32,69,100,46,32,100,111,32,110,111,116,10,0,108,105,110,101,116,104,105,99,107,32,61,32,48,59,32,111,108,100,108,105,110,101,116,104,105,99,107,32,61,32,108,105,110,101,116,104,105,99,107,10,0,37,115,32,46,80,83,32,119,47,111,32,97,114,103,115,32,99,97,117,115,101,115,32,71,78,85,32,112,105,99,32,116,111,32,115,99,97,108,101,32,100,114,97,119,105,110,103,32,116,111,32,102,105,116,32,56,46,53,120,49,49,32,112,97,112,101,114,59,32,68,87,66,32,100,111,101,115,32,110,111,116,10,0,37,115,32,109,97,120,112,115,104,116,32,97,110,100,32,109,97,120,112,115,119,105,100,32,104,97,118,101,32,110,111,32,109,101,97,110,105,110,103,32,105,110,32,68,87,66,32,50,46,48,44,32,115,101,116,32,112,97,103,101,32,98,111,117,110,100,97,114,105,101,115,32,105,110,32,103,112,105,99,32,97,110,100,32,105,110,32,49,48,116,104,32,69,100,105,116,105,111,110,10,0,37,115,32,109,97,120,112,115,104,116,32,97,110,100,32,109,97,120,112,115,119,105,100,32,97,114,101,32,112,114,101,100,101,102,105,110,101,100,32,116,111,32,49,49,46,48,32,97,110,100,32,56,46,53,32,105,110,32,103,112,105,99,10,0,109,97,120,112,115,104,116,32,61,32,37,102,10,109,97,120,112,115,119,105,100,32,61,32,37,102,10,0,68,111,116,58,32,91,10,0,100,101,102,105,110,101,32,97,116,116,114,115,48,32,37,37,32,37,37,59,32,100,101,102,105,110,101,32,117,110,102,105,108,108,101,100,32,37,37,32,37,37,59,32,100,101,102,105,110,101,32,114,111,117,110,100,101,100,32,37,37,32,37,37,59,32,100,101,102,105,110,101,32,100,105,97,103,111,110,97,108,115,32,37,37,32,37,37,10,0,37,115,37,115,32,117,110,115,117,112,112,111,114,116,101,100,10,0,37,115,32,114,101,115,116,111,114,101,32,112,111,105,110,116,32,115,105,122,101,32,97,110,100,32,102,111,110,116,10,46,112,115,32,92,110,40,46,83,10,46,102,116,32,92,110,40,68,70,10,0,37,115,32,67,114,101,97,116,111,114,58,32,37,115,32,118,101,114,115,105,111,110,32,37,115,32,40,37,115,41,10,0,37,115,32,84,105,116,108,101,58,32,37,115,10,0,37,115,32,115,97,118,101,32,112,111,105,110,116,32,115,105,122,101,32,97,110,100,32,102,111,110,116,10,46,110,114,32,46,83,32,92,110,40,46,115,10,46,110,114,32,68,70,32,92,110,40,46,102,10,0,112,105,99,0,112,105,99,58,112,105,99,0,112,110,103,58,115,118,103,0,103,105,102,58,115,118,103,0,106,112,101,103,58,115,118,103,0,106,112,101,58,115,118,103,0,106,112,103,58,115,118,103,0,112,110,103,58,102,105,103,0,103,105,102,58,102,105,103,0,106,112,101,103,58,102,105,103,0,106,112,101,58,102,105,103,0,106,112,103,58,102,105,103,0,112,110,103,58,118,114,109,108,0,103,105,102,58,118,114,109,108,0,106,112,101,103,58,118,114,109,108,0,106,112,101,58,118,114,109,108,0,106,112,103,58,118,114,109,108,0,101,112,115,58,112,115,0,112,115,58,112,115,0,40,108,105,98,41,58,112,115,0,112,110,103,58,109,97,112,0,103,105,102,58,109,97,112,0,106,112,101,103,58,109,97,112,0,106,112,101,58,109,97,112,0,106,112,103,58,109,97,112,0,112,115,58,109,97,112,0,101,112,115,58,109,97,112,0,115,118,103,58,109,97,112,0,112,110,103,58,100,111,116,0,103,105,102,58,100,111,116,0,106,112,101,103,58,100,111,116,0,106,112,101,58,100,111,116,0,106,112,103,58,100,111,116,0,112,115,58,100,111,116,0,101,112,115,58,100,111,116,0,115,118,103,58,100,111,116,0,112,110,103,58,120,100,111,116,0,103,105,102,58,120,100,111,116,0,106,112,101,103,58,120,100,111,116,0,106,112,101,58,120,100,111,116,0,106,112,103,58,120,100,111,116,0,112,115,58,120,100,111,116,0,101,112,115,58,120,100,111,116,0,115,118,103,58,120,100,111,116,0,115,118,103,58,115,118,103,0,112,110,103,58,118,109,108,0,103,105,102,58,118,109,108,0,106,112,101,103,58,118,109,108,0,106,112,101,58,118,109,108,0,106,112,103,58,118,109,108,0,103,105,102,58,116,107,0,105,109,97,103,101,32,99,114,101,97,116,101,32,112,104,111,116,111,32,34,112,104,111,116,111,95,37,115,34,32,45,102,105,108,101,32,34,37,115,34,10,0,36,99,32,99,114,101,97,116,101,32,105,109,97,103,101,32,37,46,50,102,32,37,46,50,102,32,45,105,109,97,103,101,32,34,112,104,111,116,111,95,37,115,34,10,0,60,118,58,105,109,97,103,101,32,115,114,99,61,34,37,115,34,32,115,116,121,108,101,61,34,32,112,111,115,105,116,105,111,110,58,97,98,115,111,108,117,116,101,59,32,119,105,100,116,104,58,37,46,50,102,59,32,104,101,105,103,104,116,58,37,46,50,102,59,32,108,101,102,116,58,37,46,50,102,32,59,32,116,111,112,58,37,46,50,102,34,0,32,47,62,10,0,103,118,108,111,97,100,105,109,97,103,101,95,99,111,114,101,46,99,0,99,111,114,101,95,108,111,97,100,105,109,97,103,101,95,112,115,108,105,98,0,91,32,0,37,103,32,37,103,32,0,93,32,32,37,100,32,116,114,117,101,32,37,115,10,0,93,32,32,37,100,32,102,97,108,115,101,32,37,115,10,0,99,111,114,101,95,108,111,97,100,105,109,97,103,101,95,112,115,0,103,115,97,118,101,32,37,103,32,37,103,32,116,114,97,110,115,108,97,116,101,32,110,101,119,112,97,116,104,10,0,117,115,101,114,95,115,104,97,112,101,95,37,100,10,0,103,114,101,115,116,111,114,101,10,0,99,111,114,101,95,108,111,97,100,105,109,97,103,101,95,118,114,109,108,0,83,104,97,112,101,32,123,10,0,32,32,97,112,112,101,97,114,97,110,99,101,32,65,112,112,101,97,114,97,110,99,101,32,123,10,0,32,32,32,32,109,97,116,101,114,105,97,108,32,77,97,116,101,114,105,97,108,32,123,10,0,32,32,32,32,32,32,97,109,98,105,101,110,116,73,110,116,101,110,115,105,116,121,32,48,46,51,51,10,0,32,32,32,32,32,32,32,32,100,105,102,102,117,115,101,67,111,108,111,114,32,49,32,49,32,49,10,0,32,32,32,32,125,10,0,32,32,32,32,116,101,120,116,117,114,101,32,73,109,97,103,101,84,101,120,116,117,114,101,32,123,32,117,114,108,32,34,37,115,34,32,125,10,0,32,32,125,10,0,99,111,114,101,95,108,111,97,100,105,109,97,103,101,95,102,105,103,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,46,49,102,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,32,37,100,32,37,115,10,0,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,0,99,111,114,101,95,108,111,97,100,105,109,97,103,101,95,115,118,103,0,60,105,109,97,103,101,32,120,108,105,110,107,58,104,114,101,102,61,34,0,34,32,119,105,100,116,104,61,34,37,103,112,120,34,32,104,101,105,103,104,116,61,34,37,103,112,120,34,32,112,114,101,115,101,114,118,101,65,115,112,101,99,116,82,97,116,105,111,61,34,120,77,105,100,89,77,105,100,32,109,101,101,116,34,32,120,61,34,37,103,34,32,121,61,34,37,103,34,0,32,116,114,97,110,115,102,111,114,109,61,34,114,111,116,97,116,101,40,37,100,32,37,103,32,37,103,41,34,0,34,32,119,105,100,116,104,61,34,37,103,112,120,34,32,104,101,105,103,104,116,61,34,37,103,112,120,34,32,112,114,101,115,101,114,118,101,65,115,112,101,99,116,82,97,116,105,111,61,34,120,77,105,110,89,77,105,110,32,109,101,101,116,34,32,120,61,34,37,103,34,32,121,61,34,37,103,34,0,47,62,10,0,100,111,116,95,108,97,121,111,117,116,0,112,104,97,115,101,0,100,111,116,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,116,104,101,32,97,115,112,101,99,116,32,97,116,116,114,105,98,117,116,101,32,102,111,114,32,100,105,115,99,111,110,110,101,99,116,101,100,32,103,114,97,112,104,115,32,111,114,32,103,114,97,112,104,115,32,119,105,116,104,32,99,108,117,115,116,101,114,115,10,0,99,111,109,112,111,117,110,100,0,118,32,61,61,32,110,0,100,111,116,105,110,105,116,46,99,0,114,101,109,111,118,101,95,102,114,111,109,95,114,97,110,107,0,111,114,100,101,114,0,101,100,103,101,32,108,97,98,101,108,115,32,119,105,116,104,32,115,112,108,105,110,101,115,61,99,117,114,118,101,100,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,105,110,32,100,111,116,32,45,32,117,115,101,32,120,108,97,98,101,108,115,10,0,69,68,95,108,97,98,101,108,40,102,101,41,0,100,111,116,115,112,108,105,110,101,115,46,99,0,95,100,111,116,95,115,112,108,105,110,101,115,0,102,108,97,116,32,101,100,103,101,32,98,101,116,119,101,101,110,32,97,100,106,97,99,101,110,116,32,110,111,100,101,115,32,111,110,101,32,111,102,32,119,104,105,99,104,32,104,97,115,32,97,32,114,101,99,111,114,100,32,115,104,97,112,101,32,45,32,114,101,112,108,97,99,101,32,114,101,99,111,114,100,115,32,119,105,116,104,32,72,84,77,76,45,108,105,107,101,32,108,97,98,101,108,115,10,0,32,32,69,100,103,101,32,37,115,32,37,115,32,37,115,10,0,120,120,120,0,49,48,48,48,48,0,123,37,115,125,0,97,117,120,103,0,108,97,98,101,108,95,102,108,111,97,116,0,102,105,120,101,100,0,40,108,32,61,32,69,68,95,108,97,98,101,108,40,102,101,41,41,0,115,101,116,69,100,103,101,76,97,98,101,108,80,111,115,0,101,32,33,61,32,78,85,76,76,0,102,97,115,116,103,114,46,99,0,100,101,108,101,116,101,95,102,97,115,116,95,101,100,103,101,0,110,32,33,61,32,78,68,95,110,101,120,116,40,110,41,0,102,97,115,116,95,110,111,100,101,0,117,32,33,61,32,118,0,102,97,115,116,95,110,111,100,101,97,112,112,0,78,68,95,110,101,120,116,40,118,41,32,61,61,32,78,85,76,76,0,102,105,110,100,95,102,97,115,116,95,110,111,100,101,40,103,44,32,110,41,0,100,101,108,101,116,101,95,102,97,115,116,95,110,111,100,101,0,100,101,108,101,116,101,95,102,108,97,116,95,101,100,103,101,0,109,101,114,103,101,95,111,110,101,119,97,121,32,103,108,105,116,99,104,10,0,109,101,114,103,101,95,111,110,101,119,97,121,0,115,97,102,101,95,100,101,108,101,116,101,95,102,97,115,116,95,101,100,103,101,0,108,103,0,99,111,109,112,0,99,110,116,32,61,61,32,115,122,0,109,105,110,99,114,111,115,115,46,99,0,102,105,120,76,97,98,101,108,79,114,100,101,114,0,114,101,109,105,110,99,114,111,115,115,0,109,105,110,99,114,111,115,115,32,37,115,58,32,37,100,32,99,114,111,115,115,105,110,103,115,44,32,37,46,50,102,32,115,101,99,115,46,10,0,118,0,110,101,105,103,104,98,111,114,0,40,114,118,32,61,61,32,48,41,32,124,124,32,40,78,68,95,111,114,100,101,114,40,114,118,41,45,78,68,95,111,114,100,101,114,40,118,41,41,42,100,105,114,32,62,32,48,0,99,111,110,115,116,114,97,105,110,105,110,103,95,102,108,97,116,95,101,100,103,101,40,103,44,118,44,101,41,32,61,61,32,70,65,76,83,69,0,102,108,97,116,95,114,101,111,114,100,101,114,0,78,68,95,114,97,110,107,40,118,41,32,61,61,32,114,0,112,111,115,116,111,114,100,101,114,0,102,108,97,116,105,110,100,101,120,40,97,103,104,101,97,100,40,101,41,41,32,60,32,77,45,62,110,114,111,119,115,0,102,108,97,116,95,115,101,97,114,99,104,0,102,108,97,116,105,110,100,101,120,40,97,103,116,97,105,108,40,101,41,41,32,60,32,77,45,62,110,99,111,108,115,0,111,117,116,0,111,114,100,101,114,105,110,103,32,39,37,115,39,32,110,111,116,32,114,101,99,111,103,110,105,122,101,100,46,10,0,111,114,100,101,114,105,110,103,32,39,37,115,39,32,110,111,116,32,114,101,99,111,103,110,105,122,101,100,32,102,111,114,32,110,111,100,101,32,39,37,115,39,46,10,0,109,101,114,103,101,50,58,32,103,114,97,112,104,32,37,115,44,32,114,97,110,107,32,37,100,32,104,97,115,32,111,110,108,121,32,37,100,32,60,32,37,100,32,110,111,100,101,115,10,0,109,105,110,99,114,111,115,115,58,32,112,97,115,115,32,37,100,32,105,116,101,114,32,37,100,32,116,114,121,105,110,103,32,37,100,32,99,117,114,95,99,114,111,115,115,32,37,100,32,98,101,115,116,95,99,114,111,115,115,32,37,100,10,0,78,68,95,111,114,100,101,114,40,118,41,32,60,32,78,68,95,111,114,100,101,114,40,119,41,0,98,97,108,97,110,99,101,0,116,114,97,110,115,112,111,115,101,95,115,116,101,112,0,115,117,114,112,114,105,115,101,10,0,105,110,115,116,97,108,108,95,105,110,95,114,97,110,107,44,32,108,105,110,101,32,37,100,58,32,37,115,32,37,115,32,114,97,110,107,32,37,100,32,105,32,61,32,37,100,32,97,110,32,61,32,48,10,0,71,68,95,114,97,110,107,40,103,41,91,114,93,46,110,32,60,61,32,71,68,95,114,97,110,107,40,103,41,91,114,93,46,97,110,0,105,110,115,116,97,108,108,95,105,110,95,114,97,110,107,0,105,110,115,116,97,108,108,95,105,110,95,114,97,110,107,44,32,108,105,110,101,32,37,100,58,32,78,68,95,111,114,100,101,114,40,37,115,41,32,91,37,100,93,32,62,32,71,68,95,114,97,110,107,40,82,111,111,116,41,91,37,100,93,46,97,110,32,91,37,100,93,10,0,105,110,115,116,97,108,108,95,105,110,95,114,97,110,107,44,32,108,105,110,101,32,37,100,58,32,114,97,110,107,32,37,100,32,110,111,116,32,105,110,32,114,97,110,107,32,114,97,110,103,101,32,91,37,100,44,37,100,93,10,0,105,110,115,116,97,108,108,95,105,110,95,114,97,110,107,44,32,108,105,110,101,32,37,100,58,32,71,68,95,114,97,110,107,40,103,41,91,37,100,93,46,118,32,43,32,78,68,95,111,114,100,101,114,40,37,115,41,32,91,37,100,93,32,62,32,71,68,95,114,97,110,107,40,103,41,91,37,100,93,46,97,118,32,43,32,71,68,95,114,97,110,107,40,82,111,111,116,41,91,37,100,93,46,97,110,32,91,37,100,93,10,0,95,110,101,119,95,114,97,110,107,0,109,99,108,105,109,105,116,0,114,97,110,107,40,103,44,32,50,44,32,110,115,105,116,101,114,50,40,103,41,41,32,61,61,32,48,0,112,111,115,105,116,105,111,110,46,99,0,100,111,116,95,112,111,115,105,116,105,111,110,0,65,82,61,37,48,46,52,108,102,9,32,65,114,101,97,61,32,37,48,46,52,108,102,9,0,68,117,109,109,121,61,37,100,10,0,71,111,105,110,103,32,116,111,32,97,112,112,108,121,32,97,110,111,116,104,101,114,32,101,120,112,97,110,115,105,111,110,46,10,0,110,101,120,116,35,105,116,101,114,61,37,100,10,0,104,112,0,99,111,110,110,101,99,116,71,114,97,112,104,0,69,100,103,101,32,108,101,110,103,116,104,32,37,102,32,108,97,114,103,101,114,32,116,104,97,110,32,109,97,120,105,109,117,109,32,37,117,32,97,108,108,111,119,101,100,46,10,67,104,101,99,107,32,102,111,114,32,111,118,101,114,119,105,100,101,32,110,111,100,101,40,115,41,46,10,0,110,115,108,105,109,105,116,0,99,111,110,116,97,105,110,95,110,111,100,101,115,32,99,108,117,115,116,32,37,115,32,114,97,110,107,32,37,100,32,109,105,115,115,105,110,103,32,110,111,100,101,10,0,110,115,108,105,109,105,116,49,0,110,101,119,114,97,110,107,0,77,97,120,114,97,110,107,32,61,32,37,100,44,32,109,105,110,114,97,110,107,32,61,32,37,100,10,0,108,101,97,100,101,114,32,33,61,32,78,85,76,76,0,114,97,110,107,46,99,0,99,108,117,115,116,101,114,95,108,101,97,100,101,114,0,40,78,68,95,85,70,95,115,105,122,101,40,110,41,32,60,61,32,49,41,32,124,124,32,40,110,32,61,61,32,108,101,97,100,101,114,41,0,97,103,104,101,97,100,40,101,41,32,61,61,32,85,70,95,102,105,110,100,40,97,103,104,101,97,100,40,101,41,41,0,109,105,110,109,97,120,95,101,100,103,101,115,0,97,103,116,97,105,108,40,101,41,32,61,61,32,85,70,95,102,105,110,100,40,97,103,116,97,105,108,40,101,41,41,0,114,97,110,107,0,115,97,109,101,0,109,105,110,0,115,111,117,114,99,101,0,109,97,120,0,115,105,110,107,0,108,101,118,101,108,32,97,115,115,105,103,110,109,101,110,116,32,99,111,110,115,116,114,97,105,110,116,115,0,108,101,118,101,108,32,103,114,97,112,104,32,114,101,99,0,127,114,111,111,116,0,127,116,111,112,0,127,98,111,116,0,99,111,109,112,97,99,116,0,95,119,101,97,107,95,37,100,0,114,97,110,107,105,110,103,58,32,102,97,105,108,117,114,101,32,116,111,32,99,114,101,97,116,101,32,115,116,114,111,110,103,32,99,111,110,115,116,114,97,105,110,116,32,101,100,103,101,32,98,101,116,119,101,101,110,32,110,111,100,101,115,32,37,115,32,97,110,100,32,37,115,10,0,37,115,32,104,97,115,32,117,110,114,101,99,111,103,110,105,122,101,100,32,114,97,110,107,61,37,115,0,108,101,118,101,108,32,101,100,103,101,32,114,101,99,0,108,101,118,101,108,32,110,111,100,101,32,114,101,99,0,115,97,109,101,104,101,97,100,0,115,97,109,101,116,97,105,108,0,116,111,111,32,109,97,110,121,32,40,62,32,37,100,41,32,115,97,109,101,123,104,101,97,100,44,116,97,105,108,125,32,103,114,111,117,112,115,32,102,111,114,32,110,111,100,101,32,37,115,10,0,99,111,109,98,105,65,82,32,61,32,37,108,102,10,0,37,108,102,44,37,100,0,116,104,101,32,97,115,112,101,99,116,32,97,116,116,114,105,98,117,116,101,32,104,97,115,32,98,101,101,110,32,100,105,115,97,98,108,101,100,32,100,117,101,32,116,111,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,102,108,97,119,115,32,45,32,97,116,116,114,105,98,117,116,101,32,105,103,110,111,114,101,100,46,10,0,69,68,95,116,111,95,118,105,114,116,40,101,41,32,61,61,32,78,85,76,76,0,99,108,97,115,115,50,46,99,0,109,101,114,103,101,95,99,104,97,105,110,0,69,68,95,116,111,95,118,105,114,116,40,111,114,105,103,41,32,61,61,32,78,85,76,76,0,109,97,107,101,95,99,104,97,105,110,0,69,68,95,116,111,95,118,105,114,116,40,111,114,105,103,41,32,33,61,32,78,85,76,76,0,78,68,95,114,97,110,107,40,102,114,111,109,41,32,60,32,78,68,95,114,97,110,107,40,116,111,41,0,99,108,117,115,116,101,114,46,99,0,109,97,112,95,112,97,116,104,0,37,115,32,119,97,115,32,97,108,114,101,97,100,121,32,105,110,32,97,32,114,97,110,107,115,101,116,44,32,100,101,108,101,116,101,100,32,102,114,111,109,32,99,108,117,115,116,101,114,32,37,115,10,0,108,104,101,97,100,0,108,116,97,105,108,0,37,115,32,45,62,32,37,115,58,32,115,112,108,105,110,101,32,115,105,122,101,32,62,32,49,32,110,111,116,32,115,117,112,112,111,114,116,101,100,10,0,37,115,32,45,62,32,37,115,58,32,104,101,97,100,32,110,111,116,32,105,110,115,105,100,101,32,104,101,97,100,32,99,108,117,115,116,101,114,32,37,115,10,0,37,115,32,45,62,32,37,115,58,32,116,97,105,108,32,105,115,32,105,110,115,105,100,101,32,104,101,97,100,32,99,108,117,115,116,101,114,32,37,115,10,0,98,101,122,45,62,115,102,108,97,103,0,99,111,109,112,111,117,110,100,46,99,0,109,97,107,101,67,111,109,112,111,117,110,100,69,100,103,101,0,98,101,122,45,62,101,102,108,97,103,0,37,115,32,45,62,32,37,115,58,32,116,97,105,108,32,110,111,116,32,105,110,115,105,100,101,32,116,97,105,108,32,99,108,117,115,116,101,114,32,37,115,10,0,37,115,32,45,62,32,37,115,58,32,104,101,97,100,32,105,115,32,105,110,115,105,100,101,32,116,97,105,108,32,99,108,117,115,116,101,114,32,37,115,10,0,115,101,103,109,101,110,116,32,91,37,115,44,37,115,93,32,100,111,101,115,32,110,111,116,32,105,110,116,101,114,115,101,99,116,32,98,111,120,32,108,108,61,37,115,44,117,114,61,37,115,10,0,98,111,120,73,110,116,101,114,115,101,99,116,102,0,40,37,46,53,103,44,37,46,53,103,41,0,99,108,117,115,116,101,114,32,110,97,109,101,100,32,37,115,32,110,111,116,32,102,111,117,110,100,10,0,99,111,110,99,101,110,116,114,97,116,101,61,116,114,117,101,32,109,97,121,32,110,111,116,32,119,111,114,107,32,99,111,114,114,101,99,116,108,121,46,10,0,114,101,98,117,105,108,116,100,95,118,108,105,115,116,115,58,32,114,97,110,107,32,108,101,97,100,32,37,115,32,110,111,116,32,105,110,32,111,114,100,101,114,32,37,100,32,111,102,32,114,97,110,107,32,37,100,10,0,100,101,103,101,110,101,114,97,116,101,32,99,111,110,99,101,110,116,114,97,116,101,100,32,114,97,110,107,32,37,115,44,37,100,10,0,78,68,95,105,110,40,114,105,103,104,116,41,46,115,105,122,101,32,43,32,78,68,95,111,117,116,40,114,105,103,104,116,41,46,115,105,122,101,32,61,61,32,48,0,99,111,110,99,46,99,0,109,101,114,103,101,118,105,114,116,117,97,108,0,100,111,116,58,32,79,117,116,32,111,102,32,109,101,109,111,114,121,10,0,78,68,95,111,117,116,40,118,41,46,115,105,122,101,32,61,61,32,50,0,102,108,97,116,46,99,0,115,101,116,98,111,117,110,100,115,0,71,68,95,109,105,110,114,97,110,107,40,103,41,32,61,61,32,48,0,97,98,111,109,105,110,97,116,105,111,110,0,110,101,97,116,111,95,108,97,121,111,117,116,0,110,101,97,116,111,0,102,100,112,0,115,102,100,112,0,116,119,111,112,105,0,99,105,114,99,111,0,112,97,116,99,104,119,111,114,107,0,111,115,97,103,101,0,110,111,112,0,110,111,112,49,0,110,111,112,50,0,37,108,102,44,37,108,102,44,37,108,102,37,99,0,110,111,100,101,32,37,115,44,32,112,111,115,105,116,105,111,110,32,37,115,44,32,101,120,112,101,99,116,101,100,32,116,119,111,32,100,111,117,98,108,101,115,10,0,110,111,116,114,97,110,115,108,97,116,101,0,110,111,100,101,32,37,115,32,105,110,32,103,114,97,112,104,32,37,115,32,104,97,115,32,110,111,32,112,111,115,105,116,105,111,110,10,0,115,44,37,108,102,44,37,108,102,37,110,0,32,101,44,37,108,102,44,37,108,102,37,110,0,112,111,115,32,97,116,116,114,105,98,117,116,101,32,102,111,114,32,101,100,103,101,32,40,37,115,44,37,115,41,32,100,111,101,115,110,39,116,32,104,97,118,101,32,51,110,43,49,32,112,111,105,110,116,115,10,0,37,108,102,44,37,108,102,37,110,0,115,121,110,116,97,120,32,101,114,114,111,114,32,105,110,32,112,111,115,32,97,116,116,114,105,98,117,116,101,32,102,111,114,32,101,100,103,101,32,40,37,115,44,37,115,41,10,0,37,108,102,44,37,108,102,44,37,108,102,44,37,108,102,0,115,116,97,114,116,0,115,101,108,102,0,114,97,110,100,111,109,0,110,111,100,101,32,112,111,115,105,116,105,111,110,115,32,97,114,101,32,105,103,110,111,114,101,100,32,117,110,108,101,115,115,32,115,116,97,114,116,61,114,97,110,100,111,109,10,0,97,115,32,114,101,113,117,105,114,101,100,32,98,121,32,116,104,101,32,45,110,32,102,108,97,103,10,0,95,110,101,97,116,111,95,99,99,0,103,114,97,112,104,32,37,115,32,105,115,32,100,105,115,99,111,110,110,101,99,116,101,100,46,32,72,101,110,99,101,44,32,116,104,101,32,99,105,114,99,117,105,116,32,109,111,100,101,108,10,0,65,108,116,101,114,110,97,116,105,118,101,108,121,44,32,99,111,110,115,105,100,101,114,32,114,117,110,110,105,110,103,32,110,101,97,116,111,32,117,115,105,110,103,32,45,71,112,97,99,107,61,116,114,117,101,32,111,114,32,100,101,99,111,109,112,111,115,105,110,103,10,0,116,104,101,32,103,114,97,112,104,32,105,110,116,111,32,99,111,110,110,101,99,116,101,100,32,99,111,109,112,111,110,101,110,116,115,46,10,0,83,111,108,118,105,110,103,32,109,111,100,101,108,32,37,100,32,105,116,101,114,97,116,105,111,110,115,32,37,100,32,116,111,108,32,37,102,10,0,78,68,95,105,100,40,110,112,41,32,61,61,32,105,0,110,101,97,116,111,105,110,105,116,46,99,0,109,97,107,101,71,114,97,112,104,68,97,116,97,0,102,32,60,32,103,114,97,112,104,91,106,93,46,110,101,100,103,101,115,0,100,102,115,67,121,99,108,101,0,109,111,100,101,108,32,37,100,32,115,109,97,114,116,95,105,110,105,116,32,37,100,32,115,116,114,101,115,115,119,116,32,37,100,32,105,116,101,114,97,116,105,111,110,115,32,37,100,32,116,111,108,32,37,102,10,0,99,111,110,118,101,114,116,32,103,114,97,112,104,58,32,0,109,97,106,111,114,105,122,97,116,105,111,110,10,0,37,100,32,110,111,100,101,115,32,37,46,50,102,32,115,101,99,10,0,108,101,118,101,108,115,103,97,112,0,108,97,121,111,117,116,32,97,98,111,114,116,101,100,10,0,115,116,114,101,115,115,119,116,0,37,115,32,97,116,116,114,105,98,117,116,101,32,118,97,108,117,101,32,109,117,115,116,32,98,101,32,49,32,111,114,32,50,32,45,32,105,103,110,111,114,105,110,103,10,0,109,111,100,101,108,0,99,105,114,99,117,105,116,0,115,117,98,115,101,116,0,115,104,111,114,116,112,97,116,104,0,109,100,115,0,101,100,103,101,115,32,105,110,32,103,114,97,112,104,32,37,115,32,104,97,118,101,32,110,111,32,108,101,110,32,97,116,116,114,105,98,117,116,101,46,32,72,101,110,99,101,44,32,116,104,101,32,109,100,115,32,109,111,100,101,108,10,0,105,115,32,105,110,97,112,112,114,111,112,114,105,97,116,101,46,32,82,101,118,101,114,116,105,110,103,32,116,111,32,116,104,101,32,115,104,111,114,116,101,115,116,32,112,97,116,104,32,109,111,100,101,108,46,10,0,85,110,107,110,111,119,110,32,118,97,108,117,101,32,37,115,32,102,111,114,32,97,116,116,114,105,98,117,116,101,32,34,109,111,100,101,108,34,32,105,110,32,103,114,97,112,104,32,37,115,32,45,32,105,103,110,111,114,101,100,10,0,109,111,100,101,0,75,75,0,109,97,106,111,114,0,104,105,101,114,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,97,116,116,114,105,98,117,116,101,32,34,109,111,100,101,34,32,105,110,32,103,114,97,112,104,32,37,115,32,45,32,105,103,110,111,114,101,100,10,0,109,97,107,101,83,112,108,105,110,101,58,32,102,97,105,108,101,100,32,116,111,32,109,97,107,101,32,115,112,108,105,110,101,32,101,100,103,101,32,40,37,115,44,37,115,41,10,0,115,112,108,105,110,101,32,37,115,32,37,115,10,0,98,32,61,61,32,110,0,110,101,97,116,111,115,112,108,105,110,101,115,46,99,0,109,97,107,101,95,98,97,114,114,105,101,114,115,0,116,104,101,32,98,111,117,110,100,105,110,103,32,98,111,120,101,115,32,111,102,32,115,111,109,101,32,110,111,100,101,115,32,116,111,117,99,104,32,45,32,102,97,108,108,105,110,103,32,98,97,99,107,32,116,111,32,115,116,114,97,105,103,104,116,32,108,105,110,101,32,101,100,103,101,115,10,0,115,111,109,101,32,110,111,100,101,115,32,119,105,116,104,32,109,97,114,103,105,110,32,40,37,46,48,50,102,44,37,46,48,50,102,41,32,116,111,117,99,104,32,45,32,102,97,108,108,105,110,103,32,98,97,99,107,32,116,111,32,115,116,114,97,105,103,104,116,32,108,105,110,101,32,101,100,103,101,115,10,0,111,114,116,104,111,103,111,110,97,108,32,108,105,110,101,115,0,108,105,110,101,32,115,101,103,109,101,110,116,115,0,112,111,108,121,108,105,110,101,115,0,67,114,101,97,116,105,110,103,32,101,100,103,101,115,32,117,115,105,110,103,32,37,115,10,0,112,111,108,121,108,105,110,101,32,37,115,32,37,115,10,0,109,100,115,77,111,100,101,108,58,32,100,101,108,116,97,32,61,32,37,102,10,0,83,101,116,116,105,110,103,32,117,112,32,115,116,114,101,115,115,32,102,117,110,99,116,105,111,110,0,83,111,108,118,105,110,103,32,109,111,100,101,108,58,32,0,10,102,105,110,97,108,32,101,32,61,32,37,102,32,37,100,32,105,116,101,114,97,116,105,111,110,115,32,37,46,50,102,32,115,101,99,10,0,83,99,97,110,110,105,110,103,32,103,114,97,112,104,32,37,115,44,32,37,100,32,110,111,100,101,115,10,0,68,97,109,112,105,110,103,0,100,101,102,97,117,108,116,100,105,115,116,0,32,105,110,32,37,115,32,45,32,115,101,116,116,105,110,103,32,116,111,32,37,46,48,50,102,10,0,98,97,100,32,101,100,103,101,32,108,101,110,32,34,37,115,34,0,83,101,116,116,105,110,103,32,105,110,105,116,105,97,108,32,112,111,115,105,116,105,111,110,115,10,0,115,116,97,114,116,61,37,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,119,105,116,104,32,109,111,100,101,61,115,101,108,102,32,45,32,105,103,110,111,114,101,100,10,0,83,101,116,116,105,110,103,32,117,112,32,115,112,114,105,110,103,32,109,111,100,101,108,58,32,0,37,46,50,102,32,115,101,99,10,0,10,102,105,110,97,108,32,101,32,61,32,37,102,0,33,0,32,37,100,37,115,32,105,116,101,114,97,116,105,111,110,115,32,37,46,50,102,32,115,101,99,10,0,77,97,120,46,32,105,116,101,114,97,116,105,111,110,115,32,40,37,100,41,32,114,101,97,99,104,101,100,32,111,110,32,103,114,97,112,104,32,37,115,10,0,37,115,32,37,46,51,102,10,0,37,46,51,102,32,0,78,68,95,104,101,97,112,105,110,100,101,120,40,118,41,32,60,32,48,0,115,116,117,102,102,46,99,0,110,101,97,116,111,95,101,110,113,117,101,117,101,0,67,97,108,99,117,108,97,116,105,110,103,32,115,104,111,114,116,101,115,116,32,112,97,116,104,115,58,32,0,115,112,101,99,105,102,105,101,100,32,114,111,111,116,32,110,111,100,101,32,34,37,115,34,32,119,97,115,32,110,111,116,32,102,111,117,110,100,46,0,85,115,105,110,103,32,100,101,102,97,117,108,116,32,99,97,108,99,117,108,97,116,105,111,110,32,102,111,114,32,114,111,111,116,32,110,111,100,101,10,0,114,101,112,111,115,105,116,105,111,110,32,37,115,10,0,37,115,32,58,32,37,102,32,37,102,10,0,37,115,32,58,32,37,102,32,37,102,32,37,102,32,37,102,10,0,32,32,0,71,114,97,112,104,32,37,115,32,104,97,115,32,97,114,114,97,121,32,112,97,99,107,105,110,103,32,119,105,116,104,32,117,115,101,114,32,118,97,108,117,101,115,32,98,117,116,32,110,111,32,34,115,111,114,116,118,34,32,97,116,116,114,105,98,117,116,101,115,32,97,114,101,32,100,101,102,105,110,101,100,46,0,112,105,110,0,87,97,114,110,105,110,103,58,32,110,111,100,101,32,37,115,44,32,112,111,115,105,116,105,111,110,32,37,115,44,32,101,120,112,101,99,116,101,100,32,116,119,111,32,102,108,111,97,116,115,10,0,99,111,111,114,100,115,0,108,97,121,111,117,116,32,37,115,10,0,101,110,100,32,37,115,10,0,105,100,120,32,61,61,32,115,122,0,108,97,121,111,117,116,46,99,0,101,120,112,97,110,100,67,108,117,115,116,101,114,0,105,32,61,61,32,100,101,103,0,103,101,116,69,100,103,101,76,105,115,116,0,95,100,103,95,37,100,0,100,101,114,105,118,101,32,103,114,97,112,104,32,37,115,32,111,102,32,37,115,10,0,110,111,100,101,32,34,37,115,34,32,105,115,32,99,111,110,116,97,105,110,101,100,32,105,110,32,116,119,111,32,110,111,110,45,99,111,109,112,97,114,97,98,108,101,32,99,108,117,115,116,101,114,115,32,34,37,115,34,32,97,110,100,32,34,37,115,34,10,0,95,112,111,114,116,95,37,115,95,37,115,95,37,115,95,37,108,100,0,95,112,111,114,116,95,37,115,95,40,37,100,41,95,40,37,100,41,95,37,108,100,0,37,108,102,44,37,108,102,44,37,108,102,44,37,108,102,37,99,0,103,114,97,112,104,32,37,115,44,32,99,111,111,114,100,32,37,115,44,32,101,120,112,101,99,116,101,100,32,102,111,117,114,32,100,111,117,98,108,101,115,10,0,115,112,108,105,110,101,115,32,97,110,100,32,99,108,117,115,116,101,114,32,101,100,103,101,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,45,32,117,115,105,110,103,32,108,105,110,101,32,115,101,103,109,101,110,116,115,10,0,109,97,120,105,116,101,114,0,84,48,0,102,100,112,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,115,116,97,114,116,61,115,101,108,102,32,45,32,105,103,110,111,114,105,110,103,10,0,120,76,97,121,111,117,116,32,0,57,58,112,114,105,115,109,0,116,114,105,101,115,32,61,32,37,100,44,32,109,111,100,101,32,61,32,37,115,10,0,100,101,114,105,118,101,100,0,105,110,102,111,0,115,102,100,112,32,111,110,108,121,32,115,117,112,112,111,114,116,115,32,115,116,97,114,116,61,114,97,110,100,111,109,10,0,75,0,114,101,112,117,108,115,105,118,101,102,111,114,99,101,0,108,101,118,101,108,115,0,115,109,111,111,116,104,105,110,103,0,113,117,97,100,116,114,101,101,0,98,101,97,117,116,105,102,121,0,111,118,101,114,108,97,112,95,115,104,114,105,110,107,0,114,111,116,97,116,105,111,110,0,108,97,98,101,108,95,115,99,104,101,109,101,0,108,97,98,101,108,95,115,99,104,101,109,101,32,61,32,37,100,32,62,32,52,32,58,32,105,103,110,111,114,105,110,103,10,0,102,97,115,116,0,97,118,103,95,100,105,115,116,0,103,114,97,112,104,95,100,105,115,116,0,112,111,119,101,114,95,100,105,115,116,0,115,112,114,105,110,103,0,100,105,109,101,110,0,100,105,109,0,115,112,114,105,110,103,95,101,108,101,99,116,114,105,99,97,108,95,99,111,110,116,114,111,108,58,10,0,32,32,114,101,112,117,108,115,105,118,101,32,97,110,100,32,97,116,116,114,97,99,116,105,118,101,32,101,120,112,111,110,101,110,116,115,58,32,37,46,48,51,102,32,37,46,48,51,102,10,0,32,32,114,97,110,100,111,109,32,115,116,97,114,116,32,37,100,32,115,101,101,100,32,37,100,10,0,32,32,75,32,58,32,37,46,48,51,102,32,67,32,58,32,37,46,48,51,102,10,0,32,32,109,97,120,32,108,101,118,101,108,115,32,37,100,32,99,111,97,114,115,101,110,95,115,99,104,101,109,101,32,37,100,32,99,111,97,114,115,101,110,95,110,111,100,101,32,37,100,10,0,32,32,113,117,97,100,116,114,101,101,32,115,105,122,101,32,37,100,32,109,97,120,95,108,101,118,101,108,32,37,100,10,0,32,32,66,97,114,110,101,115,45,72,117,116,116,32,99,111,110,115,116,97,110,116,32,37,46,48,51,102,32,116,111,108,101,114,97,110,99,101,32,32,37,46,48,51,102,32,109,97,120,105,116,101,114,32,37,100,10,0,32,32,99,111,111,108,105,110,103,32,37,46,48,51,102,32,115,116,101,112,32,115,105,122,101,32,32,37,46,48,51,102,32,97,100,97,112,116,105,118,101,32,37,100,10,0,32,32,98,101,97,117,116,105,102,121,95,108,101,97,118,101,115,32,37,100,32,110,111,100,101,32,119,101,105,103,104,116,115,32,37,100,32,114,111,116,97,116,105,111,110,32,37,46,48,51,102,10,0,32,32,115,109,111,111,116,104,105,110,103,32,37,115,32,111,118,101,114,108,97,112,32,37,100,32,105,110,105,116,105,97,108,95,115,99,97,108,105,110,103,32,37,46,48,51,102,32,100,111,95,115,104,114,105,110,107,105,110,103,32,37,100,10,0,32,32,111,99,116,114,101,101,32,115,99,104,101,109,101,32,37,115,32,109,101,116,104,111,100,32,37,115,10,0,32,32,101,100,103,101,95,108,97,98,101,108,105,110,103,95,115,99,104,101,109,101,32,37,100,10,0,83,80,82,73,78,71,95,69,76,69,67,84,82,73,67,65,76,0,83,80,82],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+81944);allocate([73,78,71,95,77,65,88,69,78,84,0,83,84,82,69,83,83,95,77,65,88,69,78,84,0,83,84,82,69,83,83,95,65,80,80,82,79,88,0,83,84,82,69,83,83,0,85,78,73,70,79,82,77,95,83,84,82,69,83,83,0,70,85,76,76,95,83,84,82,69,83,83,0,78,79,78,69,0,78,79,82,77,65,76,0,70,65,83,84,0,72,89,66,82,73,68,0,83,84,82,69,83,83,95,77,65,74,79,82,73,90,65,84,73,79,78,95,71,82,65,80,72,95,68,73,83,84,0,83,84,82,69,83,83,95,77,65,74,79,82,73,90,65,84,73,79,78,95,65,86,71,95,68,73,83,84,0,83,84,82,69,83,83,95,77,65,74,79,82,73,90,65,84,73,79,78,95,80,79,87,69,82,95,68,73,83,84,0,83,80,82,73,78,71,0,84,82,73,65,78,71,76,69,0,82,78,71,0,13,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,116,101,114,32,61,32,37,100,44,32,115,116,101,112,32,61,32,37,102,32,70,110,111,114,109,32,61,32,37,102,32,110,122,32,61,32,37,100,32,32,75,32,61,32,37,102,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,115,112,114,105,110,103,95,101,108,101,99,116,114,105,99,97,108,95,101,109,98,101,100,100,105,110,103,95,115,108,111,119,0,100,109,101,97,110,32,61,32,37,102,44,32,114,104,111,32,61,32,37,102,10,0,115,101,110,100,32,114,97,110,100,111,109,32,99,111,111,114,100,105,110,97,116,101,115,10,0,115,99,97,108,105,110,103,32,102,97,99,116,111,114,32,61,32,37,102,10,0,81,85,65,68,95,84,82,69,69,95,72,89,66,82,73,68,44,32,115,105,122,101,32,108,97,114,103,101,114,32,116,104,97,110,32,37,100,44,32,115,119,105,116,99,104,32,116,111,32,102,97,115,116,32,113,117,97,100,116,114,101,101,0,99,116,114,108,45,62,111,118,101,114,108,97,112,61,37,100,10,0,37,100,32,37,100,10,0,117,110,105,102,111,114,109,95,115,116,114,101,115,115,46,99,0,85,110,105,102,111,114,109,83,116,114,101,115,115,83,109,111,111,116,104,101,114,95,110,101,119,0,83,112,97,114,115,101,77,97,116,114,105,120,95,105,115,95,115,121,109,109,101,116,114,105,99,40,66,44,32,70,65,76,83,69,41,0,117,110,105,102,111,114,109,95,115,116,114,101,115,115,0,124,101,100,103,101,108,97,98,101,108,124,0,108,101,110,0,110,111,114,109,97,108,105,122,101,0,111,118,101,114,108,97,112,0,79,118,101,114,108,97,112,32,118,97,108,117,101,32,34,37,115,34,32,117,110,115,117,112,112,111,114,116,101,100,32,45,32,105,103,110,111,114,101,100,10,0,85,110,114,101,99,111,103,110,105,122,101,100,32,111,118,101,114,108,97,112,32,118,97,108,117,101,32,34,37,115,34,32,45,32,117,115,105,110,103,32,102,97,108,115,101,10,0,86,111,114,111,110,111,105,0,111,118,101,114,108,97,112,58,32,37,115,32,118,97,108,117,101,32,37,100,32,115,99,97,108,105,110,103,32,37,46,48,52,102,10,0,111,118,101,114,108,97,112,95,115,99,97,108,105,110,103,0,118,111,114,111,110,111,105,0,115,99,97,108,105,110,103,0,118,112,115,99,0,105,112,115,101,112,0,111,115,99,97,108,101,0,111,108,100,32,115,99,97,108,105,110,103,0,115,99,97,108,101,120,121,0,120,32,97,110,100,32,121,32,115,99,97,108,105,110,103,0,111,114,116,104,111,0,111,114,116,104,111,103,111,110,97,108,32,99,111,110,115,116,114,97,105,110,116,115,0,111,114,116,104,111,95,121,120,0,111,114,116,104,111,120,121,0,120,121,32,111,114,116,104,111,103,111,110,97,108,32,99,111,110,115,116,114,97,105,110,116,115,0,111,114,116,104,111,121,120,0,121,120,32,111,114,116,104,111,103,111,110,97,108,32,99,111,110,115,116,114,97,105,110,116,115,0,112,111,114,116,104,111,0,112,115,101,117,100,111,45,111,114,116,104,111,103,111,110,97,108,32,99,111,110,115,116,114,97,105,110,116,115,0,112,111,114,116,104,111,95,121,120,0,112,111,114,116,104,111,120,121,0,120,121,32,112,115,101,117,100,111,45,111,114,116,104,111,103,111,110,97,108,32,99,111,110,115,116,114,97,105,110,116,115,0,112,111,114,116,104,111,121,120,0,121,120,32,112,115,101,117,100,111,45,111,114,116,104,111,103,111,110,97,108,32,99,111,110,115,116,114,97,105,110,116,115,0,112,114,105,115,109,0,65,100,106,117,115,116,105,110,103,32,37,115,32,117,115,105,110,103,32,37,115,10,0,85,110,104,97,110,100,108,101,100,32,97,100,106,117,115,116,32,111,112,116,105,111,110,32,37,115,10,0,78,117,109,98,101,114,32,111,102,32,105,116,101,114,97,116,105,111,110,115,32,61,32,37,100,10,0,78,117,109,98,101,114,32,111,102,32,105,110,99,114,101,97,115,101,115,32,61,32,37,100,10,0,111,118,101,114,108,97,112,32,91,37,100,93,32,58,32,37,100,10,0,118,111,114,111,95,109,97,114,103,105,110,0,115,101,112,0,101,115,101,112,0,78,111,100,101,32,115,101,112,97,114,97,116,105,111,110,58,32,97,100,100,61,37,100,32,40,37,102,44,37,102,41,10,0,37,102,44,37,102,0,115,99,97,108,101,32,61,32,40,37,46,48,51,102,44,37,46,48,51,102,41,10,0,69,100,103,101,32,115,101,112,97,114,97,116,105,111,110,58,32,97,100,100,61,37,100,32,40,37,102,44,37,102,41,10,0,67,97,108,99,117,108,97,116,105,110,103,32,99,105,114,99,117,105,116,32,109,111,100,101,108,0,99,111,110,106,117,103,97,116,101,95,103,114,97,100,105,101,110,116,58,32,117,110,101,120,112,101,99,116,101,100,32,108,101,110,103,116,104,32,48,32,118,101,99,116,111,114,10,0,67,97,108,99,117,108,97,116,105,110,103,32,115,117,98,115,101,116,32,109,111,100,101,108,0,103,114,97,112,104,32,105,115,32,100,105,115,99,111,110,110,101,99,116,101,100,46,32,72,101,110,99,101,44,32,116,104,101,32,99,105,114,99,117,105,116,32,109,111,100,101,108,10,0,105,115,32,117,110,100,101,102,105,110,101,100,46,32,82,101,118,101,114,116,105,110,103,32,116,111,32,116,104,101,32,115,104,111,114,116,101,115,116,32,112,97,116,104,32,109,111,100,101,108,46,10,0,67,97,108,99,117,108,97,116,105,110,103,32,77,68,83,32,109,111,100,101,108,0,67,97,108,99,117,108,97,116,105,110,103,32,115,104,111,114,116,101,115,116,32,112,97,116,104,115,0,58,32,37,46,50,102,32,115,101,99,10,0,83,101,116,116,105,110,103,32,105,110,105,116,105,97,108,32,112,111,115,105,116,105,111,110,115,0,58,32,37,46,50,102,32,115,101,99,0,99,103,0,100,101,108,116,97,32,60,61,32,48,120,70,70,70,70,0,99,111,110,115,116,114,97,105,110,116,46,99,0,109,107,78,67,111,110,115,116,114,97,105,110,116,71,0,118,103,0,99,111,109,112,114,101,115,115,32,37,103,32,10,0,115,99,97,108,101,32,98,121,32,37,103,44,37,103,32,10,0,98,101,115,116,99,111,115,116,32,60,32,72,85,71,69,95,86,65,76,0,99,111,109,112,117,116,101,83,99,97,108,101,88,89,0,71,114,97,112,104,118,105,122,32,98,117,105,108,116,32,119,105,116,104,111,117,116,32,97,110,121,32,116,114,105,97,110,103,117,108,97,116,105,111,110,32,108,105,98,114,97,114,121,10,0,100,101,108,97,117,110,97,121,95,116,114,105,97,110,103,117,108,97,116,105,111,110,58,32,37,115,10,0,100,101,108,97,117,110,97,121,95,116,114,105,58,32,37,115,10,0,116,114,121,105,110,103,32,116,111,32,100,101,108,101,116,101,32,97,32,110,111,110,45,108,105,110,101,10,0,10,105,110,116,101,114,115,101,99,116,105,111,110,32,97,116,32,37,46,51,102,32,37,46,51,102,10,0,115,101,103,35,37,100,32,58,32,40,37,46,51,102,44,32,37,46,51,102,41,32,40,37,46,51,102,44,32,37,46,51,102,41,10,0,114,101,109,111,118,101,95,111,118,101,114,108,97,112,58,32,71,114,97,112,104,118,105,122,32,110,111,116,32,98,117,105,108,116,32,119,105,116,104,32,116,114,105,97,110,103,117,108,97,116,105,111,110,32,108,105,98,114,97,114,121,10,0,109,97,107,101,65,100,100,80,111,108,121,58,32,117,110,107,110,111,119,110,32,115,104,97,112,101,32,116,121,112,101,32,37,115,10,0,109,97,107,101,80,111,108,121,58,32,117,110,107,110,111,119,110,32,115,104,97,112,101,32,116,121,112,101,32,37,115,10,0,120,33,61,78,85,76,76,0,115,109,97,114,116,95,105,110,105,95,120,46,99,0,73,77,68,83,95,103,105,118,101,110,95,100,105,109,0,105,108,108,45,99,111,110,100,105,116,105,111,110,101,100,0,114,111,111,116,32,61,32,37,115,32,109,97,120,32,115,116,101,112,115,32,116,111,32,114,111,111,116,32,61,32,37,100,10,0,116,119,111,112,105,58,32,117,115,101,32,111,102,32,119,101,105,103,104,116,61,48,32,99,114,101,97,116,101,115,32,100,105,115,99,111,110,110,101,99,116,101,100,32,99,111,109,112,111,110,101,110,116,46,10,0,82,97,110,107,32,115,101,112,97,114,97,116,105,111,110,32,61,32,0,37,46,48,51,108,102,32,0,97,114,101,97,0,105,110,115,101,116,0,37,115,32,99,111,111,114,100,32,37,46,53,103,32,37,46,53,103,32,104,116,32,37,102,32,119,105,100,116,104,32,37,102,10,0,37,46,48,51,102,0,114,101,99,32,37,102,32,37,102,32,37,102,32,37,102,10,0,37,102,32,45,32,37,102,32,37,102,32,37,102,32,37,102,32,61,32,37,102,32,40,37,102,32,37,102,32,37,102,32,37,102,41,10,0,116,114,121,105,110,103,32,116,111,32,97,100,100,32,116,111,32,114,101,99,116,32,123,37,102,32,43,47,45,32,37,102,44,32,37,102,32,43,47,45,32,37,102,125,10,0,116,111,116,97,108,32,97,100,100,101,100,32,115,111,32,102,97,114,32,61,32,37,100,10,0,97,100,100,105,110,103,32,37,100,32,105,116,101,109,115,44,32,116,111,116,97,108,32,97,114,101,97,32,61,32,37,102,44,32,119,32,61,32,37,102,44,32,97,114,101,97,47,119,61,37,102,10,0,99,111,109,112,111,117,110,100,69,100,103,101,115,58,32,99,111,117,108,100,32,110,111,116,32,99,111,110,115,116,114,117,99,116,32,111,98,115,116,97,99,108,101,115,32,45,32,102,97,108,108,105,110,103,32,98,97,99,107,32,116,111,32,115,116,114,97,105,103,104,116,32,108,105,110,101,32,101,100,103,101,115,10,0,99,111,109,112,111,117,110,100,69,100,103,101,115,58,32,110,111,100,101,115,32,116,111,117,99,104,32,45,32,102,97,108,108,105,110,103,32,98,97,99,107,32,116,111,32,115,116,114,97,105,103,104,116,32,108,105,110,101,32,101,100,103,101,115,10,0,112,97,99,107,32,118,97,108,117,101,32,37,100,32,105,115,32,115,109,97,108,108,101,114,32,116,104,97,110,32,101,115,101,112,32,40,37,46,48,51,102,44,37,46,48,51,102,41,10,0,115,101,112,32,118,97,108,117,101,32,40,37,46,48,51,102,44,37,46,48,51,102,41,32,105,115,32,115,109,97,108,108,101,114,32,116,104,97,110,32,101,115,101,112,32,40,37,46,48,51,102,44,37,46,48,51,102,41,10,0,99,99,37,115,95,37,100,0,99,99,37,115,43,37,100,0,99,95,99,110,116,32,61,61,32,48,0,99,111,109,112,46,99,0,102,105,110,100,67,67,111,109,112,0,103,114,105,100,40,37,100,44,37,100,41,58,32,37,115,10,0,119,103,116,32,62,32,48,0,81,117,97,100,84,114,101,101,46,99,0,81,117,97,100,84,114,101,101,95,114,101,112,117,108,115,105,118,101,95,102,111,114,99,101,95,97,99,99,117,109,117,108,97,116,101,0,113,116,50,45,62,110,32,62,32,48,0,113,116,49,45,62,110,32,62,32,48,32,38,38,32,113,116,50,45,62,110,32,62,32,48,0,81,117,97,100,84,114,101,101,95,114,101,112,117,108,115,105,118,101,95,102,111,114,99,101,95,105,110,116,101,114,97,99,116,0,100,105,115,116,32,62,32,48,0,33,40,113,45,62,108,41,0,81,117,97,100,84,114,101,101,95,97,100,100,95,105,110,116,101,114,110,97,108,0,105,105,32,60,32,49,60,60,100,105,109,32,38,38,32,105,105,32,62,61,32,48,0,113,45,62,113,116,115,91,105,105,93,0,113,45,62,110,32,61,61,32,49,0,33,40,113,45,62,113,116,115,41,0,113,45,62,108,0,119,105,100,116,104,32,62,32,48,0,81,117,97,100,84,114,101,101,95,110,101,119,0,65,45,62,102,111,114,109,97,116,32,61,61,32,70,79,82,77,65,84,95,67,83,82,0,83,112,97,114,115,101,77,97,116,114,105,120,46,99,0,83,112,97,114,115,101,77,97,116,114,105,120,95,116,114,97,110,115,112,111,115,101,0,65,32,38,38,32,66,0,83,112,97,114,115,101,77,97,116,114,105,120,95,97,100,100,0,65,45,62,102,111,114,109,97,116,32,61,61,32,66,45,62,102,111,114,109,97,116,32,38,38,32,65,45,62,102,111,114,109,97,116,32,61,61,32,70,79,82,77,65,84,95,67,83,82,0,65,45,62,116,121,112,101,32,61,61,32,66,45,62,116,121,112,101,0,83,112,97,114,115,101,77,97,116,114,105,120,95,105,115,95,115,121,109,109,101,116,114,105,99,0,65,45,62,102,111,114,109,97,116,32,61,61,32,70,79,82,77,65,84,95,67,79,79,82,68,0,83,112,97,114,115,101,77,97,116,114,105,120,95,102,114,111,109,95,99,111,111,114,100,105,110,97,116,101,95,102,111,114,109,97,116,0,109,32,62,32,48,32,38,38,32,110,32,62,32,48,32,38,38,32,110,122,32,62,61,32,48,0,83,112,97,114,115,101,77,97,116,114,105,120,95,102,114,111,109,95,99,111,111,114,100,105,110,97,116,101,95,97,114,114,97,121,115,95,105,110,116,101,114,110,97,108,0,65,0,106,97,91,109,97,115,107,91,106,97,91,106,93,93,93,32,61,61,32,106,97,91,106,93,0,83,112,97,114,115,101,77,97,116,114,105,120,95,115,117,109,95,114,101,112,101,97,116,95,101,110,116,114,105,101,115,0,105,100,32,60,32,110,42,40,121,109,97,120,45,121,109,105,110,43,49,41,0,106,97,91,109,97,115,107,91,105,100,93,93,32,61,61,32,106,97,91,106,93,0,83,112,97,114,115,101,77,97,116,114,105,120,95,109,117,108,116,105,112,108,121,95,100,101,110,115,101,50,0,65,45,62,116,121,112,101,32,61,61,32,77,65,84,82,73,88,95,84,89,80,69,95,82,69,65,76,0,83,112,97,114,115,101,77,97,116,114,105,120,95,109,117,108,116,105,112,108,121,95,118,101,99,116,111,114,0,65,45,62,116,121,112,101,32,61,61,32,77,65,84,82,73,88,95,84,89,80,69,95,82,69,65,76,32,124,124,32,65,45,62,116,121,112,101,32,61,61,32,77,65,84,82,73,88,95,84,89,80,69,95,73,78,84,69,71,69,82,0,83,112,97,114,115,101,77,97,116,114,105,120,95,109,117,108,116,105,112,108,121,95,100,101,110,115,101,49,0,83,112,97,114,115,101,77,97,116,114,105,120,95,109,117,108,116,105,112,108,121,0,106,99,91,109,97,115,107,91,106,98,91,107,93,93,93,32,61,61,32,106,98,91,107,93,0,83,112,97,114,115,101,77,97,116,114,105,120,95,109,117,108,116,105,112,108,121,51,0,106,100,91,109,97,115,107,91,106,99,91,107,93,93,93,32,61,61,32,106,99,91,107,93,0,83,112,97,114,115,101,77,97,116,114,105,120,95,99,111,111,114,100,105,110,97,116,101,95,102,111,114,109,95,97,100,100,95,101,110,116,114,105,101,115,0,83,112,97,114,115,101,77,97,116,114,105,120,95,100,105,118,105,100,101,95,114,111,119,95,98,121,95,100,101,103,114,101,101,0,110,32,62,32,49,0,103,101,110,101,114,97,108,46,99,0,105,114,97,110,100,0,111,110,101,98,108,111,99,107,0,109,105,110,100,105,115,116,0,97,114,116,105,99,117,108,97,116,105,111,110,95,112,111,115,0,114,111,111,116,0,80,114,105,111,114,105,116,121,81,117,101,117,101,46,99,0,80,114,105,111,114,105,116,121,81,117,101,117,101,95,112,117,115,104,0,103,97,105,110,32,60,61,32,113,45,62,110,103,97,105,110,0,83,112,97,114,115,101,77,97,116,114,105,120,95,105,115,95,115,121,109,109,101,116,114,105,99,40,65,44,32,70,65,76,83,69,41,0,112,111,115,116,95,112,114,111,99,101,115,115,46,99,0,105,100,101,97,108,95,100,105,115,116,97,110,99,101,95,109,97,116,114,105,120,0,108,101,110,32,62,32,48,0,83,116,114,101,115,115,77,97,106,111,114,105,122,97,116,105,111,110,83,109,111,111,116,104,101,114,50,95,110,101,119,0,110,122,32,62,32,48,0,105,100,101,97,108,95,100,105,115,116,95,115,99,104,101,109,101,32,118,97,108,117,101,32,119,114,111,110,103,0,83,112,97,114,115,101,77,97,116,114,105,120,95,105,115,95,115,121,109,109,101,116,114,105,99,40,65,44,32,70,65,76,83,69,41,32,38,38,32,65,45,62,116,121,112,101,32,61,61,32,77,65,84,82,73,88,95,84,89,80,69,95,82,69,65,76,0,83,112,97,114,115,101,83,116,114,101,115,115,77,97,106,111,114,105,122,97,116,105,111,110,83,109,111,111,116,104,101,114,95,110,101,119,0,105,100,105,97,103,32,62,61,32,48,0,83,116,114,101,115,115,77,97,106,111,114,105,122,97,116,105,111,110,83,109,111,111,116,104,101,114,95,115,109,111,111,116,104,0,40,33,106,99,110,41,32,38,38,32,40,33,118,97,108,41,0,103,101,116,95,101,100,103,101,95,108,97,98,101,108,95,109,97,116,114,105,120,0,84,114,105,97,110,103,108,101,83,109,111,111,116,104,101,114,95,110,101,119,0,106,100,105,97,103,32,62,61,32,48,0,83,112,114,105,110,103,83,109,111,111,116,104,101,114,95,110,101,119,0,33,102,108,97,103,0,83,112,114,105,110,103,83,109,111,111,116,104,101,114,95,115,109,111,111,116,104,0,110,101,105,103,104,98,61,37,100,10,0,114,111,111,116,32,61,32,37,115,10,0,95,98,108,111,99,107,95,37,100,0,115,45,62,115,122,32,62,32,48,0,98,108,111,99,107,116,114,101,101,46,99,0,112,111,112,0,97,99,116,117,97,108,0,110,111,100,101,108,105,115,116,46,99,0,105,110,115,101,114,116,78,111,100,101,108,105,115,116,0,95,115,112,97,110,95,37,100,0,95,99,108,111,110,101,95,37,100,0,105,112,0,100,101,103,108,105,115,116,46,99,0,114,101,109,111,118,101,68,101,103,108,105,115,116,0,69,114,114,111,114,0,87,97,114,110,105,110,103,0,37,115,58,32,0,117,115,101,114,111,117,116,58,32,99,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,10,0,95,65,71,95,115,116,114,100,97,116,97,0,95,65,71,95,100,97,116,97,100,105,99,116,0,97,103,100,105,99,116,111,102,58,32,117,110,107,110,111,119,110,32,107,105,110,100,32,37,100,10,0,37,99,37,108,100,0,109,101,109,111,114,121,32,97,108,108,111,99,97,116,105,111,110,32,102,97,105,108,117,114,101,0,97,103,100,101,108,101,116,101,32,111,110,32,119,114,111,110,103,32,103,114,97,112,104,0,95,65,71,95,112,101,110,100,105,110,103,0,97,103,114,101,99,111,114,100,95,99,97,108,108,98,97,99,107,32,111,102,32,97,32,98,97,100,32,111,98,106,101,99,116,0,112,101,110,100,32,100,105,99,116,111,102,32,97,32,98,97,100,32,111,98,106,101,99,116,0,109,111,118,101,32,116,111,32,102,114,111,110,116,32,108,111,99,107,32,105,110,99,111,110,115,105,115,116,101,110,99,121,0,92,92,0,102,97,116,97,108,32,102,108,101,120,32,115,99,97,110,110,101,114,32,105,110,116,101,114,110,97,108,32,101,114,114,111,114,45,45,110,111,32,97,99,116,105,111,110,32,102,111,117,110,100,0,37,115,10,0,102,97,116,97,108,32,102,108,101,120,32,115,99,97,110,110,101,114,32,105,110,116,101,114,110,97,108,32,101,114,114,111,114,45,45,101,110,100,32,111,102,32,98,117,102,102,101,114,32,109,105,115,115,101,100,0,102,97,116,97,108,32,101,114,114,111,114,32,45,32,115,99,97,110,110,101,114,32,105,110,112,117,116,32,98,117,102,102,101,114,32,111,118,101,114,102,108,111,119,0,111,117,116,32,111,102,32,100,121,110,97,109,105,99,32,109,101,109,111,114,121,32,105,110,32,97,97,103,95,103,101,116,95,110,101,120,116,95,98,117,102,102,101,114,40,41,0,105,110,112,117,116,0,115,121,110,116,97,120,32,97,109,98,105,103,117,105,116,121,32,45,32,98,97,100,108,121,32,100,101,108,105,109,105,116,101,100,32,110,117,109,98,101,114,32,39,0,39,32,105,110,32,108,105,110,101,32,37,100,32,111,102,32,0,32,115,112,108,105,116,115,32,105,110,116,111,32,116,119,111,32,116,111,107,101,110,115,10,0,37,115,0,108,105,110,101,0,37,100,32,37,49,91,34,93,37,110,0,111,117,116,32,111,102,32,100,121,110,97,109,105,99,32,109,101,109,111,114,121,32,105,110,32,97,97,103,95,99,114,101,97,116,101,95,98,117,102,102,101,114,40,41,0,111,117,116,32,111,102,32,100,121,110,97,109,105,99,32,109,101,109,111,114,121,32,105,110,32,97,97,103,101,110,115,117,114,101,95,98,117,102,102,101,114,95,115,116,97,99,107,40,41,0,58,32,0,32,105,110,32,108,105,110,101,32,37,100,0,32,110,101,97,114,32,39,0,32,115,99,97,110,110,105,110,103,32,97,32,113,117,111,116,101,100,32,115,116,114,105,110,103,32,40,109,105,115,115,105,110,103,32,101,110,100,113,117,111,116,101,63,32,108,111,110,103,101,114,32,116,104,97,110,32,37,100,63,41,0,10,83,116,114,105,110,103,32,115,116,97,114,116,105,110,103,58,34,0,32,115,99,97,110,110,105,110,103,32,97,32,72,84,77,76,32,115,116,114,105,110,103,32,40,109,105,115,115,105,110,103,32,39,62,39,63,32,98,97,100,32,110,101,115,116,105,110,103,63,32,108,111,110,103,101,114,32,116,104,97,110,32,37,100,63,41,0,10,83,116,114,105,110,103,32,115,116,97,114,116,105,110,103,58,60,0,32,115,99,97,110,110,105,110,103,32,97,32,47,42,46,46,46,42,47,32,99,111,109,109,101,110,116,32,40,109,105,115,115,105,110,103,32,39,42,47,63,32,108,111,110,103,101,114,32,116,104,97,110,32,37,100,63,41,0,102,108,101,120,32,115,99,97,110,110,101,114,32,112,117,115,104,45,98,97,99,107,32,111,118,101,114,102,108,111,119,0,34,34,0,115,116,114,105,99,116,0,108,105,110,101,108,101,110,103,116,104,0,59,10,0,32,91,107,101,121,61,0,93,0,32,91,0,44,10,0,61,0,95,37,108,100,95,83,85,83,80,69,67,84,0,100,105,0,115,116,114,105,99,116,32,0,123,10,0,93,59,10,0,18,238,238,20,9,3,238,254,238,238,238,1,238,238,238,1,238,238,10,254,238,19,25,21,238,19,1,238,238,238,238,11,17,238,238,238,238,238,238,238,238,238,1,238,238,22,9,1,1,29,15,23,238,238,26,23,27,238,238,28,238,238,238,238,1,25,251,238,238,238,1,238,16,238,238,30,238,238,238,238,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,23,17,2,2,2,2,2,2,2,2,2,2,2,2,2,18,16,2,19,2,2,22,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,20,2,21,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,14,2,15,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,3,4,5,6,7,8,9,10,11,12,13,11,3,4,5,15,7,3,12,13,6,12,13,14,12,13,26,21,22,0,1,0,3,7,14,6,15,8,12,13,18,19,42,16,17,9,16,47,48,17,50,23,19,13,20,18,46,18,20,65,19,50,19,44,64,42,66,25,44,66,70,34,12,13,14,35,15,9,16,17,10,16,17,201,16,17,45,69,70,252,1,6,246,15,7,246,36,2,16,17,47,48,54,77,78,40,38,59,60,42,54,49,57,61,63,47,58,64,216,68,48,62,37,55,67,53,75,43,56,73,76,0,3,9,0,0,0,1,14,2,11,12,8,35,36,37,54,59,61,0,13,16,18,27,22,28,18,39,50,34,23,51,30,60,6,7,53,5,15,17,20,24,41,0,19,41,0,0,0,0,0,55,21,40,29,30,0,33,38,52,31,48,62,25,44,0,27,0,32,26,42,0,43,58,46,47,0,49,56,57,45,0,2,2,1,0,3,3,1,0,1,0,1,1,1,0,2,1,1,0,2,2,3,1,1,0,0,5,0,1,3,1,3,5,3,1,1,1,1,2,0,1,0,4,2,0,2,1,1,3,2,1,0,3,2,1,0,1,1,0,1,1,1,3,0,24,25,25,25,26,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,36,36,38,39,37,37,40,40,41,41,41,42,42,43,43,43,44,44,45,45,46,47,47,48,49,49,50,51,52,54,53,55,55,55,56,56,56,57,57,58,58,238,238,255,238,238,238,238,238,238,31,32,238,0,239,238,238,238,12,238,238,238,8,13,238,238,238,248,238,238,238,238,238,238,245,238,255,3,8,4,33,5,11,18,19,39,20,21,22,41,50,65,23,24,25,26,44,51,52,66,71,72,27,74,28,29,46,30,79,31,32,107,101,121,0,97,116,116,114,105,98,117,116,101,32,109,97,99,114,111,115,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,37,115,58,37,115,0,67,111,117,108,100,32,110,111,116,32,111,112,101,110,32,34,37,115,34,32,102,111,114,32,119,114,105,116,105,110,103,32,58,32,37,115,10,0,78,111,32,108,105,98,122,32,115,117,112,112,111,114,116,46,10,0,46,37,100,0,110,111,110,97,109,101,46,103,118,0,103,118,119,114,105,116,101,95,110,111,95,122,32,112,114,111,98,108,101,109,32,37,100,10,0,109,101,109,111,114,121,32,97,108,108,111,99,97,116,105,111,110,32,102,97,105,108,117,114,101,10,0,78,111,32,108,105,98,122,32,115,117,112,112,111,114,116,10,0,103,118,112,114,105,110,116,102,58,32,37,115,10,0,45,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,46,57,57,0,103,114,97,112,104,118,105,122,0,50,46,52,48,46,49,0,50,48,49,54,49,50,50,53,46,48,51,48,52,0,114,101,110,100,101,114,0,100,101,118,105,99,101,0,108,111,97,100,105,109,97,103,101,0,100,121,110,97,109,105,99,32,108,111,97,100,105,110,103,32,110,111,116,32,97,118,97,105,108,97,98,108,101,10,0,85,115,105,110,103,32,37,115,58,32,37,115,58,37,115,10,0,103,118,117,115,101,114,115,104,97,112,101,46,99,0,103,118,117,115,101,114,115,104,97,112,101,95,102,105,110,100,0,103,118,117,115,101,114,115,104,97,112,101,95,102,105,108,101,95,97,99,99,101,115,115,0,70,105,108,101,110,97,109,101,32,34,37,115,34,32,105,115,32,117,110,115,97,102,101,10,0,37,115,32,119,104,105,108,101,32,111,112,101,110,105,110,103,32,37,115,10,0,117,115,45,62,102,0,103,118,117,115,101,114,115,104,97,112,101,95,111,112,101,110,0,34,37,115,34,32,119,97,115,32,110,111,116,32,102,111,117,110,100,32,97,115,32,97,32,102,105,108,101,32,111,114,32,97,115,32,97,32,115,104,97,112,101,32,108,105,98,114,97,114,121,32,109,101,109,98,101,114,10,0,47,77,101,100,105,97,66,111,120,0,40,91,97,45,122,93,91,97,45,122,65,45,90,93,42,41,61,34,40,91,94,34,93,42,41,34,0,99,97,110,110,111,116,32,99,111,109,112,105,108,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,37,115,0,37,108,102,37,50,115,0,112,116,0,118,105,101,119,66,111,120,0,37,108,102,32,37,108,102,32,37,108,102,32,37,108,102,0,105,110,0,112,120,0,112,99,0,34,0,99,109,0,109,109,0,37,37,66,111,117,110,100,105,110,103,66,111,120,58,0,1,208,209,210,211,212,213,214,215,216,217,0,60,115,118,103,0,87,69,66,80,0,119,101,98,112,0,40,108,105,98,41,0,137,80,78,71,13,10,26,10,0,112,110,103,0,37,33,80,83,45,65,100,111,98,101,45,0,66,77,0,98,109,112,0,71,73,70,56,0,103,105,102,0,255,216,255,224,0,106,112,101,103,0,37,80,68,70,45,0,112,100,102,0,197,208,211,198,0,101,112,115,0,60,63,120,109,108,0,120,109,108,0,82,73,70,70,0,114,105,102,102,0,0,0,1,0,0,105,99,111,0,37,100,32,37,100,32,37,100,32,37,100,0,76,97,121,111,117,116,32,119,97,115,32,110,111,116,32,100,111,110,101,10,0,102,97,105,108,117,114,101,32,109,97,108,108,111,99,39,105,110,103,32,102,111,114,32,114,101,115,117,108,116,32,115,116,114,105,110,103,0,103,99,58,32,79,117,116,32,111,102,32,109,101,109,111,114,121,10,0,95,99,99,95,0,111,114,105,103,0,111,112,0,99,99,111,109,112,115,46,99,0,109,97,112,67,108,117,115,116,0,99,99,103,114,97,112,104,105,110,102,111,0,99,99,103,110,111,100,101,105,110,102,111,0,40,37,52,108,100,41,32,37,55,108,100,32,110,111,100,101,115,32,37,55,108,100,32,101,100,103,101,115,10,0,32,32,32,32,32,32,32,37,55,100,32,110,111,100,101,115,32,37,55,100,32,101,100,103,101,115,32,37,55,108,100,32,99,111,109,112,111,110,101,110,116,115,32,37,115,10,0,100,103,0,69,114,114,111,114,58,32,110,111,100,101,32,34,37,115,34,32,98,101,108,111,110,103,115,32,116,111,32,116,119,111,32,110,111,110,45,110,101,115,116,101,100,32,99,108,117,115,116,101,114,115,32,34,37,115,34,32,97,110,100,32,34,37,115,34,10,0,115,111,114,116,118,0,114,111,119,32,109,97,106,111,114,0,99,111,108,117,109,110,32,109,97,106,111,114,0,97,114,114,97,121,32,112,97,99,107,105,110,103,58,32,37,115,32,37,100,32,114,111,119,115,32,37,100,32,99,111,108,117,109,110,115,10,0,98,98,91,37,115,93,32,37,46,53,103,32,37,46,53,103,32,37,46,53,103,32,37,46,53,103,10,0,115,116,101,112,32,115,105,122,101,32,61,32,37,100,10,0,112,111,115,91,37,100,93,32,37,100,32,37,100,10,0,99,99,32,40,37,100,32,99,101,108,108,115,41,32,97,116,32,40,37,100,44,37,100,41,32,40,37,100,44,37,100,41,10,0,99,99,32,40,37,100,32,99,101,108,108,115,41,32,97,116,32,40,37,100,44,37,100,41,10,0,37,115,32,110,111,46,32,99,101,108,108,115,32,37,100,32,87,32,37,100,32,72,32,37,100,10,0,32,32,37,100,32,37,100,32,99,101,108,108,10,0,108,105,98,112,97,99,107,58,32,100,105,115,99,32,61,32,37,102,32,40,32,60,32,48,41,10,0,80,97,99,107,105,110,103,58,32,99,111,109,112,117,116,101,32,103,114,105,100,32,115,105,122,101,10,0,97,32,37,102,32,98,32,37,102,32,99,32,37,102,32,100,32,37,102,32,114,32,37,102,10,0,114,111,111,116,32,37,100,32,40,37,102,41,32,37,100,32,40,37,102,41,10,0,32,114,49,32,37,102,32,114,50,32,37,102,10,0,112,105,110,102,111,0,112,97,99,107,46,99,0,103,101,116,80,97,99,107,73,110,102,111,0,32,32,109,97,114,103,105,110,32,37,100,10,0,112,97,99,107,109,111,100,101,0,112,97,114,115,101,80,97,99,107,77,111,100,101,73,110,102,111,0,97,114,114,97,121,0,97,115,112,101,99,116,0,37,102,0,112,97,99,107,32,105,110,102,111,58,10,0,32,32,109,111,100,101,32,32,32,37,115,10,0,32,32,97,115,112,101,99,116,32,37,102,10,0,32,32,115,105,122,101,32,32,32,37,100,10,0,32,32,102,108,97,103,115,32,32,37,100,10,0,117,110,100,101,102,105,110,101,100,0,112,97,99,107,0,65,114,114,111,119,32,116,121,112,101,32,34,37,115,34,32,117,110,107,110,111,119,110,32,45,32,105,103,110,111,114,105,110,103,10,0,110,111,114,109,97,108,0,99,114,111,119,0,116,101,101,0,100,111,116,0,105,110,118,0,118,101,101,0,112,101,110,0,109,112,116,121,0,99,117,114,118,101,0,105,99,117,114,118,101,0,108,0,104,97,108,102,0,105,110,118,101,109,112,116,121,0,95,98,97,99,107,103,114,111,117,110,100,0,95,100,114,97,119,95,0,67,111,117,108,100,32,110,111,116,32,112,97,114,115,101,32,34,95,98,97,99,107,103,114,111,117,110,100,34,32,97,116,116,114,105,98,117,116,101,32,105,110,32,103,114,97,112,104,32,37,115,10,0,32,32,34,37,115,34,10,0,110,111,32,109,101,109,111,114,121,32,102,114,111,109,32,122,109,97,108,108,111,99,40,41,10,0,111,98,106,0,101,109,105,116,46,99,0,112,111,112,95,111,98,106,95,115,116,97,116,101,0,99,108,117,115,116,0,37,108,100,0,112,97,103,101,37,100,44,37,100,95,0,84,111,116,97,108,32,115,105,122,101,32,62,32,49,32,105,110,32,34,37,115,34,32,99,111,108,111,114,32,115,112,101,99,32,0,73,108,108,101,103,97,108,32,108,101,110,103,116,104,32,118,97,108,117,101,32,105,110,32,34,37,115,34,32,99,111,108,111,114,32,97,116,116,114,105,98,117,116,101,32,0,108,110,114,99,111,108,111,114,115,99,104,101,109,101,0,101,109,105,116,95,101,100,103,101,95,108,97,98,101,108,0,37,115,45,37,115,0,102,111,114,119,97,114,100,0,98,97,99,107,0,32,45,62,32,0,32,45,45,32,0,105,110,32,101,100,103,101,32,37,115,37,115,37,115,10,0,108,97,98,101,108,97,108,105,103,110,101,100,0,101,100,103,101,104,114,101,102,0,101,100,103,101,85,82,76,0,108,97,98,101,108,104,114,101,102,0,108,97,98,101,108,85,82,76,0,116,97,105,108,104,114,101,102,0,116,97,105,108,85,82,76,0,104,101,97,100,104,114,101,102,0,104,101,97,100,85,82,76,0,101,100,103,101,116,97,114,103,101,116,0,108,97,98,101,108,116,97,114,103,101,116,0,116,97,105,108,116,97,114,103,101,116,0,104,101,97,100,116,97,114,103,101,116,0,101,100,103,101,116,111,111,108,116,105,112,0,108,97,98,101,108,116,111,111,108,116,105,112,0,116,97,105,108,116,111,111,108,116,105,112,0,104,101,97,100,116,111,111,108,116,105,112,0,1,110,101,115,116,105,110,103,32,110,111,116,32,97,108,108,111,119,101,100,32,105,110,32,115,116,121,108,101,58,32,37,115,10,0,117,110,109,97,116,99,104,101,100,32,39,41,39,32,105,110,32,115,116,121,108,101,58,32,37,115,10,0,116,114,117,110,99,97,116,105,110,103,32,115,116,121,108,101,32,39,37,115,39,10,0,117,110,109,97,116,99,104,101,100,32,39,40,39,32,105,110,32,115,116,121,108,101,58,32,37,115,10,0,97,108,108,0,105,110,32,99,108,117,115,116,101,114,32,37,115,10,0,77,111,114,101,32,116,104,97,110,32,50,32,99,111,108,111,114,115,32,115,112,101,99,105,102,105,101,100,32,102,111,114,32,97,32,103,114,97,100,105,101,110,116,32,45,32,105,103,110,111,114,105,110,103,32,114,101,109,97,105,110,105,110,103,10,0,103,114,97,100,105,101,110,116,32,112,101,110,32,99,111,108,111,114,115,32,110,111,116,32,121,101,116,32,115,117,112,112,111,114,116,101,100,46,10,0,73,109,97,103,101,115,32,117,110,115,117,112,112,111,114,116,101,100,32,105,110,32,34,98,97,99,107,103,114,111,117,110,100,34,32,97,116,116,114,105,98,117,116,101,10,0,108,97,121,101,114,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,105,110,32,37,115,32,111,117,116,112,117,116,10,0,76,97,121,111,117,116,32,119,97,115,32,110,111,116,32,100,111,110,101,46,32,32,77,105,115,115,105,110,103,32,108,97,121,111,117,116,32,112,108,117,103,105,110,115,63,32,10,0,103,118,82,101,110,100,101,114,74,111,98,115,32,37,115,58,32,37,46,50,102,32,115,101,99,115,46,10,0,108,97,121,111,117,116,32,119,97,115,32,110,111,116,32,100,111,110,101,10,0,114,101,110,100,101,114,101,114,32,102,111,114,32,37,115,32,105,115,32,117,110,97,118,97,105,108,97,98,108,101,10,0,112,97,103,101,100,105,114,61,37,115,32,105,103,110,111,114,101,100,10,0,118,105,101,119,112,111,114,116,0,37,108,102,44,37,108,102,44,37,108,102,44,39,37,91,94,39,93,39,0,37,108,102,44,37,108,102,44,37,108,102,44,37,91,94,44,93,37,115,0,37,108,102,44,37,108,102,44,37,108,102,44,37,108,102,44,37,108,102,0,111,117,116,112,117,116,111,114,100,101,114,0,111,100,101,115,102,105,114,115,116,0,100,103,101,115,102,105,114,115,116,0,108,97,121,101,114,115,0,108,97,121,101,114,115,101,108,101,99,116,0,84,104,101,32,108,97,121,101,114,115,101,108,101,99,116,32,97,116,116,114,105,98,117,116,101,32,34,37,115,34,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,97,110,121,32,108,97,121,101,114,32,115,112,101,99,105,102,101,100,32,98,121,32,116,104,101,32,108,97,121,101,114,115,32,97,116,116,114,105,98,117,116,101,32,45,32,105,103,110,111,114,101,100,46,10,0,108,97,121,101,114,115,101,112,0,58,9,32,0,108,97,121,101,114,108,105,115,116,115,101,112,0,44,0,84,104,101,32,99,104,97,114,97,99,116,101,114,32,39,37,99,39,32,97,112,112,101,97,114,115,32,105,110,32,98,111,116,104,32,116,104,101,32,108,97,121,101,114,115,101,112,32,97,110,100,32,108,97,121,101,114,108,105,115,116,115,101,112,32,97,116,116,114,105,98,117,116,101,115,32,45,32,108,97,121,101,114,108,105,115,116,115,101,112,32,105,103,110,111,114,101,100,46,10,0,112,97,100,0,66,76,0,112,97,103,101,100,105,114,0,115,111,108,105,100,0,0,115,101,116,108,105,110,101,119,105,100,116,104,0,49,0,0,115,112,108,45,62,115,105,122,101,32,62,32,48,0,105,110,105,116,95,115,112,108,105,110,101,115,95,98,98,0,98,122,46,115,105,122,101,32,62,32,48,0,98,101,122,105,101,114,95,98,98,0,98,122,46,115,105,122,101,32,37,32,51,32,61,61,32,49,0,37,108,102,0,102,111,110,116,112,97,116,104,0,68,79,84,70,79,78,84,80,65,84,72,0,71,68,70,79,78,84,80,65,84,72,0,105,109,97,103,101,112,97,116,104,0,113,117,97,110,116,117,109,0,114,97,110,107,100,105,114,0,76,82,0,66,84,0,82,76,0,110,111,100,101,115,101,112,0,114,97,110,107,115,101,112,0,101,113,117,97,108,108,121,0,115,104,111,119,98,111,120,101,115,0,102,111,110,116,110,97,109,101,115,0,115,105,122,101,0,112,97,103,101,0,99,101,110,116,101,114,0,114,111,116,97,116,101,0,111,114,105,101,110,116,97,116,105,111,110,0,108,97,110,100,115,99,97,112,101,0,99,108,117,115,116,101,114,114,97,110,107,0,99,111,110,99,101,110,116,114,97,116,101,0,100,112,105,0,114,101,115,111,108,117,116,105,111,110,0,111,114,100,101,114,105,110,103,0,102,105,108,108,99,111,108,111,114,0,102,111,110,116,115,105,122,101,0,102,111,110,116,110,97,109,101,0,102,111,110,116,99,111,108,111,114,0,120,108,97,98,101,108,0,112,101,110,119,105,100,116,104,0,112,101,114,105,112,104,101,114,105,101,115,0,115,107,101,119,0,100,105,115,116,111,114,116,105,111,110,0,110,111,106,117,115,116,105,102,121,0,108,97,121,101,114,0,103,114,111,117,112,0,99,111,109,109,101,110,116,0,118,101,114,116,105,99,101,115,0,122,0,119,101,105,103,104,116,0,108,97,98,101,108,102,108,111,97,116,0,100,105,114,0,97,114,114,111,119,104,101,97,100,0,97,114,114,111,119,116,97,105,108,0,104,101,97,100,108,97,98,101,108,0,116,97,105,108,108,97,98,101,108,0,108,97,98,101,108,102,111,110,116,115,105,122,101,0,108,97,98,101,108,102,111,110,116,110,97,109,101,0,108,97,98,101,108,102,111,110,116,99,111,108,111,114,0,108,97,98,101,108,100,105,115,116,97,110,99,101,0,108,97,98,101,108,97,110,103,108,101,0,109,105,110,108,101,110,0,100,101,99,111,114,97,116,101,0,97,114,114,111,119,115,105,122,101,0,99,111,110,115,116,114,97,105,110,116,0,116,97,105,108,99,108,105,112,0,104,101,97,100,99,108,105,112,0,108,97,98,101,108,106,117,115,116,0,108,111,99,97,108,0,103,108,111,98,97,108,0,37,108,102,44,37,108,102,37,99,0,37,108,102,37,99,0,114,97,116,105,111,0,97,117,116,111,0,99,111,109,112,114,101,115,115,0,101,120,112,97,110,100,0,102,105,108,108,0,103,100,0,112,115,0,115,118,103,0,99,104,97,114,115,101,116,0,117,116,102,45,56,0,108,97,116,105,110,45,49,0,108,97,116,105,110,49,0,108,49,0,73,83,79,45,56,56,53,57,45,49,0,73,83,79,95,56,56,53,57,45,49,0,73,83,79,56,56,53,57,45,49,0,73,83,79,45,73,82,45,49,48,48,0,98,105,103,45,53,0,98,105,103,53,0,117,116,102,56,0,85,110,115,117,112,112,111,114,116,101,100,32,99,104,97,114,115,101,116,32,34,37,115,34,32,45,32,97,115,115,117,109,105,110,103,32,117,116,102,45,56,10,0,85,110,115,117,112,112,111,114,116,101,100,32,99,104,97,114,115,101,116,32,118,97,108,117,101,32,37,100,10,0,85,84,70,45,56,0,66,73,71,45,53,0,105,110,32,108,97,98,101,108,32,111,102,32,103,114,97,112,104,32,37,115,10,0,105,110,32,108,97,98,101,108,32,111,102,32,110,111,100,101,32,37,115,10,0,105,110,32,108,97,98,101,108,32,111,102,32,101,100,103,101,32,37,115,32,37,115,32,37,115,10,0,107,105,110,100,32,61,61,32,76,84,95,78,79,78,69,0,108,97,98,101,108,115,46,99,0,109,97,107,101,95,108,97,98,101,108,0,92,76,0,92,71,0,92,69,0,92,72,0,92,84,0,38,35,49,51,59,0,38,113,117,111,116,59,0,38,35,49,48,59,0,38,35,49,54,48,59,0,38],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+92184);allocate([97,109,112,59,0,38,103,116,59,0,38,35,51,57,59,0,38,35,52,53,59,0,38,108,116,59,0,37,115,32,37,100,32,110,111,100,101,115,32,37,100,32,101,100,103,101,115,32,109,97,120,105,116,101,114,61,37,100,32,98,97,108,97,110,99,101,61,37,100,10,0,110,101,116,119,111,114,107,32,115,105,109,112,108,101,120,58,32,0,37,100,32,0,37,115,37,100,32,110,111,100,101,115,32,37,100,32,101,100,103,101,115,32,37,100,32,105,116,101,114,32,37,46,50,102,32,115,101,99,10,0,117,112,100,97,116,101,58,32,109,105,115,109,97,116,99,104,101,100,32,108,99,97,32,105,110,32,116,114,101,101,117,112,100,97,116,101,115,10,0,84,114,101,101,95,101,100,103,101,46,115,105,122,101,32,61,61,32,78,95,110,111,100,101,115,32,45,32,49,0,110,115,46,99,0,102,101,97,115,105,98,108,101,95,116,114,101,101,0,33,84,82,69,69,95,69,68,71,69,40,101,41,0,109,101,114,103,101,95,116,114,101,101,115,0,40,114,48,45,62,104,101,97,112,95,105,110,100,101,120,32,62,32,45,49,41,32,124,124,32,40,114,49,45,62,104,101,97,112,95,105,110,100,101,120,32,62,32,45,49,41,0,83,84,115,101,116,85,110,105,111,110,0,114,45,62,104,101,97,112,95,105,110,100,101,120,32,62,61,32,48,0,97,100,100,95,116,114,101,101,95,101,100,103,101,58,32,109,105,115,115,105,110,103,32,116,114,101,101,32,101,100,103,101,10,0,97,100,100,95,116,114,101,101,95,101,100,103,101,58,32,101,109,112,116,121,32,111,117,116,101,100,103,101,32,108,105,115,116,10,0,97,100,100,95,116,114,101,101,95,101,100,103,101,58,32,101,109,112,116,121,32,105,110,101,100,103,101,32,108,105,115,116,10,0,116,114,111,117,98,108,101,32,105,110,32,105,110,105,116,95,114,97,110,107,10,0,9,37,115,32,37,100,10,0,115,101,97,114,99,104,115,105,122,101,0,103,114,97,112,104,32,0,32,0,110,111,100,101,32,0,115,116,111,112,10,0,37,46,53,103,0,112,111,115,0,114,101,99,116,115,0,120,108,112,0,108,112,0,104,101,97,100,95,108,112,0,116,97,105,108,95,108,112,0,108,119,105,100,116,104,0,108,104,101,105,103,104,116,0,98,98,0,37,46,53,103,44,37,46,53,103,44,37,46,53,103,0,44,37,46,53,103,0,37,46,53,103,44,37,46,53,103,0,115,97,109,112,108,101,112,111,105,110,116,115,0,37,46,53,103,32,37,46,53,103,0,115,44,37,46,53,103,44,37,46,53,103,32,0,101,44,37,46,53,103,44,37,46,53,103,32,0,37,46,53,103,44,37,46,53,103,44,37,46,53,103,44,37,46,53,103,0,37,46,50,102,0,37,46,53,103,44,37,46,53,103,44,37,46,53,103,44,37,46,53,103,32,0,47,112,97,116,104,98,111,120,32,123,10,32,32,32,32,47,88,32,101,120,99,104,32,110,101,103,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,47,89,32,101,120,99,104,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,47,120,32,101,120,99,104,32,110,101,103,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,47,121,32,101,120,99,104,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,110,101,119,112,97,116,104,32,120,32,121,32,109,111,118,101,116,111,10,32,32,32,32,88,32,121,32,108,105,110,101,116,111,10,32,32,32,32,88,32,89,32,108,105,110,101,116,111,10,32,32,32,32,120,32,89,32,108,105,110,101,116,111,10,32,32,32,32,99,108,111,115,101,112,97,116,104,32,115,116,114,111,107,101,10,125,32,100,101,102,10,0,47,112,97,116,104,98,111,120,32,123,10,32,32,32,32,47,89,32,101,120,99,104,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,47,88,32,101,120,99,104,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,47,121,32,101,120,99,104,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,47,120,32,101,120,99,104,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,110,101,119,112,97,116,104,32,120,32,121,32,109,111,118,101,116,111,10,32,32,32,32,88,32,121,32,108,105,110,101,116,111,10,32,32,32,32,88,32,89,32,108,105,110,101,116,111,10,32,32,32,32,120,32,89,32,108,105,110,101,116,111,10,32,32,32,32,99,108,111,115,101,112,97,116,104,32,115,116,114,111,107,101,10,32,125,32,100,101,102,10,47,100,98,103,115,116,97,114,116,32,123,32,103,115,97,118,101,32,37,46,53,103,32,37,46,53,103,32,116,114,97,110,115,108,97,116,101,32,125,32,100,101,102,10,47,97,114,114,111,119,108,101,110,103,116,104,32,49,48,32,100,101,102,10,47,97,114,114,111,119,119,105,100,116,104,32,97,114,114,111,119,108,101,110,103,116,104,32,50,32,100,105,118,32,100,101,102,10,47,97,114,114,111,119,104,101,97,100,32,123,10,32,32,32,32,103,115,97,118,101,10,32,32,32,32,114,111,116,97,116,101,10,32,32,32,32,99,117,114,114,101,110,116,112,111,105,110,116,10,32,32,32,32,110,101,119,112,97,116,104,10,32,32,32,32,109,111,118,101,116,111,10,32,32,32,32,97,114,114,111,119,108,101,110,103,116,104,32,97,114,114,111,119,119,105,100,116,104,32,50,32,100,105,118,32,114,108,105,110,101,116,111,10,32,32,32,32,48,32,97,114,114,111,119,119,105,100,116,104,32,110,101,103,32,114,108,105,110,101,116,111,10,32,32,32,32,99,108,111,115,101,112,97,116,104,32,102,105,108,108,10,32,32,32,32,103,114,101,115,116,111,114,101,10,125,32,98,105,110,100,32,100,101,102,10,47,109,97,107,101,97,114,114,111,119,32,123,10,32,32,32,32,99,117,114,114,101,110,116,112,111,105,110,116,32,101,120,99,104,32,112,111,112,32,115,117,98,32,101,120,99,104,32,99,117,114,114,101,110,116,112,111,105,110,116,32,112,111,112,32,115,117,98,32,97,116,97,110,10,32,32,32,32,97,114,114,111,119,104,101,97,100,10,125,32,98,105,110,100,32,100,101,102,10,47,112,111,105,110,116,32,123,32,32,32,32,110,101,119,112,97,116,104,32,32,32,32,50,32,48,32,51,54,48,32,97,114,99,32,102,105,108,108,125,32,100,101,102,47,109,97,107,101,118,101,99,32,123,10,32,32,32,32,47,89,32,101,120,99,104,32,100,101,102,10,32,32,32,32,47,88,32,101,120,99,104,32,100,101,102,10,32,32,32,32,47,121,32,101,120,99,104,32,100,101,102,10,32,32,32,32,47,120,32,101,120,99,104,32,100,101,102,10,32,32,32,32,110,101,119,112,97,116,104,32,120,32,121,32,109,111,118,101,116,111,10,32,32,32,32,88,32,89,32,108,105,110,101,116,111,32,115,116,114,111,107,101,10,32,32,32,32,88,32,89,32,109,111,118,101,116,111,10,32,32,32,32,120,32,121,32,109,97,107,101,97,114,114,111,119,10,125,32,100,101,102,10,0,108,111,115,116,32,37,115,32,37,115,32,101,100,103,101,10,0,110,111,32,112,111,115,105,116,105,111,110,32,102,111,114,32,101,100,103,101,32,119,105,116,104,32,108,97,98,101,108,32,37,115,0,110,111,32,112,111,115,105,116,105,111,110,32,102,111,114,32,101,100,103,101,32,119,105,116,104,32,116,97,105,108,32,108,97,98,101,108,32,37,115,0,110,111,32,112,111,115,105,116,105,111,110,32,102,111,114,32,101,100,103,101,32,119,105,116,104,32,104,101,97,100,32,108,97,98,101,108,32,37,115,0,110,111,32,112,111,115,105,116,105,111,110,32,102,111,114,32,101,100,103,101,32,119,105,116,104,32,120,108,97,98,101,108,32,37,115,0,102,111,114,99,101,108,97,98,101,108,115,0,37,100,32,111,117,116,32,111,102,32,37,100,32,108,97,98,101,108,115,32,112,111,115,105,116,105,111,110,101,100,46,10,0,37,100,32,111,117,116,32,111,102,32,37,100,32,101,120,116,101,114,105,111,114,32,108,97,98,101,108,115,32,112,111,115,105,116,105,111,110,101,100,46,10,0,37,100,32,111,98,106,115,32,37,100,32,120,108,97,98,101,108,115,32,102,111,114,99,101,61,37,100,32,98,98,61,40,37,46,48,50,102,44,37,46,48,50,102,41,32,40,37,46,48,50,102,44,37,46,48,50,102,41,10,0,111,98,106,101,99,116,115,10,0,32,91,37,100,93,32,40,37,46,48,50,102,44,37,46,48,50,102,41,32,40,37,46,48,50,102,44,37,46,48,50,102,41,32,37,112,32,34,37,115,34,10,0,120,108,97,98,101,108,115,10,0,32,91,37,100,93,32,37,112,32,115,101,116,32,37,100,32,40,37,46,48,50,102,44,37,46,48,50,102,41,32,40,37,46,48,50,102,44,37,46,48,50,102,41,32,37,115,10,0,115,104,97,112,101,102,105,108,101,32,110,111,116,32,115,101,116,32,111,114,32,110,111,116,32,102,111,117,110,100,32,102,111,114,32,101,112,115,102,32,110,111,100,101,32,37,115,10,0,99,111,117,108,100,110,39,116,32,111,112,101,110,32,101,112,115,102,32,102,105,108,101,32,37,115,10,0,37,37,37,37,66,111,117,110,100,105,110,103,66,111,120,58,32,37,100,32,37,100,32,37,100,32,37,100,0,114,101,97,100,0,66,111,117,110,100,105,110,103,66,111,120,32,110,111,116,32,102,111,117,110,100,32,105,110,32,101,112,115,102,32,102,105,108,101,32,37,115,10,0,99,97,110,39,116,32,102,105,110,100,32,108,105,98,114,97,114,121,32,102,105,108,101,32,37,115,10,0,99,97,110,39,116,32,111,112,101,110,32,108,105,98,114,97,114,121,32,102,105,108,101,32,37,115,10,0,69,79,70,0,66,69,71,73,78,0,69,78,68,0,84,82,65,73,76,69,82,0,47,117,115,101,114,95,115,104,97,112,101,95,37,100,32,123,10,0,37,37,66,101,103,105,110,68,111,99,117,109,101,110,116,58,10,0,37,37,69,110,100,68,111,99,117,109,101,110,116,10,0,125,32,98,105,110,100,32,100,101,102,10,0,85,84,70,45,56,32,105,110,112,117,116,32,117,115,101,115,32,110,111,110,45,76,97,116,105,110,49,32,99,104,97,114,97,99,116,101,114,115,32,119,104,105,99,104,32,99,97,110,110,111,116,32,98,101,32,104,97,110,100,108,101,100,32,98,121,32,116,104,105,115,32,80,111,115,116,83,99,114,105,112,116,32,100,114,105,118,101,114,10,0,99,97,110,110,111,116,32,114,101,45,97,108,108,111,99,97,116,101,32,112,115,10,0,114,111,117,116,101,115,112,108,105,110,101,115,105,110,105,116,58,32,99,97,110,110,111,116,32,97,108,108,111,99,97,116,101,32,112,115,10,0,114,111,117,116,101,115,112,108,105,110,101,115,58,32,37,100,32,101,100,103,101,115,44,32,37,100,32,98,111,120,101,115,32,37,46,50,102,32,115,101,99,10,0,105,110,32,114,111,117,116,101,115,112,108,105,110,101,115,44,32,99,97,110,110,111,116,32,102,105,110,100,32,78,79,82,77,65,76,32,101,100,103,101,10,0,105,110,32,114,111,117,116,101,115,112,108,105,110,101,115,44,32,105,108,108,101,103,97,108,32,118,97,108,117,101,115,32,111,102,32,112,114,101,118,32,37,100,32,97,110,100,32,110,101,120,116,32,37,100,44,32,108,105,110,101,32,37,100,10,0,105,110,32,114,111,117,116,101,115,112,108,105,110,101,115,44,32,101,100,103,101,32,105,115,32,97,32,108,111,111,112,32,97,116,32,37,115,10,0,105,110,32,114,111,117,116,101,115,112,108,105,110,101,115,44,32,80,115,104,111,114,116,101,115,116,112,97,116,104,32,102,97,105,108,101,100,10,0,105,110,32,114,111,117,116,101,115,112,108,105,110,101,115,44,32,80,114,111,117,116,101,115,112,108,105,110,101,32,102,97,105,108,101,100,10,0,85,110,97,98,108,101,32,116,111,32,114,101,99,108,97,105,109,32,98,111,120,32,115,112,97,99,101,32,105,110,32,115,112,108,105,110,101,32,114,111,117,116,105,110,103,32,102,111,114,32,101,100,103,101,32,34,37,115,34,32,45,62,32,34,37,115,34,46,32,83,111,109,101,116,104,105,110,103,32,105,115,32,112,114,111,98,97,98,108,121,32,115,101,114,105,111,117,115,108,121,32,119,114,111,110,103,46,10,0,105,110,32,99,104,101,99,107,112,97,116,104,44,32,98,111,120,32,48,32,104,97,115,32,76,76,32,99,111,111,114,100,32,62,32,85,82,32,99,111,111,114,100,10,0,105,110,32,99,104,101,99,107,112,97,116,104,44,32,98,111,120,32,37,100,32,104,97,115,32,76,76,32,99,111,111,114,100,32,62,32,85,82,32,99,111,111,114,100,10,0,105,110,32,99,104,101,99,107,112,97,116,104,44,32,98,111,120,101,115,32,37,100,32,97,110,100,32,37,100,32,100,111,110,39,116,32,116,111,117,99,104,10,0,105,110,32,99,104,101,99,107,112,97,116,104,44,32,115,116,97,114,116,32,112,111,114,116,32,110,111,116,32,105,110,32,102,105,114,115,116,32,98,111,120,10,0,105,110,32,99,104,101,99,107,112,97,116,104,44,32,101,110,100,32,112,111,114,116,32,110,111,116,32,105,110,32,108,97,115,116,32,98,111,120,10,0,37,100,32,98,111,120,101,115,58,10,0,37,100,32,40,37,46,53,103,44,32,37,46,53,103,41,44,32,40,37,46,53,103,44,32,37,46,53,103,41,10,0,99,111,110,115,116,114,97,105,110,101,100,0,110,111,116,32,99,111,110,115,116,114,97,105,110,101,100,0,115,116,97,114,116,32,112,111,114,116,58,32,40,37,46,53,103,44,32,37,46,53,103,41,44,32,116,97,110,103,101,110,116,32,97,110,103,108,101,58,32,37,46,53,103,44,32,37,115,10,0,101,110,100,32,112,111,114,116,58,32,40,37,46,53,103,44,32,37,46,53,103,41,44,32,116,97,110,103,101,110,116,32,97,110,103,108,101,58,32,37,46,53,103,44,32,37,115,10,0,115,105,100,101,115,32,61,61,32,52,0,115,104,97,112,101,115,46,99,0,114,111,117,110,100,95,99,111,114,110,101,114,115,0,98,97,100,32,108,97,98,101,108,32,102,111,114,109,97,116,32,37,115,10,0,92,78,0,109,97,114,103,105,110,0,37,108,102,44,37,108,102,0,114,101,103,117,108,97,114,0,99,117,115,116,111,109,0,115,104,97,112,101,102,105,108,101,0,60,110,105,108,62,0,78,111,32,111,114,32,105,109,112,114,111,112,101,114,32,115,104,97,112,101,102,105,108,101,61,34,37,115,34,32,102,111,114,32,110,111,100,101,32,34,37,115,34,10,0,78,111,32,111,114,32,105,109,112,114,111,112,101,114,32,105,109,97,103,101,61,34,37,115,34,32,102,111,114,32,110,111,100,101,32,34,37,115,34,10,0,108,97,98,101,108,108,111,99,0,110,111,100,101,32,39,37,115,39,44,32,103,114,97,112,104,32,39,37,115,39,32,115,105,122,101,32,116,111,111,32,115,109,97,108,108,32,102,111,114,32,108,97,98,101,108,10,0,101,112,115,102,0,117,115,105,110,103,32,37,115,32,102,111,114,32,117,110,107,110,111,119,110,32,115,104,97,112,101,32,37,115,10,0,112,111,108,121,103,111,110,0,111,118,97,108,0,99,105,114,99,108,101,0,112,111,105,110,116,0,101,103,103,0,116,114,105,97,110,103,108,101,0,112,108,97,105,110,116,101,120,116,0,112,108,97,105,110,0,100,105,97,109,111,110,100,0,116,114,97,112,101,122,105,117,109,0,112,97,114,97,108,108,101,108,111,103,114,97,109,0,104,111,117,115,101,0,112,101,110,116,97,103,111,110,0,104,101,120,97,103,111,110,0,115,101,112,116,97,103,111,110,0,111,99,116,97,103,111,110,0,110,111,116,101,0,116,97,98,0,102,111,108,100,101,114,0,98,111,120,51,100,0,99,111,109,112,111,110,101,110,116,0,99,121,108,105,110,100,101,114,0,114,101,99,116,0,114,101,99,116,97,110,103,108,101,0,115,113,117,97,114,101,0,100,111,117,98,108,101,99,105,114,99,108,101,0,100,111,117,98,108,101,111,99,116,97,103,111,110,0,116,114,105,112,108,101,111,99,116,97,103,111,110,0,105,110,118,116,114,105,97,110,103,108,101,0,105,110,118,116,114,97,112,101,122,105,117,109,0,105,110,118,104,111,117,115,101,0,117,110,100,101,114,108,105,110,101,0,77,100,105,97,109,111,110,100,0,77,115,113,117,97,114,101,0,77,99,105,114,99,108,101,0,112,114,111,109,111,116,101,114,0,99,100,115,0,116,101,114,109,105,110,97,116,111,114,0,117,116,114,0,105,110,115,117,108,97,116,111,114,0,114,105,98,111,115,105,116,101,0,114,110,97,115,116,97,98,0,112,114,111,116,101,97,115,101,115,105,116,101,0,112,114,111,116,101,105,110,115,116,97,98,0,112,114,105,109,101,114,115,105,116,101,0,114,101,115,116,114,105,99,116,105,111,110,115,105,116,101,0,102,105,118,101,112,111,118,101,114,104,97,110,103,0,116,104,114,101,101,112,111,118,101,114,104,97,110,103,0,110,111,118,101,114,104,97,110,103,0,97,115,115,101,109,98,108,121,0,115,105,103,110,97,116,117,114,101,0,114,112,114,111,109,111,116,101,114,0,108,97,114,114,111,119,0,114,97,114,114,111,119,0,108,112,114,111,109,111,116,101,114,0,114,101,99,111,114,100,0,77,114,101,99,111,114,100,0,115,116,97,114,0,35,56,48,56,48,56,48,0,35,102,99,102,99,102,99,0,35,51,48,51,48,51,48,0,35,101,56,101,56,101,56,0,35,101,48,101,48,101,48,0,35,102,48,102,48,102,48,0,35,49,48,49,48,49,48,0,35,102,56,102,56,102,56,0,105,110,32,110,111,100,101,32,37,115,10,0,114,111,117,110,100,101,100,0,100,105,97,103,111,110,97,108,115,0,114,97,100,105,97,108,0,115,116,114,105,112,101,100,0,119,101,100,103,101,100,0,95,0,110,111,100,101,32,37,115,44,32,112,111,114,116,32,37,115,44,32,117,110,114,101,99,111,103,110,105,122,101,100,32,99,111,109,112,97,115,115,32,112,111,105,110,116,32,39,37,115,39,32,45,32,105,103,110,111,114,101,100,10,0,110,111,100,101,32,37,115,44,32,112,111,114,116,32,37,115,32,117,110,114,101,99,111,103,110,105,122,101,100,10,0,37,46,53,103,32,37,46,53,103,32,116,114,97,110,115,108,97,116,101,32,110,101,119,112,97,116,104,32,117,115,101,114,95,115,104,97,112,101,95,37,100,10,0,105,110,118,105,115,0,0,102,105,108,108,101,100,0,0,115,0,101,0,119,0,115,112,108,105,110,101,115,46,99,0,98,101,103,105,110,112,97,116,104,0,80,45,62,101,110,100,46,116,104,101,116,97,32,60,32,50,32,42,32,77,95,80,73,0,101,110,100,112,97,116,104,0,109,97,107,101,83,101,108,102,69,100,103,101,0,103,101,116,115,112,108,105,110,101,112,111,105,110,116,115,58,32,110,111,32,115,112,108,105,110,101,32,112,111,105,110,116,115,32,97,118,97,105,108,97,98,108,101,32,102,111,114,32,101,100,103,101,32,40,37,115,44,37,115,41,10,0,112,111,108,121,108,105,110,101,77,105,100,112,111,105,110,116,0,115,112,97,110,45,62,102,111,110,116,0,116,101,120,116,115,112,97,110,46,99,0,116,101,120,116,115,112,97,110,95,115,105,122,101,0,102,111,110,116,45,62,110,97,109,101,0,102,111,110,116,110,97,109,101,58,32,34,37,115,34,32,114,101,115,111,108,118,101,100,32,116,111,58,32,37,115,10,0,102,111,110,116,110,97,109,101,58,32,117,110,97,98,108,101,32,116,111,32,114,101,115,111,108,118,101,32,34,37,115,34,10,0,99,111,117,114,0,97,114,105,97,108,0,104,101,108,118,101,116,105,99,97,0,91,105,110,116,101,114,110,97,108,32,116,105,109,101,115,93,0,91,105,110,116,101,114,110,97,108,32,99,111,117,114,105,101,114,93,0,91,105,110,116,101,114,110,97,108,32,97,114,105,97,108,93,0,65,118,97,110,116,71,97,114,100,101,45,66,111,111,107,0,85,82,87,32,71,111,116,104,105,99,32,76,0,98,111,111,107,0,115,97,110,115,45,83,101,114,105,102,0,65,118,97,110,116,71,97,114,100,101,45,66,111,111,107,79,98,108,105,113,117,101,0,111,98,108,105,113,117,101,0,105,116,97,108,105,99,0,65,118,97,110,116,71,97,114,100,101,45,68,101,109,105,0,100,101,109,105,0,65,118,97,110,116,71,97,114,100,101,45,68,101,109,105,79,98,108,105,113,117,101,0,66,111,111,107,109,97,110,45,68,101,109,105,0,85,82,87,32,66,111,111,107,109,97,110,32,76,0,115,101,114,105,102,0,66,111,111,107,109,97,110,45,68,101,109,105,73,116,97,108,105,99,0,66,111,111,107,109,97,110,45,76,105,103,104,116,0,108,105,103,104,116,0,66,111,111,107,109,97,110,45,76,105,103,104,116,73,116,97,108,105,99,0,67,111,117,114,105,101,114,0,109,111,110,111,115,112,97,99,101,0,67,111,117,114,105,101,114,45,66,111,108,100,0,67,111,117,114,105,101,114,45,66,111,108,100,79,98,108,105,113,117,101,0,67,111,117,114,105,101,114,45,79,98,108,105,113,117,101,0,72,101,108,118,101,116,105,99,97,0,72,101,108,118,101,116,105,99,97,45,66,111,108,100,0,72,101,108,118,101,116,105,99,97,45,66,111,108,100,79,98,108,105,113,117,101,0,72,101,108,118,101,116,105,99,97,45,78,97,114,114,111,119,0,99,111,110,100,101,110,115,101,100,0,72,101,108,118,101,116,105,99,97,45,78,97,114,114,111,119,45,66,111,108,100,0,72,101,108,118,101,116,105,99,97,45,78,97,114,114,111,119,45,66,111,108,100,79,98,108,105,113,117,101,0,72,101,108,118,101,116,105,99,97,45,78,97,114,114,111,119,45,79,98,108,105,113,117,101,0,72,101,108,118,101,116,105,99,97,45,79,98,108,105,113,117,101,0,78,101,119,67,101,110,116,117,114,121,83,99,104,108,98,107,45,66,111,108,100,0,67,101,110,116,117,114,121,32,83,99,104,111,111,108,98,111,111,107,32,76,0,78,101,119,67,101,110,116,117,114,121,83,99,104,108,98,107,45,66,111,108,100,73,116,97,108,105,99,0,78,101,119,67,101,110,116,117,114,121,83,99,104,108,98,107,45,73,116,97,108,105,99,0,78,101,119,67,101,110,116,117,114,121,83,99,104,108,98,107,45,82,111,109,97,110,0,114,111,109,97,110,0,80,97,108,97,116,105,110,111,45,66,111,108,100,0,80,97,108,97,116,105,110,111,32,76,105,110,111,116,121,112,101,0,80,97,108,97,116,105,110,111,45,66,111,108,100,73,116,97,108,105,99,0,80,97,108,97,116,105,110,111,45,73,116,97,108,105,99,0,80,97,108,97,116,105,110,111,45,82,111,109,97,110,0,83,121,109,98,111,108,0,102,97,110,116,97,115,121,0,84,105,109,101,115,45,66,111,108,100,0,84,105,109,101,115,0,84,105,109,101,115,45,66,111,108,100,73,116,97,108,105,99,0,84,105,109,101,115,45,73,116,97,108,105,99,0,90,97,112,102,67,104,97,110,99,101,114,121,45,77,101,100,105,117,109,73,116,97,108,105,99,0,85,82,87,32,67,104,97,110,99,101,114,121,32,76,0,109,101,100,105,117,109,0,90,97,112,102,68,105,110,103,98,97,116,115,0,68,105,110,103,98,97,116,115,0,105,110,112,117,116,115,99,97,108,101,0,110,111,0,116,114,117,101,0,121,101,115,0,117,116,105,108,115,46,99,0,117,32,61,61,32,85,70,95,102,105,110,100,40,117,41,0,85,70,95,115,101,116,110,97,109,101,0,1,102,105,108,101,32,108,111,97,100,105,110,103,32,105,115,32,100,105,115,97,98,108,101,100,32,98,101,99,97,117,115,101,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,99,111,110,116,97,105,110,115,32,83,69,82,86,69,82,95,78,65,77,69,61,34,37,115,34,10,97,110,100,32,116,104,101,32,71,86,95,70,73,76,69,95,80,65,84,72,32,118,97,114,105,97,98,108,101,32,105,115,32,117,110,115,101,116,32,111,114,32,101,109,112,116,121,46,10,0,80,97,116,104,32,112,114,111,118,105,100,101,100,32,116,111,32,102,105,108,101,58,32,34,37,115,34,32,104,97,115,32,98,101,101,110,32,105,103,110,111,114,101,100,32,98,101,99,97,117,115,101,32,102,105,108,101,115,32,97,114,101,32,111,110,108,121,32,112,101,114,109,105,116,116,101,100,32,116,111,32,98,101,32,108,111,97,100,101,100,32,102,114,111,109,32,116,104,101,32,100,105,114,101,99,116,111,114,105,101,115,32,105,110,32,34,37,115,34,32,119,104,101,110,32,114,117,110,110,105,110,103,32,105,110,32,97,110,32,104,116,116,112,32,115,101,114,118,101,114,46,10,0,37,115,37,115,37,115,0,47,0,58,0,101,108,108,105,112,115,101,0,84,105,109,101,115,45,82,111,109,97,110,0,99,108,117,115,116,101,114,0,95,95,99,108,117,115,116,101,114,110,111,100,101,115,0,99,108,117,115,116,101,114,32,99,121,99,108,101,32,37,115,32,45,45,32,37,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,10,0,116,97,105,108,32,99,108,117,115,116,101,114,32,37,115,32,105,110,115,105,100,101,32,104,101,97,100,32,99,108,117,115,116,101,114,32,37,115,10,0,104,101,97,100,32,99,108,117,115,116,101,114,32,37,115,32,105,110,115,105,100,101,32,116,97,105,108,32,99,108,117,115,116,101,114,32,37,115,10,0,116,97,105,108,32,110,111,100,101,32,37,115,32,105,110,115,105,100,101,32,104,101,97,100,32,99,108,117,115,116,101,114,32,37,115,10,0,104,101,97,100,32,110,111,100,101,32,37,115,32,105,110,115,105,100,101,32,116,97,105,108,32,99,108,117,115,116,101,114,32,37,115,10,0,95,95,0,108,97,98,101,108,0,115,104,97,112,101,0,98,111,120,0,84,119,111,32,99,108,117,115,116,101,114,115,32,110,97,109,101,100,32,37,115,32,45,32,116,104,101,32,115,101,99,111,110,100,32,119,105,108,108,32,98,101,32,105,103,110,111,114,101,100,10,0,109,97,112,78,0,65,69,108,105,103,0,65,97,99,117,116,101,0,65,99,105,114,99,0,65,103,114,97,118,101,0,65,108,112,104,97,0,65,114,105,110,103,0,65,116,105,108,100,101,0,65,117,109,108,0,66,101,116,97,0,67,99,101,100,105,108,0,67,104,105,0,68,97,103,103,101,114,0,68,101,108,116,97,0,69,84,72,0,69,97,99,117,116,101,0,69,99,105,114,99,0,69,103,114,97,118,101,0,69,112,115,105,108,111,110,0,69,116,97,0,69,117,109,108,0,71,97,109,109,97,0,73,97,99,117,116,101,0,73,99,105,114,99,0,73,103,114,97,118,101,0,73,111,116,97,0,73,117,109,108,0,75,97,112,112,97,0,76,97,109,98,100,97,0,77,117,0,78,116,105,108,100,101,0,78,117,0,79,69,108,105,103,0,79,97,99,117,116,101,0,79,99,105,114,99,0,79,103,114,97,118,101,0,79,109,101,103,97,0,79,109,105,99,114,111,110,0,79,115,108,97,115,104,0,79,116,105,108,100,101,0,79,117,109,108,0,80,104,105,0,80,105,0,80,114,105,109,101,0,80,115,105,0,82,104,111,0,83,99,97,114,111,110,0,83,105,103,109,97,0,84,72,79,82,78,0,84,97,117,0,84,104,101,116,97,0,85,97,99,117,116,101,0,85,99,105,114,99,0,85,103,114,97,118,101,0,85,112,115,105,108,111,110,0,85,117,109,108,0,88,105,0,89,97,99,117,116,101,0,89,117,109,108,0,90,101,116,97,0,97,97,99,117,116,101,0,97,99,105,114,99,0,97,99,117,116,101,0,97,101,108,105,103,0,97,103,114,97,118,101,0,97,108,101,102,115,121,109,0,97,108,112,104,97,0,97,109,112,0,97,110,100,0,97,110,103,0,97,114,105,110,103,0,97,115,121,109,112,0,97,116,105,108,100,101,0,97,117,109,108,0,98,100,113,117,111,0,98,101,116,97,0,98,114,118,98,97,114,0,98,117,108,108,0,99,97,112,0,99,99,101,100,105,108,0,99,101,100,105,108,0,99,101,110,116,0,99,104,105,0,99,105,114,99,0,99,108,117,98,115,0,99,111,110,103,0,99,111,112,121,0,99,114,97,114,114,0,99,117,112,0,99,117,114,114,101,110,0,100,65,114,114,0,100,97,103,103,101,114,0,100,97,114,114,0,100,101,103,0,100,101,108,116,97,0,100,105,97,109,115,0,100,105,118,105,100,101,0,101,97,99,117,116,101,0,101,99,105,114,99,0,101,103,114,97,118,101,0,101,109,112,116,121,0,101,109,115,112,0,101,110,115,112,0,101,112,115,105,108,111,110,0,101,113,117,105,118,0,101,116,97,0,101,116,104,0,101,117,109,108,0,101,117,114,111,0,101,120,105,115,116,0,102,110,111,102,0,102,111,114,97,108,108,0,102,114,97,99,49,50,0,102,114,97,99,49,52,0,102,114,97,99,51,52,0,102,114,97,115,108,0,103,97,109,109,97,0,103,101,0,103,116,0,104,65,114,114,0,104,97,114,114,0,104,101,97,114,116,115,0,104,101,108,108,105,112,0,105,97,99,117,116,101,0,105,99,105,114,99,0,105,101,120,99,108,0,105,103,114,97,118,101,0,105,109,97,103,101,0,105,110,102,105,110,0,105,110,116,0,105,111,116,97,0,105,113,117,101,115,116,0,105,115,105,110,0,105,117,109,108,0,107,97,112,112,97,0,108,65,114,114,0,108,97,109,98,100,97,0,108,97,110,103,0,108,97,113,117,111,0,108,97,114,114,0,108,99,101,105,108,0,108,100,113,117,111,0,108,101,0,108,102,108,111,111,114,0,108,111,119,97,115,116,0,108,111,122,0,108,114,109,0,108,115,97,113,117,111,0,108,115,113,117,111,0,108,116,0,109,97,99,114,0,109,100,97,115,104,0,109,105,99,114,111,0,109,105,100,100,111,116,0,109,117,0,110,97,98,108,97,0,110,98,115,112,0,110,100,97,115,104,0,110,101,0,110,105,0,110,111,116,0,110,111,116,105,110,0,110,115,117,98,0,110,116,105,108,100,101,0,110,117,0,111,97,99,117,116,101,0,111,99,105,114,99,0,111,101,108,105,103,0,111,103,114,97,118,101,0,111,108,105,110,101,0,111,109,101,103,97,0,111,109,105,99,114,111,110,0,111,112,108,117,115,0,111,114,0,111,114,100,102,0,111,114,100,109,0,111,115,108,97,115,104,0,111,116,105,108,100,101,0,111,116,105,109,101,115,0,111,117,109,108,0,112,97,114,97,0,112,97,114,116,0,112,101,114,109,105,108,0,112,101,114,112,0,112,104,105,0,112,105,0,112,105,118,0,112,108,117,115,109,110,0,112,111,117,110,100,0,112,114,105,109,101,0,112,114,111,100,0,112,114,111,112,0,112,115,105,0,113,117,111,116,0,114,65,114,114,0,114,97,100,105,99,0,114,97,110,103,0,114,97,113,117,111,0,114,97,114,114,0,114,99,101,105,108,0,114,100,113,117,111,0,114,101,97,108,0,114,101,103,0,114,102,108,111,111,114,0,114,104,111,0,114,108,109,0,114,115,97,113,117,111,0,114,115,113,117,111,0,115,98,113,117,111,0,115,99,97,114,111,110,0,115,100,111,116,0,115,101,99,116,0,115,104,121,0,115,105,103,109,97,0,115,105,103,109,97,102,0,115,105,109,0,115,112,97,100,101,115,0,115,117,98,0,115,117,98,101,0,115,117,109,0,115,117,112,0,115,117,112,49,0,115,117,112,50,0,115,117,112,51,0,115,117,112,101,0,115,122,108,105,103,0,116,97,117,0,116,104,101,114,101,52,0,116,104,101,116,97,0,116,104,101,116,97,115,121,109,0,116,104,105,110,115,112,0,116,104,111,114,110,0,116,105,108,100,101,0,116,105,109,101,115,0,116,114,97,100,101,0,117,65,114,114,0,117,97,99,117,116,101,0,117,97,114,114,0,117,99,105,114,99,0,117,103,114,97,118,101,0,117,109,108,0,117,112,115,105,104,0,117,112,115,105,108,111,110,0,117,117,109,108,0,119,101,105,101,114,112,0,120,105,0,121,97,99,117,116,101,0,121,101,110,0,121,117,109,108,0,122,101,116,97,0,122,119,106,0,122,119,110,106,0,85,84,70,56,32,99,111,100,101,115,32,62,32,52,32,98,121,116,101,115,32,97,114,101,32,110,111,116,32,99,117,114,114,101,110,116,108,121,32,115,117,112,112,111,114,116,101,100,32,40,103,114,97,112,104,32,37,115,41,32,45,32,116,114,101,97,116,101,100,32,97,115,32,76,97,116,105,110,45,49,46,32,80,101,114,104,97,112,115,32,34,45,71,99,104,97,114,115,101,116,61,108,97,116,105,110,49,34,32,105,115,32,110,101,101,100,101,100,63,10,0,73,110,118,97,108,105,100,32,37,100,45,98,121,116,101,32,85,84,70,56,32,102,111,117,110,100,32,105,110,32,105,110,112,117,116,32,111,102,32,103,114,97,112,104,32,37,115,32,45,32,116,114,101,97,116,101,100,32,97,115,32,76,97,116,105,110,45,49,46,32,80,101,114,104,97,112,115,32,34,45,71,99,104,97,114,115,101,116,61,108,97,116,105,110,49,34,32,105,115,32,110,101,101,100,101,100,63,10,0,98,122,46,115,105,122,101,0,111,118,101,114,108,97,112,95,98,101,122,105,101,114,0,117,114,118,101,100,0,111,109,112,111,117,110,100,0,97,108,115,101,0,105,110,101,0,111,110,101,0,111,0,114,116,104,111,0,111,108,121,108,105,110,101,0,112,108,105,110,101,0,114,117,101,0,101,115,0,85,110,107,110,111,119,110,32,34,115,112,108,105,110,101,115,34,32,118,97,108,117,101,58,32,34,37,115,34,32,45,32,105,103,110,111,114,101,100,10,0,115,112,108,105,110,101,115,0,111,100,98,0,79,114,116,104,111,103,111,110,97,108,32,101,100,103,101,115,32,100,111,32,110,111,116,32,99,117,114,114,101,110,116,108,121,32,104,97,110,100,108,101,32,101,100,103,101,32,108,97,98,101,108,115,46,32,84,114,121,32,117,115,105,110,103,32,120,108,97,98,101,108,115,46,10,0,111,114,116,104,111,32,37,115,32,37,115,10,0,99,104,97,110,105,0,111,114,116,104,111,46,99,0,99,104,97,110,83,101,97,114,99,104,0,99,112,0,37,37,33,80,83,45,65,100,111,98,101,45,50,46,48,10,37,37,37,37,66,111,117,110,100,105,110,103,66,111,120,58,32,40,97,116,101,110,100,41,10,47,112,111,105,110,116,32,123,10,32,32,47,89,32,101,120,99,104,32,100,101,102,10,32,32,47,88,32,101,120,99,104,32,100,101,102,10,32,32,110,101,119,112,97,116,104,10,32,32,88,32,89,32,51,32,48,32,51,54,48,32,97,114,99,32,102,105,108,108,10,125,32,100,101,102,10,47,99,101,108,108,32,123,10,32,32,47,89,32,101,120,99,104,32,100,101,102,10,32,32,47,88,32,101,120,99,104,32,100,101,102,10,32,32,47,121,32,101,120,99,104,32,100,101,102,10,32,32,47,120,32,101,120,99,104,32,100,101,102,10,32,32,110,101,119,112,97,116,104,10,32,32,120,32,121,32,109,111,118,101,116,111,10,32,32,120,32,89,32,108,105,110,101,116,111,10,32,32,88,32,89,32,108,105,110,101,116,111,10,32,32,88,32,121,32,108,105,110,101,116,111,10,32,32,99,108,111,115,101,112,97,116,104,32,115,116,114,111,107,101,10,125,32,100,101,102,10,47,110,111,100,101,32,123,10,32,47,117,32,101,120,99,104,32,100,101,102,10,32,47,114,32,101,120,99,104,32,100,101,102,10,32,47,100,32,101,120,99,104,32,100,101,102,10,32,47,108,32,101,120,99,104,32,100,101,102,10,32,110,101,119,112,97,116,104,32,108,32,100,32,109,111,118,101,116,111,10,32,114,32,100,32,108,105,110,101,116,111,32,114,32,117,32,108,105,110,101,116,111,32,108,32,117,32,108,105,110,101,116,111,10,32,99,108,111,115,101,112,97,116,104,32,102,105,108,108,10,125,32,100,101,102,10,10,0,37,100,32,37,100,32,116,114,97,110,115,108,97,116,101,10,0,48,46,56,32,48,46,56,32,48,46,56,32,115,101,116,114,103,98,99,111,108,111,114,10,0,115,104,111,119,112,97,103,101,10,37,37,37,37,84,114,97,105,108,101,114,10,37,37,37,37,66,111,117,110,100,105,110,103,66,111,120,58,32,37,100,32,37,100,32,37,100,32,37,100,10,0,110,101,119,112,97,116,104,32,37,100,32,37,100,32,109,111,118,101,116,111,10,0,37,100,32,37,100,32,108,105,110,101,116,111,10,0,37,100,32,37,100,32,108,105,110,101,116,111,32,115,116,114,111,107,101,10,0,99,104,97,110,110,101,108,32,37,100,32,40,37,102,44,37,102,41,10,0,32,45,62,10,0,32,32,32,32,32,0,40,40,37,102,44,37,102,41,44,40,37,102,44,37,102,41,41,32,37,115,32,37,115,0,66,95,82,73,71,72,84,0,66,95,68,79,87,78,0,66,95,76,69,70,84,0,66,95,85,80,0,66,95,78,79,68,69,0,115,101,103,0,110,101,120,116,95,115,101,103,0,100,101,99,105,100,101,95,112,111,105,110,116,0,105,110,99,111,109,112,97,114,97,98,108,101,32,115,101,103,109,101,110,116,115,32,33,33,32,45,45,32,65,98,111,114,116,105,110,103,10,0,115,49,45,62,99,111,109,109,95,99,111,111,114,100,61,61,115,50,45,62,99,111,109,109,95,99,111,111,114,100,0,105,115,95,112,97,114,97,108,108,101,108,0,103,114,97,112,104,32,71,32,123,10,0,32,110,111,100,101,91,115,104,97,112,101,61,112,111,105,110,116,93,10,0,32,32,37,100,32,91,112,111,115,61,34,37,100,44,37,100,34,93,10,0,32,32,37,100,32,45,45,32,37,100,91,108,101,110,61,34,37,102,34,93,10,0,125,10,0,99,111,108,111,114,32,37,115,0,37,115,32,105,115,32,110,111,116,32,97,32,107,110,111,119,110,32,99,111,108,111,114,46,10,0,101,114,114,111,114,32,105,110,32,99,111,108,120,108,97,116,101,40,41,10,0,115,111,108,105,100,0,105,110,118,105,115,105,98,108,101,0,98,111,108,100,0,115,101,116,108,105,110,101,119,105,100,116,104,0,102,105,108,108,101,100,0,117,110,102,105,108,108,101,100,0,116,97,112,101,114,101,100,0,103,118,114,101,110,100,101,114,95,115,101,116,95,115,116,121,108,101,58,32,117,110,115,117,112,112,111,114,116,101,100,32,115,116,121,108,101,32,37,115,32,45,32,105,103,110,111,114,105,110,103,10,0,103,118,114,101,110,100,101,114,46,99,0,103,118,114,101,110,100,101,114,95,117,115,101,114,115,104,97,112,101,0,110,97,109,101,0,110,97,109,101,91,48,93,0,98,111,116,104,0,108,97,121,111,117,116,0,76,97,121,111,117,116,32,116,121,112,101,58,32,34,37,115,34,32,110,111,116,32,114,101,99,111,103,110,105,122,101,100,46,32,85,115,101,32,111,110,101,32,111,102,58,37,115,10,0,106,111,98,0,103,118,108,111,97,100,105,109,97,103,101,46,99,0,103,118,108,111,97,100,105,109,97,103,101,0,117,115,0,117,115,45,62,110,97,109,101,0,117,115,45,62,110,97,109,101,91,48,93,0,78,111,32,108,111,97,100,105,109,97,103,101,32,112,108,117,103,105,110,32,102,111,114,32,34,37,115,34,10,0,81,0,76,101,102,116,0,75,80,95,76,101,102,116,0,82,105,103,104,116,0,75,80,95,82,105,103,104,116,0,85,112,0,75,80,95,85,112,0,68,111,119,110,0,75,80,95,68,111,119,110,0,112,108,117,115,0,75,80,95,65,100,100,0,109,105,110,117,115,0,75,80,95,83,117,98,116,114,97,99,116,0,70,0,101,100,103,101,0,116,97,105,108,112,111,114,116,0,104,101,97,100,112,111,114,116,0,107,101,121,0,85,82,76,0,110,111,100,101,0,100,105,103,114,97,112,104,0,103,114,97,112,104,0,115,117,98,103,114,97,112,104,0,95,76,84,88,95,108,105,98,114,97,114,121,0,116,101,120,116,108,97,121,111,117,116,0,111,98,106,112,45,62,108,98,108,0,120,108,97,98,101,108,115,46,99,0,120,108,97,100,106,117,115,116,0,120,108,105,110,116,101,114,115,101,99,116,105,111,110,115,0,108,112,32,33,61,32,99,108,112,0,103,101,116,105,110,116,114,115,120,105,0,111,98,106,112,49,45,62,115,122,46,120,32,61,61,32,48,32,38,38,32,111,98,106,112,49,45,62,115,122,46,121,32,61,61,32,48,0,108,98,108,101,110,99,108,111,115,105,110,103,0,118,112,0,120,108,104,100,120,117,110,108,111,97,100,0,115,105,122,101,61,61,102,114,101,101,100,0,114,101,99,116,46,98,111,117,110,100,97,114,121,91,50,93,32,60,32,73,78,84,95,77,65,88,0,111,98,106,112,108,112,109,107,115,0,114,101,99,116,46,98,111,117,110,100,97,114,121,91,51,93,32,60,32,73,78,84,95,77,65,88,0,111,117,116,32,111,102,32,109,101,109,111,114,121,10,0,35,37,50,120,37,50,120,37,50,120,37,50,120,0,37,108,102,37,108,102,37,108,102,0,47,97,99,99,101,110,116,51,47,49,0,47,97,99,99,101,110,116,51,47,50,0,47,97,99,99,101,110,116,51,47,51,0,47,97,99,99,101,110,116,52,47,49,0,47,97,99,99,101,110,116,52,47,50,0,47,97,99,99,101,110,116,52,47,51,0,47,97,99,99,101,110,116,52,47,52,0,47,97,99,99,101,110,116,53,47,49,0,47,97,99,99,101,110,116,53,47,50,0,47,97,99,99,101,110,116,53,47,51,0,47,97,99,99,101,110,116,53,47,52,0,47,97,99,99,101,110,116,53,47,53,0,47,97,99,99,101,110,116,54,47,49,0,47,97,99,99,101,110,116,54,47,50,0,47,97,99,99,101,110,116,54,47,51,0,47,97,99,99,101,110,116,54,47,52,0,47,97,99,99,101,110,116,54,47,53,0,47,97,99,99,101,110,116,54,47,54,0,47,97,99,99,101,110,116,55,47,49,0,47,97,99,99,101,110,116,55,47,50,0,47,97,99,99,101,110,116,55,47,51,0,47,97,99,99,101,110,116,55,47,52,0,47,97,99,99,101,110,116,55,47,53,0,47,97,99,99,101,110,116,55,47,54,0,47,97,99,99,101,110,116,55,47,55,0,47,97,99,99,101,110,116,56,47,49,0,47,97,99,99,101,110,116,56,47,50,0,47,97,99,99,101,110,116,56,47,51,0,47,97,99,99,101,110,116,56,47,52,0,47,97,99,99,101,110,116,56,47,53,0,47,97,99,99,101,110,116,56,47,54,0,47,97,99,99,101,110,116,56,47,55,0,47,97,99,99,101,110,116,56,47,56,0,47,98,108,117,101,115,51,47,49,0,47,98,108,117,101,115,51,47,50,0,47,98,108,117,101,115,51,47,51,0,47,98,108,117,101,115,52,47,49,0,47,98,108,117,101,115,52,47,50,0,47,98,108,117,101,115,52,47,51,0,47,98,108,117,101,115,52,47,52,0,47,98,108,117,101,115,53,47,49,0,47,98,108,117,101,115,53,47,50,0,47,98,108,117,101,115,53,47,51,0,47,98,108,117,101,115,53,47,52,0,47,98,108,117,101,115,53,47,53,0,47,98,108,117,101,115,54,47,49,0,47,98,108,117,101,115,54,47,50,0,47,98,108,117,101,115,54,47,51,0,47,98,108,117,101,115,54,47,52,0,47,98,108,117,101,115,54,47,53,0,47,98,108,117,101,115,54,47,54,0,47,98,108,117,101,115,55,47,49,0,47,98,108,117,101,115,55,47,50,0,47,98,108,117,101,115,55,47,51,0,47,98,108,117,101,115,55,47,52,0,47,98,108,117,101,115,55,47,53],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+102424);allocate([0,47,98,108,117,101,115,55,47,54,0,47,98,108,117,101,115,55,47,55,0,47,98,108,117,101,115,56,47,49,0,47,98,108,117,101,115,56,47,50,0,47,98,108,117,101,115,56,47,51,0,47,98,108,117,101,115,56,47,52,0,47,98,108,117,101,115,56,47,53,0,47,98,108,117,101,115,56,47,54,0,47,98,108,117,101,115,56,47,55,0,47,98,108,117,101,115,56,47,56,0,47,98,108,117,101,115,57,47,49,0,47,98,108,117,101,115,57,47,50,0,47,98,108,117,101,115,57,47,51,0,47,98,108,117,101,115,57,47,52,0,47,98,108,117,101,115,57,47,53,0,47,98,108,117,101,115,57,47,54,0,47,98,108,117,101,115,57,47,55,0,47,98,108,117,101,115,57,47,56,0,47,98,108,117,101,115,57,47,57,0,47,98,114,98,103,49,48,47,49,0,47,98,114,98,103,49,48,47,49,48,0,47,98,114,98,103,49,48,47,50,0,47,98,114,98,103,49,48,47,51,0,47,98,114,98,103,49,48,47,52,0,47,98,114,98,103,49,48,47,53,0,47,98,114,98,103,49,48,47,54,0,47,98,114,98,103,49,48,47,55,0,47,98,114,98,103,49,48,47,56,0,47,98,114,98,103,49,48,47,57,0,47,98,114,98,103,49,49,47,49,0,47,98,114,98,103,49,49,47,49,48,0,47,98,114,98,103,49,49,47,49,49,0,47,98,114,98,103,49,49,47,50,0,47,98,114,98,103,49,49,47,51,0,47,98,114,98,103,49,49,47,52,0,47,98,114,98,103,49,49,47,53,0,47,98,114,98,103,49,49,47,54,0,47,98,114,98,103,49,49,47,55,0,47,98,114,98,103,49,49,47,56,0,47,98,114,98,103,49,49,47,57,0,47,98,114,98,103,51,47,49,0,47,98,114,98,103,51,47,50,0,47,98,114,98,103,51,47,51,0,47,98,114,98,103,52,47,49,0,47,98,114,98,103,52,47,50,0,47,98,114,98,103,52,47,51,0,47,98,114,98,103,52,47,52,0,47,98,114,98,103,53,47,49,0,47,98,114,98,103,53,47,50,0,47,98,114,98,103,53,47,51,0,47,98,114,98,103,53,47,52,0,47,98,114,98,103,53,47,53,0,47,98,114,98,103,54,47,49,0,47,98,114,98,103,54,47,50,0,47,98,114,98,103,54,47,51,0,47,98,114,98,103,54,47,52,0,47,98,114,98,103,54,47,53,0,47,98,114,98,103,54,47,54,0,47,98,114,98,103,55,47,49,0,47,98,114,98,103,55,47,50,0,47,98,114,98,103,55,47,51,0,47,98,114,98,103,55,47,52,0,47,98,114,98,103,55,47,53,0,47,98,114,98,103,55,47,54,0,47,98,114,98,103,55,47,55,0,47,98,114,98,103,56,47,49,0,47,98,114,98,103,56,47,50,0,47,98,114,98,103,56,47,51,0,47,98,114,98,103,56,47,52,0,47,98,114,98,103,56,47,53,0,47,98,114,98,103,56,47,54,0,47,98,114,98,103,56,47,55,0,47,98,114,98,103,56,47,56,0,47,98,114,98,103,57,47,49,0,47,98,114,98,103,57,47,50,0,47,98,114,98,103,57,47,51,0,47,98,114,98,103,57,47,52,0,47,98,114,98,103,57,47,53,0,47,98,114,98,103,57,47,54,0,47,98,114,98,103,57,47,55,0,47,98,114,98,103,57,47,56,0,47,98,114,98,103,57,47,57,0,47,98,117,103,110,51,47,49,0,47,98,117,103,110,51,47,50,0,47,98,117,103,110,51,47,51,0,47,98,117,103,110,52,47,49,0,47,98,117,103,110,52,47,50,0,47,98,117,103,110,52,47,51,0,47,98,117,103,110,52,47,52,0,47,98,117,103,110,53,47,49,0,47,98,117,103,110,53,47,50,0,47,98,117,103,110,53,47,51,0,47,98,117,103,110,53,47,52,0,47,98,117,103,110,53,47,53,0,47,98,117,103,110,54,47,49,0,47,98,117,103,110,54,47,50,0,47,98,117,103,110,54,47,51,0,47,98,117,103,110,54,47,52,0,47,98,117,103,110,54,47,53,0,47,98,117,103,110,54,47,54,0,47,98,117,103,110,55,47,49,0,47,98,117,103,110,55,47,50,0,47,98,117,103,110,55,47,51,0,47,98,117,103,110,55,47,52,0,47,98,117,103,110,55,47,53,0,47,98,117,103,110,55,47,54,0,47,98,117,103,110,55,47,55,0,47,98,117,103,110,56,47,49,0,47,98,117,103,110,56,47,50,0,47,98,117,103,110,56,47,51,0,47,98,117,103,110,56,47,52,0,47,98,117,103,110,56,47,53,0,47,98,117,103,110,56,47,54,0,47,98,117,103,110,56,47,55,0,47,98,117,103,110,56,47,56,0,47,98,117,103,110,57,47,49,0,47,98,117,103,110,57,47,50,0,47,98,117,103,110,57,47,51,0,47,98,117,103,110,57,47,52,0,47,98,117,103,110,57,47,53,0,47,98,117,103,110,57,47,54,0,47,98,117,103,110,57,47,55,0,47,98,117,103,110,57,47,56,0,47,98,117,103,110,57,47,57,0,47,98,117,112,117,51,47,49,0,47,98,117,112,117,51,47,50,0,47,98,117,112,117,51,47,51,0,47,98,117,112,117,52,47,49,0,47,98,117,112,117,52,47,50,0,47,98,117,112,117,52,47,51,0,47,98,117,112,117,52,47,52,0,47,98,117,112,117,53,47,49,0,47,98,117,112,117,53,47,50,0,47,98,117,112,117,53,47,51,0,47,98,117,112,117,53,47,52,0,47,98,117,112,117,53,47,53,0,47,98,117,112,117,54,47,49,0,47,98,117,112,117,54,47,50,0,47,98,117,112,117,54,47,51,0,47,98,117,112,117,54,47,52,0,47,98,117,112,117,54,47,53,0,47,98,117,112,117,54,47,54,0,47,98,117,112,117,55,47,49,0,47,98,117,112,117,55,47,50,0,47,98,117,112,117,55,47,51,0,47,98,117,112,117,55,47,52,0,47,98,117,112,117,55,47,53,0,47,98,117,112,117,55,47,54,0,47,98,117,112,117,55,47,55,0,47,98,117,112,117,56,47,49,0,47,98,117,112,117,56,47,50,0,47,98,117,112,117,56,47,51,0,47,98,117,112,117,56,47,52,0,47,98,117,112,117,56,47,53,0,47,98,117,112,117,56,47,54,0,47,98,117,112,117,56,47,55,0,47,98,117,112,117,56,47,56,0,47,98,117,112,117,57,47,49,0,47,98,117,112,117,57,47,50,0,47,98,117,112,117,57,47,51,0,47,98,117,112,117,57,47,52,0,47,98,117,112,117,57,47,53,0,47,98,117,112,117,57,47,54,0,47,98,117,112,117,57,47,55,0,47,98,117,112,117,57,47,56,0,47,98,117,112,117,57,47,57,0,47,100,97,114,107,50,51,47,49,0,47,100,97,114,107,50,51,47,50,0,47,100,97,114,107,50,51,47,51,0,47,100,97,114,107,50,52,47,49,0,47,100,97,114,107,50,52,47,50,0,47,100,97,114,107,50,52,47,51,0,47,100,97,114,107,50,52,47,52,0,47,100,97,114,107,50,53,47,49,0,47,100,97,114,107,50,53,47,50,0,47,100,97,114,107,50,53,47,51,0,47,100,97,114,107,50,53,47,52,0,47,100,97,114,107,50,53,47,53,0,47,100,97,114,107,50,54,47,49,0,47,100,97,114,107,50,54,47,50,0,47,100,97,114,107,50,54,47,51,0,47,100,97,114,107,50,54,47,52,0,47,100,97,114,107,50,54,47,53,0,47,100,97,114,107,50,54,47,54,0,47,100,97,114,107,50,55,47,49,0,47,100,97,114,107,50,55,47,50,0,47,100,97,114,107,50,55,47,51,0,47,100,97,114,107,50,55,47,52,0,47,100,97,114,107,50,55,47,53,0,47,100,97,114,107,50,55,47,54,0,47,100,97,114,107,50,55,47,55,0,47,100,97,114,107,50,56,47,49,0,47,100,97,114,107,50,56,47,50,0,47,100,97,114,107,50,56,47,51,0,47,100,97,114,107,50,56,47,52,0,47,100,97,114,107,50,56,47,53,0,47,100,97,114,107,50,56,47,54,0,47,100,97,114,107,50,56,47,55,0,47,100,97,114,107,50,56,47,56,0,47,103,110,98,117,51,47,49,0,47,103,110,98,117,51,47,50,0,47,103,110,98,117,51,47,51,0,47,103,110,98,117,52,47,49,0,47,103,110,98,117,52,47,50,0,47,103,110,98,117,52,47,51,0,47,103,110,98,117,52,47,52,0,47,103,110,98,117,53,47,49,0,47,103,110,98,117,53,47,50,0,47,103,110,98,117,53,47,51,0,47,103,110,98,117,53,47,52,0,47,103,110,98,117,53,47,53,0,47,103,110,98,117,54,47,49,0,47,103,110,98,117,54,47,50,0,47,103,110,98,117,54,47,51,0,47,103,110,98,117,54,47,52,0,47,103,110,98,117,54,47,53,0,47,103,110,98,117,54,47,54,0,47,103,110,98,117,55,47,49,0,47,103,110,98,117,55,47,50,0,47,103,110,98,117,55,47,51,0,47,103,110,98,117,55,47,52,0,47,103,110,98,117,55,47,53,0,47,103,110,98,117,55,47,54,0,47,103,110,98,117,55,47,55,0,47,103,110,98,117,56,47,49,0,47,103,110,98,117,56,47,50,0,47,103,110,98,117,56,47,51,0,47,103,110,98,117,56,47,52,0,47,103,110,98,117,56,47,53,0,47,103,110,98,117,56,47,54,0,47,103,110,98,117,56,47,55,0,47,103,110,98,117,56,47,56,0,47,103,110,98,117,57,47,49,0,47,103,110,98,117,57,47,50,0,47,103,110,98,117,57,47,51,0,47,103,110,98,117,57,47,52,0,47,103,110,98,117,57,47,53,0,47,103,110,98,117,57,47,54,0,47,103,110,98,117,57,47,55,0,47,103,110,98,117,57,47,56,0,47,103,110,98,117,57,47,57,0,47,103,114,101,101,110,115,51,47,49,0,47,103,114,101,101,110,115,51,47,50,0,47,103,114,101,101,110,115,51,47,51,0,47,103,114,101,101,110,115,52,47,49,0,47,103,114,101,101,110,115,52,47,50,0,47,103,114,101,101,110,115,52,47,51,0,47,103,114,101,101,110,115,52,47,52,0,47,103,114,101,101,110,115,53,47,49,0,47,103,114,101,101,110,115,53,47,50,0,47,103,114,101,101,110,115,53,47,51,0,47,103,114,101,101,110,115,53,47,52,0,47,103,114,101,101,110,115,53,47,53,0,47,103,114,101,101,110,115,54,47,49,0,47,103,114,101,101,110,115,54,47,50,0,47,103,114,101,101,110,115,54,47,51,0,47,103,114,101,101,110,115,54,47,52,0,47,103,114,101,101,110,115,54,47,53,0,47,103,114,101,101,110,115,54,47,54,0,47,103,114,101,101,110,115,55,47,49,0,47,103,114,101,101,110,115,55,47,50,0,47,103,114,101,101,110,115,55,47,51,0,47,103,114,101,101,110,115,55,47,52,0,47,103,114,101,101,110,115,55,47,53,0,47,103,114,101,101,110,115,55,47,54,0,47,103,114,101,101,110,115,55,47,55,0,47,103,114,101,101,110,115,56,47,49,0,47,103,114,101,101,110,115,56,47,50,0,47,103,114,101,101,110,115,56,47,51,0,47,103,114,101,101,110,115,56,47,52,0,47,103,114,101,101,110,115,56,47,53,0,47,103,114,101,101,110,115,56,47,54,0,47,103,114,101,101,110,115,56,47,55,0,47,103,114,101,101,110,115,56,47,56,0,47,103,114,101,101,110,115,57,47,49,0,47,103,114,101,101,110,115,57,47,50,0,47,103,114,101,101,110,115,57,47,51,0,47,103,114,101,101,110,115,57,47,52,0,47,103,114,101,101,110,115,57,47,53,0,47,103,114,101,101,110,115,57,47,54,0,47,103,114,101,101,110,115,57,47,55,0,47,103,114,101,101,110,115,57,47,56,0,47,103,114,101,101,110,115,57,47,57,0,47,103,114,101,121,115,51,47,49,0,47,103,114,101,121,115,51,47,50,0,47,103,114,101,121,115,51,47,51,0,47,103,114,101,121,115,52,47,49,0,47,103,114,101,121,115,52,47,50,0,47,103,114,101,121,115,52,47,51,0,47,103,114,101,121,115,52,47,52,0,47,103,114,101,121,115,53,47,49,0,47,103,114,101,121,115,53,47,50,0,47,103,114,101,121,115,53,47,51,0,47,103,114,101,121,115,53,47,52,0,47,103,114,101,121,115,53,47,53,0,47,103,114,101,121,115,54,47,49,0,47,103,114,101,121,115,54,47,50,0,47,103,114,101,121,115,54,47,51,0,47,103,114,101,121,115,54,47,52,0,47,103,114,101,121,115,54,47,53,0,47,103,114,101,121,115,54,47,54,0,47,103,114,101,121,115,55,47,49,0,47,103,114,101,121,115,55,47,50,0,47,103,114,101,121,115,55,47,51,0,47,103,114,101,121,115,55,47,52,0,47,103,114,101,121,115,55,47,53,0,47,103,114,101,121,115,55,47,54,0,47,103,114,101,121,115,55,47,55,0,47,103,114,101,121,115,56,47,49,0,47,103,114,101,121,115,56,47,50,0,47,103,114,101,121,115,56,47,51,0,47,103,114,101,121,115,56,47,52,0,47,103,114,101,121,115,56,47,53,0,47,103,114,101,121,115,56,47,54,0,47,103,114,101,121,115,56,47,55,0,47,103,114,101,121,115,56,47,56,0,47,103,114,101,121,115,57,47,49,0,47,103,114,101,121,115,57,47,50,0,47,103,114,101,121,115,57,47,51,0,47,103,114,101,121,115,57,47,52,0,47,103,114,101,121,115,57,47,53,0,47,103,114,101,121,115,57,47,54,0,47,103,114,101,121,115,57,47,55,0,47,103,114,101,121,115,57,47,56,0,47,103,114,101,121,115,57,47,57,0,47,111,114,97,110,103,101,115,51,47,49,0,47,111,114,97,110,103,101,115,51,47,50,0,47,111,114,97,110,103,101,115,51,47,51,0,47,111,114,97,110,103,101,115,52,47,49,0,47,111,114,97,110,103,101,115,52,47,50,0,47,111,114,97,110,103,101,115,52,47,51,0,47,111,114,97,110,103,101,115,52,47,52,0,47,111,114,97,110,103,101,115,53,47,49,0,47,111,114,97,110,103,101,115,53,47,50,0,47,111,114,97,110,103,101,115,53,47,51,0,47,111,114,97,110,103,101,115,53,47,52,0,47,111,114,97,110,103,101,115,53,47,53,0,47,111,114,97,110,103,101,115,54,47,49,0,47,111,114,97,110,103,101,115,54,47,50,0,47,111,114,97,110,103,101,115,54,47,51,0,47,111,114,97,110,103,101,115,54,47,52,0,47,111,114,97,110,103,101,115,54,47,53,0,47,111,114,97,110,103,101,115,54,47,54,0,47,111,114,97,110,103,101,115,55,47,49,0,47,111,114,97,110,103,101,115,55,47,50,0,47,111,114,97,110,103,101,115,55,47,51,0,47,111,114,97,110,103,101,115,55,47,52,0,47,111,114,97,110,103,101,115,55,47,53,0,47,111,114,97,110,103,101,115,55,47,54,0,47,111,114,97,110,103,101,115,55,47,55,0,47,111,114,97,110,103,101,115,56,47,49,0,47,111,114,97,110,103,101,115,56,47,50,0,47,111,114,97,110,103,101,115,56,47,51,0,47,111,114,97,110,103,101,115,56,47,52,0,47,111,114,97,110,103,101,115,56,47,53,0,47,111,114,97,110,103,101,115,56,47,54,0,47,111,114,97,110,103,101,115,56,47,55,0,47,111,114,97,110,103,101,115,56,47,56,0,47,111,114,97,110,103,101,115,57,47,49,0,47,111,114,97,110,103,101,115,57,47,50,0,47,111,114,97,110,103,101,115,57,47,51,0,47,111,114,97,110,103,101,115,57,47,52,0,47,111,114,97,110,103,101,115,57,47,53,0,47,111,114,97,110,103,101,115,57,47,54,0,47,111,114,97,110,103,101,115,57,47,55,0,47,111,114,97,110,103,101,115,57,47,56,0,47,111,114,97,110,103,101,115,57,47,57,0,47,111,114,114,100,51,47,49,0,47,111,114,114,100,51,47,50,0,47,111,114,114,100,51,47,51,0,47,111,114,114,100,52,47,49,0,47,111,114,114,100,52,47,50,0,47,111,114,114,100,52,47,51,0,47,111,114,114,100,52,47,52,0,47,111,114,114,100,53,47,49,0,47,111,114,114,100,53,47,50,0,47,111,114,114,100,53,47,51,0,47,111,114,114,100,53,47,52,0,47,111,114,114,100,53,47,53,0,47,111,114,114,100,54,47,49,0,47,111,114,114,100,54,47,50,0,47,111,114,114,100,54,47,51,0,47,111,114,114,100,54,47,52,0,47,111,114,114,100,54,47,53,0,47,111,114,114,100,54,47,54,0,47,111,114,114,100,55,47,49,0,47,111,114,114,100,55,47,50,0,47,111,114,114,100,55,47,51,0,47,111,114,114,100,55,47,52,0,47,111,114,114,100,55,47,53,0,47,111,114,114,100,55,47,54,0,47,111,114,114,100,55,47,55,0,47,111,114,114,100,56,47,49,0,47,111,114,114,100,56,47,50,0,47,111,114,114,100,56,47,51,0,47,111,114,114,100,56,47,52,0,47,111,114,114,100,56,47,53,0,47,111,114,114,100,56,47,54,0,47,111,114,114,100,56,47,55,0,47,111,114,114,100,56,47,56,0,47,111,114,114,100,57,47,49,0,47,111,114,114,100,57,47,50,0,47,111,114,114,100,57,47,51,0,47,111,114,114,100,57,47,52,0,47,111,114,114,100,57,47,53,0,47,111,114,114,100,57,47,54,0,47,111,114,114,100,57,47,55,0,47,111,114,114,100,57,47,56,0,47,111,114,114,100,57,47,57,0,47,112,97,105,114,101,100,49,48,47,49,0,47,112,97,105,114,101,100,49,48,47,49,48,0,47,112,97,105,114,101,100,49,48,47,50,0,47,112,97,105,114,101,100,49,48,47,51,0,47,112,97,105,114,101,100,49,48,47,52,0,47,112,97,105,114,101,100,49,48,47,53,0,47,112,97,105,114,101,100,49,48,47,54,0,47,112,97,105,114,101,100,49,48,47,55,0,47,112,97,105,114,101,100,49,48,47,56,0,47,112,97,105,114,101,100,49,48,47,57,0,47,112,97,105,114,101,100,49,49,47,49,0,47,112,97,105,114,101,100,49,49,47,49,48,0,47,112,97,105,114,101,100,49,49,47,49,49,0,47,112,97,105,114,101,100,49,49,47,50,0,47,112,97,105,114,101,100,49,49,47,51,0,47,112,97,105,114,101,100,49,49,47,52,0,47,112,97,105,114,101,100,49,49,47,53,0,47,112,97,105,114,101,100,49,49,47,54,0,47,112,97,105,114,101,100,49,49,47,55,0,47,112,97,105,114,101,100,49,49,47,56,0,47,112,97,105,114,101,100,49,49,47,57,0,47,112,97,105,114,101,100,49,50,47,49,0,47,112,97,105,114,101,100,49,50,47,49,48,0,47,112,97,105,114,101,100,49,50,47,49,49,0,47,112,97,105,114,101,100,49,50,47,49,50,0,47,112,97,105,114,101,100,49,50,47,50,0,47,112,97,105,114,101,100,49,50,47,51,0,47,112,97,105,114,101,100,49,50,47,52,0,47,112,97,105,114,101,100,49,50,47,53,0,47,112,97,105,114,101,100,49,50,47,54,0,47,112,97,105,114,101,100,49,50,47,55,0,47,112,97,105,114,101,100,49,50,47,56,0,47,112,97,105,114,101,100,49,50,47,57,0,47,112,97,105,114,101,100,51,47,49,0,47,112,97,105,114,101,100,51,47,50,0,47,112,97,105,114,101,100,51,47,51,0,47,112,97,105,114,101,100,52,47,49,0,47,112,97,105,114,101,100,52,47,50,0,47,112,97,105,114,101,100,52,47,51,0,47,112,97,105,114,101,100,52,47,52,0,47,112,97,105,114,101,100,53,47,49,0,47,112,97,105,114,101,100,53,47,50,0,47,112,97,105,114,101,100,53,47,51,0,47,112,97,105,114,101,100,53,47,52,0,47,112,97,105,114,101,100,53,47,53,0,47,112,97,105,114,101,100,54,47,49,0,47,112,97,105,114,101,100,54,47,50,0,47,112,97,105,114,101,100,54,47,51,0,47,112,97,105,114,101,100,54,47,52,0,47,112,97,105,114,101,100,54,47,53,0,47,112,97,105,114,101,100,54,47,54,0,47,112,97,105,114,101,100,55,47,49,0,47,112,97,105,114,101,100,55,47,50,0,47,112,97,105,114,101,100,55,47,51,0,47,112,97,105,114,101,100,55,47,52,0,47,112,97,105,114,101,100,55,47,53,0,47,112,97,105,114,101,100,55,47,54,0,47,112,97,105,114,101,100,55,47,55,0,47,112,97,105,114,101,100,56,47,49,0,47,112,97,105,114,101,100,56,47,50,0,47,112,97,105,114,101,100,56,47,51,0,47,112,97,105,114,101,100,56,47,52,0,47,112,97,105,114,101,100,56,47,53,0,47,112,97,105,114,101,100,56,47,54,0,47,112,97,105,114,101,100,56,47,55,0,47,112,97,105,114,101,100,56,47,56,0,47,112,97,105,114,101,100,57,47,49,0,47,112,97,105,114,101,100,57,47,50,0,47,112,97,105,114,101,100,57,47,51,0,47,112,97,105,114,101,100,57,47,52,0,47,112,97,105,114,101,100,57,47,53,0,47,112,97,105,114,101,100,57,47,54,0,47,112,97,105,114,101,100,57,47,55,0,47,112,97,105,114,101,100,57,47,56,0,47,112,97,105,114,101,100,57,47,57,0,47,112,97,115,116,101,108,49,51,47,49,0,47,112,97,115,116,101,108,49,51,47,50,0,47,112,97,115,116,101,108,49,51,47,51,0,47,112,97,115,116,101,108,49,52,47,49,0,47,112,97,115,116,101,108,49,52,47,50,0,47,112,97,115,116,101,108,49,52,47,51,0,47,112,97,115,116,101,108,49,52,47,52,0,47,112,97,115,116,101,108,49,53,47,49,0,47,112,97,115,116,101,108,49,53,47,50,0,47,112,97,115,116,101,108,49,53,47,51,0,47,112,97,115,116,101,108,49,53,47,52,0,47,112,97,115,116,101,108,49,53,47,53,0,47,112,97,115,116,101,108,49,54,47,49,0,47,112,97,115,116,101,108,49,54,47,50,0,47,112,97,115,116,101,108,49,54,47,51,0,47,112,97,115,116,101,108,49,54,47,52,0,47,112,97,115,116,101,108,49,54,47,53,0,47,112,97,115,116,101,108,49,54,47,54,0,47,112,97,115,116,101,108,49,55,47,49,0,47,112,97,115,116,101,108,49,55,47,50,0,47,112,97,115,116,101,108,49,55,47,51,0,47,112,97,115,116,101,108,49,55,47,52,0,47,112,97,115,116,101,108,49,55,47,53,0,47,112,97,115,116,101,108,49,55,47,54,0,47,112,97,115,116,101,108,49,55,47,55,0,47,112,97,115,116,101,108,49,56,47,49,0,47,112,97,115,116,101,108,49,56,47,50,0,47,112,97,115,116,101,108,49,56,47,51,0,47,112,97,115,116,101,108,49,56,47,52,0,47,112,97,115,116,101,108,49,56,47,53,0,47,112,97,115,116,101,108,49,56,47,54,0,47,112,97,115,116,101,108,49,56,47,55,0,47,112,97,115,116,101,108,49,56,47,56,0,47,112,97,115,116,101,108,49,57,47,49,0,47,112,97,115,116,101,108,49,57,47,50,0,47,112,97,115,116,101,108,49,57,47,51,0,47,112,97,115,116,101,108,49,57,47,52,0,47,112,97,115,116,101,108,49,57,47,53,0,47,112,97,115,116,101,108,49,57,47,54,0,47,112,97,115,116,101,108,49,57,47,55,0,47,112,97,115,116,101,108,49,57,47,56,0,47,112,97,115,116,101,108,49,57,47,57,0,47,112,97,115,116,101,108,50,51,47,49,0,47,112,97,115,116,101,108,50,51,47,50,0,47,112,97,115,116,101,108,50,51,47,51,0,47,112,97,115,116,101,108,50,52,47,49,0,47,112,97,115,116,101,108,50,52,47,50,0,47,112,97,115,116,101,108,50,52,47,51,0,47,112,97,115,116,101,108,50,52,47,52,0,47,112,97,115,116,101,108,50,53,47,49,0,47,112,97,115,116,101,108,50,53,47,50,0,47,112,97,115,116,101,108,50,53,47,51,0,47,112,97,115,116,101,108,50,53,47,52,0,47,112,97,115,116,101,108,50,53,47,53,0,47,112,97,115,116,101,108,50,54,47,49,0,47,112,97,115,116,101,108,50,54,47,50,0,47,112,97,115,116,101,108,50,54,47,51,0,47,112,97,115,116,101,108,50,54,47,52,0,47,112,97,115,116,101,108,50,54,47,53,0,47,112,97,115,116,101,108,50,54,47,54,0,47,112,97,115,116,101,108,50,55,47,49,0,47,112,97,115,116,101,108,50,55,47,50,0,47,112,97,115,116,101,108,50,55,47,51,0,47,112,97,115,116,101,108,50,55,47,52,0,47,112,97,115,116,101,108,50,55,47,53,0,47,112,97,115,116,101,108,50,55,47,54,0,47,112,97,115,116,101,108,50,55,47,55,0,47,112,97,115,116,101,108,50,56,47,49,0,47,112,97,115,116,101,108,50,56,47,50,0,47,112,97,115,116,101,108,50,56,47,51,0,47,112,97,115,116,101,108,50,56,47,52,0,47,112,97,115,116,101,108,50,56,47,53,0,47,112,97,115,116,101,108,50,56,47,54,0,47,112,97,115,116,101,108,50,56,47,55,0,47,112,97,115,116,101,108,50,56,47,56,0,47,112,105,121,103,49,48,47,49,0,47,112,105,121,103,49,48,47,49,48,0,47,112,105,121,103,49,48,47,50,0,47,112,105,121,103,49,48,47,51,0,47,112,105,121,103,49,48,47,52,0,47,112,105,121,103,49,48,47,53,0,47,112,105,121,103,49,48,47,54,0,47,112,105,121,103,49,48,47,55,0,47,112,105,121,103,49,48,47,56,0,47,112,105,121,103,49,48,47,57,0,47,112,105,121,103,49,49,47,49,0,47,112,105,121,103,49,49,47,49,48,0,47,112,105,121,103,49,49,47,49,49,0,47,112,105,121,103,49,49,47,50,0,47,112,105,121,103,49,49,47,51,0,47,112,105,121,103,49,49,47,52,0,47,112,105,121,103,49,49,47,53,0,47,112,105,121,103,49,49,47,54,0,47,112,105,121,103,49,49,47,55,0,47,112,105,121,103,49,49,47,56,0,47,112,105,121,103,49,49,47,57,0,47,112,105,121,103,51,47,49,0,47,112,105,121,103,51,47,50,0,47,112,105,121,103,51,47,51,0,47,112,105,121,103,52,47,49,0,47,112,105,121,103,52,47,50,0,47,112,105,121,103,52,47,51,0,47,112,105,121,103,52,47,52,0,47,112,105,121,103,53,47,49,0,47,112,105,121,103,53,47,50,0,47,112,105,121,103,53,47,51,0,47,112,105,121,103,53,47,52,0,47,112,105,121,103,53,47,53,0,47,112,105,121,103,54,47,49,0,47,112,105,121,103,54,47,50,0,47,112,105,121,103,54,47,51,0,47,112,105,121,103,54,47,52,0,47,112,105,121,103,54,47,53,0,47,112,105,121,103,54,47,54,0,47,112,105,121,103,55,47,49,0,47,112,105,121,103,55,47,50,0,47,112,105,121,103,55,47,51,0,47,112,105,121,103,55,47,52,0,47,112,105,121,103,55,47,53,0,47,112,105,121,103,55,47,54,0,47,112,105,121,103,55,47,55,0,47,112,105,121,103,56,47,49,0,47,112,105,121,103,56,47,50,0,47,112,105,121,103,56,47,51,0,47,112,105,121,103,56,47,52,0,47,112,105,121,103,56,47,53,0,47,112,105,121,103,56,47,54,0,47,112,105,121,103,56,47,55,0,47,112,105,121,103,56,47,56,0,47,112,105,121,103,57,47,49,0,47,112,105,121,103,57,47,50,0,47,112,105,121,103,57,47,51,0,47,112,105,121,103,57,47,52,0,47,112,105,121,103,57,47,53,0,47,112,105,121,103,57,47,54,0,47,112,105,121,103,57,47,55,0,47,112,105,121,103,57,47,56,0,47,112,105,121,103,57,47,57,0,47,112,114,103,110,49,48,47,49,0,47,112,114,103,110,49,48,47,49,48,0,47,112,114,103,110,49,48,47,50,0,47,112,114,103,110,49,48,47,51,0,47,112,114,103,110,49,48,47,52,0,47,112,114,103,110,49,48,47,53,0,47,112,114,103,110,49,48,47,54,0,47,112,114,103,110,49,48,47,55,0,47,112,114,103,110,49,48,47,56,0,47,112,114,103,110,49,48,47,57,0,47,112,114,103,110,49,49,47,49,0,47,112,114,103,110,49,49,47,49,48,0,47,112,114,103,110,49,49,47,49,49,0,47,112,114,103,110,49,49,47,50,0,47,112,114,103,110,49,49,47,51,0,47,112,114,103,110,49,49,47,52,0,47,112,114,103,110,49,49,47,53,0,47,112,114,103,110,49,49,47,54,0,47,112,114,103,110,49,49,47,55,0,47,112,114,103,110,49,49,47,56,0,47,112,114,103,110,49,49,47,57,0,47,112,114,103,110,51,47,49,0,47,112,114,103,110,51,47,50,0,47,112,114,103,110,51,47,51,0,47,112,114,103,110,52,47,49,0,47,112,114,103,110,52,47,50,0,47,112,114,103,110,52,47,51,0,47,112,114,103,110,52,47,52,0,47,112,114,103,110,53,47,49,0,47,112,114,103,110,53,47,50,0,47,112,114,103,110,53,47,51,0,47,112,114,103,110,53,47,52,0,47,112,114,103,110,53,47,53,0,47,112,114,103,110,54,47,49,0,47,112,114,103,110,54,47,50,0,47,112,114,103,110,54,47,51,0,47,112,114,103,110,54,47,52,0,47,112,114,103,110,54,47,53,0,47,112,114,103,110,54,47,54,0,47,112,114,103,110,55,47,49,0,47,112,114,103,110,55,47,50,0,47,112,114,103,110,55,47,51,0,47,112,114,103,110,55,47,52,0,47,112,114,103,110,55,47,53,0,47,112,114,103,110,55,47,54,0,47,112,114,103,110,55,47,55,0,47,112,114,103,110,56,47,49,0,47,112,114,103,110,56,47,50,0,47,112,114,103,110,56,47,51,0,47,112,114,103,110,56,47,52,0,47,112,114,103,110,56,47,53,0,47,112,114,103,110,56,47,54,0,47,112,114,103,110,56,47,55,0,47,112,114,103,110,56,47,56,0,47,112,114,103,110,57,47,49,0,47,112,114,103,110,57,47,50,0,47,112,114,103,110,57,47,51,0,47,112,114,103,110,57,47,52,0,47,112,114,103,110,57,47,53,0,47,112,114,103,110,57,47,54,0,47,112,114,103,110,57,47,55,0,47,112,114,103,110,57,47,56,0,47,112,114,103,110,57,47,57,0,47,112,117,98,117,51,47,49,0,47,112,117,98,117,51,47,50,0,47,112,117,98,117,51,47,51,0,47,112,117,98,117,52,47,49,0,47,112,117,98,117,52,47,50,0,47,112,117,98,117,52,47,51,0,47,112,117,98,117,52,47,52,0,47,112,117,98,117,53,47,49,0,47,112,117,98,117,53,47,50,0,47,112,117,98,117,53,47,51,0,47,112,117,98,117,53,47,52,0,47,112,117,98,117,53,47,53,0,47,112,117,98,117,54,47,49,0,47,112,117,98,117,54,47,50,0,47,112,117,98,117,54,47,51,0,47,112,117,98,117,54,47,52,0,47,112,117,98,117,54,47,53,0,47,112,117,98,117,54,47,54,0,47,112,117,98,117,55,47,49,0,47,112,117,98,117,55,47,50,0,47,112,117,98,117,55,47,51,0,47,112,117,98,117,55,47,52,0,47,112,117,98,117,55,47,53,0,47,112,117,98,117,55,47,54,0,47,112,117,98,117,55,47,55,0,47,112,117,98,117,56,47,49,0,47,112,117,98,117,56,47,50,0,47,112,117,98,117,56,47,51,0,47,112,117,98,117,56,47,52,0,47,112,117,98,117,56,47,53,0,47,112,117,98,117,56,47,54,0,47,112,117,98,117,56,47,55,0,47,112,117,98,117,56,47,56,0,47,112,117,98,117,57,47,49,0,47,112,117,98,117,57,47,50,0,47,112,117,98,117,57,47,51,0,47,112,117,98,117,57,47,52,0,47,112,117,98,117,57,47,53,0,47,112,117,98,117,57,47,54,0,47,112,117,98,117,57,47,55,0,47,112,117,98,117,57,47,56,0,47,112,117,98,117,57,47,57,0,47,112,117,98,117,103,110,51,47,49,0,47,112,117,98,117,103,110,51,47,50,0,47,112,117,98,117,103,110,51,47,51,0,47,112,117,98,117,103,110,52,47,49,0,47,112,117,98,117,103,110,52,47,50,0,47,112,117,98,117,103,110,52,47,51,0,47,112,117,98,117,103,110,52,47,52,0,47,112,117,98,117,103,110,53,47,49,0,47,112,117,98,117,103,110,53,47,50,0,47,112,117,98,117,103,110,53,47,51,0,47,112,117,98,117,103,110,53,47,52,0,47,112,117,98,117,103,110,53,47,53,0,47,112,117,98,117,103,110,54,47,49,0,47,112,117,98,117,103,110,54,47,50,0,47,112,117,98,117,103,110,54,47,51,0,47,112,117,98,117,103,110,54,47,52,0,47,112,117,98,117,103,110,54,47,53,0,47,112,117,98,117,103,110,54,47,54,0,47,112,117,98,117,103,110,55,47,49,0,47,112,117,98,117,103,110,55,47,50,0,47,112,117,98,117,103,110,55,47,51,0,47,112,117,98,117,103,110,55,47,52,0,47,112,117,98,117,103,110,55,47,53,0,47,112,117,98,117,103,110,55,47,54,0,47,112,117,98,117,103,110,55,47,55,0,47,112,117,98,117,103,110,56,47,49,0,47,112,117,98,117,103,110,56,47,50,0,47,112,117,98,117,103,110,56,47,51,0,47,112,117,98,117,103,110,56,47,52,0,47,112,117,98,117,103,110,56,47,53,0,47,112,117,98,117,103,110,56,47,54,0,47,112,117,98,117,103,110,56,47,55,0,47,112,117,98,117,103,110,56,47,56,0,47,112,117,98,117,103,110,57,47,49,0,47,112,117,98,117,103,110,57,47,50,0,47,112,117,98,117,103,110,57,47,51,0,47,112,117,98,117,103,110,57,47,52,0,47,112,117,98,117,103,110,57,47,53,0,47,112,117,98,117,103,110,57,47,54,0,47,112,117,98,117,103,110,57,47,55,0,47,112,117,98,117,103,110,57,47,56,0,47,112,117,98,117,103,110,57,47,57,0,47,112,117,111,114,49,48,47,49,0,47,112,117,111,114,49,48,47,49,48,0,47,112,117,111,114,49,48,47,50,0,47,112,117,111,114,49,48,47,51,0,47,112,117,111,114,49,48,47,52,0,47,112,117,111,114,49,48,47,53,0,47,112,117,111,114,49,48,47,54,0,47,112,117,111,114,49,48,47,55,0,47,112,117,111,114,49,48,47,56,0,47,112,117,111,114,49,48,47,57,0,47,112,117,111,114,49,49,47,49,0,47,112,117,111,114,49,49,47,49,48,0,47,112,117,111,114,49,49,47,49,49,0,47,112,117,111,114,49,49,47,50,0,47,112,117,111,114,49,49,47,51,0,47,112,117,111,114,49,49,47,52,0,47,112,117,111,114,49,49,47,53,0,47,112,117,111,114,49,49,47,54,0,47,112,117,111,114,49,49,47,55,0,47,112,117,111,114,49,49,47,56,0,47,112,117,111,114,49,49,47,57,0,47,112,117,111,114,51,47,49,0,47,112,117,111,114,51,47,50,0,47,112,117,111,114,51,47,51,0,47,112,117,111,114,52,47,49,0,47,112,117,111,114,52,47,50,0,47,112,117,111,114,52,47,51,0,47,112,117,111,114,52,47,52,0,47,112,117,111,114,53,47,49,0,47,112,117,111,114,53,47,50,0,47,112,117,111,114,53,47,51,0,47,112,117,111,114,53,47,52,0,47,112,117,111,114,53,47,53,0,47,112,117,111,114,54,47,49,0,47,112,117,111,114,54,47,50,0,47,112,117,111,114,54,47,51,0,47,112,117,111,114,54,47,52,0,47,112,117,111,114,54,47,53,0,47,112,117,111,114,54,47,54,0,47,112,117,111,114,55,47,49,0,47,112,117,111,114,55,47,50,0,47,112,117,111,114,55,47,51,0,47,112,117,111,114,55,47,52,0,47,112,117,111,114,55,47,53,0,47,112,117,111,114,55,47,54,0,47,112,117,111,114,55,47,55,0,47,112,117,111,114,56,47,49,0,47,112,117,111,114,56,47,50,0,47,112,117,111,114,56,47,51,0,47,112,117,111,114,56,47,52,0,47,112,117,111,114,56,47,53,0,47,112,117,111,114,56,47,54,0,47,112,117,111,114,56,47,55,0,47,112,117,111,114,56,47,56,0,47,112,117,111,114,57,47,49,0,47,112,117,111,114,57,47,50,0,47,112,117,111,114,57,47,51,0,47,112,117,111,114,57,47,52,0,47,112,117,111,114,57,47,53,0,47,112,117,111,114,57,47,54,0,47,112,117,111,114,57,47,55,0,47,112,117,111,114,57,47,56,0,47,112,117,111,114,57,47,57,0,47,112,117,114,100,51,47,49,0,47,112,117,114,100,51,47,50,0,47,112,117,114,100,51,47,51,0,47,112,117,114,100,52,47,49,0,47,112,117,114,100,52,47,50,0,47,112,117,114,100,52,47,51,0,47,112,117,114,100,52,47,52,0,47,112,117,114,100,53,47,49,0,47,112,117,114,100,53,47,50,0,47,112,117,114,100,53,47,51,0,47,112,117,114,100,53,47,52,0,47,112,117,114,100,53,47,53,0,47,112,117,114,100,54,47,49,0,47,112,117,114,100,54,47,50,0,47,112,117,114,100,54,47,51,0,47,112,117,114,100,54,47,52,0,47,112,117,114,100,54,47,53,0,47,112,117,114,100,54,47,54,0,47,112,117,114,100,55,47,49,0,47,112,117,114,100,55,47,50,0,47,112,117,114,100,55,47,51,0,47,112,117,114,100,55,47,52,0,47,112,117,114,100,55,47,53,0,47,112,117,114,100,55,47,54,0,47,112,117,114,100,55,47,55,0,47,112,117,114,100,56,47,49,0,47,112,117,114,100,56,47,50,0,47,112,117,114,100,56,47,51,0,47,112,117,114,100,56,47,52,0,47,112,117,114,100,56,47,53,0,47,112,117,114,100,56,47,54,0,47,112,117,114,100,56,47,55,0,47,112,117,114,100,56,47,56,0,47,112,117,114,100,57,47,49,0,47,112,117,114,100,57,47,50,0,47,112,117,114,100,57,47,51,0,47,112,117,114,100,57,47,52,0,47,112,117,114,100,57,47,53,0,47,112,117,114,100,57,47,54,0,47,112,117,114,100,57,47,55,0,47,112,117,114,100,57,47,56,0,47,112,117,114,100,57,47,57,0,47,112,117,114,112,108,101,115,51,47,49,0,47,112,117,114,112,108,101,115,51,47,50,0,47,112,117,114,112,108,101,115,51,47,51,0,47,112,117,114,112,108,101,115,52,47,49,0,47,112,117,114,112,108,101,115,52,47,50,0,47,112,117,114,112,108,101,115,52,47,51,0,47,112,117,114,112,108,101,115,52,47,52,0,47,112,117,114,112,108,101,115,53,47,49,0,47,112,117,114,112,108,101,115,53,47,50,0,47,112,117,114,112,108,101,115,53,47,51,0,47,112,117,114,112,108,101,115,53,47,52,0,47,112,117,114,112,108,101,115,53,47,53,0,47,112,117,114,112,108,101,115,54,47,49,0,47,112,117,114,112,108,101,115,54,47,50,0,47,112,117,114,112,108,101,115,54,47,51,0,47,112,117,114,112,108,101,115,54,47,52,0,47,112,117,114,112,108,101,115,54,47,53,0,47,112,117,114,112,108,101,115,54,47,54,0,47,112,117,114,112,108,101,115,55,47,49,0,47,112,117,114,112,108,101,115,55,47,50,0,47,112,117,114,112,108,101,115,55,47,51,0,47,112,117,114,112,108,101,115,55,47,52,0,47,112,117,114,112,108,101,115,55,47,53,0,47,112,117,114,112,108,101,115,55,47,54,0,47,112,117,114,112,108,101,115,55,47,55,0,47,112,117,114,112,108,101,115,56,47,49,0,47,112,117,114,112,108,101,115,56,47,50,0,47,112,117,114,112,108,101,115,56,47,51,0,47,112,117,114,112,108,101,115,56,47,52,0,47,112,117,114,112,108,101,115,56,47,53,0,47,112,117,114,112,108,101,115,56,47,54,0,47,112,117,114,112,108,101,115,56,47,55,0,47,112,117,114,112,108,101,115,56,47,56,0,47,112,117,114,112,108,101,115,57,47,49,0,47,112,117,114,112,108,101,115,57,47,50,0,47,112,117,114,112,108,101,115,57,47,51,0,47,112,117,114,112,108,101,115,57,47,52,0,47,112,117,114,112,108,101,115,57,47,53,0,47,112,117,114,112,108,101,115,57,47,54,0,47,112,117,114,112,108,101,115,57,47,55,0,47,112,117,114,112,108,101,115,57,47,56,0,47,112,117,114,112,108,101,115,57,47,57,0,47,114,100,98,117,49,48,47,49,0,47,114,100,98,117,49,48,47,49,48,0,47,114,100,98,117,49,48,47,50,0,47,114,100,98,117,49,48,47,51,0,47,114,100,98,117,49,48,47,52,0,47,114,100,98,117,49,48,47,53,0,47,114,100,98,117,49,48,47,54,0,47,114,100,98,117,49,48,47,55,0,47,114,100,98,117,49,48,47,56,0,47,114,100,98,117,49,48,47,57,0,47,114,100,98,117,49,49,47,49,0,47,114,100,98,117,49,49,47,49,48,0,47,114,100,98,117,49,49,47,49,49,0,47,114,100,98,117,49,49,47,50,0,47,114,100,98,117,49,49,47,51,0,47,114,100,98,117,49,49,47,52,0,47,114,100,98,117,49,49,47,53,0,47,114,100,98,117,49,49,47,54,0,47,114,100,98,117,49,49,47,55,0,47,114,100,98,117,49,49,47,56,0,47,114,100,98,117,49,49,47,57,0,47,114,100,98,117,51,47,49,0,47,114,100,98,117,51,47,50,0,47,114,100,98,117,51,47,51,0,47,114,100,98,117,52,47,49,0,47,114,100,98,117,52,47,50,0,47,114,100,98,117,52,47,51,0,47,114,100,98,117,52,47,52,0,47,114,100,98,117,53,47,49,0,47,114,100,98,117,53,47,50,0,47,114,100,98,117,53,47,51,0,47,114,100,98,117,53,47,52,0,47,114,100,98,117,53,47,53,0,47,114,100,98,117,54,47,49,0,47,114,100,98,117,54,47,50,0,47,114,100,98,117,54,47,51,0,47,114,100,98,117,54,47,52,0,47,114,100,98,117,54,47,53,0,47,114,100,98,117,54,47,54,0,47,114,100,98,117,55,47,49,0,47,114,100,98,117,55,47,50,0,47,114,100,98,117,55,47,51,0,47,114,100,98,117,55,47,52,0,47,114,100,98,117,55,47,53,0,47,114,100,98,117,55,47,54,0,47,114,100,98,117,55,47,55,0,47,114,100,98,117,56,47,49,0,47,114,100,98,117,56,47,50,0,47,114,100,98,117,56,47,51,0,47,114,100,98,117,56,47,52,0,47,114,100,98,117,56,47,53,0,47,114,100,98,117,56,47,54,0,47,114,100,98,117,56,47,55,0,47,114,100,98,117,56,47,56,0,47,114,100,98,117,57,47,49,0,47,114,100,98,117,57,47,50,0,47,114,100,98,117,57,47,51,0,47,114,100,98,117,57,47,52,0,47,114,100,98,117,57,47,53,0,47,114,100,98,117,57,47,54,0,47,114,100,98,117,57,47,55,0,47,114,100,98,117,57,47,56,0,47,114,100,98,117,57,47,57,0,47,114,100,103,121,49,48,47,49,0,47,114,100,103,121,49,48,47,49,48,0,47,114,100,103,121,49,48,47,50,0,47,114,100,103,121,49,48,47,51,0,47,114,100,103,121,49,48,47,52,0,47,114,100,103,121,49,48,47,53,0,47,114,100,103,121,49,48,47,54,0,47,114,100,103,121,49,48,47,55,0,47,114,100,103,121,49,48,47,56,0,47,114,100,103,121,49,48,47,57,0,47,114,100,103,121,49,49,47,49,0,47,114,100,103,121,49,49,47,49,48,0,47,114,100,103,121,49,49,47,49,49,0,47,114,100,103,121,49,49,47,50,0,47,114,100,103,121,49,49,47,51,0,47,114,100,103,121,49,49,47,52,0,47,114,100,103,121,49,49,47,53,0,47,114,100,103,121,49,49,47,54,0,47,114,100,103,121,49,49,47,55,0,47,114,100,103,121,49,49,47,56,0,47,114,100,103,121,49,49,47,57,0,47,114,100,103,121,51,47,49,0,47,114,100,103,121,51,47,50,0,47,114,100,103,121,51,47,51,0,47,114,100,103,121,52,47,49,0,47,114,100,103,121,52,47,50,0,47,114,100,103,121,52,47,51,0,47,114,100,103,121,52,47,52,0,47,114,100,103,121,53,47,49,0,47,114,100,103,121,53,47,50,0,47,114,100,103,121,53,47,51,0,47,114,100,103,121,53,47,52,0,47,114,100,103,121,53,47,53,0,47,114,100,103,121,54,47,49,0,47,114,100,103,121,54,47,50,0,47,114,100,103,121,54,47,51,0,47,114,100,103,121,54,47,52,0,47,114,100,103,121,54,47,53,0,47,114,100,103,121,54,47,54,0,47,114,100,103,121],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+112664);allocate([55,47,49,0,47,114,100,103,121,55,47,50,0,47,114,100,103,121,55,47,51,0,47,114,100,103,121,55,47,52,0,47,114,100,103,121,55,47,53,0,47,114,100,103,121,55,47,54,0,47,114,100,103,121,55,47,55,0,47,114,100,103,121,56,47,49,0,47,114,100,103,121,56,47,50,0,47,114,100,103,121,56,47,51,0,47,114,100,103,121,56,47,52,0,47,114,100,103,121,56,47,53,0,47,114,100,103,121,56,47,54,0,47,114,100,103,121,56,47,55,0,47,114,100,103,121,56,47,56,0,47,114,100,103,121,57,47,49,0,47,114,100,103,121,57,47,50,0,47,114,100,103,121,57,47,51,0,47,114,100,103,121,57,47,52,0,47,114,100,103,121,57,47,53,0,47,114,100,103,121,57,47,54,0,47,114,100,103,121,57,47,55,0,47,114,100,103,121,57,47,56,0,47,114,100,103,121,57,47,57,0,47,114,100,112,117,51,47,49,0,47,114,100,112,117,51,47,50,0,47,114,100,112,117,51,47,51,0,47,114,100,112,117,52,47,49,0,47,114,100,112,117,52,47,50,0,47,114,100,112,117,52,47,51,0,47,114,100,112,117,52,47,52,0,47,114,100,112,117,53,47,49,0,47,114,100,112,117,53,47,50,0,47,114,100,112,117,53,47,51,0,47,114,100,112,117,53,47,52,0,47,114,100,112,117,53,47,53,0,47,114,100,112,117,54,47,49,0,47,114,100,112,117,54,47,50,0,47,114,100,112,117,54,47,51,0,47,114,100,112,117,54,47,52,0,47,114,100,112,117,54,47,53,0,47,114,100,112,117,54,47,54,0,47,114,100,112,117,55,47,49,0,47,114,100,112,117,55,47,50,0,47,114,100,112,117,55,47,51,0,47,114,100,112,117,55,47,52,0,47,114,100,112,117,55,47,53,0,47,114,100,112,117,55,47,54,0,47,114,100,112,117,55,47,55,0,47,114,100,112,117,56,47,49,0,47,114,100,112,117,56,47,50,0,47,114,100,112,117,56,47,51,0,47,114,100,112,117,56,47,52,0,47,114,100,112,117,56,47,53,0,47,114,100,112,117,56,47,54,0,47,114,100,112,117,56,47,55,0,47,114,100,112,117,56,47,56,0,47,114,100,112,117,57,47,49,0,47,114,100,112,117,57,47,50,0,47,114,100,112,117,57,47,51,0,47,114,100,112,117,57,47,52,0,47,114,100,112,117,57,47,53,0,47,114,100,112,117,57,47,54,0,47,114,100,112,117,57,47,55,0,47,114,100,112,117,57,47,56,0,47,114,100,112,117,57,47,57,0,47,114,100,121,108,98,117,49,48,47,49,0,47,114,100,121,108,98,117,49,48,47,49,48,0,47,114,100,121,108,98,117,49,48,47,50,0,47,114,100,121,108,98,117,49,48,47,51,0,47,114,100,121,108,98,117,49,48,47,52,0,47,114,100,121,108,98,117,49,48,47,53,0,47,114,100,121,108,98,117,49,48,47,54,0,47,114,100,121,108,98,117,49,48,47,55,0,47,114,100,121,108,98,117,49,48,47,56,0,47,114,100,121,108,98,117,49,48,47,57,0,47,114,100,121,108,98,117,49,49,47,49,0,47,114,100,121,108,98,117,49,49,47,49,48,0,47,114,100,121,108,98,117,49,49,47,49,49,0,47,114,100,121,108,98,117,49,49,47,50,0,47,114,100,121,108,98,117,49,49,47,51,0,47,114,100,121,108,98,117,49,49,47,52,0,47,114,100,121,108,98,117,49,49,47,53,0,47,114,100,121,108,98,117,49,49,47,54,0,47,114,100,121,108,98,117,49,49,47,55,0,47,114,100,121,108,98,117,49,49,47,56,0,47,114,100,121,108,98,117,49,49,47,57,0,47,114,100,121,108,98,117,51,47,49,0,47,114,100,121,108,98,117,51,47,50,0,47,114,100,121,108,98,117,51,47,51,0,47,114,100,121,108,98,117,52,47,49,0,47,114,100,121,108,98,117,52,47,50,0,47,114,100,121,108,98,117,52,47,51,0,47,114,100,121,108,98,117,52,47,52,0,47,114,100,121,108,98,117,53,47,49,0,47,114,100,121,108,98,117,53,47,50,0,47,114,100,121,108,98,117,53,47,51,0,47,114,100,121,108,98,117,53,47,52,0,47,114,100,121,108,98,117,53,47,53,0,47,114,100,121,108,98,117,54,47,49,0,47,114,100,121,108,98,117,54,47,50,0,47,114,100,121,108,98,117,54,47,51,0,47,114,100,121,108,98,117,54,47,52,0,47,114,100,121,108,98,117,54,47,53,0,47,114,100,121,108,98,117,54,47,54,0,47,114,100,121,108,98,117,55,47,49,0,47,114,100,121,108,98,117,55,47,50,0,47,114,100,121,108,98,117,55,47,51,0,47,114,100,121,108,98,117,55,47,52,0,47,114,100,121,108,98,117,55,47,53,0,47,114,100,121,108,98,117,55,47,54,0,47,114,100,121,108,98,117,55,47,55,0,47,114,100,121,108,98,117,56,47,49,0,47,114,100,121,108,98,117,56,47,50,0,47,114,100,121,108,98,117,56,47,51,0,47,114,100,121,108,98,117,56,47,52,0,47,114,100,121,108,98,117,56,47,53,0,47,114,100,121,108,98,117,56,47,54,0,47,114,100,121,108,98,117,56,47,55,0,47,114,100,121,108,98,117,56,47,56,0,47,114,100,121,108,98,117,57,47,49,0,47,114,100,121,108,98,117,57,47,50,0,47,114,100,121,108,98,117,57,47,51,0,47,114,100,121,108,98,117,57,47,52,0,47,114,100,121,108,98,117,57,47,53,0,47,114,100,121,108,98,117,57,47,54,0,47,114,100,121,108,98,117,57,47,55,0,47,114,100,121,108,98,117,57,47,56,0,47,114,100,121,108,98,117,57,47,57,0,47,114,100,121,108,103,110,49,48,47,49,0,47,114,100,121,108,103,110,49,48,47,49,48,0,47,114,100,121,108,103,110,49,48,47,50,0,47,114,100,121,108,103,110,49,48,47,51,0,47,114,100,121,108,103,110,49,48,47,52,0,47,114,100,121,108,103,110,49,48,47,53,0,47,114,100,121,108,103,110,49,48,47,54,0,47,114,100,121,108,103,110,49,48,47,55,0,47,114,100,121,108,103,110,49,48,47,56,0,47,114,100,121,108,103,110,49,48,47,57,0,47,114,100,121,108,103,110,49,49,47,49,0,47,114,100,121,108,103,110,49,49,47,49,48,0,47,114,100,121,108,103,110,49,49,47,49,49,0,47,114,100,121,108,103,110,49,49,47,50,0,47,114,100,121,108,103,110,49,49,47,51,0,47,114,100,121,108,103,110,49,49,47,52,0,47,114,100,121,108,103,110,49,49,47,53,0,47,114,100,121,108,103,110,49,49,47,54,0,47,114,100,121,108,103,110,49,49,47,55,0,47,114,100,121,108,103,110,49,49,47,56,0,47,114,100,121,108,103,110,49,49,47,57,0,47,114,100,121,108,103,110,51,47,49,0,47,114,100,121,108,103,110,51,47,50,0,47,114,100,121,108,103,110,51,47,51,0,47,114,100,121,108,103,110,52,47,49,0,47,114,100,121,108,103,110,52,47,50,0,47,114,100,121,108,103,110,52,47,51,0,47,114,100,121,108,103,110,52,47,52,0,47,114,100,121,108,103,110,53,47,49,0,47,114,100,121,108,103,110,53,47,50,0,47,114,100,121,108,103,110,53,47,51,0,47,114,100,121,108,103,110,53,47,52,0,47,114,100,121,108,103,110,53,47,53,0,47,114,100,121,108,103,110,54,47,49,0,47,114,100,121,108,103,110,54,47,50,0,47,114,100,121,108,103,110,54,47,51,0,47,114,100,121,108,103,110,54,47,52,0,47,114,100,121,108,103,110,54,47,53,0,47,114,100,121,108,103,110,54,47,54,0,47,114,100,121,108,103,110,55,47,49,0,47,114,100,121,108,103,110,55,47,50,0,47,114,100,121,108,103,110,55,47,51,0,47,114,100,121,108,103,110,55,47,52,0,47,114,100,121,108,103,110,55,47,53,0,47,114,100,121,108,103,110,55,47,54,0,47,114,100,121,108,103,110,55,47,55,0,47,114,100,121,108,103,110,56,47,49,0,47,114,100,121,108,103,110,56,47,50,0,47,114,100,121,108,103,110,56,47,51,0,47,114,100,121,108,103,110,56,47,52,0,47,114,100,121,108,103,110,56,47,53,0,47,114,100,121,108,103,110,56,47,54,0,47,114,100,121,108,103,110,56,47,55,0,47,114,100,121,108,103,110,56,47,56,0,47,114,100,121,108,103,110,57,47,49,0,47,114,100,121,108,103,110,57,47,50,0,47,114,100,121,108,103,110,57,47,51,0,47,114,100,121,108,103,110,57,47,52,0,47,114,100,121,108,103,110,57,47,53,0,47,114,100,121,108,103,110,57,47,54,0,47,114,100,121,108,103,110,57,47,55,0,47,114,100,121,108,103,110,57,47,56,0,47,114,100,121,108,103,110,57,47,57,0,47,114,101,100,115,51,47,49,0,47,114,101,100,115,51,47,50,0,47,114,101,100,115,51,47,51,0,47,114,101,100,115,52,47,49,0,47,114,101,100,115,52,47,50,0,47,114,101,100,115,52,47,51,0,47,114,101,100,115,52,47,52,0,47,114,101,100,115,53,47,49,0,47,114,101,100,115,53,47,50,0,47,114,101,100,115,53,47,51,0,47,114,101,100,115,53,47,52,0,47,114,101,100,115,53,47,53,0,47,114,101,100,115,54,47,49,0,47,114,101,100,115,54,47,50,0,47,114,101,100,115,54,47,51,0,47,114,101,100,115,54,47,52,0,47,114,101,100,115,54,47,53,0,47,114,101,100,115,54,47,54,0,47,114,101,100,115,55,47,49,0,47,114,101,100,115,55,47,50,0,47,114,101,100,115,55,47,51,0,47,114,101,100,115,55,47,52,0,47,114,101,100,115,55,47,53,0,47,114,101,100,115,55,47,54,0,47,114,101,100,115,55,47,55,0,47,114,101,100,115,56,47,49,0,47,114,101,100,115,56,47,50,0,47,114,101,100,115,56,47,51,0,47,114,101,100,115,56,47,52,0,47,114,101,100,115,56,47,53,0,47,114,101,100,115,56,47,54,0,47,114,101,100,115,56,47,55,0,47,114,101,100,115,56,47,56,0,47,114,101,100,115,57,47,49,0,47,114,101,100,115,57,47,50,0,47,114,101,100,115,57,47,51,0,47,114,101,100,115,57,47,52,0,47,114,101,100,115,57,47,53,0,47,114,101,100,115,57,47,54,0,47,114,101,100,115,57,47,55,0,47,114,101,100,115,57,47,56,0,47,114,101,100,115,57,47,57,0,47,115,101,116,49,51,47,49,0,47,115,101,116,49,51,47,50,0,47,115,101,116,49,51,47,51,0,47,115,101,116,49,52,47,49,0,47,115,101,116,49,52,47,50,0,47,115,101,116,49,52,47,51,0,47,115,101,116,49,52,47,52,0,47,115,101,116,49,53,47,49,0,47,115,101,116,49,53,47,50,0,47,115,101,116,49,53,47,51,0,47,115,101,116,49,53,47,52,0,47,115,101,116,49,53,47,53,0,47,115,101,116,49,54,47,49,0,47,115,101,116,49,54,47,50,0,47,115,101,116,49,54,47,51,0,47,115,101,116,49,54,47,52,0,47,115,101,116,49,54,47,53,0,47,115,101,116,49,54,47,54,0,47,115,101,116,49,55,47,49,0,47,115,101,116,49,55,47,50,0,47,115,101,116,49,55,47,51,0,47,115,101,116,49,55,47,52,0,47,115,101,116,49,55,47,53,0,47,115,101,116,49,55,47,54,0,47,115,101,116,49,55,47,55,0,47,115,101,116,49,56,47,49,0,47,115,101,116,49,56,47,50,0,47,115,101,116,49,56,47,51,0,47,115,101,116,49,56,47,52,0,47,115,101,116,49,56,47,53,0,47,115,101,116,49,56,47,54,0,47,115,101,116,49,56,47,55,0,47,115,101,116,49,56,47,56,0,47,115,101,116,49,57,47,49,0,47,115,101,116,49,57,47,50,0,47,115,101,116,49,57,47,51,0,47,115,101,116,49,57,47,52,0,47,115,101,116,49,57,47,53,0,47,115,101,116,49,57,47,54,0,47,115,101,116,49,57,47,55,0,47,115,101,116,49,57,47,56,0,47,115,101,116,49,57,47,57,0,47,115,101,116,50,51,47,49,0,47,115,101,116,50,51,47,50,0,47,115,101,116,50,51,47,51,0,47,115,101,116,50,52,47,49,0,47,115,101,116,50,52,47,50,0,47,115,101,116,50,52,47,51,0,47,115,101,116,50,52,47,52,0,47,115,101,116,50,53,47,49,0,47,115,101,116,50,53,47,50,0,47,115,101,116,50,53,47,51,0,47,115,101,116,50,53,47,52,0,47,115,101,116,50,53,47,53,0,47,115,101,116,50,54,47,49,0,47,115,101,116,50,54,47,50,0,47,115,101,116,50,54,47,51,0,47,115,101,116,50,54,47,52,0,47,115,101,116,50,54,47,53,0,47,115,101,116,50,54,47,54,0,47,115,101,116,50,55,47,49,0,47,115,101,116,50,55,47,50,0,47,115,101,116,50,55,47,51,0,47,115,101,116,50,55,47,52,0,47,115,101,116,50,55,47,53,0,47,115,101,116,50,55,47,54,0,47,115,101,116,50,55,47,55,0,47,115,101,116,50,56,47,49,0,47,115,101,116,50,56,47,50,0,47,115,101,116,50,56,47,51,0,47,115,101,116,50,56,47,52,0,47,115,101,116,50,56,47,53,0,47,115,101,116,50,56,47,54,0,47,115,101,116,50,56,47,55,0,47,115,101,116,50,56,47,56,0,47,115,101,116,51,49,48,47,49,0,47,115,101,116,51,49,48,47,49,48,0,47,115,101,116,51,49,48,47,50,0,47,115,101,116,51,49,48,47,51,0,47,115,101,116,51,49,48,47,52,0,47,115,101,116,51,49,48,47,53,0,47,115,101,116,51,49,48,47,54,0,47,115,101,116,51,49,48,47,55,0,47,115,101,116,51,49,48,47,56,0,47,115,101,116,51,49,48,47,57,0,47,115,101,116,51,49,49,47,49,0,47,115,101,116,51,49,49,47,49,48,0,47,115,101,116,51,49,49,47,49,49,0,47,115,101,116,51,49,49,47,50,0,47,115,101,116,51,49,49,47,51,0,47,115,101,116,51,49,49,47,52,0,47,115,101,116,51,49,49,47,53,0,47,115,101,116,51,49,49,47,54,0,47,115,101,116,51,49,49,47,55,0,47,115,101,116,51,49,49,47,56,0,47,115,101,116,51,49,49,47,57,0,47,115,101,116,51,49,50,47,49,0,47,115,101,116,51,49,50,47,49,48,0,47,115,101,116,51,49,50,47,49,49,0,47,115,101,116,51,49,50,47,49,50,0,47,115,101,116,51,49,50,47,50,0,47,115,101,116,51,49,50,47,51,0,47,115,101,116,51,49,50,47,52,0,47,115,101,116,51,49,50,47,53,0,47,115,101,116,51,49,50,47,54,0,47,115,101,116,51,49,50,47,55,0,47,115,101,116,51,49,50,47,56,0,47,115,101,116,51,49,50,47,57,0,47,115,101,116,51,51,47,49,0,47,115,101,116,51,51,47,50,0,47,115,101,116,51,51,47,51,0,47,115,101,116,51,52,47,49,0,47,115,101,116,51,52,47,50,0,47,115,101,116,51,52,47,51,0,47,115,101,116,51,52,47,52,0,47,115,101,116,51,53,47,49,0,47,115,101,116,51,53,47,50,0,47,115,101,116,51,53,47,51,0,47,115,101,116,51,53,47,52,0,47,115,101,116,51,53,47,53,0,47,115,101,116,51,54,47,49,0,47,115,101,116,51,54,47,50,0,47,115,101,116,51,54,47,51,0,47,115,101,116,51,54,47,52,0,47,115,101,116,51,54,47,53,0,47,115,101,116,51,54,47,54,0,47,115,101,116,51,55,47,49,0,47,115,101,116,51,55,47,50,0,47,115,101,116,51,55,47,51,0,47,115,101,116,51,55,47,52,0,47,115,101,116,51,55,47,53,0,47,115,101,116,51,55,47,54,0,47,115,101,116,51,55,47,55,0,47,115,101,116,51,56,47,49,0,47,115,101,116,51,56,47,50,0,47,115,101,116,51,56,47,51,0,47,115,101,116,51,56,47,52,0,47,115,101,116,51,56,47,53,0,47,115,101,116,51,56,47,54,0,47,115,101,116,51,56,47,55,0,47,115,101,116,51,56,47,56,0,47,115,101,116,51,57,47,49,0,47,115,101,116,51,57,47,50,0,47,115,101,116,51,57,47,51,0,47,115,101,116,51,57,47,52,0,47,115,101,116,51,57,47,53,0,47,115,101,116,51,57,47,54,0,47,115,101,116,51,57,47,55,0,47,115,101,116,51,57,47,56,0,47,115,101,116,51,57,47,57,0,47,115,112,101,99,116,114,97,108,49,48,47,49,0,47,115,112,101,99,116,114,97,108,49,48,47,49,48,0,47,115,112,101,99,116,114,97,108,49,48,47,50,0,47,115,112,101,99,116,114,97,108,49,48,47,51,0,47,115,112,101,99,116,114,97,108,49,48,47,52,0,47,115,112,101,99,116,114,97,108,49,48,47,53,0,47,115,112,101,99,116,114,97,108,49,48,47,54,0,47,115,112,101,99,116,114,97,108,49,48,47,55,0,47,115,112,101,99,116,114,97,108,49,48,47,56,0,47,115,112,101,99,116,114,97,108,49,48,47,57,0,47,115,112,101,99,116,114,97,108,49,49,47,49,0,47,115,112,101,99,116,114,97,108,49,49,47,49,48,0,47,115,112,101,99,116,114,97,108,49,49,47,49,49,0,47,115,112,101,99,116,114,97,108,49,49,47,50,0,47,115,112,101,99,116,114,97,108,49,49,47,51,0,47,115,112,101,99,116,114,97,108,49,49,47,52,0,47,115,112,101,99,116,114,97,108,49,49,47,53,0,47,115,112,101,99,116,114,97,108,49,49,47,54,0,47,115,112,101,99,116,114,97,108,49,49,47,55,0,47,115,112,101,99,116,114,97,108,49,49,47,56,0,47,115,112,101,99,116,114,97,108,49,49,47,57,0,47,115,112,101,99,116,114,97,108,51,47,49,0,47,115,112,101,99,116,114,97,108,51,47,50,0,47,115,112,101,99,116,114,97,108,51,47,51,0,47,115,112,101,99,116,114,97,108,52,47,49,0,47,115,112,101,99,116,114,97,108,52,47,50,0,47,115,112,101,99,116,114,97,108,52,47,51,0,47,115,112,101,99,116,114,97,108,52,47,52,0,47,115,112,101,99,116,114,97,108,53,47,49,0,47,115,112,101,99,116,114,97,108,53,47,50,0,47,115,112,101,99,116,114,97,108,53,47,51,0,47,115,112,101,99,116,114,97,108,53,47,52,0,47,115,112,101,99,116,114,97,108,53,47,53,0,47,115,112,101,99,116,114,97,108,54,47,49,0,47,115,112,101,99,116,114,97,108,54,47,50,0,47,115,112,101,99,116,114,97,108,54,47,51,0,47,115,112,101,99,116,114,97,108,54,47,52,0,47,115,112,101,99,116,114,97,108,54,47,53,0,47,115,112,101,99,116,114,97,108,54,47,54,0,47,115,112,101,99,116,114,97,108,55,47,49,0,47,115,112,101,99,116,114,97,108,55,47,50,0,47,115,112,101,99,116,114,97,108,55,47,51,0,47,115,112,101,99,116,114,97,108,55,47,52,0,47,115,112,101,99,116,114,97,108,55,47,53,0,47,115,112,101,99,116,114,97,108,55,47,54,0,47,115,112,101,99,116,114,97,108,55,47,55,0,47,115,112,101,99,116,114,97,108,56,47,49,0,47,115,112,101,99,116,114,97,108,56,47,50,0,47,115,112,101,99,116,114,97,108,56,47,51,0,47,115,112,101,99,116,114,97,108,56,47,52,0,47,115,112,101,99,116,114,97,108,56,47,53,0,47,115,112,101,99,116,114,97,108,56,47,54,0,47,115,112,101,99,116,114,97,108,56,47,55,0,47,115,112,101,99,116,114,97,108,56,47,56,0,47,115,112,101,99,116,114,97,108,57,47,49,0,47,115,112,101,99,116,114,97,108,57,47,50,0,47,115,112,101,99,116,114,97,108,57,47,51,0,47,115,112,101,99,116,114,97,108,57,47,52,0,47,115,112,101,99,116,114,97,108,57,47,53,0,47,115,112,101,99,116,114,97,108,57,47,54,0,47,115,112,101,99,116,114,97,108,57,47,55,0,47,115,112,101,99,116,114,97,108,57,47,56,0,47,115,112,101,99,116,114,97,108,57,47,57,0,47,115,118,103,47,97,108,105,99,101,98,108,117,101,0,47,115,118,103,47,97,110,116,105,113,117,101,119,104,105,116,101,0,47,115,118,103,47,97,113,117,97,0,47,115,118,103,47,97,113,117,97,109,97,114,105,110,101,0,47,115,118,103,47,97,122,117,114,101,0,47,115,118,103,47,98,101,105,103,101,0,47,115,118,103,47,98,105,115,113,117,101,0,47,115,118,103,47,98,108,97,99,107,0,47,115,118,103,47,98,108,97,110,99,104,101,100,97,108,109,111,110,100,0,47,115,118,103,47,98,108,117,101,0,47,115,118,103,47,98,108,117,101,118,105,111,108,101,116,0,47,115,118,103,47,98,114,111,119,110,0,47,115,118,103,47,98,117,114,108,121,119,111,111,100,0,47,115,118,103,47,99,97,100,101,116,98,108,117,101,0,47,115,118,103,47,99,104,97,114,116,114,101,117,115,101,0,47,115,118,103,47,99,104,111,99,111,108,97,116,101,0,47,115,118,103,47,99,111,114,97,108,0,47,115,118,103,47,99,111,114,110,102,108,111,119,101,114,98,108,117,101,0,47,115,118,103,47,99,111,114,110,115,105,108,107,0,47,115,118,103,47,99,114,105,109,115,111,110,0,47,115,118,103,47,99,121,97,110,0,47,115,118,103,47,100,97,114,107,98,108,117,101,0,47,115,118,103,47,100,97,114,107,99,121,97,110,0,47,115,118,103,47,100,97,114,107,103,111,108,100,101,110,114,111,100,0,47,115,118,103,47,100,97,114,107,103,114,97,121,0,47,115,118,103,47,100,97,114,107,103,114,101,101,110,0,47,115,118,103,47,100,97,114,107,103,114,101,121,0,47,115,118,103,47,100,97,114,107,107,104,97,107,105,0,47,115,118,103,47,100,97,114,107,109,97,103,101,110,116,97,0,47,115,118,103,47,100,97,114,107,111,108,105,118,101,103,114,101,101,110,0,47,115,118,103,47,100,97,114,107,111,114,97,110,103,101,0,47,115,118,103,47,100,97,114,107,111,114,99,104,105,100,0,47,115,118,103,47,100,97,114,107,114,101,100,0,47,115,118,103,47,100,97,114,107,115,97,108,109,111,110,0,47,115,118,103,47,100,97,114,107,115,101,97,103,114,101,101,110,0,47,115,118,103,47,100,97,114,107,115,108,97,116,101,98,108,117,101,0,47,115,118,103,47,100,97,114,107,115,108,97,116,101,103,114,97,121,0,47,115,118,103,47,100,97,114,107,115,108,97,116,101,103,114,101,121,0,47,115,118,103,47,100,97,114,107,116,117,114,113,117,111,105,115,101,0,47,115,118,103,47,100,97,114,107,118,105,111,108,101,116,0,47,115,118,103,47,100,101,101,112,112,105,110,107,0,47,115,118,103,47,100,101,101,112,115,107,121,98,108,117,101,0,47,115,118,103,47,100,105,109,103,114,97,121,0,47,115,118,103,47,100,105,109,103,114,101,121,0,47,115,118,103,47,100,111,100,103,101,114,98,108,117,101,0,47,115,118,103,47,102,105,114,101,98,114,105,99,107,0,47,115,118,103,47,102,108,111,114,97,108,119,104,105,116,101,0,47,115,118,103,47,102,111,114,101,115,116,103,114,101,101,110,0,47,115,118,103,47,102,117,99,104,115,105,97,0,47,115,118,103,47,103,97,105,110,115,98,111,114,111,0,47,115,118,103,47,103,104,111,115,116,119,104,105,116,101,0,47,115,118,103,47,103,111,108,100,0,47,115,118,103,47,103,111,108,100,101,110,114,111,100,0,47,115,118,103,47,103,114,97,121,0,47,115,118,103,47,103,114,101,101,110,0,47,115,118,103,47,103,114,101,101,110,121,101,108,108,111,119,0,47,115,118,103,47,103,114,101,121,0,47,115,118,103,47,104,111,110,101,121,100,101,119,0,47,115,118,103,47,104,111,116,112,105,110,107,0,47,115,118,103,47,105,110,100,105,97,110,114,101,100,0,47,115,118,103,47,105,110,100,105,103,111,0,47,115,118,103,47,105,118,111,114,121,0,47,115,118,103,47,107,104,97,107,105,0,47,115,118,103,47,108,97,118,101,110,100,101,114,0,47,115,118,103,47,108,97,118,101,110,100,101,114,98,108,117,115,104,0,47,115,118,103,47,108,97,119,110,103,114,101,101,110,0,47,115,118,103,47,108,101,109,111,110,99,104,105,102,102,111,110,0,47,115,118,103,47,108,105,103,104,116,98,108,117,101,0,47,115,118,103,47,108,105,103,104,116,99,111,114,97,108,0,47,115,118,103,47,108,105,103,104,116,99,121,97,110,0,47,115,118,103,47,108,105,103,104,116,103,111,108,100,101,110,114,111,100,121,101,108,108,111,119,0,47,115,118,103,47,108,105,103,104,116,103,114,97,121,0,47,115,118,103,47,108,105,103,104,116,103,114,101,101,110,0,47,115,118,103,47,108,105,103,104,116,103,114,101,121,0,47,115,118,103,47,108,105,103,104,116,112,105,110,107,0,47,115,118,103,47,108,105,103,104,116,115,97,108,109,111,110,0,47,115,118,103,47,108,105,103,104,116,115,101,97,103,114,101,101,110,0,47,115,118,103,47,108,105,103,104,116,115,107,121,98,108,117,101,0,47,115,118,103,47,108,105,103,104,116,115,108,97,116,101,103,114,97,121,0,47,115,118,103,47,108,105,103,104,116,115,108,97,116,101,103,114,101,121,0,47,115,118,103,47,108,105,103,104,116,115,116,101,101,108,98,108,117,101,0,47,115,118,103,47,108,105,103,104,116,121,101,108,108,111,119,0,47,115,118,103,47,108,105,109,101,0,47,115,118,103,47,108,105,109,101,103,114,101,101,110,0,47,115,118,103,47,108,105,110,101,110,0,47,115,118,103,47,109,97,103,101,110,116,97,0,47,115,118,103,47,109,97,114,111,111,110,0,47,115,118,103,47,109,101,100,105,117,109,97,113,117,97,109,97,114,105,110,101,0,47,115,118,103,47,109,101,100,105,117,109,98,108,117,101,0,47,115,118,103,47,109,101,100,105,117,109,111,114,99,104,105,100,0,47,115,118,103,47,109,101,100,105,117,109,112,117,114,112,108,101,0,47,115,118,103,47,109,101,100,105,117,109,115,101,97,103,114,101,101,110,0,47,115,118,103,47,109,101,100,105,117,109,115,108,97,116,101,98,108,117,101,0,47,115,118,103,47,109,101,100,105,117,109,115,112,114,105,110,103,103,114,101,101,110,0,47,115,118,103,47,109,101,100,105,117,109,116,117,114,113,117,111,105,115,101,0,47,115,118,103,47,109,101,100,105,117,109,118,105,111,108,101,116,114,101,100,0,47,115,118,103,47,109,105,100,110,105,103,104,116,98,108,117,101,0,47,115,118,103,47,109,105,110,116,99,114,101,97,109,0,47,115,118,103,47,109,105,115,116,121,114,111,115,101,0,47,115,118,103,47,109,111,99,99,97,115,105,110,0,47,115,118,103,47,110,97,118,97,106,111,119,104,105,116,101,0,47,115,118,103,47,110,97,118,121,0,47,115,118,103,47,111,108,100,108,97,99,101,0,47,115,118,103,47,111,108,105,118,101,0,47,115,118,103,47,111,108,105,118,101,100,114,97,98,0,47,115,118,103,47,111,114,97,110,103,101,0,47,115,118,103,47,111,114,97,110,103,101,114,101,100,0,47,115,118,103,47,111,114,99,104,105,100,0,47,115,118,103,47,112,97,108,101,103,111,108,100,101,110,114,111,100,0,47,115,118,103,47,112,97,108,101,103,114,101,101,110,0,47,115,118,103,47,112,97,108,101,116,117,114,113,117,111,105,115,101,0,47,115,118,103,47,112,97,108,101,118,105,111,108,101,116,114,101,100,0,47,115,118,103,47,112,97,112,97,121,97,119,104,105,112,0,47,115,118,103,47,112,101,97,99,104,112,117,102,102,0,47,115,118,103,47,112,101,114,117,0,47,115,118,103,47,112,105,110,107,0,47,115,118,103,47,112,108,117,109,0,47,115,118,103,47,112,111,119,100,101,114,98,108,117,101,0,47,115,118,103,47,112,117,114,112,108,101,0,47,115,118,103,47,114,101,100,0,47,115,118,103,47,114,111,115,121,98,114,111,119,110,0,47,115,118,103,47,114,111,121,97,108,98,108,117,101,0,47,115,118,103,47,115,97,100,100,108,101,98,114,111,119,110,0,47,115,118,103,47,115,97,108,109,111,110,0,47,115,118,103,47,115,97,110,100,121,98,114,111,119,110,0,47,115,118,103,47,115,101,97,103,114,101,101,110,0,47,115,118,103,47,115,101,97,115,104,101,108,108,0,47,115,118,103,47,115,105,101,110,110,97,0,47,115,118,103,47,115,105,108,118,101,114,0,47,115,118,103,47,115,107,121,98,108,117,101,0,47,115,118,103,47,115,108,97,116,101,98,108,117,101,0,47,115,118,103,47,115,108,97,116,101,103,114,97,121,0,47,115,118,103,47,115,108,97,116,101,103,114,101,121,0,47,115,118,103,47,115,110,111,119,0,47,115,118,103,47,115,112,114,105,110,103,103,114,101,101,110,0,47,115,118,103,47,115,116,101,101,108,98,108,117,101,0,47,115,118,103,47,116,97,110,0,47,115,118,103,47,116,101,97,108,0,47,115,118,103,47,116,104,105,115,116,108,101,0,47,115,118,103,47,116,111,109,97,116,111,0,47,115,118,103,47,116,117,114,113,117,111,105,115,101,0,47,115,118,103,47,118,105,111,108,101,116,0,47,115,118,103,47,119,104,101,97,116,0,47,115,118,103,47,119,104,105,116,101,0,47,115,118,103,47,119,104,105,116,101,115,109,111,107,101,0,47,115,118,103,47,121,101,108,108,111,119,0,47,115,118,103,47,121,101,108,108,111,119,103,114,101,101,110,0,47,121,108,103,110,51,47,49,0,47,121,108,103,110,51,47,50,0,47,121,108,103,110,51,47,51,0,47,121,108,103,110,52,47,49,0,47,121,108,103,110,52,47,50,0,47,121,108,103,110,52,47,51,0,47,121,108,103,110,52,47,52,0,47,121,108,103,110,53,47,49,0,47,121,108,103,110,53,47,50,0,47,121,108,103,110,53,47,51,0,47,121,108,103,110,53,47,52,0,47,121,108,103,110,53,47,53,0,47,121,108,103,110,54,47,49,0,47,121,108,103,110,54,47,50,0,47,121,108,103,110,54,47,51,0,47,121,108,103,110,54,47,52,0,47,121,108,103,110,54,47,53,0,47,121,108,103,110,54,47,54,0,47,121,108,103,110,55,47,49,0,47,121,108,103,110,55,47,50,0,47,121,108,103,110,55,47,51,0,47,121,108,103,110,55,47,52,0,47,121,108,103,110,55,47,53,0,47,121,108,103,110,55,47,54,0,47,121,108,103,110,55,47,55,0,47,121,108,103,110,56,47,49,0,47,121,108,103,110,56,47,50,0,47,121,108,103,110,56,47,51,0,47,121,108,103,110,56,47,52,0,47,121,108,103,110,56,47,53,0,47,121,108,103,110,56,47,54,0,47,121,108,103,110,56,47,55,0,47,121,108,103,110,56,47,56,0,47,121,108,103,110,57,47,49,0,47,121,108,103,110,57,47,50,0,47,121,108,103,110,57,47,51,0,47,121,108,103,110,57,47,52,0,47,121,108,103,110,57,47,53,0,47,121,108,103,110,57,47,54,0,47,121,108,103,110,57,47,55,0,47,121,108,103,110,57,47,56,0,47,121,108,103,110,57,47,57,0,47,121,108,103,110,98,117,51,47,49,0,47,121,108,103,110,98,117,51,47,50,0,47,121,108,103,110,98,117,51,47,51,0,47,121,108,103,110,98,117,52,47,49,0,47,121,108,103,110,98,117,52,47,50,0,47,121,108,103,110,98,117,52,47,51,0,47,121,108,103,110,98,117,52,47,52,0,47,121,108,103,110,98,117,53,47,49,0,47,121,108,103,110,98,117,53,47,50,0,47,121,108,103,110,98,117,53,47,51,0,47,121,108,103,110,98,117,53,47,52,0,47,121,108,103,110,98,117,53,47,53,0,47,121,108,103,110,98,117,54,47,49,0,47,121,108,103,110,98,117,54,47,50,0,47,121,108,103,110,98,117,54,47,51,0,47,121,108,103,110,98,117,54,47,52,0,47,121,108,103,110,98,117,54,47,53,0,47,121,108,103,110,98,117,54,47,54,0,47,121,108,103,110,98,117,55,47,49,0,47,121,108,103,110,98,117,55,47,50,0,47,121,108,103,110,98,117,55,47,51,0,47,121,108,103,110,98,117,55,47,52,0,47,121,108,103,110,98,117,55,47,53,0,47,121,108,103,110,98,117,55,47,54,0,47,121,108,103,110,98,117,55,47,55,0,47,121,108,103,110,98,117,56,47,49,0,47,121,108,103,110,98,117,56,47,50,0,47,121,108,103,110,98,117,56,47,51,0,47,121,108,103,110,98,117,56,47,52,0,47,121,108,103,110,98,117,56,47,53,0,47,121,108,103,110,98,117,56,47,54,0,47,121,108,103,110,98,117,56,47,55,0,47,121,108,103,110,98,117,56,47,56,0,47,121,108,103,110,98,117,57,47,49,0,47,121,108,103,110,98,117,57,47,50,0,47,121,108,103,110,98,117,57,47,51,0,47,121,108,103,110,98,117,57,47,52,0,47,121,108,103,110,98,117,57,47,53,0,47,121,108,103,110,98,117,57,47,54,0,47,121,108,103,110,98,117,57,47,55,0,47,121,108,103,110,98,117,57,47,56,0,47,121,108,103,110,98,117,57,47,57,0,47,121,108,111,114,98,114,51,47,49,0,47,121,108,111,114,98,114,51,47,50,0,47,121,108,111,114,98,114,51,47,51,0,47,121,108,111,114,98,114,52,47,49,0,47,121,108,111,114,98,114,52,47,50,0,47,121,108,111,114,98,114,52,47,51,0,47,121,108,111,114,98,114,52,47,52,0,47,121,108,111,114,98,114,53,47,49,0,47,121,108,111,114,98,114,53,47,50,0,47,121,108,111,114,98,114,53,47,51,0,47,121,108,111,114,98,114,53,47,52,0,47,121,108,111,114,98,114,53,47,53,0,47,121,108,111,114,98,114,54,47,49,0,47,121,108,111,114,98,114,54,47,50,0,47,121,108,111,114,98,114,54,47,51,0,47,121,108,111,114,98,114,54,47,52,0,47,121,108,111,114,98,114,54,47,53,0,47,121,108,111,114,98,114,54,47,54,0,47,121,108,111,114,98,114,55,47,49,0,47,121,108,111,114,98,114,55,47,50,0,47,121,108,111,114,98,114,55,47,51,0,47,121,108,111,114,98,114,55,47,52,0,47,121,108,111,114,98,114,55,47,53,0,47,121,108,111,114,98,114,55,47,54,0,47,121,108,111,114,98,114,55,47,55,0,47,121,108,111,114,98,114,56,47,49,0,47,121,108,111,114,98,114,56,47,50,0,47,121,108,111,114,98,114,56,47,51,0,47,121,108,111,114,98,114,56,47,52,0,47,121,108,111,114,98,114,56,47,53,0,47,121,108,111,114,98,114,56,47,54,0,47,121,108,111,114,98,114,56,47,55,0,47,121,108,111,114,98,114,56,47,56,0,47,121,108,111,114,98,114,57,47,49,0,47,121,108,111,114,98,114,57,47,50,0,47,121,108,111,114,98,114,57,47,51,0,47,121,108,111,114,98,114,57,47,52,0,47,121,108,111,114,98,114,57,47,53,0,47,121,108,111,114,98,114,57,47,54,0,47,121,108,111,114,98,114,57,47,55,0,47,121,108,111,114,98,114,57,47,56,0,47,121,108,111,114,98,114,57,47,57,0,47,121,108,111,114,114,100,51,47,49,0,47,121,108,111,114,114,100,51,47,50,0,47,121,108,111,114,114,100,51,47,51,0,47,121,108,111,114,114,100,52,47,49,0,47,121,108,111,114,114,100,52,47,50,0,47,121,108,111,114,114,100,52,47,51,0,47,121,108,111,114,114,100,52,47,52,0,47,121,108,111,114,114,100,53,47,49,0,47,121,108,111,114,114,100,53,47,50,0,47,121,108,111,114,114,100,53,47,51,0,47,121,108,111,114,114,100,53,47,52,0,47,121,108,111,114,114,100,53,47,53,0,47,121,108,111,114,114,100,54,47,49,0,47,121,108,111,114,114,100,54,47,50,0,47,121,108,111,114,114,100,54,47,51,0,47,121,108,111,114,114,100,54,47,52,0,47,121,108,111,114,114,100,54,47,53,0,47,121,108,111,114,114,100,54,47,54,0,47,121,108,111,114,114,100,55,47,49,0,47,121,108,111,114,114,100,55,47,50,0,47,121,108,111,114,114,100,55,47,51,0,47,121,108,111,114,114,100,55,47,52,0,47,121,108,111,114,114,100,55,47,53,0,47,121,108,111,114,114,100,55,47,54,0,47,121,108,111,114,114,100,55,47,55,0,47,121,108,111,114,114,100,56,47,49,0,47,121,108,111,114,114,100,56,47,50,0,47,121,108,111,114,114,100,56,47,51,0,47,121,108,111,114,114,100,56,47,52,0,47,121,108,111,114,114,100,56,47,53,0,47,121,108,111,114,114,100,56,47,54,0,47,121,108,111,114,114,100,56,47,55,0,47,121,108,111,114,114,100,56,47,56,0,47,121,108,111,114,114,100,57,47,49,0,47,121,108,111,114,114,100,57,47,50,0,47,121,108,111,114,114,100,57,47,51,0,47,121,108,111,114,114,100,57,47,52,0,47,121,108,111,114,114,100,57,47,53,0,47,121,108,111,114,114,100,57,47,54,0,47,121,108,111,114,114,100,57,47,55,0,47,121,108,111,114,114,100,57,47,56,0,47,121,108,111,114,114,100,57,47,57,0,97,108,105,99,101,98,108,117,101,0,97,110,116,105,113,117,101,119,104,105,116,101,0,97,110,116,105,113,117,101,119,104,105,116,101,49,0,97,110,116,105,113,117,101,119,104,105,116,101,50,0,97,110,116,105,113,117,101,119,104,105,116,101,51,0,97,110,116,105,113,117,101,119,104,105,116,101,52,0,97,113,117,97,109,97,114,105,110,101,0,97,113,117,97,109,97,114,105,110,101,49,0,97,113,117,97,109,97,114,105,110,101,50,0,97,113,117,97,109,97,114,105,110,101,51,0,97,113,117,97,109,97,114,105,110,101,52,0,97,122,117,114,101,0,97,122,117,114,101,49,0,97,122,117,114,101,50,0,97,122,117,114,101,51,0,97,122,117,114,101,52,0,98,101,105,103,101,0,98,105,115,113,117,101,0,98,105,115,113,117,101,49,0,98,105,115,113,117,101,50,0,98,105,115,113,117,101,51,0,98,105,115,113,117,101,52,0,98,108,97,110,99,104,101,100,97,108,109,111,110,100,0,98,108,117,101,0,98,108,117,101,49,0,98,108,117,101,50,0,98,108,117,101,51,0,98,108,117,101,52,0,98,108,117,101,118,105,111,108,101,116,0,98,114,111,119,110,0,98,114,111,119,110,49,0,98,114,111,119,110,50,0,98,114,111,119,110,51,0,98,114,111,119,110,52,0,98,117,114,108,121,119,111,111,100,0,98,117,114,108,121,119,111,111,100,49,0,98,117,114,108,121,119,111,111,100,50,0,98,117,114,108,121,119,111,111,100,51,0,98,117,114,108,121,119,111,111,100,52,0,99,97,100,101,116,98,108,117,101,0,99,97,100,101,116,98,108,117,101,49,0,99,97,100,101,116,98,108,117,101,50,0,99,97,100,101,116,98,108,117,101,51,0,99,97,100,101,116,98,108,117,101,52,0,99,104,97,114,116,114,101,117,115,101,0,99,104,97,114,116,114,101,117,115,101,49,0,99,104,97,114,116,114,101,117,115,101,50,0,99,104,97,114,116,114,101,117,115,101,51,0,99,104,97,114,116,114,101,117,115,101,52,0,99,104,111,99,111,108,97,116,101,0,99,104,111,99,111,108,97,116,101,49,0,99,104,111,99,111,108,97,116,101,50,0,99,104,111,99,111,108,97,116,101,51,0,99,104,111,99,111,108,97,116,101,52,0,99,111,114,97,108,0,99,111,114,97,108,49,0,99,111,114,97,108,50,0,99,111,114,97,108,51,0,99,111,114,97,108,52,0,99,111,114,110,102,108,111,119,101,114,98,108,117,101,0,99,111,114,110,115,105,108,107,0,99,111,114,110,115,105,108,107,49,0,99,111,114,110,115,105,108,107,50,0,99,111,114,110,115,105,108,107,51,0,99,111,114,110,115,105,108,107,52,0,99,114,105,109,115,111,110,0,99,121,97,110,0,99,121,97,110,49,0,99,121,97,110,50,0,99,121,97,110,51,0,99,121,97,110,52,0,100,97,114,107,103,111,108,100,101,110,114,111,100,0,100,97,114,107,103,111,108,100,101,110,114,111,100,49,0,100,97,114,107,103,111,108,100,101,110,114,111,100,50,0,100,97,114,107,103,111,108,100,101,110,114,111,100,51,0,100,97,114,107,103,111,108,100,101,110,114,111,100,52,0,100,97,114,107,103,114,101,101,110,0,100,97,114,107,107,104,97,107,105,0,100,97,114,107,111,108,105,118,101,103,114,101,101,110,0,100,97,114,107,111,108,105,118,101,103,114,101,101,110,49,0,100,97,114,107,111,108,105,118,101,103,114,101,101,110,50,0,100,97,114,107,111,108,105,118,101,103,114,101,101,110,51,0,100,97,114,107,111,108,105,118,101,103,114,101,101,110,52,0,100,97,114,107,111,114,97,110,103,101,0,100,97,114,107,111,114,97,110,103,101,49,0,100,97,114,107,111,114,97,110,103,101,50,0,100,97,114,107,111,114,97,110,103,101,51,0,100,97,114,107,111,114,97,110,103,101,52,0,100,97,114,107,111,114,99,104,105,100,0,100,97,114,107,111,114,99,104,105,100,49,0,100,97,114,107,111,114,99,104,105,100,50,0,100,97,114,107,111,114,99,104,105,100,51,0,100,97,114,107,111,114,99,104,105,100,52,0,100,97,114,107,115,97,108,109,111,110,0,100,97,114,107,115,101,97,103,114,101,101,110,0,100,97,114,107,115,101,97,103,114,101,101,110,49,0,100,97,114,107,115,101,97,103,114,101,101,110,50,0,100,97,114,107,115,101,97,103,114,101,101,110,51,0,100,97,114,107,115,101,97,103,114,101,101,110,52,0,100,97,114,107,115,108,97,116,101,98,108,117,101,0,100,97,114,107,115,108,97,116,101,103,114,97,121,0,100,97,114,107,115,108,97,116,101,103,114,97,121,49,0,100,97,114,107,115,108,97,116,101,103,114,97,121,50,0,100,97,114,107,115,108,97,116,101,103,114,97,121,51,0,100,97,114,107,115,108,97,116,101,103,114,97,121,52,0,100,97,114,107,115,108,97,116,101,103,114,101,121,0,100,97,114,107,116,117,114,113,117,111,105,115,101,0,100,97,114,107,118,105,111,108,101,116,0,100,101,101,112,112,105,110,107,0,100,101,101,112,112,105,110,107,49,0,100,101,101,112,112,105,110,107,50,0,100,101,101,112,112,105,110,107,51,0,100,101,101,112,112,105,110,107,52,0,100,101,101,112,115,107,121,98,108,117,101,0,100,101,101,112,115,107,121,98,108,117,101,49,0,100,101,101,112,115,107,121,98,108,117,101,50,0,100,101,101,112,115,107,121,98,108,117,101,51,0,100,101,101,112,115,107,121,98,108,117,101,52,0,100,105,109,103,114,97,121,0,100,105,109,103,114,101,121,0,100,111,100,103,101,114,98,108,117,101,0,100,111,100,103,101,114,98,108,117,101,49,0,100,111,100,103,101,114,98,108,117,101,50,0,100,111,100,103,101,114,98,108,117,101,51,0,100,111,100,103,101,114,98,108,117,101,52,0,102,105,114,101,98,114,105,99,107,0,102,105,114,101,98,114,105,99,107,49,0,102,105,114,101,98,114,105,99,107,50,0,102,105,114,101,98,114,105,99,107,51,0,102,105,114,101,98,114,105,99,107,52,0,102,108,111,114,97,108,119,104,105,116,101,0,102,111,114,101,115,116,103,114,101,101,110,0,103,97,105,110,115,98,111,114,111,0,103,104,111,115,116,119,104,105,116,101,0,103,111,108,100,0,103,111,108,100,49,0,103,111,108,100,50,0,103,111,108,100,51,0,103,111,108,100,52,0,103,111,108,100,101,110,114,111,100,0,103,111,108,100,101,110,114,111,100,49,0,103,111,108,100,101,110,114,111,100,50,0,103,111,108,100,101,110,114,111,100,51,0,103,111,108,100,101,110,114,111,100,52,0,103,114,97,121,0,103,114,97,121,48,0,103,114,97,121,49,0,103,114,97,121,49,48,0,103,114,97,121,49,48,48,0,103,114,97,121,49,49,0,103,114,97,121,49,50,0,103,114,97,121,49,51,0,103,114,97,121,49,52,0,103,114,97,121,49,53,0,103,114,97,121,49,54,0,103,114,97,121,49,55,0,103,114,97,121,49,56,0,103,114,97,121,49,57,0,103,114,97,121,50,0,103,114,97,121,50,48,0,103,114,97,121,50,49,0,103,114,97,121,50,50],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+122904);allocate([103,114,97,121,50,51,0,103,114,97,121,50,52,0,103,114,97,121,50,53,0,103,114,97,121,50,54,0,103,114,97,121,50,55,0,103,114,97,121,50,56,0,103,114,97,121,50,57,0,103,114,97,121,51,0,103,114,97,121,51,48,0,103,114,97,121,51,49,0,103,114,97,121,51,50,0,103,114,97,121,51,51,0,103,114,97,121,51,52,0,103,114,97,121,51,53,0,103,114,97,121,51,54,0,103,114,97,121,51,55,0,103,114,97,121,51,56,0,103,114,97,121,51,57,0,103,114,97,121,52,0,103,114,97,121,52,48,0,103,114,97,121,52,49,0,103,114,97,121,52,50,0,103,114,97,121,52,51,0,103,114,97,121,52,52,0,103,114,97,121,52,53,0,103,114,97,121,52,54,0,103,114,97,121,52,55,0,103,114,97,121,52,56,0,103,114,97,121,52,57,0,103,114,97,121,53,0,103,114,97,121,53,48,0,103,114,97,121,53,49,0,103,114,97,121,53,50,0,103,114,97,121,53,51,0,103,114,97,121,53,52,0,103,114,97,121,53,53,0,103,114,97,121,53,54,0,103,114,97,121,53,55,0,103,114,97,121,53,56,0,103,114,97,121,53,57,0,103,114,97,121,54,0,103,114,97,121,54,48,0,103,114,97,121,54,49,0,103,114,97,121,54,50,0,103,114,97,121,54,51,0,103,114,97,121,54,52,0,103,114,97,121,54,53,0,103,114,97,121,54,54,0,103,114,97,121,54,55,0,103,114,97,121,54,56,0,103,114,97,121,54,57,0,103,114,97,121,55,0,103,114,97,121,55,48,0,103,114,97,121,55,49,0,103,114,97,121,55,50,0,103,114,97,121,55,51,0,103,114,97,121,55,52,0,103,114,97,121,55,53,0,103,114,97,121,55,54,0,103,114,97,121,55,55,0,103,114,97,121,55,56,0,103,114,97,121,55,57,0,103,114,97,121,56,0,103,114,97,121,56,48,0,103,114,97,121,56,49,0,103,114,97,121,56,50,0,103,114,97,121,56,51,0,103,114,97,121,56,52,0,103,114,97,121,56,53,0,103,114,97,121,56,54,0,103,114,97,121,56,55,0,103,114,97,121,56,56,0,103,114,97,121,56,57,0,103,114,97,121,57,0,103,114,97,121,57,48,0,103,114,97,121,57,49,0,103,114,97,121,57,50,0,103,114,97,121,57,51,0,103,114,97,121,57,52,0,103,114,97,121,57,53,0,103,114,97,121,57,54,0,103,114,97,121,57,55,0,103,114,97,121,57,56,0,103,114,97,121,57,57,0,103,114,101,101,110,0,103,114,101,101,110,49,0,103,114,101,101,110,50,0,103,114,101,101,110,51,0,103,114,101,101,110,52,0,103,114,101,101,110,121,101,108,108,111,119,0,103,114,101,121,0,103,114,101,121,48,0,103,114,101,121,49,0,103,114,101,121,49,48,0,103,114,101,121,49,48,48,0,103,114,101,121,49,49,0,103,114,101,121,49,50,0,103,114,101,121,49,51,0,103,114,101,121,49,52,0,103,114,101,121,49,53,0,103,114,101,121,49,54,0,103,114,101,121,49,55,0,103,114,101,121,49,56,0,103,114,101,121,49,57,0,103,114,101,121,50,0,103,114,101,121,50,48,0,103,114,101,121,50,49,0,103,114,101,121,50,50,0,103,114,101,121,50,51,0,103,114,101,121,50,52,0,103,114,101,121,50,53,0,103,114,101,121,50,54,0,103,114,101,121,50,55,0,103,114,101,121,50,56,0,103,114,101,121,50,57,0,103,114,101,121,51,0,103,114,101,121,51,48,0,103,114,101,121,51,49,0,103,114,101,121,51,50,0,103,114,101,121,51,51,0,103,114,101,121,51,52,0,103,114,101,121,51,53,0,103,114,101,121,51,54,0,103,114,101,121,51,55,0,103,114,101,121,51,56,0,103,114,101,121,51,57,0,103,114,101,121,52,0,103,114,101,121,52,48,0,103,114,101,121,52,49,0,103,114,101,121,52,50,0,103,114,101,121,52,51,0,103,114,101,121,52,52,0,103,114,101,121,52,53,0,103,114,101,121,52,54,0,103,114,101,121,52,55,0,103,114,101,121,52,56,0,103,114,101,121,52,57,0,103,114,101,121,53,0,103,114,101,121,53,48,0,103,114,101,121,53,49,0,103,114,101,121,53,50,0,103,114,101,121,53,51,0,103,114,101,121,53,52,0,103,114,101,121,53,53,0,103,114,101,121,53,54,0,103,114,101,121,53,55,0,103,114,101,121,53,56,0,103,114,101,121,53,57,0,103,114,101,121,54,0,103,114,101,121,54,48,0,103,114,101,121,54,49,0,103,114,101,121,54,50,0,103,114,101,121,54,51,0,103,114,101,121,54,52,0,103,114,101,121,54,53,0,103,114,101,121,54,54,0,103,114,101,121,54,55,0,103,114,101,121,54,56,0,103,114,101,121,54,57,0,103,114,101,121,55,0,103,114,101,121,55,48,0,103,114,101,121,55,49,0,103,114,101,121,55,50,0,103,114,101,121,55,51,0,103,114,101,121,55,52,0,103,114,101,121,55,53,0,103,114,101,121,55,54,0,103,114,101,121,55,55,0,103,114,101,121,55,56,0,103,114,101,121,55,57,0,103,114,101,121,56,0,103,114,101,121,56,48,0,103,114,101,121,56,49,0,103,114,101,121,56,50,0,103,114,101,121,56,51,0,103,114,101,121,56,52,0,103,114,101,121,56,53,0,103,114,101,121,56,54,0,103,114,101,121,56,55,0,103,114,101,121,56,56,0,103,114,101,121,56,57,0,103,114,101,121,57,0,103,114,101,121,57,48,0,103,114,101,121,57,49,0,103,114,101,121,57,50,0,103,114,101,121,57,51,0,103,114,101,121,57,52,0,103,114,101,121,57,53,0,103,114,101,121,57,54,0,103,114,101,121,57,55,0,103,114,101,121,57,56,0,103,114,101,121,57,57,0,104,111,110,101,121,100,101,119,0,104,111,110,101,121,100,101,119,49,0,104,111,110,101,121,100,101,119,50,0,104,111,110,101,121,100,101,119,51,0,104,111,110,101,121,100,101,119,52,0,104,111,116,112,105,110,107,0,104,111,116,112,105,110,107,49,0,104,111,116,112,105,110,107,50,0,104,111,116,112,105,110,107,51,0,104,111,116,112,105,110,107,52,0,105,110,100,105,97,110,114,101,100,0,105,110,100,105,97,110,114,101,100,49,0,105,110,100,105,97,110,114,101,100,50,0,105,110,100,105,97,110,114,101,100,51,0,105,110,100,105,97,110,114,101,100,52,0,105,110,100,105,103,111,0,105,110,118,105,115,0,105,118,111,114,121,0,105,118,111,114,121,49,0,105,118,111,114,121,50,0,105,118,111,114,121,51,0,105,118,111,114,121,52,0,107,104,97,107,105,0,107,104,97,107,105,49,0,107,104,97,107,105,50,0,107,104,97,107,105,51,0,107,104,97,107,105,52,0,108,97,118,101,110,100,101,114,0,108,97,118,101,110,100,101,114,98,108,117,115,104,0,108,97,118,101,110,100,101,114,98,108,117,115,104,49,0,108,97,118,101,110,100,101,114,98,108,117,115,104,50,0,108,97,118,101,110,100,101,114,98,108,117,115,104,51,0,108,97,118,101,110,100,101,114,98,108,117,115,104,52,0,108,97,119,110,103,114,101,101,110,0,108,101,109,111,110,99,104,105,102,102,111,110,0,108,101,109,111,110,99,104,105,102,102,111,110,49,0,108,101,109,111,110,99,104,105,102,102,111,110,50,0,108,101,109,111,110,99,104,105,102,102,111,110,51,0,108,101,109,111,110,99,104,105,102,102,111,110,52,0,108,105,103,104,116,98,108,117,101,0,108,105,103,104,116,98,108,117,101,49,0,108,105,103,104,116,98,108,117,101,50,0,108,105,103,104,116,98,108,117,101,51,0,108,105,103,104,116,98,108,117,101,52,0,108,105,103,104,116,99,111,114,97,108,0,108,105,103,104,116,99,121,97,110,0,108,105,103,104,116,99,121,97,110,49,0,108,105,103,104,116,99,121,97,110,50,0,108,105,103,104,116,99,121,97,110,51,0,108,105,103,104,116,99,121,97,110,52,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,49,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,50,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,51,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,52,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,121,101,108,108,111,119,0,108,105,103,104,116,103,114,97,121,0,108,105,103,104,116,103,114,101,121,0,108,105,103,104,116,112,105,110,107,0,108,105,103,104,116,112,105,110,107,49,0,108,105,103,104,116,112,105,110,107,50,0,108,105,103,104,116,112,105,110,107,51,0,108,105,103,104,116,112,105,110,107,52,0,108,105,103,104,116,115,97,108,109,111,110,0,108,105,103,104,116,115,97,108,109,111,110,49,0,108,105,103,104,116,115,97,108,109,111,110,50,0,108,105,103,104,116,115,97,108,109,111,110,51,0,108,105,103,104,116,115,97,108,109,111,110,52,0,108,105,103,104,116,115,101,97,103,114,101,101,110,0,108,105,103,104,116,115,107,121,98,108,117,101,0,108,105,103,104,116,115,107,121,98,108,117,101,49,0,108,105,103,104,116,115,107,121,98,108,117,101,50,0,108,105,103,104,116,115,107,121,98,108,117,101,51,0,108,105,103,104,116,115,107,121,98,108,117,101,52,0,108,105,103,104,116,115,108,97,116,101,98,108,117,101,0,108,105,103,104,116,115,108,97,116,101,103,114,97,121,0,108,105,103,104,116,115,108,97,116,101,103,114,101,121,0,108,105,103,104,116,115,116,101,101,108,98,108,117,101,0,108,105,103,104,116,115,116,101,101,108,98,108,117,101,49,0,108,105,103,104,116,115,116,101,101,108,98,108,117,101,50,0,108,105,103,104,116,115,116,101,101,108,98,108,117,101,51,0,108,105,103,104,116,115,116,101,101,108,98,108,117,101,52,0,108,105,103,104,116,121,101,108,108,111,119,0,108,105,103,104,116,121,101,108,108,111,119,49,0,108,105,103,104,116,121,101,108,108,111,119,50,0,108,105,103,104,116,121,101,108,108,111,119,51,0,108,105,103,104,116,121,101,108,108,111,119,52,0,108,105,109,101,103,114,101,101,110,0,108,105,110,101,110,0,109,97,103,101,110,116,97,0,109,97,103,101,110,116,97,49,0,109,97,103,101,110,116,97,50,0,109,97,103,101,110,116,97,51,0,109,97,103,101,110,116,97,52,0,109,97,114,111,111,110,0,109,97,114,111,111,110,49,0,109,97,114,111,111,110,50,0,109,97,114,111,111,110,51,0,109,97,114,111,111,110,52,0,109,101,100,105,117,109,97,113,117,97,109,97,114,105,110,101,0,109,101,100,105,117,109,98,108,117,101,0,109,101,100,105,117,109,111,114,99,104,105,100,0,109,101,100,105,117,109,111,114,99,104,105,100,49,0,109,101,100,105,117,109,111,114,99,104,105,100,50,0,109,101,100,105,117,109,111,114,99,104,105,100,51,0,109,101,100,105,117,109,111,114,99,104,105,100,52,0,109,101,100,105,117,109,112,117,114,112,108,101,0,109,101,100,105,117,109,112,117,114,112,108,101,49,0,109,101,100,105,117,109,112,117,114,112,108,101,50,0,109,101,100,105,117,109,112,117,114,112,108,101,51,0,109,101,100,105,117,109,112,117,114,112,108,101,52,0,109,101,100,105,117,109,115,101,97,103,114,101,101,110,0,109,101,100,105,117,109,115,108,97,116,101,98,108,117,101,0,109,101,100,105,117,109,115,112,114,105,110,103,103,114,101,101,110,0,109,101,100,105,117,109,116,117,114,113,117,111,105,115,101,0,109,101,100,105,117,109,118,105,111,108,101,116,114,101,100,0,109,105,100,110,105,103,104,116,98,108,117,101,0,109,105,110,116,99,114,101,97,109,0,109,105,115,116,121,114,111,115,101,0,109,105,115,116,121,114,111,115,101,49,0,109,105,115,116,121,114,111,115,101,50,0,109,105,115,116,121,114,111,115,101,51,0,109,105,115,116,121,114,111,115,101,52,0,109,111,99,99,97,115,105,110,0,110,97,118,97,106,111,119,104,105,116,101,0,110,97,118,97,106,111,119,104,105,116,101,49,0,110,97,118,97,106,111,119,104,105,116,101,50,0,110,97,118,97,106,111,119,104,105,116,101,51,0,110,97,118,97,106,111,119,104,105,116,101,52,0,110,97,118,121,0,110,97,118,121,98,108,117,101,0,110,111,110,101,0,111,108,100,108,97,99,101,0,111,108,105,118,101,100,114,97,98,0,111,108,105,118,101,100,114,97,98,49,0,111,108,105,118,101,100,114,97,98,50,0,111,108,105,118,101,100,114,97,98,51,0,111,108,105,118,101,100,114,97,98,52,0,111,114,97,110,103,101,0,111,114,97,110,103,101,49,0,111,114,97,110,103,101,50,0,111,114,97,110,103,101,51,0,111,114,97,110,103,101,52,0,111,114,97,110,103,101,114,101,100,0,111,114,97,110,103,101,114,101,100,49,0,111,114,97,110,103,101,114,101,100,50,0,111,114,97,110,103,101,114,101,100,51,0,111,114,97,110,103,101,114,101,100,52,0,111,114,99,104,105,100,0,111,114,99,104,105,100,49,0,111,114,99,104,105,100,50,0,111,114,99,104,105,100,51,0,111,114,99,104,105,100,52,0,112,97,108,101,103,111,108,100,101,110,114,111,100,0,112,97,108,101,103,114,101,101,110,0,112,97,108,101,103,114,101,101,110,49,0,112,97,108,101,103,114,101,101,110,50,0,112,97,108,101,103,114,101,101,110,51,0,112,97,108,101,103,114,101,101,110,52,0,112,97,108,101,116,117,114,113,117,111,105,115,101,0,112,97,108,101,116,117,114,113,117,111,105,115,101,49,0,112,97,108,101,116,117,114,113,117,111,105,115,101,50,0,112,97,108,101,116,117,114,113,117,111,105,115,101,51,0,112,97,108,101,116,117,114,113,117,111,105,115,101,52,0,112,97,108,101,118,105,111,108,101,116,114,101,100,0,112,97,108,101,118,105,111,108,101,116,114,101,100,49,0,112,97,108,101,118,105,111,108,101,116,114,101,100,50,0,112,97,108,101,118,105,111,108,101,116,114,101,100,51,0,112,97,108,101,118,105,111,108,101,116,114,101,100,52,0,112,97,112,97,121,97,119,104,105,112,0,112,101,97,99,104,112,117,102,102,0,112,101,97,99,104,112,117,102,102,49,0,112,101,97,99,104,112,117,102,102,50,0,112,101,97,99,104,112,117,102,102,51,0,112,101,97,99,104,112,117,102,102,52,0,112,101,114,117,0,112,105,110,107,0,112,105,110,107,49,0,112,105,110,107,50,0,112,105,110,107,51,0,112,105,110,107,52,0,112,108,117,109,0,112,108,117,109,49,0,112,108,117,109,50,0,112,108,117,109,51,0,112,108,117,109,52,0,112,111,119,100,101,114,98,108,117,101,0,112,117,114,112,108,101,0,112,117,114,112,108,101,49,0,112,117,114,112,108,101,50,0,112,117,114,112,108,101,51,0,112,117,114,112,108,101,52,0,114,101,100,0,114,101,100,49,0,114,101,100,50,0,114,101,100,51,0,114,101,100,52,0,114,111,115,121,98,114,111,119,110,0,114,111,115,121,98,114,111,119,110,49,0,114,111,115,121,98,114,111,119,110,50,0,114,111,115,121,98,114,111,119,110,51,0,114,111,115,121,98,114,111,119,110,52,0,114,111,121,97,108,98,108,117,101,0,114,111,121,97,108,98,108,117,101,49,0,114,111,121,97,108,98,108,117,101,50,0,114,111,121,97,108,98,108,117,101,51,0,114,111,121,97,108,98,108,117,101,52,0,115,97,100,100,108,101,98,114,111,119,110,0,115,97,108,109,111,110,0,115,97,108,109,111,110,49,0,115,97,108,109,111,110,50,0,115,97,108,109,111,110,51,0,115,97,108,109,111,110,52,0,115,97,110,100,121,98,114,111,119,110,0,115,101,97,103,114,101,101,110,0,115,101,97,103,114,101,101,110,49,0,115,101,97,103,114,101,101,110,50,0,115,101,97,103,114,101,101,110,51,0,115,101,97,103,114,101,101,110,52,0,115,101,97,115,104,101,108,108,0,115,101,97,115,104,101,108,108,49,0,115,101,97,115,104,101,108,108,50,0,115,101,97,115,104,101,108,108,51,0,115,101,97,115,104,101,108,108,52,0,115,105,101,110,110,97,0,115,105,101,110,110,97,49,0,115,105,101,110,110,97,50,0,115,105,101,110,110,97,51,0,115,105,101,110,110,97,52,0,115,107,121,98,108,117,101,0,115,107,121,98,108,117,101,49,0,115,107,121,98,108,117,101,50,0,115,107,121,98,108,117,101,51,0,115,107,121,98,108,117,101,52,0,115,108,97,116,101,98,108,117,101,0,115,108,97,116,101,98,108,117,101,49,0,115,108,97,116,101,98,108,117,101,50,0,115,108,97,116,101,98,108,117,101,51,0,115,108,97,116,101,98,108,117,101,52,0,115,108,97,116,101,103,114,97,121,0,115,108,97,116,101,103,114,97,121,49,0,115,108,97,116,101,103,114,97,121,50,0,115,108,97,116,101,103,114,97,121,51,0,115,108,97,116,101,103,114,97,121,52,0,115,108,97,116,101,103,114,101,121,0,115,110,111,119,0,115,110,111,119,49,0,115,110,111,119,50,0,115,110,111,119,51,0,115,110,111,119,52,0,115,112,114,105,110,103,103,114,101,101,110,0,115,112,114,105,110,103,103,114,101,101,110,49,0,115,112,114,105,110,103,103,114,101,101,110,50,0,115,112,114,105,110,103,103,114,101,101,110,51,0,115,112,114,105,110,103,103,114,101,101,110,52,0,115,116,101,101,108,98,108,117,101,0,115,116,101,101,108,98,108,117,101,49,0,115,116,101,101,108,98,108,117,101,50,0,115,116,101,101,108,98,108,117,101,51,0,115,116,101,101,108,98,108,117,101,52,0,116,97,110,0,116,97,110,49,0,116,97,110,50,0,116,97,110,51,0,116,97,110,52,0,116,104,105,115,116,108,101,0,116,104,105,115,116,108,101,49,0,116,104,105,115,116,108,101,50,0,116,104,105,115,116,108,101,51,0,116,104,105,115,116,108,101,52,0,116,111,109,97,116,111,0,116,111,109,97,116,111,49,0,116,111,109,97,116,111,50,0,116,111,109,97,116,111,51,0,116,111,109,97,116,111,52,0,116,117,114,113,117,111,105,115,101,0,116,117,114,113,117,111,105,115,101,49,0,116,117,114,113,117,111,105,115,101,50,0,116,117,114,113,117,111,105,115,101,51,0,116,117,114,113,117,111,105,115,101,52,0,118,105,111,108,101,116,0,118,105,111,108,101,116,114,101,100,0,118,105,111,108,101,116,114,101,100,49,0,118,105,111,108,101,116,114,101,100,50,0,118,105,111,108,101,116,114,101,100,51,0,118,105,111,108,101,116,114,101,100,52,0,119,104,101,97,116,0,119,104,101,97,116,49,0,119,104,101,97,116,50,0,119,104,101,97,116,51,0,119,104,101,97,116,52,0,119,104,105,116,101,0,119,104,105,116,101,115,109,111,107,101,0,121,101,108,108,111,119,0,121,101,108,108,111,119,49,0,121,101,108,108,111,119,50,0,121,101,108,108,111,119,51,0,121,101,108,108,111,119,52,0,121,101,108,108,111,119,103,114,101,101,110,0,108,97,99,107,0,104,105,116,101,0,105,103,104,116,103,114,101,121,0,88,49,49,47,0,47,37,115,47,37,115,0,105,109,97,103,101,115,99,97,108,101,0,102,97,108,115,101,0,98,108,97,99,107,0,100,111,116,116,101,100,0,100,97,115,104,101,100,0,99,112,45,62,115,114,99,0,104,116,109,108,116,97,98,108,101,46,99,0,101,109,105,116,95,104,116,109,108,95,105,109,103,0,99,112,45,62,115,114,99,91,48,93,0,116,114,97,110,115,112,97,114,101,110,116,0,95,37,100,0,37,100,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,49,48,0,49,49,0,49,50,0,49,51,0,49,52,0,49,53,0,49,54,0,49,55,0,49,56,0,49,57,0,50,48,0,65,103,110,111,100,101,105,110,102,111,95,116,0,65,103,101,100,103,101,105,110,102,111,95,116,0,114,111,119,103,0,99,111,108,103,0,65,103,114,97,112,104,105,110,102,111,95,116,0,100,101,108,120,32,62,61,32,48,0,112,111,115,95,104,116,109,108,95,116,98,108,0,100,101,108,121,32,62,61,32,48,0,116,97,98,108,101,32,115,105,122,101,32,116,111,111,32,115,109,97,108,108,32,102,111,114,32,99,111,110,116,101,110,116,10,0,102,105,120,101,100,32,116,97,98,108,101,32,115,105,122,101,32,119,105,116,104,32,117,110,115,112,101,99,105,102,105,101,100,32,119,105,100,116,104,32,111,114,32,104,101,105,103,104,116,10,0,99,101,108,108,32,115,105,122,101,32,116,111,111,32,115,109,97,108,108,32,102,111,114,32,99,111,110,116,101,110,116,10,0,102,105,120,101,100,32,99,101,108,108,32,115,105,122,101,32,119,105,116,104,32,117,110,115,112,101,99,105,102,105,101,100,32,119,105,100,116,104,32,111,114,32,104,101,105,103,104,116,10,0,78,111,32,111,114,32,105,109,112,114,111,112,101,114,32,105,109,97,103,101,32,102,105,108,101,61,34,37,115,34,10,0,112,101,110,99,111,108,111,114,0,45,62,0,102,80,81,46,99,0,80,81,99,104,101,99,107,0,72,101,97,112,32,111,118,101,114,102,108,111,119,10,0,37,33,80,83,45,65,100,111,98,101,45,50,46,48,10,47,110,111,100,101,32,123,10,32,32,47,89,32,101,120,99,104,32,100,101,102,10,32,32,47,88,32,101,120,99,104,32,100,101,102,10,32,32,47,121,32,101,120,99,104,32,100,101,102,10,32,32,47,120,32,101,120,99,104,32,100,101,102,10,32,32,110,101,119,112,97,116,104,10,32,32,120,32,121,32,109,111,118,101,116,111,10,32,32,120,32,89,32,108,105,110,101,116,111,10,32,32,88,32,89,32,108,105,110,101,116,111,10,32,32,88,32,121,32,108,105,110,101,116,111,10,32,32,99,108,111,115,101,112,97,116,104,32,102,105,108,108,10,125,32,100,101,102,10,47,99,101,108,108,32,123,10,32,32,47,89,32,101,120,99,104,32,100,101,102,10,32,32,47,88,32,101,120,99,104,32,100,101,102,10,32,32,47,121,32,101,120,99,104,32,100,101,102,10,32,32,47,120,32,101,120,99,104,32,100,101,102,10,32,32,110,101,119,112,97,116,104,10,32,32,120,32,121,32,109,111,118,101,116,111,10,32,32,120,32,89,32,108,105,110,101,116,111,10,32,32,88,32,89,32,108,105,110,101,116,111,10,32,32,88,32,121,32,108,105,110,101,116,111,10,32,32,99,108,111,115,101,112,97,116,104,32,115,116,114,111,107,101,10,125,32,100,101,102,10,0,115,104,111,119,112,97,103,101,10,0,102,97,105,108,101,100,32,97,116,32,110,111,100,101,32,37,100,91,48,93,10,0,110,112,45,62,99,101,108,108,115,91,48,93,0,109,97,122,101,46,99,0,99,104,107,83,103,114,97,112,104,0,102,97,105,108,101,100,32,97,116,32,110,111,100,101,32,37,100,91,49,93,10,0,110,112,45,62,99,101,108,108,115,91,49,93,0,100,105,116,101,109,115,0,102,105,110,100,83,86,101,114,116,0,37,37,37,37,80,97,103,101,58,32,49,32,49,10,37,37,37,37,80,97,103,101,66,111,117,110,100,105,110,103,66,111,120,58,32,37,100,32,37,100,32,37,100,32,37,100,10,0,37,102,32,37,102,32,116,114,97,110,115,108,97,116,101,10,0,48,32,48,32,49,32,115,101,116,114,103,98,99,111,108,111,114,10,0,37,102,32,37,102,32,37,102,32,37,102,32,110,111,100,101,10,0,48,32,48,32,48,32,115,101,116,114,103,98,99,111,108,111,114,10,0,37,102,32,37,102,32,37,102,32,37,102,32,99,101,108,108,10,0,49,32,48,32,48,32,115,101,116,114,103,98,99,111,108,111,114,10,0,117,110,101,120,112,101,99,116,101,100,32,99,97,115,101,32,105,110,32,108,111,99,97,116,101,95,101,110,100,112,111,105,110,116,10,0,48,0,116,114,97,112,101,122,111,105,100,46,99,0,108,111,99,97,116,101,95,101,110,100,112,111,105,110,116,0,97,100,100,95,115,101,103,109,101,110,116,58,32,101,114,114,111,114,10,0,110,101,119,110,111,100,101,58,32,81,117,101,114,121,45,116,97,98,108,101,32,111,118,101,114,102,108,111,119,10,0,110,101,119,110,111,100,101,0,110,101,119,116,114,97,112,58,32,84,114,97,112,101,122,111,105,100,45,116,97,98,108,101,32,111,118,101,114,102,108,111,119,32,37,100,10,0,110,101,119,116,114,97,112,0,105,110,100,101,120,46,99,0,82,84,114,101,101,83,101,97,114,99,104,0,110,45,62,108,101,118,101,108,32,62,61,32,48,0,82,84,114,101,101,73,110,115,101,114,116,0,108,101,118,101,108,32,62,61,32,48,32,38,38,32,108,101,118,101,108,32,60,61,32,40,42,110,41,45,62,108,101,118,101,108,0,114,45,62,98,111,117,110,100,97,114,121,91,105,93,32,60,61,32,114,45,62,98,111,117,110,100,97,114,121,91,78,85,77,68,73,77,83,32,43,32,105,93,0,114,32,38,38,32,110,32,38,38,32,110,101,119,0,82,84,114,101,101,73,110,115,101,114,116,50,0,108,101,118,101,108,32,62,61,32,48,32,38,38,32,108,101,118,101,108,32,60,61,32,110,45,62,108,101,118,101,108,0,70,65,76,83,69,0,110,111,100,101,46,99,0,78,111,100,101,67,111,118,101,114,0,114,32,38,38,32,110,0,80,105,99,107,66,114,97,110,99,104,0,65,100,100,66,114,97,110,99,104,0,105,32,60,32,78,79,68,69,67,65,82,68,0,110,101,119,0,110,32,38,38,32,105,32,62,61,32,48,32,38,38,32,105,32,60,32,78,79,68,69,67,65,82,68,0,68,105,115,99,111,110,66,114,97,110,99,104,0,114,0,114,101,99,116,97,110,103,108,101,46,99,0,82,101,99,116,65,114,101,97,0,114,32,38,38,32,114,114,0,67,111,109,98,105,110,101,82,101,99,116,0,114,32,38,38,32,115,0,79,118,101,114,108,97,112,0,110,0,115,112,108,105,116,46,113,46,99,0,83,112,108,105,116,78,111,100,101,0,98,0,110,45,62,99,111,117,110,116,32,43,32,40,42,110,110,41,45,62,99,111,117,110,116,32,61,61,32,78,79,68,69,67,65,82,68,32,43,32,49,0,76,111,97,100,78,111,100,101,115,0,113,0,112,0,114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,48,93,46,112,97,114,116,105,116,105,111,110,91,105,93,32,61,61,32,48,32,124,124,32,114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,48,93,46,112,97,114,116,105,116,105,111,110,91,105,93,32,61,61,32,49,0,114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,48,93,46,99,111,117,110,116,91,48,93,32,43,32,114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,48,93,46,99,111,117,110,116,91,49,93,32,61,61,32,78,79,68,69,67,65,82,68,32,43,32,49,0,77,101,116,104,111,100,90,101,114,111,0,114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,48,93,46,99,111,117,110,116,91,48,93,32,62,61,32,114,116,112,45,62,77,105,110,70,105,108,108,32,38,38,32,114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,48,93,46,99,111,117,110,116,91,49,93,32,62,61,32,114,116,112,45,62,77,105,110,70,105,108,108,0,33,114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,48,93,46,116,97,107,101,110,91,105,93,0,67,108,97,115,115,105,102,121,0,71,101,116,66,114,97,110,99,104,101,115,0,110,45,62,98,114,97,110,99,104,91,105,93,46,99,104,105,108,100,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,2,2,2,2,2,2,16,12,89,1,0,31,80,8,3,7,18,19,20,87,22,23,8,11,105,12,31,10,5,12,14,41,17,43,15,45,16,47,48,32,50,6,52,53,27,28,29,30,11,12,33,34,35,36,37,38,39,40,12,24,25,23,4,10,27,28,26,32,42,10,33,34,35,36,37,38,39,40,12,10,14,83,10,44,88,49,88,88,88,88,88,88,12,27,28,15,46,88,51,33,34,35,36,37,38,39,40,27,28,255,83,255,255,33,34,35,36,37,38,39,40,12,255,255,5,255,255,255,9,20,255,255,255,255,255,12,27,28,255,16,21,22,33,34,35,36,37,38,39,40,27,28,255,255,255,255,33,34,35,36,37,38,39,40,12,255,18,19,20,17,22,23,255,255,255,255,255,255,12,27,28,255,255,255,18,33,34,35,36,37,38,39,40,27,28,255,255,255,255,33,34,35,36,37,38,39,40,12,255,255,255,255,255,255,19,255,255,255,255,255,255,12,27,28,255,255,255,255,33,34,35,36,37,38,39,40,27,28,255,255,255,255,33,34,35,36,37,38,39,40,18,19,20,21,22,23,24,25,255,255,255,255,255,255,255,255,255,35,36,37,38,39,27,18,19,20,22,23,34,54,104,1,31,56,86,33,32,2,27,27,27,94,27,27,55,57,112,54,210,194,79,4,60,34,71,34,63,34,68,34,34,88,34,101,34,34,5,6,95,96,57,4,7,8,9,10,11,12,13,14,4,102,103,93,106,109,5,6,111,88,59,113,7,8,9,10,11,12,13,14,4,114,60,91,115,62,97,70,27,18,19,20,22,23,4,5,6,63,65,98,73,7,8,9,10,11,12,13,14,5,6,0,92,0,0,7,8,9,10,11,12,13,14,4,0,0,79,0,0,0,83,66,0,0,0,0,0,4,5,6,0,68,84,85,7,8,9,10,11,12,13,14,5,6,0,0,0,0,7,8,9,10,11,12,13,14,4,0,42,44,46,71,49,51,0,0,0,0,0,0,4,5,6,0,0,0,74,7,8,9,10,11,12,13,14,5,6,0,0,0,0,7,8,9,10,11,12,13,14,4,0,0,0,0,0,0,76,0,0,0,0,0,0,4,5,6,0,0,0,0,7,8,9,10,11,12,13,14,5,6,0,0,0,0,7,8,9,10,11,12,13,14,41,43,45,47,48,50,52,53,0,0,0,0,0,0,0,0,0,41,43,45,48,50,0,4,47,0,36,35,0,18,20,22,26,28,30,32,24,0,5,7,47,47,47,0,47,47,0,0,9,8,40,0,0,1,34,2,6,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,37,3,38,19,10,41,21,11,42,23,14,45,25,17,27,12,43,29,13,44,31,15,33,16,0,51,0,48,0,47,67,0,49,0,47,0,53,46,39,66,50,65,0,58,56,0,60,52,69,0,54,0,64,0,0,63,0,68,55,59,57,61,0,2,3,3,1,1,2,1,1,1,3,3,3,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,2,0,6,1,3,3,3,3,3,1,0,1,2,3,0,4,1,2,3,0,4,0,4,0,4,0,3,2,1,2,1,2,1,83,121,110,116,97,120,32,101,114,114,111,114,58,32,110,111,110,45,115,112,97,99,101,32,115,116,114,105,110,103,32,117,115,101,100,32,98,101,102,111,114,101,32,60,84,65,66,76,69,62,0,83,121,110,116,97,120,32,101,114,114,111,114,58,32,110,111,110,45,115,112,97,99,101,32,115,116,114,105,110,103,32,117,115,101,100,32,97,102,116,101,114,32,60,47,84,65,66,76,69,62,0,0,41,42,42,42,43,44,44,45,45,45,45,45,45,45,45,45,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,62,63,63,65,64,66,66,66,66,66,66,67,67,68,68,68,70,69,71,71,71,73,72,74,72,75,72,76,72,77,77,78,78,79,79,255,3,15,16,17,35,58,36,61,37,64,21,67,38,69,39,72,24,75,25,77,26,40,28,78,29,30,80,81,82,89,90,108,107,110,99,100,87,105,109,101,109,111,114,121,32,101,120,104,97,117,115,116,101,100,0,37,115,32,105,110,32,108,105,110,101,32,37,100,32,10,0,46,46,46,32,37,115,32,46,46,46,10,0,84,65,66,76,69,0,84,82,0,84,72,0,84,68,0,72,84,77,76,0,70,79,78,84,0,66,0,85,0,79,0,73,0,83,85,80,0,83,85,66,0,83,0,66,82,0,72,82,0,86,82,0,73,77,71,0,85,110,107,110,111,119,110,32,72,84,77,76,32,101,108,101,109,101,110,116,32,60,37,115,62,32,111,110,32,108,105,110,101,32,37,100,32,10,0,60,73,77,71,62,0,73,108,108,101,103,97,108,32,97,116,116,114,105,98,117,116,101,32,37,115,32,105,110,32,37,115,32,45,32,105,103,110,111,114,101,100,10,0,115,99,97,108,101,0,115,114,99,0,60,66,82,62,0,97,108,105,103,110,0,73,71,72,84,0,69,70,84,0,69,78,84,69,82,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,65,76,73,71,78,32,45,32,105,103,110,111,114,101,100,10,0,60,70,79,78,84,62,0,99,111,108,111,114,0,102,97,99,101,0,112,111,105,110,116,45,115,105,122,101,0,80,79,73,78,84,45,83,73,90,69,0,73,109,112,114,111,112,101,114,32,37,115,32,118,97,108,117,101,32,37,115,32,45,32,105,103,110,111,114,101,100,0,37,115,32,118,97,108,117,101,32,37,115,32,62,32,37,100,32,45,32,116,111,111,32,108,97,114,103,101,32,45,32,105,103,110,111,114,101,100,0,37,115,32,118,97,108,117,101,32,37,115,32,60,32,37,100,32,45,32,116,111,111,32,115,109,97,108,108,32,45,32,105,103,110,111,114,101,100,0,60,84,68,62,0,98,97,108,105,103,110,0,98,103,99,111,108,111,114,0,98,111,114,100,101,114,0,99,101,108,108,112,97,100,100,105,110,103,0,99,101,108,108,115,112,97,99,105,110,103,0,99,111,108,115,112,97,110,0,102,105,120,101,100,115,105,122,101,0,103,114,97,100,105,101,110,116,97,110,103,108,101,0,104,101,105,103,104,116,0,104,114,101,102,0,105,100,0,112,111,114,116,0,114,111,119,115,112,97,110,0,115,105,100,101,115,0,115,116,121,108,101,0,116,97,114,103,101,116,0,116,105,116,108,101,0,116,111,111,108,116,105,112,0,118,97,108,105,103,110,0,119,105,100,116,104,0,87,73,68,84,72,0,79,84,84,79,77,0,79,80,0,73,68,68,76,69,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,86,65,76,73,71,78,32,45,32,105,103,110,111,114,101,100,10,0,32,44,0,79,85,78,68,69,68,0,65,68,73,65,76,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,83,84,89,76,69,32,45,32,105,103,110,111,114,101,100,10,0,83,79,76,73,68,0,73,78,86,73,83,73,66,76,69,0,73,78,86,73,83,0,68,79,84,84,69,68,0,68,65,83,72,69,68,0,85,110,114,101,99,111,103,110,105,122,101,100,32,99,104,97,114,97,99,116,101,114,32,39,37,99,39,32,40,37,100,41,32,105,110,32,115,105,100,101,115,32,97,116,116,114,105,98,117,116,101,10,0,82,79,87,83,80,65,78,0,82,79,87,83,80,65,78,32,118,97,108,117,101,32,99,97,110,110,111,116,32,98,101,32,48,32,45,32,105,103,110,111,114,101,100,10,0,72,69,73,71,72,84,0,71,82,65,68,73,69,78,84,65,78,71,76,69,0,82,85,69,0,65,76,83,69,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,70,73,88,69,68,83,73,90,69,32,45,32,105,103,110,111,114,101,100,10,0,67,79,76,83,80,65,78,0,67,79,76,83,80,65,78,32,118,97,108,117,101,32,99,97,110,110,111,116,32,98,101,32,48,32,45,32,105,103,110,111,114,101,100,10,0,67,69,76,76,83,80,65,67,73,78,71,0,67,69,76,76,80,65,68,68,73,78,71,0,66,79,82,68,69,82,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,66,65,76,73,71,78,32,105,110,32,84,68,32,45,32,105,103,110,111,114,101,100,10,0,69,88,84,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,65,76,73,71,78,32,105,110,32,84,68,32,45,32,105,103,110,111,114,101,100,10,0,60,84,65,66,76,69,62,0,99,101,108,108,98,111,114,100,101,114,0,99,111,108,117,109,110,115,0,114,111,119,115,0,85,110,107,110,111,119,110,32,118,97,108,117,101,32,37,115,32,102,111,114,32,82,79,87,83,32,45,32,105,103,110,111,114,101,100,10,0,85,110,107,110,111,119,110,32,118,97,108,117,101,32,37,115,32,102,111,114,32,67,79,76,85,77,78,83,32,45,32,105,103,110,111,114,101,100,10,0,67,69,76,76,83,66,79,82,68,69,82,0,60,72,84,77,76,62,0,60,47,72,84,77,76,62,0,45,45,0,76,97,98,101,108,32,99,108,111,115,101,100,32,98,101,102,111,114,101,32,101,110,100,32,111,102,32,72,84,77,76,32,101,108,101,109,101,110,116,10,0,85,110,99,108,111,115,101,100,32,99,111,109,109,101,110,116,10,0,106,32,61,61,32,48,0,99,118,116,46,99,0,80,111,98,115,112,97,116,104,0,114,111,117,116,101,46,99,0,108,105,98,112,97,116,104,47,37,115,58,37,100,58,32,37,115,10,0,115,104,111,114,116,101,115,116,46,99,0,115,111,117,114,99,101,32,112,111,105,110,116,32,110,111,116,32,105,110,32,97,110,121,32,116,114,105,97,110,103,108,101,0,100,101,115,116,105,110,97,116,105,111,110,32,112,111,105,110,116,32,110,111,116,32,105,110,32,97,110,121,32,116,114,105,97,110,103,108,101,0,99,97,110,110,111,116,32,102,105,110,100,32,116,114,105,97,110,103,108,101,32,112,97,116,104,0,99,97,110,110,111,116,32,109,97,108,108,111,99,32,111,112,115,0,99,97,110,110,111,116,32,114,101,97,108,108,111,99,32,111,112,115,0,116,114,105,97,110,103,117,108,97,116,105,111,110,32,102,97,105,108,101,100,0,99,97,110,110,111,116,32,109,97,108,108,111,99,32,116,114,105,115,0,99,97,110,110,111,116,32,114,101,97,108,108,111,99,32,116,114,105,115,0,99,97,110,110,111,116,32,109,97,108,108,111,99,32,100,113,46,112,110,108,115,0,99,97,110,110,111,116,32,114,101,97,108,108,111,99,32,100,113,46,112,110,108,115,0,99,97,110,110,111,116,32,109,97,108,108,111,99,32,112,110,108,115,0,99,97,110,110,111,116,32,109,97,108,108,111,99,32,112,110,108,112,115,0,99,97,110,110,111,116,32,114,101,97,108,108,111,99,32,112,110,108,115,0,99,97,110,110,111,116,32,114,101,97,108,108,111,99,32,112,110,108,112,115,0,67,68,65,84,65,0,73,68,0,73,68,82,69,70,0,73,68,82,69,70,83,0,69,78,84,73,84,89,0,69,78,84,73,84,73,69,83,0,78,77,84,79,75,69,78,0,78,77,84,79,75,69,78,83,0,78,79,84,65,84,73,79,78,40,0,40,0,124,0,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,88,77,76,47,49,57,57,56,47,110,97,109,101,115,112,97,99,101,0,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,50,48,48,48,47,120,109,108,110,115,47,0,120,109,108,61,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,88,77,76,47,49,57,57,56,47,110,97,109,101,115,112,97,99,101,0,111,117,116,32,111,102,32,109,101,109,111,114,121,0,115,121,110,116,97,120,32,101,114,114,111,114,0,110,111,32,101,108,101,109,101,110,116,32,102,111,117,110,100,0,110,111,116,32,119,101,108,108,45,102,111,114,109,101,100,32,40,105,110,118,97,108,105,100,32,116,111,107,101,110,41,0,117,110,99,108,111,115,101,100,32,116,111,107,101,110,0,112,97,114,116,105,97,108,32,99,104,97,114,97,99,116,101,114,0,109,105,115,109,97,116,99,104,101,100,32,116,97,103,0,100,117,112,108,105,99,97,116,101,32,97,116,116,114,105,98,117,116,101,0,106,117,110,107,32,97,102,116,101,114,32,100,111,99,117,109,101,110,116,32,101,108,101,109,101,110,116,0,105,108,108,101,103,97,108,32,112,97,114,97,109,101,116,101,114,32,101,110,116,105,116,121,32,114,101,102,101,114,101,110,99,101,0,117,110,100,101,102,105,110,101,100,32,101,110,116,105,116,121,0,114,101,99,117,114,115,105,118,101,32,101,110,116,105,116,121,32,114,101,102,101,114,101,110,99,101,0,97,115,121,110,99,104,114,111,110,111,117,115,32,101,110,116,105,116,121,0,114,101,102,101,114,101,110,99,101,32,116,111,32,105,110,118,97,108,105,100,32,99,104,97,114,97,99,116,101,114,32,110,117,109,98,101,114,0,114,101,102,101,114,101,110,99,101,32,116,111,32,98,105,110,97,114,121,32,101,110,116,105,116,121,0,114,101,102,101,114,101,110,99,101,32,116,111,32,101,120,116,101,114,110,97,108,32,101,110,116,105,116,121,32,105,110,32,97,116,116,114,105,98,117,116,101,0,88,77,76,32,111,114,32,116,101,120,116,32,100,101,99,108,97,114,97,116,105,111,110,32,110,111,116,32,97,116,32,115,116,97,114,116,32,111,102,32,101,110,116,105,116,121,0,117,110,107,110,111,119,110,32,101,110,99,111,100,105,110,103,0,101,110,99,111,100,105,110,103,32,115,112,101,99,105,102,105,101,100,32,105,110,32,88,77,76,32,100,101,99,108,97,114,97,116,105,111,110,32,105,115,32,105,110,99,111,114,114,101,99,116,0,117,110,99,108,111,115,101,100,32,67,68,65,84,65,32,115,101,99,116,105,111,110,0,101,114,114,111,114,32,105,110,32,112,114,111,99,101,115,115,105,110,103,32,101,120,116,101,114,110,97,108,32,101,110,116,105,116,121,32,114,101,102,101,114,101,110,99,101,0,100,111,99,117,109,101,110,116,32,105,115,32,110,111,116,32,115,116,97,110,100,97,108,111,110,101,0,117,110,101,120,112,101,99,116,101,100,32,112,97,114,115,101,114,32,115,116,97,116,101,32,45,32,112,108,101,97,115,101,32,115,101,110,100,32,97,32,98,117,103,32,114,101,112,111,114,116,0,101,110,116,105,116,121,32,100,101,99,108,97,114,101,100,32,105,110,32,112,97,114,97,109,101,116,101,114,32,101,110,116,105,116,121,0,114,101,113,117,101,115,116,101,100,32,102,101,97,116,117,114,101,32,114,101,113,117,105,114,101,115,32,88,77,76,95,68,84,68,32,115,117,112,112,111,114,116,32,105,110,32,69,120],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+133144);allocate([112,97,116,0,99,97,110,110,111,116,32,99,104,97,110,103,101,32,115,101,116,116,105,110,103,32,111,110,99,101,32,112,97,114,115,105,110,103,32,104,97,115,32,98,101,103,117,110,0,117,110,98,111,117,110,100,32,112,114,101,102,105,120,0,109,117,115,116,32,110,111,116,32,117,110,100,101,99,108,97,114,101,32,112,114,101,102,105,120,0,105,110,99,111,109,112,108,101,116,101,32,109,97,114,107,117,112,32,105,110,32,112,97,114,97,109,101,116,101,114,32,101,110,116,105,116,121,0,88,77,76,32,100,101,99,108,97,114,97,116,105,111,110,32,110,111,116,32,119,101,108,108,45,102,111,114,109,101,100,0,116,101,120,116,32,100,101,99,108,97,114,97,116,105,111,110,32,110,111,116,32,119,101,108,108,45,102,111,114,109,101,100,0,105,108,108,101,103,97,108,32,99,104,97,114,97,99,116,101,114,40,115,41,32,105,110,32,112,117,98,108,105,99,32,105,100,0,112,97,114,115,101,114,32,115,117,115,112,101,110,100,101,100,0,112,97,114,115,101,114,32,110,111,116,32,115,117,115,112,101,110,100,101,100,0,112,97,114,115,105,110,103,32,97,98,111,114,116,101,100,0,112,97,114,115,105,110,103,32,102,105,110,105,115,104,101,100,0,99,97,110,110,111,116,32,115,117,115,112,101,110,100,32,105,110,32,101,120,116,101,114,110,97,108,32,112,97,114,97,109,101,116,101,114,32,101,110,116,105,116,121,0,114,101,115,101,114,118,101,100,32,112,114,101,102,105,120,32,40,120,109,108,41,32,109,117,115,116,32,110,111,116,32,98,101,32,117,110,100,101,99,108,97,114,101,100,32,111,114,32,98,111,117,110,100,32,116,111,32,97,110,111,116,104,101,114,32,110,97,109,101,115,112,97,99,101,32,110,97,109,101,0,114,101,115,101,114,118,101,100,32,112,114,101,102,105,120,32,40,120,109,108,110,115,41,32,109,117,115,116,32,110,111,116,32,98,101,32,100,101,99,108,97,114,101,100,32,111,114,32,117,110,100,101,99,108,97,114,101,100,0,112,114,101,102,105,120,32,109,117,115,116,32,110,111,116,32,98,101,32,98,111,117,110,100,32,116,111,32,111,110,101,32,111,102,32,116,104,101,32,114,101,115,101,114,118,101,100,32,110,97,109,101,115,112,97,99,101,32,110,97,109,101,115,0,2,3,4,5,6,7,8,0,0,9,10,11,12,13,14,15,16,17,0,0,0,0,0,0,0,0,0,0,0,0,18,19,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,23,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,3,26,27,28,29,30,0,0,31,32,33,34,35,36,37,16,17,0,0,0,0,0,0,0,0,0,0,0,0,18,19,38,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,23,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67,68,65,84,65,91,85,83,45,65,83,67,73,73,0,85,84,70,45,49,54,0,85,84,70,45,49,54,66,69,0,85,84,70,45,49,54,76,69,0,118,101,114,115,105,111,110,0,101,110,99,111,100,105,110,103,0,115,116,97,110,100,97,108,111,110,101,0,68,79,67,84,89,80,69,0,83,89,83,84,69,77,0,80,85,66,76,73,67,0,69,78,84,73,84,89,0,65,84,84,76,73,83,84,0,69,76,69,77,69,78,84,0,78,79,84,65,84,73,79,78,0,73,78,67,76,85,68,69,0,73,71,78,79,82,69,0,69,77,80,84,89,0,65,78,89,0,80,67,68,65,84,65,0,73,77,80,76,73,69,68,0,82,69,81,85,73,82,69,68,0,70,73,88,69,68,0,67,68,65,84,65,0,73,68,0,73,68,82,69,70,0,73,68,82,69,70,83,0,69,78,84,73,84,73,69,83,0,78,77,84,79,75,69,78,0,78,77,84,79,75,69,78,83,0,78,68,65,84,65,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,1,2,3,4,5,6,7,8,9,255,255,255,255,255,255,255,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,255,255,255,255,255,255,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,1,2,4,7,3,6,5,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,78,65,78,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,46,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0,18,17,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,17,34,35,36,17,37,38,39,40,41,42,43,44,17,45,46,47,16,16,48,16,16,16,16,16,16,16,49,50,51,16,52,53,16,16,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,54,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,55,17,17,17,17,56,17,57,58,59,60,61,62,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,63,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,64,65,17,66,67,68,69,70,71,72,73,16,16,16,74,75,76,77,78,16,16,16,79,80,16,16,16,16,81,16,16,16,16,16,16,16,16,16,17,17,17,82,83,16,16,16,16,16,16,16,16,16,16,16,17,17,17,17,84,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,17,85,16,16,16,16,86,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,87,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,88,89,90,91,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,92,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,254,255,255,7,254,255,255,7,0,0,0,0,0,4,32,4,255,255,127,255,255,255,127,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,195,255,3,0,31,80,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,223,60,64,215,255,255,251,255,255,255,255,255,255,255,255,255,191,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,3,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,254,255,255,255,127,2,254,255,255,255,255,0,0,0,0,0,255,191,182,0,255,255,255,7,7,0,0,0,255,7,255,255,255,255,255,255,255,254,255,195,255,255,255,255,255,255,255,255,255,255,255,255,239,31,254,225,255,159,0,0,255,255,255,255,255,255,0,224,255,255,255,255,255,255,255,255,255,255,255,255,3,0,255,255,255,255,255,7,48,4,255,255,255,252,255,31,0,0,255,255,255,1,0,0,0,0,0,0,0,0,253,31,0,0,0,0,0,0,240,3,255,127,255,255,255,255,255,255,255,239,255,223,225,255,207,255,254,254,238,159,249,255,255,253,197,227,159,89,128,176,207,255,3,0,238,135,249,255,255,253,109,195,135,25,2,94,192,255,63,0,238,191,251,255,255,253,237,227,191,27,1,0,207,255,0,0,238,159,249,255,255,253,237,227,159,25,192,176,207,255,2,0,236,199,61,214,24,199,255,195,199,29,129,0,192,255,0,0,238,223,253,255,255,253,239,227,223,29,96,3,207,255,0,0,236,223,253,255,255,253,239,227,223,29,96,64,207,255,6,0,236,223,253,255,255,255,255,231,223,93,128,0,207,255,0,252,236,255,127,252,255,255,251,47,127,128,95,255,0,0,12,0,254,255,255,255,255,127,255,7,63,32,255,3,0,0,0,0,150,37,240,254,174,236,255,59,95,32,255,243,0,0,0,0,1,0,0,0,255,3,0,0,255,254,255,255,255,31,254,255,3,255,255,254,255,255,255,31,0,0,0,0,0,0,0,0,255,255,255,255,255,255,127,249,255,3,255,255,231,193,255,255,127,64,255,51,255,255,255,255,191,32,255,255,255,255,255,247,255,255,255,255,255,255,255,255,255,61,127,61,255,255,255,255,255,61,255,255,255,255,61,127,61,255,127,255,255,255,255,255,255,255,61,255,255,255,255,255,255,255,255,135,0,0,0,0,255,255,0,0,255,255,255,255,255,255,255,255,255,255,31,0,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,159,255,255,254,255,255,7,255,255,255,255,255,255,255,255,255,199,1,0,255,223,15,0,255,255,15,0,255,255,15,0,255,223,13,0,255,255,255,255,255,255,207,255,255,1,128,16,255,3,0,0,0,0,255,3,255,255,255,255,255,255,255,255,255,255,255,0,255,255,255,255,255,7,255,255,255,255,255,255,255,255,63,0,255,255,255,31,255,15,255,1,192,255,255,255,255,63,31,0,255,255,255,255,255,15,255,255,255,3,255,3,0,0,0,0,255,255,255,15,255,255,255,255,255,255,255,127,254,255,31,0,255,3,255,3,128,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,239,255,239,15,255,3,0,0,0,0,255,255,255,255,255,243,255,255,255,255,255,255,191,255,3,0,255,255,255,255,255,255,63,0,255,227,255,255,255,255,255,63,0,0,0,0,0,0,0,0,0,0,0,0,0,222,111,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,255,255,63,63,255,255,255,255,63,63,255,170,255,255,255,63,255,255,255,255,255,255,223,95,220,31,207,15,255,31,220,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,128,0,0,255,31,0,0,0,0,0,0,0,0,0,0,0,0,132,252,47,62,80,189,255,243,224,67,0,0,255,255,255,255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,255,255,255,255,255,255,3,0,0,255,255,255,255,255,127,255,255,255,255,255,127,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,120,12,0,255,255,255,255,191,32,255,255,255,255,255,255,255,128,0,0,255,255,127,0,127,127,127,127,127,127,127,127,255,255,255,255,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,0,0,0,254,3,62,31,254,255,255,255,255,255,255,255,255,255,127,224,254,255,255,255,255,255,255,255,255,255,255,247,224,255,255,255,255,63,254,255,255,255,255,255,255,255,255,255,255,127,0,0,255,255,255,7,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,0,0,0,0,0,0,0,0,255,255,255,255,255,63,255,31,255,255,255,15,0,0,255,255,255,255,255,127,240,143,255,255,255,128,255,255,255,255,255,255,255,255,255,255,0,0,0,0,128,255,252,255,255,255,255,255,255,255,255,255,255,255,255,121,15,0,255,7,0,0,0,0,0,0,0,0,0,255,187,247,255,255,255,0,0,0,255,255,255,255,255,255,15,0,255,255,255,255,255,255,255,255,15,0,255,3,0,0,252,8,255,255,255,255,255,7,255,255,255,255,7,0,255,255,255,31,255,255,255,255,255,255,247,255,0,128,255,3,0,0,0,0,255,255,255,255,255,255,127,0,255,63,255,3,255,255,127,4,255,255,255,255,255,255,255,127,5,0,0,56,255,255,60,0,126,126,126,0,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,7,255,3,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,15,0,255,255,127,248,255,255,255,255,255,15,255,255,255,255,255,255,255,255,255,255,255,255,255,63,255,255,255,255,255,255,255,255,255,255,255,255,255,3,0,0,0,0,127,0,248,224,255,253,127,95,219,255,255,255,255,255,255,255,255,255,255,255,255,255,3,0,0,0,248,255,255,255,255,255,255,255,255,255,255,255,255,63,0,0,255,255,255,255,255,255,255,255,252,255,255,255,255,255,255,0,0,0,0,0,255,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,223,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,0,0,255,3,254,255,255,7,254,255,255,7,192,255,255,255,255,255,255,255,255,255,255,127,252,252,252,28,0,0,0,0,255,239,255,255,127,255,255,183,255,63,255,63,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,7,0,0,0,0,0,0,0,0,255,255,255,255,255,255,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,31,255,255,255,255,255,255,1,0,0,0,0,0,255,255,255,127,0,0,255,255,255,7,0,0,0,0,0,0,255,255,255,63,255,255,255,255,15,255,62,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,255,3,0,0,0,0,0,0,0,0,0,0,63,253,255,255,255,255,191,145,255,255,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,63,0,255,255,255,3,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,192,0,0,0,0,0,0,0,0,111,240,239,254,255,255,15,0,0,0,0,0,255,255,255,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,63,0,255,255,63,0,255,255,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,63,0,0,0,192,255,0,0,252,255,255,255,255,255,255,1,0,0,255,255,255,1,255,3,255,255,255,255,255,255,199,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,30,0,255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,63,0,255,3,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,31,0,255,255,255,255,255,127,0,0,248,255,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,223,255,255,255,255,255,255,255,255,223,100,222,255,235,239,255,255,255,255,255,255,255,191,231,223,223,255,255,255,123,95,252,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,255,255,255,253,255,255,247,255,255,255,247,255,255,223,255,255,255,223,255,255,127,255,255,255,127,255,255,255,253,255,255,255,253,255,255,247,207,255,255,255,255,255,255,239,255,255,255,150,254,247,10,132,234,150,170,150,247,247,94,255,251,255,15,238,251,255,15,0,0,0,0,0,0,0,0,18,16,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,16,16,34,35,16,36,37,38,39,40,41,42,43,16,44,45,46,17,47,48,17,17,49,17,17,17,50,51,52,53,54,55,56,57,17,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,58,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,59,16,60,61,62,63,64,65,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,66,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,67,16,16,68,16,69,70,71,16,72,16,73,16,16,16,16,74,75,76,77,16,16,78,16,79,80,16,16,16,16,81,16,16,16,16,16,16,16,16,16,16,16,16,16,82,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,83,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,84,85,86,87,16,16,88,89,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,90,16,91,92,93,94,95,96,97,98,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,254,255,0,252,1,0,0,248,1,0,0,120,0,0,0,0,255,251,223,251,0,0,128,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,0,252,255,224,175,255,255,255,255,255,255,255,255,255,255,223,255,255,255,255,255,32,64,176,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,0,0,0,0,0,134,254,255,255,255,0,64,73,0,0,0,0,0,24,0,223,255,0,200,0,0,0,0,0,0,0,1,0,60,0,0,0,0,0,0,0,0,0,0,0,0,16,224,1,30,0,96,255,191,0,0,0,0,0,0,255,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,207,3,0,0,0,3,0,32,255,127,0,0,0,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,0,0,0,0,0,0,0,0,0,16,0,32,30,0,48,0,1,0,0,0,0,0,0,0,0,16,0,32,0,0,0,0,252,15,0,0,0,0,0,0,0,16,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,32,0,0,0,0,3,0,0,0,0,0,0,0,0,16,0,32,0,0,0,0,253,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,255,7,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,255,0,0,0,0,0,0,0,16,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,63,2,0,0,0,0,0,0,0,0,0,4,0,0,0,0,16,0,0,0,0,0,0,128,0,128,192,223,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,254,255,255,255,0,252,255,255,0,0,0,0,0,0,0,0,252,0,0,0,0,0,0,192,255,223,255,7,0,0,0,0,0,0,0,0,0,0,128,6,0,252,0,0,24,62,0,0,128,191,0,204,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,96,255,255,255,31,0,0,255,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0,0,1,0,0,24,0,0,0,0,0,0,0,0,0,56,0,0,0,0,16,0,0,0,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,0,0,254,127,47,0,0,255,3,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,255,255,255,255,0,0,0,192,0,0,0,0,0,0,0,0,1,0,224,159,0,0,0,0,127,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,16,0,0,252,255,255,255,31,0,0,0,0,0,12,0,0,0,0,0,0,64,0,12,240,0,0,0,0,0,0,192,248,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,255,0,255,255,255,33,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,127,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,3,224,0,224,0,224,0,96,128,248,255,255,255,252,255,255,255,255,255,127,31,252,241,127,255,127,0,0,255,255,255,3,0,0,255,255,255,255,1,0,123,3,208,193,175,66,0,12,31,188,255,255,0,0,0,0,0,2,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,15,0,255,255,255,255,127,0,0,0,255,7,0,0,255,255,255,255,255,255,255,255,255,255,63,0,0,0,0,0,0,252,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,135,3,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,127,255,15,0,0,0,0,0,0,0,0,255,255,255,251,255,255,255,255,255,255,255,255,255,255,15,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,0,0,0,255,15,30,255,255,255,1,252,193,224,0,0,0,0,0,0,0,0,0,0,0,30,1,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,255,255,255,255,15,0,0,0,255,255,255,127,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,127,0,0,0,0,0,0,192,0,224,0,0,0,0,0,0,0,0,0,0,0,128,15,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,127,0,3,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,8,0,0,0,15,255,3,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,16,192,0,0,255,255,3,7,0,0,0,0,0,248,0,0,0,0,8,128,0,0,0,0,0,0,0,0,0,0,8,0,255,63,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,128,11,0,0,0,0,0,0,0,128,2,0,0,192,0,0,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,255,255,255,3,127,0,255,255,255,255,247,255,127,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,254,255,0,252,1,0,0,248,1,0,0,248,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,0,48,135,255,255,255,255,255,143,255,0,0,0,0,0,0,224,255,255,7,255,15,0,0,0,0,0,0,255,255,255,255,255,63,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,143,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,255,0,255,1,0,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,63,252,255,63,0,0,0,3,0,0,0,0,0,0,254,3,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,225,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,7,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,0,255,255,255,255,127,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,0,0,0,0,255,255,255,255,255,255,255,255,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,127,0,255,255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,8,0,0,0,8,0,0,32,0,0,0,32,0,0,128,0,0,0,128,0,0,0,2,0,0,0,2,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,255,255,255,255,255,15,255,255,255,255,255,255,255,255,255,255,255,255,15,0,255,127,254,127,254,255,254,255,0,0,0,0,255,7,255,255,255,127,255,255,255,255,255,255,255,15,255,255,255,255,255,7,0,0,0,0,0,0,0,0,192,255,255,255,7,0,255,255,255,255,255,7,255,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,1,0,191,255,255,255,255,255,255,255,255,31,255,255,15,0,255,255,255,255,223,7,0,0,255,255,1,0,255,255,255,255,255,255,255,127,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,30,255,255,255,255,255,255,255,63,15,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,255,255,255,255,255,255,255,255,225,255,0,0,0,0,0,0,255,255,255,255,255,255,255,255,63,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,97,108,110,117,109,0,97,108,112,104,97,0,98,108,97,110,107,0,99,110,116,114,108,0,100,105,103,105,116,0,103,114,97,112,104,0,108,111,119,101,114,0,112,114,105,110,116,0,112,117,110,99,116,0,115,112,97,99,101,0,117,112,112,101,114,0,120,100,105,103,105,116,0,47,112,114,111,99,47,115,101,108,102,47,102,100,47,0,105,110,102,105,110,105,116,121,0,110,97,110,0,76,67,95,65,76,76,0,76,67,95,67,84,89,80,69],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+143384);allocate([76,67,95,78,85,77,69,82,73,67,0,0,76,67,95,84,73,77,69,0,0,0,0,0,76,67,95,67,79,76,76,65,84,69,0,0,76,67,95,77,79,78,69,84,65,82,89,0,76,67,95,77,69,83,83,65,71,69,83,0,76,65,78,71,0,67,46,85,84,70,45,56,0,80,79,83,73,88,0,77,85,83,76,95,76,79,67,80,65,84,72,0,67,46,85,84,70,45,56,0,0,0,0,0,0,0,0,0,67,0,114,119,97,0,9,0,10,0,13,0,12,0,7,0,27,0,91,91,58,97,108,110,117,109,58,93,95,93,0,91,94,91,58,97,108,110,117,109,58,93,95,93,0,91,91,58,115,112,97,99,101,58,93,93,0,91,94,91,58,115,112,97,99,101,58,93,93,0,91,91,58,100,105,103,105,116,58,93,93,0,91,94,91,58,100,105,103,105,116,58,93,93,0,47,116,109,112,47,116,109,112,102,105,108,101,95,88,88,88,88,88,88,0,119,43,0],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+153624);var tempDoublePtr=STATICTOP;STATICTOP+=16;Module["_i64Subtract"]=_i64Subtract;function ___assert_fail(condition,filename,line,func){ABORT=true;throw"Assertion failed: "+Pointer_stringify(condition)+", at: "+[filename?Pointer_stringify(filename):"unknown filename",line,func?Pointer_stringify(func):"unknown function"]+" at "+stackTrace()}var PROCINFO={ppid:1,pid:42,sid:42,pgid:42};var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};var ERRNO_MESSAGES={0:"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Invalid exchange",53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",73:"Cross mount point (not really error)",74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",106:"Socket is already connected",107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"};function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}var PATH={splitPath:(function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)}),normalizeArray:(function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up--;up){parts.unshift("..")}}return parts}),normalize:(function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path}),dirname:(function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir}),basename:(function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)}),extname:(function(path){return PATH.splitPath(path)[3]}),join:(function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))}),join2:(function(l,r){return PATH.normalize(l+"/"+r)}),resolve:(function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter((function(p){return!!p})),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."}),relative:(function(from,to){from=PATH.resolve(from).substr(1);to=PATH.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()}),put_char:(function(tty,val){if(val===null||val===10){Module["print"](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module["print"](UTF8ArrayToString(tty.output,0));tty.output=[]}})},default_tty1_ops:{put_char:(function(tty,val){if(val===null||val===10){Module["printErr"](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module["printErr"](UTF8ArrayToString(tty.output,0));tty.output=[]}})}};var MEMFS={ops_table:null,mount:(function(mount){return MEMFS.createNode(null,"/",16384|511,0)}),createNode:(function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node}return node}),getFileDataAsRegularArray:(function(node){if(node.contents&&node.contents.subarray){var arr=[];for(var i=0;inode.contents.length){node.contents=MEMFS.getFileDataAsRegularArray(node);node.usedBytes=node.contents.length}if(!node.contents||node.contents.subarray){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return}if(!node.contents&&newCapacity>0)node.contents=[];while(node.contents.lengthnewSize)node.contents.length=newSize;else while(node.contents.length=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);assert(size>=0);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+lengthe2.timestamp){create.push(key);total++}}));var remove=[];Object.keys(dst.entries).forEach((function(key){var e=dst.entries[key];var e2=src.entries[key];if(!e2){remove.push(key);total++}}));if(!total){return callback(null)}var completed=0;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err){if(!done.errored){done.errored=true;return callback(err)}return}if(++completed>=total){return callback(null)}}transaction.onerror=(function(e){done(this.error);e.preventDefault()});create.sort().forEach((function(path){if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,(function(err,entry){if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)}))}else{IDBFS.loadLocalEntry(path,(function(err,entry){if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)}))}}));remove.sort().reverse().forEach((function(path){if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}}))})};var NODEFS={isWindows:false,staticInit:(function(){NODEFS.isWindows=!!process.platform.match(/^win/)}),mount:(function(mount){assert(ENVIRONMENT_IS_NODE);return NODEFS.createNode(null,"/",NODEFS.getMode(mount.opts.root),0)}),createNode:(function(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node}),getMode:(function(path){var stat;try{stat=fs.lstatSync(path);if(NODEFS.isWindows){stat.mode=stat.mode|(stat.mode&146)>>1}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return stat.mode}),realPath:(function(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join.apply(null,parts)}),flagsToPermissionStringMap:{0:"r",1:"r+",2:"r+",64:"r",65:"r+",66:"r+",129:"rx+",193:"rx+",514:"w+",577:"w",578:"w+",705:"wx",706:"wx+",1024:"a",1025:"a",1026:"a+",1089:"a",1090:"a+",1153:"ax",1154:"ax+",1217:"ax",1218:"ax+",4096:"rs",4098:"rs+"},flagsToPermissionString:(function(flags){flags&=~2097152;flags&=~2048;flags&=~32768;flags&=~524288;if(flags in NODEFS.flagsToPermissionStringMap){return NODEFS.flagsToPermissionStringMap[flags]}else{throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}}),node_ops:{getattr:(function(node){var path=NODEFS.realPath(node);var stat;try{stat=fs.lstatSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(NODEFS.isWindows&&!stat.blksize){stat.blksize=4096}if(NODEFS.isWindows&&!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}}),setattr:(function(node,attr){var path=NODEFS.realPath(node);try{if(attr.mode!==undefined){fs.chmodSync(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);fs.utimesSync(path,date,date)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),lookup:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)}),mknod:(function(parent,name,mode,dev){var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);try{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,"",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return node}),rename:(function(oldNode,newDir,newName){var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{fs.renameSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),unlink:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.unlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),rmdir:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.rmdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readdir:(function(node){var path=NODEFS.realPath(node);try{return fs.readdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),symlink:(function(parent,newName,oldPath){var newPath=PATH.join2(NODEFS.realPath(parent),newName);try{fs.symlinkSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readlink:(function(node){var path=NODEFS.realPath(node);try{path=fs.readlinkSync(path);path=NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root),path);return path}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}})},stream_ops:{open:(function(stream){var path=NODEFS.realPath(stream.node);try{if(FS.isFile(stream.node.mode)){stream.nfd=fs.openSync(path,NODEFS.flagsToPermissionString(stream.flags))}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),close:(function(stream){try{if(FS.isFile(stream.node.mode)&&stream.nfd){fs.closeSync(stream.nfd)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),read:(function(stream,buffer,offset,length,position){if(length===0)return 0;var nbuffer=new Buffer(length);var res;try{res=fs.readSync(stream.nfd,nbuffer,0,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(res>0){for(var i=0;i=stream.node.size)return 0;var chunk=stream.node.contents.slice(position,position+length);var ab=WORKERFS.reader.readAsArrayBuffer(chunk);buffer.set(new Uint8Array(ab),offset);return chunk.size}),write:(function(stream,buffer,offset,length,position){throw new FS.ErrnoError(ERRNO_CODES.EIO)}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.size}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position})}};STATICTOP+=16;STATICTOP+=16;STATICTOP+=16;var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,handleFSError:(function(e){if(!(e instanceof FS.ErrnoError))throw e+" : "+stackTrace();return ___setErrNo(e.errno)}),lookupPath:(function(path,opts){path=PATH.resolve(FS.cwd(),path);opts=opts||{};if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};for(var key in defaults){if(opts[key]===undefined){opts[key]=defaults[key]}}if(opts.recurse_count>8){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}var parts=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}}}}return{path:current_path,node:current}}),getPath:(function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}}),hashName:(function(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length}),hashAddNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node}),hashRemoveNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}}),lookupNode:(function(parent,name){var err=FS.mayLookup(parent);if(err){throw new FS.ErrnoError(err,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)}),createNode:(function(parent,name,mode,rdev){if(!FS.FSNode){FS.FSNode=(function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev});FS.FSNode.prototype={};var readMode=292|73;var writeMode=146;Object.defineProperties(FS.FSNode.prototype,{read:{get:(function(){return(this.mode&readMode)===readMode}),set:(function(val){val?this.mode|=readMode:this.mode&=~readMode})},write:{get:(function(){return(this.mode&writeMode)===writeMode}),set:(function(val){val?this.mode|=writeMode:this.mode&=~writeMode})},isFolder:{get:(function(){return FS.isDir(this.mode)})},isDevice:{get:(function(){return FS.isChrdev(this.mode)})}})}var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node}),destroyNode:(function(node){FS.hashRemoveNode(node)}),isRoot:(function(node){return node===node.parent}),isMountpoint:(function(node){return!!node.mounted}),isFile:(function(mode){return(mode&61440)===32768}),isDir:(function(mode){return(mode&61440)===16384}),isLink:(function(mode){return(mode&61440)===40960}),isChrdev:(function(mode){return(mode&61440)===8192}),isBlkdev:(function(mode){return(mode&61440)===24576}),isFIFO:(function(mode){return(mode&61440)===4096}),isSocket:(function(mode){return(mode&49152)===49152}),flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:(function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags}),flagsToPermissionString:(function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms}),nodePermissions:(function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf("r")!==-1&&!(node.mode&292)){return ERRNO_CODES.EACCES}else if(perms.indexOf("w")!==-1&&!(node.mode&146)){return ERRNO_CODES.EACCES}else if(perms.indexOf("x")!==-1&&!(node.mode&73)){return ERRNO_CODES.EACCES}return 0}),mayLookup:(function(dir){var err=FS.nodePermissions(dir,"x");if(err)return err;if(!dir.node_ops.lookup)return ERRNO_CODES.EACCES;return 0}),mayCreate:(function(dir,name){try{var node=FS.lookupNode(dir,name);return ERRNO_CODES.EEXIST}catch(e){}return FS.nodePermissions(dir,"wx")}),mayDelete:(function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var err=FS.nodePermissions(dir,"wx");if(err){return err}if(isdir){if(!FS.isDir(node.mode)){return ERRNO_CODES.ENOTDIR}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return ERRNO_CODES.EBUSY}}else{if(FS.isDir(node.mode)){return ERRNO_CODES.EISDIR}}return 0}),mayOpen:(function(node,flags){if(!node){return ERRNO_CODES.ENOENT}if(FS.isLink(node.mode)){return ERRNO_CODES.ELOOP}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return ERRNO_CODES.EISDIR}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))}),MAX_OPEN_FDS:4096,nextfd:(function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(ERRNO_CODES.EMFILE)}),getStream:(function(fd){return FS.streams[fd]}),createStream:(function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=(function(){});FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:(function(){return this.node}),set:(function(val){this.node=val})},isRead:{get:(function(){return(this.flags&2097155)!==1})},isWrite:{get:(function(){return(this.flags&2097155)!==0})},isAppend:{get:(function(){return this.flags&1024})}})}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream}),closeStream:(function(fd){FS.streams[fd]=null}),chrdev_stream_ops:{open:(function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}}),llseek:(function(){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)})},major:(function(dev){return dev>>8}),minor:(function(dev){return dev&255}),makedev:(function(ma,mi){return ma<<8|mi}),registerDevice:(function(dev,ops){FS.devices[dev]={stream_ops:ops}}),getDevice:(function(dev){return FS.devices[dev]}),getMounts:(function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts}),syncfs:(function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){console.log("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(err){assert(FS.syncFSRequests>0);FS.syncFSRequests--;return callback(err)}function done(err){if(err){if(!done.errored){done.errored=true;return doCallback(err)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach((function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)}))}),mount:(function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot}),unmount:(function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach((function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}}));node.mounted=null;var idx=node.mount.mounts.indexOf(mount);assert(idx!==-1);node.mount.mounts.splice(idx,1)}),lookup:(function(parent,name){return parent.node_ops.lookup(parent,name)}),mknod:(function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var err=FS.mayCreate(parent,name);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.mknod(parent,name,mode,dev)}),create:(function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)}),mkdir:(function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)}),mkdirTree:(function(path,mode){var dirs=path.split("/");var d="";for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}});var lazyArray=this;lazyArray.setDataGetter((function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]}));if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;console.log("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._length})},chunkSize:{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize})}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:(function(){return this.contents.length})}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach((function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}return fn.apply(null,arguments)}}));stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);assert(size>=0);if(contents.slice){for(var i=0;i>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;HEAP32[buf+36>>2]=stat.size;HEAP32[buf+40>>2]=4096;HEAP32[buf+44>>2]=stat.blocks;HEAP32[buf+48>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+52>>2]=0;HEAP32[buf+56>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ino;return 0}),doMsync:(function(addr,stream,len,flags){var buffer=new Uint8Array(HEAPU8.subarray(addr,addr+len));FS.msync(stream,buffer,0,len,flags)}),doMkdir:(function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}),doMknod:(function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-ERRNO_CODES.EINVAL}FS.mknod(path,mode,dev);return 0}),doReadlink:(function(path,buf,bufsize){if(bufsize<=0)return-ERRNO_CODES.EINVAL;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len}),doAccess:(function(path,amode){if(amode&~7){return-ERRNO_CODES.EINVAL}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-ERRNO_CODES.EACCES}return 0}),doDup:(function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd}),doReadv:(function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}),varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),getStreamFromFD:(function(){var stream=FS.getStream(SYSCALLS.get());if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return stream}),getSocketFromFD:(function(){var socket=SOCKFS.getSocket(SYSCALLS.get());if(!socket)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return socket}),getSocketAddress:(function(allowNull){var addrp=SYSCALLS.get(),addrlen=SYSCALLS.get();if(allowNull&&addrp===0)return null;var info=__read_sockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall20(which,varargs){SYSCALLS.varargs=varargs;try{return PROCINFO.pid}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}Module["_memset"]=_memset;Module["_bitshift64Shl"]=_bitshift64Shl;function ___syscall192(which,varargs){SYSCALLS.varargs=varargs;try{var addr=SYSCALLS.get(),len=SYSCALLS.get(),prot=SYSCALLS.get(),flags=SYSCALLS.get(),fd=SYSCALLS.get(),off=SYSCALLS.get();off<<=12;var ptr;var allocated=false;if(fd===-1){ptr=_memalign(PAGE_SIZE,len);if(!ptr)return-ERRNO_CODES.ENOMEM;_memset(ptr,0,len);allocated=true}else{var info=FS.getStream(fd);if(!info)return-ERRNO_CODES.EBADF;var res=FS.mmap(info,HEAPU8,addr,len,off,prot,flags);ptr=res.ptr;allocated=res.allocated}SYSCALLS.mappings[ptr]={malloc:ptr,len:len,allocated:allocated,fd:fd,flags:flags};return ptr}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall195(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr(),buf=SYSCALLS.get();return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall197(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),buf=SYSCALLS.get();return SYSCALLS.doStat(FS.stat,stream.path,buf)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___lock(){}function ___unlock(){}Module["_i64Add"]=_i64Add;function _realloc(){throw"bad"}Module["_realloc"]=_realloc;Module["_saveSetjmp"]=_saveSetjmp;var _environ=STATICTOP;STATICTOP+=16;function ___buildEnvironment(env){var MAX_ENV_VALUES=64;var TOTAL_ENV_SIZE=1024;var poolPtr;var envPtr;if(!___buildEnvironment.called){___buildEnvironment.called=true;ENV["USER"]=ENV["LOGNAME"]="web_user";ENV["PATH"]="/";ENV["PWD"]="/";ENV["HOME"]="/home/web_user";ENV["LANG"]="C";ENV["_"]=Module["thisProgram"];poolPtr=allocate(TOTAL_ENV_SIZE,"i8",ALLOC_STATIC);envPtr=allocate(MAX_ENV_VALUES*4,"i8*",ALLOC_STATIC);HEAP32[envPtr>>2]=poolPtr;HEAP32[_environ>>2]=envPtr}else{envPtr=HEAP32[_environ>>2];poolPtr=HEAP32[envPtr>>2]}var strings=[];var totalSize=0;for(var key in env){if(typeof env[key]==="string"){var line=key+"="+env[key];strings.push(line);totalSize+=line.length}}if(totalSize>TOTAL_ENV_SIZE){throw new Error("Environment size exceeded TOTAL_ENV_SIZE!")}var ptrSize=4;for(var i=0;i>2]=poolPtr;poolPtr+=line.length+1}HEAP32[envPtr+strings.length*ptrSize>>2]=0}var ENV={};function _setenv(envname,envval,overwrite){if(envname===0){___setErrNo(ERRNO_CODES.EINVAL);return-1}var name=Pointer_stringify(envname);var val=Pointer_stringify(envval);if(name===""||name.indexOf("=")!==-1){___setErrNo(ERRNO_CODES.EINVAL);return-1}if(ENV.hasOwnProperty(name)&&!overwrite)return 0;ENV[name]=val;___buildEnvironment(ENV);return 0}function __exit(status){Module["exit"](status)}function _exit(status){__exit(status)}function ___syscall91(which,varargs){SYSCALLS.varargs=varargs;try{var addr=SYSCALLS.get(),len=SYSCALLS.get();var info=SYSCALLS.mappings[addr];if(!info)return 0;if(len===info.len){var stream=FS.getStream(info.fd);SYSCALLS.doMsync(addr,stream,len,info.flags);FS.munmap(stream);SYSCALLS.mappings[addr]=null;if(info.allocated){_free(info.malloc)}}return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),op=SYSCALLS.get();switch(op){case 21505:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21506:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21519:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0};case 21520:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return-ERRNO_CODES.EINVAL};case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)};case 21523:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}Module["_bitshift64Ashr"]=_bitshift64Ashr;Module["_bitshift64Lshr"]=_bitshift64Lshr;Module["_testSetjmp"]=_testSetjmp;function _longjmp(env,value){Module["setThrew"](env,value||1);throw"longjmp"}function _llvm_trap(){abort("trap!")}function ___syscall33(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr(),amode=SYSCALLS.get();return SYSCALLS.doAccess(path,amode)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _emscripten_get_now(){abort()}function _emscripten_get_now_is_monotonic(){return ENVIRONMENT_IS_NODE||typeof dateNow!=="undefined"||(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&self["performance"]&&self["performance"]["now"]}function _clock_gettime(clk_id,tp){var now;if(clk_id===0){now=Date.now()}else if(clk_id===1&&_emscripten_get_now_is_monotonic()){now=_emscripten_get_now()}else{___setErrNo(ERRNO_CODES.EINVAL);return-1}HEAP32[tp>>2]=now/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function ___clock_gettime(){return _clock_gettime.apply(null,arguments)}function ___syscall10(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr();FS.unlink(path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___map_file(pathname,size){___setErrNo(ERRNO_CODES.EPERM);return-1}function _getenv(name){if(name===0)return 0;name=Pointer_stringify(name);if(!ENV.hasOwnProperty(name))return 0;if(_getenv.ret)_free(_getenv.ret);_getenv.ret=allocate(intArrayFromString(ENV[name]),"i8",ALLOC_NORMAL);return _getenv.ret}function ___syscall5(which,varargs){SYSCALLS.varargs=varargs;try{var pathname=SYSCALLS.getStr(),flags=SYSCALLS.get(),mode=SYSCALLS.get();var stream=FS.open(pathname,flags,mode);return stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module["_memcpy"]=_memcpy;function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}var cttz_i8=allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0],"i8",ALLOC_STATIC);Module["_llvm_cttz_i32"]=_llvm_cttz_i32;Module["___udivmoddi4"]=___udivmoddi4;Module["___udivdi3"]=___udivdi3;Module["___muldsi3"]=___muldsi3;Module["___muldi3"]=___muldi3;var _llvm_pow_f64=Math_pow;Module["_sbrk"]=_sbrk;Module["_memmove"]=_memmove;Module["___uremdi3"]=___uremdi3;function _times(buffer){if(buffer!==0){_memset(buffer,0,16)}return 0}function _abort(){Module["abort"]()}Module["_llvm_bswap_i32"]=_llvm_bswap_i32;Module["_llvm_bswap_i16"]=_llvm_bswap_i16;function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;assert(offset_high===0);FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doWritev(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall221(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),cmd=SYSCALLS.get();switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-ERRNO_CODES.EINVAL}var newStream;newStream=FS.open(stream.path,stream.flags,0,arg);return newStream.fd};case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0};case 12:case 12:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0};case 13:case 14:case 13:case 14:return 0;case 16:case 8:return-ERRNO_CODES.EINVAL;case 9:___setErrNo(ERRNO_CODES.EINVAL);return-1;default:{return-ERRNO_CODES.EINVAL}}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall145(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doReadv(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}FS.staticInit();__ATINIT__.unshift((function(){if(!Module["noFSInit"]&&!FS.init.initialized)FS.init()}));__ATMAIN__.push((function(){FS.ignorePermissions=false}));__ATEXIT__.push((function(){FS.quit()}));__ATINIT__.unshift((function(){TTY.init()}));__ATEXIT__.push((function(){TTY.shutdown()}));if(ENVIRONMENT_IS_NODE){var fs=require("fs");var NODEJS_PATH=require("path");NODEFS.staticInit()}___buildEnvironment(ENV);if(ENVIRONMENT_IS_NODE){_emscripten_get_now=function _emscripten_get_now_actual(){var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else if(typeof dateNow!=="undefined"){_emscripten_get_now=dateNow}else if(typeof self==="object"&&self["performance"]&&typeof self["performance"]["now"]==="function"){_emscripten_get_now=(function(){return self["performance"]["now"]()})}else if(typeof performance==="object"&&typeof performance["now"]==="function"){_emscripten_get_now=(function(){return performance["now"]()})}else{_emscripten_get_now=Date.now}DYNAMICTOP_PTR=allocate(1,"i32",ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;function invoke_vi(index,a1){try{Module["dynCall_vi"](index,a1)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiii(index,a1,a2,a3){try{return Module["dynCall_iiii"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){try{Module["dynCall_viiiii"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_d(index){try{return Module["dynCall_d"](index)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_di(index,a1){try{return Module["dynCall_di"](index,a1)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_i(index){try{return Module["dynCall_i"](index)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10){try{return Module["dynCall_iiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiidd(index,a1,a2,a3,a4){try{return Module["dynCall_iiidd"](index,a1,a2,a3,a4)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_vii(index,a1,a2){try{Module["dynCall_vii"](index,a1,a2)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){try{return Module["dynCall_iiiiiii"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiddi(index,a1,a2,a3,a4,a5,a6){try{Module["dynCall_viiiddi"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9){try{Module["dynCall_viiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_ii(index,a1){try{return Module["dynCall_ii"](index,a1)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_dddd(index,a1,a2,a3){try{return Module["dynCall_dddd"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viii(index,a1,a2,a3){try{Module["dynCall_viii"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_v(index){try{Module["dynCall_v"](index)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){try{return Module["dynCall_iiiii"](index,a1,a2,a3,a4)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){try{Module["dynCall_viiiiii"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iii(index,a1,a2){try{return Module["dynCall_iii"](index,a1,a2)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){try{return Module["dynCall_iiiiii"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){try{Module["dynCall_viiii"](index,a1,a2,a3,a4)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}Module.asmGlobalArg={"Math":Math,"Int8Array":Int8Array,"Int16Array":Int16Array,"Int32Array":Int32Array,"Uint8Array":Uint8Array,"Uint16Array":Uint16Array,"Uint32Array":Uint32Array,"Float32Array":Float32Array,"Float64Array":Float64Array,"NaN":NaN,"Infinity":Infinity};Module.asmLibraryArg={"abort":abort,"assert":assert,"enlargeMemory":enlargeMemory,"getTotalMemory":getTotalMemory,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"invoke_vi":invoke_vi,"invoke_iiii":invoke_iiii,"invoke_viiiii":invoke_viiiii,"invoke_d":invoke_d,"invoke_di":invoke_di,"invoke_i":invoke_i,"invoke_iiiiiiiiiii":invoke_iiiiiiiiiii,"invoke_iiidd":invoke_iiidd,"invoke_vii":invoke_vii,"invoke_iiiiiii":invoke_iiiiiii,"invoke_viiiddi":invoke_viiiddi,"invoke_viiiiiiiii":invoke_viiiiiiiii,"invoke_ii":invoke_ii,"invoke_dddd":invoke_dddd,"invoke_viii":invoke_viii,"invoke_v":invoke_v,"invoke_iiiii":invoke_iiiii,"invoke_viiiiii":invoke_viiiiii,"invoke_iii":invoke_iii,"invoke_iiiiii":invoke_iiiiii,"invoke_viiii":invoke_viiii,"___syscall221":___syscall221,"_emscripten_get_now_is_monotonic":_emscripten_get_now_is_monotonic,"_llvm_pow_f64":_llvm_pow_f64,"___syscall6":___syscall6,"___syscall20":___syscall20,"_setenv":_setenv,"___assert_fail":___assert_fail,"___buildEnvironment":___buildEnvironment,"_longjmp":_longjmp,"_clock_gettime":_clock_gettime,"_times":_times,"___setErrNo":___setErrNo,"___syscall192":___syscall192,"___syscall197":___syscall197,"_emscripten_get_now":_emscripten_get_now,"___syscall195":___syscall195,"__exit":__exit,"_emscripten_memcpy_big":_emscripten_memcpy_big,"___syscall91":___syscall91,"_getenv":_getenv,"___map_file":___map_file,"___syscall33":___syscall33,"___syscall54":___syscall54,"___unlock":___unlock,"_emscripten_asm_const_iii":_emscripten_asm_const_iii,"___syscall10":___syscall10,"___lock":___lock,"_abort":_abort,"___syscall5":___syscall5,"___clock_gettime":___clock_gettime,"_time":_time,"___syscall140":___syscall140,"_llvm_trap":_llvm_trap,"_exit":_exit,"___syscall145":___syscall145,"___syscall146":___syscall146,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"tempDoublePtr":tempDoublePtr,"ABORT":ABORT,"STACKTOP":STACKTOP,"STACK_MAX":STACK_MAX,"cttz_i8":cttz_i8};// EMSCRIPTEN_START_ASM +var asm=(function(global,env,buffer) { +"use asm";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.DYNAMICTOP_PTR|0;var j=env.tempDoublePtr|0;var k=env.ABORT|0;var l=env.STACKTOP|0;var m=env.STACK_MAX|0;var n=env.cttz_i8|0;var o=0;var p=0;var q=0;var r=0;var s=global.NaN,t=global.Infinity;var u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0.0;var D=0;var E=global.Math.floor;var F=global.Math.abs;var G=global.Math.sqrt;var H=global.Math.pow;var I=global.Math.cos;var J=global.Math.sin;var K=global.Math.tan;var L=global.Math.acos;var M=global.Math.asin;var N=global.Math.atan;var O=global.Math.atan2;var P=global.Math.exp;var Q=global.Math.log;var R=global.Math.ceil;var S=global.Math.imul;var T=global.Math.min;var U=global.Math.max;var V=global.Math.clz32;var W=env.abort;var X=env.assert;var Y=env.enlargeMemory;var Z=env.getTotalMemory;var _=env.abortOnCannotGrowMemory;var $=env.invoke_vi;var aa=env.invoke_iiii;var ba=env.invoke_viiiii;var ca=env.invoke_d;var da=env.invoke_di;var ea=env.invoke_i;var fa=env.invoke_iiiiiiiiiii;var ga=env.invoke_iiidd;var ha=env.invoke_vii;var ia=env.invoke_iiiiiii;var ja=env.invoke_viiiddi;var ka=env.invoke_viiiiiiiii;var la=env.invoke_ii;var ma=env.invoke_dddd;var na=env.invoke_viii;var oa=env.invoke_v;var pa=env.invoke_iiiii;var qa=env.invoke_viiiiii;var ra=env.invoke_iii;var sa=env.invoke_iiiiii;var ta=env.invoke_viiii;var ua=env.___syscall221;var va=env._emscripten_get_now_is_monotonic;var wa=env._llvm_pow_f64;var xa=env.___syscall6;var ya=env.___syscall20;var za=env._setenv;var Aa=env.___assert_fail;var Ba=env.___buildEnvironment;var Ca=env._longjmp;var Da=env._clock_gettime;var Ea=env._times;var Fa=env.___setErrNo;var Ga=env.___syscall192;var Ha=env.___syscall197;var Ia=env._emscripten_get_now;var Ja=env.___syscall195;var Ka=env.__exit;var La=env._emscripten_memcpy_big;var Ma=env.___syscall91;var Na=env._getenv;var Oa=env.___map_file;var Pa=env.___syscall33;var Qa=env.___syscall54;var Ra=env.___unlock;var Sa=env._emscripten_asm_const_iii;var Ta=env.___syscall10;var Ua=env.___lock;var Va=env._abort;var Wa=env.___syscall5;var Xa=env.___clock_gettime;var Ya=env._time;var Za=env.___syscall140;var _a=env._llvm_trap;var $a=env._exit;var ab=env.___syscall145;var bb=env.___syscall146;var cb=0.0; +// EMSCRIPTEN_START_FUNCS +function CV(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;$=l;l=l+96|0;X=$+32|0;f=$+16|0;Y=$;r=X;k=b+(a*56|0)|0;q=r+56|0;do{c[r>>2]=c[k>>2];r=r+4|0;k=k+4|0}while((r|0)<(q|0));Z=X+16|0;_=X+24|0;i=+h[_>>3];P=X+8|0;j=+h[P>>3];g=X+36|0;p=X+40|0;do if(!(i>j+1.0e-07)){if(!(i>3]>+h[X>>3]:0){O=4;break}O=(GV(a,b,1)|0)==0;f=c[g>>2]|0;if(O){n=0;O=7}else{f=EV(X,Z,f,b,e)|0;O=20}}else O=4;while(0);if((O|0)==4){c[f>>2]=c[X>>2];c[f+4>>2]=c[X+4>>2];c[f+8>>2]=c[X+8>>2];c[f+12>>2]=c[X+12>>2];c[X>>2]=c[Z>>2];c[X+4>>2]=c[Z+4>>2];c[X+8>>2]=c[Z+8>>2];c[X+12>>2]=c[Z+12>>2];c[Z>>2]=c[f>>2];c[Z+4>>2]=c[f+4>>2];c[Z+8>>2]=c[f+8>>2];c[Z+12>>2]=c[f+12>>2];O=c[g>>2]|0;f=c[p>>2]|0;c[g>>2]=f;c[p>>2]=O;if(!(GV(a,b,2)|0)){n=1;O=7}else{f=EV(X,Z,f,b,e)|0;O=19}}if((O|0)==7){m=EV(X,Z,f,b,e)|0;f=HV(d)|0;c[d+(f*72|0)+68>>2]=1;r=d+(f*72|0)|0;k=d+(m*72|0)|0;q=r+72|0;do{c[r>>2]=c[k>>2];r=r+4|0;k=k+4|0}while((r|0)<(q|0));t=+h[P>>3];h[d+(f*72|0)+16>>3]=t;h[d+(m*72|0)+32>>3]=t;t=+h[X>>3];h[d+(f*72|0)+8>>3]=t;h[d+(m*72|0)+24>>3]=t;c[d+(m*72|0)+48>>2]=f;c[d+(m*72|0)+52>>2]=0;c[d+(f*72|0)+40>>2]=m;c[d+(f*72|0)+44>>2]=0;g=c[d+(f*72|0)+48>>2]|0;if((g|0)>0){k=d+(g*72|0)+40|0;if((c[k>>2]|0)==(m|0))c[k>>2]=f;g=d+(g*72|0)+44|0;if((c[g>>2]|0)==(m|0))c[g>>2]=f}g=c[d+(f*72|0)+52>>2]|0;if((g|0)>0){k=d+(g*72|0)+40|0;if((c[k>>2]|0)==(m|0))c[k>>2]=f;g=d+(g*72|0)+44|0;if((c[g>>2]|0)==(m|0))c[g>>2]=f}M=IV()|0;O=IV()|0;N=d+(m*72|0)+56|0;L=c[N>>2]|0;c[e+(L*40|0)>>2]=2;K=e+(L*40|0)+8|0;c[K>>2]=c[X>>2];c[K+4>>2]=c[X+4>>2];c[K+8>>2]=c[X+8>>2];c[K+12>>2]=c[X+12>>2];c[e+(L*40|0)+4>>2]=a;c[e+(L*40|0)+32>>2]=O;c[e+(L*40|0)+36>>2]=M;c[e+(M*40|0)>>2]=3;c[e+(M*40|0)+24>>2]=m;c[e+(M*40|0)+28>>2]=L;c[e+(O*40|0)>>2]=3;c[e+(O*40|0)+24>>2]=f;c[e+(O*40|0)+28>>2]=L;c[N>>2]=M;c[d+(f*72|0)+56>>2]=O;if(n)O=19;else O=20}if((O|0)==19)if(!(GV(a,b,1)|0)){o=1;O=21}else{g=1;O=32}else if((O|0)==20)if(!(GV(a,b,2)|0)){o=0;O=21}else{g=0;O=32}if((O|0)==21){n=EV(Z,X,c[p>>2]|0,b,e)|0;m=HV(d)|0;c[d+(m*72|0)+68>>2]=1;r=d+(m*72|0)|0;k=d+(n*72|0)|0;q=r+72|0;do{c[r>>2]=c[k>>2];r=r+4|0;k=k+4|0}while((r|0)<(q|0));t=+h[_>>3];h[d+(m*72|0)+16>>3]=t;h[d+(n*72|0)+32>>3]=t;t=+h[Z>>3];h[d+(m*72|0)+8>>3]=t;h[d+(n*72|0)+24>>3]=t;c[d+(n*72|0)+48>>2]=m;c[d+(n*72|0)+52>>2]=0;c[d+(m*72|0)+40>>2]=n;c[d+(m*72|0)+44>>2]=0;g=c[d+(m*72|0)+48>>2]|0;if((g|0)>0){k=d+(g*72|0)+40|0;if((c[k>>2]|0)==(n|0))c[k>>2]=m;g=d+(g*72|0)+44|0;if((c[g>>2]|0)==(n|0))c[g>>2]=m}g=c[d+(m*72|0)+52>>2]|0;if((g|0)>0){k=d+(g*72|0)+40|0;if((c[k>>2]|0)==(n|0))c[k>>2]=m;g=d+(g*72|0)+44|0;if((c[g>>2]|0)==(n|0))c[g>>2]=m}M=IV()|0;N=IV()|0;g=d+(n*72|0)+56|0;L=c[g>>2]|0;c[e+(L*40|0)>>2]=2;K=e+(L*40|0)+8|0;c[K>>2]=c[Z>>2];c[K+4>>2]=c[Z+4>>2];c[K+8>>2]=c[Z+8>>2];c[K+12>>2]=c[Z+12>>2];c[e+(L*40|0)+4>>2]=a;c[e+(L*40|0)+32>>2]=N;c[e+(L*40|0)+36>>2]=M;c[e+(M*40|0)>>2]=3;c[e+(M*40|0)+24>>2]=n;c[e+(M*40|0)+28>>2]=L;c[e+(N*40|0)>>2]=3;c[e+(N*40|0)+24>>2]=m;c[e+(N*40|0)+28>>2]=L;c[g>>2]=M;c[d+(m*72|0)+56>>2]=N;N=f;f=0;g=o}else if((O|0)==32){N=f;n=EV(Z,X,c[p>>2]|0,b,e)|0;f=1}a:do if((N|0)>0){L=d+(n*72|0)+24|0;M=d+(n*72|0)+32|0;K=(f|0)!=0;G=g?b+(a*56|0)+48|0:b+(a*56|0)+44|0;I=Y+8|0;g=0;f=0;H=N;while(1){k=d+(H*72|0)|0;D=d+(H*72|0)+24|0;if(!(JV(D,L)|0))break a;m=d+(H*72|0)+56|0;C=c[m>>2]|0;o=IV()|0;p=IV()|0;c[e+(C*40|0)>>2]=1;c[e+(C*40|0)+4>>2]=a;c[e+(C*40|0)+32>>2]=o;c[e+(C*40|0)+36>>2]=p;c[e+(o*40|0)>>2]=3;c[e+(o*40|0)+24>>2]=H;c[e+(o*40|0)+28>>2]=C;c[e+(p*40|0)>>2]=3;E=HV(d)|0;c[e+(p*40|0)+24>>2]=E;J=d+(E*72|0)|0;c[d+(E*72|0)+68>>2]=1;c[e+(p*40|0)+28>>2]=C;g=(H|0)==(N|0)?E:g;C=d+(H*72|0)+32|0;if(+F(+(+h[C>>3]-+h[M>>3]))<=1.0e-07?+F(+(+h[D>>3]-+h[L>>3]))<=1.0e-07:0)f=E;r=J;q=r+72|0;do{c[r>>2]=c[k>>2];r=r+4|0;k=k+4|0}while((r|0)<(q|0));c[m>>2]=o;c[d+(E*72|0)+56>>2]=p;z=d+(H*72|0)+48|0;k=c[z>>2]|0;q=(k|0)<1;m=d+(H*72|0)+52|0;if(q?(c[m>>2]|0)<1:0)break;A=d+(E*72|0)+48|0;r=d+(H*72|0)+64|0;p=d+(E*72|0)+44|0;o=d+(E*72|0)+52|0;v=d+(H*72|0)+60|0;w=d+(E*72|0)+60|0;y=d+(E*72|0)+40|0;x=d+(H*72|0)+44|0;B=d+(H*72|0)+40|0;do if((k|0)>0?(c[m>>2]|0)<1:0){k=c[B>>2]|0;do if((k|0)>0?(Q=c[x>>2]|0,(Q|0)>0):0){k=c[v>>2]|0;if((k|0)<=0){c[y>>2]=Q;c[p>>2]=-1;c[x>>2]=-1;c[d+(Q*72|0)+48>>2]=E;break}if((c[r>>2]|0)==1){c[y>>2]=Q;c[x>>2]=-1;c[p>>2]=k;r=E;q=Q;k=c[B>>2]|0}else{c[p>>2]=-1;c[y>>2]=c[x>>2];q=c[B>>2]|0;c[x>>2]=q;c[B>>2]=k;r=H;p=y}c[d+(k*72|0)+48>>2]=H;c[d+(q*72|0)+48>>2]=r;c[d+((c[p>>2]|0)*72|0)+48>>2]=E;c[w>>2]=0;c[v>>2]=0}else O=52;while(0);do if((O|0)==52){O=0;q=d+(k*72|0)+48|0;r=c[q>>2]|0;k=d+(k*72|0)+52|0;if((r|0)>0?(c[k>>2]|0)>0:0){k=c[d+(r*72|0)+4>>2]|0;if((k|0)>0?(FV(k,b,Z)|0)==0:0){c[p>>2]=-1;c[x>>2]=-1;c[B>>2]=-1;c[d+((c[y>>2]|0)*72|0)+52>>2]=E;break}c[x>>2]=-1;c[p>>2]=-1;c[y>>2]=-1;c[d+((c[B>>2]|0)*72|0)+48>>2]=H;break}c[q>>2]=H;c[k>>2]=E}while(0);if(+F(+(+h[C>>3]-+h[M>>3]))<=1.0e-07?K&+F(+(+h[D>>3]-+h[L>>3]))<=1.0e-07:0){k=c[G>>2]|0;if((k|0)>0?(FV(k,b,X)|0)!=0:0){c[d+((c[z>>2]|0)*72|0)+40>>2]=H;m=o;k=E}else{c[d+((c[A>>2]|0)*72|0)+44>>2]=E;k=H}c[m>>2]=-1;c[d+(k*72|0)+48>>2]=-1;k=c[z>>2]|0;break}k=c[z>>2]|0;m=d+(k*72|0)+40|0;o=c[m>>2]|0;p=d+(k*72|0)+44|0;if((o|0)>0?(R=c[p>>2]|0,S=(o|0)==(H|0),(R|0)>0):0){c[d+(k*72|0)+60>>2]=S?R:o;c[d+(k*72|0)+64>>2]=S?1:2}c[m>>2]=H;c[p>>2]=E}else O=70;while(0);do if((O|0)==70){O=0;if(q?(c[m>>2]|0)>0:0){k=c[B>>2]|0;do if((k|0)>0?(T=c[x>>2]|0,(T|0)>0):0){k=c[v>>2]|0;if((k|0)<=0){c[y>>2]=T;c[p>>2]=-1;c[x>>2]=-1;c[d+(T*72|0)+48>>2]=E;break}if((c[r>>2]|0)==1){c[y>>2]=T;c[x>>2]=-1;c[p>>2]=k;r=E;q=T;k=c[B>>2]|0}else{c[p>>2]=-1;c[y>>2]=c[x>>2];q=c[B>>2]|0;c[x>>2]=q;c[B>>2]=k;r=H;p=y}c[d+(k*72|0)+48>>2]=H;c[d+(q*72|0)+48>>2]=r;c[d+((c[p>>2]|0)*72|0)+48>>2]=E;c[w>>2]=0;c[v>>2]=0}else O=80;while(0);do if((O|0)==80){O=0;q=d+(k*72|0)+48|0;r=c[q>>2]|0;k=d+(k*72|0)+52|0;if((r|0)>0?(c[k>>2]|0)>0:0){k=c[d+(r*72|0)+4>>2]|0;if((k|0)>0?(FV(k,b,Z)|0)==0:0){c[p>>2]=-1;c[x>>2]=-1;c[B>>2]=-1;c[d+((c[y>>2]|0)*72|0)+52>>2]=E;break}c[x>>2]=-1;c[p>>2]=-1;c[y>>2]=-1;c[d+((c[B>>2]|0)*72|0)+48>>2]=H;break}c[q>>2]=H;c[k>>2]=E}while(0);if(+F(+(+h[C>>3]-+h[M>>3]))<=1.0e-07?K&+F(+(+h[D>>3]-+h[L>>3]))<=1.0e-07:0){k=c[G>>2]|0;if((k|0)>0?(FV(k,b,X)|0)!=0:0){c[d+((c[m>>2]|0)*72|0)+40>>2]=H;k=E}else{c[d+((c[o>>2]|0)*72|0)+44>>2]=E;o=m;k=H}c[o>>2]=-1;c[d+(k*72|0)+48>>2]=-1;k=c[m>>2]|0;break}k=c[m>>2]|0;m=d+(k*72|0)+40|0;o=c[m>>2]|0;p=d+(k*72|0)+44|0;if((o|0)>0?(U=c[p>>2]|0,V=(o|0)==(H|0),(U|0)>0):0){c[d+(k*72|0)+60>>2]=V?U:o;c[d+(k*72|0)+64>>2]=V?1:2}c[m>>2]=H;c[p>>2]=E;break}i=+h[C>>3];j=+h[P>>3];s=i-j;u=!(+F(+s)<=1.0e-07);t=+h[X>>3];if(u){h[I>>3]=i;h[Y>>3]=t+s/(+h[_>>3]-j)*(+h[Z>>3]-t);u=(KV(Y,D)|0)!=0}else u=+h[D>>3]>t;k=c[B>>2]|0;do if((k|0)>0?(W=c[x>>2]|0,(W|0)>0):0){k=c[v>>2]|0;if((k|0)<=0){c[y>>2]=W;c[p>>2]=-1;c[x>>2]=-1;c[d+(W*72|0)+48>>2]=E;break}if((c[r>>2]|0)==1){c[y>>2]=W;c[x>>2]=-1;c[p>>2]=k;r=E;q=W;k=c[B>>2]|0}else{c[p>>2]=-1;c[y>>2]=c[x>>2];q=c[B>>2]|0;c[x>>2]=q;c[B>>2]=k;r=H;p=y}c[d+(k*72|0)+48>>2]=H;c[d+(q*72|0)+48>>2]=r;c[d+((c[p>>2]|0)*72|0)+48>>2]=E;c[w>>2]=0;c[v>>2]=0}else O=109;while(0);do if((O|0)==109){O=0;q=d+(k*72|0)+48|0;r=c[q>>2]|0;k=d+(k*72|0)+52|0;if((r|0)>0?(c[k>>2]|0)>0:0){k=c[d+(r*72|0)+4>>2]|0;if((k|0)>0?(FV(k,b,Z)|0)==0:0){c[p>>2]=-1;c[x>>2]=-1;c[B>>2]=-1;c[d+((c[y>>2]|0)*72|0)+52>>2]=E;break}c[x>>2]=-1;c[p>>2]=-1;c[y>>2]=-1;c[d+((c[B>>2]|0)*72|0)+48>>2]=H;break}c[q>>2]=H;c[k>>2]=E}while(0);if(+F(+(+h[C>>3]-+h[M>>3]))<=1.0e-07?K&+F(+(+h[D>>3]-+h[L>>3]))<=1.0e-07:0){k=c[z>>2]|0;c[d+(k*72|0)+40>>2]=H;c[d+(k*72|0)+44>>2]=-1;k=c[m>>2]|0;c[d+(k*72|0)+40>>2]=E;c[d+(k*72|0)+44>>2]=-1;c[A>>2]=k;c[o>>2]=-1;c[m>>2]=-1;k=-1}else O=119;do if((O|0)==119){O=0;k=c[z>>2]|0;c[d+(k*72|0)+40>>2]=H;p=d+(k*72|0)+44|0;if(u){c[p>>2]=E;D=c[m>>2]|0;c[d+(D*72|0)+40>>2]=E;c[d+(D*72|0)+44>>2]=-1;c[m>>2]=-1;break}else{c[p>>2]=-1;k=c[m>>2]|0;c[d+(k*72|0)+40>>2]=H;c[d+(k*72|0)+44>>2]=E;c[A>>2]=k;c[o>>2]=-1;k=c[m>>2]|0;break}}while(0)}while(0);c[J>>2]=a;c[d+(H*72|0)+4>>2]=a;if((k|0)>0)H=k;else break a}_3(138727,19,1,c[15715]|0)|0}else{g=0;f=0}while(0);LV(a,N,n,1,d,e);LV(a,g,f,2,d,e);c[b+(a*56|0)+32>>2]=1;l=$;return}function DV(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if(!(c[b+(a*56|0)+32>>2]|0)){f=b+(a*56|0)|0;g=b+(a*56|0)+16|0;h=b+(a*56|0)+36|0;c[h>>2]=c[d+((EV(f,g,c[h>>2]|0,b,e)|0)*72|0)+56>>2];a=b+(a*56|0)+40|0;c[a>>2]=c[d+((EV(g,f,c[a>>2]|0,b,e)|0)*72|0)+56>>2]}return}function EV(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0.0,i=0,j=0.0,k=0.0,l=0.0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0,s=0;p=b+8|0;r=a+8|0;i=d;a:while(1){m=f+(i*40|0)+36|0;d=f+(i*40|0)+32|0;b:do switch(c[f+(i*40|0)>>2]|0){case 3:{s=3;break a}case 2:{g=+h[r>>3];j=+h[f+(i*40|0)+16>>3];k=j+1.0e-07;if(!(g>k)){l=j+-1.0e-07;i=f+(i*40|0)+8|0;if(!(g>3]>+h[i>>3]:0){d=m;break b}if(+F(+(g-j))<=1.0e-07?(n=+h[i>>3],+F(+(+h[a>>3]-n))<=1.0e-07):0){g=+h[p>>3];if(g>k)d=m;else if(!(g>3]>n:0){d=m;break b}}}else d=m;break}case 1:{j=+h[r>>3];i=c[f+(i*40|0)+4>>2]|0;if(+F(+(j-+h[e+(i*56|0)+8>>3]))<=1.0e-07?(o=+h[a>>3],+F(+(o-+h[e+(i*56|0)>>3]))<=1.0e-07):0)g=o;else s=16;do if((s|0)==16){s=0;if(+F(+(j-+h[e+(i*56|0)+24>>3]))<=1.0e-07?(q=+h[a>>3],+F(+(q-+h[e+(i*56|0)+16>>3]))<=1.0e-07):0){g=q;break}i=(FV(i,e,a)|0)==0;d=i?m:d;break b}while(0);if(!(+F(+(j-+h[p>>3]))<=1.0e-07)){i=(FV(i,e,b)|0)==0;d=i?m:d;break b}if(!(+h[b>>3]>2]|0}if((s|0)==3)return c[f+(i*40|0)+24>>2]|0;else if((s|0)==23){_3(138661,35,1,c[15715]|0)|0;Aa(138697,138699,349,138711)}return 0}function FV(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,g=0,i=0.0,j=0.0,k=0,l=0.0;i=+h[b+(a*56|0)+24>>3];j=+h[b+(a*56|0)+8>>3];k=b+(a*56|0)+16|0;b=b+(a*56|0)|0;a=c+8|0;do if(!(i>j+1.0e-07)){if(!(i>3]>+h[b>>3]:0){g=4;break}f=+h[a>>3];a=!(+F(+(i-f))<=1.0e-07);e=+h[c>>3];if(!a){d=e<+h[k>>3]?1.0:-1.0;break}c=!(+F(+(j-f))<=1.0e-07);d=+h[b>>3];if(c){l=+h[k>>3];d=(f-i)*(d-l)-(j-i)*(e-l);break}else{d=e>3];g=!(+F(+(i-f))<=1.0e-07);e=+h[c>>3];if(!g){d=e<+h[k>>3]?1.0:-1.0;break}g=!(+F(+(j-f))<=1.0e-07);d=+h[b>>3];if(g){d=(f-j)*(+h[k>>3]-d)-(i-j)*(e-d);break}else{d=e0.0|0}function GV(a,b,d){a=a|0;b=b|0;d=d|0;return c[b+((c[((d|0)==1?b+(a*56|0)+48|0:b+(a*56|0)+44|0)>>2]|0)*56|0)+32>>2]|0}function HV(a){a=a|0;var b=0,d=0,e=0;e=l;l=l+16|0;d=e;b=c[47466]|0;if((b|0)<(c[47465]|0)){c[a+(b*72|0)>>2]=-1;c[a+(b*72|0)+4>>2]=-1;c[a+(b*72|0)+68>>2]=1;c[47466]=b+1;l=e;return b|0}else{e=c[15715]|0;c[d>>2]=b;z4(e,138786,d)|0;Aa(138697,138699,88,138824)}return 0}function IV(){var a=0;a=c[47467]|0;if((a|0)<(c[47464]|0)){c[47467]=a+1;return a|0}else{_3(138747,30,1,c[15715]|0)|0;Aa(138697,138699,72,138778)}return 0}function JV(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+h[a+8>>3];d=+h[b+8>>3];if(!(c>d+1.0e-07))if(c>3]>=+h[b>>3]&1;else a=1;return a|0}function KV(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+h[a+8>>3];d=+h[b+8>>3];if(!(cd+1.0e-07)a=0;else a=+h[a>>3]<+h[b>>3]&1;else a=1;return a|0}function LV(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;q=f+(d*72|0)+24|0;p=(e|0)==1;a:while(1){o=f+(b*72|0)+24|0;j=f+(b*72|0)+48|0;k=f+(b*72|0)+52|0;l=f+(b*72|0)|0;m=f+(b*72|0)+4|0;n=f+(b*72|0)+56|0;if((b|0)<=0)break;while(1){if(!(JV(o,q)|0))break a;d=c[j>>2]|0;e=(d|0)>0;do if(p){if(e?(c[f+(d*72|0)+4>>2]|0)==(a|0):0)break;d=c[k>>2]|0;if((d|0)<=0){b=d;continue a}e=d;d=f+(d*72|0)+4|0;r=13}else{if(e?(c[f+(d*72|0)>>2]|0)==(a|0):0)break;d=c[k>>2]|0;if((d|0)<=0){b=d;continue a}e=d;d=f+(d*72|0)|0;r=13}while(0);if((r|0)==13){r=0;if((c[d>>2]|0)==(a|0))d=e;else{b=e;continue a}}if((c[l>>2]|0)!=(c[f+(d*72|0)>>2]|0)){b=d;continue a}if((c[m>>2]|0)!=(c[f+(d*72|0)+4>>2]|0)){b=d;continue a}s=c[f+(d*72|0)+56>>2]|0;e=c[g+(s*40|0)+28>>2]|0;h=g+(e*40|0)+32|0;i=c[n>>2]|0;if((c[h>>2]|0)==(s|0))c[h>>2]=i;else c[g+(e*40|0)+36>>2]=i;e=c[f+(d*72|0)+48>>2]|0;c[j>>2]=e;do if((e|0)>0){h=f+(e*72|0)+40|0;if((c[h>>2]|0)==(d|0)){c[h>>2]=b;break}e=f+(e*72|0)+44|0;if((c[e>>2]|0)==(d|0))c[e>>2]=b}while(0);e=c[f+(d*72|0)+52>>2]|0;c[k>>2]=e;do if((e|0)>0){h=f+(e*72|0)+40|0;if((c[h>>2]|0)==(d|0)){c[h>>2]=b;break}e=f+(e*72|0)+44|0;if((c[e>>2]|0)==(d|0))c[e>>2]=b}while(0);s=f+(d*72|0)+24|0;c[o>>2]=c[s>>2];c[o+4>>2]=c[s+4>>2];c[o+8>>2]=c[s+8>>2];c[o+12>>2]=c[s+12>>2];c[f+(d*72|0)+68>>2]=2}}return}function MV(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0;e=+h[b+8>>3];f=+h[d+8>>3];do if(!(e>f+1.0e-07)){if(!(+F(+(e-f))<=1.0e-07)){c[a>>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];break}if(+h[b>>3]>+h[d>>3]+1.0e-07){c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];break}else{c[a>>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];break}}else{c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2]}while(0);return}function NV(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0;e=+h[b+8>>3];f=+h[d+8>>3];do if(!(e>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];break}if(+h[b>>3]<+h[d>>3]){c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];break}else{c[a>>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];break}}else{c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2]}while(0);return}function OV(a){a=a|0;var b=0;b=HK(8)|0;if(b|0){c[b+4>>2]=a;c[b>>2]=0}return b|0}function PV(a,b){a=a|0;b=b|0;if(b){b=OV(b)|0;c[b>>2]=a;a=b}return a|0}function QV(a){a=a|0;var b=0;do{b=a;a=c[a>>2]|0;l6(b)}while((a|0)!=0);return}function RV(){var a=0;a=HK(1992)|0;if(a|0)c[a>>2]=SV(a)|0;return a|0}function SV(a){a=a|0;var b=0;b=YV(a)|0;c[b+4>>2]=0;a=a+1972|0;c[a>>2]=(c[a>>2]|0)+1;return b|0}function TV(a){a=a|0;UV(a,c[a>>2]|0);l6(c[a>>2]|0);l6(a);return 0}function UV(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;g=a+1936|0;h=a+1980|0;i=a+1912|0;a:do if((c[b+4>>2]|0)>0){d=0;while(1){if((d|0)==64)break a;e=b+8+(d*20|0)+16|0;f=c[e>>2]|0;if(f|0?(UV(a,f),l6(c[e>>2]|0),cW(b,d),c[h>>2]=(c[h>>2]|0)+-1,c[i>>2]|0):0)c[g>>2]=(c[g>>2]|0)+1;d=d+1|0}}else{d=0;while(1){if((d|0)==64)break a;if(c[b+8+(d*20|0)+16>>2]|0?(cW(b,d),c[h>>2]=(c[h>>2]|0)+-1,c[i>>2]|0):0)c[g>>2]=(c[g>>2]|0)+1;d=d+1|0}}while(0);return}function VV(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;if(!b)Aa(139182,138832,194,138840);e=c[b+4>>2]|0;if((e|0)<=-1)Aa(138852,138832,195,138840);if(!d)Aa(139124,138832,196,138840);i=a+1952|0;c[i>>2]=(c[i>>2]|0)+1;a:do if((e|0)>0){i=0;e=0;while(1){if((i|0)==64)break a;f=b+8+(i*20|0)+16|0;if((c[f>>2]|0)!=0?(hW(d,b+8+(i*20|0)|0)|0)!=0:0){g=VV(a,c[f>>2]|0,d)|0;if(!e)e=g;else{f=e;while(1){h=c[f>>2]|0;if(!h)break;else f=h}c[f>>2]=g}}i=i+1|0}}else{g=0;e=0;while(1){if((g|0)==64)break a;f=b+8+(g*20|0)|0;if((c[b+8+(g*20|0)+16>>2]|0)!=0?(hW(d,f)|0)!=0:0)e=PV(e,f)|0;g=g+1|0}}while(0);return e|0}function WV(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;o=l;l=l+64|0;j=o+52|0;k=o+32|0;m=o+16|0;n=o;c[j>>2]=0;if(!((b|0)!=0&(e|0)!=0))Aa(139038,138832,247,138866);if((f|0)>-1?(i=c[e>>2]|0,(c[i+4>>2]|0)>=(f|0)):0){g=0;while(1){if((g|0)>=2)break;if((c[b+(g<<2)>>2]|0)>(c[b+(g+2<<2)>>2]|0)){h=8;break}else g=g+1|0}if((h|0)==8)Aa(138913,138832,250,138866);g=a+1912|0;h=a+1908|0;if(c[g>>2]|0){p=c[h>>2]|0?a+1924|0:a+1916|0;c[p>>2]=(c[p>>2]|0)+1}if(!(c[h>>2]|0)){p=a+1964|0;c[p>>2]=(c[p>>2]|0)+1}if(!(XV(a,b,d,i,j,f)|0))g=0;else{if(c[g>>2]|0){p=c[h>>2]|0?a+1948|0:a+1944|0;c[p>>2]=(c[p>>2]|0)+1}g=YV(a)|0;p=a+1976|0;c[p>>2]=(c[p>>2]|0)+1;p=c[e>>2]|0;c[g+4>>2]=(c[p+4>>2]|0)+1;$V(m,p);c[k>>2]=c[m>>2];c[k+4>>2]=c[m+4>>2];c[k+8>>2]=c[m+8>>2];c[k+12>>2]=c[m+12>>2];p=k+16|0;c[p>>2]=c[e>>2];bW(a,k,g,0)|0;$V(n,c[j>>2]|0);c[k>>2]=c[n>>2];c[k+4>>2]=c[n+4>>2];c[k+8>>2]=c[n+8>>2];c[k+12>>2]=c[n+12>>2];c[p>>2]=c[j>>2];bW(a,k,g,0)|0;c[e>>2]=g;g=a+1980|0;c[g>>2]=(c[g>>2]|0)+2;g=1}l=o;return g|0}Aa(138878,138832,248,138866);return 0}function XV(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+80|0;m=q+52|0;n=q+48|0;o=q+32|0;p=q+16|0;k=q;c[n>>2]=0;if(!((b|0)!=0&(e|0)!=0&(f|0)!=0))Aa(138956,138832,311,138970);if((g|0)>-1?(i=e+4|0,h=c[i>>2]|0,(h|0)>=(g|0)):0){if(c[a+1912>>2]|0){h=c[a+1908>>2]|0?a+1948|0:a+1944|0;c[h>>2]=(c[h>>2]|0)+1;h=c[i>>2]|0}do if((h|0)>(g|0)){i=aW(b,e)|0;h=e+8+(i*20|0)+16|0;i=e+8+(i*20|0)|0;if(!(XV(a,b,d,c[h>>2]|0,n,g)|0)){gW(o,b,i);c[i>>2]=c[o>>2];c[i+4>>2]=c[o+4>>2];c[i+8>>2]=c[o+8>>2];c[i+12>>2]=c[o+12>>2];j=0;break}else{$V(p,c[h>>2]|0);c[i>>2]=c[p>>2];c[i+4>>2]=c[p+4>>2];c[i+8>>2]=c[p+8>>2];c[i+12>>2]=c[p+12>>2];j=c[n>>2]|0;c[m+16>>2]=j;$V(k,j);c[m>>2]=c[k>>2];c[m+4>>2]=c[k+4>>2];c[m+8>>2]=c[k+8>>2];c[m+12>>2]=c[k+12>>2];j=a+1980|0;c[j>>2]=(c[j>>2]|0)+1;j=bW(a,m,e,f)|0;break}}else if((h|0)==(g|0)){c[m>>2]=c[b>>2];c[m+4>>2]=c[b+4>>2];c[m+8>>2]=c[b+8>>2];c[m+12>>2]=c[b+12>>2];c[m+16>>2]=d;j=a+1980|0;c[j>>2]=(c[j>>2]|0)+1;j=bW(a,m,e,f)|0;break}else Aa(139015,138832,341,138970);while(0);l=q;return j|0}Aa(138983,138832,312,138970);return 0}function YV(a){a=a|0;a=a+1968|0;c[a>>2]=(c[a>>2]|0)+1;a=k6(1288)|0;ZV(a);return a|0}function ZV(a){a=a|0;var b=0;c[a>>2]=0;c[a+4>>2]=-1;b=0;while(1){if((b|0)==64)break;_V(a+8+(b*20|0)|0);b=b+1|0}return}function _V(a){a=a|0;dW(a);c[a+16>>2]=0;return}function $V(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+32|0;g=i+16|0;h=i;if(!b)Aa(139182,139021,99,139028);dW(g);d=1;f=0;while(1){if((f|0)==64)break;do if(c[b+8+(f*20|0)+16>>2]|0){e=b+8+(f*20|0)|0;if(!d){gW(h,g,e);c[g>>2]=c[h>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];c[g+12>>2]=c[h+12>>2];d=0;break}else{c[g>>2]=c[e>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];c[g+12>>2]=c[e+12>>2];d=0;break}}while(0);f=f+1|0}c[a>>2]=c[g>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2];c[a+12>>2]=c[g+12>>2];l=i;return}function aW(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;k=l;l=l+32|0;i=k+16|0;j=k;if(!((a|0)!=0&(b|0)!=0))Aa(139038,139021,125,139045);d=0;e=0;f=0;g=1;h=0;while(1){if((h|0)==64)break;if(c[b+8+(h*20|0)+16>>2]|0){n=b+8+(h*20|0)|0;p=fW(n)|0;gW(j,a,n);c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];n=(fW(i)|0)-p|0;m=(g|0)!=0|(n|0)<(f|0);o=m|(p|0)<(e|0)&(n|0)==(f|0);d=o?h:d;e=o?p:e;f=o?n:f;g=m?0:g}h=h+1|0}l=k;return d|0}function bW(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if(!b)Aa(139204,139021,167,139056);if(!d)Aa(139182,139021,168,139056);do if((c[d>>2]|0)<64){a=0;while(1){if((a|0)>=64){e=10;break}if(!(c[d+8+(a*20|0)+16>>2]|0)){e=8;break}a=a+1|0}if((e|0)==8){f=d+8+(a*20|0)|0;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];c[f+16>>2]=c[b+16>>2];f=0;g=d;break}else if((e|0)==10)Aa(139066,139021,178,139056)}else{if(c[a+1912>>2]|0){h=c[a+1908>>2]|0?a+1948|0:a+1944|0;c[h>>2]=(c[h>>2]|0)+1}if(!e)Aa(139079,139021,187,139056);else{iW(a,d,b,e);f=1;g=(c[d+4>>2]|0)==0?a+1972|0:a+1976|0;break}}while(0);c[g>>2]=(c[g>>2]|0)+1;return f|0}function cW(a,b){a=a|0;b=b|0;if(!((a|0)!=0&b>>>0<64))Aa(139083,139021,201,139111);if(!(c[a+8+(b*20|0)+16>>2]|0))Aa(139605,139021,202,139111);else{_V(a+8+(b*20|0)|0);c[a>>2]=(c[a>>2]|0)+-1;return}}function dW(a){a=a|0;var b=0;b=0;while(1){if((b|0)==4)break;c[a+(b<<2)>>2]=0;b=b+1|0}return}function eW(a){a=a|0;var b=0,d=0,e=0;e=l;l=l+16|0;d=e;c[d>>2]=1;c[d+8>>2]=-1;b=1;while(1){if((b|0)==2)break;c[d+(b+2<<2)>>2]=0;c[d+(b<<2)>>2]=0;b=b+1|0}c[a>>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];l=e;return}function fW(a){a=a|0;var b=0,d=0,e=0;if(!a)Aa(139124,139126,128,139138);a:do if((c[a>>2]|0)>(c[a+8>>2]|0))b=0;else{b=1;d=0;while(1){if((d|0)==2)break a;e=S(c[a+(d+2<<2)>>2]|0,b)|0;b=e-(c[a+(d<<2)>>2]|0)|0;d=d+1|0}}while(0);return b|0}function gW(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;g=l;l=l+16|0;f=g;if(!((b|0)!=0&(d|0)!=0))Aa(139147,139126,195,139155);do if((c[b>>2]|0)>(c[b+8>>2]|0)){c[a>>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2]}else{if((c[d>>2]|0)>(c[d+8>>2]|0)){c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];break}else e=0;while(1){if((e|0)==2)break;j=c[b+(e<<2)>>2]|0;h=c[d+(e<<2)>>2]|0;c[f+(e<<2)>>2]=(j|0)<(h|0)?j:h;h=e+2|0;j=c[b+(h<<2)>>2]|0;i=c[d+(h<<2)>>2]|0;c[f+(h<<2)>>2]=(j|0)>(i|0)?j:i;e=e+1|0}c[a>>2]=c[f>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2]}while(0);l=g;return}function hW(a,b){a=a|0;b=b|0;var d=0,e=0;if((a|0)!=0&(b|0)!=0)d=0;else Aa(139167,139126,216,139174);while(1){if((d|0)>=2){d=1;break}e=d+2|0;if((c[a+(d<<2)>>2]|0)>(c[b+(e<<2)>>2]|0)){d=0;break}if((c[b+(d<<2)>>2]|0)>(c[a+(e<<2)>>2]|0)){d=0;break}else d=d+1|0}return d|0}function iW(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0;if(!b)Aa(139182,139184,40,139194);if(!d)Aa(139204,139184,41,139194);j=a+1912|0;k=a+1908|0;if(c[j>>2]|0){i=c[k>>2]|0?a+1932|0:a+1928|0;c[i>>2]=(c[i>>2]|0)+1}h=b+4|0;i=c[h>>2]|0;jW(a,b,d);d=a+1324|0;kW(a);f=fW(a+1852|0)|0;f=(fW(a+1868|0)|0)+f|0;if(c[j>>2]|0?(f|0)!=0&(c[k>>2]|0)==0:0){k=a+1960|0;g[k>>2]=+g[k>>2]+ +((c[a+1320>>2]|0)>>>0)/+(f|0)}k=YV(a)|0;c[e>>2]=k;c[h>>2]=i;c[k+4>>2]=i;lW(a,b,k,d);if(((c[c[e>>2]>>2]|0)+(c[b>>2]|0)|0)==65)return;else Aa(139206,139184,86,139194)}function jW(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;h=l;l=l+16|0;g=h;if(!b)Aa(139182,139184,106,139593);if(!d)Aa(139204,139184,107,139593);else e=0;while(1){if((e|0)>=64)break;if(!(c[b+8+(e*20|0)+16>>2]|0)){f=7;break}j=b+8+(e*20|0)|0;i=a+4+(e*20|0)|0;c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];c[i+16>>2]=c[j+16>>2];e=e+1|0}if((f|0)==7)Aa(139605,139184,111,139593);e=a+4|0;j=a+1284|0;c[j>>2]=c[d>>2];c[j+4>>2]=c[d+4>>2];c[j+8>>2]=c[d+8>>2];c[j+12>>2]=c[d+12>>2];c[j+16>>2]=c[d+16>>2];d=a+1304|0;c[d>>2]=c[e>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[d+12>>2]=c[e+12>>2];e=1;while(1){if((e|0)==65)break;gW(g,d,a+4+(e*20|0)|0);c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];e=e+1|0}c[a+1320>>2]=fW(d)|0;ZV(b);l=h;return}function kW(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;u=l;l=l+48|0;i=u+32|0;k=u+16|0;m=u;mW(a);nW(a);s=a+1844|0;q=a+1848|0;t=a+1892|0;n=a+1852|0;o=a+1884|0;p=a+1868|0;j=a+1888|0;f=0;e=0;while(1){b=c[s>>2]|0;d=c[q>>2]|0;if((d+b|0)>=65)break;h=65-(c[t>>2]|0)|0;b=(b|0)<(h|0);if(b&(d|0)<(h|0)){g=-1;h=0}else{r=12;break}while(1){if((h|0)==65)break;if(!(c[a+1584+(h<<2)>>2]|0)){v=a+4+(h*20|0)|0;gW(k,v,n);c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];b=fW(i)|0;d=c[o>>2]|0;gW(m,v,p);c[i>>2]=c[m>>2];c[i+4>>2]=c[m+4>>2];c[i+8>>2]=c[m+8>>2];c[i+12>>2]=c[m+12>>2];v=fW(i)|0;b=v-(c[j>>2]|0)+(d-b)|0;d=(b|0)>-1;b=d?b:0-b|0;d=(d^1)&1;if((b|0)<=(g|0))if((b|0)==(g|0)){v=(c[a+1844+(d<<2)>>2]|0)<(c[a+1844+(f<<2)>>2]|0);b=g;d=v?d:f;e=v?h:e}else{b=g;d=f}else e=h}else{b=g;d=f}g=b;h=h+1|0;f=d}oW(a,e,f)}if((r|0)==12){b=(b^1)&1;d=0;while(1){if((d|0)==65)break;if(!(c[a+1584+(d<<2)>>2]|0))oW(a,d,b);d=d+1|0}d=c[q>>2]|0;b=c[s>>2]|0}if((d+b|0)!=65)Aa(139349,139184,210,139435);v=c[t>>2]|0;if((b|0)<(v|0)|(d|0)<(v|0))Aa(139446,139184,212,139435);else{l=u;return}}function lW(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;if(!b)Aa(139182,139184,297,139246);if(!d)Aa(139256,139184,298,139246);if(!e)Aa(139258,139184,299,139246);else g=0;while(1){if((g|0)>=65){e=14;break}f=c[a+1324+(g<<2)>>2]|0;if(f>>>0>=2){e=9;break}e=a+4+(g*20|0)|0;switch(f|0){case 0:{bW(a,e,b,0)|0;break}case 1:{bW(a,e,d,0)|0;break}default:{}}g=g+1|0}if((e|0)==9)Aa(139260,139184,303,139246);else if((e|0)==14)return}function mW(a){a=a|0;var b=0,d=0,e=0,f=0;d=l;l=l+16|0;e=d;c[a+1848>>2]=0;c[a+1844>>2]=0;b=a+1852|0;f=a+1868|0;eW(e);c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[f+12>>2]=c[e+12>>2];c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];c[a+1888>>2]=0;c[a+1884>>2]=0;b=0;while(1){if((b|0)==65)break;c[a+1584+(b<<2)>>2]=0;c[a+1324+(b<<2)>>2]=-1;b=b+1|0}l=d;return}function nW(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;o=l;l=l+304|0;k=o+32|0;m=o+16|0;n=o;b=0;while(1){if((b|0)==65)break;c[k+(b<<2)>>2]=fW(a+4+(b*20|0)|0)|0;b=b+1|0}b=0;d=0;e=0;g=0;a:while(1){if((g|0)==64)break;i=g+1|0;j=a+4+(g*20|0)|0;h=k+(g<<2)|0;f=i;while(1){if((f|0)==65){g=i;continue a}gW(n,j,a+4+(f*20|0)|0);c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];p=fW(m)|0;p=p-(c[h>>2]|0)-(c[k+(f<<2)>>2]|0)|0;q=p>>>0>e>>>0;r=q?f:b;f=f+1|0;b=r;d=q?g:d;e=q?p:e}}oW(a,d,0);oW(a,b,1);l=o;return}function oW(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;h=i;e=a+1584+(b<<2)|0;if(c[e>>2]|0)Aa(139549,139184,257,139584);c[a+1324+(b<<2)>>2]=d;c[e>>2]=1;g=a+1844+(d<<2)|0;f=a+1852+(d<<4)|0;e=a+4+(b*20|0)|0;if(!(c[g>>2]|0)){c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[f+12>>2]=c[e+12>>2]}else{gW(h,e,f);c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2]}c[a+1884+(d<<2)>>2]=fW(f)|0;c[g>>2]=(c[g>>2]|0)+1;l=i;return}function pW(){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+1200|0;t=v+800|0;h=v;c[47468]=0;c[47469]=-2;f=t;j=200;n=h;o=0;q=0;g=t;a:while(1){b[g>>1]=o;if((f+(j<<1)+-2|0)>>>0>g>>>0){r=j;s=f;p=h;i=n}else{m=(g-f>>1)+1|0;if(j>>>0>9999){u=96;break}j=j<<1;j=j>>>0<1e4?j:1e4;e=k6(j*6|3)|0;if(e){B6(e|0,f|0,m<<1|0)|0;i=e+(j>>>1<<2)|0;B6(i|0,n|0,m<<2|0)|0;if((f|0)==(t|0)){k=0;f=e}else{l6(f);k=0;f=e}}else{k=4;i=n}e=(k|0)==0;switch((e?((j|0)>(m|0)?0:9):k)&15){case 9:{e=1;u=97;break a}case 4:{u=96;break a}case 0:{r=j;s=f;p=e?i+(m<<2)+-4|0:h;g=e?f+(m<<1)+-2|0:g;break}default:{e=0;break a}}}if((o|0)==31){e=0;f=s;u=97;break}e=b[65806+(o<<1)>>1]|0;j=e<<16>>16;k=(q|0)!=0;do if(e<<16>>16!=-82){f=c[47469]|0;if((f|0)==-2){f=EX()|0;c[47469]=f}if((f|0)>=1)if(f>>>0<296)h=d[139624+f>>0]|0;else h=2;else{c[47469]=0;h=0}f=h+j|0;if(f>>>0<=271?(a[139920+f>>0]|0)==(h|0):0){o=a[140192+f>>0]|0;e=o<<24>>24;if(o<<24>>24<1){f=0-e|0;u=23;break}else{c[47469]=-2;h=p+4|0;c[h>>2]=c[47470];k=k?q+-1|0:0;break}}else u=22}else u=22;while(0);if((u|0)==22){u=0;o=a[140464+o>>0]|0;f=o&255;if(!(o<<24>>24)){do if(k)if((q|0)==3){f=c[47469]|0;if((f|0)<1)if(!f){e=1;f=s;u=97;break a}else{f=p;break}else{c[47469]=-2;f=p;break}}else f=p;else{c[47468]=(c[47468]|0)+1;KW(142682);f=p}while(0);while(1){if(e<<16>>16==8)break;if((g|0)==(s|0)){e=1;f=s;u=97;break a}e=g+-2|0;f=f+-4|0;g=e;e=b[65806+(b[e>>1]<<1)>>1]|0}h=f+4|0;c[h>>2]=c[47470];e=1;k=3}else u=23}do if((u|0)==23){u=0;m=d[140580+f>>0]|0;e=c[p+(1-m<<2)>>2]|0;h=p+-12|0;j=p+-4|0;k=p+-8|0;do switch(f|0){case 4:{u=26;break a}case 2:{c[47471]=qW(c[j>>2]|0,2)|0;break}case 3:{c[47471]=qW(c[j>>2]|0,1)|0;break}case 5:{e=sW()|0;break}case 8:{tW(c[47472]|0);break}case 9:{uW(c[p>>2]|0);break}case 18:{vW(c[p>>2]|0);break}case 19:{wW();break}case 20:{vW(c[p>>2]|0);break}case 21:{wW();break}case 22:{vW(c[p>>2]|0);break}case 23:{wW();break}case 24:{vW(c[p>>2]|0);break}case 25:{wW();break}case 26:{vW(c[p>>2]|0);break}case 27:{wW();break}case 28:{vW(c[p>>2]|0);break}case 29:{wW();break}case 30:{vW(c[p>>2]|0);break}case 31:{wW();break}case 32:{vW(c[p>>2]|0);break}case 33:{wW();break}case 34:{e=c[j>>2]|0;break}case 35:{e=c[p>>2]|0;break}case 38:{e=c[47472]|0;h=c[e+4>>2]|0;if(h>>>0>=(c[e+8>>2]|0)>>>0){iA(e,1)|0;h=c[47472]|0;e=h;h=c[h+4>>2]|0}a[h>>0]=0;o=c[e>>2]|0;c[e+4>>2]=o;if(xW(o)|0){u=51;break a}c[(c[p>>2]|0)+80>>2]=c[47473];e=Sz(56092,c[4590]|0)|0;c[(c[p>>2]|0)+84>>2]=e;c[47473]=c[p>>2];c[(c[p>>2]|0)+108>>2]=c[c[47474]>>2];e=c[p>>2]|0;break}case 39:{e=c[47472]|0;h=c[e+4>>2]|0;if(h>>>0>=(c[e+8>>2]|0)>>>0){iA(e,1)|0;h=c[47472]|0;e=h;h=c[h+4>>2]|0}a[h>>0]=0;o=c[e>>2]|0;c[e+4>>2]=o;if(xW(o)|0){u=56;break a}e=c[47473]|0;c[47473]=c[e+80>>2];break}case 40:{e=c[p>>2]|0;break}case 41:{e=c[j>>2]|0;break}case 42:{e=c[j>>2]|0;break}case 43:{e=c[j>>2]|0;break}case 44:{e=c[j>>2]|0;break}case 45:{e=c[j>>2]|0;break}case 48:{e=c[p>>2]|0;break}case 49:{e=c[p>>2]|0;break}case 50:{a[(c[k>>2]|0)+12>>0]=1;e=c[p>>2]|0;break}case 51:{yW();break}case 52:{e=zW()|0;break}case 53:{e=c[p>>2]|0;break}case 54:{e=c[p>>2]|0;break}case 55:{e=(c[k>>2]|0)+100|0;a[e>>0]=a[e>>0]|1;e=c[p>>2]|0;break}case 56:{AW(c[j>>2]|0,c[p>>2]|0,1);break}case 57:{e=c[h>>2]|0;break}case 58:{AW(c[j>>2]|0,c[p>>2]|0,2);break}case 59:{e=c[h>>2]|0;break}case 60:{AW(c[j>>2]|0,c[p>>2]|0,3);break}case 61:{e=c[h>>2]|0;break}case 62:{AW(c[p>>2]|0,sW()|0,2);break}case 63:{e=c[k>>2]|0;break}case 64:{e=c[j>>2]|0;break}case 65:{e=c[p>>2]|0;break}default:{}}while(0);h=0-m|0;p=p+(h<<2)|0;g=g+(h<<1)|0;h=p+4|0;c[p+4>>2]=e;e=(d[140752+f>>0]|0)+-41|0;p=b[g>>1]|0;f=p+(b[66038+(e<<1)>>1]|0)|0;if(f>>>0<272?(a[139920+f>>0]|0)==(p|0):0){e=a[140192+f>>0]|0;k=q;break}e=a[140822+e>>0]|0;k=q}while(0);f=s;j=r;n=i;o=e;q=k;g=g+2|0}if((u|0)==26){rW();e=1;f=s;u=97}else if((u|0)==51){KW(140650);rW();e=1;f=s;u=97}else if((u|0)==56){KW(140701);rW();e=1;f=s;u=97}else if((u|0)==96){KW(140861);e=2;u=97}if((u|0)==97)if((f|0)!=(t|0))l6(f);l=v;return e|0}function qW(b,d){b=b|0;d=d|0;var e=0;e=HK(8)|0;a[e+4>>0]=d;c[e>>2]=b;return e|0}function rW(){var a=0,b=0;a=c[47473]|0;b=c[47471]|0;if(b|0){kU(b,1);c[47471]=0}c[14036]=67;while(1){if(!a)break;b=c[a+80>>2]|0;EW(a);a=b}c[14036]=56;c[14045]=68;b=c[47476]|0;eb[c[b>>2]&63](b,0,64)|0;c[14045]=56;c[14054]=69;b=c[47477]|0;eb[c[b>>2]&63](b,0,64)|0;c[14054]=56;HW();return}function sW(){var a=0,d=0,e=0,f=0,g=0,h=0;e=c[47477]|0;f=HK(40)|0;if(Uz(c[47476]|0)|0)uW(0);a=Uz(e)|0;b[f+4>>1]=a;a:do if(!a)a=e;else{c[f>>2]=HK(a*24|0)|0;a=0;d=eb[c[e>>2]&63](e,0,128)|0;while(1){if(!d){a=e;break a}g=(c[f>>2]|0)+(a*24|0)|0;h=d+8|0;c[g>>2]=c[h>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];c[g+12>>2]=c[h+12>>2];c[g+16>>2]=c[h+16>>2];c[g+20>>2]=c[h+20>>2];a=a+1|0;d=eb[c[e>>2]&63](e,d,8)|0}}while(0);eb[c[a>>2]&63](e,0,64)|0;return f|0}function tW(b){b=b|0;var d=0,e=0,f=0;e=HK(64)|0;f=b+4|0;d=c[f>>2]|0;if(d>>>0>=(c[b+8>>2]|0)>>>0){iA(b,1)|0;d=c[f>>2]|0}a[d>>0]=0;b=c[b>>2]|0;c[f>>2]=b;c[e+8>>2]=Y3(b)|0;c[e+12>>2]=c[c[47474]>>2];f=c[47476]|0;eb[c[f>>2]&63](f,e,1)|0;return}function uW(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;i=HK(32)|0;j=c[47476]|0;e=Uz(j)|0;k=i+8|0;a[i+14>>0]=d;a:do if(!e){c[k>>2]=HK(56)|0;b[i+12>>1]=1;h=Y3(195341)|0;k=c[k>>2]|0;c[k>>2]=h;c[k+4>>2]=c[c[47474]>>2]}else{b[i+12>>1]=e;c[k>>2]=HK(e*56|0)|0;d=0;e=Qz(j)|0;while(1){if(!e)break a;f=(c[k>>2]|0)+(d*56|0)|0;g=e+8|0;h=f+56|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));d=d+1|0;e=c[e>>2]|0}}while(0);eb[c[j>>2]&63](j,0,64)|0;k=c[47477]|0;eb[c[k>>2]&63](k,i,1)|0;return}function vW(a){a=a|0;var b=0,d=0.0,e=0,f=0,g=0,i=0,j=0;j=l;l=l+32|0;g=j;i=HK(8)|0;f=c[c[47474]>>2]|0;c[g>>2]=c[a>>2];c[g+4>>2]=c[a+4>>2];c[g+8>>2]=c[a+8>>2];c[g+12>>2]=c[a+12>>2];c[g+16>>2]=c[a+16>>2];c[g+20>>2]=c[a+20>>2];c[g+24>>2]=c[a+24>>2];c[g+28>>2]=c[a+28>>2];if(f|0){a=g+4|0;if((c[a>>2]|0)==0?(b=c[f+4>>2]|0,b|0):0)c[a>>2]=b;a=g+16|0;if(+h[a>>3]<0.0?(d=+h[f+16>>3],d>=0.0):0)h[a>>3]=d;if((c[g>>2]|0)==0?(e=c[f>>2]|0,e|0):0)c[g>>2]=e;a=c[f+24>>2]&127;if(a|0){f=g+24|0;e=c[f>>2]|0;c[f>>2]=e&127|a|e&-128}}f=c[(c[47475]|0)+144>>2]|0;c[i>>2]=eb[c[f>>2]&63](f,g,1)|0;c[i+4>>2]=c[47474];c[47474]=i;l=j;return}function wW(){var a=0,b=0;b=c[47474]|0;a=c[b+4>>2]|0;l6(b);c[47474]=a;return}function xW(b){b=b|0;var c=0;while(1){c=a[b>>0]|0;if(!(c<<24>>24)){b=0;break}if(c<<24>>24==32)b=b+1|0;else{b=1;break}}return b|0}function yW(){var b=0,d=0,e=0;e=Sz(56128,c[4590]|0)|0;b=c[47473]|0;d=HK(16)|0;c[d+8>>2]=e;if(a[b+112>>0]&2)a[d+12>>0]=1;e=c[b+84>>2]|0;eb[c[e>>2]&63](e,d,1)|0;return}function zW(){var a=0;a=c[(c[47473]|0)+84>>2]|0;return eb[c[a>>2]&63](a,0,256)|0}function AW(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=HK(16)|0;f=c[47473]|0;h=c[f+84>>2]|0;h=c[(eb[c[h>>2]&63](h,0,256)|0)+8>>2]|0;c[g+8>>2]=b;eb[c[h>>2]&63](h,g,1)|0;a[b+92>>0]=e;if(a[f+112>>0]&1)a[b+100>>0]=1;c[b+88>>2]=d;return}function BW(a,b,c){a=a|0;b=b|0;c=c|0;l6(b);return}function CW(a,b,d){a=a|0;b=b|0;d=d|0;Oz(c[b+8>>2]|0)|0;l6(b);return}function DW(a,b,d){a=a|0;b=b|0;d=d|0;IW(c[b+8>>2]|0);l6(b);return}function EW(a){a=a|0;Oz(c[a+84>>2]|0)|0;hU(a);l6(a);return}function FW(a,b,d){a=a|0;b=b|0;d=d|0;l6(c[b+8>>2]|0);l6(b);return}function GW(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=d+12|0;a=b[g>>1]|0;if(a<<16>>16){h=d+8|0;e=0;f=c[h>>2]|0;while(1){if((e|0)>=(a<<16>>16|0))break;l6(c[f>>2]|0);e=e+1|0;f=f+56|0;a=b[g>>1]|0}l6(c[h>>2]|0)}l6(d);return}function HW(){var a=0,b=0;a=c[47474]|0;while(1){b=c[a+4>>2]|0;if(!b)break;l6(a);a=b}return}function IW(b){b=b|0;var d=0;d=b+88|0;switch(a[b+92>>0]|0){case 1:{EW(c[d>>2]|0);break}case 2:{iU(c[d>>2]|0);break}default:{}}hU(b);l6(b);return}function JW(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=l;l=l+160|0;e=f+8|0;g=f;c[g>>2]=0;c[g+4>>2]=0;c[47474]=g;c[47473]=0;c[47471]=0;c[47475]=c[(c[(c[d+52>>2]|0)+16>>2]|0)+144>>2];c[47476]=Sz(56164,c[4590]|0)|0;c[47477]=Sz(56200,c[4590]|0)|0;hA(e,128,f+24|0);c[47472]=e;if(!(NW(a,e,d)|0)){pW()|0;c[b>>2]=DX()|0;a=c[47471]|0}else{c[b>>2]=2;a=0}Oz(c[47476]|0)|0;Oz(c[47477]|0)|0;c[47476]=0;c[47477]=0;c[47474]=0;lA(e);l=f;return a|0}function KW(b){b=b|0;var d=0,e=0,f=0;e=l;l=l+16|0;d=e;if(!(a[189945]|0)){a[189945]=1;f=LW()|0;c[d>>2]=b;c[d+4>>2]=f;dA(1,140878,d)|0;MW()}l=e;return}function LW(){return f_(c[47478]|0)|0}function MW(){var b=0,d=0,e=0,f=0;f=l;l=l+16|0;e=f;b=c[47481]|0;c[b+4>>2]=c[b>>2];d=c[47490]|0;if((d|0)>0){jA(b,c[47488]|0,d)|0;b=c[47481]|0}jA(b,c[47487]|0,c[47489]|0)|0;d=c[47481]|0;b=c[d+4>>2]|0;if(b>>>0>=(c[d+8>>2]|0)>>>0){iA(d,1)|0;b=c[47481]|0;d=b;b=c[b+4>>2]|0}c[d+4>>2]=b+1;a[b>>0]=0;b=c[47481]|0;d=c[b>>2]|0;c[b+4>>2]=d;c[e>>2]=d;dA(3,140894,e)|0;l=f;return}function NW(b,e,f){b=b|0;e=e|0;f=f|0;c[47481]=e;hA(189928,128,0);c[47479]=b;a[189947]=0;a[189944]=0;a[189945]=0;c[47489]=0;c[47490]=0;a[189946]=1;f=f+52|0;e=SY(uK(d[(c[(c[f>>2]|0)+16>>2]|0)+115>>0]|0)|0)|0;c[47478]=e;XZ(e,c[(c[(c[f>>2]|0)+16>>2]|0)+144>>2]|0);YZ(c[47478]|0,70,27);ZZ(c[47478]|0,71);return 0}function OW(b,d,e){b=b|0;d=d|0;e=e|0;do if(!(C3(d,140906)|0)){c[47470]=SW(e)|0;a[189946]=0;c[47480]=286}else{if(C3(d,140912)|0?C3(d,140915)|0:0){if(!(C3(d,140918)|0)){a[189946]=1;c[47470]=TW(e)|0;c[47480]=287;break}if(!(C3(d,140926)|0)){c[47470]=UW(b,e,0)|0;c[47480]=288;break}if(!(C3(d,140931)|0)){c[47470]=UW(b,0,1)|0;c[47480]=290;break}if(!(C3(d,140947)|0)){c[47470]=UW(b,0,32)|0;c[47480]=295;break}if(!(C3(d,140933)|0)){c[47470]=UW(b,0,4)|0;c[47480]=291;break}if(!(C3(d,140935)|0)){c[47470]=UW(b,0,64)|0;c[47480]=292;break}if(!(C3(d,140937)|0)){c[47470]=UW(b,0,2)|0;c[47480]=289;break}if(!(C3(d,140939)|0)){c[47470]=UW(b,0,8)|0;c[47480]=293;break}if(!(C3(d,140943)|0)){c[47470]=UW(b,0,16)|0;c[47480]=294;break}if(!(C3(d,140949)|0)){VW(e);c[47480]=283;break}if(!(C3(d,140952)|0)){c[47480]=277;break}if(!(C3(d,140955)|0)){c[47480]=280;break}if(!(C3(d,140958)|0)){c[47470]=WW(e)|0;c[47480]=285;break}if(!(C3(d,140921)|0)){c[47480]=262;break}else{RW(d);break}}a[189946]=0;c[47480]=260}while(0);return}function PW(b,d){b=b|0;d=d|0;do if(!(C3(d,140906)|0)){c[47480]=264;a[189946]=1}else{if(C3(d,140912)|0?C3(d,140915)|0:0){if(!(C3(d,140918)|0)){c[47480]=265;a[189946]=0;break}if(!(C3(d,140921)|0)){c[47480]=263;break}if(!(C3(d,140926)|0)){c[47480]=266;break}if(!(C3(d,140931)|0)){c[47480]=270;break}if(!(C3(d,140933)|0)){c[47480]=271;break}if(!(C3(d,140935)|0)){c[47480]=272;break}if(!(C3(d,140937)|0)){c[47480]=269;break}if(!(C3(d,140939)|0)){c[47480]=273;break}if(!(C3(d,140943)|0)){c[47480]=274;break}if(!(C3(d,140947)|0)){c[47480]=275;break}if(!(C3(d,140949)|0)){c[47480]=(c[47480]|0)==283?282:258;break}if(!(C3(d,140952)|0)){c[47480]=(c[47480]|0)==277?276:278;break}if(!(C3(d,140955)|0)){c[47480]=(c[47480]|0)==280?279:281;break}if(!(C3(d,140958)|0)){c[47480]=(c[47480]|0)==285?284:259;break}else{RW(d);break}}c[47480]=261}while(0);return}function QW(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if(a[189946]|0){b=0;while(1){if(!e)break;h=d+1|0;g=a[d>>0]|0;if((g&255)>31){d=c[47481]|0;f=c[d+4>>2]|0;if(f>>>0>=(c[d+8>>2]|0)>>>0){iA(d,1)|0;f=c[47481]|0;d=f;f=c[f+4>>2]|0}c[d+4>>2]=f+1;a[f>>0]=g;b=b+1|0}d=h;e=e+-1|0}if(b|0)c[47480]=267}return}function RW(b){b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d;c[47480]=268;a[189945]=1;f=LW()|0;c[e>>2]=b;c[e+4>>2]=f;dA(1,140962,e)|0;l=d;return}function SW(b){b=b|0;var d=0;d=HK(120)|0;c[d+100>>2]=-1;a[d+88>>0]=-1;XW(d,56460,22,b,141914);return d|0}function TW(a){a=a|0;var c=0;c=HK(104)|0;b[c+80>>1]=1;b[c+82>>1]=1;XW(c,56284,22,a,141268);return c|0}function UW(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=l;l=l+32|0;e=f;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;c[e+24>>2]=0;c[e+28>>2]=0;h[e+16>>3]=-1.0;c[e+24>>2]=d&127;if(b|0)XW(e,56260,3,b,141119);d=c[a+144>>2]|0;e=eb[c[d>>2]&63](d,e,1)|0;l=f;return e|0}function VW(a){a=a|0;c[47470]=0;XW(189880,56252,1,a,141055);return}function WW(a){a=a|0;var b=0;b=HK(40)|0;XW(b,56236,2,a,141001);return b|0}function XW(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;n=o;m=o+8|0;while(1){k=c[g>>2]|0;if(!k)break;i=c[g+4>>2]|0;c[m>>2]=k;j=e6(m,e,f,8,104)|0;if(!j){c[n>>2]=k;c[n+4>>2]=h;dA(0,141007,n)|0;i=1}else{i=vb[c[j+4>>2]&127](b,i)|0;i=(d[189944]|0|i)&255}a[189944]=i;g=g+8|0}l=o;return}function YW(a,b){a=a|0;b=b|0;return C3(c[a>>2]|0,c[b>>2]|0)|0}function ZW(a,b){a=a|0;b=b|0;c[a+36>>2]=Y3(b)|0;return 0}function _W(a,b){a=a|0;b=b|0;c[a+32>>2]=Y3(b)|0;return 0}function $W(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i;e=(a2(a[d>>0]|0)|0)<<24>>24;f=d+1|0;switch(e|0){case 82:{if(!(C3(f,141066)|0)){c[b>>2]=114;b=0}else h=4;break}case 76:{h=5;break}default:h=4}do if((h|0)==4)if(!(C3(f,141071)|0))h=5;else{if((e|0)!=67?(C3(f,141075)|0)==0:0){c[g>>2]=d;dA(0,141081,g)|0;b=1;break}c[b>>2]=110;b=0}while(0);if((h|0)==5){c[b>>2]=108;b=0}l=i;return b|0}function aX(a,b){a=a|0;b=b|0;c[a+4>>2]=b;return 0}function bX(a,b){a=a|0;b=b|0;c[a>>2]=b;return 0}function cX(a,b){a=a|0;b=b|0;var d=0,e=0;e=l;l=l+16|0;d=e;if(!(dX(b,141148,0,255,d)|0)){h[a+16>>3]=+(c[d>>2]|0);a=0}else a=1;l=e;return a|0}function dX(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0;k=l;l=l+48|0;j=k+24|0;i=k+8|0;h=k;m=k+36|0;g=$1(a,m,10)|0;do if((c[m>>2]|0)!=(a|0)){if((g|0)>(e|0)){c[i>>2]=b;c[i+4>>2]=a;c[i+8>>2]=e;dA(0,141190,i)|0;a=1;break}if((g|0)<(d|0)){c[j>>2]=b;c[j+4>>2]=a;c[j+8>>2]=d;dA(0,141229,j)|0;a=1;break}else{c[f>>2]=g;a=0;break}}else{c[h>>2]=b;c[h+4>>2]=a;dA(0,141159,h)|0;a=1}while(0);l=k;return a|0}function eX(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i;f=e+1|0;d=d+36|0;switch((a2(a[e>>0]|0)|0)<<24>>24|0){case 76:{if(!(C3(f,141071)|0)){b[d>>1]=b[d>>1]|4;d=0}else h=9;break}case 82:{if(!(C3(f,141066)|0)){b[d>>1]=b[d>>1]|2;d=0}else h=9;break}case 84:{if(!(C3(f,141866)|0)){b[d>>1]=b[d>>1]|6;d=0}else h=9;break}case 67:{if(!(C3(f,141075)|0))d=0;else h=9;break}default:h=9}if((h|0)==9){c[g>>2]=e;dA(0,141870,g)|0;d=1}l=i;return d|0}function fX(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i;f=e+1|0;d=d+36|0;switch((a2(a[e>>0]|0)|0)<<24>>24|0){case 76:{if(!(C3(f,141071)|0)){b[d>>1]=b[d>>1]|512;d=0}else h=7;break}case 82:{if(!(C3(f,141066)|0)){b[d>>1]=b[d>>1]|256;d=0}else h=7;break}case 67:{if(!(C3(f,141075)|0))d=0;else h=7;break}default:h=7}if((h|0)==7){c[g>>2]=e;dA(0,141821,g)|0;d=1}l=i;return d|0}function gX(a,b){a=a|0;b=b|0;c[a+20>>2]=Y3(b)|0;return 0}function hX(d,e){d=d|0;e=e|0;var f=0,g=0;g=l;l=l+16|0;f=g;if(!(dX(e,141814,0,255,f)|0)){a[d+33>>0]=c[f>>2];d=d+36|0;b[d>>1]=b[d>>1]|32;d=0}else d=1;l=g;return d|0}function iX(d,e){d=d|0;e=e|0;var f=0,g=0;g=l;l=l+16|0;f=g;if(!(dX(e,141802,0,255,f)|0)){a[d+34>>0]=c[f>>2];d=d+36|0;b[d>>1]=b[d>>1]|64;d=0}else d=1;l=g;return d|0}function jX(d,e){d=d|0;e=e|0;var f=0,g=0;g=l;l=l+16|0;f=g;if(!(dX(e,141790,-128,127,f)|0)){a[d+32>>0]=c[f>>2];d=d+36|0;b[d>>1]=b[d>>1]|128;d=0}else d=1;l=g;return d|0}function kX(a,b){a=a|0;b=b|0;c[a+24>>2]=Y3(b)|0;return 0}function lX(a,d){a=a|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+16|0;f=g;e=g+4|0;do if(!(dX(d,141745,0,65535,e)|0)){d=c[e>>2]|0;if(!d){dA(0,141753,f)|0;d=1;break}else{b[a+80>>1]=d;d=0;break}}else d=1;while(0);l=g;return d|0}function mX(a,e){a=a|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i;f=e+1|0;switch((a2(d[e>>0]|0)|0)<<24>>24|0){case 84:{if(!(C3(f,141694)|0)){a=a+36|0;b[a>>1]=b[a>>1]|1;a=0}else h=5;break}case 70:{if(!(C3(f,141698)|0))a=0;else h=5;break}default:h=5}if((h|0)==5){c[g>>2]=e;dA(0,141703,g)|0;a=1}l=i;return a|0}function nX(a,b){a=a|0;b=b|0;var d=0,e=0;e=l;l=l+16|0;d=e;if(!(dX(b,141680,0,360,d)|0)){c[a+28>>2]=c[d>>2]&65535;a=0}else a=1;l=e;return a|0}function oX(a,d){a=a|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;e=f;if(!(dX(d,141673,0,65535,e)|0)){b[a+40>>1]=c[e>>2];a=0}else a=1;l=f;return a|0}function pX(a,b){a=a|0;b=b|0;c[a>>2]=Y3(b)|0;return 0}function qX(a,b){a=a|0;b=b|0;c[a+16>>2]=Y3(b)|0;return 0}function rX(a,b){a=a|0;b=b|0;c[a+4>>2]=Y3(b)|0;return 0}function sX(a,d){a=a|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+16|0;f=g;e=g+4|0;do if(!(dX(d,141628,0,65535,e)|0)){d=c[e>>2]|0;if(!d){dA(0,141636,f)|0;d=1;break}else{b[a+82>>1]=d;d=0;break}}else d=1;while(0);l=g;return d|0}function tX(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;i=k;h=0;a:while(1){b:while(1){g=e+1|0;e=a[e>>0]|0;if(!(e<<24>>24))break a;e=e<<24>>24;f=(R1(e)|0)+-98|0;switch(f>>>1|f<<31|0){case 5:{j=5;break b}case 9:{f=2048;break b}case 8:{j=6;break b}case 0:{j=7;break b}default:{}}c[i>>2]=e;c[i+4>>2]=e;dA(0,141575,i)|0;e=g}if((j|0)==5){j=0;f=1024}else if((j|0)==6){j=0;f=4096}else if((j|0)==7){j=0;f=8192}e=g;h=(h&65535|f)&65535}if(h<<16>>16!=15360){j=d+36|0;b[j>>1]=b[j>>1]|h}l=k;return 0}function uX(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;j=k+8|0;i=k;h=Y3(e)|0;g=d+42|0;f=0;e=h;while(1){d=i6(e,141485)|0;if(!d)break;if(((a2(a[d>>0]|0)|0)&255|0)==82){e=d+1|0;if(!(C3(e,141488)|0)){b[g>>1]=b[g>>1]|4;d=f;e=0;f=d;continue}if(!(C3(e,141495)|0)){b[g>>1]=b[g>>1]|2;d=f;e=0;f=d;continue}else{c[i>>2]=d;dA(0,141501,i)|0;f=1;e=0;continue}}if(!(C3(d,141539)|0)){b[g>>1]=b[g>>1]&-385;d=f;e=0;f=d;continue}if(C3(d,141545)|0?C3(d,141555)|0:0){if(!(C3(d,141561)|0)){b[g>>1]=b[g>>1]|128;d=f;e=0;f=d;continue}if(!(C3(d,141568)|0)){b[g>>1]=b[g>>1]|256;d=f;e=0;f=d;continue}else{c[j>>2]=d;dA(0,141501,j)|0;f=1;e=0;continue}}b[g>>1]=b[g>>1]|32;d=f;e=0;f=d}l6(h);l=k;return f|0}function vX(a,b){a=a|0;b=b|0;c[a+8>>2]=Y3(b)|0;return 0}function wX(a,b){a=a|0;b=b|0;c[a+12>>2]=Y3(b)|0;return 0}function xX(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i;f=e+1|0;d=d+36|0;switch((a2(a[e>>0]|0)|0)<<24>>24|0){case 66:{if(!(C3(f,141431)|0)){b[d>>1]=b[d>>1]|16;d=0}else h=7;break}case 84:{if(!(C3(f,141437)|0)){b[d>>1]=b[d>>1]|8;d=0}else h=7;break}case 77:{if(!(C3(f,141440)|0))d=0;else h=7;break}default:h=7}if((h|0)==7){c[g>>2]=e;dA(0,141446,g)|0;d=1}l=i;return d|0}function yX(a,d){a=a|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;e=f;if(!(dX(d,141425,0,65535,e)|0)){b[a+38>>1]=c[e>>2];a=0}else a=1;l=f;return a|0}function zX(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i;f=e+1|0;d=d+36|0;switch((a2(a[e>>0]|0)|0)<<24>>24|0){case 76:{if(!(C3(f,141071)|0)){b[d>>1]=b[d>>1]|4;d=0}else h=7;break}case 82:{if(!(C3(f,141066)|0)){b[d>>1]=b[d>>1]|2;d=0}else h=7;break}case 67:{if(!(C3(f,141075)|0))d=0;else h=7;break}default:h=7}if((h|0)==7){c[g>>2]=e;dA(0,141081,g)|0;d=1}l=i;return d|0}function AX(b,d){b=b|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;e=f;if(!(dX(d,142023,0,127,e)|0)){a[b+88>>0]=c[e>>2];b=0}else b=1;l=f;return b|0}function BX(b,d){b=b|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;e=f;if((a[d>>0]|0)==42){b=b+112|0;a[b>>0]=a[b>>0]|1;b=0}else{c[e>>2]=d;dA(0,141983,e)|0;b=1}l=f;return b|0}function CX(b,d){b=b|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;e=f;if((a[d>>0]|0)==42){b=b+112|0;a[b>>0]=a[b>>0]|2;b=0}else{c[e>>2]=d;dA(0,141946,e)|0;b=1}l=f;return b|0}function DX(){var b=0;b=(a[189945]|a[189944])<<24>>24;YY(c[47478]|0);lA(189928);return b|0}function EX(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;i=j;c[47480]=0;d=0;a:do{b:do switch(a[189947]|0){case 2:{b=-1;break a}case 0:{a[189947]=1;h=6;b=142035;d=0;break}default:{b=c[47479]|0;if(!(a[b>>0]|0)){a[189947]=2;h=7;b=142042;break b}else{d=FX(b)|0;h=d-b|0;break b}}}while(0);c[47488]=c[47487];c[47490]=c[47489];c[47487]=b;c[47489]=h;e=c[47483]|0;f=e-(c[47482]|0)|0;g=c[47478]|0;if(!f)b=_Z(g,b,h,(h|0)==0&1)|0;else{if(e>>>0<(c[47484]|0)>>>0)b=e;else{iA(189928,1)|0;b=c[47483]|0}a[b>>0]=0;b=c[47482]|0;c[47483]=b;b=_Z(g,b,f,0)|0}if(!((b|0)!=0|(a[189945]|0)!=0)){g=g_(e_(c[47478]|0)|0)|0;h=LW()|0;c[i>>2]=g;c[i+4>>2]=h;dA(1,140878,i)|0;MW();a[189945]=1;c[47480]=268}if(d|0)c[47479]=d;b=c[47480]|0}while((b|0)==0);l=j;return b|0}function FX(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i;d=b+1|0;f=a[b>>0]|0;a:do if(f<<24>>24==60){e=a[d>>0]|0;if(e<<24>>24==33)if(!(h2(b+2|0,142050,2)|0)){e=GX(b+4|0)|0;d=e;e=a[e>>0]|0}else{e=33;h=5}else h=5;b:do if((h|0)==5)while(1){switch(e<<24>>24){case 62:case 0:break b;default:{}}e=d+1|0;d=e;e=a[e>>0]|0;h=5}while(0);if(e<<24>>24==62){d=d+1|0;break}else{dA(0,142053,g)|0;a[189944]=1;break}}else{d=b;while(1){switch(f<<24>>24){case 60:case 0:break a;default:{}}e=d+1|0;if(f<<24>>24==38?(a[e>>0]|0)!=35:0)e=ZP(e,189928)|0;else{d=c[47483]|0;if(d>>>0>=(c[47484]|0)>>>0){iA(189928,1)|0;d=c[47483]|0}c[47483]=d+1;a[d>>0]=f}d=e;f=a[e>>0]|0}}while(0);l=i;return d|0}function GX(b){b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;i=j;f=1;c=b;a:while(1){e=(f|0)==0;d=c;b:while(1){if(e)break a;g=d+1|0;switch(a[d>>0]|0){case 0:{c=g;break a}case 60:{h=5;break b}case 62:{c=-1;break b}default:d=g}}if((h|0)==5){h=0;c=1}f=f+c|0;c=g}d=c+-1|0;do if(a[d>>0]|0){c=c+-3|0;if(c>>>0>=b>>>0?(h2(c,142050,2)|0)==0:0)break;dA(0,142094,i)|0;a[189944]=1}while(0);l=j;return d|0}function HX(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=k6(28)|0;if(!d)d=0;else{e=0;f=0;while(1){if((e|0)>=(b|0))break;r=(c[(c[a+(e<<2)>>2]|0)+4>>2]|0)+f|0;e=e+1|0;f=r}o=d+8|0;c[o>>2]=IX(f<<4)|0;p=d+12|0;c[p>>2]=IX((b<<2)+4|0)|0;e=f<<2;q=d+16|0;c[q>>2]=IX(e)|0;e=IX(e)|0;r=d+20|0;c[r>>2]=e;c[d+4>>2]=f;c[d>>2]=b;f=0;h=0;while(1){c[(c[p>>2]|0)+(h<<2)>>2]=f;if((h|0)>=(b|0))break;j=a+(h<<2)|0;n=c[j>>2]|0;k=c[n+4>>2]|0;l=f+-1|0;g=0;i=f;m=k;while(1){if((g|0)>=(m|0))break;m=(c[o>>2]|0)+(i<<4)|0;e=(c[n>>2]|0)+(g<<4)|0;c[m>>2]=c[e>>2];c[m+4>>2]=c[e+4>>2];c[m+8>>2]=c[e+8>>2];c[m+12>>2]=c[e+12>>2];m=i+1|0;c[(c[q>>2]|0)+(i<<2)>>2]=m;e=c[r>>2]|0;c[e+(i<<2)>>2]=i+-1;s=c[j>>2]|0;g=g+1|0;i=m;m=c[s+4>>2]|0;n=s}s=l+k|0;c[(c[q>>2]|0)+(s<<2)>>2]=f;c[e+(f<<2)>>2]=s;f=i;h=h+1|0}IY(d)}return d|0}function IX(a){a=a|0;if(!a)a=0;else a=k6(a)|0;return a|0}function JX(a){a=a|0;var b=0,d=0;l6(c[a+8>>2]|0);l6(c[a+12>>2]|0);l6(c[a+16>>2]|0);l6(c[a+20>>2]|0);d=a+24|0;b=c[d>>2]|0;if(b|0){l6(c[b>>2]|0);l6(c[d>>2]|0)}l6(a);return}function KX(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+32|0;m=p+16|0;j=p;c[m>>2]=c[b>>2];c[m+4>>2]=c[b+4>>2];c[m+8>>2]=c[b+8>>2];c[m+12>>2]=c[b+12>>2];n=PY(a,d,m)|0;c[m>>2]=c[e>>2];c[m+4>>2]=c[e+4>>2];c[m+8>>2]=c[e+8>>2];c[m+12>>2]=c[e+12>>2];o=PY(a,f,m)|0;c[j>>2]=c[b>>2];c[j+4>>2]=c[b+4>>2];c[j+8>>2]=c[b+8>>2];c[j+12>>2]=c[b+12>>2];c[m>>2]=c[e>>2];c[m+4>>2]=c[e+4>>2];c[m+8>>2]=c[e+8>>2];c[m+12>>2]=c[e+12>>2];m=yY(j,d,n,m,f,o,a)|0;d=c[a+4>>2]|0;j=d+1|0;f=1;h=d;while(1){h=c[m+(h<<2)>>2]|0;k=f+1|0;if((h|0)==(j|0))break;else f=k}i=k6(k<<4)|0;h=i+(f<<4)|0;c[h>>2]=c[e>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];c[h+12>>2]=c[e+12>>2];a=a+8|0;while(1){d=c[m+(d<<2)>>2]|0;f=f+-1|0;h=i+(f<<4)|0;if((d|0)==(j|0))break;e=(c[a>>2]|0)+(d<<4)|0;c[h>>2]=c[e>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];c[h+12>>2]=c[e+12>>2]}c[h>>2]=c[b>>2];c[h+4>>2]=c[b+4>>2];c[h+8>>2]=c[b+8>>2];c[h+12>>2]=c[b+12>>2];if(f|0)Aa(142112,142119,148,142125);if(n|0)l6(n);if(o|0)l6(o);c[g+4>>2]=k;c[g>>2]=i;l6(m);l=p;return 1}function LX(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;j=l;l=l+48|0;h=j+32|0;g=j+16|0;f=j;i=c[a>>2]|0;d=c[a+4>>2]|0;e=d+-1|0;a=0;while(1){if((a|0)>=(d|0)){a=1;break}m=i+(((e+a|0)%(d|0)|0)<<4)|0;k=i+(a<<4)|0;c[f>>2]=c[m>>2];c[f+4>>2]=c[m+4>>2];c[f+8>>2]=c[m+8>>2];c[f+12>>2]=c[m+12>>2];c[g>>2]=c[k>>2];c[g+4>>2]=c[k+4>>2];c[g+8>>2]=c[k+8>>2];c[g+12>>2]=c[k+12>>2];c[h>>2]=c[b>>2];c[h+4>>2]=c[b+4>>2];c[h+8>>2]=c[b+8>>2];c[h+12>>2]=c[b+12>>2];if((EY(f,g,h)|0)==1){a=0;break}else a=a+1|0}l=j;return a|0}function MX(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0;u=l;l=l+64|0;m=u+48|0;k=u+32|0;s=4;j=k6(40)|0;c[j>>2]=0;n=u+16|0;q=u;r=c[d>>2]|0;i=c[d+4>>2]|0;s=x6(189964,1,j|0,s|0)|0;j=D;o=0;d=o;o=0;if((d|0)!=0&(p|0)!=0){g=A6(c[d>>2]|0,s|0,j|0)|0;if(!g)Ca(d|0,p|0);D=p}else g=-1;if((g|0)==1)d=D;else d=0;while(1){if(d|0){d=-1;break}o=0;c[m>>2]=c[e>>2];c[m+4>>2]=c[e+4>>2];c[m+8>>2]=c[e+8>>2];c[m+12>>2]=c[e+12>>2];ha(28,n|0,m|0);d=o;o=0;if((d|0)!=0&(p|0)!=0){g=A6(c[d>>2]|0,s|0,j|0)|0;if(!g)Ca(d|0,p|0);D=p}else g=-1;if((g|0)==1){d=D;continue};c[e>>2]=c[n>>2];c[e+4>>2]=c[n+4>>2];c[e+8>>2]=c[n+8>>2];c[e+12>>2]=c[n+12>>2];h=e+16|0;o=0;c[m>>2]=c[h>>2];c[m+4>>2]=c[h+4>>2];c[m+8>>2]=c[h+8>>2];c[m+12>>2]=c[h+12>>2];ha(28,q|0,m|0);d=o;o=0;if((d|0)!=0&(p|0)!=0){g=A6(c[d>>2]|0,s|0,j|0)|0;if(!g)Ca(d|0,p|0);D=p}else g=-1;if((g|0)==1){d=D;continue};c[h>>2]=c[q>>2];c[h+4>>2]=c[q+4>>2];c[h+8>>2]=c[q+8>>2];c[h+12>>2]=c[q+12>>2];c[47530]=0;o=0;$(115,4);d=o;o=0;if((d|0)!=0&(p|0)!=0){g=A6(c[d>>2]|0,s|0,j|0)|0;if(!g)Ca(d|0,p|0);D=p}else g=-1;if((g|0)==1){d=D;continue}g=c[47531]|0;d=c[47530]|0;c[47530]=d+1;d=g+(d<<4)|0;c[d>>2]=c[r>>2];c[d+4>>2]=c[r+4>>2];c[d+8>>2]=c[r+8>>2];c[d+12>>2]=c[r+12>>2];o=0;c[k>>2]=c[e>>2];c[k+4>>2]=c[e+4>>2];c[k+8>>2]=c[e+8>>2];c[k+12>>2]=c[e+12>>2];c[m>>2]=c[h>>2];c[m+4>>2]=c[h+4>>2];c[m+8>>2]=c[h+8>>2];c[m+12>>2]=c[h+12>>2];d=ia(1,a|0,b|0,r|0,i|0,k|0,m|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,s|0,j|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1)d=D;else{t=8;break}}if((t|0)==8)if((d|0)==-1)d=-1;else{c[f+4>>2]=c[47530];c[f>>2]=c[47531];d=0}l6(s|0);l=u;return d|0}function NX(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0.0,g=0.0;d=+h[b>>3];e=b+8|0;f=+h[e>>3];g=d*d+f*f;if(g>1.0e-06){g=+G(+g);h[b>>3]=d/g;h[e>>3]=f/g};c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];return}function OX(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=l;l=l+32|0;f=g+16|0;e=g;if((c[47534]|0)<(a|0)){b=c[47531]|0;d=a<<4;if(!b){f=k6(d)|0;c[47531]=f;if(!f){f=c[15715]|0;c[e>>2]=142134;c[e+4>>2]=531;c[e+8>>2]=142269;z4(f,142142,e)|0;Ca(189964,1)}}else{e=n6(b,d)|0;c[47531]=e;if(!e){e=c[15715]|0;c[f>>2]=142134;c[f+4>>2]=537;c[f+8>>2]=142287;z4(e,142142,f)|0;Ca(189964,1)}}c[47534]=a}l=g;return}function PX(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0.0,k=0,m=0.0,n=0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0.0,U=0.0,V=0.0,W=0.0;R=l;l=l+336|0;J=R+320|0;I=R+304|0;w=R+144|0;q=R+128|0;G=R+112|0;H=R+96|0;Q=R+80|0;A=R+64|0;C=R+48|0;K=R+32|0;L=R+16|0;M=R;x=R+288|0;y=R+272|0;z=R+256|0;B=R+240|0;D=R+224|0;E=R+208|0;N=R+192|0;O=R+176|0;P=R+160|0;i=c[47533]|0;do if((c[47532]|0)<(e|0)){k=e*40|0;if(!i){i=k6(k)|0;c[47533]=i;if(!i){i=-1;break}}else{i=n6(i,k)|0;c[47533]=i;if(!i){i=-1;break}}c[47532]=e;n=6}else n=6;while(0);if((n|0)==6){h[i>>3]=0.0;k=1;j=0.0;while(1){if((k|0)>=(e|0))break;n=d+(k<<4)|0;F=d+(k+-1<<4)|0;c[I>>2]=c[n>>2];c[I+4>>2]=c[n+4>>2];c[I+8>>2]=c[n+8>>2];c[I+12>>2]=c[n+12>>2];c[J>>2]=c[F>>2];c[J+4>>2]=c[F+4>>2];c[J+8>>2]=c[F+8>>2];c[J+12>>2]=c[F+12>>2];v=j+ +QX(I,J);h[i+(k*40|0)>>3]=v;k=k+1|0;j=v}F=e+-1|0;n=i+(F*40|0)|0;k=1;while(1){if((k|0)>=(e|0))break;S=i+(k*40|0)|0;h[S>>3]=+h[S>>3]/+h[n>>3];k=k+1|0}k=0;while(1){if((k|0)>=(e|0))break;S=i+(k*40|0)+8|0;n=i+(k*40|0)|0;v=+RX(+h[n>>3]);c[J>>2]=c[f>>2];c[J+4>>2]=c[f+4>>2];c[J+8>>2]=c[f+8>>2];c[J+12>>2]=c[f+12>>2];SX(x,J,v);c[S>>2]=c[x>>2];c[S+4>>2]=c[x+4>>2];c[S+8>>2]=c[x+8>>2];c[S+12>>2]=c[x+12>>2];S=i+(k*40|0)+24|0;v=+TX(+h[n>>3]);c[J>>2]=c[g>>2];c[J+4>>2]=c[g+4>>2];c[J+8>>2]=c[g+8>>2];c[J+12>>2]=c[g+12>>2];SX(y,J,v);c[S>>2]=c[y>>2];c[S+4>>2]=c[y+4>>2];c[S+8>>2]=c[y+8>>2];c[S+12>>2]=c[y+12>>2];k=k+1|0}c[I>>2]=c[f>>2];c[I+4>>2]=c[f+4>>2];c[I+8>>2]=c[f+8>>2];c[I+12>>2]=c[f+12>>2];c[J>>2]=c[g>>2];c[J+4>>2]=c[g+4>>2];c[J+8>>2]=c[g+8>>2];c[J+12>>2]=c[g+12>>2];UX(d,e,i,I,J,G,A,H,C);c[q>>2]=c[G>>2];c[q+4>>2]=c[G+4>>2];c[q+8>>2]=c[G+8>>2];c[q+12>>2]=c[G+12>>2];c[w>>2]=c[A>>2];c[w+4>>2]=c[A+4>>2];c[w+8>>2]=c[A+8>>2];c[w+12>>2]=c[A+12>>2];c[I>>2]=c[H>>2];c[I+4>>2]=c[H+4>>2];c[I+8>>2]=c[H+8>>2];c[I+12>>2]=c[H+12>>2];c[J>>2]=c[C>>2];c[J+4>>2]=c[C+4>>2];c[J+8>>2]=c[C+8>>2];c[J+12>>2]=c[C+12>>2];if(!(VX(a,b,q,w,I,J,d,e)|0)){c[J>>2]=c[A>>2];c[J+4>>2]=c[A+4>>2];c[J+8>>2]=c[A+8>>2];c[J+12>>2]=c[A+12>>2];SX(z,J,.3333333333333333);c[I>>2]=c[G>>2];c[I+4>>2]=c[G+4>>2];c[I+8>>2]=c[G+8>>2];c[I+12>>2]=c[G+12>>2];c[J>>2]=c[z>>2];c[J+4>>2]=c[z+4>>2];c[J+8>>2]=c[z+8>>2];c[J+12>>2]=c[z+12>>2];WX(B,I,J);v=+h[B>>3];u=+h[B+8>>3];c[J>>2]=c[C>>2];c[J+4>>2]=c[C+4>>2];c[J+8>>2]=c[C+8>>2];c[J+12>>2]=c[C+12>>2];SX(D,J,.3333333333333333);c[I>>2]=c[H>>2];c[I+4>>2]=c[H+4>>2];c[I+8>>2]=c[H+8>>2];c[I+12>>2]=c[H+12>>2];c[J>>2]=c[D>>2];c[J+4>>2]=c[D+4>>2];c[J+8>>2]=c[D+8>>2];c[J+12>>2]=c[D+12>>2];XX(E,I,J);t=+h[E>>3];p=+h[E+8>>3];q=c[47533]|0;r=+h[G>>3];s=+h[H>>3];o=+h[G+8>>3];m=+h[H+8>>3];n=Q+8|0;i=-1;j=-1.0;k=1;while(1){if((k|0)>=(F|0))break;W=+h[q+(k*40|0)>>3];T=+YX(W);U=+RX(W);V=+TX(W);W=+ZX(W);h[Q>>3]=T*r+v*U+t*V+W*s;h[n>>3]=W*m+(p*V+(u*U+T*o));S=d+(k<<4)|0;c[I>>2]=c[Q>>2];c[I+4>>2]=c[Q+4>>2];c[I+8>>2]=c[Q+8>>2];c[I+12>>2]=c[Q+12>>2];c[J>>2]=c[S>>2];c[J+4>>2]=c[S+4>>2];c[J+8>>2]=c[S+8>>2];c[J+12>>2]=c[S+12>>2];T=+QX(I,J);S=T>j;i=S?k:i;j=S?T:j;k=k+1|0}S=d+(i<<4)|0;Q=d+(i+-1<<4)|0;c[I>>2]=c[S>>2];c[I+4>>2]=c[S+4>>2];c[I+8>>2]=c[S+8>>2];c[I+12>>2]=c[S+12>>2];c[J>>2]=c[Q>>2];c[J+4>>2]=c[Q+4>>2];c[J+8>>2]=c[Q+8>>2];c[J+12>>2]=c[Q+12>>2];XX(N,I,J);c[J>>2]=c[N>>2];c[J+4>>2]=c[N+4>>2];c[J+8>>2]=c[N+8>>2];c[J+12>>2]=c[N+12>>2];NX(L,J);Q=i+1|0;N=d+(Q<<4)|0;c[I>>2]=c[N>>2];c[I+4>>2]=c[N+4>>2];c[I+8>>2]=c[N+8>>2];c[I+12>>2]=c[N+12>>2];c[J>>2]=c[S>>2];c[J+4>>2]=c[S+4>>2];c[J+8>>2]=c[S+8>>2];c[J+12>>2]=c[S+12>>2];XX(O,I,J);c[J>>2]=c[O>>2];c[J+4>>2]=c[O+4>>2];c[J+8>>2]=c[O+8>>2];c[J+12>>2]=c[O+12>>2];NX(M,J);c[I>>2]=c[L>>2];c[I+4>>2]=c[L+4>>2];c[I+8>>2]=c[L+8>>2];c[I+12>>2]=c[L+12>>2];c[J>>2]=c[M>>2];c[J+4>>2]=c[M+4>>2];c[J+8>>2]=c[M+8>>2];c[J+12>>2]=c[M+12>>2];WX(P,I,J);c[J>>2]=c[P>>2];c[J+4>>2]=c[P+4>>2];c[J+8>>2]=c[P+8>>2];c[J+12>>2]=c[P+12>>2];NX(K,J);c[I>>2]=c[f>>2];c[I+4>>2]=c[f+4>>2];c[I+8>>2]=c[f+8>>2];c[I+12>>2]=c[f+12>>2];c[J>>2]=c[K>>2];c[J+4>>2]=c[K+4>>2];c[J+8>>2]=c[K+8>>2];c[J+12>>2]=c[K+12>>2];PX(a,b,d,Q,I,J)|0;c[I>>2]=c[K>>2];c[I+4>>2]=c[K+4>>2];c[I+8>>2]=c[K+8>>2];c[I+12>>2]=c[K+12>>2];c[J>>2]=c[g>>2];c[J+4>>2]=c[g+4>>2];c[J+8>>2]=c[g+8>>2];c[J+12>>2]=c[g+12>>2];PX(a,b,S,e-i|0,I,J)|0;i=0}else i=0}l=R;return i|0}function QX(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+h[b>>3]-+h[a>>3];c=+h[b+8>>3]-+h[a+8>>3];return +(+G(+(d*d+c*c)))}function RX(a){a=+a;var b=0.0;b=1.0-a;return +(b*(a*3.0*b))}function SX(a,b,d){a=a|0;b=b|0;d=+d;var e=0;h[b>>3]=+h[b>>3]*d;e=b+8|0;h[e>>3]=+h[e>>3]*d;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];return}function TX(a){a=+a;return +((1.0-a)*(a*3.0*a))}function UX(a,b,d,e,f,g,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;k=k|0;var m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0,I=0.0,J=0,K=0,L=0,M=0;G=l;l=l+128|0;B=G+112|0;v=G+96|0;u=G;r=G+80|0;s=G+64|0;t=G+48|0;C=G+32|0;D=G+16|0;E=a+(b+-1<<4)|0;q=0;w=0.0;x=0.0;y=0.0;z=0.0;A=0.0;while(1){if((q|0)>=(b|0))break;K=d+(q*40|0)+8|0;c[v>>2]=c[K>>2];c[v+4>>2]=c[K+4>>2];c[v+8>>2]=c[K+8>>2];c[v+12>>2]=c[K+12>>2];c[B>>2]=c[K>>2];c[B+4>>2]=c[K+4>>2];c[B+8>>2]=c[K+8>>2];c[B+12>>2]=c[K+12>>2];H=x+ +dY(v,B);J=d+(q*40|0)+24|0;c[v>>2]=c[K>>2];c[v+4>>2]=c[K+4>>2];c[v+8>>2]=c[K+8>>2];c[v+12>>2]=c[K+12>>2];c[B>>2]=c[J>>2];c[B+4>>2]=c[J+4>>2];c[B+8>>2]=c[J+8>>2];c[B+12>>2]=c[J+12>>2];p=A+ +dY(v,B);c[v>>2]=c[J>>2];c[v+4>>2]=c[J+4>>2];c[v+8>>2]=c[J+8>>2];c[v+12>>2]=c[J+12>>2];c[B>>2]=c[J>>2];c[B+4>>2]=c[J+4>>2];c[B+8>>2]=c[J+8>>2];c[B+12>>2]=c[J+12>>2];o=y+ +dY(v,B);L=a+(q<<4)|0;M=d+(q*40|0)|0;I=+eY(+h[M>>3]);c[B>>2]=c[a>>2];c[B+4>>2]=c[a+4>>2];c[B+8>>2]=c[a+8>>2];c[B+12>>2]=c[a+12>>2];SX(s,B,I);I=+fY(+h[M>>3]);c[B>>2]=c[E>>2];c[B+4>>2]=c[E+4>>2];c[B+8>>2]=c[E+8>>2];c[B+12>>2]=c[E+12>>2];SX(t,B,I);c[v>>2]=c[s>>2];c[v+4>>2]=c[s+4>>2];c[v+8>>2]=c[s+8>>2];c[v+12>>2]=c[s+12>>2];c[B>>2]=c[t>>2];c[B+4>>2]=c[t+4>>2];c[B+8>>2]=c[t+8>>2];c[B+12>>2]=c[t+12>>2];WX(r,v,B);c[v>>2]=c[L>>2];c[v+4>>2]=c[L+4>>2];c[v+8>>2]=c[L+8>>2];c[v+12>>2]=c[L+12>>2];c[B>>2]=c[r>>2];c[B+4>>2]=c[r+4>>2];c[B+8>>2]=c[r+8>>2];c[B+12>>2]=c[r+12>>2];XX(u,v,B);c[v>>2]=c[K>>2];c[v+4>>2]=c[K+4>>2];c[v+8>>2]=c[K+8>>2];c[v+12>>2]=c[K+12>>2];c[B>>2]=c[u>>2];c[B+4>>2]=c[u+4>>2];c[B+8>>2]=c[u+8>>2];c[B+12>>2]=c[u+12>>2];I=w+ +dY(v,B);c[v>>2]=c[J>>2];c[v+4>>2]=c[J+4>>2];c[v+8>>2]=c[J+8>>2];c[v+12>>2]=c[J+12>>2];c[B>>2]=c[u>>2];c[B+4>>2]=c[u+4>>2];c[B+8>>2]=c[u+8>>2];c[B+12>>2]=c[u+12>>2];q=q+1|0;w=I;x=H;y=o;z=z+ +dY(v,B);A=p}o=x*y-A*A;p=o>=0.0?o:-o;if(!(p>=1.0e-06?(m=(w*y-z*A)/o,n=(z*x-w*A)/o,!(n<=0.0|(m<=0.0|p<1.0e-06))):0))F=6;if((F|0)==6){c[v>>2]=c[a>>2];c[v+4>>2]=c[a+4>>2];c[v+8>>2]=c[a+8>>2];c[v+12>>2]=c[a+12>>2];c[B>>2]=c[E>>2];c[B+4>>2]=c[E+4>>2];c[B+8>>2]=c[E+8>>2];c[B+12>>2]=c[E+12>>2];m=+QX(v,B)/3.0;n=m};c[g>>2]=c[a>>2];c[g+4>>2]=c[a+4>>2];c[g+8>>2]=c[a+8>>2];c[g+12>>2]=c[a+12>>2];c[B>>2]=c[e>>2];c[B+4>>2]=c[e+4>>2];c[B+8>>2]=c[e+8>>2];c[B+12>>2]=c[e+12>>2];SX(C,B,m);c[i>>2]=c[C>>2];c[i+4>>2]=c[C+4>>2];c[i+8>>2]=c[C+8>>2];c[i+12>>2]=c[C+12>>2];c[j>>2]=c[E>>2];c[j+4>>2]=c[E+4>>2];c[j+8>>2]=c[E+8>>2];c[j+12>>2]=c[E+12>>2];c[B>>2]=c[f>>2];c[B+4>>2]=c[f+4>>2];c[B+8>>2]=c[f+8>>2];c[B+12>>2]=c[f+12>>2];SX(D,B,n);c[k>>2]=c[D>>2];c[k+4>>2]=c[D+4>>2];c[k+8>>2]=c[D+8>>2];c[k+12>>2]=c[D+12>>2];l=G;return}function VX(a,b,d,e,f,g,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;var k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0,u=0.0,v=0,w=0.0,x=0,y=0.0,z=0,A=0,B=0,C=0,D=0.0,E=0;C=l;l=l+64|0;B=C;z=(j|0)==2;y=+h[d>>3];u=+h[d+8>>3];v=B+8|0;w=+h[e>>3];x=B+16|0;p=+h[e+8>>3];q=B+24|0;r=+h[f>>3];s=+h[g>>3];t=B+32|0;o=+h[f+8>>3];n=+h[g+8>>3];e=B+40|0;f=B+48|0;g=B+56|0;d=1;k=4.0;m=4.0;while(1){h[B>>3]=y;h[v>>3]=u;h[x>>3]=y+m*w/3.0;h[q>>3]=u+m*p/3.0;h[t>>3]=r-k*s/3.0;h[e>>3]=o-k*n/3.0;h[f>>3]=r;h[g>>3]=o;if(d?(D=+_X(B,4),D<+_X(i,j)+-.001):0){d=0;break}if($X(a,b,B)|0){A=5;break}if(m==0.0&k==0.0){A=9;break}E=m>.01;d=0;k=E?k*.5:0.0;m=E?m*.5:0.0}a:do if((A|0)==5){OX((c[47530]|0)+4|0);e=c[47531]|0;d=1;while(1){if((d|0)==4){d=1;break a}E=c[47530]|0;h[e+(E<<4)>>3]=+h[B+(d<<4)>>3];D=+h[B+(d<<4)+8>>3];c[47530]=E+1;h[e+(E<<4)+8>>3]=D;d=d+1|0}}else if((A|0)==9)if(z){OX((c[47530]|0)+4|0);e=c[47531]|0;d=1;while(1){if((d|0)==4){d=1;break a}E=c[47530]|0;h[e+(E<<4)>>3]=+h[B+(d<<4)>>3];D=+h[B+(d<<4)+8>>3];c[47530]=E+1;h[e+(E<<4)+8>>3]=D;d=d+1|0}}else d=0;while(0);l=C;return d|0}function WX(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;h[b>>3]=+h[d>>3]+ +h[b>>3];e=b+8|0;h[e>>3]=+h[d+8>>3]+ +h[e>>3];c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];return}function XX(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;h[b>>3]=+h[b>>3]-+h[d>>3];e=b+8|0;h[e>>3]=+h[e>>3]-+h[d+8>>3];c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];return}function YX(a){a=+a;a=1.0-a;return +(a*(a*a))}function ZX(a){a=+a;return +(a*a*a)}function _X(a,b){a=a|0;b=b|0;var c=0.0,d=0,e=0.0,f=0.0,g=0;c=0.0;d=1;while(1){if((d|0)>=(b|0))break;g=d+-1|0;f=+h[a+(d<<4)>>3]-+h[a+(g<<4)>>3];e=+h[a+(d<<4)+8>>3]-+h[a+(g<<4)+8>>3];c=c+ +G(+(f*f+e*e));d=d+1|0}return +c}function $X(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0.0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0,D=0.0,E=0.0;C=l;l=l+64|0;t=C+32|0;u=C;w=u+16|0;x=d+16|0;z=d+32|0;A=d+48|0;B=d+8|0;g=d+24|0;i=d+40|0;j=d+56|0;k=u+8|0;m=u+24|0;f=0;a:while(1){if((f|0)>=(b|0)){e=1;break}n=a+(f<<5)|0;c[u>>2]=c[n>>2];c[u+4>>2]=c[n+4>>2];c[u+8>>2]=c[n+8>>2];c[u+12>>2]=c[n+12>>2];n=a+(f<<5)+16|0;c[w>>2]=c[n>>2];c[w+4>>2]=c[n+4>>2];c[w+8>>2]=c[n+8>>2];c[w+12>>2]=c[n+12>>2];n=aY(d,u,t)|0;b:do if((n|0)!=4){o=+h[u>>3];p=+h[k>>3];q=+h[w>>3];r=+h[m>>3];e=0;while(1){if((e|0)>=(n|0))break b;s=+h[t+(e<<3)>>3];if((!(s<1.0e-06|s>.999999)?(y=s*(s*s),v=s*3.0,E=1.0-s,D=E*(s*v),s=E*(v*E),E=E*(E*E),v=E*+h[d>>3]+s*+h[x>>3]+D*+h[z>>3]+y*+h[A>>3],y=E*+h[B>>3]+s*+h[g>>3]+D*+h[i>>3]+y*+h[j>>3],D=v-o,s=y-p,!(D*D+s*s<.001)):0)?(D=v-q,E=y-r,!(D*D+E*E<.001)):0){e=0;break a}e=e+1|0}}while(0);f=f+1|0}l=C;return e|0}function aY(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0,j=0.0,k=0.0,m=0.0,n=0,o=0.0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=l;l=l+96|0;y=C+48|0;A=C+24|0;z=C;B=C+80|0;u=+h[b>>3];s=+h[b+16>>3]-u;t=+h[b+8>>3];o=+h[b+24>>3]-t;c[B>>2]=0;v=y+8|0;f=a+48|0;e=a+56|0;w=y+16|0;i=a+32|0;p=a+40|0;q=a+8|0;x=y+24|0;g=+h[a>>3];j=+h[f>>3];k=+h[i>>3];r=a+24|0;n=a+16|0;m=+h[n>>3];a:do if(!(s==0.0)){o=o/s;bY(+h[q>>3]-o*g,+h[r>>3]-o*m,+h[p>>3]-o*k,+h[e>>3]-o*j,y);h[y>>3]=u*o-t+ +h[y>>3];e=zY(y,A)|0;if((e|0)==4)b=4;else{b=0;while(1){if((b|0)>=(e|0))break;g=+h[A+(b<<3)>>3];if(g>=0.0&g<=1.0?(bY(+h[a>>3],+h[n>>3],+h[i>>3],+h[f>>3],y),t=(+h[y>>3]+g*(+h[v>>3]+g*(+h[w>>3]+g*+h[x>>3]))-u)/s,t>=0.0&t<=1.0):0)cY(g,d,B);b=b+1|0}b=c[B>>2]|0}}else{bY(g,m,k,j,y);h[y>>3]=+h[y>>3]-u;n=zY(y,A)|0;if(!(o==0.0)){if((n|0)==4){b=4;break}else b=0;while(1){if((b|0)>=(n|0))break;g=+h[A+(b<<3)>>3];if(g>=0.0&g<=1.0?(bY(+h[q>>3],+h[r>>3],+h[p>>3],+h[e>>3],y),u=(+h[y>>3]+g*(+h[v>>3]+g*(+h[w>>3]+g*+h[x>>3]))-t)/o,u>=0.0&u<=1.0):0)cY(g,d,B);b=b+1|0}b=c[B>>2]|0;break}bY(+h[q>>3],+h[r>>3],+h[p>>3],+h[e>>3],y);h[y>>3]=+h[y>>3]-t;i=zY(y,z)|0;b=(i|0)==4;b:do if((n|0)==4){if(b){b=4;break a}else b=0;while(1){if((b|0)>=(i|0))break b;cY(+h[z+(b<<3)>>3],d,B);b=b+1|0}}else{if(b){b=0;while(1){if((b|0)>=(n|0))break b;cY(+h[A+(b<<3)>>3],d,B);b=b+1|0}}else e=0;while(1){if((e|0)>=(n|0))break b;f=A+(e<<3)|0;b=0;while(1){if((b|0)>=(i|0))break;g=+h[f>>3];if(g==+h[z+(b<<3)>>3])cY(g,d,B);b=b+1|0}e=e+1|0}}while(0);b=c[B>>2]|0}while(0);l=C;return b|0}function bY(a,b,c,d,e){a=+a;b=+b;c=+c;d=+d;e=e|0;c=c*3.0;h[e+24>>3]=b*3.0+d-(c+a);h[e+16>>3]=a*3.0+c-b*6.0;h[e+8>>3]=(b-a)*3.0;h[e>>3]=a;return}function cY(a,b,d){a=+a;b=b|0;d=d|0;var e=0;if(a>=0.0&a<=1.0){e=c[d>>2]|0;h[b+(e<<3)>>3]=a;c[d>>2]=e+1}return}function dY(a,b){a=a|0;b=b|0;return +(+h[a>>3]*+h[b>>3]+ +h[a+8>>3]*+h[b+8>>3])}function eY(a){a=+a;var b=0.0;b=1.0-a;return +(b*b*(b+a*3.0))}function fY(a){a=+a;return +(a*a*((1.0-a)*3.0+a))}function gY(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0.0,j=0,k=0,m=0,n=0,q=0,r=0,s=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0;J=l;l=l+112|0;G=J+80|0;F=J+64|0;E=J+48|0;I=4;H=k6(40)|0;c[H>>2]=0;x=J+32|0;y=J+16|0;z=J;A=J+96|0;I=x6(190140,1,H|0,I|0)|0;H=D;o=0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,I|0,H|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1)e=D;else e=0;a:while(1){if(e|0){e=-2;break}g=a+4|0;o=0;$(116,c[g>>2]|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,I|0,H|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;continue}c[47574]=0;c[47575]=0;o=0;$(117,c[g>>2]<<1|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,I|0,H|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;continue}n=(c[47577]|0)/2|0;c[47578]=n;c[47579]=n+-1;n=c[g>>2]|0;g=c[a>>2]|0;e=0;f=-1;i=t;while(1){if((e|0)>=(n|0))break;K=+h[g+(e<<4)>>3];w=i>K;v=w?e:f;e=e+1|0;f=v;i=w?K:i}m=g+(f<<4)|0;c[y>>2]=c[m>>2];c[y+4>>2]=c[m+4>>2];c[y+8>>2]=c[m+8>>2];c[y+12>>2]=c[m+12>>2];m=g+(((f|0)==0?n:f)+-1<<4)|0;c[x>>2]=c[m>>2];c[x+4>>2]=c[m+4>>2];c[x+8>>2]=c[m+8>>2];c[x+12>>2]=c[m+12>>2];m=n+-1|0;w=g+(((f|0)==(m|0)?0:f+1|0)<<4)|0;c[z>>2]=c[w>>2];c[z+4>>2]=c[w+4>>2];c[z+8>>2]=c[w+8>>2];c[z+12>>2]=c[w+12>>2];K=+h[y>>3];if((+h[x>>3]==K?K==+h[z>>3]:0)?+h[z+8>>3]>+h[y+8>>3]:0)w=15;else w=12;b:do if((w|0)==12){w=0;o=0;e=aa(39,x|0,y|0,z|0)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){g=A6(c[f>>2]|0,I|0,H|0)|0;if(!g)Ca(f|0,p|0);D=p}else g=-1;if((g|0)==1){e=D;continue a}if((e|0)==1){g=c[47581]|0;e=c[47582]|0;f=0;while(1){if((f|0)>=(n|0))break b;j=c[a>>2]|0;k=j+(f<<4)|0;if(!(((f|0)>0?(C=f+-1|0,+h[k>>3]==+h[j+(C<<4)>>3]):0)?+h[j+(f<<4)+8>>3]==+h[j+(C<<4)+8>>3]:0)){v=c[47574]|0;c[g+(v<<3)>>2]=k;c[g+(v<<3)+4>>2]=g+(((v|0)%(n|0)|0)<<3);c[e+(v<<2)>>2]=g+(v<<3);c[47574]=v+1}f=f+1|0}}else w=15}while(0);c:do if((w|0)==15){w=0;g=c[47581]|0;e=c[47582]|0;f=m;while(1){if((f|0)<=-1)break c;j=c[a>>2]|0;k=j+(f<<4)|0;if(!(((f|0)<(m|0)?(B=f+1|0,+h[k>>3]==+h[j+(B<<4)>>3]):0)?+h[j+(f<<4)+8>>3]==+h[j+(B<<4)+8>>3]:0)){v=c[47574]|0;c[g+(v<<3)>>2]=k;c[g+(v<<3)+4>>2]=g+(((v|0)%(n|0)|0)<<3);c[e+(v<<2)>>2]=g+(v<<3);c[47574]=v+1}f=f+-1|0}}while(0);o=0;ha(29,e|0,c[47574]|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,I|0,H|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;continue}j=0;e=c[47575]|0;d:while(1){if((j|0)>=(e|0)){u=0;break}k=j+1|0;g=k;while(1){if((g|0)>=(e|0)){j=k;continue d}o=0;ha(30,j|0,g|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,I|0,H|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;continue a}g=g+1|0;e=c[47575]|0}}while(1){if((u|0)>=(e|0))break;o=0;f=ra(105,u|0,b|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){j=A6(c[g>>2]|0,I|0,H|0)|0;if(!j)Ca(g|0,p|0);D=p}else j=-1;if((j|0)==1){e=D;continue a}if(f|0)break;u=u+1|0}if((u|0)==(e|0)){e=c[15715]|0;o=0;c[E>>2]=142161;c[E+4>>2]=192;c[E+8>>2]=142172;aa(35,e|0,142142,E|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,I|0,H|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;continue}else{w=42;break}}v=b+16|0;k=0;while(1){if((k|0)>=(e|0))break;o=0;f=ra(105,k|0,v|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){j=A6(c[g>>2]|0,I|0,H|0)|0;if(!j)Ca(g|0,p|0);D=p}else j=-1;if((j|0)==1){e=D;continue a}if(f|0)break;k=k+1|0}if((k|0)==(e|0)){e=c[15715]|0;o=0;c[F>>2]=142161;c[F+4>>2]=200;c[F+8>>2]=142205;aa(35,e|0,142142,F|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,I|0,H|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;continue}else{w=49;break}}o=0;e=ra(106,u|0,k|0)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){g=A6(c[f>>2]|0,I|0,H|0)|0;if(!g)Ca(f|0,p|0);D=p}else g=-1;if((g|0)==1){e=D;continue}if(!e){e=c[15715]|0;o=0;c[G>>2]=142161;c[G+4>>2]=207;c[G+8>>2]=142243;aa(35,e|0,142142,G|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,I|0,H|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;continue}o=0;$(118,2);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,I|0,H|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;continue}else{w=54;break}}s=d+4|0;if((u|0)==(k|0)){o=0;$(118,2);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,I|0,H|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;continue}else{w=57;break}}c[A>>2]=b;c[A+4>>2]=0;f=A+8|0;c[f>>2]=v;c[A+12>>2]=0;o=0;ha(31,1,A|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){g=A6(c[e>>2]|0,I|0,H|0)|0;if(!g)Ca(e|0,p|0);D=p}else g=-1;if((g|0)==1){e=D;continue}c[47580]=c[47578];q=u;e:while(1){if((q|0)==-1){g=f;e=0;break}r=c[47584]|0;c[r+(q*52|0)>>2]=2;g=0;while(1){j=g+1|0;if((g|0)>=3){w=65;break}e=c[r+(q*52|0)+4+(g<<4)+12>>2]|0;if(!e){g=j;continue}if((c[e>>2]|0)==1){w=68;break}else g=j}if((w|0)==65){w=0;if((g|0)==3){e=c[47576]|0;k=c[e+(c[47579]<<2)>>2]|0;o=0;e=aa(39,v|0,c[c[e+(c[47578]<<2)>>2]>>2]|0,c[k>>2]|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){j=A6(c[g>>2]|0,I|0,H|0)|0;if(!j)Ca(g|0,p|0);D=p}else j=-1;if((j|0)==1){e=D;continue a}j=(e|0)==1;n=j?f:k;j=j?k:f}else w=68}if((w|0)==68){w=0;m=c[r+(q*52|0)+4+(g<<4)>>2]|0;k=c[r+(q*52|0)+4+(g<<4)+4>>2]|0;o=0;e=aa(39,c[m>>2]|0,c[c[r+(q*52|0)+4+(((j|0)%3|0)<<4)+4>>2]>>2]|0,c[k>>2]|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){j=A6(c[g>>2]|0,I|0,H|0)|0;if(!j)Ca(g|0,p|0);D=p}else j=-1;if((j|0)==1){e=D;continue a}j=(e|0)==1;n=j?m:k;j=j?k:m}do if((q|0)==(u|0)){o=0;ha(31,2,j|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){g=A6(c[e>>2]|0,I|0,H|0)|0;if(!g)Ca(e|0,p|0);D=p}else g=-1;if((g|0)==1){e=D;continue a}o=0;ha(31,1,n|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){g=A6(c[e>>2]|0,I|0,H|0)|0;if(!g)Ca(e|0,p|0);D=p}else g=-1;if((g|0)==1){e=D;continue a}e=0}else{m=c[47576]|0;if((c[m+(c[47578]<<2)>>2]|0)!=(n|0)?(c[m+(c[47579]<<2)>>2]|0)!=(n|0):0){o=0;j=la(34,n|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){g=A6(c[e>>2]|0,I|0,H|0)|0;if(!g)Ca(e|0,p|0);D=p}else g=-1;if((g|0)==1){e=D;continue a}o=0;ha(32,2,j|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){g=A6(c[e>>2]|0,I|0,H|0)|0;if(!g)Ca(e|0,p|0);D=p}else g=-1;if((g|0)==1){e=D;continue a}o=0;ha(31,1,n|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){g=A6(c[e>>2]|0,I|0,H|0)|0;if(!g)Ca(e|0,p|0);D=p}else g=-1;if((g|0)==1){e=D;continue a}if((j|0)<=(c[47580]|0)){e=0;break}c[47580]=j;e=0;break}o=0;k=la(34,j|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){g=A6(c[e>>2]|0,I|0,H|0)|0;if(!g)Ca(e|0,p|0);D=p}else g=-1;if((g|0)==1){e=D;continue a}o=0;ha(32,1,k|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){g=A6(c[e>>2]|0,I|0,H|0)|0;if(!g)Ca(e|0,p|0);D=p}else g=-1;if((g|0)==1){e=D;continue a}o=0;ha(31,2,j|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){g=A6(c[e>>2]|0,I|0,H|0)|0;if(!g)Ca(e|0,p|0);D=p}else g=-1;if((g|0)==1){e=D;continue a}if((k|0)>=(c[47580]|0)){e=0;break}c[47580]=k;e=0}while(0);while(1){if((e|0)>=3){q=-1;continue e}g=c[r+(q*52|0)+4+(e<<4)+12>>2]|0;if(g|0?(c[g>>2]|0)==1:0)break;e=e+1|0}q=(g-(c[47584]|0)|0)/52|0}while(1){if(!g)break;g=c[g+4>>2]|0;e=e+1|0}o=0;$(118,e|0);g=o;o=0;if((g|0)!=0&(p|0)!=0){j=A6(c[g>>2]|0,I|0,H|0)|0;if(!j)Ca(g|0,p|0);D=p}else j=-1;if((j|0)==1)e=D;else{w=94;break}}if((w|0)==42)e=-1;else if((w|0)==49)e=-1;else if((w|0)==54){c[d+4>>2]=2;e=c[47583]|0;c[e>>2]=c[b>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];H=e+16|0;c[H>>2]=c[v>>2];c[H+4>>2]=c[v+4>>2];c[H+8>>2]=c[v+8>>2];c[H+12>>2]=c[v+12>>2];c[d>>2]=e;e=0}else if((w|0)==57){c[s>>2]=2;e=c[47583]|0;c[e>>2]=c[b>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];H=e+16|0;c[H>>2]=c[v>>2];c[H+4>>2]=c[v+4>>2];c[H+8>>2]=c[v+8>>2];c[H+12>>2]=c[v+12>>2];c[d>>2]=e;e=0}else if((w|0)==94){c[s>>2]=e;g=c[47583]|0;while(1){e=e+-1|0;if(!f)break;H=g+(e<<4)|0;G=c[f>>2]|0;c[H>>2]=c[G>>2];c[H+4>>2]=c[G+4>>2];c[H+8>>2]=c[G+8>>2];c[H+12>>2]=c[G+12>>2];f=c[f+4>>2]|0}c[d>>2]=g;e=0}l6(I|0);l=J;return e|0}function hY(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+64|0;g=j+48|0;i=j+32|0;h=j+16|0;f=j;if((c[47587]|0)<(a|0)){b=c[47581]|0;d=a<<3;e=a<<2;if(!b){i=k6(d)|0;c[47581]=i;if(!i){i=c[15715]|0;c[f>>2]=142161;c[f+4>>2]=523;c[f+8>>2]=142411;z4(i,142142,f)|0;Ca(190140,1)}i=k6(e)|0;c[47582]=i;if(!i){i=c[15715]|0;c[h>>2]=142161;c[h+4>>2]=527;c[h+8>>2]=142430;z4(i,142142,h)|0;Ca(190140,1)}}else{h=n6(b,d)|0;c[47581]=h;if(!h){h=c[15715]|0;c[i>>2]=142161;c[i+4>>2]=533;c[i+8>>2]=142450;z4(h,142142,i)|0;Ca(190140,1)}i=n6(c[47582]|0,e)|0;c[47582]=i;if(!i){i=c[15715]|0;c[g>>2]=142161;c[g+4>>2]=539;c[g+8>>2]=142470;z4(i,142142,g)|0;Ca(190140,1)}}c[47587]=a}l=j;return}function iY(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=l;l=l+32|0;f=g+16|0;e=g;if((c[47577]|0)<(a|0)){b=c[47576]|0;d=a<<2;if(!b){f=k6(d)|0;c[47576]=f;if(!f){f=c[15715]|0;c[e>>2]=142161;c[e+4>>2]=573;c[e+8>>2]=142366;z4(f,142142,e)|0;Ca(190140,1)}}else{e=n6(b,d)|0;c[47576]=e;if(!e){e=c[15715]|0;c[f>>2]=142161;c[f+4>>2]=580;c[f+8>>2]=142388;z4(e,142142,f)|0;Ca(190140,1)}}c[47577]=a}l=g;return}function jY(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0;e=+h[b+8>>3];d=+h[b>>3];d=(+h[a+8>>3]-e)*(+h[c>>3]-d)-(+h[c+8>>3]-e)*(+h[a>>3]-d);return (d>0.0?1:d<0.0?2:3)|0}function kY(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;h=i;a:while(1){if((b|0)>3)e=0;else{b=9;break}while(1){if((e|0)>=(b|0)){b=8;break a}f=e+1|0;d=(f|0)%(b|0)|0;g=(e+2|0)%(b|0)|0;if(!(sY(e,g,a,b)|0))e=f;else break}tY(c[a+(e<<2)>>2]|0,c[a+(d<<2)>>2]|0,c[a+(g<<2)>>2]|0);b=b+-1|0;while(1){if((d|0)>=(b|0))continue a;g=d+1|0;c[a+(d<<2)>>2]=c[a+(g<<2)>>2];d=g}}if((b|0)==8){a=c[15715]|0;c[h>>2]=142161;c[h+4>>2]=324;c[h+8>>2]=142306;z4(a,142142,h)|0}else if((b|0)==9)tY(c[a>>2]|0,c[a+4>>2]|0,c[a+8>>2]|0);l=i;return}function lY(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;h=c[47584]|0;i=h+(a*52|0)|0;j=h+(b*52|0)|0;e=0;while(1){if((e|0)==3)break;k=h+(a*52|0)+4+(e<<4)|0;l=h+(a*52|0)+4+(e<<4)+4|0;m=h+(a*52|0)+4+(e<<4)+12|0;d=0;while(1){if((d|0)==3)break;n=c[c[k>>2]>>2]|0;f=c[c[h+(b*52|0)+4+(d<<4)>>2]>>2]|0;g=c[c[h+(b*52|0)+4+(d<<4)+4>>2]>>2]|0;if((n|0)==(f|0)?(c[c[l>>2]>>2]|0)==(g|0):0)o=9;else o=7;if(((o|0)==7?(o=0,(n|0)==(g|0)):0)?(c[c[l>>2]>>2]|0)==(f|0):0)o=9;if((o|0)==9){c[m>>2]=j;c[h+(b*52|0)+4+(d<<4)+12>>2]=i}d=d+1|0}e=e+1|0}return}function mY(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=c[47584]|0;d=0;e=0;while(1){if((e|0)==3)break;d=((jY(c[c[f+(a*52|0)+4+(e<<4)>>2]>>2]|0,c[c[f+(a*52|0)+4+(e<<4)+4>>2]>>2]|0,b)|0)!=2&1)+d|0;e=e+1|0}return ((d|0)==3|(d|0)==0)&1|0}function nY(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=c[47584]|0;e=d+(a*52|0)|0;a:do if(!(c[e>>2]|0)){c[e>>2]=1;if((a|0)==(b|0))d=1;else{f=0;while(1){if((f|0)>=3)break;e=c[d+(a*52|0)+4+(f<<4)+12>>2]|0;if(e){if(nY((e-d|0)/52|0,b)|0){d=1;break a}d=c[47584]|0}f=f+1|0}c[d+(a*52|0)>>2]=0;d=0}}else d=0;while(0);return d|0}function oY(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=l;l=l+32|0;f=g+16|0;e=g;if((c[47585]|0)<(a|0)){b=c[47583]|0;d=a<<4;if(!b){f=k6(d)|0;c[47583]=f;if(!f){f=c[15715]|0;c[e>>2]=142161;c[e+4>>2]=593;c[e+8>>2]=142269;z4(f,142142,e)|0;Ca(190140,1)}}else{e=n6(b,d)|0;c[47583]=e;if(!e){e=c[15715]|0;c[f>>2]=142161;c[f+4>>2]=599;c[f+8>>2]=142287;z4(e,142142,f)|0;Ca(190140,1)}}c[47585]=a}l=g;return}function pY(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=c[47579]|0;e=c[47578]|0;f=(d|0)>=(e|0);g=b+4|0;if((a|0)==1){if(f)c[g>>2]=c[(c[47576]|0)+(e<<2)>>2];a=e+-1|0;d=190312}else{if(f)c[g>>2]=c[(c[47576]|0)+(d<<2)>>2];a=d+1|0;d=190316}c[d>>2]=a;c[(c[47576]|0)+(a<<2)>>2]=b;return}function qY(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;f=c[47580]|0;g=c[47576]|0;b=c[47578]|0;while(1){if((b|0)>=(f|0)){e=4;break}d=b+1|0;if((jY(c[c[g+(d<<2)>>2]>>2]|0,c[c[g+(b<<2)>>2]>>2]|0,c[a>>2]|0)|0)==1)break;else b=d}a:do if((e|0)==4){b=c[47579]|0;while(1){if((b|0)<=(f|0)){b=f;break a}d=b+-1|0;if((jY(c[c[g+(d<<2)>>2]>>2]|0,c[c[g+(b<<2)>>2]>>2]|0,c[a>>2]|0)|0)==2)break;else b=d}}while(0);return b|0}function rY(a,b){a=a|0;b=b|0;c[((a|0)==1?190316:190312)>>2]=b;return}function sY(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=c[c[d+(((a+-1+e|0)%(e|0)|0)<<2)>>2]>>2]|0;i=c[c[d+(a<<2)>>2]>>2]|0;g=c[c[d+(((a+1|0)%(e|0)|0)<<2)>>2]>>2]|0;k=(jY(f,i,g)|0)==1;j=c[c[d+(b<<2)>>2]>>2]|0;if(k)if((jY(i,j,f)|0)==1){f=jY(j,i,g)|0;g=1;h=5}else f=0;else{f=jY(i,j,g)|0;g=2;h=5}a:do if((h|0)==5)if((f|0)==(g|0)){f=0;while(1){if((f|0)>=(e|0)){f=1;break a}g=f;f=f+1|0;h=(f|0)%(e|0)|0;if((h|0)==(b|0)|((g|0)==(b|0)|((g|0)==(a|0)|(h|0)==(a|0))))continue;if(vY(i,j,c[c[d+(g<<2)>>2]>>2]|0,c[c[d+(h<<2)>>2]>>2]|0)|0){f=0;break}}}else f=0;while(0);return f|0}function tY(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[47575]|0;f=c[47586]|0;if((e|0)<(f|0))h=e;else{uY(f+20|0);h=c[47575]|0}g=c[47584]|0;c[47575]=h+1;f=g+(h*52|0)|0;c[f>>2]=0;c[g+(h*52|0)+4>>2]=a;c[g+(h*52|0)+8>>2]=b;c[g+(h*52|0)+16>>2]=0;c[g+(h*52|0)+20>>2]=b;c[g+(h*52|0)+24>>2]=d;c[g+(h*52|0)+32>>2]=0;c[g+(h*52|0)+36>>2]=d;c[g+(h*52|0)+40>>2]=a;c[g+(h*52|0)+48>>2]=0;e=0;while(1){if((e|0)==3)break;c[g+(h*52|0)+4+(e<<4)+8>>2]=f;e=e+1|0}return}function uY(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=l;l=l+32|0;f=g+16|0;e=g;if((c[47586]|0)<(a|0)){b=c[47584]|0;d=a*52|0;if(!b){f=k6(d)|0;c[47584]=f;if(!f){f=c[15715]|0;c[e>>2]=142161;c[e+4>>2]=552;c[e+8>>2]=142327;z4(f,142142,e)|0;Ca(190140,1)}}else{e=n6(b,d)|0;c[47584]=e;if(!e){e=c[15715]|0;c[f>>2]=142161;c[f+4>>2]=558;c[f+8>>2]=142346;z4(e,142142,f)|0;Ca(190140,1)}}c[47586]=a}l=g;return}function vY(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;f=jY(a,b,c)|0;if((((f|0)!=3?(g=jY(a,b,d)|0,(g|0)!=3):0)?(h=jY(c,d,a)|0,(h|0)!=3):0)?(e=jY(c,d,b)|0,(e|0)!=3):0)a=((f|0)==1^(g|0)==1)&((h|0)==1^(e|0)==1)&1;else if(((wY(a,b,c)|0)==0?(wY(a,b,d)|0)==0:0)?(wY(c,d,a)|0)==0:0)return (wY(c,d,b)|0)!=0|0;else a=1;return a|0}function wY(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,g=0.0;e=+h[a>>3];g=+h[b>>3]-e;f=+h[a+8>>3];d=+h[b+8>>3]-f;e=+h[c>>3]-e;f=+h[c+8>>3]-f;if((jY(a,b,c)|0)==3)a=(g*e+d*f>=0.0?e*e+f*f<=g*g+d*d:0)&1;else a=0;return a|0}function xY(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0;m=k6(d<<2)|0;n=k6((d<<3)+8|0)|0;o=n+8|0;f=0;while(1){if((f|0)>=(d|0))break;c[m+(f<<2)>>2]=-1;h[o+(f<<3)>>3]=-2147483647.0;f=f+1|0}h[n>>3]=-2147483648.0;a:while(1){if((a|0)==(b|0))break;l=o+(a<<3)|0;j=+h[l>>3];h[l>>3]=j==-2147483647.0?0.0:-j;k=0;f=-1;while(1){if((k|0)>=(d|0)){a=f;continue a}i=o+(k<<3)|0;g=+h[i>>3];if(g<0.0){q=(a|0)<(k|0);p=+h[(c[e+((q?k:a)<<2)>>2]|0)+((q?a:k)<<3)>>3];j=-(p+ +h[l>>3]);if(p!=0.0&g>3]=j;c[m+(k<<2)>>2]=a;g=j}f=g>+h[o+(f<<3)>>3]?k:f}k=k+1|0}}l6(n);return m|0}function yY(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0;j=l;l=l+32|0;k=j+16|0;m=j;i=c[h+4>>2]|0;c[m>>2]=c[a>>2];c[m+4>>2]=c[a+4>>2];c[m+8>>2]=c[a+8>>2];c[m+12>>2]=c[a+12>>2];c[k>>2]=c[e>>2];c[k+4>>2]=c[e+4>>2];c[k+8>>2]=c[e+8>>2];c[k+12>>2]=c[e+12>>2];a=i+2|0;if(!(RY(m,b,k,f,h)|0)){m=c[h+24>>2]|0;c[m+(i<<2)>>2]=g;k=i+1|0;c[m+(k<<2)>>2]=d;a=xY(k,i,a,m)|0}else{a=k6(a<<2)|0;m=i+1|0;c[a+(i<<2)>>2]=m;c[a+(m<<2)>>2]=-1}l=j;return a|0}function zY(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0.0,f=0.0,g=0.0,i=0.0,j=0;d=+h[a+24>>3];a:do if(d<1.0e-07&d>-1.0e-07)a=AY(a,b)|0;else{i=+h[a+16>>3]/(d*3.0);e=+h[a+8>>3]/d;g=i*i;d=+h[a>>3]/d+(i*2.0*g-e*i);g=e/3.0-g;e=d*d;g=e+g*(g*(g*4.0));a=b+16|0;f=-d;c=b+8|0;if(!(g<0.0)){d=(+G(+g)-d)*.5;e=+U3(d);d=e+ +U3(f-d);h[b>>3]=d;d=d*-.5;if(g>0.0)a=1;else{h[a>>3]=d;h[c>>3]=d;a=3}}else{f=+O(+(+G(+-g)),+f);g=+U3(+G(+(e-g))*.5)*2.0;h[b>>3]=g*+I(+(f/3.0));h[c>>3]=g*+I(+((f+3.141592653589793+3.141592653589793)/3.0));h[a>>3]=g*+I(+((f+-3.141592653589793+-3.141592653589793)/3.0));a=3}c=0;while(1){if((c|0)>=(a|0))break a;j=b+(c<<3)|0;h[j>>3]=+h[j>>3]-i;c=c+1|0}}while(0);return a|0}function AY(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+h[a+16>>3];do if(!(c<1.0e-07&c>-1.0e-07)){d=+h[a+8>>3]/(c*2.0);c=d*d-+h[a>>3]/c;if(!(c<0.0))if(c==0.0){h[b>>3]=-d;a=1;break}else{c=+G(+c)-d;h[b>>3]=c;h[b+8>>3]=d*-2.0-c;a=2;break}else a=0}else a=BY(a,b)|0;while(0);return a|0}function BY(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+h[a+8>>3];c=+h[a>>3];if(d<1.0e-07&d>-1.0e-07)a=c<1.0e-07&c>-1.0e-07?4:0;else{h[b>>3]=-c/d;a=1}return a|0}function CY(a){a=a|0;l6(c[a>>2]|0);l6(a);return}function DY(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=c[a+4>>2]|0;l=(f*3|0)+-2|0;e=c[47589]|0;if((l|0)>(c[47588]|0)){d=l<<4;if(!e)d=k6(d)|0;else d=n6(e,d)|0;c[47589]=d;c[47588]=l;k=d;j=d}else{k=e;j=e}i=c[a>>2]|0;c[j>>2]=c[i>>2];c[j+4>>2]=c[i+4>>2];c[j+8>>2]=c[i+8>>2];c[j+12>>2]=c[i+12>>2];I6(k+16|0,i|0,16)|0;a=f+-1|0;d=1;e=2;while(1){f=k+(e<<4)|0;g=k+(e+1<<4)|0;h=i+(d<<4)|0;if((d|0)>=(a|0))break;m=k+(e+2<<4)|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];I6(g|0,h|0,16)|0;c[m>>2]=c[g>>2];c[m+4>>2]=c[g+4>>2];c[m+8>>2]=c[g+8>>2];c[m+12>>2]=c[g+12>>2];d=d+1|0;e=e+3|0}c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];I6(g|0,h|0,16)|0;c[b+4>>2]=l;c[b>>2]=j;return}function EY(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0;e=+h[b+8>>3];d=+h[b>>3];d=(+h[a+8>>3]-e)*(+h[c>>3]-d)-(+h[c+8>>3]-e)*(+h[a>>3]-d);return (d>.0001?1:(d<-.0001)<<31>>31)|0}function FY(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0;e=+h[a>>3];f=+h[b>>3];if(e!=f){d=+h[c>>3];if(!(e>3];e=+h[c+8>>3];d=+h[b+8>>3];if(!(f>2]=c[a>>2];c[g+4>>2]=c[a+4>>2];c[g+8>>2]=c[a+8>>2];c[g+12>>2]=c[a+12>>2];c[h>>2]=c[b>>2];c[h+4>>2]=c[b+4>>2];c[h+8>>2]=c[b+8>>2];c[h+12>>2]=c[b+12>>2];c[i>>2]=c[d>>2];c[i+4>>2]=c[d+4>>2];c[i+8>>2]=c[d+8>>2];c[i+12>>2]=c[d+12>>2];j=EY(g,h,i)|0;if((j|0)==0?(c[g>>2]=c[a>>2],c[g+4>>2]=c[a+4>>2],c[g+8>>2]=c[a+8>>2],c[g+12>>2]=c[a+12>>2],c[h>>2]=c[b>>2],c[h+4>>2]=c[b+4>>2],c[h+8>>2]=c[b+8>>2],c[h+12>>2]=c[b+12>>2],c[i>>2]=c[d>>2],c[i+4>>2]=c[d+4>>2],c[i+8>>2]=c[d+8>>2],c[i+12>>2]=c[d+12>>2],(FY(g,h,i)|0)!=0):0)f=1;else k=3;do if((k|0)==3){c[g>>2]=c[a>>2];c[g+4>>2]=c[a+4>>2];c[g+8>>2]=c[a+8>>2];c[g+12>>2]=c[a+12>>2];c[h>>2]=c[b>>2];c[h+4>>2]=c[b+4>>2];c[h+8>>2]=c[b+8>>2];c[h+12>>2]=c[b+12>>2];c[i>>2]=c[e>>2];c[i+4>>2]=c[e+4>>2];c[i+8>>2]=c[e+8>>2];c[i+12>>2]=c[e+12>>2];f=EY(g,h,i)|0;if((f|0)==0?(c[g>>2]=c[a>>2],c[g+4>>2]=c[a+4>>2],c[g+8>>2]=c[a+8>>2],c[g+12>>2]=c[a+12>>2],c[h>>2]=c[b>>2],c[h+4>>2]=c[b+4>>2],c[h+8>>2]=c[b+8>>2],c[h+12>>2]=c[b+12>>2],c[i>>2]=c[e>>2],c[i+4>>2]=c[e+4>>2],c[i+8>>2]=c[e+8>>2],c[i+12>>2]=c[e+12>>2],FY(g,h,i)|0):0){f=1;break};c[g>>2]=c[d>>2];c[g+4>>2]=c[d+4>>2];c[g+8>>2]=c[d+8>>2];c[g+12>>2]=c[d+12>>2];c[h>>2]=c[e>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];c[h+12>>2]=c[e+12>>2];c[i>>2]=c[a>>2];c[i+4>>2]=c[a+4>>2];c[i+8>>2]=c[a+8>>2];c[i+12>>2]=c[a+12>>2];k=EY(g,h,i)|0;c[g>>2]=c[d>>2];c[g+4>>2]=c[d+4>>2];c[g+8>>2]=c[d+8>>2];c[g+12>>2]=c[d+12>>2];c[h>>2]=c[e>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];c[h+12>>2]=c[e+12>>2];c[i>>2]=c[b>>2];c[i+4>>2]=c[b+4>>2];c[i+8>>2]=c[b+8>>2];c[i+12>>2]=c[b+12>>2];f=((S(EY(g,h,i)|0,k)|0)&(S(f,j)|0))>>>31}while(0);l=m;return f|0}function HY(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+h[a>>3]-+h[b>>3];c=+h[a+8>>3]-+h[b+8>>3];return +(d*d+c*c)}function IY(a){a=a|0;c[a+24>>2]=JY(c[a+4>>2]|0)|0;KY(a);return}function JY(a){a=a|0;var b=0,d=0,e=0,f=0;e=a+2|0;f=k6(e<<2)|0;b=m6(S(a,a)|0,8)|0;d=0;while(1){if((d|0)>=(a|0))break;c[f+(d<<2)>>2]=b;b=b+(a<<3)|0;d=d+1|0}while(1){if((a|0)>=(e|0))break;c[f+(a<<2)>>2]=0;a=a+1|0}return f|0}function KY(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0;p=l;l=l+32|0;i=p+16|0;g=p;j=c[a+4>>2]|0;m=c[a+8>>2]|0;n=c[a+16>>2]|0;o=c[a+20>>2]|0;d=c[a+24>>2]|0;b=0;while(1){if((b|0)>=(j|0))break;q=c[o+(b<<2)>>2]|0;e=m+(b<<4)|0;f=m+(q<<4)|0;c[g>>2]=c[e>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];c[g+12>>2]=c[e+12>>2];c[i>>2]=c[f>>2];c[i+4>>2]=c[f+4>>2];c[i+8>>2]=c[f+8>>2];c[i+12>>2]=c[f+12>>2];r=+LY(g,i);f=c[d+(b<<2)>>2]|0;h[f+(q<<3)>>3]=r;h[(c[d+(q<<2)>>2]|0)+(b<<3)>>3]=r;a=b+-1|0;a=(q|0)==(a|0)?b+-2|0:a;while(1){if((a|0)<=-1)break;if((MY(b,a,m,n,o)|0?MY(a,b,m,n,o)|0:0)?(k=m+(a<<4)|0,c[g>>2]=c[e>>2],c[g+4>>2]=c[e+4>>2],c[g+8>>2]=c[e+8>>2],c[g+12>>2]=c[e+12>>2],c[i>>2]=c[k>>2],c[i+4>>2]=c[k+4>>2],c[i+8>>2]=c[k+8>>2],c[i+12>>2]=c[k+12>>2],NY(g,i,j,j,j,m,n)|0):0){c[g>>2]=c[e>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];c[g+12>>2]=c[e+12>>2];c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];r=+LY(g,i);h[f+(a<<3)>>3]=r;h[(c[d+(a<<2)>>2]|0)+(b<<3)>>3]=r}a=a+-1|0}b=b+1|0}l=p;return}function LY(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0,g=0;e=l;l=l+32|0;f=e+16|0;g=e;c[g>>2]=c[a>>2];c[g+4>>2]=c[a+4>>2];c[g+8>>2]=c[a+8>>2];c[g+12>>2]=c[a+12>>2];c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];d=+G(+(+HY(g,f)));l=e;return +d}function MY(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;g=l;l=l+64|0;h=g+48|0;i=g+32|0;j=g+16|0;k=g;n=d+(c[f+(a<<2)>>2]<<4)|0;m=d+(a<<4)|0;e=d+(c[e+(a<<2)>>2]<<4)|0;f=d+(b<<4)|0;c[k>>2]=c[n>>2];c[k+4>>2]=c[n+4>>2];c[k+8>>2]=c[n+8>>2];c[k+12>>2]=c[n+12>>2];c[j>>2]=c[m>>2];c[j+4>>2]=c[m+4>>2];c[j+8>>2]=c[m+8>>2];c[j+12>>2]=c[m+12>>2];c[i>>2]=c[e>>2];c[i+4>>2]=c[e+4>>2];c[i+8>>2]=c[e+8>>2];c[i+12>>2]=c[e+12>>2];c[h>>2]=c[f>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[h+12>>2]=c[f+12>>2];f=OY(k,j,i,h)|0;l=g;return f|0}function NY(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;p=l;l=l+64|0;n=p+48|0;m=p+32|0;k=p+16|0;j=p;i=0;while(1){if((i|0)>=(d|0)){o=4;break}r=g+(i<<4)|0;q=g+(c[h+(i<<2)>>2]<<4)|0;c[j>>2]=c[a>>2];c[j+4>>2]=c[a+4>>2];c[j+8>>2]=c[a+8>>2];c[j+12>>2]=c[a+12>>2];c[k>>2]=c[b>>2];c[k+4>>2]=c[b+4>>2];c[k+8>>2]=c[b+8>>2];c[k+12>>2]=c[b+12>>2];c[m>>2]=c[r>>2];c[m+4>>2]=c[r+4>>2];c[m+8>>2]=c[r+8>>2];c[m+12>>2]=c[r+12>>2];c[n>>2]=c[q>>2];c[n+4>>2]=c[q+4>>2];c[n+8>>2]=c[q+8>>2];c[n+12>>2]=c[q+12>>2];if(!(GY(j,k,m,n)|0))i=i+1|0;else{e=0;break}}a:do if((o|0)==4)while(1){if((e|0)>=(f|0)){e=1;break a}q=g+(e<<4)|0;r=g+(c[h+(e<<2)>>2]<<4)|0;c[j>>2]=c[a>>2];c[j+4>>2]=c[a+4>>2];c[j+8>>2]=c[a+8>>2];c[j+12>>2]=c[a+12>>2];c[k>>2]=c[b>>2];c[k+4>>2]=c[b+4>>2];c[k+8>>2]=c[b+8>>2];c[k+12>>2]=c[b+12>>2];c[m>>2]=c[q>>2];c[m+4>>2]=c[q+4>>2];c[m+8>>2]=c[q+8>>2];c[m+12>>2]=c[q+12>>2];c[n>>2]=c[r>>2];c[n+4>>2]=c[r+4>>2];c[n+8>>2]=c[r+8>>2];c[n+12>>2]=c[r+12>>2];if(!(GY(j,k,m,n)|0)){e=e+1|0;o=4}else{e=0;break}}while(0);l=p;return e|0}function OY(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;g=l;l=l+48|0;h=g+32|0;i=g+16|0;j=g;c[j>>2]=c[e>>2];c[j+4>>2]=c[e+4>>2];c[j+8>>2]=c[e+8>>2];c[j+12>>2]=c[e+12>>2];c[i>>2]=c[a>>2];c[i+4>>2]=c[a+4>>2];c[i+8>>2]=c[a+8>>2];c[i+12>>2]=c[a+12>>2];c[h>>2]=c[b>>2];c[h+4>>2]=c[b+4>>2];c[h+8>>2]=c[b+8>>2];c[h+12>>2]=c[b+12>>2];f=EY(j,i,h)|0;c[j>>2]=c[e>>2];c[j+4>>2]=c[e+4>>2];c[j+8>>2]=c[e+8>>2];c[j+12>>2]=c[e+12>>2];c[i>>2]=c[b>>2];c[i+4>>2]=c[b+4>>2];c[i+8>>2]=c[b+8>>2];c[i+12>>2]=c[b+12>>2];c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];e=EY(j,i,h)|0;c[j>>2]=c[a>>2];c[j+4>>2]=c[a+4>>2];c[j+8>>2]=c[a+8>>2];c[j+12>>2]=c[a+12>>2];c[i>>2]=c[b>>2];c[i+4>>2]=c[b+4>>2];c[i+8>>2]=c[b+8>>2];c[i+12>>2]=c[b+12>>2];c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];d=(EY(j,i,h)|0)>0;l=g;return (d?e|f:e&f)>>>31^1|0}function PY(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;t=l;l=l+80|0;k=t+64|0;j=t+48|0;i=t+32|0;m=t+16|0;p=t;q=c[a+4>>2]|0;r=c[a+8>>2]|0;s=c[a+16>>2]|0;n=c[a+20>>2]|0;o=k6((q<<3)+16|0)|0;if((b|0)==-2222){c[k>>2]=c[d>>2];c[k+4>>2]=c[d+4>>2];c[k+8>>2]=c[d+8>>2];c[k+12>>2]=c[d+12>>2];b=QY(a,k)|0}if((b|0)>-1){f=c[a+12>>2]|0;g=c[f+(b+1<<2)>>2]|0;f=c[f+(b<<2)>>2]|0}else{g=q;f=q}b=0;while(1){if((b|0)>=(f|0)){b=f;break}u=r+(b<<4)|0;c[p>>2]=c[u>>2];c[p+4>>2]=c[u+4>>2];c[p+8>>2]=c[u+8>>2];c[p+12>>2]=c[u+12>>2];u=r+(c[n+(b<<2)>>2]<<4)|0;a=r+(c[s+(b<<2)>>2]<<4)|0;c[m>>2]=c[u>>2];c[m+4>>2]=c[u+4>>2];c[m+8>>2]=c[u+8>>2];c[m+12>>2]=c[u+12>>2];c[i>>2]=c[p>>2];c[i+4>>2]=c[p+4>>2];c[i+8>>2]=c[p+8>>2];c[i+12>>2]=c[p+12>>2];c[j>>2]=c[a>>2];c[j+4>>2]=c[a+4>>2];c[j+8>>2]=c[a+8>>2];c[j+12>>2]=c[a+12>>2];c[k>>2]=c[d>>2];c[k+4>>2]=c[d+4>>2];c[k+8>>2]=c[d+8>>2];c[k+12>>2]=c[d+12>>2];a=o+(b<<3)|0;if((OY(m,i,j,k)|0)!=0?(c[j>>2]=c[d>>2],c[j+4>>2]=c[d+4>>2],c[j+8>>2]=c[d+8>>2],c[j+12>>2]=c[d+12>>2],c[k>>2]=c[p>>2],c[k+4>>2]=c[p+4>>2],c[k+8>>2]=c[p+8>>2],c[k+12>>2]=c[p+12>>2],(NY(j,k,f,g,q,r,s)|0)!=0):0){c[j>>2]=c[d>>2];c[j+4>>2]=c[d+4>>2];c[j+8>>2]=c[d+8>>2];c[j+12>>2]=c[d+12>>2];c[k>>2]=c[p>>2];c[k+4>>2]=c[p+4>>2];c[k+8>>2]=c[p+8>>2];c[k+12>>2]=c[p+12>>2];e=+LY(j,k)}else e=0.0;h[a>>3]=e;b=b+1|0}while(1){if((b|0)>=(g|0)){b=g;break}h[o+(b<<3)>>3]=0.0;b=b+1|0}while(1){if((b|0)>=(q|0))break;u=r+(b<<4)|0;c[p>>2]=c[u>>2];c[p+4>>2]=c[u+4>>2];c[p+8>>2]=c[u+8>>2];c[p+12>>2]=c[u+12>>2];u=r+(c[n+(b<<2)>>2]<<4)|0;a=r+(c[s+(b<<2)>>2]<<4)|0;c[m>>2]=c[u>>2];c[m+4>>2]=c[u+4>>2];c[m+8>>2]=c[u+8>>2];c[m+12>>2]=c[u+12>>2];c[i>>2]=c[p>>2];c[i+4>>2]=c[p+4>>2];c[i+8>>2]=c[p+8>>2];c[i+12>>2]=c[p+12>>2];c[j>>2]=c[a>>2];c[j+4>>2]=c[a+4>>2];c[j+8>>2]=c[a+8>>2];c[j+12>>2]=c[a+12>>2];c[k>>2]=c[d>>2];c[k+4>>2]=c[d+4>>2];c[k+8>>2]=c[d+8>>2];c[k+12>>2]=c[d+12>>2];a=o+(b<<3)|0;if((OY(m,i,j,k)|0)!=0?(c[j>>2]=c[d>>2],c[j+4>>2]=c[d+4>>2],c[j+8>>2]=c[d+8>>2],c[j+12>>2]=c[d+12>>2],c[k>>2]=c[p>>2],c[k+4>>2]=c[p+4>>2],c[k+8>>2]=c[p+8>>2],c[k+12>>2]=c[p+12>>2],(NY(j,k,f,g,q,r,s)|0)!=0):0){c[j>>2]=c[d>>2];c[j+4>>2]=c[d+4>>2];c[j+8>>2]=c[d+8>>2];c[j+12>>2]=c[d+12>>2];c[k>>2]=c[p>>2];c[k+4>>2]=c[p+4>>2];c[k+8>>2]=c[p+8>>2];c[k+12>>2]=c[p+12>>2];e=+LY(j,k)}else e=0.0;h[a>>3]=e;b=b+1|0}h[o+(q<<3)>>3]=0.0;h[o+(q+1<<3)>>3]=0.0;l=t;return o|0}function QY(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;m=l;l=l+32|0;f=m;e=m+24|0;h=m+16|0;i=a+8|0;j=a+12|0;k=h+4|0;d=0;while(1){if((d|0)>=(c[a>>2]|0)){d=-1111;break}o=c[j>>2]|0;n=c[o+(d<<2)>>2]|0;c[h>>2]=(c[i>>2]|0)+(n<<4);g=d+1|0;c[k>>2]=(c[o+(g<<2)>>2]|0)-n;c[e>>2]=c[h>>2];c[e+4>>2]=c[h+4>>2];c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];if(!(LX(e,f)|0))d=g;else break}l=m;return d|0}function RY(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;t=l;l=l+64|0;m=t+48|0;k=t+32|0;o=t+16|0;n=t;q=c[f+4>>2]|0;r=c[f+8>>2]|0;p=c[f+16>>2]|0;h=e+1|0;f=f+12|0;g=(e|0)<0;if((b|0)<0)if(g){f=0;e=0;g=0;b=0}else{g=c[f>>2]|0;f=c[g+(h<<2)>>2]|0;e=c[g+(e<<2)>>2]|0;g=0;b=0}else{f=c[f>>2]|0;j=c[f+(b<<2)>>2]|0;i=c[f+(b+1<<2)>>2]|0;if(g){f=i;e=j;g=0;b=0}else{u=(b|0)>(e|0);b=c[f+(e<<2)>>2]|0;g=c[f+(h<<2)>>2]|0;f=u?i:g;e=u?j:b;g=u?g:i;b=u?b:j}}h=0;while(1){if((h|0)>=(b|0)){s=9;break}j=r+(h<<4)|0;u=r+(c[p+(h<<2)>>2]<<4)|0;c[n>>2]=c[a>>2];c[n+4>>2]=c[a+4>>2];c[n+8>>2]=c[a+8>>2];c[n+12>>2]=c[a+12>>2];c[o>>2]=c[d>>2];c[o+4>>2]=c[d+4>>2];c[o+8>>2]=c[d+8>>2];c[o+12>>2]=c[d+12>>2];c[k>>2]=c[j>>2];c[k+4>>2]=c[j+4>>2];c[k+8>>2]=c[j+8>>2];c[k+12>>2]=c[j+12>>2];c[m>>2]=c[u>>2];c[m+4>>2]=c[u+4>>2];c[m+8>>2]=c[u+8>>2];c[m+12>>2]=c[u+12>>2];if(!(GY(n,o,k,m)|0))h=h+1|0;else{f=0;break}}a:do if((s|0)==9){while(1){if((g|0)>=(e|0))break;s=r+(g<<4)|0;u=r+(c[p+(g<<2)>>2]<<4)|0;c[n>>2]=c[a>>2];c[n+4>>2]=c[a+4>>2];c[n+8>>2]=c[a+8>>2];c[n+12>>2]=c[a+12>>2];c[o>>2]=c[d>>2];c[o+4>>2]=c[d+4>>2];c[o+8>>2]=c[d+8>>2];c[o+12>>2]=c[d+12>>2];c[k>>2]=c[s>>2];c[k+4>>2]=c[s+4>>2];c[k+8>>2]=c[s+8>>2];c[k+12>>2]=c[s+12>>2];c[m>>2]=c[u>>2];c[m+4>>2]=c[u+4>>2];c[m+8>>2]=c[u+8>>2];c[m+12>>2]=c[u+12>>2];if(!(GY(n,o,k,m)|0)){g=g+1|0;s=9}else{f=0;break a}}while(1){if((f|0)>=(q|0)){f=1;break a}s=r+(f<<4)|0;u=r+(c[p+(f<<2)>>2]<<4)|0;c[n>>2]=c[a>>2];c[n+4>>2]=c[a+4>>2];c[n+8>>2]=c[a+8>>2];c[n+12>>2]=c[a+12>>2];c[o>>2]=c[d>>2];c[o+4>>2]=c[d+4>>2];c[o+8>>2]=c[d+8>>2];c[o+12>>2]=c[d+12>>2];c[k>>2]=c[s>>2];c[k+4>>2]=c[s+4>>2];c[k+8>>2]=c[s+8>>2];c[k+12>>2]=c[s+12>>2];c[m>>2]=c[u>>2];c[m+4>>2]=c[u+4>>2];c[m+8>>2]=c[u+8>>2];c[m+12>>2]=c[u+12>>2];if(!(GY(n,o,k,m)|0))f=f+1|0;else{f=0;break}}}while(0);l=t;return f|0}function SY(a){a=a|0;return TY(a,0,0)|0}function TY(a,b,c){a=a|0;b=b|0;c=c|0;return UY(a,b,c,0)|0}function UY(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;if(!d){g=k6(500)|0;if(!g)g=0;else{c[g+12>>2]=35;c[g+16>>2]=107;c[g+20>>2]=105;d=35;h=6}}else{g=pb[c[d>>2]&63](500)|0;if(!g)g=0;else{h=c[d>>2]|0;c[g+12>>2]=h;c[g+16>>2]=c[d+4>>2];c[g+20>>2]=c[d+8>>2];d=h;h=6}}do if((h|0)==6){c[g+8>>2]=0;c[g+32>>2]=0;c[g+380>>2]=16;k=g+12|0;j=pb[d&63](256)|0;d=g+392|0;c[d>>2]=j;h=g+20|0;if(!j){db[c[h>>2]&127](g);g=0;break}i=pb[c[k>>2]&63](1024)|0;j=g+44|0;c[j>>2]=i;if(!i){db[c[h>>2]&127](c[d>>2]|0);db[c[h>>2]&127](g);g=0;break}c[g+48>>2]=i+1024;if(!f){f=VY(k)|0;c[g+356>>2]=f;if(!f){db[c[h>>2]&127](c[j>>2]|0);db[c[h>>2]&127](c[d>>2]|0);db[c[h>>2]&127](g);g=0;break}}else c[g+356>>2]=f;c[g+376>>2]=0;c[g+368>>2]=0;c[g+304>>2]=0;c[g+468>>2]=0;c[g+464>>2]=0;c[g+124>>2]=0;c[g+248>>2]=0;d=g+472|0;a[d>>0]=33;h=g+236|0;a[h>>0]=0;a[g+237>>0]=0;c[g+396>>2]=0;c[g+400>>2]=0;a[g+404>>0]=0;WY(g+416|0,k);WY(g+440|0,k);XY(g,b);if(b|0?(c[g+232>>2]|0)==0:0){YY(g);g=0;break}if(!e){c[g+228>>2]=V_()|0;break}else{a[h>>0]=1;c[g+228>>2]=B0()|0;a[d>>0]=a[e>>0]|0;break}}while(0);return g|0}function VY(b){b=b|0;var d=0;d=pb[c[b>>2]&63](188)|0;if(d|0){WY(d+80|0,b);WY(d+104|0,b);VZ(d,b);VZ(d+20|0,b);VZ(d+40|0,b);VZ(d+60|0,b);a[d+131>>0]=0;VZ(d+132|0,b);c[d+152>>2]=0;c[d+156>>2]=0;a[d+160>>0]=0;b=d+164|0;c[b>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b+16>>2]=0;c[b+20>>2]=0;a[d+128>>0]=1;a[d+129>>0]=0;a[d+130>>0]=0}return d|0}function WY(a,b){a=a|0;b=b|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;c[a+16>>2]=0;c[a+20>>2]=b;return}function XY(d,e){d=d|0;e=e|0;var f=0,g=0,h=0;c[d+280>>2]=56;I0(d+256|0);if(!e)e=0;else e=eZ(d+416|0,e)|0;c[d+232>>2]=e;c[d+360>>2]=0;K$(d+148|0,d+144|0,0)|0;c[d>>2]=0;c[d+4>>2]=0;e=d+116|0;g=d+52|0;h=g+64|0;do{c[g>>2]=0;g=g+4|0}while((g|0)<(h|0));c[e>>2]=d;c[d+120>>2]=0;e=d+128|0;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;e=c[d+8>>2]|0;c[d+24>>2]=e;c[d+28>>2]=e;c[d+36>>2]=0;c[d+40>>2]=0;e=d+316|0;g=d+408|0;c[g>>2]=0;c[g+4>>2]=0;g=d+284|0;f=d+308|0;c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;g=e;h=g+36|0;do{c[g>>2]=0;g=g+4|0}while((g|0)<(h|0));b[e+36>>1]=0;a[f>>0]=1;c[d+312>>2]=0;c[d+364>>2]=0;c[d+372>>2]=0;c[d+384>>2]=0;c[d+240>>2]=0;c[d+252>>2]=0;c[d+244>>2]=0;c[d+476>>2]=0;c[d+480>>2]=0;a[d+488>>0]=0;a[d+489>>0]=0;c[d+492>>2]=0;c[d+496>>2]=0;return}function YY(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;if(b|0){e=b+368|0;g=b+20|0;d=c[b+364>>2]|0;while(1){if(!d){d=c[e>>2]|0;if(!d)break;c[e>>2]=0}h=c[d>>2]|0;db[c[g>>2]&127](c[d+36>>2]|0);ZY(c[d+44>>2]|0,b);db[c[g>>2]&127](d);d=h}e=b+304|0;d=c[b+300>>2]|0;while(1){if(!d){d=c[e>>2]|0;if(!d)break;c[e>>2]=0}h=c[d+8>>2]|0;db[c[g>>2]&127](d);d=h}d=b+12|0;ZY(c[b+376>>2]|0,b);ZY(c[b+372>>2]|0,b);_Y(b+416|0);_Y(b+440|0);if((a[b+488>>0]|0)==0?(f=c[b+356>>2]|0,f|0):0)$Y(f,(c[b+476>>2]|0)==0&1,d);db[c[g>>2]&127](c[b+392>>2]|0);db[c[g>>2]&127](c[b+464>>2]|0);db[c[g>>2]&127](c[b+8>>2]|0);db[c[g>>2]&127](c[b+44>>2]|0);db[c[g>>2]&127](c[b+396>>2]|0);db[c[g>>2]&127](c[b+240>>2]|0);d=c[b+252>>2]|0;if(d|0)db[d&127](c[b+244>>2]|0);db[c[g>>2]&127](b)}return}function ZY(a,b){a=a|0;b=b|0;var d=0;b=b+20|0;while(1){if(!a)break;d=c[a+4>>2]|0;db[c[b>>2]&127](c[a+16>>2]|0);db[c[b>>2]&127](a);a=d}return}function _Y(a){a=a|0;var b=0,d=0,e=0;d=a+20|0;b=c[a>>2]|0;while(1){if(!b)break;e=c[b>>2]|0;db[c[(c[d>>2]|0)+8>>2]&127](b);b=e}b=c[a+4>>2]|0;while(1){if(!b)break;e=c[b>>2]|0;db[c[(c[d>>2]|0)+8>>2]&127](b);b=e}return}function $Y(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+16|0;f=h;g=a+20|0;aZ(f,g);d=d+8|0;while(1){e=bZ(f)|0;if(!e)break;if(!(c[e+16>>2]|0))continue;db[c[d>>2]&127](c[e+20>>2]|0)}cZ(a);cZ(a+132|0);cZ(g);cZ(a+40|0);cZ(a+60|0);_Y(a+80|0);_Y(a+104|0);if(b<<24>>24){db[c[d>>2]&127](c[a+184>>2]|0);db[c[d>>2]&127](c[a+164>>2]|0)}db[c[d>>2]&127](a);l=h;return}function aZ(a,b){a=a|0;b=b|0;var d=0;d=c[b>>2]|0;c[a>>2]=d;c[a+4>>2]=d+(c[b+8>>2]<<2);return}function bZ(a){a=a|0;var b=0,d=0,e=0;d=c[a+4>>2]|0;e=c[a>>2]|0;do{if((e|0)==(d|0)){b=0;break}b=e;e=e+4|0;c[a>>2]=e;b=c[b>>2]|0}while(!(b|0));return b|0}function cZ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;d=a+8|0;e=a+16|0;b=0;while(1){f=c[(c[e>>2]|0)+8>>2]|0;g=c[a>>2]|0;if(b>>>0>=(c[d>>2]|0)>>>0)break;db[f&127](c[g+(b<<2)>>2]|0);b=b+1|0}db[f&127](g);return}function dZ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=gZ(a)|0;if(!f){c[a+280>>2]=57;f=hZ(a,b,d,e)|0}return f|0}function eZ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;f=b+12|0;g=b+8|0;while(1){e=c[f>>2]|0;if((e|0)==(c[g>>2]|0)){if(!((fZ(b)|0)<<24>>24)){d=0;break}e=c[f>>2]|0}i=a[d>>0]|0;c[f>>2]=e+1;a[e>>0]=i;if(!(a[d>>0]|0)){h=6;break}else d=d+1|0}if((h|0)==6){i=b+16|0;d=c[i>>2]|0;c[i>>2]=c[f>>2]}return d|0}function fZ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;b=a+4|0;f=c[b>>2]|0;i=a+16|0;j=a+12|0;k=a+8|0;do if(f){g=c[i>>2]|0;if(!g){c[a>>2]=f;c[b>>2]=c[f>>2];c[f>>2]=0;b=f+8|0;c[i>>2]=b;c[k>>2]=(c[f+4>>2]|0)+(f+8);c[j>>2]=b;b=1;break}d=c[k>>2]|0;e=d-g|0;if((e|0)<(c[f+4>>2]|0)){d=c[f>>2]|0;c[f>>2]=c[a>>2];c[a>>2]=f;c[b>>2]=d;B6(f+8|0,g|0,e|0)|0;b=c[a>>2]|0;c[j>>2]=(c[j>>2]|0)-(c[i>>2]|0)+(b+8);c[i>>2]=b+8;c[k>>2]=(c[b+4>>2]|0)+(b+8);b=1}else h=7}else{d=c[k>>2]|0;h=7}while(0);a:do if((h|0)==7){e=c[a>>2]|0;f=a+20|0;do if(!e){h=i;b=c[i>>2]|0}else{h=c[i>>2]|0;b=h;if((h|0)!=(e+8|0)){h=i;break}d=d-b<<1;b=vb[c[(c[f>>2]|0)+4>>2]&127](e,d+8|0)|0;if(!b){b=0;break a}c[a>>2]=b;c[b+4>>2]=d;c[j>>2]=(c[j>>2]|0)-(c[i>>2]|0)+(b+8);c[i>>2]=b+8;c[k>>2]=b+8+d;b=1;break a}while(0);g=d-b|0;g=(g|0)<1024?1024:g<<1;b=pb[c[c[f>>2]>>2]&63](g+8|0)|0;if(!b)b=0;else{c[b+4>>2]=g;c[b>>2]=c[a>>2];c[a>>2]=b;a=c[j>>2]|0;e=c[i>>2]|0;f=b+8|0;d=a;b=e;if((a|0)!=(e|0)){B6(f|0,e|0,d-b|0)|0;d=c[j>>2]|0;b=c[h>>2]|0}c[j>>2]=f+(d-b);c[i>>2]=f;c[k>>2]=f+g;b=1}}while(0);return b|0}function gZ(b){b=b|0;var d=0;d=b+232|0;if(!(eb[(a[b+236>>0]<<24>>24?40:41)&63](b+148|0,b+144|0,c[d>>2]|0)|0))b=UZ(b,c[d>>2]|0)|0;else b=0;return b|0}function hZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=l;l=l+16|0;h=g;c[h>>2]=d;j=b+144|0;i=c[j>>2]|0;i=tb[c[i>>2]&127](i,d,e,h)|0;f=iZ(b,c[j>>2]|0,d,e,i,c[h>>2]|0,f,(a[b+484>>0]|0)==0&1)|0;l=g;return f|0}function iZ(b,e,f,g,h,i,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0;Ha=l;l=l+16|0;wa=Ha;c[wa>>2]=i;s=c[b+356>>2]|0;t=b+144|0;u=b+300|0;if((c[t>>2]|0)==(e|0)){q=b+288|0;r=b+292|0}else{r=c[u>>2]|0;q=r;r=r+4|0}v=b+256|0;w=k<<24>>24!=0;x=b+328|0;y=b+344|0;z=b+136|0;A=b+353|0;xa=b+116|0;oa=b+489|0;ya=b+4|0;B=s+80|0;C=b+340|0;D=b+348|0;E=b+316|0;F=s+168|0;G=s+164|0;za=s+130|0;H=b+352|0;I=b+260|0;J=s+184|0;K=b+476|0;sa=b+492|0;L=s+96|0;M=b+332|0;N=s+160|0;O=b+324|0;P=b+128|0;Q=b+96|0;R=b+464|0;S=s+180|0;Aa=b+108|0;Ba=s+131|0;T=b+132|0;U=b+336|0;Ca=s+129|0;Da=b+360|0;V=b+416|0;W=b+80|0;ta=s+132|0;X=b+320|0;Ea=b+112|0;Y=s+128|0;Z=b+84|0;_=b+428|0;$=b+424|0;aa=s+92|0;ba=b+12|0;ca=b+432|0;da=b+480|0;ea=b+88|0;fa=s+120|0;ga=s+116|0;ha=b+92|0;ia=b+468|0;ja=b+16|0;ka=b+272|0;la=b+120|0;ma=s+176|0;p=e;o=f;e=h;a:while(1){c[q>>2]=o;f=c[wa>>2]|0;c[r>>2]=f;i=f;b:do if((e|0)<1){if(w&(e|0)!=0){n=7;break a}h=0-e|0;switch(e|0){case -1:{i=5;n=278;break a}case 0:{n=9;break a}case -2:{i=6;break a}case -4:{n=10;break a}case -15:{e=h;break b}default:{}}c[wa>>2]=g;e=h;i=g}while(0);m=wb[c[v>>2]&63](v,e,o,i,p)|0;i=p+56|0;f=p+68|0;c:do switch(m|0){case 2:{n=58;break a}case -1:{n=184;break a}case 1:{i=jZ(b,0,o,c[wa>>2]|0)|0;if(i|0){n=278;break a}i=c[t>>2]|0;break}case 4:{if(!(c[Z>>2]|0))i=1;else{n=kZ(V,p,o,c[wa>>2]|0)|0;c[X>>2]=n;if(!n){i=1;n=278;break a}c[ca>>2]=c[_>>2];c[x>>2]=0;i=0}c[O>>2]=0;n=272;break}case 7:{i=c[Z>>2]|0;if(!i)n=273;else{fb[i&31](c[ya>>2]|0,c[X>>2]|0,c[O>>2]|0,c[x>>2]|0,1);c[X>>2]=0;lZ(V);i=p}break}case 57:{i=jZ(b,1,o,c[wa>>2]|0)|0;if(i|0){n=278;break a}i=c[t>>2]|0;break}case 6:{a[oa>>0]=0;n=mZ(b,ta,75667,36)|0;c[E>>2]=n;if(!n){i=1;n=278;break a}a[Ca>>0]=1;if(!(c[Z>>2]|0))n=33;else{if(!(tb[c[i>>2]&127](p,o,c[wa>>2]|0,q)|0)){i=32;n=278;break a}i=c[f>>2]|0;i=kZ(V,p,o+i|0,(c[wa>>2]|0)+(0-i)|0)|0;if(!i){i=1;n=278;break a}nZ(i);c[ca>>2]=c[_>>2];c[x>>2]=i;i=0;n=34}break}case 14:{n=33;break}case 8:{i=c[X>>2]|0;if(!i)i=1;else{fb[c[Z>>2]&31](c[ya>>2]|0,i,c[O>>2]|0,c[x>>2]|0,0);lZ(V);i=0}if(!((c[O>>2]|0)==0?!(a[oa>>0]|0):0)){f=a[Ca>>0]|0;a[Ca>>0]=1;do if(c[sa>>2]|0?c[Ea>>2]|0:0){h=mZ(b,ta,75667,36)|0;if(!h){i=1;n=278;break a}e=h+20|0;if(!(a[oa>>0]|0))e=c[e>>2]|0;else{m=c[Da>>2]|0;c[e>>2]=m;e=m}a[Ba>>0]=0;if(!(wb[c[Ea>>2]&63](c[xa>>2]|0,0,e,c[h+16>>2]|0,c[h+24>>2]|0)|0)){i=21;n=278;break a}if(!(a[Ba>>0]|0)){if(c[O>>2]|0)break;a[Ca>>0]=f;break}if(((a[za>>0]|0)==0?(na=c[Aa>>2]|0,na|0):0)?(pb[na&63](c[ya>>2]|0)|0)==0:0){i=22;n=278;break a}}while(0);a[oa>>0]=0}e=c[ea>>2]|0;if(!e)n=272;else{db[e&127](c[ya>>2]|0);i=p}break}case 34:{n=pZ(b,p,o,c[wa>>2]|0)|0;c[y>>2]=n;if(!n){i=1;n=278;break a}else n=80;break}case 22:{n=qZ(b,p,o,c[wa>>2]|0)|0;c[D>>2]=n;if(!n){i=1;n=278;break a}a[H>>0]=0;c[M>>2]=0;a[A>>0]=0;n=80;break}case 23:{a[H>>0]=1;c[M>>2]=142491;n=80;break}case 24:{a[A>>0]=1;c[M>>2]=142497;n=80;break}case 25:{c[M>>2]=142500;n=80;break}case 26:{c[M>>2]=142506;n=80;break}case 27:{c[M>>2]=142513;n=80;break}case 28:{c[M>>2]=142520;n=80;break}case 29:{c[M>>2]=142529;n=80;break}case 30:{c[M>>2]=142537;n=80;break}case 32:case 31:{if((a[Y>>0]|0)!=0?(c[T>>2]|0)!=0:0){if(!(rZ(V,(c[M>>2]|0)==0?((m|0)==32?142546:142556):142558)|0)){i=1;n=278;break a}if(!(sZ(V,p,o,c[wa>>2]|0)|0)){i=1;n=278;break a}c[M>>2]=c[ca>>2];i=p}else n=273;break}case 36:case 35:{if(a[Y>>0]|0){if(!(tZ(c[y>>2]|0,c[D>>2]|0,a[H>>0]|0,a[A>>0]|0,0,b)|0)){i=1;n=278;break a}if((c[T>>2]|0)!=0?(pa=c[M>>2]|0,(pa|0)!=0):0){switch(a[pa>>0]|0){case 40:{n=93;break}case 78:{if((a[pa+1>>0]|0)==79)n=93;break}default:{}}if((n|0)==93){n=0;i=c[_>>2]|0;if((i|0)==(c[$>>2]|0)){if(!((fZ(V)|0)<<24>>24)){i=1;n=278;break a}i=c[_>>2]|0}c[_>>2]=i+1;a[i>>0]=41;i=c[_>>2]|0;if((i|0)==(c[$>>2]|0)){if(!((fZ(V)|0)<<24>>24)){i=1;n=278;break a}i=c[_>>2]|0}c[_>>2]=i+1;a[i>>0]=0;c[M>>2]=c[ca>>2];c[ca>>2]=c[_>>2]}c[r>>2]=o;ub[c[T>>2]&15](c[ya>>2]|0,c[c[y>>2]>>2]|0,c[c[D>>2]>>2]|0,c[M>>2]|0,0,(m|0)==36&1);lZ(V);i=p}else n=273}else n=273;break}case 38:case 37:{if(a[Y>>0]|0){i=c[f>>2]|0;i=uZ(b,p,a[H>>0]|0,o+i|0,(c[wa>>2]|0)+(0-i)|0,B)|0;if(i|0){n=278;break a}e=c[L>>2]|0;c[L>>2]=c[aa>>2];if(!(tZ(c[y>>2]|0,c[D>>2]|0,a[H>>0]|0,0,e,b)|0)){i=1;n=278;break a}if((c[T>>2]|0)!=0?(qa=c[M>>2]|0,(qa|0)!=0):0){switch(a[qa>>0]|0){case 40:{n=108;break}case 78:{if((a[qa+1>>0]|0)==79)n=108;break}default:{}}if((n|0)==108){n=0;i=c[_>>2]|0;if((i|0)==(c[$>>2]|0)){if(!((fZ(V)|0)<<24>>24)){i=1;n=278;break a}i=c[_>>2]|0}c[_>>2]=i+1;a[i>>0]=41;i=c[_>>2]|0;if((i|0)==(c[$>>2]|0)){if(!((fZ(V)|0)<<24>>24)){i=1;n=278;break a}i=c[_>>2]|0}c[_>>2]=i+1;a[i>>0]=0;c[M>>2]=c[ca>>2];c[ca>>2]=c[_>>2]}c[r>>2]=o;ub[c[T>>2]&15](c[ya>>2]|0,c[c[y>>2]>>2]|0,c[c[D>>2]>>2]|0,c[M>>2]|0,e,(m|0)==38&1);lZ(V);i=p}else n=273}else n=273;break}case 12:{if(a[Y>>0]|0){i=c[f>>2]|0;i=vZ(b,p,o+i|0,(c[wa>>2]|0)+(0-i)|0)|0;e=c[E>>2]|0;f=c[fa>>2]|0;if(e){c[e+4>>2]=f;n=c[ga>>2]|0;c[e+8>>2]=n-f;c[fa>>2]=n;if(!(c[z>>2]|0))e=1;else{c[r>>2]=o;e=c[E>>2]|0;ob[c[z>>2]&0](c[ya>>2]|0,c[e>>2]|0,d[e+33>>0]|0,c[e+4>>2]|0,c[e+8>>2]|0,c[Da>>2]|0,0,0,0);e=0}}else{c[ga>>2]=f;e=1}if(!i){i=e;n=272}else{n=278;break a}}else n=273;break}case 5:{a[oa>>0]=0;a[Ca>>0]=1;if(!(c[Z>>2]|0)){c[O>>2]=75667;i=1}else{n=c[f>>2]|0;n=kZ(V,p,o+n|0,(c[wa>>2]|0)+(0-n)|0)|0;c[O>>2]=n;if(!n){i=1;n=278;break a}c[ca>>2]=c[_>>2];i=0}if((((a[za>>0]|0)==0?(c[sa>>2]|0)==0:0)?(ra=c[Aa>>2]|0,ra|0):0)?(pb[ra&63](c[ya>>2]|0)|0)==0:0){i=22;n=278;break a}if(!(c[E>>2]|0)){e=mZ(b,ta,75667,36)|0;c[E>>2]=e;if(!e){i=1;n=278;break a}c[e+24>>2]=0;n=133}else n=133;break}case 13:{i=1;n=133;break}case 15:{if(((a[Y>>0]|0)!=0?(c[E>>2]|0)!=0:0)?(c[z>>2]|0)!=0:0){c[r>>2]=o;i=c[E>>2]|0;ob[c[z>>2]&0](c[ya>>2]|0,c[i>>2]|0,d[i+33>>0]|0,0,0,c[i+20>>2]|0,c[i+16>>2]|0,c[i+24>>2]|0,0);i=p}else n=273;break}case 16:{if((a[Y>>0]|0)!=0?(c[E>>2]|0)!=0:0){m=kZ(B,p,o,c[wa>>2]|0)|0;c[(c[E>>2]|0)+28>>2]=m;if(!m){i=1;n=278;break a}c[L>>2]=c[aa>>2];if(c[ha>>2]|0){c[r>>2]=o;i=c[E>>2]|0;ub[c[ha>>2]&15](c[ya>>2]|0,c[i>>2]|0,c[i+20>>2]|0,c[i+16>>2]|0,c[i+24>>2]|0,c[i+28>>2]|0);i=p;break c}if(c[z>>2]|0){c[r>>2]=o;i=c[E>>2]|0;ob[c[z>>2]&0](c[ya>>2]|0,c[i>>2]|0,0,0,0,c[i+20>>2]|0,c[i+16>>2]|0,c[i+24>>2]|0,c[i+28>>2]|0);i=p}else n=273}else n=273;break}case 9:{if(eb[c[p+48>>2]&63](p,o,c[wa>>2]|0)|0){c[E>>2]=0;n=273;break c}if(!(a[Y>>0]|0)){c[aa>>2]=c[L>>2];c[E>>2]=0;n=273;break c}i=kZ(B,p,o,c[wa>>2]|0)|0;if(!i){i=1;n=278;break a}e=mZ(b,s,i,36)|0;c[E>>2]=e;if(!e){i=1;n=278;break a}if((c[e>>2]|0)!=(i|0)){c[aa>>2]=c[L>>2];c[E>>2]=0;n=273;break c}c[L>>2]=c[aa>>2];c[e+24>>2]=0;a[e+33>>0]=0;if(!(c[K>>2]|0))i=(c[u>>2]|0)!=0;else i=1;a[e+34>>0]=(i^1)&1;if(!(c[z>>2]|0))n=273;else i=p;break}case 10:{if(!(a[Y>>0]|0)){c[aa>>2]=c[L>>2];c[E>>2]=0;n=273;break c}i=kZ(B,p,o,c[wa>>2]|0)|0;if(!i){i=1;n=278;break a}e=mZ(b,ta,i,36)|0;c[E>>2]=e;if(!e){i=1;n=278;break a}if((c[e>>2]|0)!=(i|0)){c[aa>>2]=c[L>>2];c[E>>2]=0;n=273;break c}c[L>>2]=c[aa>>2];c[e+24>>2]=0;a[e+33>>0]=1;if(!(c[K>>2]|0))i=(c[u>>2]|0)!=0;else i=1;a[e+34>>0]=(i^1)&1;if(!(c[z>>2]|0))n=273;else i=p;break}case 18:{c[C>>2]=0;c[U>>2]=0;if(!(c[Q>>2]|0))n=273;else{o=kZ(V,p,o,c[wa>>2]|0)|0;c[U>>2]=o;if(!o){i=1;n=278;break a}c[ca>>2]=c[_>>2];i=p}break}case 21:{if(!(tb[c[i>>2]&127](p,o,c[wa>>2]|0,q)|0)){i=32;n=278;break a}if(!(c[U>>2]|0))n=273;else{i=c[f>>2]|0;i=kZ(V,p,o+i|0,(c[wa>>2]|0)+(0-i)|0)|0;if(!i){i=1;n=278;break a}nZ(i);c[C>>2]=i;c[ca>>2]=c[_>>2];i=p}break}case 19:{if((c[U>>2]|0)!=0?(c[Q>>2]|0)!=0:0){i=c[f>>2]|0;i=kZ(V,p,o+i|0,(c[wa>>2]|0)+(0-i)|0)|0;if(!i){i=1;n=278;break a}c[r>>2]=o;fb[c[Q>>2]&31](c[ya>>2]|0,c[U>>2]|0,c[Da>>2]|0,i,c[C>>2]|0);i=0}else i=1;lZ(V);n=272;break}case 20:{if((c[C>>2]|0)!=0?(c[Q>>2]|0)!=0:0){c[r>>2]=o;fb[c[Q>>2]&31](c[ya>>2]|0,c[U>>2]|0,c[Da>>2]|0,0,c[C>>2]|0);i=0}else i=1;lZ(V);n=272;break}case 58:{if(c[W>>2]|0)wZ(b,p,o,c[wa>>2]|0);i=xZ(b,p,wa,g,j,k)|0;if(i|0){n=278;break a}if(!(c[wa>>2]|0)){n=189;break a}else i=p;break}case 44:{i=c[ia>>2]|0;do if((c[I>>2]|0)>>>0>=i>>>0){if(!i){m=c[ba>>2]|0;c[ia>>2]=32;m=pb[m&63](32)|0;c[R>>2]=m;if(!m){i=1;n=278;break a}else break}h=c[ja>>2]|0;m=c[R>>2]|0;i=i<<1;c[ia>>2]=i;i=vb[h&127](m,i)|0;if(!i){i=1;n=278;break a}c[R>>2]=i;i=c[J>>2]|0;if(i|0){i=vb[c[ja>>2]&127](i,c[ia>>2]<<2)|0;if(!i){i=1;n=278;break a}c[J>>2]=i}}while(0);a[(c[R>>2]|0)+(c[I>>2]|0)>>0]=0;if(a[N>>0]|0){i=zZ(b)|0;if((i|0)<0){i=1;n=278;break a}c[(c[J>>2]|0)+(c[S>>2]<<2)>>2]=i;c[S>>2]=(c[S>>2]|0)+1;c[(c[G>>2]|0)+(i*28|0)>>2]=6;if(c[P>>2]|0)i=p;else n=273}else n=273;break}case 50:{i=(c[R>>2]|0)+(c[I>>2]|0)|0;if((a[i>>0]|0)==124){i=2;n=278;break a}a[i>>0]=44;if((a[N>>0]|0)!=0?(c[P>>2]|0)!=0:0)i=p;else n=273;break}case 49:{e=(c[R>>2]|0)+(c[I>>2]|0)|0;i=a[e>>0]|0;if(i<<24>>24==44){i=2;n=278;break a}if(i<<24>>24==0&(a[N>>0]|0)!=0?(ua=(c[G>>2]|0)+((c[(c[J>>2]|0)+((c[S>>2]|0)+-1<<2)>>2]|0)*28|0)|0,(c[ua>>2]|0)!=3):0){c[ua>>2]=5;i=(c[P>>2]|0)==0&1}else i=1;a[e>>0]=124;n=272;break}case 59:case 60:{a[Ca>>0]=1;if(c[sa>>2]|0){e=c[f>>2]|0;e=kZ(B,p,o+e|0,(c[wa>>2]|0)+(0-e)|0)|0;if(!e){i=1;n=278;break a}h=mZ(b,ta,e,0)|0;c[aa>>2]=c[L>>2];i=(h|0)!=0;f=(m|0)==60;do if(c[ka>>2]|0){if(!(a[za>>0]|0)){if(a[Ca>>0]|0){n=217;break}}else if(c[u>>2]|0){n=217;break}if(!i){i=11;n=278;break a}if(!(a[h+34>>0]|0)){i=24;n=278;break a}}else n=217;while(0);if((n|0)==217?(n=0,!i):0){a[Y>>0]=a[za>>0]|0;if(!f){n=273;break c}i=c[la>>2]|0;if(!i){n=273;break c}rb[i&127](c[ya>>2]|0,e,1);i=p;break c}e=h+32|0;if(a[e>>0]|0){i=12;n=278;break a}if(c[h+4>>2]|0){i=AZ(b,h,f&1)|0;e=(i|0)==0;if(e){i=(e^1)&1;n=272;break c}else{n=278;break a}}i=c[Ea>>2]|0;if(!i){a[Y>>0]=a[za>>0]|0;n=273;break c}a[Ba>>0]=0;a[e>>0]=1;m=(wb[i&63](c[xa>>2]|0,0,c[h+20>>2]|0,c[h+16>>2]|0,c[h+24>>2]|0)|0)==0;a[e>>0]=0;if(m){i=21;n=278;break a}e=a[za>>0]|0;if(!(a[Ba>>0]|0)){a[Y>>0]=e;i=p;break c}else i=0}else{e=a[za>>0]|0;a[Y>>0]=e;i=1}if((e<<24>>24==0?(va=c[Aa>>2]|0,(va|0)!=0):0)?(pb[va&63](c[ya>>2]|0)|0)==0:0){i=22;n=278;break a}else n=272;break}case 40:{if(!(c[P>>2]|0))n=273;else{o=pZ(b,p,o,c[wa>>2]|0)|0;c[y>>2]=o;if(!o){i=1;n=278;break a}c[S>>2]=0;c[ma>>2]=0;a[N>>0]=1;i=p}break}case 42:case 41:{if(!(a[N>>0]|0))n=273;else{if(!(c[P>>2]|0))i=1;else{i=pb[c[ba>>2]&63](20)|0;if(!i){i=1;n=278;break a}n=i+4|0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;c[i>>2]=(m|0)==41?2:1;c[r>>2]=o;rb[c[P>>2]&127](c[ya>>2]|0,c[c[y>>2]>>2]|0,i);i=0}a[N>>0]=0;n=272}break}case 43:{if((a[N>>0]|0)!=0?(c[(c[G>>2]|0)+((c[(c[J>>2]|0)+((c[S>>2]|0)+-1<<2)>>2]|0)*28|0)>>2]=3,(c[P>>2]|0)!=0):0)i=p;else n=273;break}case 51:{e=0;n=245;break}case 53:{e=1;n=245;break}case 52:{e=2;n=245;break}case 54:{e=3;n=245;break}case 45:{f=0;n=256;break}case 47:{f=1;n=256;break}case 46:{f=2;n=256;break}case 48:{f=3;n=256;break}case 55:{if(!(CZ(b,p,o,c[wa>>2]|0)|0)){i=1;n=278;break a}else i=p;break}case 56:{if(!(DZ(b,p,o,c[wa>>2]|0)|0)){i=1;n=278;break a}else i=p;break}case 0:{if((e|0)==14)i=p;else n=273;break}case 3:{if(!(c[Z>>2]|0))n=273;else i=p;break}case 11:{if((a[Y>>0]|0)!=0?(c[z>>2]|0)!=0:0)i=p;else n=273;break}case 17:{if(!(c[Q>>2]|0))n=273;else i=p;break}case 33:{if((a[Y>>0]|0)!=0?(c[T>>2]|0)!=0:0)i=p;else n=273;break}case 39:{if(!(c[P>>2]|0))n=273;else i=p;break}default:n=273}while(0);if((n|0)==33)if(!(tb[c[i>>2]&127](p,o,c[wa>>2]|0,q)|0)){i=32;n=278;break}else{i=1;n=34}else if((n|0)==80){n=0;if((a[Y>>0]|0)!=0?(c[T>>2]|0)!=0:0)i=p;else n=273}else if((n|0)==133){n=0;if((a[Y>>0]|0)!=0?(c[E>>2]|0)!=0:0){m=c[f>>2]|0;m=kZ(B,p,o+m|0,(c[wa>>2]|0)+(0-m)|0)|0;e=c[E>>2]|0;c[e+16>>2]=m;if(!m){i=1;n=278;break}c[e+20>>2]=c[Da>>2];c[L>>2]=c[aa>>2];if(c[z>>2]|0)i=p;else n=272}else n=272}else if((n|0)==245){n=0;if(a[N>>0]|0){i=c[wa>>2]|0;if(e)i=i+(0-(c[f>>2]|0))|0;f=zZ(b)|0;if((f|0)<0){i=1;n=278;break}m=c[G>>2]|0;c[m+(f*28|0)>>2]=4;c[m+(f*28|0)+4>>2]=e;i=pZ(b,p,o,i)|0;if(!i){i=1;n=278;break}e=c[i>>2]|0;c[(c[G>>2]|0)+(f*28|0)+8>>2]=e;i=0;do{m=i;i=i+1|0}while((a[e+m>>0]|0)!=0);c[F>>2]=(c[F>>2]|0)+i;if(c[P>>2]|0)i=p;else n=273}else n=273}else if((n|0)==256)if(a[N>>0]|0){e=(c[P>>2]|0)==0;i=e&1;n=(c[S>>2]|0)+-1|0;c[S>>2]=n;c[(c[G>>2]|0)+((c[(c[J>>2]|0)+(n<<2)>>2]|0)*28|0)+4>>2]=f;if(!n){if(!e){e=BZ(b)|0;if(!e){i=1;n=278;break}c[r>>2]=o;rb[c[P>>2]&127](c[ya>>2]|0,c[c[y>>2]>>2]|0,e)}a[N>>0]=0;c[F>>2]=0;n=272}else n=272}else n=273;if((n|0)==34){n=0;if((a[Y>>0]|0)!=0?(c[E>>2]|0)!=0:0){e=c[f>>2]|0;e=kZ(B,p,o+e|0,(c[wa>>2]|0)+(0-e)|0)|0;if(!e){i=1;n=278;break}nZ(e);c[(c[E>>2]|0)+24>>2]=e;c[L>>2]=c[aa>>2];if(c[z>>2]|0)i=p;else n=272}else n=272}if((n|0)==272){n=0;if(!(i<<24>>24))i=p;else n=273}if((n|0)==273){n=0;if(!(c[W>>2]|0))i=p;else{wZ(b,p,o,c[wa>>2]|0);i=p}}switch(c[da>>2]|0){case 3:{n=276;break a}case 2:{i=35;n=278;break a}default:{}}e=c[wa>>2]|0;p=i;o=e;e=tb[c[i>>2]&127](i,e,g,wa)|0}d:do if((n|0)==7){c[j>>2]=o;i=0}else if((n|0)==9){c[q>>2]=f;i=4}else if((n|0)==10){if((p|0)==(c[t>>2]|0)){if(!(a[b+488>>0]|0)){i=3;break}}else if(!(a[(c[u>>2]|0)+20>>0]|0)){c[j>>2]=o;i=0;break}if((wb[c[v>>2]&63](v,-4,g,g,p)|0)==-1)i=29;else{c[j>>2]=o;i=0}}else if((n|0)==58){e=b+280|0;do if((a[oa>>0]|0?(Fa=a[Ca>>0]|0,a[Ca>>0]=1,c[sa>>2]|0):0)?c[Ea>>2]|0:0){i=mZ(b,ta,75667,36)|0;if(!i){i=1;break d}Da=c[Da>>2]|0;c[i+20>>2]=Da;a[Ba>>0]=0;if(!(wb[c[Ea>>2]&63](c[xa>>2]|0,0,Da,c[i+16>>2]|0,c[i+24>>2]|0)|0)){i=21;break d}if(!(a[Ba>>0]|0)){a[Ca>>0]=Fa;break}if(((a[za>>0]|0)==0?(Ga=c[Aa>>2]|0,Ga|0):0)?(pb[Ga&63](c[ya>>2]|0)|0)==0:0){i=22;break d}}while(0);c[e>>2]=58;i=oZ(b,o,g,j)|0}else if((n|0)==184)i=(e|0)==28?10:(e|0)==12?17:2;else if((n|0)==189){c[b+280>>2]=59;i=0}else if((n|0)==276){c[j>>2]=c[wa>>2];i=0}while(0);l=Ha;return i|0}function jZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+32|0;q=r+16|0;m=r+12|0;i=r+8|0;j=r+4|0;k=r;c[q>>2]=0;c[m>>2]=0;c[i>>2]=0;c[k>>2]=-1;n=b+144|0;p=b+288|0;g=(d|0)!=0;a:do if(jb[(a[b+236>>0]<<24>>24?1:2)&3](d,c[n>>2]|0,e,f,p,i,j,q,m,k)|0){if((c[k>>2]|0)==1&(g^1)?(a[(c[b+356>>2]|0)+130>>0]=1,h=b+492|0,(c[h>>2]|0)==1):0)c[h>>2]=0;h=b+140|0;o=b+440|0;if(!(c[h>>2]|0))if(!(c[b+80>>2]|0)){e=0;d=0}else{wZ(b,c[n>>2]|0,e,f);e=0;d=0}else{d=c[q>>2]|0;if(!d)d=0;else{f=c[n>>2]|0;d=kZ(o,f,d,d+(vb[c[f+32>>2]&127](f,d)|0)|0)|0;if(!d){d=1;break}c[b+456>>2]=c[b+452>>2]}g=c[i>>2]|0;if(g){i=c[n>>2]|0;g=kZ(o,i,g,(c[j>>2]|0)+(0-(c[i+68>>2]|0))|0)|0;if(!g){d=1;break}}else g=0;xb[c[h>>2]&31](c[b+4>>2]|0,g,d,c[k>>2]|0);e=g}h=(d|0)!=0;do if(!(c[b+232>>2]|0)){g=c[m>>2]|0;if(g|0)if((c[g+68>>2]|0)==(c[(c[n>>2]|0)+68>>2]|0)){c[n>>2]=g;break}else{c[p>>2]=c[q>>2];d=19;break a}g=c[q>>2]|0;if(g|0){if(!h){d=c[n>>2]|0;d=kZ(o,d,g,g+(vb[c[d+32>>2]&127](d,g)|0)|0)|0;if(!d){d=1;break a}}d=UZ(b,d)|0;lZ(o);if((d|0)!=18)break a;c[p>>2]=c[q>>2];d=18;break a}}while(0);if(h|(e|0)!=0){lZ(o);d=0}else d=0}else d=g?31:30;while(0);l=r;return d|0}function kZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;do if(!(sZ(b,d,e,f)|0))d=0;else{e=b+12|0;d=c[e>>2]|0;if((d|0)==(c[b+8>>2]|0)){if(!((fZ(b)|0)<<24>>24)){d=0;break}d=c[e>>2]|0}c[e>>2]=d+1;a[d>>0]=0;d=c[b+16>>2]|0}while(0);return d|0}function lZ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;e=a+4|0;b=c[e>>2]|0;d=c[a>>2]|0;a:do if(!b)c[e>>2]=d;else while(1){if(!d)break a;g=c[d>>2]|0;c[d>>2]=b;c[e>>2]=d;f=d;d=g;b=f}while(0);c[a>>2]=0;c[a+16>>2]=0;c[a+12>>2]=0;c[a+8>>2]=0;return}function mZ(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;x=e+8|0;n=c[x>>2]|0;z=e+12|0;v=e+4|0;o=(g|0)!=0;y=e+16|0;a:do if(!n)if(o){a[v>>0]=6;c[x>>2]=64;h=pb[c[c[y>>2]>>2]&63](256)|0;c[e>>2]=h;if(!h){c[x>>2]=0;h=0;break}else{u6(h|0,0,256)|0;i=SZ(b,f)|0;i=(c[x>>2]|0)+-1&i;p=26;break}}else h=0;else{w=SZ(b,f)|0;i=n+-1|0;k=c[e>>2]|0;l=w&0-n;m=i>>>2;j=0;i=w&i;while(1){h=c[k+(i<<2)>>2]|0;if(!h)break;if((TZ(f,c[h>>2]|0)|0)<<24>>24)break a;if(!(j<<24>>24))h=(l>>>((d[v>>0]|0)+-1|0)&m|1)&255;else h=j;u=h&255;j=h;i=i-u+(i>>>0>>0?n:0)|0}if(o){h=d[v>>0]|0;if((c[z>>2]|0)>>>(h+-1|0)){i=h+1|0;r=i&255;i=i&255;t=1<>2]>>2]&63](h)|0;if(!u)h=0;else{u6(u|0,0,h|0)|0;p=0-t|0;q=s>>>2;n=i+-1|0;m=c[x>>2]|0;l=0;while(1){if(l>>>0>=m>>>0)break;h=c[(c[e>>2]|0)+(l<<2)>>2]|0;o=h;if(h|0){h=SZ(b,c[h>>2]|0)|0;j=((h&p)>>>n&q|1)&255;h=h&s;i=0;while(1){k=u+(h<<2)|0;if(!(c[k>>2]|0))break;k=i<<24>>24==0?j:i;A=k&255;h=h+(h>>>0>>0?t:0)-A|0;i=k}c[k>>2]=o}l=l+1|0}db[c[(c[y>>2]|0)+8>>2]&127](c[e>>2]|0);c[e>>2]=u;a[v>>0]=r;c[x>>2]=t;j=((w&p)>>>n&q|1)&255;i=s&w;h=0;while(1){if(!(c[u+(i<<2)>>2]|0)){p=26;break a}A=h<<24>>24==0?j:h;x=A&255;i=i+(i>>>0>>0?t:0)-x|0;h=A}}}else p=26}else h=0}while(0);if((p|0)==26){h=pb[c[c[y>>2]>>2]&63](g)|0;c[(c[e>>2]|0)+(i<<2)>>2]=h;h=c[(c[e>>2]|0)+(i<<2)>>2]|0;if(!h)h=0;else{u6(h|0,0,g|0)|0;h=(c[e>>2]|0)+(i<<2)|0;c[c[h>>2]>>2]=f;c[z>>2]=(c[z>>2]|0)+1;h=c[h>>2]|0}}return h|0}function nZ(b){b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;h=b;c=b;while(1){d=a[h>>0]|0;e=c+-1|0;f=(c|0)!=(b|0);if(!(d<<24>>24))break;g=c+1|0;switch(d<<24>>24|0){case 10:case 13:case 32:{if(f){if((a[e>>0]|0)!=32){a[c>>0]=32;c=g}}else c=b;break}default:{a[c>>0]=d;c=g}}h=h+1|0}if(f)b=(a[e>>0]|0)==32?e:c;a[b>>0]=0;return}function oZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;d=GZ(b,0,c[b+144>>2]|0,d,e,f,(a[b+484>>0]|0)==0&1)|0;if((d|0)==0?(OZ(b)|0)<<24>>24==0:0)d=1;return d|0}function pZ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=c[a+356>>2]|0;e=kZ(g+80|0,b,d,e)|0;do if((e|0)!=0?(f=mZ(a,g+20|0,e,24)|0,(f|0)!=0):0){d=g+92|0;b=g+96|0;if((c[f>>2]|0)==(e|0)){c[b>>2]=c[d>>2];if(!(PZ(a,f)|0)){f=0;break}}else c[d>>2]=c[b>>2]}else f=0;while(0);return f|0}function qZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;j=c[b+356>>2]|0;m=j+80|0;o=j+92|0;h=c[o>>2]|0;n=j+88|0;if((h|0)==(c[n>>2]|0))if(!((fZ(m)|0)<<24>>24))g=0;else{h=c[o>>2]|0;i=4}else i=4;a:do if((i|0)==4){c[o>>2]=h+1;a[h>>0]=0;e=kZ(m,d,e,f)|0;if((e|0)!=0?(l=e+1|0,g=mZ(b,j+40|0,l,12)|0,(g|0)!=0):0){k=j+96|0;if((c[g>>2]|0)!=(l|0)){c[o>>2]=c[k>>2];break}h=c[o>>2]|0;c[k>>2]=h;if(a[b+236>>0]|0){d=a[l>>0]|0;i=j+60|0;b:do if(d<<24>>24==120)if((((a[e+2>>0]|0)==109?(a[e+3>>0]|0)==108:0)?(a[e+4>>0]|0)==110:0)?(a[e+5>>0]|0)==115:0){switch(a[e+6>>0]|0){case 0:{h=j+152|0;break}case 58:{h=mZ(b,i,e+7|0,8)|0;break}default:{f=0;d=120;break b}}c[g+4>>2]=h;a[g+9>>0]=1;break a}else{f=0;d=120}else f=0;while(0);c:while(1){switch(d<<24>>24){case 0:break a;case 58:{e=0;break c}default:{}}d=f+1|0;f=d;d=a[l+d>>0]|0}while(1){d=(h|0)==(c[n>>2]|0);if((e|0)>=(f|0))break;if(d){if(!((fZ(m)|0)<<24>>24)){g=0;break a}h=c[o>>2]|0}j=a[l+e>>0]|0;c[o>>2]=h+1;a[h>>0]=j;e=e+1|0;h=c[o>>2]|0}if(d){if(!((fZ(m)|0)<<24>>24)){g=0;break}h=c[o>>2]|0}c[o>>2]=h+1;a[h>>0]=0;b=mZ(b,i,c[k>>2]|0,8)|0;c[g+4>>2]=b;h=c[k>>2]|0;if((c[b>>2]|0)==(h|0)){c[k>>2]=c[o>>2];break}else{c[o>>2]=h;break}}}else g=0}while(0);return g|0}function rZ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=b+12|0;h=b+8|0;while(1){e=a[d>>0]|0;if(!(e<<24>>24)){i=7;break}f=c[g>>2]|0;if((f|0)==(c[h>>2]|0)){if(!((fZ(b)|0)<<24>>24)){d=0;break}f=c[g>>2]|0;e=a[d>>0]|0}c[g>>2]=f+1;a[f>>0]=e;d=d+1|0}if((i|0)==7)d=c[b+16>>2]|0;return d|0}function sZ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;h=i;c[h>>2]=d;g=a+12|0;if((c[g>>2]|0)==0?(fZ(a)|0)<<24>>24==0:0)d=0;else f=3;a:do if((f|0)==3){d=b+60|0;f=a+8|0;while(1){fb[c[d>>2]&31](b,h,e,g,c[f>>2]|0);if((c[h>>2]|0)==(e|0))break;if(!((fZ(a)|0)<<24>>24)){d=0;break a}}d=c[a+16>>2]|0}while(0);l=i;return d|0}function tZ(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0;n=b+12|0;m=b+20|0;l=c[n>>2]|0;i=f<<24>>24!=0;a:do if(i|(g|0)!=0){f=0;while(1){if((f|0)>=(l|0))break;if((c[(c[m>>2]|0)+(f*12|0)>>2]|0)==(d|0)){f=1;break a}else f=f+1|0}if((i?(j=b+8|0,(c[j>>2]|0)==0):0)?(a[d+9>>0]|0)==0:0){c[j>>2]=d;k=8}else k=8}else k=8;while(0);b:do if((k|0)==8){i=b+16|0;do if((l|0)==(c[i>>2]|0)){if(!l){c[i>>2]=8;f=pb[c[h+12>>2]&63](96)|0;c[m>>2]=f;if(!f){f=0;break b}else break}f=vb[c[h+16>>2]&127](c[m>>2]|0,l*24|0)|0;if(!f){f=0;break b}c[i>>2]=l<<1;c[m>>2]=f}else f=c[m>>2]|0;while(0);i=c[n>>2]|0;c[f+(i*12|0)>>2]=d;c[f+(i*12|0)+8>>2]=g;a[f+(i*12|0)+4>>0]=e;if(!(e<<24>>24))a[d+8>>0]=1;c[n>>2]=i+1;f=1}while(0);return f|0}function uZ(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;b=RZ(b,d,e,f,g,h)|0;do if(!b){d=h+12|0;b=c[d>>2]|0;if((e<<24>>24==0?(b|0)!=(c[h+16>>2]|0):0)?(i=b+-1|0,(a[i>>0]|0)==32):0){c[d>>2]=i;b=i}if((b|0)==(c[h+8>>2]|0)){if(!((fZ(h)|0)<<24>>24)){b=1;break}b=c[d>>2]|0}c[d>>2]=b+1;a[b>>0]=0;b=0}while(0);return b|0}function vZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;H=l;l=l+16|0;B=H;C=H+4|0;g=c[b+356>>2]|0;D=g+104|0;F=b+276|0;E=c[F>>2]|0;c[F>>2]=1;if((c[D>>2]|0)==0?(fZ(D)|0)<<24>>24==0:0)g=1;else{n=d+20|0;o=b+144|0;p=g+116|0;q=g+112|0;r=d+68|0;s=b+488|0;t=b+416|0;u=g+132|0;v=b+432|0;w=b+428|0;x=g+130|0;y=g+128|0;z=b+228|0;A=b+112|0;j=g+131|0;k=b+116|0;m=d+44|0;a:while(1){b:do switch(tb[c[n>>2]&127](d,e,f,B)|0){case -4:{g=0;break a}case -1:{G=39;break a}case 0:{G=41;break a}case 28:{if((a[s>>0]|0)==0?(c[o>>2]|0)==(d|0):0){G=19;break a}g=c[r>>2]|0;g=kZ(t,d,e+g|0,(c[B>>2]|0)+(0-g)|0)|0;if(!g){g=1;break a}h=mZ(b,u,g,0)|0;c[w>>2]=c[v>>2];if(!h){G=9;break a}i=h+32|0;if(a[i>>0]|0){G=11;break a}g=c[h+16>>2]|0;if(!g){a[i>>0]=1;g=c[h+4>>2]|0;g=vZ(b,c[z>>2]|0,g,g+(c[h+8>>2]|0)|0)|0;a[i>>0]=0;if(!g)break b;else break a}e=c[A>>2]|0;if(e|0){a[j>>0]=0;a[i>>0]=1;h=(wb[e&63](c[k>>2]|0,0,c[h+20>>2]|0,g,c[h+24>>2]|0)|0)==0;a[i>>0]=0;if(h){g=21;break a}if(a[j>>0]|0)break b}a[y>>0]=a[x>>0]|0;break}case 6:case 9:{if(!(sZ(D,d,e,c[B>>2]|0)|0)){g=1;break a}break}case -3:{c[B>>2]=e+(c[r>>2]|0);G=22;break}case 7:{G=22;break}case 10:{g=vb[c[m>>2]&127](d,e)|0;if((g|0)<0){G=27;break a}h=h_(g,C)|0;if(!h){G=30;break a}else e=0;while(1){if((e|0)>=(h|0))break;g=c[p>>2]|0;if((c[q>>2]|0)==(g|0)){if(!((fZ(D)|0)<<24>>24)){g=1;G=37;break a}g=c[p>>2]|0}i=a[C+e>>0]|0;c[p>>2]=g+1;a[g>>0]=i;e=e+1|0}break}default:{G=43;break a}}while(0);if((G|0)==22){G=0;g=c[p>>2]|0;if((c[q>>2]|0)==(g|0)){if(!((fZ(D)|0)<<24>>24)){g=1;break}g=c[p>>2]|0}c[p>>2]=g+1;a[g>>0]=10}e=c[B>>2]|0}if((G|0)==9){a[y>>0]=a[x>>0]|0;g=0}else if((G|0)==11)if((c[o>>2]|0)==(d|0)){c[b+288>>2]=e;g=12}else g=12;else if((G|0)==19){c[b+288>>2]=e;g=10}else if((G|0)==27)if((c[o>>2]|0)==(d|0)){c[b+288>>2]=e;g=14;G=37}else{g=14;G=37}else if((G|0)==30)if((c[o>>2]|0)==(d|0)){c[b+288>>2]=e;g=14;G=37}else{g=14;G=37}else if((G|0)==39)if((c[o>>2]|0)==(d|0)){c[b+288>>2]=e;g=4}else g=4;else if((G|0)==41)if((c[o>>2]|0)==(d|0)){c[b+288>>2]=c[B>>2];g=4}else g=4;else if((G|0)==43)if((c[o>>2]|0)==(d|0)){c[b+288>>2]=e;g=23}else g=23;c[F>>2]=E}l=H;return g|0}function wZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+16|0;n=p;o=p+4|0;c[n>>2]=e;if(!(a[d+72>>0]|0)){if((c[b+144>>2]|0)==(d|0)){g=b+292|0;h=b+288|0}else{h=c[b+300>>2]|0;g=h+4|0}i=b+44|0;j=d+60|0;k=b+48|0;m=b+80|0;e=b+4|0;do{c[o>>2]=c[i>>2];fb[c[j>>2]&31](d,n,f,o,c[k>>2]|0);c[g>>2]=c[n>>2];b=c[i>>2]|0;rb[c[m>>2]&127](c[e>>2]|0,b,(c[o>>2]|0)-b|0);c[h>>2]=c[n>>2]}while((c[n>>2]|0)!=(f|0))}else rb[c[b+80>>2]&127](c[b+4>>2]|0,e,f-e|0);l=p;return}function xZ(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+16|0;j=m;k=c[d>>2]|0;if((c[a+144>>2]|0)==(b|0)){i=a+288|0;c[i>>2]=k;h=a+292|0}else{i=c[a+300>>2]|0;h=i+4|0}c[i>>2]=k;c[d>>2]=0;n=tb[c[b+12>>2]&127](b,k,e,j)|0;e=c[j>>2]|0;c[h>>2]=e;h=g<<24>>24!=0;switch(n|0){case 42:{if(c[a+80>>2]|0){wZ(a,b,k,e);e=c[j>>2]|0}c[d>>2]=e;c[f>>2]=e;e=(c[a+480>>2]|0)==2?35:0;break}case 0:{c[i>>2]=e;e=4;break}case -2:{if(h){c[f>>2]=k;e=0}else e=6;break}case -4:case -1:{if(h){c[f>>2]=k;e=0}else e=2;break}default:{c[i>>2]=e;e=23}}l=m;return e|0}function yZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=l;l=l+16|0;g=h;c[g>>2]=d;d=xZ(b,c[b+144>>2]|0,g,e,f,(a[b+484>>0]|0)==0&1)|0;if(!d){d=c[g>>2]|0;if(!d)d=0;else{c[b+280>>2]=57;d=hZ(b,d,e,f)|0}}l=h;return d|0}function zZ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;j=c[a+356>>2]|0;k=j+184|0;f=a+12|0;if(!(c[k>>2]|0)){b=pb[c[f>>2]&63](c[a+468>>2]<<2)|0;c[k>>2]=b;if(!b)b=-1;else{c[b>>2]=0;d=4}}else d=4;do if((d|0)==4){i=j+176|0;b=c[i>>2]|0;g=j+172|0;d=c[g>>2]|0;h=j+164|0;e=c[h>>2]|0;if(b>>>0>>0)g=e;else{if(!e){b=pb[c[f>>2]&63](896)|0;if(!b){b=-1;break}else{d=b;b=32}}else{b=vb[c[a+16>>2]&127](e,d*56|0)|0;if(!b){b=-1;break}d=b;b=c[g>>2]<<1}c[g>>2]=b;c[h>>2]=d;b=c[i>>2]|0;g=d}c[i>>2]=b+1;d=c[j+180>>2]|0;if(d|0){a=c[(c[k>>2]|0)+(d+-1<<2)>>2]|0;f=g+(a*28|0)+16|0;d=c[f>>2]|0;if(d|0)c[g+(d*28|0)+24>>2]=b;d=g+(a*28|0)+20|0;e=c[d>>2]|0;if(!e)c[g+(a*28|0)+12>>2]=b;c[f>>2]=b;c[d>>2]=e+1}k=g+(b*28|0)+12|0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0}while(0);return b|0}function AZ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+16|0;p=r;q=b+304|0;f=c[q>>2]|0;if(!f){f=pb[c[b+12>>2]&63](24)|0;if(!f)f=1;else{o=f;g=4}}else{c[q>>2]=c[f+8>>2];o=f;g=4}do if((g|0)==4){j=d+32|0;a[j>>0]=1;k=d+12|0;c[k>>2]=0;m=b+300|0;n=o+8|0;c[n>>2]=c[m>>2];c[m>>2]=o;c[o+12>>2]=d;h=c[b+312>>2]|0;c[o+16>>2]=h;a[o+20>>0]=e;c[o>>2]=0;c[o+4>>2]=0;e=c[d+4>>2]|0;i=e+(c[d+8>>2]|0)|0;f=b+228|0;g=c[f>>2]|0;if(!(a[d+33>>0]|0))f=GZ(b,h,g,e,i,p,0)|0;else{d=tb[c[g>>2]&127](g,e,i,p)|0;f=iZ(b,c[f>>2]|0,e,i,d,c[p>>2]|0,p,0)|0}if(!f){f=c[p>>2]|0;if((i|0)!=(f|0)?(c[b+480>>2]|0)==3:0){c[k>>2]=f-e;c[b+280>>2]=60;f=0;break}a[j>>0]=0;c[m>>2]=c[n>>2];c[n>>2]=c[q>>2];c[q>>2]=o;f=0}}while(0);l=r;return f|0}function BZ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=l;l=l+16|0;d=g+4|0;e=g;b=c[a+356>>2]|0;f=b+176|0;b=pb[c[a+12>>2]&63](((c[f>>2]|0)*20|0)+(c[b+168>>2]|0)|0)|0;if(!b)b=0;else{c[e>>2]=b+((c[f>>2]|0)*20|0);c[d>>2]=b+20;FZ(a,0,b,d,e)}l=g;return b|0}function CZ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;j=a+64|0;if(!(c[j>>2]|0))if(!(c[a+80>>2]|0))d=1;else{wZ(a,b,d,e);d=1}else{h=b+68|0;g=d+(c[h>>2]<<1)|0;d=g+(vb[c[b+32>>2]&127](b,g)|0)|0;f=a+416|0;g=kZ(f,b,g,d)|0;if((g|0)!=0?(c[a+432>>2]=c[a+428>>2],i=vb[c[b+36>>2]&127](b,d)|0,i=kZ(f,b,i,e+(0-(c[h>>2]<<1))|0)|0,(i|0)!=0):0){EZ(i);rb[c[j>>2]&127](c[a+4>>2]|0,g,i);lZ(f);d=1}else d=0}return d|0}function DZ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=a+68|0;if(!(c[g>>2]|0))if(!(c[a+80>>2]|0))b=1;else{wZ(a,b,d,e);b=1}else{f=a+416|0;h=c[b+68>>2]|0;b=kZ(f,b,d+(h<<2)|0,e+(S(h,-3)|0)|0)|0;if(!b)b=0;else{EZ(b);lb[c[g>>2]&63](c[a+4>>2]|0,b);lZ(f);b=1}}return b|0}function EZ(b){b=b|0;var c=0,d=0,e=0,f=0;a:while(1){switch(a[b>>0]|0){case 0:break a;case 13:{f=b;e=13;c=4;break a}default:{}}b=b+1|0}if((c|0)==4){while(1){c=f;f=f+1|0;d=b+1|0;if(e<<24>>24==13){a[c>>0]=10;b=(a[d>>0]|0)==10?b+2|0:d}else{a[c>>0]=e;b=d}e=a[b>>0]|0;if(!(e<<24>>24))break;else c=4}a[f>>0]=0}return}function FZ(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0;k=(c[b+356>>2]|0)+164|0;h=c[k>>2]|0;m=c[h+(d*28|0)>>2]|0;c[e>>2]=m;c[e+4>>2]=c[h+(d*28|0)+4>>2];l=e+12|0;i=e+8|0;j=e+16|0;if((m|0)==4){c[i>>2]=c[g>>2];e=c[h+(d*28|0)+8>>2]|0;while(1){k=a[e>>0]|0;m=c[g>>2]|0;c[g>>2]=m+1;a[m>>0]=k;if(!(a[e>>0]|0))break;else e=e+1|0}c[l>>2]=0;c[j>>2]=0}else{h=c[h+(d*28|0)+20>>2]|0;c[l>>2]=h;c[j>>2]=c[f>>2];c[f>>2]=(c[f>>2]|0)+(h*20|0);e=(c[k>>2]|0)+(d*28|0)+12|0;d=0;while(1){e=c[e>>2]|0;if(d>>>0>=h>>>0)break;FZ(b,e,(c[j>>2]|0)+(d*20|0)|0,f,g);e=(c[k>>2]|0)+(e*28|0)+24|0;d=d+1|0;h=c[l>>2]|0}c[i>>2]=0}return}function GZ(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0;ma=l;l=l+48|0;ja=ma+28|0;_=ma+32|0;ka=ma+24|0;Y=ma;c[ja>>2]=f;Z=c[b+356>>2]|0;if((c[b+144>>2]|0)==(e|0)){ea=b+288|0;$=b+292|0}else{$=c[b+300>>2]|0;ea=$;$=$+4|0}c[ea>>2]=f;t=e+4|0;aa=e+72|0;u=b+56|0;v=b+376|0;ba=b+48|0;ga=b+80|0;w=e+68|0;ca=b+44|0;ha=b+312|0;x=b+52|0;da=e+60|0;y=e+32|0;z=b+104|0;A=b+416|0;B=b+392|0;C=b+368|0;fa=b+60|0;ia=b+4|0;D=b+364|0;E=b+432|0;F=b+428|0;G=b+480|0;H=e+48|0;I=Z+80|0;J=Z+96|0;K=Z+92|0;L=Z+129|0;M=b+120|0;N=b+112|0;O=b+116|0;P=b+308|0;Q=Z+130|0;R=b+12|0;S=b+16|0;T=b+236|0;U=b+237|0;V=b+472|0;W=e+44|0;X=b+72|0;a:while(1){s=c[ja>>2]|0;c[_>>2]=s;s=tb[c[t>>2]&127](e,s,g,_)|0;f=c[_>>2]|0;c[$>>2]=f;k=f;b:do switch(s|0){case -3:{la=6;break a}case -4:{la=15;break a}case 0:{la=20;break a}case -1:{la=21;break a}case -2:{la=23;break a}case 12:{f=17;break a}case -5:{la=136;break a}case 9:{s=c[w>>2]|0;s=(eb[c[H>>2]&63](e,(c[ja>>2]|0)+s|0,k+(0-s)|0)|0)&255;a[ka>>0]=s;do if(s<<24>>24){f=c[fa>>2]|0;if(f|0){rb[f&127](c[ia>>2]|0,ka,1);break}if(c[ga>>2]|0)wZ(b,e,c[ja>>2]|0,c[_>>2]|0)}else{j=c[w>>2]|0;j=kZ(I,e,(c[ja>>2]|0)+j|0,(c[_>>2]|0)+(0-j)|0)|0;if(!j){f=1;la=56;break a}k=mZ(b,Z,j,0)|0;c[K>>2]=c[J>>2];f=(k|0)!=0;if((a[L>>0]|0)!=0?(a[Q>>0]|0)==0:0){if(!f){f=c[M>>2]|0;if(f|0){rb[f&127](c[ia>>2]|0,j,0);break}if(!(c[ga>>2]|0))break;wZ(b,e,c[ja>>2]|0,c[_>>2]|0);break}}else{if(!f){f=11;la=56;break a}if(!(a[k+34>>0]|0)){f=24;la=56;break a}}f=k+32|0;if(a[f>>0]|0){f=12;la=56;break a}if(c[k+28>>2]|0){f=15;la=56;break a}if(!(c[k+4>>2]|0)){if(!(c[N>>2]|0)){if(!(c[ga>>2]|0))break;wZ(b,e,c[ja>>2]|0,c[_>>2]|0);break}a[f>>0]=1;j=IZ(b)|0;a[f>>0]=0;if(!j){f=1;la=56;break a}if(!(wb[c[N>>2]&63](c[O>>2]|0,j,c[k+20>>2]|0,c[k+16>>2]|0,c[k+24>>2]|0)|0)){f=21;la=56;break a}c[F>>2]=c[E>>2];break}if(a[P>>0]|0){f=AZ(b,k,0)|0;if(!f)break;else{la=58;break a}}f=c[M>>2]|0;if(!f){if(c[ga>>2]|0)wZ(b,e,c[ja>>2]|0,c[_>>2]|0)}else rb[f&127](c[ia>>2]|0,c[k>>2]|0,0);break b}while(0);break}case 1:case 2:{f=c[C>>2]|0;if(!f){f=pb[c[R>>2]&63](48)|0;if(!f){f=1;la=75;break a}j=pb[c[R>>2]&63](32)|0;c[f+36>>2]=j;if(!j){la=63;break a}c[f+40>>2]=j+32}else c[C>>2]=c[f>>2];o=f+44|0;c[o>>2]=0;c[f>>2]=c[D>>2];c[D>>2]=f;s=f+12|0;c[f+16>>2]=0;c[f+20>>2]=0;p=(c[ja>>2]|0)+(c[w>>2]|0)|0;q=f+4|0;c[q>>2]=p;p=vb[c[y>>2]&127](e,p)|0;c[f+8>>2]=p;c[ha>>2]=(c[ha>>2]|0)+1;q=c[q>>2]|0;p=q+p|0;c[Y>>2]=q;q=f+36|0;c[ka>>2]=c[q>>2];r=f+40|0;j=c[r>>2]|0;while(1){fb[c[da>>2]&31](e,Y,p,ka,j+-1|0);j=c[ka>>2]|0;m=c[q>>2]|0;k=m;n=j-k|0;if((c[Y>>2]|0)==(p|0))break;k=(c[r>>2]|0)-k<<1;j=vb[c[S>>2]&127](m,k)|0;if(!j){la=69;break a}c[q>>2]=j;m=j+k|0;c[r>>2]=m;c[ka>>2]=j+n;j=m}c[f+24>>2]=n;c[s>>2]=k;a[j>>0]=0;f=JZ(b,e,c[ja>>2]|0,s,o)|0;if(f|0){la=75;break a}f=c[x>>2]|0;if(!f){if(c[ga>>2]|0)wZ(b,e,c[ja>>2]|0,c[_>>2]|0)}else rb[f&127](c[ia>>2]|0,c[s>>2]|0,c[B>>2]|0);lZ(A);break}case 3:case 4:{s=(c[ja>>2]|0)+(c[w>>2]|0)|0;c[ka>>2]=0;s=kZ(A,e,s,s+(vb[c[y>>2]&127](e,s)|0)|0)|0;c[Y>>2]=s;if(!s){f=1;la=93;break a}c[E>>2]=c[F>>2];f=JZ(b,e,c[ja>>2]|0,Y,ka)|0;if(f|0){la=93;break a}c[E>>2]=c[F>>2];f=c[x>>2]|0;if(!f)j=1;else{rb[f&127](c[ia>>2]|0,c[Y>>2]|0,c[B>>2]|0);j=0}f=c[u>>2]|0;if(!f){if(j|0?c[ga>>2]|0:0)wZ(b,e,c[ja>>2]|0,c[_>>2]|0)}else{if(c[x>>2]|0){c[ea>>2]=c[$>>2];f=c[u>>2]|0}lb[f&63](c[ia>>2]|0,c[Y>>2]|0)}lZ(A);f=c[ka>>2]|0;while(1){if(!f)break;j=c[z>>2]|0;if(j|0)lb[j&63](c[ia>>2]|0,c[c[f>>2]>>2]|0);s=c[f+4>>2]|0;c[ka>>2]=s;c[f+4>>2]=c[v>>2];c[v>>2]=f;c[(c[f>>2]|0)+4>>2]=c[f+8>>2];f=s}if(!(c[ha>>2]|0)){la=95;break a}break}case 5:{if((c[ha>>2]|0)==(d|0)){f=13;break a}o=c[D>>2]|0;c[D>>2]=c[o>>2];c[o>>2]=c[C>>2];c[C>>2]=o;f=(c[ja>>2]|0)+(c[w>>2]<<1)|0;j=vb[c[y>>2]&127](e,f)|0;if((j|0)!=(c[o+8>>2]|0)){la=99;break a}if(g2(c[o+4>>2]|0,f,j)|0){la=99;break a}c[ha>>2]=(c[ha>>2]|0)+-1;f=c[u>>2]|0;if(!f){if(c[ga>>2]|0)wZ(b,e,c[ja>>2]|0,c[_>>2]|0)}else{j=c[o+16>>2]|0;n=o+12|0;if((j|0)!=0&(a[T>>0]|0)!=0){f=(c[n>>2]|0)+(c[o+28>>2]|0)|0;while(1){k=a[j>>0]|0;m=f+1|0;if(!(k<<24>>24))break;a[f>>0]=k;f=m;j=j+1|0}j=c[o+20>>2]|0;c:do if((j|0)!=0&(a[U>>0]|0)!=0){a[f>>0]=a[V>>0]|0;f=m;while(1){k=a[j>>0]|0;if(!(k<<24>>24))break c;a[f>>0]=k;j=j+1|0;f=f+1|0}}while(0);a[f>>0]=0;f=c[u>>2]|0}lb[f&63](c[ia>>2]|0,c[n>>2]|0)}j=o+44|0;k=c[j>>2]|0;while(1){if(!k)break;f=c[z>>2]|0;if(!f)f=k;else{lb[f&63](c[ia>>2]|0,c[c[k>>2]>>2]|0);f=c[j>>2]|0}s=c[f+4>>2]|0;c[j>>2]=s;c[k+4>>2]=c[v>>2];c[v>>2]=k;c[(c[k>>2]|0)+4>>2]=c[k+8>>2];k=s}if(!(c[ha>>2]|0)){la=119;break a}break}case 10:{f=vb[c[W>>2]&127](e,c[ja>>2]|0)|0;if((f|0)<0){f=14;break a}j=c[fa>>2]|0;if(j|0){r=c[ia>>2]|0;s=h_(f,ka)|0;rb[j&127](r,ka,s);break b}if(c[ga>>2]|0)wZ(b,e,c[ja>>2]|0,c[_>>2]|0);break}case 7:{f=c[fa>>2]|0;if(f|0){a[ka>>0]=10;rb[f&127](c[ia>>2]|0,ka,1);break b}if(c[ga>>2]|0)wZ(b,e,c[ja>>2]|0,k);break}case 8:{f=c[X>>2]|0;if(!f){if(c[ga>>2]|0)wZ(b,e,c[ja>>2]|0,k)}else db[f&127](c[ia>>2]|0);f=LZ(b,e,_,g,h,i)|0;if(f|0)break a;if(!(c[_>>2]|0)){la=135;break a}break}case 6:{j=c[fa>>2]|0;if(!j){if(!(c[ga>>2]|0))break b;wZ(b,e,c[ja>>2]|0,k);break b}if(!(a[aa>>0]|0))f=k;else{s=c[ja>>2]|0;rb[j&127](c[ia>>2]|0,s,f-s|0);break b}while(1){c[ka>>2]=c[ca>>2];fb[c[da>>2]&31](e,ja,f,ka,c[ba>>2]|0);c[$>>2]=c[ja>>2];f=c[ca>>2]|0;rb[j&127](c[ia>>2]|0,f,(c[ka>>2]|0)-f|0);f=c[ja>>2]|0;if((f|0)==(c[_>>2]|0))break;c[ea>>2]=f;f=c[_>>2]|0}break}case 11:{if(!(CZ(b,e,c[ja>>2]|0,k)|0)){f=1;break a}break}case 13:{if(!(DZ(b,e,c[ja>>2]|0,k)|0)){f=1;break a}break}default:if(c[ga>>2]|0)wZ(b,e,c[ja>>2]|0,k)}while(0);s=c[_>>2]|0;c[ja>>2]=s;c[ea>>2]=s;switch(c[G>>2]|0){case 2:{f=35;break a}case 3:{la=162;break a}default:{}}}switch(la|0){case 6:{j=(d|0)==0;if(i<<24>>24){c[h>>2]=c[ja>>2];f=0;break}c[$>>2]=g;f=c[fa>>2]|0;if(!f){if(c[ga>>2]|0)wZ(b,e,c[ja>>2]|0,g)}else{a[ka>>0]=10;rb[f&127](c[ia>>2]|0,ka,1)}if(!j)if((c[ha>>2]|0)==(d|0)){c[h>>2]=g;f=0}else f=13;else f=3;break}case 15:{if(i<<24>>24){c[h>>2]=c[ja>>2];f=0;break}if((d|0)>0)if((c[ha>>2]|0)==(d|0)){c[h>>2]=c[ja>>2];f=0}else f=13;else f=3;break}case 20:{c[ea>>2]=f;f=4;break}case 21:{if(!(i<<24>>24))f=5;else{c[h>>2]=c[ja>>2];f=0}break}case 23:{if(!(i<<24>>24))f=6;else{c[h>>2]=c[ja>>2];f=0}break}case 56:break;case 58:break;case 63:{db[c[b+20>>2]&127](f);f=1;la=75;break}case 69:{f=1;la=75;break}case 93:break;case 95:{f=KZ(b,c[_>>2]|0,g,h)|0;break}case 99:{c[ea>>2]=f;f=7;break}case 119:{f=KZ(b,c[_>>2]|0,g,h)|0;break}case 135:{c[b+280>>2]=61;f=0;break}case 136:{j=(d|0)==0;if(i<<24>>24){c[h>>2]=c[ja>>2];f=0;break}f=c[fa>>2]|0;do if(!f){if(c[ga>>2]|0)wZ(b,e,c[ja>>2]|0,g)}else if(!(a[aa>>0]|0)){c[ka>>2]=c[ca>>2];fb[c[da>>2]&31](e,ja,g,ka,c[ba>>2]|0);ja=c[ca>>2]|0;rb[c[fa>>2]&127](c[ia>>2]|0,ja,(c[ka>>2]|0)-ja|0);break}else{ka=c[ja>>2]|0;rb[f&127](c[ia>>2]|0,ka,g-ka|0);break}while(0);if(j){c[ea>>2]=g;f=3;break}if((c[ha>>2]|0)==(d|0)){c[h>>2]=g;f=0;break}else{c[ea>>2]=g;f=13;break}}case 162:{c[h>>2]=c[_>>2];f=0;break}}l=ma;return f|0}function HZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+16|0;r=s;n=b+300|0;o=c[n>>2]|0;do if(o){p=c[o+12>>2]|0;j=p+4|0;m=c[j>>2]|0;k=p+12|0;g=m+(c[k>>2]|0)|0;m=m+(c[p+8>>2]|0)|0;q=p+33|0;h=b+228|0;i=c[h>>2]|0;if(!(a[q>>0]|0))g=GZ(b,c[o+16>>2]|0,i,g,m,r,0)|0;else{i=tb[c[i>>2]&127](i,g,m,r)|0;g=iZ(b,c[h>>2]|0,g,m,i,c[r>>2]|0,r,0)|0}if(!g){g=c[r>>2]|0;if((m|0)!=(g|0)?(c[b+480>>2]|0)==3:0){c[k>>2]=g-(c[j>>2]|0);g=0;break}a[p+32>>0]=0;h=o+8|0;c[n>>2]=c[h>>2];g=b+304|0;c[h>>2]=c[g>>2];c[g>>2]=o;g=b+280|0;h=b+144|0;i=c[h>>2]|0;if(!(a[q>>0]|0)){c[g>>2]=58;g=GZ(b,(c[b+476>>2]|0)!=0&1,i,d,e,f,(a[b+484>>0]|0)==0&1)|0;break}else{c[g>>2]=57;g=tb[c[i>>2]&127](i,d,e,r)|0;g=iZ(b,c[h>>2]|0,d,e,g,c[r>>2]|0,f,(a[b+484>>0]|0)==0&1)|0;break}}}else g=23;while(0);l=s;return g|0}function IZ(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;p=l;l=l+16|0;k=p;i=c[b+356>>2]|0;g=i+156|0;j=b+472|0;n=b+416|0;o=b+428|0;m=b+424|0;a:do if(!(c[g>>2]|0)){d=0;h=11}else{d=c[o>>2]|0;if((d|0)==(c[m>>2]|0)){if(!((fZ(n)|0)<<24>>24)){d=0;break}d=c[o>>2]|0}c[o>>2]=d+1;a[d>>0]=61;e=(((a[j>>0]|0)!=0)<<31>>31)+(c[(c[g>>2]|0)+20>>2]|0)|0;f=0;while(1){if((f|0)>=(e|0)){d=1;h=11;break a}d=c[o>>2]|0;if((d|0)==(c[m>>2]|0)){if(!((fZ(n)|0)<<24>>24)){d=0;break a}d=c[o>>2]|0}q=a[(c[(c[g>>2]|0)+16>>2]|0)+f>>0]|0;c[o>>2]=d+1;a[d>>0]=q;f=f+1|0}}while(0);b:do if((h|0)==11){aZ(k,i+60|0);c:while(1){do{e=bZ(k)|0;if(!e)break c;h=e+4|0}while(!(c[h>>2]|0));if(d<<24>>24){d=c[o>>2]|0;if((d|0)==(c[m>>2]|0)){if(!((fZ(n)|0)<<24>>24)){d=0;break b}d=c[o>>2]|0}c[o>>2]=d+1;a[d>>0]=12}g=c[e>>2]|0;while(1){e=a[g>>0]|0;d=c[o>>2]|0;f=(d|0)==(c[m>>2]|0);if(!(e<<24>>24))break;if(f){if(!((fZ(n)|0)<<24>>24)){d=0;break b}d=c[o>>2]|0;e=a[g>>0]|0}c[o>>2]=d+1;a[d>>0]=e;g=g+1|0}if(f){if(!((fZ(n)|0)<<24>>24)){d=0;break b}d=c[o>>2]|0}c[o>>2]=d+1;a[d>>0]=61;f=(((a[j>>0]|0)!=0)<<31>>31)+(c[(c[h>>2]|0)+20>>2]|0)|0;e=0;while(1){if((e|0)>=(f|0)){d=1;continue c}d=c[o>>2]|0;if((d|0)==(c[m>>2]|0)){if(!((fZ(n)|0)<<24>>24)){d=0;break b}d=c[o>>2]|0}q=a[(c[(c[h>>2]|0)+16>>2]|0)+e>>0]|0;c[o>>2]=d+1;a[d>>0]=q;e=e+1|0}}aZ(k,i);d:while(1){do{e=bZ(k)|0;if(!e)break d}while(!(a[e+32>>0]|0));if(d<<24>>24){d=c[o>>2]|0;if((d|0)==(c[m>>2]|0)){if(!((fZ(n)|0)<<24>>24)){d=0;break b}d=c[o>>2]|0}c[o>>2]=d+1;a[d>>0]=12}f=c[e>>2]|0;while(1){e=a[f>>0]|0;if(!(e<<24>>24)){d=1;continue d}d=c[o>>2]|0;if((d|0)==(c[m>>2]|0)){if(!((fZ(n)|0)<<24>>24)){d=0;break b}d=c[o>>2]|0;e=a[f>>0]|0}c[o>>2]=d+1;a[d>>0]=e;f=f+1|0}}d=c[o>>2]|0;if((d|0)==(c[m>>2]|0)){if(!((fZ(n)|0)<<24>>24)){d=0;break}d=c[o>>2]|0}c[o>>2]=d+1;a[d>>0]=0;d=c[b+432>>2]|0}while(0);l=p;return d|0}function JZ(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;L=c[b+356>>2]|0;k=L+20|0;i=mZ(b,k,c[g>>2]|0,0)|0;K=b+236|0;if(!i){i=eZ(L+80|0,c[g>>2]|0)|0;if((i|0)!=0?(j=mZ(b,k,i,24)|0,(j|0)!=0):0)if((a[K>>0]|0)!=0?(PZ(b,j)|0)==0:0)i=1;else A=6;else i=1}else{j=i;A=6}a:do if((A|0)==6){w=c[j+12>>2]|0;l=e+40|0;i=b+380|0;s=b+392|0;t=tb[c[l>>2]&127](e,f,c[i>>2]|0,c[s>>2]|0)|0;k=t+w|0;m=c[i>>2]|0;z=b+16|0;if((k|0)>(m|0)){J=k+16|0;c[i>>2]=J;i=vb[c[z>>2]&127](c[s>>2]|0,J<<4)|0;if(!i){i=1;break}c[s>>2]=i;if((t|0)>(m|0))tb[c[l>>2]&127](e,f,t,i)|0}J=c[s>>2]|0;v=j+20|0;G=b+416|0;H=b+432|0;I=b+428|0;q=e+32|0;r=0;p=0;k=0;while(1){if((p|0)>=(t|0))break;o=c[(c[s>>2]|0)+(p<<4)>>2]|0;o=qZ(b,e,o,o+(vb[c[q>>2]&127](e,o)|0)|0)|0;if(!o){i=1;break a}i=(c[o>>2]|0)+-1|0;if(a[i>>0]|0){A=14;break}a[i>>0]=1;c[J+(r<<2)>>2]=c[o>>2];F=c[s>>2]|0;n=J+(r+1<<2)|0;m=F+(p<<4)+4|0;f=F+(p<<4)+8|0;if(a[F+(p<<4)+12>>0]|0){F=kZ(G,e,c[m>>2]|0,c[f>>2]|0)|0;c[n>>2]=F;if(!F){i=1;break a}}else{b:do if(!(a[o+8>>0]|0))i=1;else{i=0;while(1){if((i|0)>=(w|0)){i=1;break b}l=c[v>>2]|0;if((o|0)==(c[l+(i*12|0)>>2]|0))break;i=i+1|0}i=a[l+(i*12|0)+4>>0]|0}while(0);i=uZ(b,e,i,c[m>>2]|0,c[f>>2]|0,G)|0;if(i|0)break a;c[n>>2]=c[H>>2]}c[H>>2]=c[I>>2];l=c[o+4>>2]|0;i=r+2|0;do if(l)if(a[o+9>>0]|0){i=QZ(b,l,o,c[n>>2]|0,h)|0;if(!i){i=r;break}else break a}else{a[(c[o>>2]|0)+-1>>0]=2;k=k+1|0;break}while(0);r=i;p=p+1|0}if((A|0)==14){if((c[b+144>>2]|0)!=(e|0)){i=8;break}c[b+288>>2]=c[(c[s>>2]|0)+(p<<4)>>2];i=8;break}c[b+384>>2]=r;i=c[j+8>>2]|0;c:do if((i|0)!=0?(u=c[i>>2]|0,(a[u+-1>>0]|0)!=0):0){i=0;while(1){if((i|0)>=(r|0)){p=0;q=k;E=r;break c}if((c[J+(i<<2)>>2]|0)==(u|0)){A=35;break c}i=i+2|0}}else{i=-1;A=35}while(0);if((A|0)==35){c[b+388>>2]=i;p=0;q=k;E=r}while(1){n=J+(E<<2)|0;if((p|0)>=(w|0))break;i=c[v>>2]|0;o=i+(p*12|0)|0;l=c[o>>2]|0;m=(c[l>>2]|0)+-1|0;d:do if((a[m>>0]|0)==0?(x=i+(p*12|0)+8|0,y=c[x>>2]|0,(y|0)!=0):0){k=c[l+4>>2]|0;i=E+2|0;f=J+(E+1<<2)|0;do if(k)if(a[l+9>>0]|0){i=QZ(b,k,l,y,h)|0;if(!i){k=q;i=E;break d}else break a}else{a[m>>0]=2;k=q+1|0;break}else{a[m>>0]=1;k=q}while(0);c[n>>2]=c[c[o>>2]>>2];c[f>>2]=c[x>>2]}else{k=q;i=E}while(0);p=p+1|0;q=k;E=i}c[n>>2]=0;F=b+472|0;D=b+237|0;e:do if(!q)i=0;else{m=b+400|0;l=c[m>>2]|0;B=b+404|0;i=a[B>>0]|0;k=i&255;C=b+396|0;if(!(q<<1>>k)){i=1<>24}while((q>>(A&255)|0)!=0);k=(i&255)>3?i:3;a[B>>0]=k;k=k&255;i=vb[c[z>>2]&127](c[C>>2]|0,12<>2]=i;k=1<>2]|0)+(A*12|0)>>2]=-1;i=A}}while(0);A=i+-1|0;c[m>>2]=A;u=b+496|0;v=L+40|0;w=b+424|0;x=k+-1|0;y=0-k|0;z=x>>>2;i=0;e=q;do{while(1){if((i|0)>=(E|0))break e;t=J+(i<<2)|0;p=c[t>>2]|0;l=p+-1|0;if((a[l>>0]|0)==2)break;a[l>>0]=0;i=i+2|0}m=c[u>>2]|0;a[l>>0]=0;s=c[(c[(mZ(b,v,p,0)|0)+4>>2]|0)+4>>2]|0;if(!s){i=27;break a}n=s+20|0;o=s+16|0;q=m;m=0;while(1){if((m|0)>=(c[n>>2]|0)){l=p;break}f=a[(c[o>>2]|0)+m>>0]|0;l=c[I>>2]|0;if((l|0)==(c[w>>2]|0)){if(!((fZ(G)|0)<<24>>24)){i=1;break a}l=c[I>>2]|0}c[I>>2]=l+1;a[l>>0]=f;q=f&255^q*1000003;m=m+1|0}while(1){m=l+1|0;if((a[l>>0]|0)==58)break;else l=m}while(1){n=a[m>>0]|0;l=c[I>>2]|0;if((l|0)==(c[w>>2]|0)){if(!((fZ(G)|0)<<24>>24)){i=1;break a}l=c[I>>2]|0;f=a[m>>0]|0}else f=n;c[I>>2]=l+1;a[l>>0]=f;q=n&255^q*1000003;if(!(a[m>>0]|0))break;else m=m+1|0}o=c[C>>2]|0;p=q&y;l=0;r=q&x;while(1){if((c[o+(r*12|0)>>2]|0)!=(A|0))break;if((q|0)==(c[o+(r*12|0)+4>>2]|0)){m=c[o+(r*12|0)+8>>2]|0;f=c[H>>2]|0;while(1){M=a[f>>0]|0;n=M<<24>>24==0;if(n|M<<24>>24!=(a[m>>0]|0))break;m=m+1|0;f=f+1|0}if(n){i=8;break a}}if(!(l<<24>>24))l=(p>>>((d[B>>0]|0)+-1|0)&z|1)&255;M=l&255;r=r+((r|0)<(M|0)?k:0)-M|0}if(a[D>>0]|0){a[(c[I>>2]|0)+-1>>0]=a[F>>0]|0;m=c[c[s>>2]>>2]|0;while(1){l=c[I>>2]|0;if((l|0)==(c[w>>2]|0)){if(!((fZ(G)|0)<<24>>24)){i=1;break a}l=c[I>>2]|0}M=a[m>>0]|0;c[I>>2]=l+1;a[l>>0]=M;if(!(a[m>>0]|0))break;else m=m+1|0}}s=c[H>>2]|0;c[H>>2]=c[I>>2];c[t>>2]=s;M=c[C>>2]|0;c[M+(r*12|0)>>2]=A;c[M+(r*12|0)+4>>2]=q;c[M+(r*12|0)+8>>2]=s;e=e+-1|0;i=i+2|0}while((e|0)!=0)}while(0);while(1){if((i|0)>=(E|0)){i=h;break}a[(c[J+(i<<2)>>2]|0)+-1>>0]=0;i=i+2|0}while(1){i=c[i>>2]|0;if(!i)break;a[(c[c[i+12>>2]>>2]|0)+-1>>0]=0;i=i+4|0}if(!(a[K>>0]|0))i=0;else{i=c[j+4>>2]|0;if(!i){i=c[L+156>>2]|0;if(!i){i=0;break}k=c[g>>2]|0}else{i=c[i+4>>2]|0;if(!i){i=27;break}j=c[g>>2]|0;while(1){k=j+1|0;if((a[j>>0]|0)==58)break;else j=k}}m=c[c[i>>2]>>2]|0;if((a[D>>0]|0)==0|(m|0)==0)l=0;else{j=0;while(1){l=j+1|0;if(!(a[m+j>>0]|0))break;else j=l}}c[g+4>>2]=k;o=i+20|0;j=c[o>>2]|0;c[g+16>>2]=j;c[g+8>>2]=m;c[g+20>>2]=l;p=0;while(1){q=p+1|0;if(!(a[k+p>>0]|0))break;else p=q}m=j+l+q|0;f=i+24|0;r=i+16|0;if((m|0)>(c[f>>2]|0)){j=m+24|0;m=pb[c[b+12>>2]&63](j)|0;if(!m){i=1;break}c[f>>2]=j;B6(m|0,c[r>>2]|0,c[o>>2]|0)|0;n=c[r>>2]|0;j=b+364|0;while(1){j=c[j>>2]|0;if(!j)break;f=j+12|0;if((c[f>>2]|0)==(n|0))c[f>>2]=m}db[c[b+20>>2]&127](n);c[r>>2]=m;j=c[o>>2]|0}else m=c[r>>2]|0;j=m+j|0;B6(j|0,k|0,q|0)|0;if(l|0){M=j+p|0;a[M>>0]=a[F>>0]|0;B6(M+1|0,c[c[i>>2]>>2]|0,l|0)|0}c[g>>2]=c[r>>2];i=0}}while(0);return i|0}function KZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;q=l;l=l+16|0;j=q;c[b+280>>2]=62;k=b+288|0;c[k>>2]=d;m=b+144|0;n=b+292|0;o=b+80|0;i=b+480|0;g=d;a:while(1){c[j>>2]=0;r=c[m>>2]|0;r=tb[c[r>>2]&127](r,g,e,j)|0;d=c[j>>2]|0;c[n>>2]=d;h=d;switch(r|0){case -15:{p=3;break a}case -4:{p=7;break a}case 0:{p=12;break a}case -1:{p=13;break a}case -2:{p=15;break a}case 15:{if(c[o>>2]|0)wZ(b,c[m>>2]|0,g,h);break}case 11:{if(!(CZ(b,c[m>>2]|0,g,h)|0)){d=1;break a}break}case 13:{if(!(DZ(b,c[m>>2]|0,g,h)|0)){d=1;break a}break}default:{d=9;break a}}d=c[j>>2]|0;c[k>>2]=d;switch(c[i>>2]|0){case 2:{d=35;break a}case 3:{p=18;break a}default:{}}g=d}do if((p|0)==3){if(c[o>>2]|0){wZ(b,c[m>>2]|0,g,h);if((c[i>>2]|0)==2){d=35;break}d=c[j>>2]|0}c[f>>2]=d;d=0}else if((p|0)==7){c[f>>2]=g;d=0}else if((p|0)==12){c[k>>2]=d;d=4}else if((p|0)==13)if(!(a[b+484>>0]|0)){c[f>>2]=g;d=0}else d=5;else if((p|0)==15)if(!(a[b+484>>0]|0)){c[f>>2]=g;d=0}else d=6;else if((p|0)==18){c[f>>2]=d;d=0}while(0);l=q;return d|0}function LZ(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;B=l;l=l+16|0;y=B+8|0;z=B+4|0;x=B;i=c[e>>2]|0;c[y>>2]=i;if((c[b+144>>2]|0)==(d|0)){s=b+288|0;c[s>>2]=i;t=b+292|0}else{t=c[b+300>>2]|0;s=t;t=t+4|0}c[s>>2]=i;c[e>>2]=0;m=d+8|0;u=b+4|0;v=b+80|0;n=b+60|0;w=b+480|0;o=d+72|0;p=b+44|0;q=d+60|0;r=b+48|0;a:while(1){k=tb[c[m>>2]&127](d,c[y>>2]|0,f,z)|0;i=c[z>>2]|0;c[t>>2]=i;j=i;b:do switch(k|0){case 40:{A=6;break a}case 0:{A=23;break a}case -2:{A=24;break a}case -4:case -1:{A=26;break a}case 7:{i=c[n>>2]|0;if(i|0){a[x>>0]=10;rb[i&127](c[u>>2]|0,x,1);break b}if(c[v>>2]|0)wZ(b,d,c[y>>2]|0,j);break}case 6:{k=c[n>>2]|0;if(!k){if(!(c[v>>2]|0))break b;wZ(b,d,c[y>>2]|0,j);break b}if(!(a[o>>0]|0))i=j;else{j=c[y>>2]|0;rb[k&127](c[u>>2]|0,j,i-j|0);break b}while(1){c[x>>2]=c[p>>2];fb[c[q>>2]&31](d,y,i,x,c[r>>2]|0);c[t>>2]=c[z>>2];i=c[p>>2]|0;rb[k&127](c[u>>2]|0,i,(c[x>>2]|0)-i|0);i=c[y>>2]|0;if((i|0)==(c[z>>2]|0))break;c[s>>2]=i;i=c[z>>2]|0}break}default:{A=28;break a}}while(0);k=c[z>>2]|0;c[y>>2]=k;c[s>>2]=k;switch(c[w>>2]|0){case 3:{A=30;break a}case 2:{i=35;break a}default:{}}}if((A|0)==6){i=c[b+76>>2]|0;if(!i){if(c[v>>2]|0)wZ(b,d,c[y>>2]|0,j)}else db[i&127](c[u>>2]|0);i=c[z>>2]|0;c[e>>2]=i;c[g>>2]=i;i=(c[w>>2]|0)==2?35:0}else if((A|0)==23){c[s>>2]=i;i=4}else if((A|0)==24)if(!(h<<24>>24))i=6;else{c[g>>2]=c[y>>2];i=0}else if((A|0)==26)if(!(h<<24>>24))i=20;else{c[g>>2]=c[y>>2];i=0}else if((A|0)==28){c[s>>2]=i;i=23}else if((A|0)==30){c[g>>2]=c[z>>2];i=0}l=B;return i|0}function MZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=l;l=l+16|0;g=h;c[g>>2]=d;d=LZ(b,c[b+144>>2]|0,g,e,f,(a[b+484>>0]|0)==0&1)|0;do if(!d){d=c[g>>2]|0;if(d){g=b+280|0;if(!(c[b+476>>2]|0)){c[g>>2]=58;d=oZ(b,d,e,f)|0;break}else{c[g>>2]=63;d=NZ(b,d,e,f)|0;break}}else d=0}while(0);l=h;return d|0}function NZ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;d=GZ(b,1,c[b+144>>2]|0,d,e,f,(a[b+484>>0]|0)==0&1)|0;if((d|0)==0?(OZ(b)|0)<<24>>24==0:0)d=1;return d|0}function OZ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;m=a+16|0;a=a+364|0;while(1){a=c[a>>2]|0;if(!a){a=1;break}i=(c[a+24>>2]|0)+1|0;j=a+36|0;f=c[j>>2]|0;e=f+i|0;l=a+4|0;d=c[l>>2]|0;if((d|0)==(e|0)){a=1;break}k=a+8|0;b=c[k>>2]|0;g=b+i|0;h=a+40|0;if((g|0)>((c[h>>2]|0)-f|0)){e=vb[c[m>>2]&127](f,g)|0;if(!e){a=0;break}b=a+12|0;f=c[j>>2]|0;if((c[b>>2]|0)==(f|0))c[b>>2]=e;b=a+16|0;d=c[b>>2]|0;if(d|0)c[b>>2]=e+(d-f);c[j>>2]=e;c[h>>2]=e+g;e=e+i|0;d=c[l>>2]|0;b=c[k>>2]|0}B6(e|0,d|0,b|0)|0;c[l>>2]=e}return a|0}function PZ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;n=c[b+356>>2]|0;j=n+80|0;k=n+92|0;l=n+88|0;m=n+60|0;n=n+96|0;i=d+4|0;h=c[d>>2]|0;a:while(1){switch(a[h>>0]|0){case 0:{e=1;break a}case 58:{g=c[d>>2]|0;while(1){e=c[k>>2]|0;f=(e|0)==(c[l>>2]|0);if((g|0)==(h|0))break;if(f){if(!((fZ(j)|0)<<24>>24)){e=0;break a}e=c[k>>2]|0}f=a[g>>0]|0;c[k>>2]=e+1;a[e>>0]=f;g=g+1|0}if(f){if(!((fZ(j)|0)<<24>>24)){e=0;break a}e=c[k>>2]|0}c[k>>2]=e+1;a[e>>0]=0;e=mZ(b,m,c[n>>2]|0,8)|0;if(!e){e=0;break a}f=c[n>>2]|0;if((c[e>>2]|0)==(f|0))c[n>>2]=c[k>>2];else c[k>>2]=f;c[i>>2]=e;break}default:{}}h=h+1|0}return e|0}function QZ(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=c[d>>2]|0;i=(h|0)!=0;a:do if((a[f>>0]|0)!=0|i^1){b:do if(((i?(a[h>>0]|0)==120:0)?(a[h+1>>0]|0)==109:0)?(a[h+2>>0]|0)==108:0){switch(a[h+3>>0]|0){case 110:break;case 0:{m=1;break b}default:{m=0;break b}}if((a[h+4>>0]|0)==115?(a[h+5>>0]|0)==0:0){h=39;break a}else m=0}else m=0;while(0);n=m<<24>>24!=0;l=1;h=1;i=0;c:while(1){p=n|l^1;while(1){k=a[f+i>>0]|0;j=h<<24>>24!=0;o=i+1|0;if(!(k<<24>>24))break c;do if(j){if((i|0)<=36?k<<24>>24==(a[142560+i>>0]|0):0)break;h=0}else h=0;while(0);if(p){i=o;continue}if((i|0)>29){l=0;i=o;continue c}if(k<<24>>24==(a[142597+i>>0]|0))i=o;else{l=0;i=o;continue c}}}if((m&255|0)!=(j&(i|0)==36&1|0)){h=n?38:40;break}if(!(l&(i|0)==29)){p=b+472|0;n=(a[p>>0]|0)==0?i:o;h=b+376|0;j=c[h>>2]|0;m=n+24|0;do if(!j){h=b+12|0;i=pb[c[h>>2]&63](28)|0;if(!i){h=1;break a}o=pb[c[h>>2]&63](m)|0;c[i+16>>2]=o;if(!o){db[c[b+20>>2]&127](i);h=1;break a}else{c[i+24>>2]=m;j=i;break}}else{i=j+24|0;if((n|0)>(c[i>>2]|0)){k=j+16|0;l=vb[c[b+16>>2]&127](c[k>>2]|0,m)|0;if(!l){h=1;break a}c[k>>2]=l;c[i>>2]=m}c[h>>2]=c[j+4>>2]}while(0);c[j+20>>2]=n;i=j+16|0;B6(c[i>>2]|0,f|0,n|0)|0;h=a[p>>0]|0;if(h<<24>>24)a[(c[i>>2]|0)+(n+-1)>>0]=h;c[j>>2]=d;c[j+12>>2]=e;i=d+4|0;c[j+8>>2]=c[i>>2];if((a[f>>0]|0)==0?((c[b+356>>2]|0)+152|0)==(d|0):0)h=0;else h=j;c[i>>2]=h;c[j+4>>2]=c[g>>2];c[g>>2]=j;if((e|0)!=0?(q=c[b+100>>2]|0,(q|0)!=0):0){rb[q&127](c[b+4>>2]|0,c[d>>2]|0,c[i>>2]|0?f:0);h=0}else h=0}else h=40}else h=28;while(0);return h|0}function RZ(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;L=l;l=l+16|0;I=L;J=L+4|0;K=c[b+356>>2]|0;o=d+16|0;p=d+68|0;q=b+144|0;r=h+16|0;s=h+8|0;t=h+12|0;v=b+288|0;w=d+44|0;x=e<<24>>24==0;y=d+48|0;z=b+440|0;A=b+456|0;B=b+452|0;C=(K+80|0)==(h|0);D=K+130|0;E=K+129|0;F=b+272|0;G=b+300|0;H=b+228|0;i=0;a:while(1){b:while(1){switch(tb[c[o>>2]&127](d,f,g,I)|0){case -4:{i=0;n=63;break a}case 0:{n=4;break a}case -1:{n=6;break a}case 6:{n=23;break b}case -3:{n=24;break b}case 7:case 39:{n=25;break b}case 10:{j=vb[c[w>>2]&127](d,f)|0;c:do if((j|0)<0)if((c[q>>2]|0)==(d|0)){c[v>>2]=f;j=1;i=14}else{j=1;i=14}else{if(x&(j|0)==32){k=c[t>>2]|0;if((k|0)==(c[r>>2]|0)){j=4;break}if((a[k+-1>>0]|0)==32){j=4;break}}m=h_(j,J)|0;if(!m){if((c[q>>2]|0)!=(d|0)){j=1;i=14;break}c[v>>2]=f;j=1;i=14;break}else k=0;while(1){if((k|0)>=(m|0)){j=0;break c}j=c[t>>2]|0;if((j|0)==(c[s>>2]|0)){if(!((fZ(h)|0)<<24>>24)){j=1;i=1;break c}j=c[t>>2]|0}M=a[J+k>>0]|0;c[t>>2]=j+1;a[j>>0]=M;k=k+1|0}}while(0);switch(j&7){case 4:case 0:break b;default:{}}break}case 9:{j=c[p>>2]|0;j=(eb[c[y>>2]&63](d,f+j|0,(c[I>>2]|0)+(0-j)|0)|0)&255;if(j<<24>>24){n=33;break b}j=c[p>>2]|0;j=kZ(z,d,f+j|0,(c[I>>2]|0)+(0-j)|0)|0;if(!j){i=1;n=63;break a}m=mZ(b,K,j,0)|0;c[B>>2]=c[A>>2];do if(C){if(!(c[F>>2]|0))if(!m)break b;else break;if(!(a[D>>0]|0)){j=(m|0)!=0;if(!(a[E>>0]|0)){n=47;break}else{u=j;n=49;break}}else{j=(m|0)!=0;if(!(c[G>>2]|0)){n=47;break}else{u=j;n=49;break}}}else if(!(a[E>>0]|0))if(!m){i=11;n=63;break a}else{n=48;break}else{j=(m|0)!=0;if(!(a[D>>0]|0)){u=j;n=49;break}else{n=47;break}}while(0);if((n|0)==47)if(j)n=48;else{i=11;n=63;break a}else if((n|0)==49?(n=0,!u):0)break b;if((n|0)==48?(n=0,(a[m+34>>0]|0)==0):0){i=24;n=63;break a}k=m+32|0;if(a[k>>0]|0){n=51;break a}if(c[m+28>>2]|0){n=54;break a}j=c[m+4>>2]|0;if(!j){n=57;break a}m=j+(c[m+8>>2]|0)|0;a[k>>0]=1;m=RZ(b,c[H>>2]|0,e,j,m,h)|0;a[k>>0]=0;j=(m|0)==0;if(j)break b;else{j=(j^1)&1;i=m}break}default:{n=60;break a}}if(j)break a}if((n|0)==23){n=0;if(!(sZ(h,d,f,c[I>>2]|0)|0)){i=1;n=63;break}}else if((n|0)==24){c[I>>2]=f+(c[p>>2]|0);n=25}else if((n|0)==33){n=0;f=c[t>>2]|0;if((f|0)==(c[s>>2]|0)){if(!((fZ(h)|0)<<24>>24)){i=1;n=63;break}f=c[t>>2]|0}c[t>>2]=f+1;a[f>>0]=j}do if((n|0)==25){n=0;f=c[t>>2]|0;if(x){if((f|0)==(c[r>>2]|0))break;if((a[f+-1>>0]|0)==32)break}if((f|0)==(c[s>>2]|0)){if(!((fZ(h)|0)<<24>>24)){i=1;n=63;break a}f=c[t>>2]|0}c[t>>2]=f+1;a[f>>0]=32}while(0);f=c[I>>2]|0}if((n|0)==4)if((c[q>>2]|0)==(d|0)){c[v>>2]=c[I>>2];i=4;n=63}else{i=4;n=63}else if((n|0)==6)if((c[q>>2]|0)==(d|0)){c[v>>2]=f;i=4;n=63}else{i=4;n=63}else if((n|0)==51)if((c[q>>2]|0)==(d|0)){c[v>>2]=f;i=12;n=63}else{i=12;n=63}else if((n|0)==54)if((c[q>>2]|0)==(d|0)){c[v>>2]=f;i=15;n=63}else{i=15;n=63}else if((n|0)==57)if((c[q>>2]|0)==(d|0)){c[v>>2]=f;i=16;n=63}else{i=16;n=63}else if((n|0)==60)if((c[q>>2]|0)==(d|0)){c[v>>2]=f;i=23;n=63}else{i=23;n=63}l=L;return i|0}function SZ(b,d){b=b|0;d=d|0;var e=0;e=c[b+496>>2]|0;b=d;while(1){d=a[b>>0]|0;if(!(d<<24>>24))break;e=d&255^e*1000003;b=b+1|0}return e|0}function TZ(b,c){b=b|0;c=c|0;var d=0;while(1){d=a[b>>0]|0;if(d<<24>>24!=(a[c>>0]|0)){c=0;break}if(!(d<<24>>24)){c=1;break}c=c+1|0;b=b+1|0}return c|0}function UZ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+1040|0;i=k;f=c[b+124>>2]|0;a:do if(!f)e=18;else{e=0;while(1){if((e|0)==256)break;c[i+(e<<2)>>2]=-1;e=e+1|0}g=i+1028|0;c[g>>2]=0;j=i+1024|0;c[j>>2]=0;h=i+1032|0;c[h>>2]=0;do if(eb[f&63](c[b+248>>2]|0,d,i)|0){f=c[b+12>>2]|0;e=i_()|0;e=pb[f&63](e)|0;c[b+240>>2]=e;if(!e){e=c[h>>2]|0;if(!e)e=1;else{db[e&127](c[j>>2]|0);e=1}}else{e=tb[(a[b+236>>0]<<24>>24?64:65)&127](e,i,c[g>>2]|0,c[j>>2]|0)|0;if(!e)break;c[b+244>>2]=c[j>>2];c[b+252>>2]=c[h>>2];c[b+144>>2]=e;e=0}break a}while(0);e=c[h>>2]|0;if(e|0)db[e&127](c[j>>2]|0);e=18}while(0);l=k;return e|0}function VZ(b,d){b=b|0;d=d|0;a[b+4>>0]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b>>2]=0;c[b+16>>2]=d;return}function WZ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;l=c[b+356>>2]|0;m=b+416|0;n=b+428|0;o=b+424|0;p=b+432|0;q=l+152|0;r=b+372|0;j=l+60|0;k=l+80|0;a:while(1){g=d;b:while(1){if(!(a[d>>0]|0)){d=1;break a}e=a[g>>0]|0;h=g+1|0;switch(e<<24>>24){case 0:case 12:{s=5;break b}case 61:break b;default:{}}f=c[n>>2]|0;if((f|0)==(c[o>>2]|0)){if(!((fZ(m)|0)<<24>>24)){d=0;break a}f=c[n>>2]|0;e=a[g>>0]|0}c[n>>2]=f+1;a[f>>0]=e;g=h}if((s|0)==5){s=0;d=c[n>>2]|0;if((d|0)==(c[o>>2]|0)){if(!((fZ(m)|0)<<24>>24)){d=0;break}d=c[n>>2]|0}c[n>>2]=d+1;a[d>>0]=0;d=mZ(b,l,c[p>>2]|0,0)|0;if(d|0)a[d+32>>0]=1;d=(a[g>>0]|0)==0?g:h;c[n>>2]=c[p>>2];continue}d=c[n>>2]|0;if((d|0)==(c[p>>2]|0))f=q;else{if((d|0)==(c[o>>2]|0)){if(!((fZ(m)|0)<<24>>24)){d=0;break}d=c[n>>2]|0}c[n>>2]=d+1;a[d>>0]=0;f=mZ(b,j,c[p>>2]|0,8)|0;if(!f){d=0;break}e=c[f>>2]|0;i=c[p>>2]|0;d=i;if((e|0)==(i|0)){i=eZ(k,e)|0;c[f>>2]=i;if(!i){d=0;break}d=c[p>>2]|0}c[n>>2]=d}c:while(1){e=a[h>>0]|0;g=(d|0)==(c[o>>2]|0);i=h+1|0;switch(e<<24>>24){case 0:case 12:break c;default:{}}if(g){if(!((fZ(m)|0)<<24>>24)){d=0;break a}d=c[n>>2]|0;e=a[h>>0]|0}c[n>>2]=d+1;a[d>>0]=e;h=i;d=c[n>>2]|0}if(g){if(!((fZ(m)|0)<<24>>24)){d=0;break}d=c[n>>2]|0}c[n>>2]=d+1;a[d>>0]=0;if(QZ(b,f,0,c[p>>2]|0,r)|0){d=0;break}c[n>>2]=c[p>>2];d=(a[h>>0]|0)==0?h:i}return d|0}function XZ(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+4|0;e=(c[d>>2]|0)==(c[a>>2]|0);c[a>>2]=b;if(e)c[d>>2]=b;return}function YZ(a,b,d){a=a|0;b=b|0;d=d|0;c[a+52>>2]=b;c[a+56>>2]=d;return}function ZZ(a,b){a=a|0;b=b|0;c[a+60>>2]=b;return}function _Z(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;i=b+480|0;j=b+284|0;switch(c[i>>2]|0){case 3:{c[j>>2]=33;g=0;break}case 2:{c[j>>2]=36;g=0;break}case 0:{if((c[b+476>>2]|0)==0?($Z(b)|0)<<24>>24==0:0){c[j>>2]=1;g=0}else h=7;break}default:h=7}a:do if((h|0)==7){c[i>>2]=1;if(e|0){g=b_(b,e)|0;if(!g){g=0;break}B6(g|0,d|0,e|0)|0;g=c_(b,e,f)|0;break}a[b+484>>0]=f;if(!f)g=1;else{g=b+24|0;f=c[g>>2]|0;d=b+296|0;c[d>>2]=f;h=c[b+28>>2]|0;c[b+40>>2]=h;e=b+280|0;h=tb[c[e>>2]&127](b,f,h,g)|0;c[j>>2]=h;if(h|0){c[b+292>>2]=c[b+288>>2];c[e>>2]=66;g=0;break}switch(c[i>>2]|0){case 3:{j=c[b+144>>2]|0;xb[c[j+52>>2]&31](j,c[d>>2]|0,c[g>>2]|0,b+408|0);c[d>>2]=c[g>>2];g=2;break a}case 1:case 0:{c[i>>2]=2;g=1;break a}default:{g=1;break a}}}}while(0);return g|0}function $Z(b){b=b|0;var d=0;d=b+496|0;if(!(c[d>>2]|0))c[d>>2]=d_()|0;if(!(a[b+236>>0]|0))b=1;else b=WZ(b,142627)|0;return b|0}function a_(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;return c[a+284>>2]|0}function b_(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;l=a+284|0;a:do switch(c[a+480>>2]|0){case 3:{c[l>>2]=33;d=0;break}case 2:{c[l>>2]=36;d=0;break}default:{m=a+32|0;k=c[m>>2]|0;p=a+28|0;e=c[p>>2]|0;d=e;if((k-e|0)<(b|0)){q=a+24|0;j=c[q>>2]|0;f=e-j|0;o=a+8|0;g=c[o>>2]|0;r=g;h=j-r|0;i=(h|0)>1024;e=i?1024:h;b=f+b+e|0;do if((b|0)>(k-r|0)){d=k-j|0;d=(d|0)==0?1024:d;do d=d<<1;while((d|0)<(b|0));e=pb[c[a+12>>2]&63](d)|0;if(!e){c[l>>2]=1;d=0;break a}c[m>>2]=e+d;d=c[q>>2]|0;b=d;f=(c[p>>2]|0)-b|0;if(!d){d=e+f|0;c[p>>2]=d;c[o>>2]=e;n=14;break}else{n=b-(c[o>>2]|0)|0;n=(n|0)<1024?n:1024;B6(e|0,d+(0-n)|0,n+f|0)|0;db[c[a+20>>2]&127](c[o>>2]|0);c[o>>2]=e;d=e+((c[p>>2]|0)-(c[q>>2]|0))+n|0;c[p>>2]=d;e=e+n|0;n=14;break}}else if(i){d=h-e|0;I6(g|0,g+d|0,e+f|0)|0;e=0-d|0;d=(c[p>>2]|0)+e|0;c[p>>2]=d;e=(c[q>>2]|0)+e|0;n=14}while(0);if((n|0)==14)c[q>>2]=e;c[a+292>>2]=0;c[a+288>>2]=0;c[a+296>>2]=0}}}while(0);return d|0}function c_(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=b+480|0;i=b+284|0;switch(c[h>>2]|0){case 3:{c[i>>2]=33;d=0;break}case 2:{c[i>>2]=36;d=0;break}case 0:{if((c[b+476>>2]|0)==0?($Z(b)|0)<<24>>24==0:0){c[i>>2]=1;d=0}else f=7;break}default:f=7}a:do if((f|0)==7){c[h>>2]=1;f=b+24|0;k=c[f>>2]|0;g=b+296|0;c[g>>2]=k;l=b+28|0;j=(c[l>>2]|0)+d|0;c[l>>2]=j;c[b+40>>2]=j;l=b+36|0;c[l>>2]=(c[l>>2]|0)+d;a[b+484>>0]=e;d=b+280|0;j=tb[c[d>>2]&127](b,k,j,f)|0;c[i>>2]=j;if(j|0){c[b+292>>2]=c[b+288>>2];c[d>>2]=66;d=0;break}switch(c[h>>2]|0){case 3:{d=2;break}case 1:case 0:{if(!e)d=1;else{c[h>>2]=2;d=1;break a}break}default:d=1}l=c[b+144>>2]|0;xb[c[l+52>>2]&31](l,c[g>>2]|0,c[f>>2]|0,b+408|0);c[g>>2]=c[f>>2]}while(0);return d|0}function d_(){var a=0;a=Ya(0)|0;T4(((a|0)==-1&1)+a|0);return U4()|0}function e_(a){a=a|0;return c[a+284>>2]|0}function f_(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=a+288|0;d=c[b>>2]|0;e=a+408|0;if(d|0?(f=a+296|0,g=c[f>>2]|0,d>>>0>=g>>>0):0){a=c[a+144>>2]|0;xb[c[a+52>>2]&31](a,g,d,e);c[f>>2]=c[b>>2]}return (c[e>>2]|0)+1|0}function g_(a){a=a|0;if((a+-1|0)>>>0<40)a=c[56636+(a<<2)>>2]|0;else a=0;return a|0}function h_(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;do if((b|0)>=0){if((b|0)<128){a[c>>0]=b;d=1;break}h=c+1|0;d=b>>>6;e=(b&63|128)&255;if((b|0)<2048){a[c>>0]=d|192;a[h>>0]=e;d=2;break}f=b>>>12;g=c+2|0;d=(d&63|128)&255;if((b|0)<65536){a[c>>0]=f|224;a[h>>0]=d;a[g>>0]=e;d=3;break}if((b|0)<1114112){a[c>>0]=b>>>18|240;a[h>>0]=f&63|128;a[g>>0]=d;a[c+3>>0]=e;d=4}else d=0}else d=0;while(0);return d|0}function i_(){return 1912}function j_(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;i=0;while(1){if((i|0)==368){i=0;break}a[e+i>>0]=a[56800+i>>0]|0;i=i+1|0}a:while(1){if((i|0)>=128){j=5;break}switch(a[56876+i>>0]|0){case 0:case 28:break;default:if((c[f+(i<<2)>>2]|0)!=(i|0)){e=0;break a}}i=i+1|0}b:do if((j|0)==5){t=e+376|0;m=e+888|0;n=e+76|0;l=0;while(1){if((l|0)>=256)break;o=c[f+(l<<2)>>2]|0;p=t+(l<<1)|0;q=m+(l<<2)|0;r=m+(l<<2)+1|0;s=n+l|0;do if((o|0)==-1){a[s>>0]=1;b[p>>1]=-1;a[q>>0]=1;a[r>>0]=0}else{if((o|0)<0){if((o|0)<-4){e=0;break b}a[s>>0]=3-o;a[q>>0]=0;b[p>>1]=0;break}if((o|0)<128){i=a[56876+o>>0]|0;switch(i<<24>>24){case 0:case 28:break;default:if((o|0)!=(l|0)){e=0;break b}}a[s>>0]=i;a[q>>0]=1;a[r>>0]=o;b[p>>1]=(o|0)==0?-1:o&65535;break}if((k_(o)|0)<0){a[s>>0]=0;b[p>>1]=-1;a[q>>0]=1;a[r>>0]=0;break}if((o|0)>65535){e=0;break b}i=o>>>8;j=o>>>5&7;k=1<<(o&31);if(!(c[57168+((d[143937+i>>0]<<3|j)<<2)>>2]&k))i=c[57168+((d[144193+i>>0]<<3|j)<<2)>>2]&k|0?26:28;else i=22;a[s>>0]=i;a[q>>0]=h_(o,r)|0;b[p>>1]=o}while(0);l=l+1|0}c[e+372>>2]=h;c[e+368>>2]=g;if(g|0){c[e+332>>2]=108;c[e+336>>2]=108;c[e+340>>2]=108;c[e+344>>2]=109;c[e+348>>2]=109;c[e+352>>2]=109;c[e+356>>2]=110;c[e+360>>2]=110;c[e+364>>2]=110}c[e+60>>2]=18;c[e+64>>2]=19}while(0);return e|0}function k_(b){b=b|0;var c=0;switch(b>>8|0){case 223:case 222:case 221:case 220:case 219:case 218:case 217:case 216:{b=-1;break}case 0:{if(!(a[56876+b>>0]|0))b=-1;else c=4;break}case 255:{if((b|1|0)==65535)b=-1;else c=4;break}default:c=4}return b|0}function l_(a,b){a=a|0;b=b|0;a=vb[c[a+368>>2]&127](c[a+372>>2]|0,b)|0;if(a>>>0>65535)a=0;else a=c[57168+(((d[144193+(a>>>8)>>0]|0)<<3|a>>>5&7)<<2)>>2]&1<<(a&31);return a|0}function m_(a,b){a=a|0;b=b|0;a=vb[c[a+368>>2]&127](c[a+372>>2]|0,b)|0;if(a>>>0>65535)a=0;else a=c[57168+(((d[143937+(a>>>8)>>0]|0)<<3|a>>>5&7)<<2)>>2]&1<<(a&31);return a|0}function n_(a,b){a=a|0;b=b|0;a=vb[c[a+368>>2]&127](c[a+372>>2]|0,b)|0;if(a>>>0>65535)a=1;else a=(k_(a)|0)<0;return a&1|0}function o_(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;q=l;l=l+16|0;m=q;n=b+368|0;o=b+888|0;p=b+372|0;k=b+76|0;a:while(1){j=c[e>>2]|0;if((j|0)==(f|0))break;r=d[j>>0]|0;i=o+(r<<2)+1|0;r=a[o+(r<<2)>>0]|0;b=r<<24>>24;if(!(r<<24>>24)){b=h_(vb[c[n>>2]&127](c[p>>2]|0,j)|0,m)|0;if((b|0)>(h-(c[g>>2]|0)|0))break;j=c[e>>2]|0;i=m;j=j+((d[k+(d[j>>0]|0)>>0]|0)+-3)|0}else{if((b|0)>(h-(c[g>>2]|0)|0))break;j=j+1|0}c[e>>2]=j;while(1){j=a[i>>0]|0;r=c[g>>2]|0;c[g>>2]=r+1;a[r>>0]=j;b=b+-1|0;if(!b)continue a;else i=i+1|0}}l=q;return}function p_(a,e,f,g,h){a=a|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0;l=a+376|0;m=a+368|0;n=a+372|0;k=a+76|0;while(1){i=c[e>>2]|0;if((i|0)==(f|0))break;if((c[g>>2]|0)==(h|0))break;a=b[l+((d[i>>0]|0)<<1)>>1]|0;if(!(a<<16>>16)){a=(vb[c[m>>2]&127](c[n>>2]|0,i)|0)&65535;i=c[e>>2]|0;j=(d[k+(d[i>>0]|0)>>0]|0)+-3|0}else j=1;c[e>>2]=i+j;j=c[g>>2]|0;c[g>>2]=j+2;b[j>>1]=a}return}function q_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;a:do if((e|0)==(f|0))h=-4;else{q=b+76|0;i=e+1|0;l=b+332|0;m=f;h=(i|0)==(f|0);n=b+340|0;o=b+336|0;k=e+2|0;j=m-e|0;do switch(a[q+(d[e>>0]|0)>>0]|0){case 12:{h=S_(12,b,i,f,g)|0;break a}case 13:{h=S_(13,b,i,f,g)|0;break a}case 2:{if(h){h=-1;break a}switch(a[q+(d[i>>0]|0)>>0]|0){case 16:{h=T_(b,k,f,g)|0;break a}case 15:{h=O_(b,k,f,g)|0;break a}case 7:case 6:case 5:case 29:case 24:case 22:{c[g>>2]=e;h=29;break a}default:{c[g>>2]=i;h=0;break a}}}case 9:{if(h){c[g>>2]=f;h=-15;break a}else p=13;break}case 10:case 21:{p=13;break}case 30:{h=I_(b,i,f,g)|0;break a}case 35:{c[g>>2]=i;h=38;break a}case 20:{c[g>>2]=i;h=25;break a}case 4:{if(h){h=-26;break a}if((a[i>>0]|0)==93){if((k|0)==(f|0)){h=-1;break a}if((a[k>>0]|0)==62){c[g>>2]=e+3;h=34;break a}}c[g>>2]=i;h=26;break a}case 31:{c[g>>2]=i;h=23;break a}case 32:{if(h){h=-24;break a}switch(a[q+(d[i>>0]|0)>>0]|0){case 33:{c[g>>2]=k;h=36;break a}case 15:{c[g>>2]=k;h=35;break a}case 34:{c[g>>2]=k;h=37;break a}case 32:case 36:case 35:case 11:case 21:case 10:case 9:{c[g>>2]=i;h=24;break a}default:{c[g>>2]=i;h=0;break a}}}case 36:{c[g>>2]=i;h=21;break a}case 11:{c[g>>2]=i;h=17;break a}case 19:{h=U_(b,i,f,g)|0;break a}case 5:{if((j|0)<2){h=-2;break a}if(!(vb[c[b+344>>2]&127](b,e)|0))if(!(vb[c[l>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else{h=19;i=k}else{h=18;i=k}break}case 6:{if((j|0)<3){h=-2;break a}i=e+3|0;if(!(vb[c[b+348>>2]&127](b,e)|0))if(!(vb[c[o>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=19;else h=18;break}case 7:{if((j|0)<4){h=-2;break a}i=e+4|0;if(!(vb[c[b+352>>2]&127](b,e)|0))if(!(vb[c[n>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=19;else h=18;break}case 24:case 22:{h=18;break}case 23:case 27:case 26:case 25:{h=19;break}default:{c[g>>2]=e;h=0;break a}}while(0);if((p|0)==13){b:while(1){h=e;e=e+1|0;if((e|0)==(f|0)){p=17;break}switch(a[q+(d[e>>0]|0)>>0]|0){case 10:case 21:{p=13;continue b}case 9:break;default:{p=16;break b}}if((h+2|0)==(f|0)){p=16;break}else p=13}if((p|0)==16){c[g>>2]=e;h=15;break}else if((p|0)==17){c[g>>2]=f;h=15;break}}c:while(1){if((i|0)==(f|0)){p=96;break}j=i+1|0;e=m-i|0;switch(a[q+(d[i>>0]|0)>>0]|0){case 27:case 26:case 25:case 24:case 22:{p=h;i=j;h=p;continue c}case 29:{p=54;break c}case 10:case 9:case 21:case 30:case 20:case 36:case 35:case 32:case 11:{p=67;break c}case 34:{p=86;break c}case 33:{p=89;break c}case 15:{p=92;break c}case 5:{if((e|0)<2){h=-2;break a}if(!(vb[c[l>>2]&127](b,i)|0)){p=57;break c}p=h;i=i+2|0;h=p;continue c}case 6:{if((e|0)<3){h=-2;break a}if(!(vb[c[o>>2]&127](b,i)|0)){p=61;break c}p=h;i=i+3|0;h=p;continue c}case 7:{if((e|0)<4){h=-2;break a}if(!(vb[c[n>>2]&127](b,i)|0)){p=65;break c}p=h;i=i+4|0;h=p;continue c}case 23:{switch(h&63){case 18:break;case 41:{h=19;i=j;continue c}default:{p=h;i=j;h=p;continue c}}if((j|0)==(f|0)){h=-1;break a}h=m-j|0;switch(a[q+(d[j>>0]|0)>>0]|0){case 29:{p=71;break c}case 27:case 26:case 25:case 24:case 22:{h=41;i=i+2|0;continue c}case 5:{if((h|0)<2){h=-2;break a}if(!(vb[c[l>>2]&127](b,j)|0)){p=75;break c}h=41;i=i+3|0;continue c}case 6:{if((h|0)<3){h=-2;break a}if(!(vb[c[o>>2]&127](b,j)|0)){p=79;break c}h=41;i=i+4|0;continue c}case 7:{if((h|0)<4){h=-2;break a}if(!(vb[c[n>>2]&127](b,j)|0)){p=83;break c}h=41;i=i+5|0;continue c}default:{h=19;i=j;continue c}}}default:{p=95;break c}}}switch(p|0){case 54:{c[g>>2]=i;h=0;break a}case 57:{c[g>>2]=i;h=0;break a}case 61:{c[g>>2]=i;h=0;break a}case 65:{c[g>>2]=i;h=0;break a}case 67:{c[g>>2]=i;break a}case 71:{c[g>>2]=j;h=0;break a}case 75:{c[g>>2]=j;h=0;break a}case 79:{c[g>>2]=j;h=0;break a}case 83:{c[g>>2]=j;h=0;break a}case 86:if((h|0)==19){c[g>>2]=i;h=0;break a}else{c[g>>2]=j;h=32;break a}case 89:if((h|0)==19){c[g>>2]=i;h=0;break a}else{c[g>>2]=j;h=31;break a}case 92:if((h|0)==19){c[g>>2]=i;h=0;break a}else{c[g>>2]=j;h=30;break a}case 95:{c[g>>2]=i;h=0;break a}case 96:{h=0-h|0;break a}}}while(0);return h|0}function r_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a:do if((e|0)!=(f|0)){p=b+76|0;l=b+356|0;m=f;n=b+360|0;i=e+1|0;o=b+364|0;h=m-e|0;j=e+2|0;k=(i|0)==(f|0);b:do switch(a[p+(d[e>>0]|0)>>0]|0){case 2:{e=L_(b,i,f,g)|0;break a}case 3:{e=H_(b,i,f,g)|0;break a}case 9:{if(k){e=-3;break a}c[g>>2]=(a[p+(d[i>>0]|0)>>0]|0)==10?j:i;e=7;break a}case 10:{c[g>>2]=i;e=7;break a}case 4:{if(k){e=-5;break a}if((a[i>>0]|0)==93){if((j|0)==(f|0)){e=-5;break a}if((a[j>>0]|0)==62){c[g>>2]=j;e=0;break a}}break}case 5:{if((h|0)<2){e=-2;break a}if(!(vb[c[l>>2]&127](b,e)|0))i=j;else{c[g>>2]=e;e=0;break a}break}case 6:{if((h|0)<3){e=-2;break a}if(!(vb[c[n>>2]&127](b,e)|0)){i=e+3|0;break b}else{c[g>>2]=e;e=0;break a}}case 7:{if((h|0)<4){e=-2;break a}if(!(vb[c[o>>2]&127](b,e)|0)){i=e+4|0;break b}else{c[g>>2]=e;e=0;break a}}case 8:case 1:case 0:{c[g>>2]=e;e=0;break a}default:{}}while(0);c:while(1){if((i|0)==(f|0)){h=44;break}j=i+2|0;e=i+1|0;h=m-i|0;switch(a[p+(d[i>>0]|0)>>0]|0){case 10:case 9:case 8:case 1:case 0:case 2:case 3:{h=43;break c}case 5:{if((h|0)<2){h=29;break c}if(!(vb[c[l>>2]&127](b,i)|0)){i=j;continue c}else{h=29;break c}}case 6:{if((h|0)<3){h=32;break c}if(vb[c[n>>2]&127](b,i)|0){h=32;break c}i=i+3|0;continue c}case 7:{if((h|0)<4){h=36;break c}if(vb[c[o>>2]&127](b,i)|0){h=36;break c}i=i+4|0;continue c}case 4:{if((e|0)==(f|0)){h=43;break c}if((a[e>>0]|0)!=93){i=e;continue c}if((j|0)==(f|0)){h=43;break c}if((a[j>>0]|0)==62){h=42;break c}else{i=e;continue c}}default:{i=e;continue c}}}if((h|0)==29){c[g>>2]=i;e=6;break}else if((h|0)==32){c[g>>2]=i;e=6;break}else if((h|0)==36){c[g>>2]=i;e=6;break}else if((h|0)==42){c[g>>2]=j;e=0;break}else if((h|0)==43){c[g>>2]=i;e=6;break}else if((h|0)==44){c[g>>2]=f;e=6;break}}else e=-4;while(0);return e|0} +function s_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a:do if((e|0)!=(f|0)){p=b+76|0;l=b+356|0;m=f;n=b+360|0;i=e+1|0;o=b+364|0;h=m-e|0;j=(i|0)==(f|0);k=e+2|0;b:do switch(a[p+(d[e>>0]|0)>>0]|0){case 4:{if(j){e=-1;break a}if((a[i>>0]|0)==93){if((k|0)==(f|0)){e=-1;break a}if((a[k>>0]|0)==62){c[g>>2]=e+3;e=40;break a}}break}case 9:{if(j){e=-1;break a}c[g>>2]=(a[p+(d[i>>0]|0)>>0]|0)==10?k:i;e=7;break a}case 10:{c[g>>2]=i;e=7;break a}case 5:{if((h|0)<2){e=-2;break a}if(!(vb[c[l>>2]&127](b,e)|0))i=k;else{c[g>>2]=e;e=0;break a}break}case 6:{if((h|0)<3){e=-2;break a}if(!(vb[c[n>>2]&127](b,e)|0)){i=e+3|0;break b}else{c[g>>2]=e;e=0;break a}}case 7:{if((h|0)<4){e=-2;break a}if(!(vb[c[o>>2]&127](b,e)|0)){i=e+4|0;break b}else{c[g>>2]=e;e=0;break a}}case 8:case 1:case 0:{c[g>>2]=e;e=0;break a}default:{}}while(0);c:while(1){if((i|0)==(f|0)){h=36;break}e=m-i|0;switch(a[p+(d[i>>0]|0)>>0]|0){case 4:case 10:case 9:case 8:case 1:case 0:{h=34;break c}case 5:{if((e|0)<2){h=27;break c}if(!(vb[c[l>>2]&127](b,i)|0))e=2;else{h=27;break c}break}case 6:{if((e|0)<3){h=30;break c}if(!(vb[c[n>>2]&127](b,i)|0))e=3;else{h=30;break c}break}case 7:{if((e|0)<4){h=33;break c}if(!(vb[c[o>>2]&127](b,i)|0))e=4;else{h=33;break c}break}default:e=1}i=i+e|0}if((h|0)==27){c[g>>2]=i;e=6;break}else if((h|0)==30){c[g>>2]=i;e=6;break}else if((h|0)==33){c[g>>2]=i;e=6;break}else if((h|0)==34){c[g>>2]=i;e=6;break}else if((h|0)==36){c[g>>2]=f;e=6;break}}else e=-4;while(0);return e|0}function t_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;o=b+76|0;p=f;q=b+356|0;r=b+360|0;s=b+364|0;n=0;a:while(1){if((e|0)==(f|0)){e=-1;break}h=e+1|0;i=e+2|0;j=(i|0)==(f|0);k=e+3|0;l=p-e|0;m=(h|0)==(f|0);switch(a[o+(d[e>>0]|0)>>0]|0){case 8:case 1:case 0:{t=14;break a}case 5:{if((l|0)<2){e=-2;break a}if(!(vb[c[q>>2]&127](b,e)|0)){m=n;e=i;n=m;continue a}else{t=6;break a}}case 6:{if((l|0)<3){e=-2;break a}if(!(vb[c[r>>2]&127](b,e)|0)){m=n;e=k;n=m;continue a}else{t=9;break a}}case 7:{if((l|0)<4){e=-2;break a}if(vb[c[s>>2]&127](b,e)|0){t=12;break a}m=n;e=e+4|0;n=m;continue a}case 2:{if(m){e=-1;break a}if((a[h>>0]|0)!=33){m=n;e=h;n=m;continue a}if(j){e=-1;break a}e=(a[i>>0]|0)==91;n=(e&1)+n|0;e=e?k:i;continue a}case 4:{if(m){e=-1;break a}if((a[h>>0]|0)!=93){m=n;e=h;n=m;continue a}if(j){e=-1;break a}if((a[i>>0]|0)!=62){m=n;e=i;n=m;continue a}if(!n){t=24;break a}n=n+-1|0;e=k;continue a}default:{m=n;e=h;n=m;continue a}}}if((t|0)==6){c[g>>2]=e;e=0}else if((t|0)==9){c[g>>2]=e;e=0}else if((t|0)==12){c[g>>2]=e;e=0}else if((t|0)==14){c[g>>2]=e;e=0}else if((t|0)==24){c[g>>2]=k;e=42}return e|0}function u_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;do if((e|0)!=(f|0)){j=b+76|0;h=e;a:while(1){if((h|0)==(f|0)){k=22;break}i=h+1|0;switch(a[j+(d[h>>0]|0)>>0]|0){case 3:{k=8;break a}case 2:{k=11;break a}case 10:{k=12;break a}case 9:{k=15;break a}case 21:{k=19;break a}case 5:{h=h+2|0;continue a}case 6:{h=h+3|0;continue a}case 7:{h=h+4|0;continue a}default:{h=i;continue a}}}if((k|0)==8)if((h|0)==(e|0)){h=H_(b,i,f,g)|0;break}else{c[g>>2]=h;h=6;break}else if((k|0)==11){c[g>>2]=h;h=0;break}else if((k|0)==12)if((h|0)==(e|0)){c[g>>2]=i;h=7;break}else{c[g>>2]=h;h=6;break}else if((k|0)==15){if((h|0)!=(e|0)){c[g>>2]=h;h=6;break}if((i|0)==(f|0)){h=-3;break}c[g>>2]=(a[j+(d[i>>0]|0)>>0]|0)==10?e+2|0:i;h=7;break}else if((k|0)==19)if((h|0)==(e|0)){c[g>>2]=i;h=39;break}else{c[g>>2]=h;h=6;break}else if((k|0)==22){c[g>>2]=f;h=6;break}}else h=-4;while(0);return h|0}function v_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;do if((e|0)!=(f|0)){j=b+76|0;h=e;a:while(1){if((h|0)==(f|0)){k=21;break}i=h+1|0;switch(a[j+(d[h>>0]|0)>>0]|0){case 3:{k=8;break a}case 30:{k=11;break a}case 10:{k=14;break a}case 9:{k=17;break a}case 5:{h=h+2|0;continue a}case 6:{h=h+3|0;continue a}case 7:{h=h+4|0;continue a}default:{h=i;continue a}}}if((k|0)==8)if((h|0)==(e|0)){h=H_(b,i,f,g)|0;break}else{c[g>>2]=h;h=6;break}else if((k|0)==11)if((h|0)==(e|0)){h=I_(b,i,f,g)|0;h=(h|0)==22?0:h;break}else{c[g>>2]=h;h=6;break}else if((k|0)==14)if((h|0)==(e|0)){c[g>>2]=i;h=7;break}else{c[g>>2]=h;h=6;break}else if((k|0)==17){if((h|0)!=(e|0)){c[g>>2]=h;h=6;break}if((i|0)==(f|0)){h=-3;break}c[g>>2]=(a[j+(d[i>>0]|0)>>0]|0)==10?e+2|0:i;h=7;break}else if((k|0)==21){c[g>>2]=f;h=6;break}}else h=-4;while(0);return h|0}function w_(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;g=b+76|0;a:while(1){f=a[c>>0]|0;b=d+1|0;e=c+1|0;switch(a[g+(f&255)>>0]|0){case 7:{h=3;break}case 6:{b=f;h=5;break}case 5:{b=f;break}case 27:case 26:case 25:case 24:case 23:case 22:case 29:if((a[d>>0]|0)==f<<24>>24){d=b;c=e;continue a}else{b=0;break a}default:{h=10;break a}}if((h|0)==3){h=0;if(f<<24>>24!=(a[d>>0]|0)){b=0;break}d=b;c=e;b=a[e>>0]|0;h=5}if((h|0)==5){h=0;e=c+1|0;if(b<<24>>24!=(a[d>>0]|0)){b=0;break}d=d+1|0;c=e;b=a[e>>0]|0}if(b<<24>>24!=(a[d>>0]|0)){b=0;break}if((a[c+1>>0]|0)==(a[d+1>>0]|0)){d=d+2|0;c=c+2|0}else{b=0;break}}b:do if((h|0)==10){b=a[d>>0]|0;if(f<<24>>24==b<<24>>24)b=1;else{switch(a[g+(b&255)>>0]|0){case 27:case 26:case 25:case 24:case 23:case 22:case 29:case 7:case 6:case 5:{b=0;break b}default:{}}b=1}}while(0);return b|0}function x_(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;b=c;while(1){c=a[e>>0]|0;f=(b|0)==(d|0);if(!(c<<24>>24)){g=6;break}if(f){b=0;break}if((a[b>>0]|0)!=c<<24>>24){b=0;break}e=e+1|0;b=b+1|0}if((g|0)==6)b=f&1;return b|0}function y_(b,c){b=b|0;c=c|0;var e=0,f=0;f=b+76|0;b=c;a:while(1){switch(a[f+(d[b>>0]|0)>>0]|0){case 5:{e=2;break}case 6:{e=3;break}case 7:{e=4;break}case 27:case 26:case 25:case 24:case 23:case 22:case 29:{e=1;break}default:break a}b=b+e|0}return b-c|0}function z_(b,c){b=b|0;c=c|0;b=b+76|0;a:while(1){switch(a[b+(d[c>>0]|0)>>0]|0){case 21:case 9:case 10:break;default:break a}c=c+1|0}return c|0}function A_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;w=b+76|0;u=0;v=0;b=1;a:while(1){h=e+1|0;s=a[h>>0]|0;t=v+1|0;i=(b|0)!=2;j=(b|0)==2;k=e+2|0;l=(v|0)<(f|0);m=(b|0)==1;n=g+(v<<4)+12|0;o=g+(v<<4)+4|0;p=g+(v<<4)|0;q=(b|0)==0;r=g+(v<<4)+8|0;do switch(a[w+(s&255)>>0]|0){case 5:{if(!q){r=b;s=v;t=u;e=k;b=r;v=s;u=t;continue a}if(!l){s=v;t=u;b=1;e=k;v=s;u=t;continue a}c[p>>2]=h;a[n>>0]=1;s=v;t=u;b=1;e=k;v=s;u=t;continue a}case 6:{if(q&l){c[p>>2]=h;a[n>>0]=1;b=1}else b=q?1:b;s=v;t=u;e=e+3|0;v=s;u=t;continue a}case 7:{if(q&l){c[p>>2]=h;a[n>>0]=1;b=1}else b=q?1:b;s=v;t=u;e=e+4|0;v=s;u=t;continue a}case 24:case 22:case 29:{if(!q){r=b;s=v;t=u;e=h;b=r;v=s;u=t;continue a}if(!l){s=v;t=u;b=1;e=h;v=s;u=t;continue a}c[p>>2]=h;a[n>>0]=1;s=v;t=u;b=1;e=h;v=s;u=t;continue a}case 12:{if(i){if(!l){t=v;u=12;b=2;e=h;v=t;continue a}c[o>>2]=k;t=v;u=12;b=2;e=h;v=t;continue a}if((u|0)!=12){s=v;t=u;b=2;e=h;v=s;u=t;continue a}if(!l){u=12;v=t;b=0;e=h;continue a}c[r>>2]=h;u=12;v=t;b=0;e=h;continue a}case 13:{if(i){if(!l){t=v;u=13;b=2;e=h;v=t;continue a}c[o>>2]=k;t=v;u=13;b=2;e=h;v=t;continue a}if((u|0)!=13){s=v;t=u;b=2;e=h;v=s;u=t;continue a}if(!l){u=13;v=t;b=0;e=h;continue a}c[r>>2]=h;u=13;v=t;b=0;e=h;continue a}case 3:{if(!l){r=b;s=v;t=u;e=h;b=r;v=s;u=t;continue a}a[n>>0]=0;r=b;s=v;t=u;e=h;b=r;v=s;u=t;continue a}case 21:{if(m){s=v;t=u;b=0;e=h;v=s;u=t;continue a}if(!j){r=b;s=v;t=u;e=h;b=r;v=s;u=t;continue a}if(!l){s=v;t=u;b=2;e=h;v=s;u=t;continue a}if(!(a[n>>0]|0)){s=v;t=u;b=2;e=h;v=s;u=t;continue a}if(((s<<24>>24==32?(h|0)!=(c[o>>2]|0):0)?(x=a[k>>0]|0,x<<24>>24!=32):0)?(d[w+(x&255)>>0]|0)!=(u|0):0){s=v;t=u;b=2;e=h;v=s;u=t;continue a}a[n>>0]=0;s=v;t=u;b=2;e=h;v=s;u=t;continue a}case 10:case 9:{if(m){s=v;t=u;b=0;e=h;v=s;u=t;continue a}if(!j){r=b;s=v;t=u;e=h;b=r;v=s;u=t;continue a}if(!l){s=v;t=u;b=2;e=h;v=s;u=t;continue a}a[n>>0]=0;s=v;t=u;b=2;e=h;v=s;u=t;continue a}case 17:case 11:if(i)break a;else{s=v;t=u;b=2;e=h;v=s;u=t;continue a}default:{r=b;s=v;t=u;e=h;b=r;v=s;u=t;continue a}}while(0)}return v|0}function B_(b,c){b=b|0;c=c|0;var d=0,e=0;b=c+2|0;d=a[b>>0]|0;a:do if(d<<24>>24==120){d=c+3|0;b=0;while(1){b:while(1){e=a[d>>0]|0;c=e<<24>>24;if(e<<24>>24==59){e=14;break a}switch(c|0){case 57:case 56:case 55:case 54:case 53:case 52:case 51:case 50:case 49:case 48:{e=7;break b}case 70:case 69:case 68:case 67:case 66:case 65:{e=8;break b}case 102:case 101:case 100:case 99:case 98:case 97:{e=9;break b}default:{}}d=d+1|0}if((e|0)==7){e=0;b=c+-48|b<<4}else if((e|0)==8){e=0;b=(b<<4)+-55+c|0}else if((e|0)==9){e=0;b=(b<<4)+-87+c|0}if((b|0)<1114112)d=d+1|0;else{b=-1;break}}}else{c=b;b=0;while(1){if(d<<24>>24==59){e=14;break a}b=(b*10|0)+-48+(d<<24>>24)|0;d=c+1|0;if((b|0)>=1114112){b=-1;break a}c=d;d=a[d>>0]|0}}while(0);if((e|0)==14)b=k_(b)|0;return b|0}function C_(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=c+1|0;f=c+2|0;a:do switch(d-c|0){case 2:{if((a[e>>0]|0)==116){b=a[c>>0]|0;b=b<<24>>24==108?60:b<<24>>24==103?62:0}else g=14;break}case 3:{if(((a[c>>0]|0)==97?(a[e>>0]|0)==109:0)?(a[f>>0]|0)==112:0)b=38;else g=14;break}case 4:{b=c+3|0;switch(a[c>>0]|0){case 113:{if((a[e>>0]|0)!=117){g=14;break a}if((a[f>>0]|0)!=111){g=14;break a}if((a[b>>0]|0)==116){b=34;break a}else{g=14;break a}}case 97:{if((a[e>>0]|0)!=112){g=14;break a}if((a[f>>0]|0)!=111){g=14;break a}if((a[b>>0]|0)==115){b=39;break a}else{g=14;break a}}default:{g=14;break a}}}default:g=14}while(0);if((g|0)==14)b=0;return b|0}function D_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;h=b+76|0;i=g+4|0;b=e;while(1){if(b>>>0>=f>>>0)break;e=b+1|0;switch(a[h+(d[b>>0]|0)>>0]|0){case 5:{b=b+2|0;break}case 6:{b=b+3|0;break}case 7:{b=b+4|0;break}case 10:{c[i>>2]=-1;c[g>>2]=(c[g>>2]|0)+1;b=e;break}case 9:{c[g>>2]=(c[g>>2]|0)+1;if((e|0)==(f|0))b=f;else b=(a[h+(d[e>>0]|0)>>0]|0)==10?b+2|0:e;c[i>>2]=-1;break}default:b=e}c[i>>2]=(c[i>>2]|0)+1}return}function E_(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;h=e+-1|0;g=b+76|0;a:while(1){d=d+1|0;if((d|0)==(h|0)){d=1;break}b=a[d>>0]|0;e=b<<24>>24;switch(a[g+(b&255)>>0]|0){case 23:case 19:case 30:case 33:case 16:case 18:case 10:case 9:case 15:case 14:case 17:case 35:case 34:case 32:case 31:case 13:case 27:case 24:case 25:continue a;case 21:if(b<<24>>24==9){i=7;break a}else continue a;case 22:case 26:{if(b<<24>>24>=0)continue a;break}default:{}}switch(e|0){case 64:case 36:break;default:{i=7;break a}}}if((i|0)==7){c[f>>2]=d;d=0}return d|0}function F_(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0;i=h;while(1){j=c[e>>2]|0;if((j|0)==(f|0))break;k=d[j>>0]|0;b=c[g>>2]|0;if(!(k&128)){if((b|0)==(h|0))break;c[e>>2]=j+1;j=a[j>>0]|0;k=c[g>>2]|0;c[g>>2]=k+1;a[k>>0]=j;continue}else{if((i-b|0)<2)break;c[g>>2]=b+1;a[b>>0]=k>>>6|192;j=c[g>>2]|0;c[g>>2]=j+1;a[j>>0]=k&63|128;c[e>>2]=(c[e>>2]|0)+1;continue}}return}function G_(a,e,f,g,h){a=a|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;while(1){a=c[e>>2]|0;if((a|0)==(f|0))break;if((c[g>>2]|0)==(h|0))break;c[e>>2]=a+1;i=d[a>>0]|0;a=c[g>>2]|0;c[g>>2]=a+2;b[a>>1]=i}return}function H_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;a:do if((e|0)!=(f|0)){n=b+76|0;m=f;h=m-e|0;i=e+1|0;b:do switch(a[n+(d[e>>0]|0)>>0]|0){case 29:{c[g>>2]=e;e=0;break a}case 24:case 22:break;case 5:{if((h|0)<2){e=-2;break a}if(!(vb[c[b+344>>2]&127](b,e)|0)){c[g>>2]=e;e=0;break a}else{i=e+2|0;break b}}case 6:{if((h|0)<3){e=-2;break a}if(!(vb[c[b+348>>2]&127](b,e)|0)){c[g>>2]=e;e=0;break a}else{i=e+3|0;break b}}case 7:{if((h|0)<4){e=-2;break a}if(!(vb[c[b+352>>2]&127](b,e)|0)){c[g>>2]=e;e=0;break a}else{i=e+4|0;break b}}case 19:{e=J_(b,i,f,g)|0;break a}default:{c[g>>2]=e;e=0;break a}}while(0);h=b+332|0;j=b+336|0;k=b+340|0;c:while(1){if((i|0)==(f|0)){e=-1;break a}l=i+1|0;e=m-i|0;switch(a[n+(d[i>>0]|0)>>0]|0){case 27:case 26:case 25:case 24:case 22:{i=l;continue c}case 29:{h=21;break c}case 18:{h=34;break c}case 5:{if((e|0)<2){e=-2;break a}if(!(vb[c[h>>2]&127](b,i)|0)){h=24;break c}i=i+2|0;continue c}case 6:{if((e|0)<3){e=-2;break a}if(!(vb[c[j>>2]&127](b,i)|0)){h=28;break c}i=i+3|0;continue c}case 7:{if((e|0)<4){e=-2;break a}if(!(vb[c[k>>2]&127](b,i)|0)){h=32;break c}i=i+4|0;continue c}default:{h=35;break c}}}if((h|0)==21){c[g>>2]=i;e=0;break}else if((h|0)==24){c[g>>2]=i;e=0;break}else if((h|0)==28){c[g>>2]=i;e=0;break}else if((h|0)==32){c[g>>2]=i;e=0;break}else if((h|0)==34){c[g>>2]=l;e=9;break}else if((h|0)==35){c[g>>2]=i;e=0;break}}else e=-1;while(0);return e|0}function I_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;a:do if((e|0)!=(f|0)){o=b+76|0;n=f;h=n-e|0;switch(a[o+(d[e>>0]|0)>>0]|0){case 29:{c[g>>2]=e;h=0;break a}case 24:case 22:{h=1;break}case 5:{if((h|0)<2){h=-2;break a}if(!(vb[c[b+344>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=2;break}case 6:{if((h|0)<3){h=-2;break a}if(!(vb[c[b+348>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=3;break}case 7:{if((h|0)<4){h=-2;break a}if(!(vb[c[b+352>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=4;break}case 30:case 9:case 10:case 21:{c[g>>2]=e;h=22;break a}default:{c[g>>2]=e;h=0;break a}}k=b+332|0;l=b+336|0;m=b+340|0;i=e+h|0;b:while(1){if((i|0)==(f|0)){h=-1;break a}j=i+1|0;h=n-i|0;switch(a[o+(d[i>>0]|0)>>0]|0){case 27:case 26:case 25:case 24:case 22:{i=j;continue b}case 29:{e=18;break b}case 18:{e=31;break b}case 5:{if((h|0)<2){h=-2;break a}if(!(vb[c[k>>2]&127](b,i)|0)){e=21;break b}i=i+2|0;continue b}case 6:{if((h|0)<3){h=-2;break a}if(!(vb[c[l>>2]&127](b,i)|0)){e=25;break b}i=i+3|0;continue b}case 7:{if((h|0)<4){h=-2;break a}if(!(vb[c[m>>2]&127](b,i)|0)){e=29;break b}i=i+4|0;continue b}default:{e=32;break b}}}if((e|0)==18){c[g>>2]=i;h=0;break}else if((e|0)==21){c[g>>2]=i;h=0;break}else if((e|0)==25){c[g>>2]=i;h=0;break}else if((e|0)==29){c[g>>2]=i;h=0;break}else if((e|0)==31){c[g>>2]=j;h=28;break}else if((e|0)==32){c[g>>2]=i;h=0;break}}else h=-1;while(0);return h|0}function J_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;a:do if((e|0)!=(f|0)){i=a[e>>0]|0;h=e+1|0;if(i<<24>>24==120){h=K_(b,h,f,g)|0;break}b=b+76|0;if((a[b+(i&255)>>0]|0)!=25){c[g>>2]=e;h=0;break}b:while(1){if((h|0)==(f|0)){h=-1;break a}e=h+1|0;switch(a[b+(d[h>>0]|0)>>0]|0){case 25:{h=e;break}case 18:{b=8;break b}default:{b=9;break b}}}if((b|0)==8){c[g>>2]=e;h=10;break}else if((b|0)==9){c[g>>2]=h;h=0;break}}else h=-1;while(0);return h|0}function K_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;a:do if((e|0)!=(f|0)){i=b+76|0;if((a[i+(d[e>>0]|0)>>0]&-2)<<24>>24!=24){c[g>>2]=e;b=0;break}b=e+1|0;b:while(1){if((b|0)==(f|0)){b=-1;break a}h=b+1|0;switch(a[i+(d[b>>0]|0)>>0]|0){case 24:case 25:{b=h;break}case 18:{e=7;break b}default:{e=8;break b}}}if((e|0)==7){c[g>>2]=h;b=10;break}else if((e|0)==8){c[g>>2]=b;b=0;break}}else b=-1;while(0);return b|0}function L_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;a:do if((e|0)!=(f|0)){r=b+76|0;n=b+344|0;o=f;h=e+1|0;p=b+352|0;q=b+348|0;i=o-e|0;b:do switch(a[r+(d[e>>0]|0)>>0]|0){case 29:{c[g>>2]=e;h=0;break a}case 24:case 22:break;case 5:{if((i|0)<2){h=-2;break a}if(!(vb[c[n>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else{h=e+2|0;break b}}case 6:{if((i|0)<3){h=-2;break a}if(!(vb[c[q>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else{h=e+3|0;break b}}case 7:{if((i|0)<4){h=-2;break a}if(!(vb[c[p>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else{h=e+4|0;break b}}case 16:{if((h|0)==(f|0)){h=-1;break a}e=e+2|0;switch(a[r+(d[h>>0]|0)>>0]|0){case 27:{h=M_(b,e,f,g)|0;break a}case 20:{h=N_(e,f,g)|0;break a}default:{c[g>>2]=h;h=0;break a}}}case 15:{h=O_(b,h,f,g)|0;break a}case 17:{h=P_(b,h,f,g)|0;break a}default:{c[g>>2]=e;h=0;break a}}while(0);k=b+332|0;l=b+336|0;m=b+340|0;i=0;c:while(1){if((h|0)==(f|0)){h=-1;break a}j=h+1|0;e=o-h|0;switch(a[r+(d[h>>0]|0)>>0]|0){case 27:case 26:case 25:case 24:case 22:{e=i;h=j;i=e;continue c}case 29:{s=27;break c}case 10:case 9:case 21:{h=j;s=59;break c}case 11:{s=76;break c}case 17:break c;case 5:{if((e|0)<2){h=-2;break a}if(!(vb[c[k>>2]&127](b,h)|0)){s=30;break c}j=i;h=h+2|0;i=j;continue c}case 6:{if((e|0)<3){h=-2;break a}if(!(vb[c[l>>2]&127](b,h)|0)){s=34;break c}j=i;h=h+3|0;i=j;continue c}case 7:{if((e|0)<4){h=-2;break a}if(!(vb[c[m>>2]&127](b,h)|0)){s=38;break c}j=i;h=h+4|0;i=j;continue c}case 23:{if(i|0){s=41;break c}if((j|0)==(f|0)){h=-1;break a}e=o-j|0;switch(a[r+(d[j>>0]|0)>>0]|0){case 29:{s=44;break c}case 24:case 22:{i=1;h=h+2|0;continue c}case 5:{if((e|0)<2){h=-2;break a}if(!(vb[c[n>>2]&127](b,j)|0)){s=48;break c}i=1;h=h+3|0;continue c}case 6:{if((e|0)<3){h=-2;break a}if(!(vb[c[q>>2]&127](b,j)|0)){s=52;break c}i=1;h=h+4|0;continue c}case 7:{if((e|0)<4){h=-2;break a}if(!(vb[c[p>>2]&127](b,j)|0)){s=56;break c}i=1;h=h+5|0;continue c}default:{s=58;break c}}}default:{s=81;break c}}}d:switch(s|0){case 27:{c[g>>2]=h;h=0;break a}case 30:{c[g>>2]=h;h=0;break a}case 34:{c[g>>2]=h;h=0;break a}case 38:{c[g>>2]=h;h=0;break a}case 41:{c[g>>2]=h;h=0;break a}case 44:{c[g>>2]=j;h=0;break a}case 48:{c[g>>2]=j;h=0;break a}case 52:{c[g>>2]=j;h=0;break a}case 56:{c[g>>2]=j;h=0;break a}case 58:{c[g>>2]=j;h=0;break a}case 59:{e:while(1){s=0;if((h|0)==(f|0)){h=-1;break a}e=h+1|0;switch(a[r+(d[h>>0]|0)>>0]|0){case 11:{s=76;break d}case 17:break d;case 10:case 9:case 21:{h=e;s=59;break}case 29:{s=61;break e}case 24:case 22:{h=e;break e}case 5:{s=62;break e}case 6:{s=66;break e}case 7:{s=70;break e}default:{s=74;break e}}}do if((s|0)==61){c[g>>2]=h;h=0;break a}else if((s|0)==62){if((o-h|0)<2){h=-2;break a}if(!(vb[c[n>>2]&127](b,h)|0)){c[g>>2]=h;h=0;break a}else{h=h+2|0;break}}else if((s|0)==66){if((o-h|0)<3){h=-2;break a}if(!(vb[c[q>>2]&127](b,h)|0)){c[g>>2]=h;h=0;break a}else{h=h+3|0;break}}else if((s|0)==70){if((o-h|0)<4){h=-2;break a}if(!(vb[c[p>>2]&127](b,h)|0)){c[g>>2]=h;h=0;break a}else{h=h+4|0;break}}else if((s|0)==74){c[g>>2]=h;h=0;break a}while(0);h=Q_(b,h,f,g)|0;break a}case 81:{c[g>>2]=h;h=0;break a}}if((s|0)==76){c[g>>2]=h+1;h=2;break}e=h+1|0;if((e|0)!=(f|0))if((a[e>>0]|0)==62){c[g>>2]=h+2;h=4;break}else{c[g>>2]=e;h=0;break}else h=-1}else h=-1;while(0);return h|0}function M_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;a:do if((e|0)!=(f|0)){if((a[e>>0]|0)!=45){c[g>>2]=e;e=0;break}l=b+76|0;m=f;i=b+356|0;j=b+360|0;k=b+364|0;n=e+1|0;b:while(1){if((n|0)==(f|0)){e=-1;break a}e=n+1|0;h=m-n|0;switch(a[l+(d[n>>0]|0)>>0]|0){case 8:case 1:case 0:{h=19;break b}case 5:{if((h|0)<2){e=-2;break a}if(vb[c[i>>2]&127](b,n)|0){h=9;break b}n=n+2|0;continue b}case 6:{if((h|0)<3){e=-2;break a}if(vb[c[j>>2]&127](b,n)|0){h=13;break b}n=n+3|0;continue b}case 7:{if((h|0)<4){e=-2;break a}if(vb[c[k>>2]&127](b,n)|0){h=17;break b}n=n+4|0;continue b}case 27:{if((e|0)==(f|0)){e=-1;break a}if((a[e>>0]|0)==45){h=22;break b}else{n=e;continue b}}default:{n=e;continue b}}}if((h|0)==9){c[g>>2]=n;e=0;break}else if((h|0)==13){c[g>>2]=n;e=0;break}else if((h|0)==17){c[g>>2]=n;e=0;break}else if((h|0)==19){c[g>>2]=n;e=0;break}else if((h|0)==22){e=n+2|0;if((e|0)==(f|0)){e=-1;break}if((a[e>>0]|0)==62){c[g>>2]=n+3;e=13;break}else{c[g>>2]=e;e=0;break}}}else e=-1;while(0);return e|0}function N_(b,d,e){b=b|0;d=d|0;e=e|0;if((d-b|0)<6)d=-1;else{d=0;while(1){if((d|0)>=6){d=8;break}if((a[b>>0]|0)!=(a[144449+d>>0]|0)){d=0;break}d=d+1|0;b=b+1|0}c[e>>2]=b}return d|0}function O_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+16|0;q=s;a:do if((e|0)==(f|0))h=-1;else{r=b+76|0;p=f;h=p-e|0;switch(a[r+(d[e>>0]|0)>>0]|0){case 29:{c[g>>2]=e;h=0;break a}case 24:case 22:{h=1;break}case 5:{if((h|0)<2){h=-2;break a}if(!(vb[c[b+344>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=2;break}case 6:{if((h|0)<3){h=-2;break a}if(!(vb[c[b+348>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=3;break}case 7:{if((h|0)<4){h=-2;break a}if(!(vb[c[b+352>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=4;break}default:{c[g>>2]=e;h=0;break a}}k=b+332|0;m=b+336|0;n=b+340|0;h=e+h|0;b:while(1){if((h|0)==(f|0)){h=-1;break a}j=h+1|0;i=p-h|0;switch(a[r+(d[h>>0]|0)>>0]|0){case 27:case 26:case 25:case 24:case 22:{h=j;continue b}case 29:{o=17;break b}case 10:case 9:case 21:{o=30;break b}case 15:{o=51;break b}case 5:{if((i|0)<2){h=-2;break a}if(!(vb[c[k>>2]&127](b,h)|0)){o=20;break b}h=h+2|0;continue b}case 6:{if((i|0)<3){h=-2;break a}if(!(vb[c[m>>2]&127](b,h)|0)){o=24;break b}h=h+3|0;continue b}case 7:{if((i|0)<4){h=-2;break a}if(!(vb[c[n>>2]&127](b,h)|0)){o=28;break b}h=h+4|0;continue b}default:break b}}if((o|0)==17){c[g>>2]=h;h=0;break}else if((o|0)==20){c[g>>2]=h;h=0;break}else if((o|0)==24){c[g>>2]=h;h=0;break}else if((o|0)==28){c[g>>2]=h;h=0;break}else if((o|0)==30){if(!(R_(e,h,q)|0)){c[g>>2]=h;h=0;break}k=b+356|0;m=b+360|0;n=b+364|0;c:while(1){if((j|0)==(f|0)){h=-1;break a}h=j+1|0;i=p-j|0;switch(a[r+(d[j>>0]|0)>>0]|0){case 8:case 1:case 0:{o=47;break c}case 5:{if((i|0)<2){h=-2;break a}if(vb[c[k>>2]&127](b,j)|0){o=37;break c}j=j+2|0;continue c}case 6:{if((i|0)<3){h=-2;break a}if(vb[c[m>>2]&127](b,j)|0){o=41;break c}j=j+3|0;continue c}case 7:{if((i|0)<4){h=-2;break a}if(vb[c[n>>2]&127](b,j)|0){o=45;break c}j=j+4|0;continue c}case 15:{if((h|0)==(f|0)){h=-1;break a}if((a[h>>0]|0)==62){o=50;break c}else{j=h;continue c}}default:{j=h;continue c}}}if((o|0)==37){c[g>>2]=j;h=0;break}else if((o|0)==41){c[g>>2]=j;h=0;break}else if((o|0)==45){c[g>>2]=j;h=0;break}else if((o|0)==47){c[g>>2]=j;h=0;break}else if((o|0)==50){c[g>>2]=j+2;h=c[q>>2]|0;break}}else if((o|0)==51){if(!(R_(e,h,q)|0)){c[g>>2]=h;h=0;break}if((j|0)==(f|0)){h=-1;break}if((a[j>>0]|0)==62){c[g>>2]=h+2;h=c[q>>2]|0;break}else h=j}c[g>>2]=h;h=0}while(0);l=s;return h|0}function P_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;a:do if((e|0)!=(f|0)){n=b+76|0;m=f;h=m-e|0;switch(a[n+(d[e>>0]|0)>>0]|0){case 29:{c[g>>2]=e;h=0;break a}case 24:case 22:{h=1;break}case 5:{if((h|0)<2){h=-2;break a}if(!(vb[c[b+344>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=2;break}case 6:{if((h|0)<3){h=-2;break a}if(!(vb[c[b+348>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=3;break}case 7:{if((h|0)<4){h=-2;break a}if(!(vb[c[b+352>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=4;break}default:{c[g>>2]=e;h=0;break a}}i=b+332|0;k=b+336|0;l=b+340|0;j=e+h|0;b:while(1){if((j|0)==(f|0)){h=-1;break a}h=j+1|0;e=m-j|0;switch(a[n+(d[j>>0]|0)>>0]|0){case 23:case 27:case 26:case 25:case 24:case 22:{j=h;continue b}case 29:{i=17;break b}case 10:case 9:case 21:{i=30;break b}case 11:{i=34;break b}case 5:{if((e|0)<2){h=-2;break a}if(!(vb[c[i>>2]&127](b,j)|0)){i=20;break b}j=j+2|0;continue b}case 6:{if((e|0)<3){h=-2;break a}if(!(vb[c[k>>2]&127](b,j)|0)){i=24;break b}j=j+3|0;continue b}case 7:{if((e|0)<4){h=-2;break a}if(!(vb[c[l>>2]&127](b,j)|0)){i=28;break b}j=j+4|0;continue b}default:{i=35;break b}}}if((i|0)==17){c[g>>2]=j;h=0;break}else if((i|0)==20){c[g>>2]=j;h=0;break}else if((i|0)==24){c[g>>2]=j;h=0;break}else if((i|0)==28){c[g>>2]=j;h=0;break}else if((i|0)==30){c:while(1){if((h|0)==(f|0)){h=-1;break a}e=h+1|0;switch(a[n+(d[h>>0]|0)>>0]|0){case 10:case 9:case 21:{h=e;i=30;break}case 11:{i=32;break c}default:{i=33;break c}}}if((i|0)==32){c[g>>2]=e;h=5;break}else if((i|0)==33){c[g>>2]=h;h=0;break}}else if((i|0)==34){c[g>>2]=h;h=5;break}else if((i|0)==35){c[g>>2]=j;h=0;break}}else h=-1;while(0);return h|0}function Q_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;z=l;l=l+16|0;x=z;c[x>>2]=e;s=b+76|0;t=b+344|0;u=b+348|0;v=f;w=b+352|0;m=b+332|0;n=b+336|0;o=b+340|0;p=b+356|0;q=b+360|0;r=b+364|0;i=0;a:while(1){if((e|0)==(f|0)){e=-1;break}h=v-e|0;j=e+1|0;b:do switch(a[s+(d[e>>0]|0)>>0]|0){case 29:{y=4;break a}case 27:case 26:case 25:case 24:case 22:{c[x>>2]=j;k=i;e=j;i=k;continue a}case 5:{if((h|0)<2){e=-2;break a}if(!(vb[c[m>>2]&127](b,e)|0)){y=8;break a}j=e+2|0;c[x>>2]=j;k=i;e=j;i=k;continue a}case 6:{if((h|0)<3){e=-2;break a}if(!(vb[c[n>>2]&127](b,e)|0)){y=12;break a}j=e+3|0;c[x>>2]=j;k=i;e=j;i=k;continue a}case 7:{if((h|0)<4){e=-2;break a}if(!(vb[c[o>>2]&127](b,e)|0)){y=16;break a}j=e+4|0;c[x>>2]=j;k=i;e=j;i=k;continue a}case 23:{if(i|0){y=19;break a}c[x>>2]=j;if((j|0)==(f|0)){e=-1;break a}h=v-j|0;switch(a[s+(d[j>>0]|0)>>0]|0){case 29:{y=22;break a}case 24:case 22:{k=e+2|0;c[x>>2]=k;i=1;e=k;continue a}case 5:{if((h|0)<2){e=-2;break a}if(!(vb[c[t>>2]&127](b,j)|0)){y=26;break a}k=e+3|0;c[x>>2]=k;i=1;e=k;continue a}case 6:{if((h|0)<3){e=-2;break a}if(!(vb[c[u>>2]&127](b,j)|0)){y=30;break a}k=e+4|0;c[x>>2]=k;i=1;e=k;continue a}case 7:{if((h|0)<4){e=-2;break a}if(!(vb[c[w>>2]&127](b,j)|0)){y=34;break a}k=e+5|0;c[x>>2]=k;i=1;e=k;continue a}default:{y=36;break a}}}case 10:case 9:case 21:while(1){e=e+1|0;c[x>>2]=e;if((e|0)==(f|0)){e=-1;break a}switch(a[s+(d[e>>0]|0)>>0]|0){case 14:break b;case 9:case 10:case 21:break;default:{y=39;break a}}}case 14:break;default:{y=92;break a}}while(0);while(1){h=e+1|0;c[x>>2]=h;if((h|0)==(f|0)){e=-1;break a}k=a[s+(d[h>>0]|0)>>0]|0;if((k|1)<<24>>24==13)break;switch(k<<24>>24){case 9:case 10:case 21:{e=h;break}default:{y=43;break a}}}e=e+2|0;c[x>>2]=e;c:while(1){if((e|0)==(f|0)){e=-1;break a}h=a[s+(d[e>>0]|0)>>0]|0;if(h<<24>>24==k<<24>>24)break;i=e+1|0;j=v-e|0;switch(h<<24>>24){case 8:case 1:case 0:{y=60;break a}case 2:{y=65;break a}case 5:{if((j|0)<2){e=-2;break a}if(vb[c[p>>2]&127](b,e)|0){y=50;break a}j=e+2|0;c[x>>2]=j;e=j;continue c}case 6:{if((j|0)<3){e=-2;break a}if(vb[c[q>>2]&127](b,e)|0){y=54;break a}j=e+3|0;c[x>>2]=j;e=j;continue c}case 7:{if((j|0)<4){e=-2;break a}if(vb[c[r>>2]&127](b,e)|0){y=58;break a}j=e+4|0;c[x>>2]=j;e=j;continue c}case 3:{e=H_(b,i,f,x)|0;if((e|0)<1){y=63;break a}e=c[x>>2]|0;continue c}default:{c[x>>2]=i;e=i;continue c}}}h=e+1|0;c[x>>2]=h;if((h|0)==(f|0)){e=-1;break}switch(a[s+(d[h>>0]|0)>>0]|0){case 11:{y=86;break a}case 17:{y=87;break a}case 10:case 9:case 21:{e=h;break}default:{y=69;break a}}d:while(1){h=e+1|0;c[x>>2]=h;if((h|0)==(f|0)){e=-1;break a}switch(a[s+(d[h>>0]|0)>>0]|0){case 29:{y=72;break a}case 11:{y=86;break a}case 17:{y=87;break a}case 10:case 9:case 21:{e=h;break}case 24:case 22:{y=73;break d}case 5:{y=74;break d}case 6:{y=78;break d}case 7:{y=82;break d}default:{y=91;break a}}}if((y|0)==73){y=0;e=e+2|0;c[x>>2]=e;i=0;continue}else if((y|0)==74){y=0;if((v-h|0)<2){e=-2;break}if(!(vb[c[t>>2]&127](b,h)|0)){y=76;break}e=e+3|0;c[x>>2]=e;i=0;continue}else if((y|0)==78){y=0;if((v-h|0)<3){e=-2;break}if(!(vb[c[u>>2]&127](b,h)|0)){y=80;break}e=e+4|0;c[x>>2]=e;i=0;continue}else if((y|0)==82){y=0;if((v-h|0)<4){e=-2;break}if(!(vb[c[w>>2]&127](b,h)|0)){y=84;break}e=e+5|0;c[x>>2]=e;i=0;continue}}switch(y|0){case 4:{c[g>>2]=e;e=0;break}case 8:{c[g>>2]=e;e=0;break}case 12:{c[g>>2]=e;e=0;break}case 16:{c[g>>2]=e;e=0;break}case 19:{c[g>>2]=e;e=0;break}case 22:{c[g>>2]=j;e=0;break}case 26:{c[g>>2]=j;e=0;break}case 30:{c[g>>2]=j;e=0;break}case 34:{c[g>>2]=j;e=0;break}case 36:{c[g>>2]=j;e=0;break}case 39:{c[g>>2]=e;e=0;break}case 43:{c[g>>2]=h;e=0;break}case 50:{c[g>>2]=e;e=0;break}case 54:{c[g>>2]=e;e=0;break}case 58:{c[g>>2]=e;e=0;break}case 60:{c[g>>2]=e;e=0;break}case 63:{if(!e){c[g>>2]=c[x>>2];e=0}break}case 65:{c[g>>2]=e;e=0;break}case 69:{c[g>>2]=h;e=0;break}case 72:{c[g>>2]=h;e=0;break}case 76:{c[g>>2]=h;e=0;break}case 80:{c[g>>2]=h;e=0;break}case 84:{c[g>>2]=h;e=0;break}case 86:{c[g>>2]=e+2;e=1;break}case 87:{e=h+1|0;c[x>>2]=e;if((e|0)!=(f|0))if((a[e>>0]|0)==62){c[g>>2]=h+2;e=3;break}else{c[g>>2]=e;e=0;break}else e=-1;break}case 91:{c[g>>2]=h;e=0;break}case 92:{c[g>>2]=e;e=0;break}}l=z;return e|0}function R_(b,d,e){b=b|0;d=d|0;e=e|0;c[e>>2]=11;a:do if((d-b|0)==3){switch(a[b>>0]|0){case 120:{d=0;break}case 88:{d=1;break}default:{d=1;break a}}switch(a[b+1>>0]|0){case 109:break;case 77:{d=1;break}default:{d=1;break a}}switch(a[b+2>>0]|0){case 108:break;case 76:{d=0;break a}default:{d=1;break a}}if(!d){c[e>>2]=12;d=1}else d=0}else d=1;while(0);return d|0}function S_(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;l=e+76|0;m=g;n=e+356|0;o=e+360|0;p=e+364|0;a:while(1){if((f|0)==(g|0)){f=-1;break}i=a[l+(d[f>>0]|0)>>0]|0;j=f+1|0;k=m-f|0;switch(i<<24>>24){case 8:case 1:case 0:{q=16;break a}case 5:{if((k|0)<2){f=-2;break a}if(vb[c[n>>2]&127](e,f)|0){q=6;break a}f=f+2|0;continue a}case 6:{if((k|0)<3){f=-2;break a}if(vb[c[o>>2]&127](e,f)|0){q=10;break a}f=f+3|0;continue a}case 7:{if((k|0)<4){f=-2;break a}if(vb[c[p>>2]&127](e,f)|0){q=14;break a}f=f+4|0;continue a}case 13:case 12:if((i&255|0)==(b|0)){q=18;break a}else{f=j;continue a}default:{f=j;continue a}}}b:do if((q|0)==6){c[h>>2]=f;f=0}else if((q|0)==10){c[h>>2]=f;f=0}else if((q|0)==14){c[h>>2]=f;f=0}else if((q|0)==16){c[h>>2]=f;f=0}else if((q|0)==18)if((j|0)==(g|0))f=-27;else{c[h>>2]=j;switch(a[l+(d[j>>0]|0)>>0]|0){case 20:case 30:case 11:case 10:case 9:case 21:{f=27;break b}default:{}}f=0}while(0);return f|0}function T_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;a:do if((e|0)==(f|0))h=-1;else{i=b+76|0;h=e+1|0;switch(a[i+(d[e>>0]|0)>>0]|0){case 27:{h=M_(b,h,f,g)|0;break a}case 20:{c[g>>2]=h;h=33;break a}case 24:case 22:{b:while(1){if((h|0)==(f|0)){h=-1;break a}b=h+1|0;switch(a[i+(d[h>>0]|0)>>0]|0){case 24:case 22:{h=b;break}case 30:{j=8;break b}case 10:case 9:case 21:break b;default:{j=12;break b}}}if((j|0)==12){c[g>>2]=h;h=0;break a}c:do if((j|0)==8){if((b|0)==(f|0)){h=-1;break a}switch(a[i+(d[b>>0]|0)>>0]|0){case 30:case 10:case 9:case 21:break;default:break c}c[g>>2]=h;h=0;break a}while(0);c[g>>2]=h;h=16;break a}default:{c[g>>2]=e;h=0;break a}}}while(0);return h|0}function U_(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;a:do if((e|0)!=(f|0)){n=b+76|0;m=f;h=m-e|0;switch(a[n+(d[e>>0]|0)>>0]|0){case 29:{c[g>>2]=e;h=0;break a}case 24:case 22:{h=1;break}case 5:{if((h|0)<2){h=-2;break a}if(!(vb[c[b+344>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=2;break}case 6:{if((h|0)<3){h=-2;break a}if(!(vb[c[b+348>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=3;break}case 7:{if((h|0)<4){h=-2;break a}if(!(vb[c[b+352>>2]&127](b,e)|0)){c[g>>2]=e;h=0;break a}else h=4;break}default:{c[g>>2]=e;h=0;break a}}j=b+332|0;k=b+336|0;l=b+340|0;i=e+h|0;b:while(1){if((i|0)==(f|0)){h=-20;break a}h=m-i|0;switch(a[n+(d[i>>0]|0)>>0]|0){case 29:{e=17;break b}case 36:case 30:case 11:case 32:case 21:case 10:case 9:{e=28;break b}case 27:case 26:case 25:case 24:case 22:{h=1;break}case 5:{if((h|0)<2){h=-2;break a}if(!(vb[c[j>>2]&127](b,i)|0)){e=20;break b}else h=2;break}case 6:{if((h|0)<3){h=-2;break a}if(!(vb[c[k>>2]&127](b,i)|0)){e=23;break b}else h=3;break}case 7:{if((h|0)<4){h=-2;break a}if(!(vb[c[l>>2]&127](b,i)|0)){e=26;break b}else h=4;break}default:{e=29;break b}}i=i+h|0}if((e|0)==17){c[g>>2]=i;h=0;break}else if((e|0)==20){c[g>>2]=i;h=0;break}else if((e|0)==23){c[g>>2]=i;h=0;break}else if((e|0)==26){c[g>>2]=i;h=0;break}else if((e|0)==28){c[g>>2]=i;h=20;break}else if((e|0)==29){c[g>>2]=i;h=0;break}}else h=-1;while(0);return h|0}function V_(){return 58448}function W_(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=c[d>>2]|0;b=c[f>>2]|0;g=g-b|0;a:do if((e-h|0)>(g|0)){e=h+g|0;while(1){if(e>>>0<=h>>>0)break a;g=e+-1|0;if((a[g>>0]&-64)<<24>>24==-128)e=g;else break}}while(0);while(1){if((h|0)==(e|0))break;a[b>>0]=a[h>>0]|0;h=h+1|0;b=b+1|0}c[d>>2]=e;c[f>>2]=b;return}function X_(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;p=d+76|0;d=c[g>>2]|0;i=c[e>>2]|0;a:while(1){if((i|0)==(f|0)|(d|0)==(h|0))break;j=a[i>>0]|0;k=i+1|0;l=d+2|0;m=i+3|0;n=j<<24>>24;o=i+2|0;switch(a[p+(j&255)>>0]|0){case 5:{b[d>>1]=a[k>>0]&63|n<<6&1984;d=l;i=o;continue a}case 6:{b[d>>1]=(a[k>>0]&63)<<6|n<<12|a[o>>0]&63;d=l;i=m;continue a}case 7:{if((l|0)==(h|0))break a;o=((a[k>>0]&63)<<12|n<<18&1835008|(a[o>>0]&63)<<6|a[m>>0]&63)+-65536|0;b[d>>1]=o>>>10|55296;b[l>>1]=o&1023|56320;d=d+4|0;i=i+4|0;continue a}default:{b[d>>1]=j<<24>>24;d=l;i=k;continue a}}}c[e>>2]=i;c[g>>2]=d;return}function Y_(a,b){a=a|0;b=b|0;a=d[b>>0]|0;b=d[b+1>>0]|0;return 1<<(b&31)&c[57168+(((d[144193+(a>>>2&7)>>0]|0)<<3|a<<1&6|b>>>5&1)<<2)>>2]|0}function Z_(b,e){b=b|0;e=e|0;var f=0;f=d[e+1>>0]|0;b=d[e+2>>0]|0;return 1<<(b&31)&c[57168+(((d[144193+(f>>>2&15|a[e>>0]<<4&255)>>0]|0)<<3|f<<1&6|b>>>5&1)<<2)>>2]|0}function __(a,b){a=a|0;b=b|0;return 0}function $_(a,b){a=a|0;b=b|0;a=d[b>>0]|0;b=d[b+1>>0]|0;return 1<<(b&31)&c[57168+(((d[143937+(a>>>2&7)>>0]|0)<<3|a<<1&6|b>>>5&1)<<2)>>2]|0}function a$(b,e){b=b|0;e=e|0;var f=0;f=d[e+1>>0]|0;b=d[e+2>>0]|0;return 1<<(b&31)&c[57168+(((d[143937+(f>>>2&15|a[e>>0]<<4&255)>>0]|0)<<3|f<<1&6|b>>>5&1)<<2)>>2]|0}function b$(a,b){a=a|0;b=b|0;if((d[b>>0]|0)<194)a=1;else{a=d[b+1>>0]|0;a=(a&128|0)==0|(a&192|0)==192}return a&1|0}function c$(b,c){b=b|0;c=c|0;var d=0,e=0,f=0;d=a[c+2>>0]|0;e=d&255;do if(!(e&128))b=1;else{f=a[c>>0]|0;b=c+1|0;if(f<<24>>24==-17?(a[b>>0]|0)==-65:0)if((d&255)>189){b=1;break}else{b=191;d=-65;c=0}else{if((e&192|0)==192){b=1;break}d=a[b>>0]|0;b=d&255;c=(b&192|0)==192;if(f<<24>>24==-32){b=(d&255)<160|c;break}}b=(b&128|0)==0|(f<<24>>24==-19?(d&255)>159:c)}while(0);return b&1|0}function d$(b,c){b=b|0;c=c|0;var e=0,f=0;f=d[c+3>>0]|0;do if(!((f&128|0)==0|(f&192|0)==192)?(f=d[c+2>>0]|0,!((f&128|0)==0|(f&192|0)==192)):0){f=a[c>>0]|0;b=a[c+1>>0]|0;c=b&255;e=(c&192|0)==192;if(f<<24>>24==-16){b=(b&255)<144|e;break}else{b=(c&128|0)==0|(f<<24>>24==-12?(b&255)>143:e);break}}else b=1;while(0);return b&1|0}function e$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;a:do if((e|0)!=(f|0)){h=e;p=f-h|0;o=(p&1|0)==0;p=p&-2;q=(p|0)==0;p=o|q?f:e+p|0;if(o|q^1){i=a[e+1>>0]|0;q=b+76|0;m=a[e>>0]|0;if(!(i<<24>>24))l=d[q+(m&255)>>0]|0;else l=v$(i,m)|0;j=e+2|0;o=p;k=e+3|0;f=o-h|0;h=(j|0)==(p|0);n=e+4|0;do switch(l|0){case 12:{f=H$(12,b,j,p,g)|0;break a}case 13:{f=H$(13,b,j,p,g)|0;break a}case 2:{if(h){f=-1;break a}f=a[k>>0]|0;h=a[j>>0]|0;if(!(f<<24>>24))f=d[q+(h&255)>>0]|0;else f=v$(f,h)|0;switch(f|0){case 16:{f=I$(b,n,p,g)|0;break a}case 15:{f=D$(b,n,p,g)|0;break a}case 7:case 6:case 5:case 29:case 24:case 22:{c[g>>2]=e;f=29;break a}default:{c[g>>2]=j;f=0;break a}}}case 9:{if(h){c[g>>2]=p;f=-15;break a}else h=20;break}case 10:case 21:{h=20;break}case 30:{f=x$(b,j,p,g)|0;break a}case 35:{c[g>>2]=j;f=38;break a}case 20:{c[g>>2]=j;f=25;break a}case 4:{if(h){f=-26;break a}if((a[k>>0]|0)==0?(a[j>>0]|0)==93:0){if((n|0)==(p|0)){f=-1;break a}if((a[e+5>>0]|0)==0?(a[n>>0]|0)==62:0){c[g>>2]=e+6;f=34;break a}}c[g>>2]=j;f=26;break a}case 31:{c[g>>2]=j;f=23;break a}case 32:{if(h){f=-24;break a}f=a[k>>0]|0;h=a[j>>0]|0;if(!(f<<24>>24))f=d[q+(h&255)>>0]|0;else f=v$(f,h)|0;switch(f|0){case 33:{c[g>>2]=n;f=36;break a}case 15:{c[g>>2]=n;f=35;break a}case 34:{c[g>>2]=n;f=37;break a}case 32:case 36:case 35:case 11:case 21:case 10:case 9:{c[g>>2]=j;f=24;break a}default:{c[g>>2]=j;f=0;break a}}}case 36:{c[g>>2]=j;f=21;break a}case 11:{c[g>>2]=j;f=17;break a}case 19:{f=J$(b,j,p,g)|0;break a}case 5:{if((f|0)<2){f=-2;break a}c[g>>2]=e;f=0;break a}case 6:{if((f|0)<3){f=-2;break a}c[g>>2]=e;f=0;break a}case 7:{if((f|0)<4){f=-2;break a}c[g>>2]=e;f=0;break a}case 24:case 22:{f=18;h=63;break}case 23:case 27:case 26:case 25:{f=19;h=63;break}case 29:{i=i&255;h=m&255;f=h>>>5;h=1<<(h&31);if(!(h&c[57168+((f|d[143937+i>>0]<<3)<<2)>>2]))if(!(c[57168+((d[144193+i>>0]<<3|f)<<2)>>2]&h))h=62;else{f=19;h=63}else{f=18;h=63}break}default:h=62}while(0);if((h|0)==20){b:while(1){i=e;e=e+2|0;if((e|0)==(p|0)){h=27;break}f=a[i+3>>0]|0;h=a[e>>0]|0;if(!(f<<24>>24))f=d[q+(h&255)>>0]|0;else f=v$(f,h)|0;switch(f|0){case 10:case 21:{h=20;continue b}case 9:break;default:{h=26;break b}}if((i+4|0)==(p|0)){h=26;break}else h=20}if((h|0)==26){c[g>>2]=e;f=15;break}else if((h|0)==27){c[g>>2]=p;f=15;break}}else if((h|0)==62){c[g>>2]=e;f=0;break}else if((h|0)==63){c:while(1){if((j|0)==(p|0)){h=103;break}h=a[j+1>>0]|0;i=a[j>>0]|0;if(!(h<<24>>24))e=d[q+(i&255)>>0]|0;else e=v$(h,i)|0;k=j+2|0;switch(e|0){case 27:case 26:case 25:case 24:case 22:{h=f;j=k;f=h;h=63;continue c}case 5:{h=70;break c}case 6:{h=72;break c}case 7:{h=74;break c}case 10:case 9:case 21:case 30:case 20:case 36:case 35:case 32:case 11:{h=76;break c}case 34:{h=93;break c}case 33:{h=96;break c}case 15:{h=99;break c}case 29:{n=i&255;if(!(1<<(n&31)&c[57168+((n>>>5|d[144193+(h&255)>>0]<<3)<<2)>>2])){h=69;break c}else{h=f;j=k;f=h;h=63;continue c}}case 23:break;default:{h=102;break c}}switch(f&63){case 18:break;case 41:{f=19;j=k;h=63;continue c}default:{h=f;j=k;f=h;h=63;continue c}}if((k|0)==(p|0)){f=-1;break a}f=a[j+3>>0]|0;h=a[k>>0]|0;if(!(f<<24>>24))i=d[q+(h&255)>>0]|0;else i=v$(f,h)|0;switch(i|0){case 5:{h=86;break c}case 6:{h=88;break c}case 7:{h=90;break c}case 29:{n=h&255;if(!(1<<(n&31)&c[57168+((n>>>5|d[144193+(f&255)>>0]<<3)<<2)>>2])){h=84;break c}break}case 27:case 26:case 25:case 24:case 22:break;default:{f=19;j=k;h=63;continue c}}f=41;j=j+4|0;h=63}switch(h|0){case 69:{c[g>>2]=j;f=0;break a}case 70:{if((o-j|0)<2){f=-2;break a}c[g>>2]=j;f=0;break a}case 72:{if((o-j|0)<3){f=-2;break a}c[g>>2]=j;f=0;break a}case 74:{if((o-j|0)<4){f=-2;break a}c[g>>2]=j;f=0;break a}case 76:{c[g>>2]=j;break a}case 84:{c[g>>2]=k;f=0;break a}case 86:{if((o-k|0)<2){f=-2;break a}c[g>>2]=k;f=0;break a}case 88:{if((o-k|0)<3){f=-2;break a}c[g>>2]=k;f=0;break a}case 90:{if((o-k|0)<4){f=-2;break a}c[g>>2]=k;f=0;break a}case 93:if((f|0)==19){c[g>>2]=j;f=0;break a}else{c[g>>2]=k;f=32;break a}case 96:if((f|0)==19){c[g>>2]=j;f=0;break a}else{c[g>>2]=k;f=31;break a}case 99:if((f|0)==19){c[g>>2]=j;f=0;break a}else{c[g>>2]=k;f=30;break a}case 102:{c[g>>2]=j;f=0;break a}case 103:{f=0-f|0;break a}}}}else f=-1}else f=-4;while(0);return f|0}function f$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a:do if((e|0)!=(f|0)){l=e;o=f-l|0;n=(o&1|0)==0;o=o&-2;p=(o|0)==0;o=n|p?f:e+o|0;if(n|p^1){f=a[e+1>>0]|0;h=a[e>>0]|0;p=b+76|0;if(!(f<<24>>24))j=d[p+(h&255)>>0]|0;else j=v$(f,h)|0;k=e+2|0;n=o;i=e+3|0;m=e+4|0;f=n-l|0;h=(k|0)==(o|0);switch(j|0){case 2:{f=A$(b,k,o,g)|0;break a}case 3:{f=w$(b,k,o,g)|0;break a}case 9:{if(h){f=-3;break a}f=a[i>>0]|0;h=a[k>>0]|0;if(!(f<<24>>24))f=d[p+(h&255)>>0]|0;else f=v$(f,h)|0;c[g>>2]=(f|0)==10?m:k;f=7;break a}case 10:{c[g>>2]=k;f=7;break a}case 4:{if(h){f=-5;break a}if((a[i>>0]|0)==0?(a[k>>0]|0)==93:0){if((m|0)==(o|0)){f=-5;break a}if((a[e+5>>0]|0)==0?(a[m>>0]|0)==62:0){c[g>>2]=m;f=0;break a}}break}case 5:{if((f|0)<2){f=-2;break a}break}case 6:{if((f|0)<3){f=-2;break a}else k=i;break}case 7:{if((f|0)<4){f=-2;break a}else k=m;break}case 8:case 1:case 0:{c[g>>2]=e;f=0;break a}default:{}}b:while(1){if((k|0)==(o|0)){h=46;break}f=a[k+1>>0]|0;h=a[k>>0]|0;if(!(f<<24>>24))i=d[p+(h&255)>>0]|0;else i=v$(f,h)|0;j=k+4|0;f=k+2|0;h=n-k|0;switch(i|0){case 10:case 9:case 8:case 1:case 0:case 2:case 3:{h=45;break b}case 5:if((h|0)<2){h=32;break b}else{k=f;continue b}case 6:{if((h|0)<3){h=34;break b}k=k+3|0;continue b}case 7:if((h|0)<4){h=37;break b}else{k=j;continue b}case 4:{if((f|0)==(o|0)){h=45;break b}if(a[k+3>>0]|0){k=f;continue b}if((a[f>>0]|0)!=93){k=f;continue b}if((j|0)==(o|0)){h=45;break b}if(a[k+5>>0]|0){k=f;continue b}if((a[j>>0]|0)==62){h=44;break b}else{k=f;continue b}}default:{k=f;continue b}}}if((h|0)==32){c[g>>2]=k;f=6;break}else if((h|0)==34){c[g>>2]=k;f=6;break}else if((h|0)==37){c[g>>2]=k;f=6;break}else if((h|0)==44){c[g>>2]=j;f=0;break}else if((h|0)==45){c[g>>2]=k;f=6;break}else if((h|0)==46){c[g>>2]=o;f=6;break}}else f=-1}else f=-4;while(0);return f|0}function g$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;a:do if((e|0)!=(f|0)){k=e;m=f-k|0;l=(m&1|0)==0;m=m&-2;n=(m|0)==0;m=l|n?f:e+m|0;if(l|n^1){f=a[e+1>>0]|0;h=a[e>>0]|0;n=b+76|0;if(!(f<<24>>24))j=d[n+(h&255)>>0]|0;else j=v$(f,h)|0;i=e+2|0;l=m;h=(i|0)==(m|0);f=l-k|0;b=e+3|0;k=e+4|0;switch(j|0){case 4:{if(h){f=-1;break a}if((a[b>>0]|0)==0?(a[i>>0]|0)==93:0){if((k|0)==(m|0)){f=-1;break a}if((a[e+5>>0]|0)==0?(a[k>>0]|0)==62:0){c[g>>2]=e+6;f=40;break a}}break}case 9:{if(h){f=-1;break a}f=a[b>>0]|0;b=a[i>>0]|0;if(!(f<<24>>24))f=d[n+(b&255)>>0]|0;else f=v$(f,b)|0;c[g>>2]=(f|0)==10?k:i;f=7;break a}case 10:{c[g>>2]=i;f=7;break a}case 5:{if((f|0)<2){f=-2;break a}break}case 6:{if((f|0)<3){f=-2;break a}else i=b;break}case 7:{if((f|0)<4){f=-2;break a}else i=k;break}case 8:case 1:case 0:{c[g>>2]=e;f=0;break a}default:{}}b:while(1){if((i|0)==(m|0)){b=38;break}f=a[i+1>>0]|0;b=a[i>>0]|0;if(!(f<<24>>24))h=d[n+(b&255)>>0]|0;else h=v$(f,b)|0;f=i+2|0;b=l-i|0;switch(h|0){case 4:case 10:case 9:case 8:case 1:case 0:{b=37;break b}case 5:if((b|0)<2){b=30;break b}else{i=f;continue b}case 6:{if((b|0)<3){b=32;break b}i=i+3|0;continue b}case 7:{if((b|0)<4){b=35;break b}i=i+4|0;continue b}default:{i=f;continue b}}}if((b|0)==30){c[g>>2]=i;f=6;break}else if((b|0)==32){c[g>>2]=i;f=6;break}else if((b|0)==35){c[g>>2]=i;f=6;break}else if((b|0)==37){c[g>>2]=i;f=6;break}else if((b|0)==38){c[g>>2]=m;f=6;break}}else f=-1}else f=-4;while(0);return f|0}function h$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;r=f-e|0;r=(r&1|0)==0?f:e+(r&-2)|0;p=b+76|0;q=r;o=0;a:while(1){if((e|0)==(r|0)){f=-1;break}f=a[e+1>>0]|0;b=a[e>>0]|0;if(!(f<<24>>24))n=d[p+(b&255)>>0]|0;else n=v$(f,b)|0;f=e+2|0;b=(f|0)==(r|0);h=e+4|0;i=e+3|0;j=e+6|0;k=(h|0)==(r|0);l=e+5|0;m=q-e|0;switch(n|0){case 8:case 1:case 0:{s=10;break a}case 5:if((m|0)<2){f=-2;break a}else{n=o;e=f;o=n;continue a}case 6:if((m|0)<3){f=-2;break a}else{n=o;e=i;o=n;continue a}case 7:if((m|0)<4){f=-2;break a}else{n=o;e=h;o=n;continue a}case 2:{if(b){f=-1;break a}if(a[i>>0]|0){n=o;e=f;o=n;continue a}if((a[f>>0]|0)!=33){n=o;e=f;o=n;continue a}if(k){f=-1;break a}if(a[l>>0]|0){n=o;e=h;o=n;continue a}e=(a[h>>0]|0)==91;o=(e&1)+o|0;e=e?j:h;continue a}case 4:{if(b){f=-1;break a}if(a[i>>0]|0){n=o;e=f;o=n;continue a}if((a[f>>0]|0)!=93){n=o;e=f;o=n;continue a}if(k){f=-1;break a}if(a[l>>0]|0){n=o;e=h;o=n;continue a}if((a[h>>0]|0)!=62){n=o;e=h;o=n;continue a}if(!o){s=24;break a}o=o+-1|0;e=j;continue a}default:{n=o;e=f;o=n;continue a}}}if((s|0)==10){c[g>>2]=e;f=0}else if((s|0)==24){c[g>>2]=j;f=42}return f|0}function i$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;do if((e|0)!=(f|0)){l=b+76|0;j=e;a:while(1){if((j|0)==(f|0)){i=27;break}i=a[j+1>>0]|0;h=a[j>>0]|0;if(!(i<<24>>24))h=d[l+(h&255)>>0]|0;else h=v$(i,h)|0;k=j+2|0;switch(h|0){case 21:{i=24;break a}case 3:{i=10;break a}case 2:{i=13;break a}case 10:{i=14;break a}case 9:{i=17;break a}case 6:{j=j+3|0;continue a}case 7:{j=j+4|0;continue a}default:{j=k;continue a}}}if((i|0)==10)if((j|0)==(e|0)){h=w$(b,k,f,g)|0;break}else{c[g>>2]=j;h=6;break}else if((i|0)==13){c[g>>2]=j;h=0;break}else if((i|0)==14)if((j|0)==(e|0)){c[g>>2]=k;h=7;break}else{c[g>>2]=j;h=6;break}else if((i|0)==17){if((j|0)!=(e|0)){c[g>>2]=j;h=6;break}if((k|0)==(f|0)){h=-3;break}h=a[e+3>>0]|0;i=a[k>>0]|0;if(!(h<<24>>24))h=d[l+(i&255)>>0]|0;else h=v$(h,i)|0;c[g>>2]=(h|0)==10?e+4|0:k;h=7;break}else if((i|0)==24)if((j|0)==(e|0)){c[g>>2]=k;h=39;break}else{c[g>>2]=j;h=6;break}else if((i|0)==27){c[g>>2]=f;h=6;break}}else h=-4;while(0);return h|0}function j$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;do if((e|0)!=(f|0)){l=b+76|0;j=e;a:while(1){if((j|0)==(f|0)){i=26;break}i=a[j+1>>0]|0;h=a[j>>0]|0;if(!(i<<24>>24))h=d[l+(h&255)>>0]|0;else h=v$(i,h)|0;k=j+2|0;switch(h|0){case 9:{i=19;break a}case 3:{i=10;break a}case 30:{i=13;break a}case 10:{i=16;break a}case 6:{j=j+3|0;continue a}case 7:{j=j+4|0;continue a}default:{j=k;continue a}}}if((i|0)==10)if((j|0)==(e|0)){h=w$(b,k,f,g)|0;break}else{c[g>>2]=j;h=6;break}else if((i|0)==13)if((j|0)==(e|0)){h=x$(b,k,f,g)|0;h=(h|0)==22?0:h;break}else{c[g>>2]=j;h=6;break}else if((i|0)==16)if((j|0)==(e|0)){c[g>>2]=k;h=7;break}else{c[g>>2]=j;h=6;break}else if((i|0)==19){if((j|0)!=(e|0)){c[g>>2]=j;h=6;break}if((k|0)==(f|0)){h=-3;break}h=a[e+3>>0]|0;i=a[k>>0]|0;if(!(h<<24>>24))h=d[l+(i&255)>>0]|0;else h=v$(h,i)|0;c[g>>2]=(h|0)==10?e+4|0:k;h=7;break}else if((i|0)==26){c[g>>2]=f;h=6;break}}else h=-4;while(0);return h|0}function k$(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;j=b+76|0;f=e;b=c;a:while(1){h=b+1|0;i=a[h>>0]|0;e=a[b>>0]|0;if(!(i<<24>>24))g=d[j+(e&255)>>0]|0;else g=v$(i,e)|0;c=f+1|0;switch(g|0){case 7:{if(e<<24>>24==(a[f>>0]|0)){f=c;b=h;e=i;k=7}else{b=0;break a}break}case 6:{k=7;break}case 5:{k=9;break}case 27:case 26:case 25:case 24:case 23:case 22:case 29:{if((a[f>>0]|0)!=e<<24>>24){b=0;break a}if((a[c>>0]|0)==i<<24>>24)e=f;else{b=0;break a}break}default:{k=14;break a}}if((k|0)==7){k=0;c=b+1|0;if(e<<24>>24!=(a[f>>0]|0)){b=0;break}f=f+1|0;b=c;e=a[c>>0]|0;k=9}if((k|0)==9){k=0;if(e<<24>>24!=(a[f>>0]|0)){b=0;break}if((a[b+1>>0]|0)==(a[f+1>>0]|0))e=f;else{b=0;break}}f=e+2|0;b=b+2|0}b:do if((k|0)==14){e=a[c>>0]|0;b=a[f>>0]|0;if(!(e<<24>>24))b=d[j+(b&255)>>0]|0;else b=v$(e,b)|0;switch(b|0){case 27:case 26:case 25:case 24:case 23:case 22:case 29:case 7:case 6:case 5:{b=0;break b}default:{}}b=1}while(0);return b|0}function l$(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;b=c;while(1){c=a[e>>0]|0;f=(b|0)==(d|0);if(!(c<<24>>24)){g=7;break}if(f){b=0;break}if(a[b+1>>0]|0){b=0;break}if((a[b>>0]|0)!=c<<24>>24){b=0;break}e=e+1|0;b=b+2|0}if((g|0)==7)b=f&1;return b|0}function m$(b,c){b=b|0;c=c|0;var e=0,f=0,g=0;g=b+76|0;f=c;a:while(1){b=a[f+1>>0]|0;e=a[f>>0]|0;if(!(b<<24>>24))b=d[g+(e&255)>>0]|0;else b=v$(b,e)|0;switch(b|0){case 27:case 26:case 25:case 24:case 23:case 22:case 29:case 5:{f=f+2|0;continue a}case 6:{f=f+3|0;continue a}case 7:{f=f+4|0;continue a}default:break a}}return f-c|0}function n$(b,c){b=b|0;c=c|0;var e=0,f=0;f=b+76|0;a:while(1){b=a[c+1>>0]|0;e=a[c>>0]|0;if(!(b<<24>>24))b=d[f+(e&255)>>0]|0;else b=v$(b,e)|0;switch(b|0){case 21:case 9:case 10:break;default:break a}c=c+2|0}return c|0}function o$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;z=b+76|0;x=0;y=0;u=1;a:while(1){w=e+2|0;r=e+3|0;b=a[r>>0]|0;s=b<<24>>24==0;t=a[w>>0]|0;if(s)p=d[z+(t&255)>>0]|0;else p=v$(b,t)|0;b=(y|0)<(f|0);q=e+4|0;h=(u|0)==1;i=(u|0)==2;v=g+(y<<4)+12|0;j=y+1|0;k=(u|0)==0;l=(u|0)!=2;m=g+(y<<4)+8|0;n=g+(y<<4)+4|0;o=g+(y<<4)|0;do switch(p|0){case 5:{if(!k){s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}if(!b){t=y;v=x;u=1;e=w;y=t;x=v;continue a}c[o>>2]=w;a[v>>0]=1;t=y;v=x;u=1;e=w;y=t;x=v;continue a}case 6:{if(!k){t=u;v=y;w=x;e=r;u=t;y=v;x=w;continue a}if(!b){v=y;w=x;u=1;e=r;y=v;x=w;continue a}c[o>>2]=w;a[v>>0]=1;v=y;w=x;u=1;e=r;y=v;x=w;continue a}case 7:{if(!k){t=u;v=y;w=x;e=q;u=t;y=v;x=w;continue a}if(!b){v=y;w=x;u=1;e=q;y=v;x=w;continue a}c[o>>2]=w;a[v>>0]=1;v=y;w=x;u=1;e=q;y=v;x=w;continue a}case 24:case 22:case 29:{if(!k){s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}if(!b){t=y;v=x;u=1;e=w;y=t;x=v;continue a}c[o>>2]=w;a[v>>0]=1;t=y;v=x;u=1;e=w;y=t;x=v;continue a}case 12:{if(l){if(!b){v=y;x=12;u=2;e=w;y=v;continue a}c[n>>2]=q;v=y;x=12;u=2;e=w;y=v;continue a}if((x|0)!=12){t=y;v=x;u=2;e=w;y=t;x=v;continue a}if(!b){x=12;y=j;u=0;e=w;continue a}c[m>>2]=w;x=12;y=j;u=0;e=w;continue a}case 13:{if(l){if(!b){v=y;x=13;u=2;e=w;y=v;continue a}c[n>>2]=q;v=y;x=13;u=2;e=w;y=v;continue a}if((x|0)!=13){t=y;v=x;u=2;e=w;y=t;x=v;continue a}if(!b){x=13;y=j;u=0;e=w;continue a}c[m>>2]=w;x=13;y=j;u=0;e=w;continue a}case 3:{if(!b){s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}a[v>>0]=0;s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}case 21:{if(h){t=y;v=x;u=0;e=w;y=t;x=v;continue a}if(!i){s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}if(!b){t=y;v=x;u=2;e=w;y=t;x=v;continue a}if(!(a[v>>0]|0)){t=y;v=x;u=2;e=w;y=t;x=v;continue a}do if(s&(w|0)!=(c[n>>2]|0)&t<<24>>24==32){e=a[e+5>>0]|0;b=a[q>>0]|0;if(!(e<<24>>24)){if(b<<24>>24==32)break;b=d[z+(b&255)>>0]|0}else b=v$(e,b)|0;if((b|0)!=(x|0)){t=y;v=x;u=2;e=w;y=t;x=v;continue a}}while(0);a[v>>0]=0;t=y;v=x;u=2;e=w;y=t;x=v;continue a}case 10:case 9:{if(h){t=y;v=x;u=0;e=w;y=t;x=v;continue a}if(!i){s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}if(!b){t=y;v=x;u=2;e=w;y=t;x=v;continue a}a[v>>0]=0;t=y;v=x;u=2;e=w;y=t;x=v;continue a}case 17:case 11:if(l)break a;else{t=y;v=x;u=2;e=w;y=t;x=v;continue a}default:{s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}}while(0)}return y|0}function p$(b,c){b=b|0;c=c|0;var d=0,e=0;b=c+4|0;a:do if((a[c+5>>0]|0)==0?(a[b>>0]|0)==120:0){c=c+6|0;b=0;while(1){b:while(1){if(!(a[c+1>>0]|0)){d=a[c>>0]|0;if(d<<24>>24==59){e=17;break a}d=d<<24>>24;switch(d|0){case 57:case 56:case 55:case 54:case 53:case 52:case 51:case 50:case 49:case 48:{e=8;break b}case 70:case 69:case 68:case 67:case 66:case 65:{e=9;break b}case 102:case 101:case 100:case 99:case 98:case 97:{e=10;break b}default:{}}}c=c+2|0}if((e|0)==8){e=0;b=d+-48|b<<4}else if((e|0)==9){e=0;b=(b<<4)+-55+d|0}else if((e|0)==10){e=0;b=(b<<4)+-87+d|0}if((b|0)<1114112)c=c+2|0;else{b=-1;break}}}else{d=b;b=0;e=13}while(0);c:do if((e|0)==13)while(1){e=0;if(!(a[d+1>>0]|0)){c=a[d>>0]|0;if(c<<24>>24==59){e=17;break c}c=c<<24>>24}else c=-1;b=(b*10|0)+-48+c|0;if((b|0)>=1114112){b=-1;break}else{d=d+2|0;e=13}}while(0);if((e|0)==17)b=k_(b)|0;return b|0}function q$(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=c+2|0;b=c+1|0;h=c+3|0;e=c+4|0;f=c+5|0;a:do switch((d-c|0)/2|0|0){case 2:{if((a[h>>0]|0)==0?(a[g>>0]|0)==116:0){if(!(a[b>>0]|0))b=a[c>>0]|0;else b=-1;b=(b|0)==108?60:(b|0)==103?62:0}else i=27;break}case 3:{if((((((a[b>>0]|0)==0?(a[c>>0]|0)==97:0)?(a[h>>0]|0)==0:0)?(a[g>>0]|0)==109:0)?(a[f>>0]|0)==0:0)?(a[e>>0]|0)==112:0)b=38;else i=27;break}case 4:{if(!(a[b>>0]|0)){b=c+6|0;d=c+7|0;switch(a[c>>0]|0){case 113:{if(a[h>>0]|0){i=27;break a}if((a[g>>0]|0)!=117){i=27;break a}if(a[f>>0]|0){i=27;break a}if((a[e>>0]|0)!=111){i=27;break a}if(a[d>>0]|0){i=27;break a}if((a[b>>0]|0)==116){b=34;break a}else{i=27;break a}}case 97:{if(a[h>>0]|0){i=27;break a}if((a[g>>0]|0)!=112){i=27;break a}if(a[f>>0]|0){i=27;break a}if((a[e>>0]|0)!=111){i=27;break a}if(a[d>>0]|0){i=27;break a}if((a[b>>0]|0)==115){b=39;break a}else{i=27;break a}}default:{i=27;break a}}}else i=27;break}default:i=27}while(0);if((i|0)==27)b=0;return b|0}function r$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;j=b+76|0;k=g+4|0;b=e;while(1){if(b>>>0>=f>>>0)break;h=a[b+1>>0]|0;e=a[b>>0]|0;if(!(h<<24>>24))e=d[j+(e&255)>>0]|0;else e=v$(h,e)|0;i=b+2|0;switch(e|0){case 9:{c[g>>2]=(c[g>>2]|0)+1;if((i|0)==(f|0))b=f;else{e=a[b+3>>0]|0;h=a[i>>0]|0;if(!(e<<24>>24))e=d[j+(h&255)>>0]|0;else e=v$(e,h)|0;b=(e|0)==10?b+4|0:i}c[k>>2]=-1;break}case 6:{b=b+3|0;break}case 7:{b=b+4|0;break}case 10:{c[k>>2]=-1;c[g>>2]=(c[g>>2]|0)+1;b=i;break}default:b=i}c[k>>2]=(c[k>>2]|0)+1}return}function s$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;j=f+-2|0;i=b+76|0;f=e;a:while(1){h=f+2|0;if((h|0)==(j|0)){f=1;break}f=a[f+3>>0]|0;e=f<<24>>24==0;b=a[h>>0]|0;if(e)f=d[i+(b&255)>>0]|0;else f=v$(f,b)|0;switch(f|0){case 23:case 19:case 30:case 33:case 16:case 18:case 10:case 9:case 15:case 14:case 17:case 35:case 34:case 32:case 31:case 13:case 27:case 24:case 25:{f=h;continue a}case 21:if(e&b<<24>>24==9){k=12;break a}else{f=h;continue a}case 22:case 26:{if(!e){k=12;break a}if(b<<24>>24>=0){f=h;continue a}break}default:if(!e){k=12;break a}}switch(b<<24>>24|0){case 64:case 36:{f=h;break}default:{k=12;break a}}}if((k|0)==12){c[g>>2]=h;f=0}return f|0}function t$(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;o=h;b=c[e>>2]|0;a:while(1){if((b|0)==(f|0)){b=f;break}k=a[b>>0]|0;i=a[b+1>>0]|0;m=i&255;j=k&255;n=j>>>6;l=(j&63|128)&255;switch(i<<24>>24){case 0:{if(k<<24>>24>-1){i=c[g>>2]|0;if((i|0)==(h|0))break a;c[g>>2]=i+1;a[i>>0]=k}else p=7;break}case 7:case 6:case 5:case 4:case 3:case 2:case 1:{p=7;break}case -37:case -38:case -39:case -40:{i=c[g>>2]|0;if((o-i|0)<4)break a;m=(m<<2&12|n)+1|0;c[g>>2]=i+1;a[i>>0]=m>>>2|240;n=c[g>>2]|0;c[g>>2]=n+1;a[n>>0]=j>>>2&15|m<<4&48|128;n=b+2|0;m=d[n>>0]|0;l=(j<<4&48|m>>>6|a[b+3>>0]<<2&12|128)&255;b=c[g>>2]|0;c[g>>2]=b+1;a[b>>0]=l;b=c[g>>2]|0;c[g>>2]=b+1;a[b>>0]=m&63|128;b=n;break}default:{i=c[g>>2]|0;if((o-i|0)<3)break a;c[g>>2]=i+1;a[i>>0]=m>>>4|224;k=c[g>>2]|0;c[g>>2]=k+1;a[k>>0]=n|m<<2&60|128;n=c[g>>2]|0;c[g>>2]=n+1;a[n>>0]=l}}if((p|0)==7){p=0;i=c[g>>2]|0;if((o-i|0)<2)break;c[g>>2]=i+1;a[i>>0]=n|m<<2|192;n=c[g>>2]|0;c[g>>2]=n+1;a[n>>0]=l}b=b+2|0}c[e>>2]=b;return}function u$(e,f,g,h,i){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0;e=c[f>>2]|0;if((g-e|0)>(i-(c[h>>2]|0)|0))g=(a[g+-1>>0]&-8)<<24>>24==-40?g+-2|0:g;while(1){if((e|0)==(g|0))break;j=c[h>>2]|0;if((j|0)==(i|0))break;k=((d[e+1>>0]|0)<<8|(d[e>>0]|0))&65535;c[h>>2]=j+2;b[j>>1]=k;j=(c[f>>2]|0)+2|0;c[f>>2]=j;e=j}return}function v$(a,b){a=a|0;b=b|0;var c=0;switch(a<<24>>24){case -37:case -38:case -39:case -40:{a=7;break}case -33:case -34:case -35:case -36:{a=8;break}case -1:{if((b&255)>253)a=0;else c=4;break}default:c=4}if((c|0)==4)a=29;return a|0}function w$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;a:do if((e|0)!=(f|0)){k=a[e+1>>0]|0;m=b+76|0;l=a[e>>0]|0;if(!(k<<24>>24))j=d[m+(l&255)>>0]|0;else j=v$(k,l)|0;n=f;h=n-e|0;i=e+2|0;switch(j|0){case 29:{l=l&255;if(!(1<<(l&31)&c[57168+((l>>>5|(d[143937+(k&255)>>0]|0)<<3)<<2)>>2])){c[g>>2]=e;b=0;break a}break}case 24:case 22:break;case 5:{if((h|0)<2){b=-2;break a}c[g>>2]=e;b=0;break a}case 6:{if((h|0)<3){b=-2;break a}c[g>>2]=e;b=0;break a}case 7:{if((h|0)<4){b=-2;break a}c[g>>2]=e;b=0;break a}case 19:{b=y$(b,i,f,g)|0;break a}default:{c[g>>2]=e;b=0;break a}}b:while(1){if((i|0)==(f|0)){b=-1;break a}b=a[i+1>>0]|0;e=a[i>>0]|0;if(!(b<<24>>24))h=d[m+(e&255)>>0]|0;else h=v$(b,e)|0;j=i+2|0;switch(h|0){case 27:case 26:case 25:case 24:case 22:{i=j;continue b}case 5:{e=23;break b}case 6:{e=25;break b}case 7:{e=27;break b}case 18:{e=29;break b}case 29:break;default:{e=30;break b}}l=e&255;if(!(1<<(l&31)&c[57168+((l>>>5|(d[144193+(b&255)>>0]|0)<<3)<<2)>>2])){e=22;break}else i=j}if((e|0)==22){c[g>>2]=i;b=0;break}else if((e|0)==23){if((n-i|0)<2){b=-2;break}c[g>>2]=i;b=0;break}else if((e|0)==25){if((n-i|0)<3){b=-2;break}c[g>>2]=i;b=0;break}else if((e|0)==27){if((n-i|0)<4){b=-2;break}c[g>>2]=i;b=0;break}else if((e|0)==29){c[g>>2]=j;b=9;break}else if((e|0)==30){c[g>>2]=i;b=0;break}}else b=-1;while(0);return b|0}function x$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;a:do if((e|0)!=(f|0)){j=a[e+1>>0]|0;k=b+76|0;i=a[e>>0]|0;if(!(j<<24>>24))h=d[k+(i&255)>>0]|0;else h=v$(j,i)|0;l=f;b=l-e|0;switch(h|0){case 29:{i=i&255;if(!(1<<(i&31)&c[57168+((i>>>5|(d[143937+(j&255)>>0]|0)<<3)<<2)>>2])){c[g>>2]=e;b=0;break a}break}case 24:case 22:break;case 5:{if((b|0)<2){b=-2;break a}c[g>>2]=e;b=0;break a}case 6:{if((b|0)<3){b=-2;break a}c[g>>2]=e;b=0;break a}case 7:{if((b|0)<4){b=-2;break a}c[g>>2]=e;b=0;break a}case 30:case 9:case 10:case 21:{c[g>>2]=e;b=22;break a}default:{c[g>>2]=e;b=0;break a}}e=e+2|0;b:while(1){if((e|0)==(f|0)){b=-1;break a}b=a[e+1>>0]|0;h=a[e>>0]|0;if(!(b<<24>>24))i=d[k+(h&255)>>0]|0;else i=v$(b,h)|0;j=e+2|0;switch(i|0){case 27:case 26:case 25:case 24:case 22:{e=j;continue b}case 5:{h=24;break b}case 6:{h=26;break b}case 7:{h=28;break b}case 18:{h=30;break b}case 29:break;default:{h=31;break b}}i=h&255;if(!(1<<(i&31)&c[57168+((i>>>5|(d[144193+(b&255)>>0]|0)<<3)<<2)>>2])){h=23;break}else e=j}if((h|0)==23){c[g>>2]=e;b=0;break}else if((h|0)==24){if((l-e|0)<2){b=-2;break}c[g>>2]=e;b=0;break}else if((h|0)==26){if((l-e|0)<3){b=-2;break}c[g>>2]=e;b=0;break}else if((h|0)==28){if((l-e|0)<4){b=-2;break}c[g>>2]=e;b=0;break}else if((h|0)==30){c[g>>2]=j;b=28;break}else if((h|0)==31){c[g>>2]=e;b=0;break}}else b=-1;while(0);return b|0}function y$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;a:do if((e|0)!=(f|0)){h=a[e+1>>0]|0;i=h<<24>>24==0;j=e+2|0;k=a[e>>0]|0;if(i&k<<24>>24==120){b=z$(b,j,f,g)|0;break}l=b+76|0;if(i)b=d[l+(k&255)>>0]|0;else b=v$(h,k)|0;if((b|0)!=25){c[g>>2]=e;b=0;break}b:while(1){if((j|0)==(f|0)){b=-1;break a}b=a[j+1>>0]|0;h=a[j>>0]|0;if(!(b<<24>>24))b=d[l+(h&255)>>0]|0;else b=v$(b,h)|0;i=j+2|0;switch(b|0){case 25:{j=i;break}case 18:{h=14;break b}default:{h=15;break b}}}if((h|0)==14){c[g>>2]=i;b=10;break}else if((h|0)==15){c[g>>2]=j;b=0;break}}else b=-1;while(0);return b|0}function z$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;a:do if((e|0)!=(f|0)){h=a[e+1>>0]|0;j=b+76|0;b=a[e>>0]|0;if(!(h<<24>>24))b=d[j+(b&255)>>0]|0;else b=v$(h,b)|0;if((b&-2|0)!=24){c[g>>2]=e;b=0;break}i=e+2|0;b:while(1){if((i|0)==(f|0)){b=-1;break a}b=a[i+1>>0]|0;h=a[i>>0]|0;if(!(b<<24>>24))b=d[j+(h&255)>>0]|0;else b=v$(b,h)|0;e=i+2|0;switch(b|0){case 24:case 25:{i=e;break}case 18:{h=13;break b}default:{h=14;break b}}}if((h|0)==13){c[g>>2]=e;b=10;break}else if((h|0)==14){c[g>>2]=i;b=0;break}}else b=-1;while(0);return b|0}function A$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;a:do if((e|0)!=(f|0)){k=a[e+1>>0]|0;n=b+76|0;l=a[e>>0]|0;if(!(k<<24>>24))j=d[n+(l&255)>>0]|0;else j=v$(k,l)|0;h=e+2|0;m=f;i=m-e|0;switch(j|0){case 29:{l=l&255;if(!(1<<(l&31)&c[57168+((l>>>5|d[143937+(k&255)>>0]<<3)<<2)>>2])){c[g>>2]=e;h=0;break a}else l=0;break}case 24:case 22:{l=0;break}case 5:{if((i|0)<2){h=-2;break a}c[g>>2]=e;h=0;break a}case 6:{if((i|0)<3){h=-2;break a}c[g>>2]=e;h=0;break a}case 7:{if((i|0)<4){h=-2;break a}c[g>>2]=e;h=0;break a}case 16:{if((h|0)==(f|0)){h=-1;break a}i=a[e+3>>0]|0;j=a[h>>0]|0;if(!(i<<24>>24))j=d[n+(j&255)>>0]|0;else j=v$(i,j)|0;i=e+4|0;switch(j|0){case 27:{h=B$(b,i,f,g)|0;break a}case 20:{h=C$(i,f,g)|0;break a}default:{c[g>>2]=h;h=0;break a}}}case 15:{h=D$(b,h,f,g)|0;break a}case 17:{h=E$(b,h,f,g)|0;break a}default:{c[g>>2]=e;h=0;break a}}b:while(1){c:while(1){if((h|0)==(f|0)){h=-1;break a}i=a[h+1>>0]|0;j=a[h>>0]|0;if(!(i<<24>>24))k=d[n+(j&255)>>0]|0;else k=v$(i,j)|0;e=h+2|0;switch(k|0){case 5:{o=32;break b}case 6:{o=34;break b}case 7:{o=36;break b}case 10:case 9:case 21:{h=e;o=56;break b}case 11:{o=71;break b}case 17:break b;case 27:case 26:case 25:case 24:case 22:{h=e;continue c}case 23:break c;case 29:break;default:{o=77;break b}}k=j&255;if(!(1<<(k&31)&c[57168+((k>>>5|d[144193+(i&255)>>0]<<3)<<2)>>2])){o=31;break b}else h=e}if(l|0){o=39;break}if((e|0)==(f|0)){h=-1;break a}i=a[h+3>>0]|0;j=a[e>>0]|0;if(!(i<<24>>24))k=d[n+(j&255)>>0]|0;else k=v$(i,j)|0;switch(k|0){case 5:{o=49;break b}case 6:{o=51;break b}case 7:{o=53;break b}case 29:{l=j&255;if(!(1<<(l&31)&c[57168+((l>>>5|d[143937+(i&255)>>0]<<3)<<2)>>2])){o=46;break b}break}case 24:case 22:break;default:{o=55;break b}}l=1;h=h+4|0}d:switch(o|0){case 31:{c[g>>2]=h;h=0;break a}case 32:{if((m-h|0)<2){h=-2;break a}c[g>>2]=h;h=0;break a}case 34:{if((m-h|0)<3){h=-2;break a}c[g>>2]=h;h=0;break a}case 36:{if((m-h|0)<4){h=-2;break a}c[g>>2]=h;h=0;break a}case 39:{c[g>>2]=h;h=0;break a}case 46:{c[g>>2]=e;h=0;break a}case 49:{if((m-e|0)<2){h=-2;break a}c[g>>2]=e;h=0;break a}case 51:{if((m-e|0)<3){h=-2;break a}c[g>>2]=e;h=0;break a}case 53:{if((m-e|0)<4){h=-2;break a}c[g>>2]=e;h=0;break a}case 55:{c[g>>2]=e;h=0;break a}case 56:{e:while(1){o=0;if((h|0)==(f|0)){h=-1;break a}i=a[h+1>>0]|0;j=a[h>>0]|0;if(!(i<<24>>24))l=d[n+(j&255)>>0]|0;else l=v$(i,j)|0;k=h+2|0;switch(l|0){case 11:{o=71;break d}case 17:break d;case 10:case 9:case 21:{h=k;o=56;break}case 29:{o=61;break e}case 24:case 22:break e;case 5:{o=64;break e}case 6:{o=66;break e}case 7:{o=68;break e}default:{o=70;break e}}}if((o|0)==61){o=j&255;if(!(1<<(o&31)&c[57168+((o>>>5|d[143937+(i&255)>>0]<<3)<<2)>>2])){c[g>>2]=h;h=0;break a}}else if((o|0)==64){if((m-h|0)<2){h=-2;break a}c[g>>2]=h;h=0;break a}else if((o|0)==66){if((m-h|0)<3){h=-2;break a}c[g>>2]=h;h=0;break a}else if((o|0)==68){if((m-h|0)<4){h=-2;break a}c[g>>2]=h;h=0;break a}else if((o|0)==70){c[g>>2]=h;h=0;break a}h=F$(b,k,f,g)|0;break a}case 77:{c[g>>2]=h;h=0;break a}}if((o|0)==71){c[g>>2]=h+2;h=2;break}i=h+2|0;if((i|0)!=(f|0)){if((a[h+3>>0]|0)==0?(a[i>>0]|0)==62:0){c[g>>2]=h+4;h=4;break}c[g>>2]=i;h=0}else h=-1}else h=-1;while(0);return h|0}function B$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;a:do if((e|0)==(f|0))b=-1;else{if((a[e+1>>0]|0)==0?(a[e>>0]|0)==45:0){j=b+76|0;k=f;i=e+2|0;b:while(1){if((i|0)==(f|0)){b=-1;break a}b=a[i+1>>0]|0;e=a[i>>0]|0;if(!(b<<24>>24))h=d[j+(e&255)>>0]|0;else h=v$(b,e)|0;b=i+2|0;e=k-i|0;switch(h|0){case 8:case 1:case 0:{l=16;break b}case 5:if((e|0)<2){b=-2;break a}else{i=b;continue b}case 6:{if((e|0)<3){b=-2;break a}i=i+3|0;continue b}case 7:{if((e|0)<4){b=-2;break a}i=i+4|0;continue b}case 27:{if((b|0)==(f|0)){b=-1;break a}if(a[i+3>>0]|0){i=b;continue b}if((a[b>>0]|0)==45)break b;else{i=b;continue b}}default:{i=b;continue b}}}if((l|0)==16){c[g>>2]=i;b=0;break}b=i+4|0;if((b|0)==(f|0)){b=-1;break}if((a[i+5>>0]|0)==0?(a[b>>0]|0)==62:0){c[g>>2]=i+6;b=13;break}c[g>>2]=b;b=0;break}c[g>>2]=e;b=0}while(0);return b|0}function C$(b,d,e){b=b|0;d=d|0;e=e|0;if((d-b|0)<12)d=-1;else{d=0;while(1){if((d|0)>=6){d=8;break}if(a[b+1>>0]|0){d=0;break}if((a[b>>0]|0)!=(a[144449+d>>0]|0)){d=0;break}d=d+1|0;b=b+2|0}c[e>>2]=b}return d|0}function D$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;p=q;a:do if((e|0)==(f|0))b=-1;else{j=a[e+1>>0]|0;o=b+76|0;b=a[e>>0]|0;if(!(j<<24>>24))i=d[o+(b&255)>>0]|0;else i=v$(j,b)|0;n=f;h=n-e|0;switch(i|0){case 29:{k=b&255;if(!(1<<(k&31)&c[57168+((k>>>5|d[143937+(j&255)>>0]<<3)<<2)>>2])){c[g>>2]=e;b=0;break a}break}case 24:case 22:break;case 5:{if((h|0)<2){b=-2;break a}c[g>>2]=e;b=0;break a}case 6:{if((h|0)<3){b=-2;break a}c[g>>2]=e;b=0;break a}case 7:{if((h|0)<4){b=-2;break a}c[g>>2]=e;b=0;break a}default:{c[g>>2]=e;b=0;break a}}b=e+2|0;b:while(1){if((b|0)==(f|0)){b=-1;break a}h=a[b+1>>0]|0;i=a[b>>0]|0;if(!(h<<24>>24))k=d[o+(i&255)>>0]|0;else k=v$(h,i)|0;j=b+2|0;switch(k|0){case 27:case 26:case 25:case 24:case 22:{b=j;continue b}case 5:{m=23;break b}case 6:{m=25;break b}case 7:{m=27;break b}case 10:case 9:case 21:{m=29;break b}case 15:{m=46;break b}case 29:break;default:break b}k=i&255;if(!(1<<(k&31)&c[57168+((k>>>5|d[144193+(h&255)>>0]<<3)<<2)>>2])){m=22;break}else b=j}if((m|0)==22){c[g>>2]=b;b=0;break}else if((m|0)==23){if((n-b|0)<2){b=-2;break}c[g>>2]=b;b=0;break}else if((m|0)==25){if((n-b|0)<3){b=-2;break}c[g>>2]=b;b=0;break}else if((m|0)==27){if((n-b|0)<4){b=-2;break}c[g>>2]=b;b=0;break}else if((m|0)==29){if(!(G$(e,b,p)|0)){c[g>>2]=b;b=0;break}c:while(1){if((j|0)==(f|0)){b=-1;break a}b=a[j+1>>0]|0;h=a[j>>0]|0;if(!(b<<24>>24))i=d[o+(h&255)>>0]|0;else i=v$(b,h)|0;b=j+2|0;h=n-j|0;switch(i|0){case 8:case 1:case 0:{m=41;break c}case 5:if((h|0)<2){b=-2;break a}else{j=b;continue c}case 6:{if((h|0)<3){b=-2;break a}j=j+3|0;continue c}case 7:{if((h|0)<4){b=-2;break a}j=j+4|0;continue c}case 15:{if((b|0)==(f|0)){b=-1;break a}if(a[j+3>>0]|0){j=b;continue c}if((a[b>>0]|0)==62){m=45;break c}else{j=b;continue c}}default:{j=b;continue c}}}if((m|0)==41){c[g>>2]=j;b=0;break}else if((m|0)==45){c[g>>2]=j+4;b=c[p>>2]|0;break}}else if((m|0)==46){if(!(G$(e,b,p)|0)){c[g>>2]=b;b=0;break}if((j|0)==(f|0)){b=-1;break}if((a[b+3>>0]|0)==0?(a[j>>0]|0)==62:0){c[g>>2]=b+4;b=c[p>>2]|0;break}else b=j}c[g>>2]=b;b=0}while(0);l=q;return b|0}function E$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;a:do if((e|0)!=(f|0)){j=a[e+1>>0]|0;l=b+76|0;i=a[e>>0]|0;if(!(j<<24>>24))h=d[l+(i&255)>>0]|0;else h=v$(j,i)|0;k=f;b=k-e|0;switch(h|0){case 29:{i=i&255;if(!(1<<(i&31)&c[57168+((i>>>5|(d[143937+(j&255)>>0]|0)<<3)<<2)>>2])){c[g>>2]=e;b=0;break a}break}case 24:case 22:break;case 5:{if((b|0)<2){b=-2;break a}c[g>>2]=e;b=0;break a}case 6:{if((b|0)<3){b=-2;break a}c[g>>2]=e;b=0;break a}case 7:{if((b|0)<4){b=-2;break a}c[g>>2]=e;b=0;break a}default:{c[g>>2]=e;b=0;break a}}j=e+2|0;b:while(1){if((j|0)==(f|0)){b=-1;break a}b=a[j+1>>0]|0;h=a[j>>0]|0;if(!(b<<24>>24))e=d[l+(h&255)>>0]|0;else e=v$(b,h)|0;i=j+2|0;switch(e|0){case 23:case 27:case 26:case 25:case 24:case 22:{j=i;continue b}case 5:{e=23;break b}case 6:{e=25;break b}case 7:{e=27;break b}case 10:case 9:case 21:{e=29;break b}case 11:{e=36;break b}case 29:break;default:{e=37;break b}}e=h&255;if(!(1<<(e&31)&c[57168+((e>>>5|(d[144193+(b&255)>>0]|0)<<3)<<2)>>2])){e=22;break}else j=i}if((e|0)==22){c[g>>2]=j;b=0;break}else if((e|0)==23){if((k-j|0)<2){b=-2;break}c[g>>2]=j;b=0;break}else if((e|0)==25){if((k-j|0)<3){b=-2;break}c[g>>2]=j;b=0;break}else if((e|0)==27){if((k-j|0)<4){b=-2;break}c[g>>2]=j;b=0;break}else if((e|0)==29){c:while(1){if((i|0)==(f|0)){b=-1;break a}b=a[i+1>>0]|0;h=a[i>>0]|0;if(!(b<<24>>24))b=d[l+(h&255)>>0]|0;else b=v$(b,h)|0;h=i+2|0;switch(b|0){case 10:case 9:case 21:{i=h;e=29;break}case 11:{e=34;break c}default:{e=35;break c}}}if((e|0)==34){c[g>>2]=h;b=5;break}else if((e|0)==35){c[g>>2]=i;b=0;break}}else if((e|0)==36){c[g>>2]=i;b=5;break}else if((e|0)==37){c[g>>2]=j;b=0;break}}else b=-1;while(0);return b|0}function F$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;p=q;c[p>>2]=e;m=b+76|0;n=f;h=0;a:while(1){b:while(1){if((e|0)==(f|0)){e=-1;break a}k=a[e+1>>0]|0;i=a[e>>0]|0;if(!(k<<24>>24))j=d[m+(i&255)>>0]|0;else j=v$(k,i)|0;switch(j|0){case 5:{o=11;break a}case 6:{o=13;break a}case 7:{o=15;break a}case 23:{o=17;break b}case 10:case 9:case 21:{h=e;o=33;break b}case 14:{o=39;break b}case 29:{j=i&255;if(!(1<<(j&31)&c[57168+((j>>>5|d[144193+(k&255)>>0]<<3)<<2)>>2])){o=9;break a}break}case 27:case 26:case 25:case 24:case 22:break;default:{o=93;break a}}k=e+2|0;c[p>>2]=k;e=k}c:do if((o|0)==17){o=0;if(h|0){o=18;break a}h=e+2|0;c[p>>2]=h;if((h|0)==(f|0)){e=-1;break a}i=a[e+3>>0]|0;j=a[h>>0]|0;if(!(i<<24>>24))k=d[m+(j&255)>>0]|0;else k=v$(i,j)|0;switch(k|0){case 5:{o=26;break a}case 6:{o=28;break a}case 7:{o=30;break a}case 24:case 22:{h=1;break c}case 29:break;default:{o=32;break a}}k=j&255;if(!(1<<(k&31)&c[57168+((k>>>5|d[143937+(i&255)>>0]<<3)<<2)>>2])){o=25;break a}else h=1}else if((o|0)==33)while(1){o=0;e=h+2|0;c[p>>2]=e;if((e|0)==(f|0)){e=-1;break a}h=a[h+3>>0]|0;i=a[e>>0]|0;if(!(h<<24>>24))h=d[m+(i&255)>>0]|0;else h=v$(h,i)|0;switch(h|0){case 14:{o=39;break c}case 9:case 10:case 21:{h=e;o=33;break}default:{o=38;break a}}}while(0);d:do if((o|0)==39){while(1){o=0;j=e+2|0;c[p>>2]=j;if((j|0)==(f|0)){e=-1;break a}h=a[e+3>>0]|0;i=a[j>>0]|0;if(!(h<<24>>24))k=d[m+(i&255)>>0]|0;else k=v$(h,i)|0;if((k|1|0)==13)break;switch(k|0){case 9:case 10:case 21:{e=j;o=39;break}default:{o=45;break a}}}e=e+4|0;c[p>>2]=e;e:while(1){if((e|0)==(f|0)){e=-1;break a}h=a[e+1>>0]|0;i=a[e>>0]|0;if(!(h<<24>>24))h=d[m+(i&255)>>0]|0;else h=v$(h,i)|0;if((h|0)==(k|0))break;switch(h|0){case 8:case 1:case 0:{o=59;break a}case 2:{o=64;break a}case 5:{if((n-e|0)<2){e=-2;break a}j=e+2|0;c[p>>2]=j;e=j;continue e}case 6:{if((n-e|0)<3){e=-2;break a}j=e+3|0;c[p>>2]=j;e=j;continue e}case 7:{if((n-e|0)<4){e=-2;break a}j=e+4|0;c[p>>2]=j;e=j;continue e}case 3:{e=w$(b,e+2|0,f,p)|0;if((e|0)<1){o=62;break a}e=c[p>>2]|0;continue e}default:{j=e+2|0;c[p>>2]=j;e=j;continue e}}}i=e+2|0;c[p>>2]=i;if((i|0)==(f|0)){e=-1;break a}h=a[e+3>>0]|0;j=a[i>>0]|0;if(!(h<<24>>24))h=d[m+(j&255)>>0]|0;else h=v$(h,j)|0;switch(h|0){case 11:{o=85;break a}case 17:{o=86;break a}case 10:case 9:case 21:{e=i;break}default:{o=71;break a}}f:while(1){i=e+2|0;c[p>>2]=i;if((i|0)==(f|0)){e=-1;break a}h=a[e+3>>0]|0;j=a[i>>0]|0;if(!(h<<24>>24))k=d[m+(j&255)>>0]|0;else k=v$(h,j)|0;switch(k|0){case 5:{o=79;break a}case 6:{o=81;break a}case 7:{o=83;break a}case 11:{o=85;break a}case 17:{o=86;break a}case 24:case 22:{h=0;break d}case 10:case 9:case 21:{e=i;break}case 29:break f;default:{o=91;break a}}}k=j&255;if(!(1<<(k&31)&c[57168+((k>>>5|d[143937+(h&255)>>0]<<3)<<2)>>2])){o=78;break a}else h=0}while(0);e=e+4|0;c[p>>2]=e}switch(o|0){case 9:{c[g>>2]=e;e=0;break}case 11:{if((f-e|0)<2)e=-2;else{c[g>>2]=e;e=0}break}case 13:{if((f-e|0)<3)e=-2;else{c[g>>2]=e;e=0}break}case 15:{if((f-e|0)<4)e=-2;else{c[g>>2]=e;e=0}break}case 18:{c[g>>2]=e;e=0;break}case 25:{c[g>>2]=h;e=0;break}case 26:{if((f-h|0)<2)e=-2;else{c[g>>2]=h;e=0}break}case 28:{if((f-h|0)<3)e=-2;else{c[g>>2]=h;e=0}break}case 30:{if((f-h|0)<4)e=-2;else{c[g>>2]=h;e=0}break}case 32:{c[g>>2]=h;e=0;break}case 38:{c[g>>2]=e;e=0;break}case 45:{c[g>>2]=j;e=0;break}case 59:{c[g>>2]=e;e=0;break}case 62:{if(!e){c[g>>2]=c[p>>2];e=0}break}case 64:{c[g>>2]=e;e=0;break}case 71:{c[g>>2]=i;e=0;break}case 78:{c[g>>2]=i;e=0;break}case 79:{if((n-i|0)<2)e=-2;else{c[g>>2]=i;e=0}break}case 81:{if((n-i|0)<3)e=-2;else{c[g>>2]=i;e=0}break}case 83:{if((n-i|0)<4)e=-2;else{c[g>>2]=i;e=0}break}case 85:{c[g>>2]=e+4;e=1;break}case 86:{h=i+2|0;c[p>>2]=h;e=h;if((h|0)==(f|0))e=-1;else{if((a[i+3>>0]|0)==0?(a[h>>0]|0)==62:0){c[g>>2]=i+4;e=3;break}c[g>>2]=e;e=0}break}case 91:{c[g>>2]=i;e=0;break}case 93:{c[g>>2]=e;e=0;break}}l=q;return e|0}function G$(b,d,e){b=b|0;d=d|0;e=e|0;c[e>>2]=11;a:do if((d-b|0)==6?(a[b+1>>0]|0)==0:0){switch(a[b>>0]|0){case 120:{d=0;break}case 88:{d=1;break}default:{d=1;break a}}if(!(a[b+3>>0]|0)){switch(a[b+2>>0]|0){case 109:break;case 77:{d=1;break}default:{d=1;break a}}if(!(a[b+5>>0]|0)){switch(a[b+4>>0]|0){case 108:break;case 76:{d=0;break a}default:{d=1;break a}}if(!d){c[e>>2]=12;d=1}else d=0}else d=1}else d=1}else d=1;while(0);return d|0}function H$(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0;l=e+76|0;k=g;a:while(1){if((f|0)==(g|0)){e=-1;break}i=a[f+1>>0]|0;e=a[f>>0]|0;if(!(i<<24>>24))i=d[l+(e&255)>>0]|0;else i=v$(i,e)|0;j=f+2|0;e=k-f|0;switch(i|0){case 8:case 1:case 0:{m=12;break a}case 5:if((e|0)<2){e=-2;break a}else{f=j;continue a}case 6:{if((e|0)<3){e=-2;break a}f=f+3|0;continue a}case 7:{if((e|0)<4){e=-2;break a}f=f+4|0;continue a}case 13:case 12:if((i|0)==(b|0)){m=14;break a}else{f=j;continue a}default:{f=j;continue a}}}b:do if((m|0)==12){c[h>>2]=f;e=0}else if((m|0)==14)if((j|0)==(g|0))e=-27;else{c[h>>2]=j;f=a[f+3>>0]|0;e=a[j>>0]|0;if(!(f<<24>>24))e=d[l+(e&255)>>0]|0;else e=v$(f,e)|0;switch(e|0){case 20:case 30:case 11:case 10:case 9:case 21:{e=27;break b}default:{}}e=0}while(0);return e|0}function I$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;a:do if((e|0)==(f|0))h=-1;else{h=a[e+1>>0]|0;i=a[e>>0]|0;k=b+76|0;if(!(h<<24>>24))i=d[k+(i&255)>>0]|0;else i=v$(h,i)|0;h=e+2|0;switch(i|0){case 27:{h=B$(b,h,f,g)|0;break a}case 20:{c[g>>2]=h;h=33;break a}case 24:case 22:{e=h;b:while(1){if((e|0)==(f|0)){h=-1;break a}h=a[e+1>>0]|0;i=a[e>>0]|0;if(!(h<<24>>24))h=d[k+(i&255)>>0]|0;else h=v$(h,i)|0;b=e+2|0;switch(h|0){case 24:case 22:{e=b;break}case 30:{j=14;break b}case 10:case 9:case 21:break b;default:{j=21;break b}}}if((j|0)==21){c[g>>2]=e;h=0;break a}c:do if((j|0)==14){if((b|0)==(f|0)){h=-1;break a}i=a[e+3>>0]|0;h=a[b>>0]|0;if(!(i<<24>>24))h=d[k+(h&255)>>0]|0;else h=v$(i,h)|0;switch(h|0){case 30:case 10:case 9:case 21:break;default:break c}c[g>>2]=e;h=0;break a}while(0);c[g>>2]=e;h=16;break a}default:{c[g>>2]=e;h=0;break a}}}while(0);return h|0}function J$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;a:do if((e|0)!=(f|0)){j=a[e+1>>0]|0;k=b+76|0;i=a[e>>0]|0;if(!(j<<24>>24))h=d[k+(i&255)>>0]|0;else h=v$(j,i)|0;l=f;b=l-e|0;switch(h|0){case 29:{i=i&255;if(!(1<<(i&31)&c[57168+((i>>>5|(d[143937+(j&255)>>0]|0)<<3)<<2)>>2])){c[g>>2]=e;b=0;break a}break}case 24:case 22:break;case 5:{if((b|0)<2){b=-2;break a}c[g>>2]=e;b=0;break a}case 6:{if((b|0)<3){b=-2;break a}c[g>>2]=e;b=0;break a}case 7:{if((b|0)<4){b=-2;break a}c[g>>2]=e;b=0;break a}default:{c[g>>2]=e;b=0;break a}}b:while(1){b=e;e=e+2|0;if((e|0)==(f|0)){b=-20;break a}b=a[b+3>>0]|0;h=a[e>>0]|0;if(!(b<<24>>24))i=d[k+(h&255)>>0]|0;else i=v$(b,h)|0;switch(i|0){case 27:case 26:case 25:case 24:case 22:continue b;case 5:{h=22;break b}case 6:{h=24;break b}case 7:{h=26;break b}case 36:case 30:case 11:case 32:case 21:case 10:case 9:{h=28;break b}case 29:break;default:{h=29;break b}}j=h&255;if(!(1<<(j&31)&c[57168+((j>>>5|(d[144193+(b&255)>>0]|0)<<3)<<2)>>2])){h=21;break}}if((h|0)==21){c[g>>2]=e;b=0;break}else if((h|0)==22){if((l-e|0)<2){b=-2;break}c[g>>2]=e;b=0;break}else if((h|0)==24){if((l-e|0)<3){b=-2;break}c[g>>2]=e;b=0;break}else if((h|0)==26){if((l-e|0)<4){b=-2;break}c[g>>2]=e;b=0;break}else if((h|0)==28){c[g>>2]=e;b=20;break}else if((h|0)==29){c[g>>2]=e;b=0;break}}else b=-1;while(0);return b|0}function K$(b,d,e){b=b|0;d=d|0;e=e|0;e=L$(e)|0;if((e|0)==-1)e=0;else{a[b+73>>0]=e;c[b>>2]=67;c[b+4>>2]=68;c[b+52>>2]=31;c[b+76>>2]=d;c[d>>2]=b;e=1}return e|0}function L$(a){a=a|0;var b=0;a:do if(!a)b=6;else{b=0;while(1){if((b|0)>=6){b=-1;break a}if(u0(a,c[60316+(b<<2)>>2]|0)|0)break a;b=b+1|0}}while(0);return b|0}function M$(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return P$(59184,a,0,b,c,d)|0}function N$(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return P$(59184,a,1,b,c,d)|0}function O$(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;D_(58816,b,c,d);return}function P$(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a:do if((f|0)==(g|0))d=-4;else{p=c[d+76>>2]|0;i=f+1|0;o=(e|0)==1;n=d+73|0;b:do if((i|0)==(g|0)){d=a[n>>0]|0;if(((d<<24>>24)+-3|0)>>>0<3){d=-1;break a}switch(a[f>>0]|0){case 60:case 0:{d=-1;break a}case -17:case -1:case -2:break;default:break b}if(!(o&d<<24>>24==0)){d=-1;break a}}else{l=a[f>>0]|0;d=a[i>>0]|0;i=b+16|0;m=b+20|0;j=f+2|0;k=((l&255)<<8|d&255)&65535;c:do if(k<<16>>16<-2){if(k<<16>>16>=-257){switch(k<<16>>16){case -257:break;default:break c}if(o&(a[n>>0]|0)==0)break b;c[h>>2]=j;c[p>>2]=c[i>>2];d=14;break a}switch(k<<16>>16){case -4165:break;default:break c}if(o)switch(a[n>>0]|0){case 0:case 3:case 4:case 5:break b;default:{}}if((j|0)==(g|0)){d=-1;break a}if((a[j>>0]|0)!=-65)break b;c[h>>2]=f+3;c[p>>2]=c[b+8>>2];d=14;break a}else{if(k<<16>>16<15360){switch(k<<16>>16){case -2:break;default:break c}if(o&(a[n>>0]|0)==0)break b;c[h>>2]=j;c[p>>2]=c[m>>2];d=14;break a}switch(k<<16>>16){case 15360:break;default:break c}d=a[n>>0]|0;if(d<<24>>24==4){if(o)break b}else if(o&d<<24>>24==3)break b;d=c[m>>2]|0;c[p>>2]=d;d=tb[c[d+(e<<2)>>2]&127](d,f,g,h)|0;break a}while(0);if(l<<24>>24){if(o|d<<24>>24!=0)break;d=c[m>>2]|0;c[p>>2]=d;d=tb[c[d+(e<<2)>>2]&127](d,f,g,h)|0;break a}if(o?(a[n>>0]|0)==5:0)break;d=c[i>>2]|0;c[p>>2]=d;d=tb[c[d+(e<<2)>>2]&127](d,f,g,h)|0;break a}while(0);d=c[b+(a[n>>0]<<2)>>2]|0;c[p>>2]=d;d=tb[c[d+(e<<2)>>2]&127](d,f,g,h)|0}while(0);return d|0}function Q$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;a:do if((e|0)!=(f|0)){h=e;p=f-h|0;o=(p&1|0)==0;p=p&-2;q=(p|0)==0;p=o|q?f:e+p|0;if(o|q^1){i=a[e>>0]|0;q=b+76|0;l=a[e+1>>0]|0;if(!(i<<24>>24))k=d[q+(l&255)>>0]|0;else k=v$(i,l)|0;j=e+2|0;o=p;m=e+3|0;f=o-h|0;h=(j|0)==(p|0);n=e+4|0;do switch(k|0){case 12:{f=q0(12,b,j,p,g)|0;break a}case 13:{f=q0(13,b,j,p,g)|0;break a}case 2:{if(h){f=-1;break a}h=a[j>>0]|0;f=a[m>>0]|0;if(!(h<<24>>24))f=d[q+(f&255)>>0]|0;else f=v$(h,f)|0;switch(f|0){case 16:{f=r0(b,n,p,g)|0;break a}case 15:{f=m0(b,n,p,g)|0;break a}case 7:case 6:case 5:case 29:case 24:case 22:{c[g>>2]=e;f=29;break a}default:{c[g>>2]=j;f=0;break a}}}case 9:{if(h){c[g>>2]=p;f=-15;break a}else h=20;break}case 10:case 21:{h=20;break}case 30:{f=g0(b,j,p,g)|0;break a}case 35:{c[g>>2]=j;f=38;break a}case 20:{c[g>>2]=j;f=25;break a}case 4:{if(h){f=-26;break a}if((a[j>>0]|0)==0?(a[m>>0]|0)==93:0){if((n|0)==(p|0)){f=-1;break a}if((a[n>>0]|0)==0?(a[e+5>>0]|0)==62:0){c[g>>2]=e+6;f=34;break a}}c[g>>2]=j;f=26;break a}case 31:{c[g>>2]=j;f=23;break a}case 32:{if(h){f=-24;break a}h=a[j>>0]|0;f=a[m>>0]|0;if(!(h<<24>>24))f=d[q+(f&255)>>0]|0;else f=v$(h,f)|0;switch(f|0){case 33:{c[g>>2]=n;f=36;break a}case 15:{c[g>>2]=n;f=35;break a}case 34:{c[g>>2]=n;f=37;break a}case 32:case 36:case 35:case 11:case 21:case 10:case 9:{c[g>>2]=j;f=24;break a}default:{c[g>>2]=j;f=0;break a}}}case 36:{c[g>>2]=j;f=21;break a}case 11:{c[g>>2]=j;f=17;break a}case 19:{f=s0(b,j,p,g)|0;break a}case 5:{if((f|0)<2){f=-2;break a}c[g>>2]=e;f=0;break a}case 6:{if((f|0)<3){f=-2;break a}c[g>>2]=e;f=0;break a}case 7:{if((f|0)<4){f=-2;break a}c[g>>2]=e;f=0;break a}case 24:case 22:{f=18;h=63;break}case 23:case 27:case 26:case 25:{f=19;h=63;break}case 29:{i=i&255;h=l&255;f=h>>>5;h=1<<(h&31);if(!(h&c[57168+((f|d[143937+i>>0]<<3)<<2)>>2]))if(!(c[57168+((d[144193+i>>0]<<3|f)<<2)>>2]&h))h=62;else{f=19;h=63}else{f=18;h=63}break}default:h=62}while(0);if((h|0)==20){b:while(1){i=e;e=e+2|0;if((e|0)==(p|0)){h=27;break}f=a[e>>0]|0;h=a[i+3>>0]|0;if(!(f<<24>>24))f=d[q+(h&255)>>0]|0;else f=v$(f,h)|0;switch(f|0){case 10:case 21:{h=20;continue b}case 9:break;default:{h=26;break b}}if((i+4|0)==(p|0)){h=26;break}else h=20}if((h|0)==26){c[g>>2]=e;f=15;break}else if((h|0)==27){c[g>>2]=p;f=15;break}}else if((h|0)==62){c[g>>2]=e;f=0;break}else if((h|0)==63){c:while(1){if((j|0)==(p|0)){h=103;break}h=a[j>>0]|0;i=a[j+1>>0]|0;if(!(h<<24>>24))e=d[q+(i&255)>>0]|0;else e=v$(h,i)|0;k=j+2|0;switch(e|0){case 27:case 26:case 25:case 24:case 22:{h=f;j=k;f=h;h=63;continue c}case 5:{h=70;break c}case 6:{h=72;break c}case 7:{h=74;break c}case 10:case 9:case 21:case 30:case 20:case 36:case 35:case 32:case 11:{h=76;break c}case 34:{h=93;break c}case 33:{h=96;break c}case 15:{h=99;break c}case 29:{n=i&255;if(!(1<<(n&31)&c[57168+((n>>>5|d[144193+(h&255)>>0]<<3)<<2)>>2])){h=69;break c}else{h=f;j=k;f=h;h=63;continue c}}case 23:break;default:{h=102;break c}}switch(f&63){case 18:break;case 41:{f=19;j=k;h=63;continue c}default:{h=f;j=k;f=h;h=63;continue c}}if((k|0)==(p|0)){f=-1;break a}f=a[k>>0]|0;h=a[j+3>>0]|0;if(!(f<<24>>24))i=d[q+(h&255)>>0]|0;else i=v$(f,h)|0;switch(i|0){case 5:{h=86;break c}case 6:{h=88;break c}case 7:{h=90;break c}case 29:{n=h&255;if(!(1<<(n&31)&c[57168+((n>>>5|d[144193+(f&255)>>0]<<3)<<2)>>2])){h=84;break c}break}case 27:case 26:case 25:case 24:case 22:break;default:{f=19;j=k;h=63;continue c}}f=41;j=j+4|0;h=63}switch(h|0){case 69:{c[g>>2]=j;f=0;break a}case 70:{if((o-j|0)<2){f=-2;break a}c[g>>2]=j;f=0;break a}case 72:{if((o-j|0)<3){f=-2;break a}c[g>>2]=j;f=0;break a}case 74:{if((o-j|0)<4){f=-2;break a}c[g>>2]=j;f=0;break a}case 76:{c[g>>2]=j;break a}case 84:{c[g>>2]=k;f=0;break a}case 86:{if((o-k|0)<2){f=-2;break a}c[g>>2]=k;f=0;break a}case 88:{if((o-k|0)<3){f=-2;break a}c[g>>2]=k;f=0;break a}case 90:{if((o-k|0)<4){f=-2;break a}c[g>>2]=k;f=0;break a}case 93:if((f|0)==19){c[g>>2]=j;f=0;break a}else{c[g>>2]=k;f=32;break a}case 96:if((f|0)==19){c[g>>2]=j;f=0;break a}else{c[g>>2]=k;f=31;break a}case 99:if((f|0)==19){c[g>>2]=j;f=0;break a}else{c[g>>2]=k;f=30;break a}case 102:{c[g>>2]=j;f=0;break a}case 103:{f=0-f|0;break a}}}}else f=-1}else f=-4;while(0);return f|0}function R$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a:do if((e|0)!=(f|0)){l=e;o=f-l|0;n=(o&1|0)==0;o=o&-2;p=(o|0)==0;o=n|p?f:e+o|0;if(n|p^1){f=a[e>>0]|0;p=b+76|0;h=a[e+1>>0]|0;if(!(f<<24>>24))i=d[p+(h&255)>>0]|0;else i=v$(f,h)|0;k=e+2|0;n=o;h=(k|0)==(o|0);j=e+3|0;m=e+4|0;f=n-l|0;switch(i|0){case 2:{f=j0(b,k,o,g)|0;break a}case 3:{f=f0(b,k,o,g)|0;break a}case 9:{if(h){f=-3;break a}h=a[k>>0]|0;f=a[j>>0]|0;if(!(h<<24>>24))f=d[p+(f&255)>>0]|0;else f=v$(h,f)|0;c[g>>2]=(f|0)==10?m:k;f=7;break a}case 10:{c[g>>2]=k;f=7;break a}case 4:{if(h){f=-5;break a}if((a[k>>0]|0)==0?(a[j>>0]|0)==93:0){if((m|0)==(o|0)){f=-5;break a}if((a[m>>0]|0)==0?(a[e+5>>0]|0)==62:0){c[g>>2]=m;f=0;break a}}break}case 5:{if((f|0)<2){f=-2;break a}break}case 6:{if((f|0)<3){f=-2;break a}else k=j;break}case 7:{if((f|0)<4){f=-2;break a}else k=m;break}case 8:case 1:case 0:{c[g>>2]=e;f=0;break a}default:{}}b:while(1){if((k|0)==(o|0)){h=46;break}f=a[k>>0]|0;h=a[k+1>>0]|0;if(!(f<<24>>24))i=d[p+(h&255)>>0]|0;else i=v$(f,h)|0;j=k+4|0;f=k+2|0;h=n-k|0;switch(i|0){case 10:case 9:case 8:case 1:case 0:case 2:case 3:{h=45;break b}case 5:if((h|0)<2){h=32;break b}else{k=f;continue b}case 6:{if((h|0)<3){h=34;break b}k=k+3|0;continue b}case 7:if((h|0)<4){h=37;break b}else{k=j;continue b}case 4:{if((f|0)==(o|0)){h=45;break b}if(a[f>>0]|0){k=f;continue b}if((a[k+3>>0]|0)!=93){k=f;continue b}if((j|0)==(o|0)){h=45;break b}if(a[j>>0]|0){k=f;continue b}if((a[k+5>>0]|0)==62){h=44;break b}else{k=f;continue b}}default:{k=f;continue b}}}if((h|0)==32){c[g>>2]=k;f=6;break}else if((h|0)==34){c[g>>2]=k;f=6;break}else if((h|0)==37){c[g>>2]=k;f=6;break}else if((h|0)==44){c[g>>2]=j;f=0;break}else if((h|0)==45){c[g>>2]=k;f=6;break}else if((h|0)==46){c[g>>2]=o;f=6;break}}else f=-1}else f=-4;while(0);return f|0}function S$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;a:do if((e|0)!=(f|0)){k=e;m=f-k|0;l=(m&1|0)==0;m=m&-2;n=(m|0)==0;m=l|n?f:e+m|0;if(l|n^1){h=a[e>>0]|0;n=b+76|0;f=a[e+1>>0]|0;if(!(h<<24>>24))h=d[n+(f&255)>>0]|0;else h=v$(h,f)|0;i=e+2|0;j=e+3|0;l=m;b=(i|0)==(m|0);f=l-k|0;k=e+4|0;switch(h|0){case 4:{if(b){f=-1;break a}if((a[i>>0]|0)==0?(a[j>>0]|0)==93:0){if((k|0)==(m|0)){f=-1;break a}if((a[k>>0]|0)==0?(a[e+5>>0]|0)==62:0){c[g>>2]=e+6;f=40;break a}}break}case 9:{if(b){f=-1;break a}b=a[i>>0]|0;f=a[j>>0]|0;if(!(b<<24>>24))f=d[n+(f&255)>>0]|0;else f=v$(b,f)|0;c[g>>2]=(f|0)==10?k:i;f=7;break a}case 10:{c[g>>2]=i;f=7;break a}case 5:{if((f|0)<2){f=-2;break a}break}case 6:{if((f|0)<3){f=-2;break a}else i=j;break}case 7:{if((f|0)<4){f=-2;break a}else i=k;break}case 8:case 1:case 0:{c[g>>2]=e;f=0;break a}default:{}}b:while(1){if((i|0)==(m|0)){b=38;break}f=a[i>>0]|0;b=a[i+1>>0]|0;if(!(f<<24>>24))h=d[n+(b&255)>>0]|0;else h=v$(f,b)|0;f=i+2|0;b=l-i|0;switch(h|0){case 4:case 10:case 9:case 8:case 1:case 0:{b=37;break b}case 5:if((b|0)<2){b=30;break b}else{i=f;continue b}case 6:{if((b|0)<3){b=32;break b}i=i+3|0;continue b}case 7:{if((b|0)<4){b=35;break b}i=i+4|0;continue b}default:{i=f;continue b}}}if((b|0)==30){c[g>>2]=i;f=6;break}else if((b|0)==32){c[g>>2]=i;f=6;break}else if((b|0)==35){c[g>>2]=i;f=6;break}else if((b|0)==37){c[g>>2]=i;f=6;break}else if((b|0)==38){c[g>>2]=m;f=6;break}}else f=-1}else f=-4;while(0);return f|0}function T$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;r=f-e|0;r=(r&1|0)==0?f:e+(r&-2)|0;p=b+76|0;q=r;o=0;a:while(1){if((e|0)==(r|0)){f=-1;break}f=a[e>>0]|0;b=a[e+1>>0]|0;if(!(f<<24>>24))n=d[p+(b&255)>>0]|0;else n=v$(f,b)|0;f=e+2|0;b=(f|0)==(r|0);h=e+3|0;i=e+4|0;j=e+5|0;k=e+6|0;l=q-e|0;m=(i|0)==(r|0);switch(n|0){case 8:case 1:case 0:{s=10;break a}case 5:if((l|0)<2){f=-2;break a}else{n=o;e=f;o=n;continue a}case 6:if((l|0)<3){f=-2;break a}else{n=o;e=h;o=n;continue a}case 7:if((l|0)<4){f=-2;break a}else{n=o;e=i;o=n;continue a}case 2:{if(b){f=-1;break a}if(a[f>>0]|0){n=o;e=f;o=n;continue a}if((a[h>>0]|0)!=33){n=o;e=f;o=n;continue a}if(m){f=-1;break a}if(a[i>>0]|0){n=o;e=i;o=n;continue a}e=(a[j>>0]|0)==91;o=(e&1)+o|0;e=e?k:i;continue a}case 4:{if(b){f=-1;break a}if(a[f>>0]|0){n=o;e=f;o=n;continue a}if((a[h>>0]|0)!=93){n=o;e=f;o=n;continue a}if(m){f=-1;break a}if(a[i>>0]|0){n=o;e=i;o=n;continue a}if((a[j>>0]|0)!=62){n=o;e=i;o=n;continue a}if(!o){s=24;break a}o=o+-1|0;e=k;continue a}default:{n=o;e=f;o=n;continue a}}}if((s|0)==10){c[g>>2]=e;f=0}else if((s|0)==24){c[g>>2]=k;f=42}return f|0}function U$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;do if((e|0)!=(f|0)){l=b+76|0;j=e;a:while(1){if((j|0)==(f|0)){i=27;break}i=a[j>>0]|0;h=a[j+1>>0]|0;if(!(i<<24>>24))h=d[l+(h&255)>>0]|0;else h=v$(i,h)|0;k=j+2|0;switch(h|0){case 21:{i=24;break a}case 3:{i=10;break a}case 2:{i=13;break a}case 10:{i=14;break a}case 9:{i=17;break a}case 6:{j=j+3|0;continue a}case 7:{j=j+4|0;continue a}default:{j=k;continue a}}}if((i|0)==10)if((j|0)==(e|0)){h=f0(b,k,f,g)|0;break}else{c[g>>2]=j;h=6;break}else if((i|0)==13){c[g>>2]=j;h=0;break}else if((i|0)==14)if((j|0)==(e|0)){c[g>>2]=k;h=7;break}else{c[g>>2]=j;h=6;break}else if((i|0)==17){if((j|0)!=(e|0)){c[g>>2]=j;h=6;break}if((k|0)==(f|0)){h=-3;break}h=a[k>>0]|0;i=a[e+3>>0]|0;if(!(h<<24>>24))h=d[l+(i&255)>>0]|0;else h=v$(h,i)|0;c[g>>2]=(h|0)==10?e+4|0:k;h=7;break}else if((i|0)==24)if((j|0)==(e|0)){c[g>>2]=k;h=39;break}else{c[g>>2]=j;h=6;break}else if((i|0)==27){c[g>>2]=f;h=6;break}}else h=-4;while(0);return h|0}function V$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;do if((e|0)!=(f|0)){l=b+76|0;j=e;a:while(1){if((j|0)==(f|0)){i=26;break}i=a[j>>0]|0;h=a[j+1>>0]|0;if(!(i<<24>>24))h=d[l+(h&255)>>0]|0;else h=v$(i,h)|0;k=j+2|0;switch(h|0){case 9:{i=19;break a}case 3:{i=10;break a}case 30:{i=13;break a}case 10:{i=16;break a}case 6:{j=j+3|0;continue a}case 7:{j=j+4|0;continue a}default:{j=k;continue a}}}if((i|0)==10)if((j|0)==(e|0)){h=f0(b,k,f,g)|0;break}else{c[g>>2]=j;h=6;break}else if((i|0)==13)if((j|0)==(e|0)){h=g0(b,k,f,g)|0;h=(h|0)==22?0:h;break}else{c[g>>2]=j;h=6;break}else if((i|0)==16)if((j|0)==(e|0)){c[g>>2]=k;h=7;break}else{c[g>>2]=j;h=6;break}else if((i|0)==19){if((j|0)!=(e|0)){c[g>>2]=j;h=6;break}if((k|0)==(f|0)){h=-3;break}h=a[k>>0]|0;i=a[e+3>>0]|0;if(!(h<<24>>24))h=d[l+(i&255)>>0]|0;else h=v$(h,i)|0;c[g>>2]=(h|0)==10?e+4|0:k;h=7;break}else if((i|0)==26){c[g>>2]=f;h=6;break}}else h=-4;while(0);return h|0}function W$(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;j=b+76|0;b=c;a:while(1){c=a[b>>0]|0;h=b+1|0;i=a[h>>0]|0;if(!(c<<24>>24))f=d[j+(i&255)>>0]|0;else f=v$(c,i)|0;g=e+1|0;switch(f|0){case 7:{if(c<<24>>24==(a[e>>0]|0)){e=g;b=h;c=i;k=7}else{b=0;break a}break}case 6:{k=7;break}case 5:{k=9;break}case 27:case 26:case 25:case 24:case 23:case 22:case 29:{if((a[e>>0]|0)!=c<<24>>24){b=0;break a}if((a[g>>0]|0)!=i<<24>>24){b=0;break a}break}default:{k=14;break a}}if((k|0)==7){k=0;f=b+1|0;if(c<<24>>24!=(a[e>>0]|0)){b=0;break}e=e+1|0;b=f;c=a[f>>0]|0;k=9}if((k|0)==9){k=0;if(c<<24>>24!=(a[e>>0]|0)){b=0;break}if((a[b+1>>0]|0)!=(a[e+1>>0]|0)){b=0;break}}e=e+2|0;b=b+2|0}b:do if((k|0)==14){e=a[e>>0]|0;b=a[g>>0]|0;if(!(e<<24>>24))b=d[j+(b&255)>>0]|0;else b=v$(e,b)|0;switch(b|0){case 27:case 26:case 25:case 24:case 23:case 22:case 29:case 7:case 6:case 5:{b=0;break b}default:{}}b=1}while(0);return b|0}function X$(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;b=c;while(1){c=a[e>>0]|0;f=(b|0)==(d|0);if(!(c<<24>>24)){g=7;break}if(f){b=0;break}if(a[b>>0]|0){b=0;break}if((a[b+1>>0]|0)!=c<<24>>24){b=0;break}e=e+1|0;b=b+2|0}if((g|0)==7)b=f&1;return b|0}function Y$(b,c){b=b|0;c=c|0;var e=0,f=0,g=0;g=b+76|0;f=c;a:while(1){b=a[f>>0]|0;e=a[f+1>>0]|0;if(!(b<<24>>24))b=d[g+(e&255)>>0]|0;else b=v$(b,e)|0;switch(b|0){case 27:case 26:case 25:case 24:case 23:case 22:case 29:case 5:{f=f+2|0;continue a}case 6:{f=f+3|0;continue a}case 7:{f=f+4|0;continue a}default:break a}}return f-c|0}function Z$(b,c){b=b|0;c=c|0;var e=0,f=0;f=b+76|0;a:while(1){b=a[c>>0]|0;e=a[c+1>>0]|0;if(!(b<<24>>24))b=d[f+(e&255)>>0]|0;else b=v$(b,e)|0;switch(b|0){case 21:case 9:case 10:break;default:break a}c=c+2|0}return c|0}function _$(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;z=b+76|0;x=0;y=0;u=1;a:while(1){w=e+2|0;b=a[w>>0]|0;r=b<<24>>24==0;s=e+3|0;t=a[s>>0]|0;if(r)q=d[z+(t&255)>>0]|0;else q=v$(b,t)|0;b=(y|0)<(f|0);h=e+4|0;i=(u|0)==1;j=(u|0)==2;v=g+(y<<4)+12|0;k=y+1|0;l=(u|0)==0;m=(u|0)!=2;n=g+(y<<4)+8|0;o=g+(y<<4)+4|0;p=g+(y<<4)|0;do switch(q|0){case 5:{if(!l){s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}if(!b){t=y;v=x;u=1;e=w;y=t;x=v;continue a}c[p>>2]=w;a[v>>0]=1;t=y;v=x;u=1;e=w;y=t;x=v;continue a}case 6:{if(!l){t=u;v=y;w=x;e=s;u=t;y=v;x=w;continue a}if(!b){v=y;w=x;u=1;e=s;y=v;x=w;continue a}c[p>>2]=w;a[v>>0]=1;v=y;w=x;u=1;e=s;y=v;x=w;continue a}case 7:{if(!l){t=u;v=y;w=x;e=h;u=t;y=v;x=w;continue a}if(!b){v=y;w=x;u=1;e=h;y=v;x=w;continue a}c[p>>2]=w;a[v>>0]=1;v=y;w=x;u=1;e=h;y=v;x=w;continue a}case 24:case 22:case 29:{if(!l){s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}if(!b){t=y;v=x;u=1;e=w;y=t;x=v;continue a}c[p>>2]=w;a[v>>0]=1;t=y;v=x;u=1;e=w;y=t;x=v;continue a}case 12:{if(m){if(!b){v=y;x=12;u=2;e=w;y=v;continue a}c[o>>2]=h;v=y;x=12;u=2;e=w;y=v;continue a}if((x|0)!=12){t=y;v=x;u=2;e=w;y=t;x=v;continue a}if(!b){x=12;y=k;u=0;e=w;continue a}c[n>>2]=w;x=12;y=k;u=0;e=w;continue a}case 13:{if(m){if(!b){v=y;x=13;u=2;e=w;y=v;continue a}c[o>>2]=h;v=y;x=13;u=2;e=w;y=v;continue a}if((x|0)!=13){t=y;v=x;u=2;e=w;y=t;x=v;continue a}if(!b){x=13;y=k;u=0;e=w;continue a}c[n>>2]=w;x=13;y=k;u=0;e=w;continue a}case 3:{if(!b){s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}a[v>>0]=0;s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}case 21:{if(i){t=y;v=x;u=0;e=w;y=t;x=v;continue a}if(!j){s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}if(!b){t=y;v=x;u=2;e=w;y=t;x=v;continue a}if(!(a[v>>0]|0)){t=y;v=x;u=2;e=w;y=t;x=v;continue a}do if(r&(w|0)!=(c[o>>2]|0)&t<<24>>24==32){h=a[h>>0]|0;b=a[e+5>>0]|0;if(!(h<<24>>24)){if(b<<24>>24==32)break;b=d[z+(b&255)>>0]|0}else b=v$(h,b)|0;if((b|0)!=(x|0)){t=y;v=x;u=2;e=w;y=t;x=v;continue a}}while(0);a[v>>0]=0;t=y;v=x;u=2;e=w;y=t;x=v;continue a}case 10:case 9:{if(i){t=y;v=x;u=0;e=w;y=t;x=v;continue a}if(!j){s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}if(!b){t=y;v=x;u=2;e=w;y=t;x=v;continue a}a[v>>0]=0;t=y;v=x;u=2;e=w;y=t;x=v;continue a}case 17:case 11:if(m)break a;else{t=y;v=x;u=2;e=w;y=t;x=v;continue a}default:{s=u;t=y;v=x;e=w;u=s;y=t;x=v;continue a}}while(0)}return y|0}function $$(b,c){b=b|0;c=c|0;var d=0,e=0,f=0;b=c+4|0;d=a[b>>0]|0;a:do if(!(d<<24>>24))if((a[c+5>>0]|0)==120){c=c+6|0;b=0;while(1){b:while(1){if(!(a[c>>0]|0)){d=a[c+1>>0]|0;if(d<<24>>24==59){f=18;break a}d=d<<24>>24;switch(d|0){case 57:case 56:case 55:case 54:case 53:case 52:case 51:case 50:case 49:case 48:{f=8;break b}case 70:case 69:case 68:case 67:case 66:case 65:{f=9;break b}case 102:case 101:case 100:case 99:case 98:case 97:{f=10;break b}default:{}}}c=c+2|0}if((f|0)==8){f=0;b=d+-48|b<<4}else if((f|0)==9){f=0;b=(b<<4)+-55+d|0}else if((f|0)==10){f=0;b=(b<<4)+-87+d|0}if((b|0)<1114112)c=c+2|0;else{b=-1;break}}}else{e=b;b=0;c=0;f=13}else{e=b;b=0;c=d;f=13}while(0);c:do if((f|0)==13)while(1){f=0;if(!(c<<24>>24)){c=a[e+1>>0]|0;if(c<<24>>24==59){f=18;break c}c=c<<24>>24}else c=-1;b=(b*10|0)+-48+c|0;c=e+2|0;if((b|0)>=1114112){b=-1;break c}e=c;c=a[c>>0]|0;f=13}while(0);if((f|0)==18)b=k_(b)|0;return b|0}function a0(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;g=c+2|0;h=c+3|0;i=c+4|0;e=c+5|0;f=c+1|0;a:do switch((d-c|0)/2|0|0){case 2:{if((a[g>>0]|0)==0?(a[h>>0]|0)==116:0){if(!(a[c>>0]|0))b=a[f>>0]|0;else b=-1;b=(b|0)==108?60:(b|0)==103?62:0}else j=27;break}case 3:{if((((((a[c>>0]|0)==0?(a[f>>0]|0)==97:0)?(a[g>>0]|0)==0:0)?(a[h>>0]|0)==109:0)?(a[i>>0]|0)==0:0)?(a[e>>0]|0)==112:0)b=38;else j=27;break}case 4:{if(!(a[c>>0]|0)){d=c+6|0;b=c+7|0;switch(a[f>>0]|0){case 113:{if(a[g>>0]|0){j=27;break a}if((a[h>>0]|0)!=117){j=27;break a}if(a[i>>0]|0){j=27;break a}if((a[e>>0]|0)!=111){j=27;break a}if(a[d>>0]|0){j=27;break a}if((a[b>>0]|0)==116){b=34;break a}else{j=27;break a}}case 97:{if(a[g>>0]|0){j=27;break a}if((a[h>>0]|0)!=112){j=27;break a}if(a[i>>0]|0){j=27;break a}if((a[e>>0]|0)!=111){j=27;break a}if(a[d>>0]|0){j=27;break a}if((a[b>>0]|0)==115){b=39;break a}else{j=27;break a}}default:{j=27;break a}}}else j=27;break}default:j=27}while(0);if((j|0)==27)b=0;return b|0}function b0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;j=b+76|0;k=g+4|0;b=e;while(1){if(b>>>0>=f>>>0)break;h=a[b>>0]|0;e=a[b+1>>0]|0;if(!(h<<24>>24))e=d[j+(e&255)>>0]|0;else e=v$(h,e)|0;i=b+2|0;switch(e|0){case 9:{c[g>>2]=(c[g>>2]|0)+1;if((i|0)==(f|0))b=f;else{e=a[i>>0]|0;h=a[b+3>>0]|0;if(!(e<<24>>24))e=d[j+(h&255)>>0]|0;else e=v$(e,h)|0;b=(e|0)==10?b+4|0:i}c[k>>2]=-1;break}case 6:{b=b+3|0;break}case 7:{b=b+4|0;break}case 10:{c[k>>2]=-1;c[g>>2]=(c[g>>2]|0)+1;b=i;break}default:b=i}c[k>>2]=(c[k>>2]|0)+1}return}function c0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;k=f+-2|0;j=b+76|0;a:while(1){h=e+2|0;if((h|0)==(k|0)){f=1;break}f=a[h>>0]|0;i=f<<24>>24==0;b=a[e+3>>0]|0;if(i)f=d[j+(b&255)>>0]|0;else f=v$(f,b)|0;switch(f|0){case 23:case 19:case 30:case 33:case 16:case 18:case 10:case 9:case 15:case 14:case 17:case 35:case 34:case 32:case 31:case 13:case 27:case 24:case 25:{e=h;continue a}case 21:if(i&b<<24>>24==9){l=12;break a}else{e=h;continue a}case 22:case 26:{if(!i){l=12;break a}if(b<<24>>24>=0){e=h;continue a}break}default:if(!i){l=12;break a}}switch(b<<24>>24|0){case 64:case 36:{e=h;break}default:{l=12;break a}}}if((l|0)==12){c[g>>2]=h;f=0}return f|0}function d0(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;o=h;b=c[e>>2]|0;a:while(1){if((b|0)==(f|0)){b=f;break}k=a[b+1>>0]|0;i=a[b>>0]|0;m=i&255;j=k&255;n=j>>>6;l=(j&63|128)&255;switch(i<<24>>24){case 0:{if(k<<24>>24>-1){i=c[g>>2]|0;if((i|0)==(h|0))break a;c[g>>2]=i+1;a[i>>0]=k}else p=7;break}case 7:case 6:case 5:case 4:case 3:case 2:case 1:{p=7;break}case -37:case -38:case -39:case -40:{i=c[g>>2]|0;if((o-i|0)<4)break a;m=(m<<2&12|n)+1|0;c[g>>2]=i+1;a[i>>0]=m>>>2|240;n=c[g>>2]|0;c[g>>2]=n+1;a[n>>0]=j>>>2&15|m<<4&48|128;n=b+2|0;m=d[b+3>>0]|0;l=(j<<4&48|m>>>6|a[n>>0]<<2&12|128)&255;b=c[g>>2]|0;c[g>>2]=b+1;a[b>>0]=l;b=c[g>>2]|0;c[g>>2]=b+1;a[b>>0]=m&63|128;b=n;break}default:{i=c[g>>2]|0;if((o-i|0)<3)break a;c[g>>2]=i+1;a[i>>0]=m>>>4|224;k=c[g>>2]|0;c[g>>2]=k+1;a[k>>0]=n|m<<2&60|128;n=c[g>>2]|0;c[g>>2]=n+1;a[n>>0]=l}}if((p|0)==7){p=0;i=c[g>>2]|0;if((o-i|0)<2)break;c[g>>2]=i+1;a[i>>0]=n|m<<2|192;n=c[g>>2]|0;c[g>>2]=n+1;a[n>>0]=l}b=b+2|0}c[e>>2]=b;return}function e0(e,f,g,h,i){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0;e=c[f>>2]|0;if((g-e|0)>(i-(c[h>>2]|0)|0)){j=g+-2|0;j=(a[j>>0]&-8)<<24>>24==-40?j:g}else j=g;while(1){if((e|0)==(j|0))break;g=c[h>>2]|0;if((g|0)==(i|0))break;k=((d[e>>0]|0)<<8|(d[e+1>>0]|0))&65535;c[h>>2]=g+2;b[g>>1]=k;g=(c[f>>2]|0)+2|0;c[f>>2]=g;e=g}return}function f0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;a:do if((e|0)!=(f|0)){k=a[e>>0]|0;m=b+76|0;l=a[e+1>>0]|0;if(!(k<<24>>24))j=d[m+(l&255)>>0]|0;else j=v$(k,l)|0;n=f;h=n-e|0;i=e+2|0;switch(j|0){case 29:{l=l&255;if(!(1<<(l&31)&c[57168+((l>>>5|(d[143937+(k&255)>>0]|0)<<3)<<2)>>2])){c[g>>2]=e;b=0;break a}break}case 24:case 22:break;case 5:{if((h|0)<2){b=-2;break a}c[g>>2]=e;b=0;break a}case 6:{if((h|0)<3){b=-2;break a}c[g>>2]=e;b=0;break a}case 7:{if((h|0)<4){b=-2;break a}c[g>>2]=e;b=0;break a}case 19:{b=h0(b,i,f,g)|0;break a}default:{c[g>>2]=e;b=0;break a}}b:while(1){if((i|0)==(f|0)){b=-1;break a}b=a[i>>0]|0;e=a[i+1>>0]|0;if(!(b<<24>>24))h=d[m+(e&255)>>0]|0;else h=v$(b,e)|0;j=i+2|0;switch(h|0){case 27:case 26:case 25:case 24:case 22:{i=j;continue b}case 5:{e=23;break b}case 6:{e=25;break b}case 7:{e=27;break b}case 18:{e=29;break b}case 29:break;default:{e=30;break b}}l=e&255;if(!(1<<(l&31)&c[57168+((l>>>5|(d[144193+(b&255)>>0]|0)<<3)<<2)>>2])){e=22;break}else i=j}if((e|0)==22){c[g>>2]=i;b=0;break}else if((e|0)==23){if((n-i|0)<2){b=-2;break}c[g>>2]=i;b=0;break}else if((e|0)==25){if((n-i|0)<3){b=-2;break}c[g>>2]=i;b=0;break}else if((e|0)==27){if((n-i|0)<4){b=-2;break}c[g>>2]=i;b=0;break}else if((e|0)==29){c[g>>2]=j;b=9;break}else if((e|0)==30){c[g>>2]=i;b=0;break}}else b=-1;while(0);return b|0}function g0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;a:do if((e|0)!=(f|0)){j=a[e>>0]|0;k=b+76|0;i=a[e+1>>0]|0;if(!(j<<24>>24))h=d[k+(i&255)>>0]|0;else h=v$(j,i)|0;l=f;b=l-e|0;switch(h|0){case 29:{i=i&255;if(!(1<<(i&31)&c[57168+((i>>>5|(d[143937+(j&255)>>0]|0)<<3)<<2)>>2])){c[g>>2]=e;b=0;break a}break}case 24:case 22:break;case 5:{if((b|0)<2){b=-2;break a}c[g>>2]=e;b=0;break a}case 6:{if((b|0)<3){b=-2;break a}c[g>>2]=e;b=0;break a}case 7:{if((b|0)<4){b=-2;break a}c[g>>2]=e;b=0;break a}case 30:case 9:case 10:case 21:{c[g>>2]=e;b=22;break a}default:{c[g>>2]=e;b=0;break a}}e=e+2|0;b:while(1){if((e|0)==(f|0)){b=-1;break a}b=a[e>>0]|0;h=a[e+1>>0]|0;if(!(b<<24>>24))i=d[k+(h&255)>>0]|0;else i=v$(b,h)|0;j=e+2|0;switch(i|0){case 27:case 26:case 25:case 24:case 22:{e=j;continue b}case 5:{h=24;break b}case 6:{h=26;break b}case 7:{h=28;break b}case 18:{h=30;break b}case 29:break;default:{h=31;break b}}i=h&255;if(!(1<<(i&31)&c[57168+((i>>>5|(d[144193+(b&255)>>0]|0)<<3)<<2)>>2])){h=23;break}else e=j}if((h|0)==23){c[g>>2]=e;b=0;break}else if((h|0)==24){if((l-e|0)<2){b=-2;break}c[g>>2]=e;b=0;break}else if((h|0)==26){if((l-e|0)<3){b=-2;break}c[g>>2]=e;b=0;break}else if((h|0)==28){if((l-e|0)<4){b=-2;break}c[g>>2]=e;b=0;break}else if((h|0)==30){c[g>>2]=j;b=28;break}else if((h|0)==31){c[g>>2]=e;b=0;break}}else b=-1;while(0);return b|0}function h0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;a:do if((e|0)!=(f|0)){h=a[e>>0]|0;i=h<<24>>24==0;j=e+2|0;k=a[e+1>>0]|0;if(i&k<<24>>24==120){b=i0(b,j,f,g)|0;break}l=b+76|0;if(i)b=d[l+(k&255)>>0]|0;else b=v$(h,k)|0;if((b|0)!=25){c[g>>2]=e;b=0;break}b:while(1){if((j|0)==(f|0)){b=-1;break a}b=a[j>>0]|0;h=a[j+1>>0]|0;if(!(b<<24>>24))b=d[l+(h&255)>>0]|0;else b=v$(b,h)|0;i=j+2|0;switch(b|0){case 25:{j=i;break}case 18:{h=14;break b}default:{h=15;break b}}}if((h|0)==14){c[g>>2]=i;b=10;break}else if((h|0)==15){c[g>>2]=j;b=0;break}}else b=-1;while(0);return b|0}function i0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;a:do if((e|0)!=(f|0)){h=a[e>>0]|0;j=b+76|0;b=a[e+1>>0]|0;if(!(h<<24>>24))b=d[j+(b&255)>>0]|0;else b=v$(h,b)|0;if((b&-2|0)!=24){c[g>>2]=e;b=0;break}i=e+2|0;b:while(1){if((i|0)==(f|0)){b=-1;break a}b=a[i>>0]|0;h=a[i+1>>0]|0;if(!(b<<24>>24))b=d[j+(h&255)>>0]|0;else b=v$(b,h)|0;e=i+2|0;switch(b|0){case 24:case 25:{i=e;break}case 18:{h=13;break b}default:{h=14;break b}}}if((h|0)==13){c[g>>2]=e;b=10;break}else if((h|0)==14){c[g>>2]=i;b=0;break}}else b=-1;while(0);return b|0}function j0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;a:do if((e|0)!=(f|0)){k=a[e>>0]|0;n=b+76|0;l=a[e+1>>0]|0;if(!(k<<24>>24))j=d[n+(l&255)>>0]|0;else j=v$(k,l)|0;h=e+2|0;m=f;i=m-e|0;switch(j|0){case 29:{l=l&255;if(!(1<<(l&31)&c[57168+((l>>>5|d[143937+(k&255)>>0]<<3)<<2)>>2])){c[g>>2]=e;h=0;break a}else l=0;break}case 24:case 22:{l=0;break}case 5:{if((i|0)<2){h=-2;break a}c[g>>2]=e;h=0;break a}case 6:{if((i|0)<3){h=-2;break a}c[g>>2]=e;h=0;break a}case 7:{if((i|0)<4){h=-2;break a}c[g>>2]=e;h=0;break a}case 16:{if((h|0)==(f|0)){h=-1;break a}i=a[h>>0]|0;j=a[e+3>>0]|0;if(!(i<<24>>24))j=d[n+(j&255)>>0]|0;else j=v$(i,j)|0;i=e+4|0;switch(j|0){case 27:{h=k0(b,i,f,g)|0;break a}case 20:{h=l0(i,f,g)|0;break a}default:{c[g>>2]=h;h=0;break a}}}case 15:{h=m0(b,h,f,g)|0;break a}case 17:{h=n0(b,h,f,g)|0;break a}default:{c[g>>2]=e;h=0;break a}}b:while(1){c:while(1){if((h|0)==(f|0)){h=-1;break a}i=a[h>>0]|0;j=a[h+1>>0]|0;if(!(i<<24>>24))k=d[n+(j&255)>>0]|0;else k=v$(i,j)|0;e=h+2|0;switch(k|0){case 5:{o=32;break b}case 6:{o=34;break b}case 7:{o=36;break b}case 10:case 9:case 21:{h=e;o=56;break b}case 11:{o=71;break b}case 17:break b;case 27:case 26:case 25:case 24:case 22:{h=e;continue c}case 23:break c;case 29:break;default:{o=77;break b}}k=j&255;if(!(1<<(k&31)&c[57168+((k>>>5|d[144193+(i&255)>>0]<<3)<<2)>>2])){o=31;break b}else h=e}if(l|0){o=39;break}if((e|0)==(f|0)){h=-1;break a}i=a[e>>0]|0;j=a[h+3>>0]|0;if(!(i<<24>>24))k=d[n+(j&255)>>0]|0;else k=v$(i,j)|0;switch(k|0){case 5:{o=49;break b}case 6:{o=51;break b}case 7:{o=53;break b}case 29:{l=j&255;if(!(1<<(l&31)&c[57168+((l>>>5|d[143937+(i&255)>>0]<<3)<<2)>>2])){o=46;break b}break}case 24:case 22:break;default:{o=55;break b}}l=1;h=h+4|0}d:switch(o|0){case 31:{c[g>>2]=h;h=0;break a}case 32:{if((m-h|0)<2){h=-2;break a}c[g>>2]=h;h=0;break a}case 34:{if((m-h|0)<3){h=-2;break a}c[g>>2]=h;h=0;break a}case 36:{if((m-h|0)<4){h=-2;break a}c[g>>2]=h;h=0;break a}case 39:{c[g>>2]=h;h=0;break a}case 46:{c[g>>2]=e;h=0;break a}case 49:{if((m-e|0)<2){h=-2;break a}c[g>>2]=e;h=0;break a}case 51:{if((m-e|0)<3){h=-2;break a}c[g>>2]=e;h=0;break a}case 53:{if((m-e|0)<4){h=-2;break a}c[g>>2]=e;h=0;break a}case 55:{c[g>>2]=e;h=0;break a}case 56:{e:while(1){o=0;if((h|0)==(f|0)){h=-1;break a}i=a[h>>0]|0;j=a[h+1>>0]|0;if(!(i<<24>>24))l=d[n+(j&255)>>0]|0;else l=v$(i,j)|0;k=h+2|0;switch(l|0){case 11:{o=71;break d}case 17:break d;case 10:case 9:case 21:{h=k;o=56;break}case 29:{o=61;break e}case 24:case 22:break e;case 5:{o=64;break e}case 6:{o=66;break e}case 7:{o=68;break e}default:{o=70;break e}}}if((o|0)==61){o=j&255;if(!(1<<(o&31)&c[57168+((o>>>5|d[143937+(i&255)>>0]<<3)<<2)>>2])){c[g>>2]=h;h=0;break a}}else if((o|0)==64){if((m-h|0)<2){h=-2;break a}c[g>>2]=h;h=0;break a}else if((o|0)==66){if((m-h|0)<3){h=-2;break a}c[g>>2]=h;h=0;break a}else if((o|0)==68){if((m-h|0)<4){h=-2;break a}c[g>>2]=h;h=0;break a}else if((o|0)==70){c[g>>2]=h;h=0;break a}h=o0(b,k,f,g)|0;break a}case 77:{c[g>>2]=h;h=0;break a}}if((o|0)==71){c[g>>2]=h+2;h=2;break}i=h+2|0;if((i|0)!=(f|0)){if((a[i>>0]|0)==0?(a[h+3>>0]|0)==62:0){c[g>>2]=h+4;h=4;break}c[g>>2]=i;h=0}else h=-1}else h=-1;while(0);return h|0}function k0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;a:do if((e|0)==(f|0))b=-1;else{if((a[e>>0]|0)==0?(a[e+1>>0]|0)==45:0){j=b+76|0;k=f;i=e+2|0;b:while(1){if((i|0)==(f|0)){b=-1;break a}b=a[i>>0]|0;e=a[i+1>>0]|0;if(!(b<<24>>24))h=d[j+(e&255)>>0]|0;else h=v$(b,e)|0;b=i+2|0;e=k-i|0;switch(h|0){case 8:case 1:case 0:{l=16;break b}case 5:if((e|0)<2){b=-2;break a}else{i=b;continue b}case 6:{if((e|0)<3){b=-2;break a}i=i+3|0;continue b}case 7:{if((e|0)<4){b=-2;break a}i=i+4|0;continue b}case 27:{if((b|0)==(f|0)){b=-1;break a}if(a[b>>0]|0){i=b;continue b}if((a[i+3>>0]|0)==45)break b;else{i=b;continue b}}default:{i=b;continue b}}}if((l|0)==16){c[g>>2]=i;b=0;break}b=i+4|0;if((b|0)==(f|0)){b=-1;break}if((a[b>>0]|0)==0?(a[i+5>>0]|0)==62:0){c[g>>2]=i+6;b=13;break}c[g>>2]=b;b=0;break}c[g>>2]=e;b=0}while(0);return b|0}function l0(b,d,e){b=b|0;d=d|0;e=e|0;if((d-b|0)<12)d=-1;else{d=0;while(1){if((d|0)>=6){d=8;break}if(a[b>>0]|0){d=0;break}if((a[b+1>>0]|0)!=(a[144449+d>>0]|0)){d=0;break}d=d+1|0;b=b+2|0}c[e>>2]=b}return d|0}function m0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;p=q;a:do if((e|0)==(f|0))b=-1;else{j=a[e>>0]|0;o=b+76|0;b=a[e+1>>0]|0;if(!(j<<24>>24))i=d[o+(b&255)>>0]|0;else i=v$(j,b)|0;n=f;h=n-e|0;switch(i|0){case 29:{k=b&255;if(!(1<<(k&31)&c[57168+((k>>>5|d[143937+(j&255)>>0]<<3)<<2)>>2])){c[g>>2]=e;b=0;break a}break}case 24:case 22:break;case 5:{if((h|0)<2){b=-2;break a}c[g>>2]=e;b=0;break a}case 6:{if((h|0)<3){b=-2;break a}c[g>>2]=e;b=0;break a}case 7:{if((h|0)<4){b=-2;break a}c[g>>2]=e;b=0;break a}default:{c[g>>2]=e;b=0;break a}}b=e+2|0;b:while(1){if((b|0)==(f|0)){b=-1;break a}h=a[b>>0]|0;i=a[b+1>>0]|0;if(!(h<<24>>24))k=d[o+(i&255)>>0]|0;else k=v$(h,i)|0;j=b+2|0;switch(k|0){case 27:case 26:case 25:case 24:case 22:{b=j;continue b}case 5:{m=23;break b}case 6:{m=25;break b}case 7:{m=27;break b}case 10:case 9:case 21:{m=29;break b}case 15:{m=46;break b}case 29:break;default:break b}k=i&255;if(!(1<<(k&31)&c[57168+((k>>>5|d[144193+(h&255)>>0]<<3)<<2)>>2])){m=22;break}else b=j}if((m|0)==22){c[g>>2]=b;b=0;break}else if((m|0)==23){if((n-b|0)<2){b=-2;break}c[g>>2]=b;b=0;break}else if((m|0)==25){if((n-b|0)<3){b=-2;break}c[g>>2]=b;b=0;break}else if((m|0)==27){if((n-b|0)<4){b=-2;break}c[g>>2]=b;b=0;break}else if((m|0)==29){if(!(p0(e,b,p)|0)){c[g>>2]=b;b=0;break}c:while(1){if((j|0)==(f|0)){b=-1;break a}b=a[j>>0]|0;h=a[j+1>>0]|0;if(!(b<<24>>24))i=d[o+(h&255)>>0]|0;else i=v$(b,h)|0;b=j+2|0;h=n-j|0;switch(i|0){case 8:case 1:case 0:{m=41;break c}case 5:if((h|0)<2){b=-2;break a}else{j=b;continue c}case 6:{if((h|0)<3){b=-2;break a}j=j+3|0;continue c}case 7:{if((h|0)<4){b=-2;break a}j=j+4|0;continue c}case 15:{if((b|0)==(f|0)){b=-1;break a}if(a[b>>0]|0){j=b;continue c}if((a[j+3>>0]|0)==62){m=45;break c}else{j=b;continue c}}default:{j=b;continue c}}}if((m|0)==41){c[g>>2]=j;b=0;break}else if((m|0)==45){c[g>>2]=j+4;b=c[p>>2]|0;break}}else if((m|0)==46){if(!(p0(e,b,p)|0)){c[g>>2]=b;b=0;break}if((j|0)==(f|0)){b=-1;break}if((a[j>>0]|0)==0?(a[b+3>>0]|0)==62:0){c[g>>2]=b+4;b=c[p>>2]|0;break}else b=j}c[g>>2]=b;b=0}while(0);l=q;return b|0}function n0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;a:do if((e|0)!=(f|0)){j=a[e>>0]|0;l=b+76|0;i=a[e+1>>0]|0;if(!(j<<24>>24))h=d[l+(i&255)>>0]|0;else h=v$(j,i)|0;k=f;b=k-e|0;switch(h|0){case 29:{i=i&255;if(!(1<<(i&31)&c[57168+((i>>>5|(d[143937+(j&255)>>0]|0)<<3)<<2)>>2])){c[g>>2]=e;b=0;break a}break}case 24:case 22:break;case 5:{if((b|0)<2){b=-2;break a}c[g>>2]=e;b=0;break a}case 6:{if((b|0)<3){b=-2;break a}c[g>>2]=e;b=0;break a}case 7:{if((b|0)<4){b=-2;break a}c[g>>2]=e;b=0;break a}default:{c[g>>2]=e;b=0;break a}}j=e+2|0;b:while(1){if((j|0)==(f|0)){b=-1;break a}b=a[j>>0]|0;h=a[j+1>>0]|0;if(!(b<<24>>24))e=d[l+(h&255)>>0]|0;else e=v$(b,h)|0;i=j+2|0;switch(e|0){case 23:case 27:case 26:case 25:case 24:case 22:{j=i;continue b}case 5:{e=23;break b}case 6:{e=25;break b}case 7:{e=27;break b}case 10:case 9:case 21:{e=29;break b}case 11:{e=36;break b}case 29:break;default:{e=37;break b}}e=h&255;if(!(1<<(e&31)&c[57168+((e>>>5|(d[144193+(b&255)>>0]|0)<<3)<<2)>>2])){e=22;break}else j=i}if((e|0)==22){c[g>>2]=j;b=0;break}else if((e|0)==23){if((k-j|0)<2){b=-2;break}c[g>>2]=j;b=0;break}else if((e|0)==25){if((k-j|0)<3){b=-2;break}c[g>>2]=j;b=0;break}else if((e|0)==27){if((k-j|0)<4){b=-2;break}c[g>>2]=j;b=0;break}else if((e|0)==29){c:while(1){if((i|0)==(f|0)){b=-1;break a}b=a[i>>0]|0;h=a[i+1>>0]|0;if(!(b<<24>>24))b=d[l+(h&255)>>0]|0;else b=v$(b,h)|0;h=i+2|0;switch(b|0){case 10:case 9:case 21:{i=h;e=29;break}case 11:{e=34;break c}default:{e=35;break c}}}if((e|0)==34){c[g>>2]=h;b=5;break}else if((e|0)==35){c[g>>2]=i;b=0;break}}else if((e|0)==36){c[g>>2]=i;b=5;break}else if((e|0)==37){c[g>>2]=j;b=0;break}}else b=-1;while(0);return b|0}function o0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;p=q;c[p>>2]=e;m=b+76|0;n=f;h=0;a:while(1){b:while(1){if((e|0)==(f|0)){e=-1;break a}k=a[e>>0]|0;i=a[e+1>>0]|0;if(!(k<<24>>24))j=d[m+(i&255)>>0]|0;else j=v$(k,i)|0;switch(j|0){case 5:{o=11;break a}case 6:{o=13;break a}case 7:{o=15;break a}case 23:{o=17;break b}case 10:case 9:case 21:{h=e;o=33;break b}case 14:{o=39;break b}case 29:{j=i&255;if(!(1<<(j&31)&c[57168+((j>>>5|d[144193+(k&255)>>0]<<3)<<2)>>2])){o=9;break a}break}case 27:case 26:case 25:case 24:case 22:break;default:{o=93;break a}}k=e+2|0;c[p>>2]=k;e=k}c:do if((o|0)==17){o=0;if(h|0){o=18;break a}h=e+2|0;c[p>>2]=h;if((h|0)==(f|0)){e=-1;break a}i=a[h>>0]|0;j=a[e+3>>0]|0;if(!(i<<24>>24))k=d[m+(j&255)>>0]|0;else k=v$(i,j)|0;switch(k|0){case 5:{o=26;break a}case 6:{o=28;break a}case 7:{o=30;break a}case 24:case 22:{h=1;break c}case 29:break;default:{o=32;break a}}k=j&255;if(!(1<<(k&31)&c[57168+((k>>>5|d[143937+(i&255)>>0]<<3)<<2)>>2])){o=25;break a}else h=1}else if((o|0)==33)while(1){o=0;e=h+2|0;c[p>>2]=e;if((e|0)==(f|0)){e=-1;break a}i=a[e>>0]|0;h=a[h+3>>0]|0;if(!(i<<24>>24))h=d[m+(h&255)>>0]|0;else h=v$(i,h)|0;switch(h|0){case 14:{o=39;break c}case 9:case 10:case 21:{h=e;o=33;break}default:{o=38;break a}}}while(0);d:do if((o|0)==39){while(1){o=0;j=e+2|0;c[p>>2]=j;if((j|0)==(f|0)){e=-1;break a}h=a[j>>0]|0;i=a[e+3>>0]|0;if(!(h<<24>>24))k=d[m+(i&255)>>0]|0;else k=v$(h,i)|0;if((k|1|0)==13)break;switch(k|0){case 9:case 10:case 21:{e=j;o=39;break}default:{o=45;break a}}}e=e+4|0;c[p>>2]=e;e:while(1){if((e|0)==(f|0)){e=-1;break a}h=a[e>>0]|0;i=a[e+1>>0]|0;if(!(h<<24>>24))h=d[m+(i&255)>>0]|0;else h=v$(h,i)|0;if((h|0)==(k|0))break;switch(h|0){case 8:case 1:case 0:{o=59;break a}case 2:{o=64;break a}case 5:{if((n-e|0)<2){e=-2;break a}j=e+2|0;c[p>>2]=j;e=j;continue e}case 6:{if((n-e|0)<3){e=-2;break a}j=e+3|0;c[p>>2]=j;e=j;continue e}case 7:{if((n-e|0)<4){e=-2;break a}j=e+4|0;c[p>>2]=j;e=j;continue e}case 3:{e=f0(b,e+2|0,f,p)|0;if((e|0)<1){o=62;break a}e=c[p>>2]|0;continue e}default:{j=e+2|0;c[p>>2]=j;e=j;continue e}}}i=e+2|0;c[p>>2]=i;if((i|0)==(f|0)){e=-1;break a}h=a[i>>0]|0;j=a[e+3>>0]|0;if(!(h<<24>>24))h=d[m+(j&255)>>0]|0;else h=v$(h,j)|0;switch(h|0){case 11:{o=85;break a}case 17:{o=86;break a}case 10:case 9:case 21:{e=i;break}default:{o=71;break a}}f:while(1){i=e+2|0;c[p>>2]=i;if((i|0)==(f|0)){e=-1;break a}h=a[i>>0]|0;j=a[e+3>>0]|0;if(!(h<<24>>24))k=d[m+(j&255)>>0]|0;else k=v$(h,j)|0;switch(k|0){case 5:{o=79;break a}case 6:{o=81;break a}case 7:{o=83;break a}case 11:{o=85;break a}case 17:{o=86;break a}case 24:case 22:{h=0;break d}case 10:case 9:case 21:{e=i;break}case 29:break f;default:{o=91;break a}}}k=j&255;if(!(1<<(k&31)&c[57168+((k>>>5|d[143937+(h&255)>>0]<<3)<<2)>>2])){o=78;break a}else h=0}while(0);e=e+4|0;c[p>>2]=e}switch(o|0){case 9:{c[g>>2]=e;e=0;break}case 11:{if((f-e|0)<2)e=-2;else{c[g>>2]=e;e=0}break}case 13:{if((f-e|0)<3)e=-2;else{c[g>>2]=e;e=0}break}case 15:{if((f-e|0)<4)e=-2;else{c[g>>2]=e;e=0}break}case 18:{c[g>>2]=e;e=0;break}case 25:{c[g>>2]=h;e=0;break}case 26:{if((f-h|0)<2)e=-2;else{c[g>>2]=h;e=0}break}case 28:{if((f-h|0)<3)e=-2;else{c[g>>2]=h;e=0}break}case 30:{if((f-h|0)<4)e=-2;else{c[g>>2]=h;e=0}break}case 32:{c[g>>2]=h;e=0;break}case 38:{c[g>>2]=e;e=0;break}case 45:{c[g>>2]=j;e=0;break}case 59:{c[g>>2]=e;e=0;break}case 62:{if(!e){c[g>>2]=c[p>>2];e=0}break}case 64:{c[g>>2]=e;e=0;break}case 71:{c[g>>2]=i;e=0;break}case 78:{c[g>>2]=i;e=0;break}case 79:{if((n-i|0)<2)e=-2;else{c[g>>2]=i;e=0}break}case 81:{if((n-i|0)<3)e=-2;else{c[g>>2]=i;e=0}break}case 83:{if((n-i|0)<4)e=-2;else{c[g>>2]=i;e=0}break}case 85:{c[g>>2]=e+4;e=1;break}case 86:{h=i+2|0;c[p>>2]=h;e=h;if((h|0)==(f|0))e=-1;else{if((a[h>>0]|0)==0?(a[i+3>>0]|0)==62:0){c[g>>2]=i+4;e=3;break}c[g>>2]=e;e=0}break}case 91:{c[g>>2]=i;e=0;break}case 93:{c[g>>2]=e;e=0;break}}l=q;return e|0}function p0(b,d,e){b=b|0;d=d|0;e=e|0;c[e>>2]=11;a:do if((d-b|0)==6?(a[b>>0]|0)==0:0){switch(a[b+1>>0]|0){case 120:{d=0;break}case 88:{d=1;break}default:{d=1;break a}}if(!(a[b+2>>0]|0)){switch(a[b+3>>0]|0){case 109:break;case 77:{d=1;break}default:{d=1;break a}}if(!(a[b+4>>0]|0)){switch(a[b+5>>0]|0){case 108:break;case 76:{d=0;break a}default:{d=1;break a}}if(!d){c[e>>2]=12;d=1}else d=0}else d=1}else d=1}else d=1;while(0);return d|0}function q0(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0;l=e+76|0;k=g;j=f;a:while(1){if((j|0)==(g|0)){e=-1;break}f=a[j>>0]|0;e=a[j+1>>0]|0;if(!(f<<24>>24))i=d[l+(e&255)>>0]|0;else i=v$(f,e)|0;e=j+2|0;f=k-j|0;switch(i|0){case 8:case 1:case 0:{m=12;break a}case 5:if((f|0)<2){e=-2;break a}else{j=e;continue a}case 6:{if((f|0)<3){e=-2;break a}j=j+3|0;continue a}case 7:{if((f|0)<4){e=-2;break a}j=j+4|0;continue a}case 13:case 12:if((i|0)==(b|0)){m=14;break a}else{j=e;continue a}default:{j=e;continue a}}}b:do if((m|0)==12){c[h>>2]=j;e=0}else if((m|0)==14)if((e|0)==(g|0))e=-27;else{c[h>>2]=e;f=a[e>>0]|0;e=a[j+3>>0]|0;if(!(f<<24>>24))e=d[l+(e&255)>>0]|0;else e=v$(f,e)|0;switch(e|0){case 20:case 30:case 11:case 10:case 9:case 21:{e=27;break b}default:{}}e=0}while(0);return e|0}function r0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;a:do if((e|0)==(f|0))h=-1;else{h=a[e>>0]|0;i=a[e+1>>0]|0;k=b+76|0;if(!(h<<24>>24))i=d[k+(i&255)>>0]|0;else i=v$(h,i)|0;h=e+2|0;switch(i|0){case 27:{h=k0(b,h,f,g)|0;break a}case 20:{c[g>>2]=h;h=33;break a}case 24:case 22:{b=h;b:while(1){if((b|0)==(f|0)){h=-1;break a}h=a[b>>0]|0;i=a[b+1>>0]|0;if(!(h<<24>>24))i=d[k+(i&255)>>0]|0;else i=v$(h,i)|0;h=b+2|0;switch(i|0){case 24:case 22:{b=h;break}case 30:{j=14;break b}case 10:case 9:case 21:break b;default:{j=21;break b}}}if((j|0)==21){c[g>>2]=b;h=0;break a}c:do if((j|0)==14){if((h|0)==(f|0)){h=-1;break a}h=a[h>>0]|0;i=a[b+3>>0]|0;if(!(h<<24>>24))h=d[k+(i&255)>>0]|0;else h=v$(h,i)|0;switch(h|0){case 30:case 10:case 9:case 21:break;default:break c}c[g>>2]=b;h=0;break a}while(0);c[g>>2]=b;h=16;break a}default:{c[g>>2]=e;h=0;break a}}}while(0);return h|0}function s0(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;a:do if((e|0)!=(f|0)){j=a[e>>0]|0;k=b+76|0;i=a[e+1>>0]|0;if(!(j<<24>>24))h=d[k+(i&255)>>0]|0;else h=v$(j,i)|0;l=f;b=l-e|0;switch(h|0){case 29:{i=i&255;if(!(1<<(i&31)&c[57168+((i>>>5|(d[143937+(j&255)>>0]|0)<<3)<<2)>>2])){c[g>>2]=e;b=0;break a}break}case 24:case 22:break;case 5:{if((b|0)<2){b=-2;break a}c[g>>2]=e;b=0;break a}case 6:{if((b|0)<3){b=-2;break a}c[g>>2]=e;b=0;break a}case 7:{if((b|0)<4){b=-2;break a}c[g>>2]=e;b=0;break a}default:{c[g>>2]=e;b=0;break a}}b:while(1){b=e;e=e+2|0;if((e|0)==(f|0)){b=-20;break a}i=a[e>>0]|0;b=a[b+3>>0]|0;if(!(i<<24>>24))h=d[k+(b&255)>>0]|0;else h=v$(i,b)|0;switch(h|0){case 27:case 26:case 25:case 24:case 22:continue b;case 5:{h=22;break b}case 6:{h=24;break b}case 7:{h=26;break b}case 36:case 30:case 11:case 32:case 21:case 10:case 9:{h=28;break b}case 29:break;default:{h=29;break b}}j=b&255;if(!(1<<(j&31)&c[57168+((j>>>5|(d[144193+(i&255)>>0]|0)<<3)<<2)>>2])){h=21;break}}if((h|0)==21){c[g>>2]=e;b=0;break}else if((h|0)==22){if((l-e|0)<2){b=-2;break}c[g>>2]=e;b=0;break}else if((h|0)==24){if((l-e|0)<3){b=-2;break}c[g>>2]=e;b=0;break}else if((h|0)==26){if((l-e|0)<4){b=-2;break}c[g>>2]=e;b=0;break}else if((h|0)==28){c[g>>2]=e;b=20;break}else if((h|0)==29){c[g>>2]=e;b=0;break}}else b=-1;while(0);return b|0}function t0(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;while(1){b=c[d>>2]|0;if((b|0)==(e|0))break;if((c[f>>2]|0)==(g|0))break;c[d>>2]=b+1;h=a[b>>0]|0;b=c[f>>2]|0;c[f>>2]=b+1;a[b>>0]=h}return}function u0(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0;a:while(1){f=a[b>>0]|0;g=a[c>>0]|0;f=(f+-97&255)<26?(f&255)+224&255:f;switch((f<<24>>24==((g+-97&255)<26?(g&255)+224&255:g)<<24>>24?(f<<24>>24==0?2:0):1)&3){case 0:{c=c+1|0;b=b+1|0;break}case 1:{e=3;break a}case 2:{d=1;break a}default:{e=5;break a}}}if((e|0)==3)d=0;return d|0}function v0(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;return x0(42,a,b,c,d,e,f,g,h,i,j)|0}function w0(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=l;l=l+144|0;i=h+4|0;f=h+8|0;g=h;c[i>>2]=d;c[g>>2]=f;fb[c[b+60>>2]&31](b,i,e,g,f+127|0);do if((c[i>>2]|0)==(e|0)){a[c[g>>2]>>0]=0;if(u0(f,144464)|0?(c[b+68>>2]|0)==2:0)break;b=L$(f)|0;if((b|0)!=-1)b=c[59184+(b<<2)>>2]|0;else b=0}else b=0;while(0);l=h;return b|0}function x0(a,b,d,e,f,g,h,i,j,k,m){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+16|0;t=v+8|0;q=v+12|0;o=v+4|0;p=v;c[q>>2]=0;c[o>>2]=0;c[p>>2]=0;u=d+68|0;s=c[u>>2]|0;r=e+(s*5|0)|0;c[t>>2]=r;s=f+(0-(s<<1))|0;r=(y0(d,r,s,o,p,q,t)|0)!=0;n=c[o>>2]|0;e=n;a:do if(r&(n|0)!=0){r=d+28|0;f=c[p>>2]|0;b=(b|0)!=0;do if(!(tb[c[r>>2]&127](d,n,f,144489)|0)){if(!b){c[g>>2]=e;e=0;break a}}else{if(h|0)c[h>>2]=c[q>>2];e=c[t>>2]|0;if(i|0)c[i>>2]=e;if(!(y0(d,e,s,o,p,q,t)|0)){c[g>>2]=c[t>>2];e=0;break a}e=c[o>>2]|0;if(e|0){n=e;f=c[p>>2]|0;break}if(!b){e=1;break a}c[g>>2]=c[t>>2];e=0;break a}while(0);if(tb[c[r>>2]&127](d,n,f,144497)|0){f=c[q>>2]|0;e=f;if((((z0(d,f,s)|0)&-33)+-65|0)>>>0>=26){c[g>>2]=e;e=0;break}if(j|0)c[j>>2]=e;e=c[t>>2]|0;if(k|0)c[k>>2]=eb[a&63](d,f,e+(0-(c[u>>2]|0))|0)|0;if(!(y0(d,e,s,o,p,q,t)|0)){c[g>>2]=c[t>>2];e=0;break}e=c[o>>2]|0;if(!e){e=1;break}n=e;f=c[p>>2]|0}if(b|(tb[c[r>>2]&127](d,n,f,144506)|0)==0){c[g>>2]=e;e=0;break}f=c[q>>2]|0;e=c[t>>2]|0;n=(m|0)!=0;b=f;if(!(tb[c[r>>2]&127](d,f,e+(0-(c[u>>2]|0))|0,107958)|0)){if(!(tb[c[r>>2]&127](d,f,e+(0-(c[u>>2]|0))|0,107950)|0)){c[g>>2]=b;e=0;break}if(n)c[m>>2]=0}else if(n)c[m>>2]=1;while(1){if(!(A0(z0(d,e,s)|0)|0))break;e=e+(c[u>>2]|0)|0}c[t>>2]=e;if((e|0)==(s|0))e=1;else{c[g>>2]=e;e=0}}else{c[g>>2]=c[t>>2];e=0}while(0);l=v;return e|0}function y0(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;a:do if((b|0)!=(d|0)){if(!(A0(z0(a,b,d)|0)|0)){c[h>>2]=b;b=0;break}j=a+68|0;do b=b+(c[j>>2]|0)|0;while((A0(z0(a,b,d)|0)|0)!=0);if((b|0)==(d|0)){c[e>>2]=0;b=1;break}c[e>>2]=b;b:while(1){i=z0(a,b,d)|0;switch(i|0){case -1:{i=11;break b}case 61:{i=12;break b}default:{}}if(A0(i)|0){i=14;break}b=b+(c[j>>2]|0)|0}if((i|0)==11){c[h>>2]=b;b=0;break}else if((i|0)==12)c[f>>2]=b;else if((i|0)==14){c[f>>2]=b;do{b=b+(c[j>>2]|0)|0;i=z0(a,b,d)|0}while((A0(i)|0)!=0);if((i|0)!=61){c[h>>2]=b;b=0;break}}if((b|0)==(c[e>>2]|0)){c[h>>2]=b;b=0;break}do{b=b+(c[j>>2]|0)|0;i=z0(a,b,d)|0}while((A0(i)|0)!=0);switch(i|0){case 34:case 39:break;default:{c[h>>2]=b;b=0;break a}}f=b+(c[j>>2]|0)|0;c[g>>2]=f;b=i<<24>>24;c:while(1){i=z0(a,f,d)|0;if((i|0)==(b|0)){i=30;break}if((i+-48|0)>>>0>9&((i&-33)+-65|0)>>>0>25)switch(i|0){case 45:case 46:case 95:break;default:{i=28;break c}}f=f+(c[j>>2]|0)|0}if((i|0)==28){c[h>>2]=f;b=0;break}else if((i|0)==30){c[h>>2]=f+(c[j>>2]|0);b=1;break}}else{c[e>>2]=0;b=1}while(0);return b|0}function z0(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=l;l=l+16|0;i=h+4|0;f=h+8|0;g=h;c[i>>2]=d;c[g>>2]=f;fb[c[b+60>>2]&31](b,i,e,g,f+1|0);l=h;return ((c[g>>2]|0)==(f|0)?-1:a[f>>0]|0)|0}function A0(a){a=a|0;switch(a|0){case 9:case 10:case 13:case 32:{a=1;break}default:a=0}return a|0}function B0(){return 60340}function C0(b,d,e){b=b|0;d=d|0;e=e|0;e=L$(e)|0;if((e|0)==-1)e=0;else{a[b+73>>0]=e;c[b>>2]=69;c[b+4>>2]=70;c[b+52>>2]=31;c[b+76>>2]=d;c[d>>2]=b;e=1}return e|0}function D0(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return P$(60708,a,0,b,c,d)|0}function E0(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return P$(60708,a,1,b,c,d)|0}function F0(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;return x0(43,a,b,c,d,e,f,g,h,i,j)|0}function G0(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=l;l=l+144|0;i=h+4|0;f=h+8|0;g=h;c[i>>2]=d;c[g>>2]=f;fb[c[b+60>>2]&31](b,i,e,g,f+127|0);do if((c[i>>2]|0)==(e|0)){a[c[g>>2]>>0]=0;if(u0(f,144464)|0?(c[b+68>>2]|0)==2:0)break;b=L$(f)|0;if((b|0)!=-1)b=c[60708+(b<<2)>>2]|0;else b=0}else b=0;while(0);l=h;return b|0}function H0(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;b=j_(b,c,d,e)|0;if(b|0)a[b+76+58>>0]=23;return b|0}function I0(a){a=a|0;c[a>>2]=4;c[a+16>>2]=1;c[a+12>>2]=0;c[a+20>>2]=0;return}function J0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;switch(b|0){case 15:{c[a>>2]=5;a=0;break}case 12:{c[a>>2]=5;a=1;break}case 11:{c[a>>2]=5;a=55;break}case 13:{c[a>>2]=5;a=56;break}case 14:{a=0;break}case 16:{if(!(tb[c[f+28>>2]&127](f,d+(c[f+68>>2]<<1)|0,e,144517)|0))g=9;else{c[a>>2]=6;a=3}break}case 29:{c[a>>2]=7;a=2;break}default:g=9}if((g|0)==9)a=N0(a,b)|0;return a|0}function K0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;switch(b|0){case 14:case 15:{a=0;break}case 11:{a=55;break}case 13:{a=56;break}case 16:{if(!(tb[c[f+28>>2]&127](f,d+(c[f+68>>2]<<1)|0,e,144517)|0))g=7;else{c[a>>2]=6;a=3}break}case 29:{c[a>>2]=7;a=2;break}default:g=7}if((g|0)==7)a=N0(a,b)|0;return a|0}function L0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=3;break}case 41:case 18:{c[a>>2]=8;a=4;break}default:a=N0(a,b)|0}return a|0}function M0(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return 0}function N0(a,b){a=a|0;b=b|0;if((b|0)==28&(c[a+16>>2]|0)==0)a=59;else{c[a>>2]=7;a=-1}return a|0}function O0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;a:do switch(b|0){case 15:{a=3;break}case 25:{c[a>>2]=9;a=7;break}case 17:{c[a>>2]=10;a=8;break}case 18:{g=f+28|0;if(tb[c[g>>2]&127](f,d,e,144525)|0){c[a>>2]=11;a=3;break a}if(!(tb[c[g>>2]&127](f,d,e,144532)|0))h=8;else{c[a>>2]=12;a=3}break}default:h=8}while(0);if((h|0)==8)a=N0(a,b)|0;return a|0}function P0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;a:do switch(b|0){case -4:case 15:{a=0;break}case 16:{g=f+28|0;h=f+68|0;if(tb[c[g>>2]&127](f,d+(c[h>>2]<<1)|0,e,144539)|0){c[a>>2]=13;a=11;break a}if(tb[c[g>>2]&127](f,d+(c[h>>2]<<1)|0,e,144546)|0){c[a>>2]=14;a=33;break a}if(tb[c[g>>2]&127](f,d+(c[h>>2]<<1)|0,e,144554)|0){c[a>>2]=15;a=39;break a}if(!(tb[c[g>>2]&127](f,d+(c[h>>2]<<1)|0,e,144562)|0))i=14;else{c[a>>2]=16;a=17}break}case 11:{a=55;break}case 13:{a=56;break}case 28:{a=60;break}case 26:{c[a>>2]=17;a=3;break}default:i=14}while(0);if((i|0)==14)a=N0(a,b)|0;return a|0}function Q0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;f=b+-11|0;switch(f>>>1|f<<31|0){case 2:{a=0;break}case 0:{a=55;break}case 1:{a=56;break}case 9:{c[a>>2]=7;a=2;break}default:a=N0(a,b)|0}return a|0}function R0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=3;break}case 27:{c[a>>2]=18;a=5;break}default:a=N0(a,b)|0}return a|0}function S0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=3;break}case 27:{c[a>>2]=11;a=6;break}default:a=N0(a,b)|0}return a|0}function T0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=3;break}case 25:{c[a>>2]=9;a=7;break}case 17:{c[a>>2]=10;a=8;break}default:a=N0(a,b)|0}return a|0}function U0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=11;break}case 22:{c[a>>2]=19;a=11;break}case 18:{c[a>>2]=20;a=9;break}default:a=N0(a,b)|0}return a|0}function V0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=33;break}case 41:case 18:{c[a>>2]=21;a=34;break}default:a=N0(a,b)|0}return a|0}function W0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=39;break}case 41:case 18:{c[a>>2]=22;a=40;break}default:a=N0(a,b)|0}return a|0}function X0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=17;break}case 18:{c[a>>2]=23;a=18;break}default:a=N0(a,b)|0}return a|0}function Y0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=3;break}case 17:{c[a>>2]=10;a=8;break}default:a=N0(a,b)|0}return a|0}function Z0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;a:do switch(b|0){case 15:{a=17;break}case 18:{g=f+28|0;if(tb[c[g>>2]&127](f,d,e,144525)|0){c[a>>2]=24;a=17;break a}if(!(tb[c[g>>2]&127](f,d,e,144532)|0))h=6;else{c[a>>2]=25;a=17}break}default:h=6}while(0);if((h|0)==6)a=N0(a,b)|0;return a|0}function _0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=17;break}case 27:{c[a>>2]=26;c[a+8>>2]=17;a=19;break}default:a=N0(a,b)|0}return a|0}function $0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=17;break}case 27:{c[a>>2]=27;a=21;break}default:a=N0(a,b)|0}return a|0}function a1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=17;break}case 27:{c[a>>2]=26;c[a+8>>2]=17;a=19;break}case 17:{c[a>>2]=c[a+16>>2]|0?9:28;a=20;break}default:a=N0(a,b)|0}return a|0}function b1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;d=a+8|0;switch(b|0){case 15:{d=c[d>>2]|0;break}case 17:{c[a>>2]=c[a+16>>2]|0?9:28;d=c[d>>2]|0;break}default:d=N0(a,b)|0}return d|0}function c1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=a+12|0;switch(b|0){case 33:{c[a>>2]=29;d=0;break}case 34:{d=c[g>>2]|0;if(!d)h=7;else{c[g>>2]=d+-1;d=0}break}case 15:{d=0;break}case 26:{h=7;break}case -4:{if(!(c[g>>2]|0))d=0;else h=7;break}default:d=P0(a,b,d,e,f)|0}if((h|0)==7)d=N0(a,b)|0;return d|0}function d1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;a:do switch(b|0){case 15:{a=0;break}case 18:{g=f+28|0;if(tb[c[g>>2]&127](f,d,e,144571)|0){c[a>>2]=30;a=0;break a}if(!(tb[c[g>>2]&127](f,d,e,144579)|0))h=6;else{c[a>>2]=31;a=0}break}default:h=6}while(0);if((h|0)==6)a=N0(a,b)|0;return a|0}function e1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=0;break}case 25:{c[a>>2]=28;a=a+12|0;c[a>>2]=(c[a>>2]|0)+1;a=0;break}default:a=N0(a,b)|0}return a|0}function f1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=0;break}case 25:{c[a>>2]=28;a=58;break}default:a=N0(a,b)|0}return a|0}function g1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;a:do switch(b|0){case 15:{a=39;break}case 18:{g=f+28|0;h=a+8|0;if(tb[c[g>>2]&127](f,d,e,144586)|0){c[a>>2]=26;c[h>>2]=39;a=42;break a}if(!(tb[c[g>>2]&127](f,d,e,144592)|0))i=7;else{c[a>>2]=26;c[h>>2]=39;a=41}break}case 23:{c[a>>2]=32;c[a+4>>2]=1;a=44;break}default:i=7}while(0);if((i|0)==7)a=N0(a,b)|0;return a|0}function h1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;switch(b|0){case 15:{a=39;break}case 20:{if(!(tb[c[f+28>>2]&127](f,d+(c[f+68>>2]|0)|0,e,144596)|0))g=9;else{c[a>>2]=33;a=43}break}case 23:{c[a+4>>2]=2;c[a>>2]=34;a=44;break}case 41:case 18:{c[a>>2]=35;a=51;break}case 30:{c[a>>2]=35;a=53;break}case 31:{c[a>>2]=35;a=52;break}case 32:{c[a>>2]=35;a=54;break}default:g=9}if((g|0)==9)a=N0(a,b)|0;return a|0}function i1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;d=a+8|0;switch(b|0){case 15:{d=39;break}case 24:{c[a>>2]=26;c[d>>2]=39;d=45;break}case 36:{c[a>>2]=26;c[d>>2]=39;d=46;break}case 21:{c[a>>2]=36;d=39;break}default:d=N0(a,b)|0}return d|0}function j1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=39;break}case 23:{a=a+4|0;c[a>>2]=(c[a>>2]|0)+1;a=44;break}case 41:case 18:{c[a>>2]=35;a=51;break}case 30:{c[a>>2]=35;a=53;break}case 31:{c[a>>2]=35;a=52;break}case 32:{c[a>>2]=35;a=54;break}default:a=N0(a,b)|0}return a|0}function k1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;d=a+8|0;e=a+4|0;switch(b|0){case 15:{d=39;break}case 24:{b=(c[e>>2]|0)+-1|0;c[e>>2]=b;if(!b){c[a>>2]=26;c[d>>2]=39;d=45}else d=45;break}case 36:{b=(c[e>>2]|0)+-1|0;c[e>>2]=b;if(!b){c[a>>2]=26;c[d>>2]=39;d=46}else d=46;break}case 35:{b=(c[e>>2]|0)+-1|0;c[e>>2]=b;if(!b){c[a>>2]=26;c[d>>2]=39;d=47}else d=47;break}case 37:{b=(c[e>>2]|0)+-1|0;c[e>>2]=b;if(!b){c[a>>2]=26;c[d>>2]=39;d=48}else d=48;break}case 38:{c[a>>2]=34;d=50;break}case 21:{c[a>>2]=34;d=49;break}default:d=N0(a,b)|0}return d|0}function l1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=39;break}case 41:case 18:{c[a>>2]=37;a=51;break}default:a=N0(a,b)|0}return a|0}function m1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=39;break}case 36:{c[a>>2]=26;c[a+8>>2]=39;a=46;break}case 21:{c[a>>2]=36;a=39;break}default:a=N0(a,b)|0}return a|0}function n1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=33;break}case 17:{c[a>>2]=c[a+16>>2]|0?9:28;a=33;break}case 41:case 18:{c[a>>2]=38;a=22;break}default:a=N0(a,b)|0}return a|0}function o1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;a:do switch(b|0){case 15:{g=33;break}case 18:{h=f+28|0;g=0;while(1){i=c[h>>2]|0;if((g|0)>=8)break;if(tb[i&127](f,d,e,c[62576+(g<<2)>>2]|0)|0){j=6;break}g=g+1|0}if((j|0)==6){c[a>>2]=39;g=g+23|0;break a}if(!(tb[i&127](f,d,e,144562)|0))j=10;else{c[a>>2]=40;g=33}break}case 23:{c[a>>2]=41;g=33;break}default:j=10}while(0);if((j|0)==10)g=N0(a,b)|0;return g|0}function p1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;a:do switch(b|0){case 15:{a=33;break}case 20:{g=f+28|0;h=f+68|0;if(tb[c[g>>2]&127](f,d+(c[h>>2]|0)|0,e,144603)|0){c[a>>2]=21;a=35;break a}if(tb[c[g>>2]&127](f,d+(c[h>>2]|0)|0,e,144611)|0){c[a>>2]=21;a=36;break a}if(!(tb[c[g>>2]&127](f,d+(c[h>>2]|0)|0,e,144620)|0))i=9;else{c[a>>2]=42;a=33}break}case 27:{c[a>>2]=21;a=37;break}default:i=9}while(0);if((i|0)==9)a=N0(a,b)|0;return a|0}function q1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=33;break}case 23:{c[a>>2]=43;a=33;break}default:a=N0(a,b)|0}return a|0}function r1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=33;break}case 41:case 18:case 19:{c[a>>2]=44;a=31;break}default:a=N0(a,b)|0}return a|0}function s1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=33;break}case 24:{c[a>>2]=39;a=33;break}case 21:{c[a>>2]=41;a=33;break}default:a=N0(a,b)|0}return a|0}function t1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=33;break}case 18:{c[a>>2]=45;a=32;break}default:a=N0(a,b)|0}return a|0}function u1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=33;break}case 24:{c[a>>2]=39;a=33;break}case 21:{c[a>>2]=43;a=33;break}default:a=N0(a,b)|0}return a|0}function v1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=33;break}case 27:{c[a>>2]=21;a=38;break}default:a=N0(a,b)|0}return a|0}function w1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=11;break}case 18:{c[a>>2]=46;a=10;break}default:a=N0(a,b)|0}return a|0}function x1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;a:do switch(b|0){case 15:{a=11;break}case 18:{g=f+28|0;if(tb[c[g>>2]&127](f,d,e,144525)|0){c[a>>2]=47;a=11;break a}if(!(tb[c[g>>2]&127](f,d,e,144532)|0))h=7;else{c[a>>2]=48;a=11}break}case 27:{c[a>>2]=26;c[a+8>>2]=11;a=12;break}default:h=7}while(0);if((h|0)==7)a=N0(a,b)|0;return a|0}function y1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=11;break}case 27:{c[a>>2]=49;a=13;break}default:a=N0(a,b)|0}return a|0}function z1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=11;break}case 27:{c[a>>2]=47;a=14;break}default:a=N0(a,b)|0}return a|0}function A1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;switch(b|0){case 15:{a=11;break}case 17:{c[a>>2]=c[a+16>>2]|0?9:28;a=15;break}case 18:{if(!(tb[c[f+28>>2]&127](f,d,e,144674)|0))g=5;else{c[a>>2]=50;a=11}break}default:g=5}if((g|0)==5)a=N0(a,b)|0;return a|0}function B1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=11;break}case 18:{c[a>>2]=26;c[a+8>>2]=11;a=16;break}default:a=N0(a,b)|0}return a|0}function C1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;a:do switch(b|0){case 15:{a=11;break}case 18:{g=f+28|0;if(tb[c[g>>2]&127](f,d,e,144525)|0){c[a>>2]=51;a=11;break a}if(!(tb[c[g>>2]&127](f,d,e,144532)|0))h=7;else{c[a>>2]=52;a=11}break}case 27:{c[a>>2]=26;c[a+8>>2]=11;a=12;break}default:h=7}while(0);if((h|0)==7)a=N0(a,b)|0;return a|0}function D1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=11;break}case 27:{c[a>>2]=53;a=13;break}default:a=N0(a,b)|0}return a|0}function E1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=11;break}case 27:{c[a>>2]=51;a=14;break}default:a=N0(a,b)|0}return a|0}function F1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;switch(b|0){case 15:{a=11;break}case 17:{c[a>>2]=c[a+16>>2]|0?9:28;a=15;break}default:a=N0(a,b)|0}return a|0}function G1(){return 190360}function H1(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=O1(c[a+60>>2]|0)|0;a=K1(xa(6,d|0)|0)|0;l=b;return a|0}function I1(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;n=l;l=l+48|0;k=n+16|0;g=n;f=n+32|0;i=a+28|0;e=c[i>>2]|0;c[f>>2]=e;j=a+20|0;e=(c[j>>2]|0)-e|0;c[f+4>>2]=e;c[f+8>>2]=b;c[f+12>>2]=d;e=e+d|0;h=a+60|0;c[g>>2]=c[h>>2];c[g+4>>2]=f;c[g+8>>2]=2;g=K1(bb(146,g|0)|0)|0;a:do if((e|0)!=(g|0)){b=2;while(1){if((g|0)<0)break;e=e-g|0;p=c[f+4>>2]|0;o=g>>>0>p>>>0;f=o?f+8|0:f;b=(o<<31>>31)+b|0;p=g-(o?p:0)|0;c[f>>2]=(c[f>>2]|0)+p;o=f+4|0;c[o>>2]=(c[o>>2]|0)-p;c[k>>2]=c[h>>2];c[k+4>>2]=f;c[k+8>>2]=b;g=K1(bb(146,k|0)|0)|0;if((e|0)==(g|0)){m=3;break a}}c[a+16>>2]=0;c[i>>2]=0;c[j>>2]=0;c[a>>2]=c[a>>2]|32;if((b|0)==2)d=0;else d=d-(c[f+4>>2]|0)|0}else m=3;while(0);if((m|0)==3){p=c[a+44>>2]|0;c[a+16>>2]=p+(c[a+48>>2]|0);c[i>>2]=p;c[j>>2]=p}l=n;return d|0}function J1(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=l;l=l+32|0;g=f;e=f+20|0;c[g>>2]=c[a+60>>2];c[g+4>>2]=0;c[g+8>>2]=b;c[g+12>>2]=e;c[g+16>>2]=d;if((K1(Za(140,g|0)|0)|0)<0){c[e>>2]=-1;a=-1}else a=c[e>>2]|0;l=f;return a|0}function K1(a){a=a|0;if(a>>>0>4294963200){c[(L1()|0)>>2]=0-a;a=-1}return a|0}function L1(){return (M1()|0)+64|0}function M1(){return N1()|0}function N1(){return 62988}function O1(a){a=a|0;return a|0}function P1(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;k=l;l=l+32|0;f=k;i=k+16|0;c[i>>2]=d;g=i+4|0;j=b+48|0;m=c[j>>2]|0;c[g>>2]=e-((m|0)!=0&1);h=b+44|0;c[i+8>>2]=c[h>>2];c[i+12>>2]=m;c[f>>2]=c[b+60>>2];c[f+4>>2]=i;c[f+8>>2]=2;f=K1(ab(145,f|0)|0)|0;if((f|0)>=1){i=c[g>>2]|0;if(f>>>0>i>>>0){g=c[h>>2]|0;h=b+4|0;c[h>>2]=g;c[b+8>>2]=g+(f-i);if(!(c[j>>2]|0))f=e;else{c[h>>2]=g+1;a[d+(e+-1)>>0]=a[g>>0]|0;f=e}}}else c[b>>2]=c[b>>2]|f&48^16;l=k;return f|0}function Q1(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+32|0;f=g;c[b+36>>2]=18;if((c[b>>2]&64|0)==0?(c[f>>2]=c[b+60>>2],c[f+4>>2]=21523,c[f+8>>2]=g+16,Qa(54,f|0)|0):0)a[b+75>>0]=-1;f=I1(b,d,e)|0;l=g;return f|0}function R1(a){a=a|0;var b=0;b=(S1(a)|0)==0;return (b?a:a|32)|0}function S1(a){a=a|0;return (a+-65|0)>>>0<26|0}function T1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;j=l;l=l+128|0;h=j;c[h>>2]=0;i=h+4|0;c[i>>2]=a;c[h+44>>2]=a;g=h+8|0;c[g>>2]=(a|0)<0?-1:a+2147483647|0;c[h+76>>2]=-1;U1(h,0);d=V1(h,d,1,e,f)|0;if(b|0)c[b>>2]=a+((c[i>>2]|0)+(c[h+108>>2]|0)-(c[g>>2]|0));l=j;return d|0}function U1(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;c[a+104>>2]=b;d=c[a+8>>2]|0;e=c[a+4>>2]|0;f=d-e|0;c[a+108>>2]=f;c[a+100>>2]=(b|0)!=0&(f|0)>(b|0)?e+b|0:d;return}function V1(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;a:do if(e>>>0>36){c[(L1()|0)>>2]=22;h=0;g=0}else{r=b+4|0;q=b+100|0;do{i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=W1(b)|0}while((X1(i)|0)!=0);b:do switch(i|0){case 43:case 45:{i=((i|0)==45)<<31>>31;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;p=i;i=d[j>>0]|0;break b}else{p=i;i=W1(b)|0;break b}}default:p=0}while(0);j=(e|0)==0;do if((e|16|0)==16&(i|0)==48){i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=W1(b)|0;if((i|32|0)!=120)if(j){e=8;n=46;break}else{n=32;break}i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=W1(b)|0;if((d[144681+i>>0]|0)>15){g=(c[q>>2]|0)!=0;if(g)c[r>>2]=(c[r>>2]|0)+-1;if(!f){U1(b,0);h=0;g=0;break a}if(!g){h=0;g=0;break a}c[r>>2]=(c[r>>2]|0)+-1;h=0;g=0;break a}else{e=16;n=46}}else{e=j?10:e;if((d[144681+i>>0]|0)>>>0>>0)n=32;else{if(c[q>>2]|0)c[r>>2]=(c[r>>2]|0)+-1;U1(b,0);c[(L1()|0)>>2]=22;h=0;g=0;break a}}while(0);c:do if((n|0)==32)if((e|0)==10){e=i+-48|0;if(e>>>0<10){i=0;j=e;do{i=(i*10|0)+j|0;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;e=d[e>>0]|0}else e=W1(b)|0;j=e+-48|0}while(j>>>0<10&i>>>0<429496729);f=0}else{e=i;i=0;f=0}k=e+-48|0;if(k>>>0<10){j=e;do{e=G6(i|0,f|0,10,0)|0;l=D;m=((k|0)<0)<<31>>31;o=~m;if(l>>>0>o>>>0|(l|0)==(o|0)&e>>>0>~k>>>0){e=10;n=72;break c}i=w6(e|0,l|0,k|0,m|0)|0;f=D;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=W1(b)|0;k=j+-48|0}while(k>>>0<10&(f>>>0<429496729|(f|0)==429496729&i>>>0<2576980378));if(k>>>0>9){j=p;e=f}else{e=10;n=72}}else{j=p;e=f}}else n=46;while(0);d:do if((n|0)==46){if(!(e+-1&e)){n=a[144937+((e*23|0)>>>5&7)>>0]|0;f=a[144681+i>>0]|0;j=f&255;if(j>>>0>>0){i=0;k=j;do{i=k|i<>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;j=d[j>>0]|0}else j=W1(b)|0;f=a[144681+j>>0]|0;k=f&255}while(i>>>0<134217728&k>>>0>>0);k=0}else{j=i;k=0;i=0}l=z6(-1,-1,n|0)|0;m=D;if((f&255)>>>0>=e>>>0|(k>>>0>m>>>0|(k|0)==(m|0)&i>>>0>l>>>0)){f=k;n=72;break}else j=k;while(1){i=v6(i|0,j|0,n|0)|0;k=D;i=f&255|i;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;j=d[j>>0]|0}else j=W1(b)|0;f=a[144681+j>>0]|0;if((f&255)>>>0>=e>>>0|(k>>>0>m>>>0|(k|0)==(m|0)&i>>>0>l>>>0)){f=k;n=72;break d}else j=k}}f=a[144681+i>>0]|0;j=f&255;if(j>>>0>>0){i=0;k=j;do{i=k+(S(i,e)|0)|0;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;j=d[j>>0]|0}else j=W1(b)|0;f=a[144681+j>>0]|0;k=f&255}while(i>>>0<119304647&k>>>0>>0);k=0}else{j=i;i=0;k=0}if((f&255)>>>0>>0){n=E6(-1,-1,e|0,0)|0;o=D;m=k;while(1){if(m>>>0>o>>>0|(m|0)==(o|0)&i>>>0>n>>>0){f=m;n=72;break d}k=G6(i|0,m|0,e|0,0)|0;l=D;f=f&255;if(l>>>0>4294967295|(l|0)==-1&k>>>0>~f>>>0){f=m;n=72;break d}i=w6(f|0,0,k|0,l|0)|0;k=D;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;j=d[j>>0]|0}else j=W1(b)|0;f=a[144681+j>>0]|0;if((f&255)>>>0>=e>>>0){f=k;n=72;break}else m=k}}else{f=k;n=72}}while(0);if((n|0)==72)if((d[144681+j>>0]|0)>>>0>>0){do{i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=W1(b)|0}while((d[144681+i>>0]|0)>>>0>>0);c[(L1()|0)>>2]=34;j=(g&1|0)==0&0==0?p:0;e=h;i=g}else{j=p;e=f}if(c[q>>2]|0)c[r>>2]=(c[r>>2]|0)+-1;if(!(e>>>0>>0|(e|0)==(h|0)&i>>>0>>0)){if(!((g&1|0)!=0|0!=0|(j|0)!=0)){c[(L1()|0)>>2]=34;g=w6(g|0,h|0,-1,-1)|0;h=D;break}if(e>>>0>h>>>0|(e|0)==(h|0)&i>>>0>g>>>0){c[(L1()|0)>>2]=34;break}}g=((j|0)<0)<<31>>31;g=t6(i^j|0,e^g|0,j|0,g|0)|0;h=D}while(0);D=h;return g|0}function W1(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;f=b+104|0;j=c[f>>2]|0;if((j|0)!=0?(c[b+108>>2]|0)>=(j|0):0)k=4;else{e=Y1(b)|0;if((e|0)>=0){g=c[f>>2]|0;f=b+8|0;if(g){i=c[f>>2]|0;f=c[b+4>>2]|0;h=b+108|0;g=g-(c[h>>2]|0)|0;j=i;if((i-f|0)<(g|0)){i=j;g=j}else{i=f+(g+-1)|0;g=j}}else{g=c[f>>2]|0;h=b+108|0;i=g;f=c[b+4>>2]|0}c[b+100>>2]=i;if(g|0)c[h>>2]=g+1-f+(c[h>>2]|0);f=f+-1|0;if((d[f>>0]|0|0)!=(e|0))a[f>>0]=e}else k=4}if((k|0)==4){c[b+100>>2]=0;e=-1}return e|0}function X1(a){a=a|0;return ((a|0)==32|(a+-9|0)>>>0<5)&1|0}function Y1(a){a=a|0;var b=0,e=0;e=l;l=l+16|0;b=e;if((Z1(a)|0)==0?(eb[c[a+32>>2]&63](a,b,1)|0)==1:0)a=d[b>>0]|0;else a=-1;l=e;return a|0}function Z1(b){b=b|0;var d=0,e=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;d=b+20|0;e=b+28|0;if((c[d>>2]|0)>>>0>(c[e>>2]|0)>>>0)eb[c[b+36>>2]&63](b,0,0)|0;c[b+16>>2]=0;c[e>>2]=0;c[d>>2]=0;d=c[b>>2]|0;if(!(d&4)){e=(c[b+44>>2]|0)+(c[b+48>>2]|0)|0;c[b+8>>2]=e;c[b+4>>2]=e;d=d<<27>>31}else{c[b>>2]=d|32;d=-1}return d|0}function _1(a,b,c){a=a|0;b=b|0;c=c|0;c=T1(a,b,c,-1,0)|0;return c|0}function $1(a,b,c){a=a|0;b=b|0;c=c|0;c=T1(a,b,c,-2147483648,0)|0;return c|0}function a2(a){a=a|0;var b=0;b=(b2(a)|0)==0;return (b?a:a&95)|0}function b2(a){a=a|0;return (a+-97|0)>>>0<26|0}function c2(a,b){a=+a;b=+b;var d=0.0,e=0,f=0,g=0,i=0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;q=l;l=l+32|0;m=q+24|0;n=q+16|0;o=q+8|0;p=q;h[j>>3]=a;t=c[j>>2]|0;g=c[j+4>>2]|0;h[j>>3]=b;e=c[j>>2]|0;g=g&2147483647;f=c[j+4>>2]&2147483647;i=g>>>0>>0|(g|0)==(f|0)&t>>>0>>0;s=i?e:t;r=i?f:g;e=i?t:e;f=i?g:f;g=z6(s|0,r|0,52)|0;i=z6(e|0,f|0,52)|0;c[j>>2]=s;c[j+4>>2]=r;a=+h[j>>3];c[j>>2]=e;c[j+4>>2]=f;k=+h[j>>3];do if((i|0)!=2047){if(!((e|0)==0&(f|0)==0|(g|0)==2047)){if((g-i|0)>64){a=a+k;break}if(g>>>0>1533){d=5260135901548373507240989.0e186;b=a*1.90109156629516e-211;a=k*1.90109156629516e-211}else{t=i>>>0<573;d=t?1.90109156629516e-211:1.0;b=t?a*5260135901548373507240989.0e186:a;a=t?k*5260135901548373507240989.0e186:k}d2(m,n,b);d2(o,p,a);a=d*+G(+(+h[p>>3]+ +h[n>>3]+ +h[o>>3]+ +h[m>>3]))}}else a=k;while(0);l=q;return +a}function d2(a,b,c){a=a|0;b=b|0;c=+c;var d=0.0,e=0.0;e=c*134217729.0;e=e+(c-e);d=c-e;c=c*c;h[a>>3]=c;h[b>>3]=d*d+(e*e-c+e*2.0*d);return}function e2(a,b){a=+a;b=+b;var d=0,e=0;h[j>>3]=a;e=c[j>>2]|0;d=c[j+4>>2]|0;h[j>>3]=b;d=c[j+4>>2]&-2147483648|d&2147483647;c[j>>2]=e;c[j+4>>2]=d;return +(+h[j>>3])}function f2(b,c){b=b|0;c=c|0;var d=0,e=0;d=a[b>>0]|0;e=a[c>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=e<<24>>24)b=e;else{do{b=b+1|0;c=c+1|0;d=a[b>>0]|0;e=a[c>>0]|0}while(!(d<<24>>24==0?1:d<<24>>24!=e<<24>>24));b=e}return (d&255)-(b&255)|0}function g2(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;a:do if(!d)b=0;else{while(1){e=a[b>>0]|0;f=a[c>>0]|0;if(e<<24>>24!=f<<24>>24)break;d=d+-1|0;if(!d){b=0;break a}else{b=b+1|0;c=c+1|0}}b=(e&255)-(f&255)|0}while(0);return b|0}function h2(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;if(!d)e=0;else{h=a[b>>0]|0;e=h&255;g=a[c>>0]|0;f=g&255;a:do if(h<<24>>24)do{d=d+-1|0;if(!(h<<24>>24==g<<24>>24&((d|0)!=0&g<<24>>24!=0)))break a;b=b+1|0;c=c+1|0;h=a[b>>0]|0;e=h&255;g=a[c>>0]|0;f=g&255}while(h<<24>>24!=0);while(0);e=e-f|0}return e|0}function i2(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=j2(a,b,f)|0;l=e;return d|0}function j2(a,b,c){a=a|0;b=b|0;c=c|0;return k2(a,2147483647,b,c)|0}function k2(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+128|0;g=n+124|0;m=n;h=m;i=63492;j=h+124|0;do{c[h>>2]=c[i>>2];h=h+4|0;i=i+4|0}while((h|0)<(j|0));if((d+-1|0)>>>0>2147483646)if(!d){b=g;d=1;k=4}else{c[(L1()|0)>>2]=75;d=-1}else k=4;if((k|0)==4){k=-2-b|0;k=d>>>0>k>>>0?k:d;c[m+48>>2]=k;g=m+20|0;c[g>>2]=b;c[m+44>>2]=b;d=b+k|0;b=m+16|0;c[b>>2]=d;c[m+28>>2]=d;d=l2(m,e,f)|0;if(k){m=c[g>>2]|0;a[m+(((m|0)==(c[b>>2]|0))<<31>>31)>>0]=0}}l=n;return d|0}function l2(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+224|0;n=s+120|0;o=s+80|0;q=s;r=s+136|0;f=o;g=f+40|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));c[n>>2]=c[e>>2];if((m2(0,d,n,q,o)|0)<0)e=-1;else{if((c[b+76>>2]|0)>-1)p=n2(b)|0;else p=0;e=c[b>>2]|0;m=e&32;if((a[b+74>>0]|0)<1)c[b>>2]=e&-33;f=b+48|0;if(!(c[f>>2]|0)){g=b+44|0;h=c[g>>2]|0;c[g>>2]=r;i=b+28|0;c[i>>2]=r;j=b+20|0;c[j>>2]=r;c[f>>2]=80;k=b+16|0;c[k>>2]=r+80;e=m2(b,d,n,q,o)|0;if(h){eb[c[b+36>>2]&63](b,0,0)|0;e=(c[j>>2]|0)==0?-1:e;c[g>>2]=h;c[f>>2]=0;c[k>>2]=0;c[i>>2]=0;c[j>>2]=0}}else e=m2(b,d,n,q,o)|0;f=c[b>>2]|0;c[b>>2]=f|m;if(p|0)o2(b);e=(f&32|0)==0?e:-1}l=s;return e|0}function m2(d,e,f,g,i){d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0;H=l;l=l+64|0;C=H+16|0;E=H;A=H+24|0;F=H+8|0;G=H+20|0;c[C>>2]=e;x=(d|0)!=0;y=A+40|0;z=y;A=A+39|0;B=F+4|0;k=0;j=0;p=0;a:while(1){do if((j|0)>-1)if((k|0)>(2147483647-j|0)){c[(L1()|0)>>2]=75;j=-1;break}else{j=k+j|0;break}while(0);k=a[e>>0]|0;if(!(k<<24>>24)){w=87;break}else m=e;b:while(1){switch(k<<24>>24){case 37:{k=m;w=9;break b}case 0:{k=m;break b}default:{}}v=m+1|0;c[C>>2]=v;k=a[v>>0]|0;m=v}c:do if((w|0)==9)while(1){w=0;if((a[m+1>>0]|0)!=37)break c;k=k+1|0;m=m+2|0;c[C>>2]=m;if((a[m>>0]|0)==37)w=9;else break}while(0);k=k-e|0;if(x)p2(d,e,k);if(k|0){e=m;continue}n=m+1|0;k=(a[n>>0]|0)+-48|0;if(k>>>0<10){v=(a[m+2>>0]|0)==36;u=v?k:-1;p=v?1:p;n=v?m+3|0:n}else u=-1;c[C>>2]=n;k=a[n>>0]|0;m=(k<<24>>24)+-32|0;d:do if(m>>>0<32){o=0;q=k;while(1){k=1<>2]=n;k=a[n>>0]|0;m=(k<<24>>24)+-32|0;if(m>>>0>=32)break;else q=k}}else o=0;while(0);if(k<<24>>24==42){m=n+1|0;k=(a[m>>0]|0)+-48|0;if(k>>>0<10?(a[n+2>>0]|0)==36:0){c[i+(k<<2)>>2]=10;k=c[g+((a[m>>0]|0)+-48<<3)>>2]|0;p=1;n=n+3|0}else{if(p|0){j=-1;break}if(x){p=(c[f>>2]|0)+(4-1)&~(4-1);k=c[p>>2]|0;c[f>>2]=p+4;p=0;n=m}else{k=0;p=0;n=m}}c[C>>2]=n;v=(k|0)<0;k=v?0-k|0:k;o=v?o|8192:o}else{k=q2(C)|0;if((k|0)<0){j=-1;break}n=c[C>>2]|0}do if((a[n>>0]|0)==46){if((a[n+1>>0]|0)!=42){c[C>>2]=n+1;m=q2(C)|0;n=c[C>>2]|0;break}q=n+2|0;m=(a[q>>0]|0)+-48|0;if(m>>>0<10?(a[n+3>>0]|0)==36:0){c[i+(m<<2)>>2]=10;m=c[g+((a[q>>0]|0)+-48<<3)>>2]|0;n=n+4|0;c[C>>2]=n;break}if(p|0){j=-1;break a}if(x){v=(c[f>>2]|0)+(4-1)&~(4-1);m=c[v>>2]|0;c[f>>2]=v+4}else m=0;c[C>>2]=q;n=q}else m=-1;while(0);t=0;while(1){if(((a[n>>0]|0)+-65|0)>>>0>57){j=-1;break a}v=n+1|0;c[C>>2]=v;q=a[(a[n>>0]|0)+-65+(144946+(t*58|0))>>0]|0;r=q&255;if((r+-1|0)>>>0<8){t=r;n=v}else break}if(!(q<<24>>24)){j=-1;break}s=(u|0)>-1;do if(q<<24>>24==19)if(s){j=-1;break a}else w=49;else{if(s){c[i+(u<<2)>>2]=r;s=g+(u<<3)|0;u=c[s+4>>2]|0;w=E;c[w>>2]=c[s>>2];c[w+4>>2]=u;w=49;break}if(!x){j=0;break a}r2(E,r,f)}while(0);if((w|0)==49?(w=0,!x):0){k=0;e=v;continue}n=a[n>>0]|0;n=(t|0)!=0&(n&15|0)==3?n&-33:n;s=o&-65537;u=(o&8192|0)==0?o:s;e:do switch(n|0){case 110:switch((t&255)<<24>>24){case 0:{c[c[E>>2]>>2]=j;k=0;e=v;continue a}case 1:{c[c[E>>2]>>2]=j;k=0;e=v;continue a}case 2:{k=c[E>>2]|0;c[k>>2]=j;c[k+4>>2]=((j|0)<0)<<31>>31;k=0;e=v;continue a}case 3:{b[c[E>>2]>>1]=j;k=0;e=v;continue a}case 4:{a[c[E>>2]>>0]=j;k=0;e=v;continue a}case 6:{c[c[E>>2]>>2]=j;k=0;e=v;continue a}case 7:{k=c[E>>2]|0;c[k>>2]=j;c[k+4>>2]=((j|0)<0)<<31>>31;k=0;e=v;continue a}default:{k=0;e=v;continue a}}case 112:{n=120;m=m>>>0>8?m:8;e=u|8;w=61;break}case 88:case 120:{e=u;w=61;break}case 111:{n=E;e=c[n>>2]|0;n=c[n+4>>2]|0;r=t2(e,n,y)|0;s=z-r|0;o=0;q=145410;m=(u&8|0)==0|(m|0)>(s|0)?m:s+1|0;s=u;w=67;break}case 105:case 100:{n=E;e=c[n>>2]|0;n=c[n+4>>2]|0;if((n|0)<0){e=t6(0,0,e|0,n|0)|0;n=D;o=E;c[o>>2]=e;c[o+4>>2]=n;o=1;q=145410;w=66;break e}else{o=(u&2049|0)!=0&1;q=(u&2048|0)==0?((u&1|0)==0?145410:145412):145411;w=66;break e}}case 117:{n=E;o=0;q=145410;e=c[n>>2]|0;n=c[n+4>>2]|0;w=66;break}case 99:{a[A>>0]=c[E>>2];e=A;o=0;q=145410;r=y;n=1;m=s;break}case 109:{n=v2(c[(L1()|0)>>2]|0)|0;w=71;break}case 115:{n=c[E>>2]|0;n=n|0?n:145420;w=71;break}case 67:{c[F>>2]=c[E>>2];c[B>>2]=0;c[E>>2]=F;r=-1;n=F;w=75;break}case 83:{e=c[E>>2]|0;if(!m){x2(d,32,k,0,u);e=0;w=84}else{r=m;n=e;w=75}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{k=z2(d,+h[E>>3],k,m,u,n)|0;e=v;continue a}default:{o=0;q=145410;r=y;n=m;m=u}}while(0);f:do if((w|0)==61){u=E;t=c[u>>2]|0;u=c[u+4>>2]|0;r=s2(t,u,y,n&32)|0;q=(e&8|0)==0|(t|0)==0&(u|0)==0;o=q?0:2;q=q?145410:145410+(n>>4)|0;s=e;e=t;n=u;w=67}else if((w|0)==66){r=u2(e,n,y)|0;s=u;w=67}else if((w|0)==71){w=0;u=w2(n,0,m)|0;t=(u|0)==0;e=n;o=0;q=145410;r=t?n+m|0:u;n=t?m:u-n|0;m=s}else if((w|0)==75){w=0;q=n;e=0;m=0;while(1){o=c[q>>2]|0;if(!o)break;m=y2(G,o)|0;if((m|0)<0|m>>>0>(r-e|0)>>>0)break;e=m+e|0;if(r>>>0>e>>>0)q=q+4|0;else break}if((m|0)<0){j=-1;break a}x2(d,32,k,e,u);if(!e){e=0;w=84}else{o=0;while(1){m=c[n>>2]|0;if(!m){w=84;break f}m=y2(G,m)|0;o=m+o|0;if((o|0)>(e|0)){w=84;break f}p2(d,G,m);if(o>>>0>=e>>>0){w=84;break}else n=n+4|0}}}while(0);if((w|0)==67){w=0;n=(e|0)!=0|(n|0)!=0;u=(m|0)!=0|n;n=((n^1)&1)+(z-r)|0;e=u?r:y;r=y;n=u?((m|0)>(n|0)?m:n):m;m=(m|0)>-1?s&-65537:s}else if((w|0)==84){w=0;x2(d,32,k,e,u^8192);k=(k|0)>(e|0)?k:e;e=v;continue}t=r-e|0;s=(n|0)<(t|0)?t:n;u=s+o|0;k=(k|0)<(u|0)?u:k;x2(d,32,k,u,m);p2(d,q,o);x2(d,48,k,u,m^65536);x2(d,48,s,t,0);p2(d,e,t);x2(d,32,k,u,m^8192);e=v}g:do if((w|0)==87)if(!d)if(!p)j=0;else{j=1;while(1){e=c[i+(j<<2)>>2]|0;if(!e)break;r2(g+(j<<3)|0,e,f);j=j+1|0;if((j|0)>=10){j=1;break g}}while(1){if(c[i+(j<<2)>>2]|0){j=-1;break g}j=j+1|0;if((j|0)>=10){j=1;break}}}while(0);l=H;return j|0}function n2(a){a=a|0;return 0}function o2(a){a=a|0;return}function p2(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[a>>2]&32))L2(b,d,a)|0;return}function q2(b){b=b|0;var d=0,e=0,f=0;e=c[b>>2]|0;f=(a[e>>0]|0)+-48|0;if(f>>>0<10){d=0;do{d=f+(d*10|0)|0;e=e+1|0;c[b>>2]=e;f=(a[e>>0]|0)+-48|0}while(f>>>0<10)}else d=0;return d|0}function r2(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=b;break a}case 10:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=b;c[e+4>>2]=((b|0)<0)<<31>>31;break a}case 11:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=b;c[e+4>>2]=0;break a}case 12:{e=(c[d>>2]|0)+(8-1)&~(8-1);b=e;f=c[b>>2]|0;b=c[b+4>>2]|0;c[d>>2]=e+8;e=a;c[e>>2]=f;c[e+4>>2]=b;break a}case 13:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;e=(e&65535)<<16>>16;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a}case 14:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e&65535;c[f+4>>2]=0;break a}case 15:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;e=(e&255)<<24>>24;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a}case 16:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e&255;c[f+4>>2]=0;break a}case 17:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}case 18:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}default:break a}while(0);while(0);return}function s2(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;if(!((b|0)==0&(c|0)==0))do{e=e+-1|0;a[e>>0]=d[145458+(b&15)>>0]|0|f;b=z6(b|0,c|0,4)|0;c=D}while(!((b|0)==0&(c|0)==0));return e|0}function t2(b,c,d){b=b|0;c=c|0;d=d|0;if(!((b|0)==0&(c|0)==0))do{d=d+-1|0;a[d>>0]=b&7|48;b=z6(b|0,c|0,3)|0;c=D}while(!((b|0)==0&(c|0)==0));return d|0}function u2(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if(c>>>0>0|(c|0)==0&b>>>0>4294967295){while(1){e=J6(b|0,c|0,10,0)|0;d=d+-1|0;a[d>>0]=e&255|48;e=b;b=E6(b|0,c|0,10,0)|0;if(!(c>>>0>9|(c|0)==9&e>>>0>4294967295))break;else c=D}c=b}else c=b;if(c)while(1){d=d+-1|0;a[d>>0]=(c>>>0)%10|0|48;if(c>>>0<10)break;else c=(c>>>0)/10|0}return d|0}function v2(a){a=a|0;return G2(a,c[(F2()|0)+188>>2]|0)|0}function w2(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=d&255;f=(e|0)!=0;a:do if(f&(b&3|0)!=0){g=d&255;while(1){if((a[b>>0]|0)==g<<24>>24){i=6;break a}b=b+1|0;e=e+-1|0;f=(e|0)!=0;if(!(f&(b&3|0)!=0)){i=5;break}}}else i=5;while(0);if((i|0)==5)if(f)i=6;else e=0;b:do if((i|0)==6){g=d&255;if((a[b>>0]|0)!=g<<24>>24){f=S(h,16843009)|0;c:do if(e>>>0>3)while(1){h=c[b>>2]^f;if((h&-2139062144^-2139062144)&h+-16843009|0)break;b=b+4|0;e=e+-4|0;if(e>>>0<=3){i=11;break c}}else i=11;while(0);if((i|0)==11)if(!e){e=0;break}while(1){if((a[b>>0]|0)==g<<24>>24)break b;b=b+1|0;e=e+-1|0;if(!e){e=0;break}}}}while(0);return (e|0?b:0)|0}function x2(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+256|0;f=g;if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;u6(f|0,b|0,(e>>>0<256?e:256)|0)|0;if(e>>>0>255){b=c-d|0;do{p2(a,f,256);e=e+-256|0}while(e>>>0>255);e=b&255}p2(a,f,e)}l=g;return}function y2(a,b){a=a|0;b=b|0;if(!a)a=0;else a=D2(a,b,0)|0;return a|0}function z2(b,e,f,g,h,i){b=b|0;e=+e;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0;H=l;l=l+560|0;m=H+8|0;u=H;G=H+524|0;F=G;n=H+512|0;c[u>>2]=0;E=n+12|0;A2(e)|0;if((D|0)<0){e=-e;B=1;A=145427}else{B=(h&2049|0)!=0&1;A=(h&2048|0)==0?((h&1|0)==0?145428:145433):145430}A2(e)|0;C=D&2146435072;do if(C>>>0<2146435072|(C|0)==2146435072&0<0){r=+B2(e,u)*2.0;j=r!=0.0;if(j)c[u>>2]=(c[u>>2]|0)+-1;w=i|32;if((w|0)==97){s=i&32;q=(s|0)==0?A:A+9|0;p=B|2;j=12-g|0;do if(!(g>>>0>11|(j|0)==0)){e=8.0;do{j=j+-1|0;e=e*16.0}while((j|0)!=0);if((a[q>>0]|0)==45){e=-(e+(-r-e));break}else{e=r+e-e;break}}else e=r;while(0);k=c[u>>2]|0;j=(k|0)<0?0-k|0:k;j=u2(j,((j|0)<0)<<31>>31,E)|0;if((j|0)==(E|0)){j=n+11|0;a[j>>0]=48}a[j+-1>>0]=(k>>31&2)+43;o=j+-2|0;a[o>>0]=i+15;n=(g|0)<1;m=(h&8|0)==0;j=G;do{C=~~e;k=j+1|0;a[j>>0]=d[145458+C>>0]|s;e=(e-+(C|0))*16.0;if((k-F|0)==1?!(m&(n&e==0.0)):0){a[k>>0]=46;j=j+2|0}else j=k}while(e!=0.0);C=j-F|0;F=E-o|0;E=(g|0)!=0&(C+-2|0)<(g|0)?g+2|0:C;j=F+p+E|0;x2(b,32,f,j,h);p2(b,q,p);x2(b,48,f,j,h^65536);p2(b,G,C);x2(b,48,E-C|0,0,0);p2(b,o,F);x2(b,32,f,j,h^8192);break}k=(g|0)<0?6:g;if(j){j=(c[u>>2]|0)+-28|0;c[u>>2]=j;e=r*268435456.0}else{e=r;j=c[u>>2]|0}C=(j|0)<0?m:m+288|0;m=C;do{y=~~e>>>0;c[m>>2]=y;m=m+4|0;e=(e-+(y>>>0))*1.0e9}while(e!=0.0);if((j|0)>0){n=C;p=m;while(1){o=(j|0)<29?j:29;j=p+-4|0;if(j>>>0>=n>>>0){m=0;do{x=v6(c[j>>2]|0,0,o|0)|0;x=w6(x|0,D|0,m|0,0)|0;y=D;v=J6(x|0,y|0,1e9,0)|0;c[j>>2]=v;m=E6(x|0,y|0,1e9,0)|0;j=j+-4|0}while(j>>>0>=n>>>0);if(m){n=n+-4|0;c[n>>2]=m}}m=p;while(1){if(m>>>0<=n>>>0)break;j=m+-4|0;if(!(c[j>>2]|0))m=j;else break}j=(c[u>>2]|0)-o|0;c[u>>2]=j;if((j|0)>0)p=m;else break}}else n=C;if((j|0)<0){g=((k+25|0)/9|0)+1|0;t=(w|0)==102;do{s=0-j|0;s=(s|0)<9?s:9;if(n>>>0>>0){o=(1<>>s;q=0;j=n;do{y=c[j>>2]|0;c[j>>2]=(y>>>s)+q;q=S(y&o,p)|0;j=j+4|0}while(j>>>0>>0);j=(c[n>>2]|0)==0?n+4|0:n;if(!q){n=j;j=m}else{c[m>>2]=q;n=j;j=m+4|0}}else{n=(c[n>>2]|0)==0?n+4|0:n;j=m}m=t?C:n;m=(j-m>>2|0)>(g|0)?m+(g<<2)|0:j;j=(c[u>>2]|0)+s|0;c[u>>2]=j}while((j|0)<0);j=n;g=m}else{j=n;g=m}y=C;if(j>>>0>>0){m=(y-j>>2)*9|0;o=c[j>>2]|0;if(o>>>0>=10){n=10;do{n=n*10|0;m=m+1|0}while(o>>>0>=n>>>0)}}else m=0;t=(w|0)==103;v=(k|0)!=0;n=k-((w|0)!=102?m:0)+((v&t)<<31>>31)|0;if((n|0)<(((g-y>>2)*9|0)+-9|0)){n=n+9216|0;s=C+4+(((n|0)/9|0)+-1024<<2)|0;n=((n|0)%9|0)+1|0;if((n|0)<9){o=10;do{o=o*10|0;n=n+1|0}while((n|0)!=9)}else o=10;p=c[s>>2]|0;q=(p>>>0)%(o>>>0)|0;n=(s+4|0)==(g|0);if(!(n&(q|0)==0)){r=(((p>>>0)/(o>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;x=(o|0)/2|0;e=q>>>0>>0?.5:n&(q|0)==(x|0)?1.0:1.5;if(B){x=(a[A>>0]|0)==45;e=x?-e:e;r=x?-r:r}n=p-q|0;c[s>>2]=n;if(r+e!=r){x=n+o|0;c[s>>2]=x;if(x>>>0>999999999){m=s;while(1){n=m+-4|0;c[m>>2]=0;if(n>>>0>>0){j=j+-4|0;c[j>>2]=0}x=(c[n>>2]|0)+1|0;c[n>>2]=x;if(x>>>0>999999999)m=n;else break}}else n=s;m=(y-j>>2)*9|0;p=c[j>>2]|0;if(p>>>0>=10){o=10;do{o=o*10|0;m=m+1|0}while(p>>>0>=o>>>0)}}else n=s}else n=s;n=n+4|0;n=g>>>0>n>>>0?n:g;x=j}else{n=g;x=j}w=n;while(1){if(w>>>0<=x>>>0){u=0;break}j=w+-4|0;if(!(c[j>>2]|0))w=j;else{u=1;break}}g=0-m|0;do if(t){j=((v^1)&1)+k|0;if((j|0)>(m|0)&(m|0)>-5){o=i+-1|0;k=j+-1-m|0}else{o=i+-2|0;k=j+-1|0}j=h&8;if(!j){if(u?(z=c[w+-4>>2]|0,(z|0)!=0):0)if(!((z>>>0)%10|0)){n=0;j=10;do{j=j*10|0;n=n+1|0}while(!((z>>>0)%(j>>>0)|0|0))}else n=0;else n=9;j=((w-y>>2)*9|0)+-9|0;if((o|32|0)==102){s=j-n|0;s=(s|0)>0?s:0;k=(k|0)<(s|0)?k:s;s=0;break}else{s=j+m-n|0;s=(s|0)>0?s:0;k=(k|0)<(s|0)?k:s;s=0;break}}else s=j}else{o=i;s=h&8}while(0);t=k|s;p=(t|0)!=0&1;q=(o|32|0)==102;if(q){v=0;j=(m|0)>0?m:0}else{j=(m|0)<0?g:m;j=u2(j,((j|0)<0)<<31>>31,E)|0;n=E;if((n-j|0)<2)do{j=j+-1|0;a[j>>0]=48}while((n-j|0)<2);a[j+-1>>0]=(m>>31&2)+43;j=j+-2|0;a[j>>0]=o;v=j;j=n-j|0}j=B+1+k+p+j|0;x2(b,32,f,j,h);p2(b,A,B);x2(b,48,f,j,h^65536);if(q){o=x>>>0>C>>>0?C:x;s=G+9|0;p=s;q=G+8|0;n=o;do{m=u2(c[n>>2]|0,0,s)|0;if((n|0)==(o|0)){if((m|0)==(s|0)){a[q>>0]=48;m=q}}else if(m>>>0>G>>>0){u6(G|0,48,m-F|0)|0;do m=m+-1|0;while(m>>>0>G>>>0)}p2(b,m,p-m|0);n=n+4|0}while(n>>>0<=C>>>0);if(t|0)p2(b,145474,1);if(n>>>0>>0&(k|0)>0)while(1){m=u2(c[n>>2]|0,0,s)|0;if(m>>>0>G>>>0){u6(G|0,48,m-F|0)|0;do m=m+-1|0;while(m>>>0>G>>>0)}p2(b,m,(k|0)<9?k:9);n=n+4|0;m=k+-9|0;if(!(n>>>0>>0&(k|0)>9)){k=m;break}else k=m}x2(b,48,k+9|0,9,0)}else{t=u?w:x+4|0;if((k|0)>-1){u=G+9|0;s=(s|0)==0;g=u;p=0-F|0;q=G+8|0;o=x;do{m=u2(c[o>>2]|0,0,u)|0;if((m|0)==(u|0)){a[q>>0]=48;m=q}do if((o|0)==(x|0)){n=m+1|0;p2(b,m,1);if(s&(k|0)<1){m=n;break}p2(b,145474,1);m=n}else{if(m>>>0<=G>>>0)break;u6(G|0,48,m+p|0)|0;do m=m+-1|0;while(m>>>0>G>>>0)}while(0);F=g-m|0;p2(b,m,(k|0)>(F|0)?F:k);k=k-F|0;o=o+4|0}while(o>>>0>>0&(k|0)>-1)}x2(b,48,k+18|0,18,0);p2(b,v,E-v|0)}x2(b,32,f,j,h^8192)}else{G=(i&32|0)!=0;j=B+3|0;x2(b,32,f,j,h&-65537);p2(b,A,B);p2(b,e!=e|0.0!=0.0?(G?153609:145454):G?145446:145450,3);x2(b,32,f,j,h^8192)}while(0);l=H;return ((j|0)<(f|0)?f:j)|0}function A2(a){a=+a;var b=0;h[j>>3]=a;b=c[j>>2]|0;D=c[j+4>>2]|0;return b|0}function B2(a,b){a=+a;b=b|0;return +(+C2(a,b))}function C2(a,b){a=+a;b=b|0;var d=0,e=0,f=0;h[j>>3]=a;d=c[j>>2]|0;e=c[j+4>>2]|0;f=z6(d|0,e|0,52)|0;switch(f&2047){case 0:{if(a!=0.0){a=+C2(a*18446744073709551616.0,b);d=(c[b>>2]|0)+-64|0}else d=0;c[b>>2]=d;break}case 2047:break;default:{c[b>>2]=(f&2047)+-1022;c[j>>2]=d;c[j+4>>2]=e&-2146435073|1071644672;a=+h[j>>3]}}return +a}function D2(b,d,e){b=b|0;d=d|0;e=e|0;do if(b){if(d>>>0<128){a[b>>0]=d;b=1;break}if(!(c[c[(E2()|0)+188>>2]>>2]|0))if((d&-128|0)==57216){a[b>>0]=d;b=1;break}else{c[(L1()|0)>>2]=84;b=-1;break}if(d>>>0<2048){a[b>>0]=d>>>6|192;a[b+1>>0]=d&63|128;b=2;break}if(d>>>0<55296|(d&-8192|0)==57344){a[b>>0]=d>>>12|224;a[b+1>>0]=d>>>6&63|128;a[b+2>>0]=d&63|128;b=3;break}if((d+-65536|0)>>>0<1048576){a[b>>0]=d>>>18|240;a[b+1>>0]=d>>>12&63|128;a[b+2>>0]=d>>>6&63|128;a[b+3>>0]=d&63|128;b=4;break}else{c[(L1()|0)>>2]=84;b=-1;break}}else b=1;while(0);return b|0}function E2(){return N1()|0}function F2(){return N1()|0}function G2(b,e){b=b|0;e=e|0;var f=0,g=0;g=0;while(1){if((d[145476+g>>0]|0)==(b|0)){b=2;break}f=g+1|0;if((f|0)==87){f=145564;g=87;b=5;break}else g=f}if((b|0)==2)if(!g)f=145564;else{f=145564;b=5}if((b|0)==5)while(1){do{b=f;f=f+1|0}while((a[b>>0]|0)!=0);g=g+-1|0;if(!g)break;else b=5}return H2(f,c[e+20>>2]|0)|0}function H2(a,b){a=a|0;b=b|0;return I2(a,b)|0}function I2(a,b){a=a|0;b=b|0;if(!b)b=0;else b=J2(c[b>>2]|0,c[b+4>>2]|0,a)|0;return (b|0?b:a)|0}function J2(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=(c[b>>2]|0)+1794895138|0;h=K2(c[b+8>>2]|0,o)|0;f=K2(c[b+12>>2]|0,o)|0;g=K2(c[b+16>>2]|0,o)|0;a:do if((h>>>0>>2>>>0?(n=d-(h<<2)|0,f>>>0>>0&g>>>0>>0):0)?((g|f)&3|0)==0:0){n=f>>>2;m=g>>>2;l=0;while(1){j=h>>>1;k=l+j|0;i=k<<1;g=i+n|0;f=K2(c[b+(g<<2)>>2]|0,o)|0;g=K2(c[b+(g+1<<2)>>2]|0,o)|0;if(!(g>>>0>>0&f>>>0<(d-g|0)>>>0)){f=0;break a}if(a[b+(g+f)>>0]|0){f=0;break a}f=f2(e,b+g|0)|0;if(!f)break;f=(f|0)<0;if((h|0)==1){f=0;break a}else{l=f?l:k;h=f?j:h-j|0}}f=i+m|0;g=K2(c[b+(f<<2)>>2]|0,o)|0;f=K2(c[b+(f+1<<2)>>2]|0,o)|0;if(f>>>0>>0&g>>>0<(d-f|0)>>>0)f=(a[b+(f+g)>>0]|0)==0?b+f|0:0;else f=0}else f=0;while(0);return f|0}function K2(a,b){a=a|0;b=b|0;var c=0;c=K6(a|0)|0;return ((b|0)==0?a:c)|0}function L2(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=e+16|0;g=c[f>>2]|0;if(!g)if(!(M2(e)|0)){g=c[f>>2]|0;h=5}else f=0;else h=5;a:do if((h|0)==5){j=e+20|0;i=c[j>>2]|0;f=i;if((g-i|0)>>>0>>0){f=eb[c[e+36>>2]&63](e,b,d)|0;break}b:do if((a[e+75>>0]|0)>-1){i=d;while(1){if(!i){h=0;g=b;break b}g=i+-1|0;if((a[b+g>>0]|0)==10)break;else i=g}f=eb[c[e+36>>2]&63](e,b,i)|0;if(f>>>0>>0)break a;h=i;g=b+i|0;d=d-i|0;f=c[j>>2]|0}else{h=0;g=b}while(0);B6(f|0,g|0,d|0)|0;c[j>>2]=(c[j>>2]|0)+d;f=h+d|0}while(0);return f|0}function M2(b){b=b|0;var d=0,e=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;d=c[b>>2]|0;if(!(d&8)){c[b+8>>2]=0;c[b+4>>2]=0;e=c[b+44>>2]|0;c[b+28>>2]=e;c[b+20>>2]=e;c[b+16>>2]=e+(c[b+48>>2]|0);b=0}else{c[b>>2]=d|32;b=-1}return b|0}function N2(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=a+20|0;f=c[e>>2]|0;a=(c[a+16>>2]|0)-f|0;a=a>>>0>d>>>0?d:a;B6(f|0,b|0,a|0)|0;c[e>>2]=(c[e>>2]|0)+a;return d|0}function O2(a){a=a|0;return ((a+-48|0)>>>0<10|(P2(a)|0)!=0)&1|0}function P2(a){a=a|0;return ((a|32)+-97|0)>>>0<26|0}function Q2(a){a=a|0;return ((a|0)==32|(a|0)==9)&1|0}function R2(a){a=a|0;if(!(S2(a)|0))a=(T2(a)|0)!=0;else a=1;return a&1|0}function S2(a){a=a|0;return (a+-48|0)>>>0<10|0}function T2(a){a=a|0;if(a>>>0<131072)a=(d[147368+((d[147368+(a>>>8)>>0]|0)<<5|a>>>3&31)>>0]|0)>>>(a&7)&1;else a=a>>>0<196606&1;return a|0}function U2(a){a=a|0;return Q2(a)|0}function V2(a){a=a|0;return ((a+-65529|0)>>>0<3|((a&-2|0)==8232|(a>>>0<32|(a+-127|0)>>>0<33)))&1|0}function W2(a,b){a=a|0;b=b|0;do switch(b|0){case 1:{a=R2(a)|0;break}case 2:{a=T2(a)|0;break}case 3:{a=U2(a)|0;break}case 4:{a=V2(a)|0;break}case 5:{a=S2(a)|0;break}case 6:{a=X2(a)|0;break}case 7:{a=Y2(a)|0;break}case 8:{a=Z2(a)|0;break}case 9:{a=_2(a)|0;break}case 10:{a=$2(a)|0;break}case 11:{a=a3(a)|0;break}case 12:{a=b3(a)|0;break}default:a=0}while(0);return a|0}function X2(a){a=a|0;if(!($2(a)|0))a=(Z2(a)|0)!=0;else a=0;return a&1|0}function Y2(a){a=a|0;return (g3(a)|0)!=(a|0)|0}function Z2(a){a=a|0;if(a>>>0>=255)if((a+-57344|0)>>>0<8185|(a>>>0<8232|(a+-8234|0)>>>0<47062))a=1;else return (a&65534|0)!=65534&(a+-65532|0)>>>0<1048580&1|0;else a=(a+1&127)>>>0>32&1;return a|0}function _2(a){a=a|0;if(a>>>0<131072)a=(d[150344+((d[150344+(a>>>8)>>0]|0)<<5|a>>>3&31)>>0]|0)>>>(a&7)&1;else a=0;return a|0}function $2(a){a=a|0;if(!a)a=0;else a=(e3(63616,a)|0)!=0;return a&1|0}function a3(a){a=a|0;return (c3(a)|0)!=(a|0)|0}function b3(a){a=a|0;return ((a+-48|0)>>>0<10|((a|32)+-97|0)>>>0<6)&1|0}function c3(a){a=a|0;return d3(a,1)|0}function d3(c,f){c=c|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;k=(f<<1)+-1|0;l=f+-1|0;a:do if(!((c+-43008|0)>>>0<22272|((c+-11776|0)>>>0<30784|((c+-1536|0)>>>0<2560|(T2(c)|0)==0)))){g=(f|0)!=0;if(g&(c+-4256|0)>>>0<46){if((c|0)>4293)switch(c|0){case 4295:case 4301:break;default:break a}c=c+7264|0;break}if((c+-11520|0)>>>0<38&(g^1)){c=c+-7264|0;break}else g=0;do{i=a[66618+(g<<2)+2>>0]|0;j=i<<24>>24;h=c-(e[66618+(g<<2)>>1]|0)|0;if((h-(j&l)|0)>>>0<(d[66618+(g<<2)+3>>0]|0)>>>0){m=11;break}g=g+1|0}while((g|0)!=61);if((m|0)==11)if(i<<24>>24==1){c=f+c-(h&1)|0;break}else{c=(S(j,k)|0)+c|0;break}i=1-f|0;g=b[66130+(i<<1)>>1]|0;b:do if(g<<16>>16){h=0;while(1){if((g&65535|0)==(c|0))break;h=h+1|0;g=b[66130+(h<<2)+(i<<1)>>1]|0;if(!(g<<16>>16))break b}c=e[66130+(h<<2)+(f<<1)>>1]|0;break a}while(0);return ((c+-66600+(f*40|0)|0)>>>0<40?c+-40+(f*80|0)|0:c)|0}while(0);return c|0}function e3(a,b){a=a|0;b=b|0;var d=0,e=0;if(!b)a=a+((f3(a)|0)<<2)|0;else{while(1){e=c[a>>2]|0;d=(e|0)!=0;if((e|0)==(b|0)|d^1)break;else a=a+4|0}a=d?a:0}return a|0}function f3(a){a=a|0;var b=0;b=a;while(1)if(!(c[b>>2]|0))break;else b=b+4|0;return b-a>>2|0}function g3(a){a=a|0;return d3(a,0)|0}function h3(b){b=b|0;var c=0,d=0,e=0,f=0;e=a[b>>0]|0;c=1;d=153512;f=97;while(1){if(e<<24>>24==f<<24>>24?(f2(b,d)|0)==0:0)break;d=d+6|0;f=a[d>>0]|0;if(!(f<<24>>24)){c=0;break}else c=c+1|0}return c|0}function i3(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=l;l=l+48|0;f=g+40|0;e=g+8|0;d=g;c[d>>2]=a;c[d+4>>2]=b;d=Ha(197,d|0)|0;if((d|0)==-9?(c[e>>2]=a,c[e+4>>2]=1,(ua(221,e|0)|0)>=0):0){j3(e,a);c[f>>2]=e;c[f+4>>2]=b;b=K1(Ja(195,f|0)|0)|0}else b=K1(d)|0;l=g;return b|0}function j3(b,c){b=b|0;c=c|0;var d=0,e=0,f=0;d=b;e=153585;f=d+15|0;do{a[d>>0]=a[e>>0]|0;d=d+1|0;e=e+1|0}while((d|0)<(f|0));if(!c){a[b+14>>0]=48;a[b+15>>0]=0}else{e=c;d=14;while(1){d=d+1|0;if(e>>>0<10)break;else e=(e>>>0)/10|0}a[b+d>>0]=0;while(1){d=d+-1|0;a[b+d>>0]=(c>>>0)%10|0|48;if(c>>>0<10)break;else c=(c>>>0)/10|0}}return}function k3(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+208|0;j=m+8|0;k=m;h=S(d,b)|0;i=k;c[i>>2]=1;c[i+4>>2]=0;a:do if(h|0){i=0-d|0;c[j+4>>2]=d;c[j>>2]=d;f=2;b=d;g=d;while(1){b=b+d+g|0;c[j+(f<<2)>>2]=b;if(b>>>0>>0){n=g;f=f+1|0;g=b;b=n}else break}g=a+h+i|0;if(g>>>0>a>>>0){h=g;f=1;b=1;do{do if((b&3|0)!=3){b=f+-1|0;if((c[j+(b<<2)>>2]|0)>>>0<(h-a|0)>>>0)l3(a,d,e,f,j);else n3(a,d,e,k,f,0,j);if((f|0)==1){o3(k,1);f=0;break}else{o3(k,b);f=1;break}}else{l3(a,d,e,f,j);m3(k,2);f=f+2|0}while(0);b=c[k>>2]|1;c[k>>2]=b;a=a+d|0}while(a>>>0>>0)}else{f=1;b=1}n3(a,d,e,k,f,0,j);g=k+4|0;while(1){if((f|0)==1&(b|0)==1){if(!(c[g>>2]|0))break a}else if((f|0)>=2){o3(k,2);n=f+-2|0;c[k>>2]=c[k>>2]^7;m3(k,1);n3(a+(0-(c[j+(n<<2)>>2]|0))+i|0,d,e,k,f+-1|0,1,j);o3(k,1);b=c[k>>2]|1;c[k>>2]=b;h=a+i|0;n3(h,d,e,k,n,1,j);a=h;f=n;continue}b=p3(k)|0;m3(k,b);a=a+i|0;f=b+f|0;b=c[k>>2]|0}}while(0);l=m;return}function l3(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+240|0;m=n;c[m>>2]=a;a:do if((e|0)>1){k=0-b|0;g=a;j=e;e=1;while(1){h=g+k|0;i=j+-2|0;g=h+(0-(c[f+(i<<2)>>2]|0))|0;if((vb[d&127](a,g)|0)>-1?(vb[d&127](a,h)|0)>-1:0)break a;a=e+1|0;e=m+(e<<2)|0;if((vb[d&127](g,h)|0)>-1){c[e>>2]=g;e=j+-1|0}else{c[e>>2]=h;g=h;e=i}if((e|0)<=1){e=a;break a}j=e;e=a;a=c[m>>2]|0}}else e=1;while(0);r3(b,m,e);l=n;return}function m3(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=a+4|0;if(b>>>0>31){e=c[f>>2]|0;c[a>>2]=e;c[f>>2]=0;b=b+-32|0;d=0}else{d=c[f>>2]|0;e=c[a>>2]|0}c[a>>2]=d<<32-b|e>>>b;c[f>>2]=d>>>b;return}function n3(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;p=l;l=l+240|0;n=p+232|0;o=p;q=c[e>>2]|0;c[n>>2]=q;j=c[e+4>>2]|0;k=n+4|0;c[k>>2]=j;c[o>>2]=a;a:do if((q|0)!=1|(j|0)!=0?(m=0-b|0,i=a+(0-(c[h+(f<<2)>>2]|0))|0,(vb[d&127](i,a)|0)>=1):0){e=1;g=(g|0)==0;j=i;while(1){if(g&(f|0)>1){g=a+m|0;i=c[h+(f+-2<<2)>>2]|0;if((vb[d&127](g,j)|0)>-1){i=10;break a}if((vb[d&127](g+(0-i)|0,j)|0)>-1){i=10;break a}}g=e+1|0;c[o+(e<<2)>>2]=j;q=p3(n)|0;m3(n,q);f=q+f|0;if(!((c[n>>2]|0)!=1|(c[k>>2]|0)!=0)){e=g;a=j;i=10;break a}a=j+(0-(c[h+(f<<2)>>2]|0))|0;if((vb[d&127](a,c[o>>2]|0)|0)<1){a=j;e=g;g=0;i=9;break}else{q=j;e=g;g=1;j=a;a=q}}}else{e=1;i=9}while(0);if((i|0)==9?(g|0)==0:0)i=10;if((i|0)==10){r3(b,o,e);l3(a,b,d,f,h)}l=p;return}function o3(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=a+4|0;if(b>>>0>31){e=c[a>>2]|0;c[f>>2]=e;c[a>>2]=0;b=b+-32|0;d=0}else{d=c[a>>2]|0;e=c[f>>2]|0}c[f>>2]=d>>>(32-b|0)|e<>2]=d<>2]|0)+-1|0)|0;if(!b){b=q3(c[a+4>>2]|0)|0;return ((b|0)==0?0:b+32|0)|0}else return b|0;return 0}function q3(a){a=a|0;var b=0;if(a)if(!(a&1)){b=a;a=0;do{a=a+1|0;b=b>>>1}while(!(b&1|0))}else a=0;else a=32;return a|0} +function yb(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}function zb(){return l|0}function Ab(a){a=a|0;l=a}function Bb(a,b){a=a|0;b=b|0;l=a;m=b}function Cb(a,b){a=a|0;b=b|0;if(!o){o=a;p=b}}function Db(a){a=a|0;D=a}function Eb(){return D|0}function Fb(a){a=a|0;c[46696]=a;return 0}function Gb(){return c[46696]|0}function Hb(a,b){a=a|0;b=b|0;Sa(0,a|0,b|0)|0;return}function Ib(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;f=i+4|0;g=i;c[f>>2]=0;h=kG()|0;pG(h,11016);pG(h,17260);pG(h,17480);cA(1)|0;bA(18)|0;while(1){a=WB(a)|0;e=c[f>>2]|0;if(!a)break;if(e|0){a=195341;continue}lG(h,a,d)|0;oG(h,a,b,f,g)|0;a=195341}l=i;return e|0}function Jb(a){a=a|0;var d=0,e=0,f=0,g=0;g=l;l=l+16|0;d=g+4|0;e=g;f=c[(c[a+16>>2]|0)+8>>2]|0;a=a+64|0;switch(c[a>>2]|0){case 0:{HL(f);break}case 1:{if(b[(c[f+16>>2]|0)+136>>1]&1)SP(f);break}case 4:case 5:case 6:{EL(f,e,d);Mb(f,c[e>>2]|0,c[d>>2]|0,c[a>>2]|0);break}default:{}}l=g;return}function Kb(a){a=a|0;var b=0,d=0,e=0,f=0;e=c[(c[a+16>>2]|0)+8>>2]|0;if(!(c[46697]|0)){c[46697]=c[4689];c[46698]=57;c[46699]=19}f=e+64|0;d=(c[f>>2]|0)+8|0;b=c[d>>2]|0;c[d>>2]=186788;d=a+152|0;switch(c[a+64>>2]|0){case 2:{uL(a,e,a,0);break}case 3:{uL(a,e,a,1);break}case 1:case 0:{if(!(c[d>>2]&134217728))bE(e,a)|0;break}case 6:case 5:case 4:{Lb(e);if(!(c[d>>2]&134217728))bE(e,a)|0;break}default:{}}c[(c[f>>2]|0)+8>>2]=b;return}function Lb(b){b=b|0;var d=0,e=0;d=c[46701]|0;if((d|0)!=(c[46700]|0)){e=c[c[46732]>>2]|0;if(!e){e=YP(b,0,100109,195341)|0;c[c[46732]>>2]=e;d=c[46701]|0}if(d>>>0>=(c[46702]|0)>>>0){iA(186800,1)|0;d=c[46701]|0}a[d>>0]=0;d=c[46700]|0;c[46701]=d;HA(b,e,d)|0}if(c[(c[b+16>>2]|0)+12>>2]|0){e=c[(c[46732]|0)+4>>2]|0;d=c[46717]|0;if(d>>>0>=(c[46718]|0)>>>0){iA(186864,1)|0;d=c[46717]|0}a[d>>0]=0;d=c[46716]|0;c[46717]=d;HA(b,e,d)|0}QA(b,67025,c[(c[46732]|0)+8236>>2]|0,195341)|0;d=0;while(1){if((d|0)==8)break;lA(186800+(d<<4)|0);d=d+1|0}l6(c[46732]|0);h[1]=1.0;h[5]=1.0;c[46733]=0;c[46737]=0;return}function Mb(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;j=k6(8240)|0;c[46732]=j;h=j+8232|0;a:do switch(g|0){case 6:{b[h>>1]=14;g=67041;h=j;break}case 5:{b[h>>1]=12;g=67045;h=j;break}default:{g=NA(d,67025)|0;if((g|0?a[g>>0]|0:0)?(i=Nb(g)|0,(i&65535)>10):0){h=c[46732]|0;b[h+8232>>1]=i;break a}g=Nb(67037)|0;h=c[46732]|0;b[h+8232>>1]=g;g=67037}}while(0);c[h+8236>>2]=g;j=d+16|0;g=c[j>>2]|0;if(!(c[g+180>>2]|0))i=0;else{i=YP(d,0,100109,195341)|0;h=c[46732]|0;g=c[j>>2]|0}c[h>>2]=i;if(!(a[g+113>>0]&8))g=0;else g=YP(d,0,67049,195341)|0;c[(c[46732]|0)+4>>2]=g;i=YP(d,1,100109,195341)|0;c[(c[46732]|0)+8>>2]=i;i=YP(d,1,67049,195341)|0;c[(c[46732]|0)+12>>2]=i;i=YP(d,2,100109,195341)|0;g=c[46732]|0;c[g+16>>2]=i;if(!f)h=0;else{h=YP(d,2,67057,195341)|0;g=c[46732]|0}c[g+20>>2]=h;if(!e)h=0;else{h=YP(d,2,67065,195341)|0;g=c[46732]|0}c[g+24>>2]=h;h=a[(c[j>>2]|0)+113>>0]|0;if(!(h&33))i=0;else{i=YP(d,2,67049,195341)|0;g=c[46732]|0;h=a[(c[j>>2]|0)+113>>0]|0}c[g+28>>2]=i;if(!(h&2))i=0;else{i=YP(d,2,67073,195341)|0;g=c[46732]|0;h=a[(c[j>>2]|0)+113>>0]|0}c[g+32>>2]=i;if(!(h&4))h=0;else{h=YP(d,2,67082,195341)|0;g=c[46732]|0}c[g+36>>2]=h;g=0;while(1){if((g|0)==8)break;hA(186800+(g<<4)|0,1024,(c[46732]|0)+40+(g<<10)|0);g=g+1|0}return}function Nb(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+1040|0;h=j;i=j+8|0;g=0;d=b;a:while(1){e=d;do{f=e;e=e+1|0;f=a[f>>0]|0;if(!(f<<24>>24)){e=8;break a}}while(((f<<24>>24)+-48|0)>>>0>=10);d=i+g|0;if((g|0)>=1023){e=7;break}a[d>>0]=f;g=g+1|0;d=e}if((e|0)==7){c[h>>2]=b;dA(0,67091,h)|0}else if((e|0)==8)d=i+g|0;a[d>>0]=0;i=(d6(i)|0)&65535;l=j;return i|0}function Ob(b){b=b|0;var d=0,e=0;e=c[(c[b+16>>2]|0)+8>>2]|0;d=c[c[46732]>>2]|0;b=c[46705]|0;if(b>>>0>=(c[46706]|0)>>>0){iA(186816,1)|0;b=c[46705]|0}a[b>>0]=0;b=c[46704]|0;c[46705]=b;HA(e,d,b)|0;if(c[(c[e+16>>2]|0)+12>>2]|0){d=c[(c[46732]|0)+4>>2]|0;b=c[46721]|0;if(b>>>0>=(c[46722]|0)>>>0){iA(186880,1)|0;b=c[46721]|0}a[b>>0]=0;b=c[46720]|0;c[46721]=b;HA(e,d,b)|0}h[2]=1.0;h[6]=1.0;c[46734]=0;c[46738]=0;return}function Pb(b){b=b|0;var d=0,e=0;e=c[(c[b+16>>2]|0)+8>>2]|0;b=c[46705]|0;if((b|0)!=(c[46704]|0)){d=c[(c[46732]|0)+8>>2]|0;if(b>>>0>=(c[46706]|0)>>>0){iA(186816,1)|0;b=c[46705]|0}a[b>>0]=0;b=c[46704]|0;c[46705]=b;HA(e,d,b)|0}b=c[46721]|0;if((b|0)!=(c[46720]|0)){d=c[(c[46732]|0)+12>>2]|0;if(b>>>0>=(c[46722]|0)>>>0){iA(186880,1)|0;b=c[46721]|0}a[b>>0]=0;b=c[46720]|0;c[46721]=b;HA(e,d,b)|0}h[9]=1.0;h[11]=1.0;c[46741]=0;c[46743]=0;return}function Qb(b){b=b|0;var d=0,e=0;e=c[(c[b+16>>2]|0)+8>>2]|0;b=c[46705]|0;if((b|0)!=(c[46704]|0)){d=c[(c[46732]|0)+16>>2]|0;if(b>>>0>=(c[46706]|0)>>>0){iA(186816,1)|0;b=c[46705]|0}a[b>>0]=0;b=c[46704]|0;c[46705]=b;HA(e,d,b)|0}b=c[46709]|0;if((b|0)!=(c[46708]|0)){d=c[(c[46732]|0)+24>>2]|0;if(b>>>0>=(c[46710]|0)>>>0){iA(186832,1)|0;b=c[46709]|0}a[b>>0]=0;b=c[46708]|0;c[46709]=b;HA(e,d,b)|0}b=c[46713]|0;if((b|0)!=(c[46712]|0)){d=c[(c[46732]|0)+20>>2]|0;if(b>>>0>=(c[46714]|0)>>>0){iA(186848,1)|0;b=c[46713]|0}a[b>>0]=0;b=c[46712]|0;c[46713]=b;HA(e,d,b)|0}b=c[46721]|0;if((b|0)!=(c[46720]|0)){d=c[(c[46732]|0)+28>>2]|0;if(b>>>0>=(c[46722]|0)>>>0){iA(186880,1)|0;b=c[46721]|0}a[b>>0]=0;b=c[46720]|0;c[46721]=b;HA(e,d,b)|0}b=c[46725]|0;if((b|0)!=(c[46724]|0)){d=c[(c[46732]|0)+36>>2]|0;if(b>>>0>=(c[46726]|0)>>>0){iA(186896,1)|0;b=c[46725]|0}a[b>>0]=0;b=c[46724]|0;c[46725]=b;HA(e,d,b)|0}b=c[46729]|0;if((b|0)!=(c[46728]|0)){d=c[(c[46732]|0)+32>>2]|0;if(b>>>0>=(c[46730]|0)>>>0){iA(186912,1)|0;b=c[46729]|0}a[b>>0]=0;b=c[46728]|0;c[46729]=b;HA(e,d,b)|0}h[10]=1.0;h[12]=1.0;h[3]=1.0;h[4]=1.0;h[7]=1.0;h[8]=1.0;c[46742]=0;c[46744]=0;c[46735]=0;c[46736]=0;c[46739]=0;c[46740]=0;return}function Rb(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=l;l=l+1056|0;j=t+16|0;s=t+8|0;r=t;k=t+32|0;o=c[(c[d+16>>2]|0)+12>>2]|0;p=c[11456+(o<<2)>>2]|0;kA(p,67188)|0;g=f+4|0;_b(k,+h[(c[g>>2]|0)+16>>3]);kA(p,k)|0;bc(d,195341,c[c[g>>2]>>2]|0);Xb(d);q=a[f+48>>0]|0;q=q<<24>>24==108?-1:q<<24>>24==114&1;g=c[g>>2]|0;if(!g)g=0;else g=c[g+24>>2]&127;i=b[(c[46732]|0)+8232>>1]|0;if((i&65535)>14?(m=c[11504+((i&65535)+-15<<2)>>2]&g,n=186932+(o<<2)|0,(c[n>>2]|0)!=(m|0)):0){c[r>>2]=m;i2(k,67191,r)|0;kA(p,k)|0;c[n>>2]=m}r=e+8|0;h[r>>3]=+h[f+24>>3]+ +h[r>>3];kA(p,67197)|0;c[j>>2]=c[e>>2];c[j+4>>2]=c[e+4>>2];c[j+8>>2]=c[e+8>>2];c[j+12>>2]=c[e+12>>2];Zb(p,j);c[s>>2]=q;i2(k,102521,s)|0;kA(p,k)|0;_b(k,+h[f+32>>3]);kA(p,k)|0;bc(d,195341,c[f>>2]|0);l=t;return}function Sb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0;i=l;l=l+1040|0;f=i;g=i+16|0;e=c[(c[a+16>>2]|0)+12>>2]|0;Wb(a);Xb(a);e=11456+(e<<2)|0;if(!d){a=c[e>>2]|0;kA(a,67185)|0}else{if((d|1|0)==3)dc(a,d,b,2);else ec(a);a=c[e>>2]|0;kA(a,67182)|0};c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];Zb(a,f);_b(g,+h[b+16>>3]-+h[b>>3]);kA(a,g)|0;_b(g,+h[b+24>>3]-+h[b+8>>3]);kA(a,g)|0;l=i;return}function Tb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Wb(a);Xb(a);if(!d)Yb(a,112,b,c);else{if((d|1|0)==3)dc(a,d,b,c);else ec(a);Yb(a,80,b,c)}return}function Ub(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Wb(a);Xb(a);if(!f)Yb(a,66,b,c);else{if((f|1|0)==3)dc(a,f,b,c);else ec(a);Yb(a,98,b,c)}return}function Vb(a,b,c){a=a|0;b=b|0;c=c|0;Wb(a);Xb(a);Yb(a,76,b,c);return}function Wb(b){b=b|0;var d=0,e=0,f=0,g=0.0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+1184|0;i=n;f=n+24|0;m=n+8|0;hA(m,1024,n+152|0);j=b+16|0;d=c[j>>2]|0;g=+h[d+152>>3];e=8+(c[d+12>>2]<<3)|0;if(g!=+h[e>>3]){h[e>>3]=g;kA(m,67154)|0;h[i>>3]=+h[(c[j>>2]|0)+152>>3];i2(f,67168,i)|0;$b(f,0);kA(m,f)|0;f=m+4|0;d=c[f>>2]|0;e=m+8|0;if(d>>>0>=(c[e>>2]|0)>>>0){iA(m,1)|0;d=c[f>>2]|0}c[f>>2]=d+1;a[d>>0]=41;d=c[f>>2]|0;if(d>>>0>=(c[e>>2]|0)>>>0){iA(m,1)|0;d=c[f>>2]|0}a[d>>0]=0;d=c[m>>2]|0;c[f>>2]=d;bc(b,67173,d);d=c[j>>2]|0}d=c[d+160>>2]|0;if(d|0){j=m+4|0;k=m+8|0;a:while(1){i=d+4|0;d=c[d>>2]|0;if(!d)break;switch(a[d>>0]|0){case 102:{if(!(f2(d,111402)|0)){d=i;continue a}break}case 98:{if(!(f2(d,111384)|0)){d=i;continue a}break}case 115:{if(!(f2(d,111389)|0)){d=i;continue a}break}default:{}}kA(m,d)|0;do{f=d;d=d+1|0}while((a[f>>0]|0)!=0);if(a[d>>0]|0){e=c[j>>2]|0;if(e>>>0>=(c[k>>2]|0)>>>0){iA(m,1)|0;e=c[j>>2]|0}c[j>>2]=e+1;a[e>>0]=40;f=0;while(1){if(!(a[d>>0]|0))break;if(f|0){e=c[j>>2]|0;if(e>>>0>=(c[k>>2]|0)>>>0){iA(m,1)|0;e=c[j>>2]|0}c[j>>2]=e+1;a[e>>0]=44}kA(m,d)|0;do{e=d;d=d+1|0}while((a[e>>0]|0)!=0);f=f+1|0}d=c[j>>2]|0;if(d>>>0>=(c[k>>2]|0)>>>0){iA(m,1)|0;d=c[j>>2]|0}c[j>>2]=d+1;a[d>>0]=41}d=c[j>>2]|0;if(d>>>0>=(c[k>>2]|0)>>>0){iA(m,1)|0;d=c[j>>2]|0}a[d>>0]=0;d=c[m>>2]|0;c[j>>2]=d;bc(b,67173,d);d=i}lA(m)}l=n;return}function Xb(a){a=a|0;ac((c[a+16>>2]|0)+16|0);bc(a,76106,194038);return}function Yb(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;k=l;l=l+1040|0;j=k;i=k+16|0;h=c[11456+(c[(c[b+16>>2]|0)+12>>2]<<2)>>2]|0;g=h+4|0;b=c[g>>2]|0;if(b>>>0>=(c[h+8>>2]|0)>>>0){iA(h,1)|0;b=c[g>>2]|0}c[g>>2]=b+1;a[b>>0]=d;c[j>>2]=f;i2(i,67118,j)|0;kA(h,i)|0;b=0;while(1){if((b|0)>=(f|0))break;i=e+(b<<4)|0;c[j>>2]=c[i>>2];c[j+4>>2]=c[i+4>>2];c[j+8>>2]=c[i+8>>2];c[j+12>>2]=c[i+12>>2];Zb(h,j);b=b+1|0}l=k;return}function Zb(a,b){a=a|0;b=b|0;var c=0,d=0;c=l;l=l+1024|0;d=c;_b(d,+h[b>>3]);kA(a,d)|0;_b(d,+tL(+h[b+8>>3]));kA(a,d)|0;l=c;return}function _b(a,b){a=a|0;b=+b;var c=0,d=0;c=l;l=l+16|0;d=c;h[d>>3]=b>-1.0e-08&b<1.0e-08?0.0:b;i2(a,67123,d)|0;$b(a,1);l=c;return}function $b(b,c){b=b|0;c=c|0;var d=0,e=0,f=0;d=F3(b,46)|0;e=(c|0)!=0;if(!d){if(e){d=b+(D3(b)|0)|0;f=10}}else{while(1){c=d+1|0;if(!(a[c>>0]|0))break;else d=c}a:while(1){switch(a[d>>0]|0){case 46:{f=5;break a}case 48:break;default:{f=6;break a}}a[d>>0]=0;d=d+-1|0}if((f|0)==5)a[d>>0]=0;else if((f|0)==6)d=d+1|0;if(e)f=10}if((f|0)==10){a[d>>0]=32;a[d+1>>0]=0}return}function ac(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+32|0;i=j+16|0;h=j;e=a[b+3>>0]|0;f=d[b>>0]|0;g=d[b+1>>0]|0;b=d[b+2>>0]|0;if(e<<24>>24==-1){c[h>>2]=f;c[h+4>>2]=g;c[h+8>>2]=b;i2(194038,75986,h)|0}else{c[i>>2]=f;c[i+4>>2]=g;c[i+8>>2]=b;c[i+12>>2]=e&255;i2(194038,67136,i)|0}l=j;return}function bc(a,b,d){a=a|0;b=b|0;d=d|0;cc(c[11456+(c[(c[a+16>>2]|0)+12>>2]<<2)>>2]|0,b,d);return}function cc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=l;l=l+1040|0;h=f;g=f+8|0;i=D3(e)|0;c[h>>2]=d;c[h+4>>2]=i;i2(g,67129,h)|0;kA(b,g)|0;kA(b,e)|0;e=b+4|0;d=c[e>>2]|0;if(d>>>0>=(c[b+8>>2]|0)>>>0){iA(b,1)|0;d=c[e>>2]|0}c[e>>2]=d+1;a[d>>0]=32;l=f;return}function dc(b,d,f,i){b=b|0;d=d|0;f=f|0;i=i|0;var j=0.0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=l;l=l+1120|0;s=w+64|0;v=w+80|0;k=w+32|0;q=w+16|0;r=w;t=c[b+16>>2]|0;j=+(c[t+136>>2]|0)*3.141592653589793/180.0;if((e[(c[46732]|0)+8232>>1]|0)<14)ec(b);else{hA(v,1024,w+96|0);u=(d|0)==2;if(u){nQ(f,k,i,j,2);f=v+4|0;d=c[f>>2]|0;if(d>>>0>=(c[v+8>>2]|0)>>>0){iA(v,1)|0;d=c[f>>2]|0}c[f>>2]=d+1;a[d>>0]=91;c[s>>2]=c[k>>2];c[s+4>>2]=c[k+4>>2];c[s+8>>2]=c[k+8>>2];c[s+12>>2]=c[k+12>>2];Zb(v,s);r=k+16|0;c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];Zb(v,s)}else{nQ(f,k,i,0.0,3);p=+h[k+24>>3];n=+h[k>>3];m=+h[k+8>>3];o=p*.25;if(j==0.0){h[q>>3]=n;j=m}else{h[q>>3]=n+o*+I(+j);j=m+o*+J(+j)}h[q+8>>3]=j;h[r>>3]=n;h[r+8>>3]=m;f=v+4|0;d=c[f>>2]|0;if(d>>>0>=(c[v+8>>2]|0)>>>0){iA(v,1)|0;d=c[f>>2]|0}c[f>>2]=d+1;a[d>>0]=40;c[s>>2]=c[q>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[s+12>>2]=c[q+12>>2];Zb(v,s);fc(v,o);c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];Zb(v,s);fc(v,p)}kA(v,67179)|0;f=t+140|0;j=+g[f>>2];i=t+56|0;d=t+96|0;if(j>0.0){gc(v,j,i);gc(v,+g[f>>2],d)}else{gc(v,0.0,i);gc(v,1.0,d)}mA(v)|0;k=v+4|0;d=c[k>>2]|0;i=v+8|0;f=d>>>0>=(c[i>>2]|0)>>>0;if(u){if(f){iA(v,1)|0;d=c[k>>2]|0}c[k>>2]=d+1;a[d>>0]=93}else{if(f){iA(v,1)|0;d=c[k>>2]|0}c[k>>2]=d+1;a[d>>0]=41}d=c[k>>2]|0;if(d>>>0>=(c[i>>2]|0)>>>0){iA(v,1)|0;d=c[k>>2]|0}a[d>>0]=0;u=c[v>>2]|0;c[k>>2]=u;bc(b,67176,u);lA(v)}l=w;return}function ec(a){a=a|0;ac((c[a+16>>2]|0)+56|0);bc(a,67176,194038);return}function fc(a,b){a=a|0;b=+b;var c=0,d=0;c=l;l=l+1024|0;d=c;_b(d,b);kA(a,d)|0;l=c;return}function gc(a,b,c){a=a|0;b=+b;c=c|0;var d=0,e=0,f=0;d=l;l=l+1040|0;f=d;e=d+8|0;h[f>>3]=b;i2(e,94469,f)|0;$b(e,1);ac(c);cc(a,e,194038);l=d;return}function hc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0;e=l;l=l+1040|0;i=e;f=e+16|0;g=c[11456+(c[(c[a+16>>2]|0)+12>>2]<<2)>>2]|0;kA(g,67285)|0;c[i>>2]=c[d>>2];c[i+4>>2]=c[d+4>>2];c[i+8>>2]=c[d+8>>2];c[i+12>>2]=c[d+12>>2];Zb(g,i);_b(f,+h[d+16>>3]-+h[d>>3]);kA(g,f)|0;_b(f,+h[d+24>>3]-+h[d+8>>3]);kA(g,f)|0;bc(a,195341,c[b+8>>2]|0);l=e;return}function ic(a){a=a|0;var b=0;switch(c[a+64>>2]|0){case 0:{b=yF(c[a>>2]|0)|0;mG(b,c[(c[a+16>>2]|0)+8>>2]|0,68069,0)|0;zF(b);break}case 1:{HL(c[(c[a>>2]|0)+168>>2]|0);break}default:{}}return}function jc(b){b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+16|0;d=f;e=c[(c[b+16>>2]|0)+8>>2]|0;if(!(c[46745]|0)){c[46745]=c[4689];c[46746]=57;c[46747]=19}c[(c[e+64>>2]|0)+8>>2]=186980;kc(e,1);c[d>>2]=0;a[d+4>>0]=(a[(c[e+16>>2]|0)+115>>0]|0)==1&1;g=c[b+64>>2]|0;a[d+5>>0]=((g|0)==0|(g|0)==3)&1;a[d+6>>0]=0;lc(e,b,1,d);l=f;return}function kc(a,b){a=a|0;b=b|0;var d=0;c[a>>2]=c[a>>2]&-9;d=MD(a)|0;while(1){if(!d)break;kc(d,0);d=ND(d)|0}a:do if(b|0){b=gC(a)|0;while(1){if(!b)break a;c[b>>2]=c[b>>2]&-9;d=UA(a,b)|0;while(1){if(!d)break;c[d>>2]=c[d>>2]&-9;d=WA(a,d)|0}b=hC(a,b)|0}}while(0);return}function lc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;p=q+8|0;o=q;n=(d|0)!=0;if(n){m=Sz(11876,c[4591]|0)|0;WC(a,1,141363,12,0);WC(a,2,141363,12,0);WC(a,0,141363,-12,0);f=mc(a,0,m)|0;j=gC(a)|0;i=0;g=0;while(1){if(!j)break;if(!(h2(HB(j)|0,108307,7)|0)){k=g;g=nc(m,HB(j)|0)|0}else{k=g+1|0;g=g+f|0}c[(PC(j,141363,0)|0)+8>>2]=g;h=UA(a,j)|0;g=i;while(1){if(!h)break;c[(PC(h,141363,0)|0)+8>>2]=g;h=WA(a,h)|0;g=g+1|0}j=hC(a,j)|0;i=g;g=k}Oz(m)|0}else f=0;m=c[e>>2]|0;c[e>>2]=m+1;oc(b,m);mF(b,97675)|0;pc(a,b,d,e);qc(a,b,e);mF(b,97646)|0;oc(b,c[e>>2]|0);if(n){c[o>>2]=f;sF(b,67288,o)}else{c[p>>2]=c[(PC(a,141363,0)|0)+8>>2];sF(b,67308,p)}sc(a,b,d,rc(a,b,d,e)|0,e);tc(a,b,d,e);mF(b,153748)|0;p=(c[e>>2]|0)+-1|0;c[e>>2]=p;oc(b,p);if(n)mF(b,111309)|0;else mF(b,75629)|0;l=q;return}function mc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if((vC(a)|0)!=(a|0)){e=b+1|0;c[(PC(a,141363,0)|0)+8>>2]=b;if(!(h2(HB(a)|0,108307,7)|0)){b=HB(a)|0;Fc(d,b,c[(PC(a,141363,0)|0)+8>>2]|0);b=e}else b=e}e=MD(a)|0;while(1){if(!e)break;a=mc(e,b,d)|0;e=ND(e)|0;b=a}return b|0}function nc(a,b){a=a|0;b=b|0;a=eb[c[a>>2]&63](a,b,512)|0;if(!a)a=-1;else a=c[a+12>>2]|0;return a|0}function oc(a,b){a=a|0;b=b|0;while(1){if((b|0)<=0)break;mF(a,90875)|0;b=b+-1|0}return}function pc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;h=l;l=l+32|0;g=h+16|0;f=h+8|0;i=h;j=HB(a)|0;oc(b,c[e>>2]|0);c[i>>2]=wc(j,e)|0;sF(b,67396,i);if(d|0){mF(b,97646)|0;oc(b,c[e>>2]|0);j=(uB(a)|0)!=0;c[f>>2]=j?107953:137609;sF(b,68010,f);oc(b,c[e>>2]|0);j=(wB(a)|0)!=0;c[g>>2]=j?107953:137609;sF(b,68027,g)}l=h;return}function qc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;n=o+8|0;m=o;i=vC(b)|0;j=c[b>>2]&3;f=IA(i,j,0)|0;a:do if(f|0){k=e+5|0;while(1){if(!f)break a;g=OA(b,f)|0;do if(g|0){h=f+8|0;if(!(a[g>>0]|0)){g=c[h>>2]|0;if((a[g>>0]|0)!=108)break;if(f2(g,108525)|0)break}mF(d,97646)|0;oc(d,c[e>>2]|0);c[m>>2]=wc(c[h>>2]|0,e)|0;sF(d,67446,m);if(a[k>>0]|0?yc(c[h>>2]|0)|0:0){zc(OA(b,f)|0,d,e);break}c[n>>2]=wc(OA(b,f)|0,e)|0;sF(d,67453,n)}while(0);f=IA(i,j,f)|0}}while(0);l=o;return}function rc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;h=i;f=MD(a)|0;if(f){mF(b,97646)|0;g=c[e>>2]|0;c[e>>2]=g+1;oc(b,g);g=(d|0)!=0;if(g){mF(b,67370)|0;a=0;d=f}else{mF(b,67430)|0;oc(b,c[e>>2]|0);a=0;d=f}while(1){if(!d)break;if(!a)a=1;else mF(b,97646)|0;if(g)xc(d,b,e);else{c[h>>2]=c[(PC(d,141363,0)|0)+8>>2];sF(b,137696,h)}d=ND(d)|0}if(g)a=1;else{c[e>>2]=(c[e>>2]|0)+-1;mF(b,153748)|0;oc(b,c[e>>2]|0);mF(b,97641)|0;a=1}}else a=0;l=i;return a|0}function sc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=gC(a)|0;e=(e|0)!=0;if(!g){if((d|0)!=0&e){c[f>>2]=(c[f>>2]|0)+-1;mF(b,153748)|0;oc(b,c[f>>2]|0);mF(b,97641)|0}}else{mF(b,97646)|0;h=(d|0)!=0;if(h)if(e)e=0;else{e=c[f>>2]|0;c[f>>2]=e+1;oc(b,e);mF(b,67370)|0;e=0}else{e=c[f>>2]|0;c[f>>2]=e+1;oc(b,e);mF(b,67384)|0;oc(b,c[f>>2]|0);e=0}while(1){if(!g)break;if(h2(HB(g)|0,108307,7)|0){do if(e)if(h){mF(b,97646)|0;break}else{mF(b,101300)|0;break}else e=1;while(0);vc(g,b,d,f)}g=hC(a,g)|0}c[f>>2]=(c[f>>2]|0)+-1;mF(b,153748)|0;oc(b,c[f>>2]|0);mF(b,97641)|0}return}function tc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=gC(a)|0;a:do if(f|0){while(1){if(!f)break a;if(UA(a,f)|0)break;f=hC(a,f)|0}mF(b,97646)|0;i=c[e>>2]|0;c[e>>2]=i+1;oc(b,i);mF(b,67320)|0;i=(d|0)!=0;if(i)g=0;else{oc(b,c[e>>2]|0);g=0}while(1){if(!f)break;h=UA(a,f)|0;while(1){if(!h)break;do if(g)if(i){mF(b,97646)|0;break}else{mF(b,101300)|0;break}else g=1;while(0);uc(h,b,d,e);h=WA(a,h)|0}f=hC(a,f)|0}c[e>>2]=(c[e>>2]|0)+-1;mF(b,153748)|0;oc(b,c[e>>2]|0);mF(b,97641)|0}while(0);return}function uc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;j=l;l=l+32|0;i=j+24|0;h=j+16|0;g=j+8|0;f=j;if(!d){c[i>>2]=c[(PC(a,141363,0)|0)+8>>2];sF(b,137696,i)}else{i=c[e>>2]|0;c[e>>2]=i+1;oc(b,i);mF(b,97675)|0;oc(b,c[e>>2]|0);c[f>>2]=c[(PC(a,141363,0)|0)+8>>2];sF(b,67332,f);oc(b,c[e>>2]|0);c[g>>2]=c[(PC(c[((c[a>>2]&3|0)==3?a:a+48|0)+40>>2]|0,141363,0)|0)+8>>2];sF(b,67346,g);oc(b,c[e>>2]|0);c[h>>2]=c[(PC(c[((c[a>>2]&3|0)==2?a:a+-48|0)+40>>2]|0,141363,0)|0)+8>>2];sF(b,67359,h);qc(a,b,e);mF(b,153748)|0;i=(c[e>>2]|0)+-1|0;c[e>>2]=i;oc(b,i);mF(b,75629)|0}l=j;return}function vc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+32|0;h=i+16|0;g=i+8|0;f=i;if(!d){c[h>>2]=c[(PC(a,141363,0)|0)+8>>2];sF(b,137696,h)}else{h=c[e>>2]|0;c[e>>2]=h+1;oc(b,h);mF(b,97675)|0;oc(b,c[e>>2]|0);c[f>>2]=c[(PC(a,141363,0)|0)+8>>2];sF(b,67332,f);oc(b,c[e>>2]|0);c[g>>2]=wc(HB(a)|0,e)|0;sF(b,67396,g);qc(a,b,e);mF(b,153748)|0;h=(c[e>>2]|0)+-1|0;c[e>>2]=h;oc(b,h);mF(b,75629)|0}l=i;return}function wc(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;g=d+4|0;if(a[g>>0]|0)b=cQ(b)|0;if(!(c[46748]|0)){hA(186992,1024,0);e=b}else e=b;a:while(1){f=a[e>>0]|0;switch(f<<24>>24){case 0:break a;case 34:{kA(186992,67409)|0;break}case 92:{kA(186992,96917)|0;break}case 47:{kA(186992,67412)|0;break}case 8:{kA(186992,67415)|0;break}case 12:{kA(186992,67418)|0;break}case 10:{kA(186992,67421)|0;break}case 13:{kA(186992,67424)|0;break}case 9:{kA(186992,67427)|0;break}default:{d=c[46749]|0;if(d>>>0>=(c[46750]|0)>>>0){iA(186992,1)|0;d=c[46749]|0}c[46749]=d+1;a[d>>0]=f}}e=e+1|0}d=c[46749]|0;if(d>>>0>=(c[46750]|0)>>>0){iA(186992,1)|0;d=c[46749]|0}a[d>>0]=0;d=c[46748]|0;c[46749]=d;if(a[g>>0]|0)l6(b);return d|0}function xc(a,b,c){a=a|0;b=b|0;c=c|0;lc(a,b,0,c);a=MD(a)|0;while(1){if(!a)break;mF(b,97646)|0;xc(a,b,c);a=ND(a)|0}return}function yc(b){b=b|0;var c=0;c=b+1|0;a:do if((a[b>>0]|0)==95){b=(a[c>>0]|0)+-100<<24>>24;switch(((b&255)>>>2|b<<6&255)<<24>>24){case 0:{if(!(f2(c,67967)|0)){b=1;break a}break}case 2:{if(!(f2(c,67973)|0)){b=1;break a}break}case 1:{if(!(f2(c,67980)|0)){b=1;break a}b=(f2(c,67994)|0)==0;break a}case 4:{if(!(f2(c,67987)|0)){b=1;break a}b=(f2(c,68002)|0)==0;break a}default:{b=0;break a}}b=0}else b=0;while(0);return b&1|0}function zc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;f=i;do if(b|0?a[b>>0]|0:0){h=BH(b)|0;if(!h){c[f>>2]=b;dA(0,67458,f)|0;break}mF(d,153748)|0;g=c[e>>2]|0;c[e>>2]=g+1;oc(d,g);mF(d,67485)|0;g=h+8|0;b=0;f=0;while(1){if((f|0)>=(c[h>>2]|0))break;if(!b)b=1;else mF(d,97646)|0;Ac((c[g>>2]|0)+(f*80|0)|0,d,e);f=f+1|0}c[e>>2]=(c[e>>2]|0)+-1;mF(d,153748)|0;oc(d,c[e>>2]|0);mF(d,97641)|0;CH(h)}while(0);l=i;return}function Ac(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,D=0.0;A=l;l=l+240|0;y=A+224|0;x=A+216|0;w=A+208|0;v=A+200|0;u=A+192|0;t=A+184|0;s=A+176|0;r=A+152|0;q=A+136|0;p=A+128|0;o=A+112|0;n=A+104|0;m=A+96|0;k=A+88|0;j=A+72|0;i=A+48|0;z=A+40|0;g=A+8|0;f=A;e=c[d>>2]|0;c[d>>2]=e+1;oc(b,e);mF(b,97675)|0;oc(b,c[d>>2]|0);e=c[a>>2]|0;a:do switch(e|0){case 1:case 0:{c[f>>2]=(e|0)==0?69:101;sF(b,67488,f);oc(b,c[d>>2]|0);D=+h[a+16>>3];C=+h[a+24>>3];B=+h[a+32>>3];h[g>>3]=+h[a+8>>3];h[g+8>>3]=D;h[g+16>>3]=C;h[g+24>>3]=B;sF(b,67501,g);break}case 3:case 2:{c[z>>2]=(e|0)==2?80:112;sF(b,67488,z);oc(b,c[d>>2]|0);Bc(b,a+8|0);break}case 5:case 4:{c[i>>2]=(e|0)==4?66:98;sF(b,67488,i);oc(b,c[d>>2]|0);Bc(b,a+8|0);break}case 6:{sF(b,67536,A+56|0);oc(b,c[d>>2]|0);Bc(b,a+8|0);break}case 7:{sF(b,67548,A+64|0);oc(b,c[d>>2]|0);D=+h[a+16>>3];h[j>>3]=+h[a+8>>3];h[j+8>>3]=D;sF(b,67560,j);oc(b,c[d>>2]|0);z=c[a+24>>2]|0;c[k>>2]=(z|0)==0?108:(z|0)==1?99:114;sF(b,67582,k);oc(b,c[d>>2]|0);h[m>>3]=+h[a+32>>3];sF(b,67598,m);oc(b,c[d>>2]|0);c[n>>2]=wc(c[a+40>>2]|0,d)|0;sF(b,67615,n);break}case 9:case 8:{c[o>>2]=(e|0)==8?67:99;sF(b,67488,o);oc(b,c[d>>2]|0);sF(b,67629,A+120|0);oc(b,c[d>>2]|0);c[p>>2]=wc(c[a+8>>2]|0,d)|0;sF(b,67646,p);break}case 13:case 14:{c[q>>2]=(e|0)==13?67:99;sF(b,67488,q);oc(b,c[d>>2]|0);switch(c[a+8>>2]|0){case 0:{sF(b,67629,A+144|0);oc(b,c[d>>2]|0);c[r>>2]=wc(c[a+16>>2]|0,d)|0;sF(b,67646,r);break a}case 1:{sF(b,67661,A+160|0);oc(b,c[d>>2]|0);Cc(b,a+16|0,d);break a}default:{sF(b,67680,A+168|0);oc(b,c[d>>2]|0);Dc(b,a+16|0,d);break a}}}case 10:{sF(b,67699,s);oc(b,c[d>>2]|0);h[t>>3]=+h[a+8>>3];sF(b,67711,t);oc(b,c[d>>2]|0);c[u>>2]=wc(c[a+16>>2]|0,d)|0;sF(b,67727,u);break}case 11:{sF(b,67741,v);oc(b,c[d>>2]|0);c[w>>2]=wc(c[a+8>>2]|0,d)|0;sF(b,67753,w);break}case 15:{sF(b,67768,x);oc(b,c[d>>2]|0);c[y>>2]=c[a+8>>2];sF(b,67780,y);break}default:{}}while(0);z=(c[d>>2]|0)+-1|0;c[d>>2]=z;oc(b,z);mF(b,75629)|0;l=A;return}function Bc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0.0;j=l;l=l+48|0;i=j+32|0;g=j+16|0;f=j+8|0;e=c[b>>2]|0;d=c[b+4>>2]|0;sF(a,67941,j);b=0;while(1){if((b|0)>=(e|0))break;if((b|0)>0)sF(a,101300,f);k=+h[d+(b*24|0)+8>>3];h[g>>3]=+h[d+(b*24|0)>>3];h[g+8>>3]=k;sF(a,67953,g);b=b+1|0}sF(a,67894,i);l=j;return}function Cc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0;e=l;l=l+32|0;f=e+16|0;i=e;oc(a,c[d>>2]|0);g=+h[b+8>>3];h[i>>3]=+h[b>>3];h[i+8>>3]=g;sF(a,67897,i);oc(a,c[d>>2]|0);g=+h[b+24>>3];h[f>>3]=+h[b+16>>3];h[f+8>>3]=g;sF(a,67919,f);oc(a,c[d>>2]|0);Ec(a,c[b+32>>2]|0,c[b+36>>2]|0,d);l=e;return}function Dc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0;e=l;l=l+48|0;f=e+24|0;j=e;oc(a,c[d>>2]|0);g=+h[b+8>>3];i=+h[b+16>>3];h[j>>3]=+h[b>>3];h[j+8>>3]=g;h[j+16>>3]=i;sF(a,67796,j);oc(a,c[d>>2]|0);i=+h[b+32>>3];g=+h[b+40>>3];h[f>>3]=+h[b+24>>3];h[f+8>>3]=i;h[f+16>>3]=g;sF(a,67824,f);oc(a,c[d>>2]|0);Ec(a,c[b+48>>2]|0,c[b+52>>2]|0,d);l=e;return}function Ec(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,i=0,j=0,k=0,m=0,n=0,o=0.0;m=l;l=l+48|0;k=m+32|0;j=m+16|0;i=m+8|0;sF(a,67852,m);f=0;while(1){if((f|0)>=(b|0))break;if((f|0)>0)sF(a,101300,i);o=+g[d+(f<<3)>>2];n=wc(c[d+(f<<3)+4>>2]|0,e)|0;h[j>>3]=o;c[j+8>>2]=n;sF(a,67863,j);f=f+1|0}sF(a,67894,k);l=m;return}function Fc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+16|0;f=g;e=eb[c[a>>2]&63](a,b,512)|0;if(e){if((c[e+12>>2]|0)!=(d|0)){c[f>>2]=b;dA(0,68040,f)|0}}else{f=m6(1,16)|0;c[f+8>>2]=Y3(b)|0;c[f+12>>2]=d;eb[c[a>>2]&63](a,f,1)|0}l=g;return}function Gc(a,b,d){a=a|0;b=b|0;d=d|0;l6(c[b+8>>2]|0);l6(b);return}function Hc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=l;l=l+32|0;d=b+24|0;e=b+16|0;g=b;f=c[a+16>>2]|0;mF(a,68895)|0;j=c[c[a+12>>2]>>2]|0;i=c[j+4>>2]|0;h=c[j+8>>2]|0;c[g>>2]=c[j>>2];c[g+4>>2]=i;c[g+8>>2]=h;sF(a,68905,g);c[e>>2]=HB(c[f+8>>2]|0)|0;sF(a,68940,e);c[d>>2]=S(c[a+168>>2]|0,c[a+164>>2]|0)|0;sF(a,68953,d);mF(a,68966)|0;mF(a,68976)|0;mF(a,68984)|0;mF(a,68992)|0;mF(a,69e3)|0;mF(a,69008)|0;mF(a,69016)|0;mF(a,69020)|0;mF(a,69025)|0;l=b;return}function Ic(a){a=a|0;mF(a,68876)|0;return}function Jc(a){a=a|0;c[46752]=2;return}function Kc(a){a=a|0;c[46752]=1;return}function Lc(a){a=a|0;c[46752]=2;return}function Mc(a){a=a|0;c[46752]=0;return}function Nc(a){a=a|0;c[46752]=2;return}function Oc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0,k=0.0,m=0,n=0,o=0,p=0,q=0.0,r=0.0;p=l;l=l+80|0;o=p;m=c[(c[b+16>>2]|0)+16>>2]|0;n=c[46752]|0;f=c[e+4>>2]|0;g=+h[f+16>>3]*+h[b+352>>3];i=c[b+360>>2]|0?1.5707963267948966:0.0;j=c[e>>2]|0;k=g*2.0/3.0*+((D3(j)|0)>>>0)*.5;f=c[f+8>>2]|0;if(!f)f=-1;else f=c[f+20>>2]|0;e=a[e+48>>0]|0;r=+h[d>>3];q=+h[d+8>>3]+-72.0;j=Yc(j)|0;c[o>>2]=4;c[o+4>>2]=e<<24>>24==108?0:e<<24>>24==114?2:1;c[o+8>>2]=m;c[o+12>>2]=n;c[o+16>>2]=0;c[o+20>>2]=f;h[o+24>>3]=g;h[o+32>>3]=i;c[o+40>>2]=6;h[o+48>>3]=g;h[o+56>>3]=k;c[o+64>>2]=~~(r+(r>=0.0?.5:-.5));c[o+68>>2]=~~(q+(q>=0.0?.5:-.5));c[o+72>>2]=j;sF(b,68821,o);l=p;return}function Pc(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;n=l;l=l+32|0;j=n;i=n+20|0;m=e+32|0;a:do switch(c[m>>2]|0){case 5:{f=0;while(1){g=c[12764+(f<<2)>>2]|0;if((f|0)==8)break a;h=c[e>>2]|0;if((a[g>>0]|0)==(a[h>>0]|0)?(f2(g,h)|0)==0:0){k=10;break a}f=f+1|0}}case 1:{g=e+1|0;h=e+2|0;f=(Xc(i,d[e>>0]|0,d[g>>0]|0,d[h>>0]|0)|0)+32|0;if(!(c[i>>2]|0))k=10;else{o=d[e>>0]|0;i=d[g>>0]|0;k=d[h>>0]|0;c[j>>2]=0;c[j+4>>2]=f;c[j+8>>2]=o;c[j+12>>2]=i;c[j+16>>2]=k;sF(b,68764,j);k=10}break}default:Aa(138697,68161,163,68192)}while(0);if((k|0)==10)c[e>>2]=f;c[m>>2]=6;l=n;return}function Qc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0;e=l;l=l+112|0;f=e+8|0;u=e+104|0;t=e;k=c[a+16>>2]|0;s=~~+h[k+152>>3];r=c[k+16>>2]|0;q=c[k+56>>2]|0;p=c[46752]|0;Vc(k,u,t);n=+h[b>>3];k=~~(n+(n>=0.0?.5:-.5));m=+h[b+8>>3];j=~~(m+(m>=0.0?.5:-.5));i=+h[b+16>>3];n=i-n;g=+h[b+24>>3];m=g-m;b=c[u>>2]|0;o=+h[t>>3];c[f>>2]=1;c[f+4>>2]=1;c[f+8>>2]=b;c[f+12>>2]=s;c[f+16>>2]=r;c[f+20>>2]=q;c[f+24>>2]=p;c[f+28>>2]=0;c[f+32>>2]=d|0?20:-1;h[f+40>>3]=o;c[f+48>>2]=0;h[f+56>>3]=0.0;c[f+64>>2]=k;c[f+68>>2]=j;c[f+72>>2]=~~(n+(n>=0.0?.5:-.5));c[f+76>>2]=~~(m+(m>=0.0?.5:-.5));c[f+80>>2]=k;c[f+84>>2]=j;c[f+88>>2]=~~(i+(i>=0.0?.5:-.5));c[f+92>>2]=~~(g+(g>=0.0?.5:-.5));sF(a,68699,f);l=e;return}function Rc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0.0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;f=l;l=l+96|0;g=f+8|0;o=f+80|0;p=f;q=c[a+16>>2]|0;n=~~+h[q+152>>3];m=c[q+16>>2]|0;k=c[q+56>>2]|0;j=c[46752]|0;Vc(q,o,p);o=c[o>>2]|0;i=+h[p>>3];c[g>>2]=2;c[g+4>>2]=3;c[g+8>>2]=o;c[g+12>>2]=n;c[g+16>>2]=m;c[g+20>>2]=k;c[g+24>>2]=j;c[g+28>>2]=0;c[g+32>>2]=e|0?20:-1;h[g+40>>3]=i;c[g+48>>2]=0;c[g+52>>2]=0;c[g+56>>2]=0;c[g+60>>2]=0;c[g+64>>2]=0;c[g+68>>2]=d+1;sF(a,68603,g);Wc(a,b,d,1);l=f;return}function Sc(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0;C=l;l=l+192|0;B=C+176|0;z=C+168|0;A=C+104|0;y=C+96|0;i=C+88|0;u=C+180|0;v=C+80|0;w=C+16|0;x=C;f=a+16|0;e=c[f>>2]|0;q=~~+h[e+152>>3];r=c[e+16>>2]|0;s=c[46752]|0;if((d|0)<=3)Aa(68154,68161,360,68181);t=k6((d*140|0)+140|0)|0;Vc(e,u,v);if(!g){o=4;j=0;k=-1}else{o=5;j=c[(c[f>>2]|0)+56>>2]|0;k=20}E=+h[b>>3];n=w+48|0;h[n>>3]=E;D=+h[b+8>>3];h[w+56>>3]=D;c[i>>2]=~~(E+(E>=0.0?.5:-.5));c[i+4>>2]=~~(D+(D>=0.0?.5:-.5));m=x+8|0;e=t+(i2(t,81371,i)|0)|0;p=1;g=0;while(1){i=g+3|0;if((i|0)>=(d|0))break;c[w>>2]=c[n>>2];c[w+4>>2]=c[n+4>>2];c[w+8>>2]=c[n+8>>2];c[w+12>>2]=c[n+12>>2];f=1;while(1){if((f|0)==4){f=1;break}F=f+g|0;h[w+(f<<4)>>3]=+h[b+(F<<4)>>3];h[w+(f<<4)+8>>3]=+h[b+(F<<4)+8>>3];f=f+1|0}while(1){if((f|0)==7)break;iP(x,w,3,+(f|0)/6.0,0,0);D=+h[x>>3];E=+h[m>>3];c[y>>2]=~~(D+(D>=0.0?.5:-.5));c[y+4>>2]=~~(E+(E>=0.0?.5:-.5));f=f+1|0;e=e+(i2(e,81371,y)|0)|0}p=p+6|0;g=i}f=c[u>>2]|0;E=+h[v>>3];c[A>>2]=3;c[A+4>>2]=o;c[A+8>>2]=f;c[A+12>>2]=q;c[A+16>>2]=r;c[A+20>>2]=j;c[A+24>>2]=s;c[A+28>>2]=0;c[A+32>>2]=k;h[A+40>>3]=E;c[A+48>>2]=0;c[A+52>>2]=0;c[A+56>>2]=0;c[A+60>>2]=p;sF(a,68654,A);c[z>>2]=t;sF(a,81378,z);l6(t);f=p+-1|0;e=0;while(1){if((e|0)>=(p|0))break;c[B>>2]=((e|0)%(f|0)|0|0)!=0&1;sF(a,81383,B);e=e+1|0}mF(a,153748)|0;l=C;return}function Tc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0,j=0,k=0,m=0,n=0,o=0;e=l;l=l+96|0;f=e+8|0;m=e+80|0;n=e;o=c[a+16>>2]|0;k=~~+h[o+152>>3];j=c[o+16>>2]|0;i=c[46752]|0;Vc(o,m,n);m=c[m>>2]|0;g=+h[n>>3];c[f>>2]=2;c[f+4>>2]=1;c[f+8>>2]=m;c[f+12>>2]=k;c[f+16>>2]=j;c[f+20>>2]=0;c[f+24>>2]=i;c[f+28>>2]=0;c[f+32>>2]=0;h[f+40>>3]=g;c[f+48>>2]=0;c[f+52>>2]=0;c[f+56>>2]=0;c[f+60>>2]=0;c[f+64>>2]=0;c[f+68>>2]=d;sF(a,68603,f);Wc(a,b,d,0);l=e;return}function Uc(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;sF(a,68597,e);l=d;return}function Vc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0;switch(c[a+144>>2]|0){case 1:{e=10.0;a=1;break}case 2:{e=10.0;a=2;break}default:{e=0.0;a=0}}c[b>>2]=a;h[d>>3]=e;return}function Wc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0.0,m=0.0;j=l;l=l+16|0;i=j+8|0;g=j;f=0;while(1){if((f|0)>=(d|0))break;m=+h[b+(f<<4)>>3];k=+h[b+(f<<4)+8>>3];c[g>>2]=~~(m+(m>=0.0?.5:-.5));c[g+4>>2]=~~(k+(k>=0.0?.5:-.5));sF(a,81371,g);f=f+1|0}if(e|0){k=+h[b>>3];m=+h[b+8>>3];c[i>>2]=~~(k+(k>=0.0?.5:-.5));c[i+4>>2]=~~(m+(m>=0.0?.5:-.5));sF(a,81371,i)}mF(a,153748)|0;l=j;return}function Xc(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c[a>>2]=0;m=c[46753]|0;h=195075;g=0;i=-1;while(1){j=190960+(g<<1)|0;k=191472+(g<<1)|0;l=191984+(g<<1)|0;if((g|0)>=(m|0)){n=6;break}o=(b[j>>1]|0)-d|0;k=(b[k>>1]|0)-e|0;j=(b[l>>1]|0)-f|0;j=(S(k,k)|0)+(S(o,o)|0)+(S(j,j)|0)|0;if((j|0)<(h|0))if(!j)break;else{h=j;i=g}g=g+1|0}if((n|0)==6){c[46753]=m+1;if((m|0)==256)g=i;else{b[j>>1]=d;b[k>>1]=e;b[l>>1]=f;c[a>>2]=1}}return g|0}function Yc(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;h=i;d=c[46754]|0;if(!d){c[46755]=64;d=k6(64)|0;c[46754]=d;e=0}else e=0;while(1){g=b+1|0;f=a[b>>0]|0;if(!(f<<24>>24))break;b=c[46755]|0;if((e|0)>(b+-8|0)){d=b<<1;c[46755]=d;d=n6(c[46754]|0,d)|0;c[46754]=d;d=d+e|0}b=d+1|0;if(f<<24>>24<=-1){a[d>>0]=92;c[h>>2]=f&255;i2(b,81496,h)|0;b=g;d=d+4|0;e=e+4|0;continue}if(f<<24>>24==92){a[d>>0]=92;e=e+1|0;d=b}a[d>>0]=f;b=g;d=d+1|0;e=e+1|0}a[d>>0]=0;l=i;return c[46754]|0}function Zc(b){b=b|0;var d=0,e=0,f=0;e=c[b+16>>2]|0;switch(c[b+64>>2]|0){case 0:{mF(b,68492)|0;d=e+208|0;e=c[d>>2]|0;if(e|0?a[e>>0]|0:0){mF(b,68506)|0;mF(b,DK(c[d>>2]|0)|0)|0;mF(b,153748)|0}break}case 1:{d=e+208|0;f=c[d>>2]|0;if(f|0?a[f>>0]|0:0){mF(b,68506)|0;mF(b,DK(c[d>>2]|0)|0)|0;mF(b,102905)|0;mF(b,DK(HB(c[e+8>>2]|0)|0)|0)|0;mF(b,153748)|0}break}case 3:{f=DK(HB(c[e+8>>2]|0)|0)|0;mF(b,68515)|0;mF(b,f)|0;mF(b,68525)|0;mF(b,f)|0;mF(b,68480)|0;break}default:{}}return}function _c(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;d=c[a+16>>2]|0;e=d+264|0;f=d+228|0;g=d+244|0;h=d+208|0;i=d+272|0;b=d+268|0;d=d+212|0;switch(c[a+64>>2]|0){case 2:{ad(a,c[e>>2]|0,c[i>>2]|0,c[b>>2]|0,c[h>>2]|0,c[f>>2]|0,c[g>>2]|0,c[d>>2]|0);break}case 3:{ad(a,c[e>>2]|0,c[i>>2]|0,c[b>>2]|0,c[h>>2]|0,c[f>>2]|0,c[g>>2]|0,c[d>>2]|0);mF(a,68484)|0;break}default:{}}return}function $c(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=c[a+16>>2]|0;ad(a,c[g+264>>2]|0,c[g+272>>2]|0,c[g+268>>2]|0,b,d,e,f);return}function ad(b,d,e,f,g,i,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;k=k|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0;y=l;l=l+128|0;x=y+120|0;u=y+112|0;t=y+96|0;s=y+80|0;r=y+56|0;w=y+48|0;q=y+40|0;v=y+24|0;p=y;a:do if((e|0)!=0&(f|0)!=0){m=f+10|0;if((c[46756]|0)<(f|0)){c[46756]=m;o=n6(c[46757]|0,m<<3)|0;c[46757]=o}else o=c[46757]|0;m=0;while(1){if((m|0)>=(f|0))break;z=+h[e+(m<<4)>>3];c[o+(m<<3)>>2]=~~(z+(z>=0.0?.5:-.5));z=+h[e+(m<<4)+8>>3];c[o+(m<<3)+4>>2]=~~(z+(z>=0.0?.5:-.5));m=m+1|0}n=b+64|0;m=c[n>>2]|0;e=(g|0)!=0;if(e&(m|0)==0){if(!(a[g>>0]|0))break;switch(d|0){case 0:{v=c[o>>2]|0;w=c[o+12>>2]|0;x=c[o+8>>2]|0;f=c[o+4>>2]|0;c[p>>2]=g;c[p+4>>2]=v;c[p+8>>2]=w;c[p+12>>2]=x;c[p+16>>2]=f;sF(b,68226,p);break a}case 1:{w=c[o>>2]|0;x=c[o+4>>2]|0;f=(c[o+8>>2]|0)-w|0;c[v>>2]=g;c[v+4>>2]=w;c[v+8>>2]=x;c[v+12>>2]=f;sF(b,68247,v);break a}case 2:{c[q>>2]=g;sF(b,68267,q);m=0;while(1){if((m|0)>=(f|0))break;v=c[46757]|0;x=c[v+(m<<3)+4>>2]|0;c[w>>2]=c[v+(m<<3)>>2];c[w+4>>2]=x;sF(b,68275,w);m=m+1|0}mF(b,153748)|0;break a}default:Aa(138697,68282,63,68302)}}if(e&(m|0)==1){if(!(a[g>>0]|0))break;if(!d){w=c[o+12>>2]|0;x=c[o+8>>2]|0;f=c[o+4>>2]|0;c[r>>2]=c[o>>2];c[r+4>>2]=w;c[r+8>>2]=x;c[r+12>>2]=f;c[r+16>>2]=g;c[r+20>>2]=i;sF(b,68319,r);break}else Aa(138697,68282,75,68302)}if((m&-2|0)==2){switch(d|0){case 1:{mF(b,68352)|0;break}case 0:{mF(b,68373)|0;break}case 2:{mF(b,68392)|0;break}default:Aa(138697,68282,91,68302)}if(k|0?a[k>>0]|0:0){mF(b,73872)|0;mF(b,GK(k)|0)|0;mF(b,99045)|0}if(e?a[g>>0]|0:0){mF(b,68411)|0;mF(b,GK(g)|0)|0;mF(b,99045)|0}if(j|0?a[j>>0]|0:0){mF(b,74831)|0;mF(b,DK(j)|0)|0;mF(b,99045)|0}if(i|0?a[i>>0]|0:0){mF(b,68419)|0;mF(b,DK(i)|0)|0;mF(b,99045)|0}mF(b,68428)|0;mF(b,68436)|0;b:do switch(d|0){case 1:{f=c[46757]|0;w=c[f>>2]|0;x=c[f+4>>2]|0;f=(c[f+8>>2]|0)-w|0;c[s>>2]=w;c[s+4>>2]=x;c[s+8>>2]=f;sF(b,68446,s);break}case 0:{v=c[46757]|0;w=c[v+12>>2]|0;x=c[v+8>>2]|0;f=c[v+4>>2]|0;c[t>>2]=c[v>>2];c[t+4>>2]=w;c[t+8>>2]=x;c[t+12>>2]=f;sF(b,68455,t);break}case 2:{w=c[46757]|0;m=c[w+4>>2]|0;c[u>>2]=c[w>>2];c[u+4>>2]=m;sF(b,68467,u);m=1;while(1){if((m|0)>=(f|0))break b;v=c[46757]|0;w=c[v+(m<<3)+4>>2]|0;c[x>>2]=c[v+(m<<3)>>2];c[x+4>>2]=w;sF(b,68473,x);m=m+1|0}}default:{}}while(0);if((c[n>>2]|0)==3){mF(b,73696)|0;break}else{mF(b,68480)|0;break}}}while(0);l=y;return}function bd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=l;l=l+32|0;d=b+24|0;e=b+16|0;g=b;f=c[a+16>>2]|0;mF(a,68895)|0;j=c[c[a+12>>2]>>2]|0;i=c[j+4>>2]|0;h=c[j+8>>2]|0;c[g>>2]=c[j>>2];c[g+4>>2]=i;c[g+8>>2]=h;sF(a,68905,g);c[e>>2]=HB(c[f+8>>2]|0)|0;sF(a,68940,e);c[d>>2]=S(c[a+168>>2]|0,c[a+164>>2]|0)|0;sF(a,68953,d);mF(a,68966)|0;mF(a,68976)|0;mF(a,68984)|0;mF(a,68992)|0;mF(a,69e3)|0;mF(a,69008)|0;mF(a,69016)|0;mF(a,69020)|0;mF(a,69025)|0;l=b;return}function cd(a){a=a|0;mF(a,68876)|0;return}function dd(a){a=a|0;c[46758]=2;return}function ed(a){a=a|0;c[46758]=1;return}function fd(a){a=a|0;c[46758]=2;return}function gd(a){a=a|0;c[46758]=0;return}function hd(a){a=a|0;c[46758]=2;return}function id(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0;n=l;l=l+80|0;m=n;j=c[(c[b+16>>2]|0)+16>>2]|0;k=c[46758]|0;f=c[e+4>>2]|0;g=+h[f+16>>3]*+h[b+352>>3];i=c[b+360>>2]|0?1.5707963267948966:0.0;f=c[f+8>>2]|0;if(!f)f=-1;else f=c[f+20>>2]|0;q=a[e+48>>0]|0;p=+h[d>>3];o=+h[d+8>>3];e=sd(c[e>>2]|0)|0;c[m>>2]=4;c[m+4>>2]=q<<24>>24==108?0:q<<24>>24==114?2:1;c[m+8>>2]=j;c[m+12>>2]=k;c[m+16>>2]=0;c[m+20>>2]=f;h[m+24>>3]=g;h[m+32>>3]=i;c[m+40>>2]=4;h[m+48>>3]=0.0;h[m+56>>3]=0.0;c[m+64>>2]=~~(p+(p>=0.0?.5:-.5));c[m+68>>2]=~~(o+(o>=0.0?.5:-.5));c[m+72>>2]=e;sF(b,68821,m);l=n;return}function jd(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;n=l;l=l+32|0;j=n;i=n+20|0;m=e+32|0;a:do switch(c[m>>2]|0){case 5:{f=0;while(1){g=c[12764+(f<<2)>>2]|0;if((f|0)==8)break a;h=c[e>>2]|0;if((a[g>>0]|0)==(a[h>>0]|0)?(f2(g,h)|0)==0:0){k=10;break a}f=f+1|0}}case 1:{g=e+1|0;h=e+2|0;f=(rd(i,d[e>>0]|0,d[g>>0]|0,d[h>>0]|0)|0)+32|0;if(!(c[i>>2]|0))k=10;else{o=d[e>>0]|0;i=d[g>>0]|0;k=d[h>>0]|0;c[j>>2]=0;c[j+4>>2]=f;c[j+8>>2]=o;c[j+12>>2]=i;c[j+16>>2]=k;sF(b,68764,j);k=10}break}case 0:{f=0;k=10;break}default:Aa(138697,68785,168,68804)}while(0);if((k|0)==10)c[e>>2]=f;c[m>>2]=6;l=n;return}function kd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0;e=l;l=l+112|0;f=e+8|0;u=e+104|0;t=e;k=c[a+16>>2]|0;s=~~+h[k+152>>3];r=c[k+16>>2]|0;q=c[k+56>>2]|0;p=c[46758]|0;pd(k,u,t);n=+h[b>>3];k=~~(n+(n>=0.0?.5:-.5));m=+h[b+8>>3];j=~~(m+(m>=0.0?.5:-.5));i=+h[b+16>>3];n=i-n;g=+h[b+24>>3];m=g-m;b=c[u>>2]|0;o=+h[t>>3];c[f>>2]=1;c[f+4>>2]=1;c[f+8>>2]=b;c[f+12>>2]=s;c[f+16>>2]=r;c[f+20>>2]=q;c[f+24>>2]=p;c[f+28>>2]=0;c[f+32>>2]=d|0?20:-1;h[f+40>>3]=o;c[f+48>>2]=0;h[f+56>>3]=0.0;c[f+64>>2]=k;c[f+68>>2]=j;c[f+72>>2]=~~(n+(n>=0.0?.5:-.5));c[f+76>>2]=~~(m+(m>=0.0?.5:-.5));c[f+80>>2]=k;c[f+84>>2]=j;c[f+88>>2]=~~(i+(i>=0.0?.5:-.5));c[f+92>>2]=~~(g+(g>=0.0?.5:-.5));sF(a,68699,f);l=e;return}function ld(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0.0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;f=l;l=l+96|0;g=f+8|0;o=f+80|0;p=f;q=c[a+16>>2]|0;n=~~+h[q+152>>3];m=c[q+16>>2]|0;k=c[q+56>>2]|0;j=c[46758]|0;pd(q,o,p);o=c[o>>2]|0;i=+h[p>>3];c[g>>2]=2;c[g+4>>2]=3;c[g+8>>2]=o;c[g+12>>2]=n;c[g+16>>2]=m;c[g+20>>2]=k;c[g+24>>2]=j;c[g+28>>2]=0;c[g+32>>2]=e|0?20:-1;h[g+40>>3]=i;c[g+48>>2]=0;c[g+52>>2]=0;c[g+56>>2]=0;c[g+60>>2]=0;c[g+64>>2]=0;c[g+68>>2]=d+1;sF(a,68603,g);qd(a,b,d,1);l=f;return}function md(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0;C=l;l=l+192|0;B=C+176|0;z=C+168|0;A=C+104|0;y=C+96|0;f=C+88|0;u=C+180|0;v=C+80|0;w=C+16|0;x=C;e=a+16|0;p=c[e>>2]|0;q=~~+h[p+152>>3];r=c[p+16>>2]|0;s=c[46758]|0;t=k6((d*140|0)+140|0)|0;pd(p,u,v);if(!g){o=4;j=0;k=-1}else{o=5;j=c[(c[e>>2]|0)+56>>2]|0;k=20}E=+h[b>>3];n=w+48|0;h[n>>3]=E;D=+h[b+8>>3];h[w+56>>3]=D;c[f>>2]=~~(E+(E>=0.0?.5:-.5));c[f+4>>2]=~~(D+(D>=0.0?.5:-.5));m=x+8|0;e=t+(i2(t,81371,f)|0)|0;p=1;g=0;while(1){i=g+3|0;if((i|0)>=(d|0))break;c[w>>2]=c[n>>2];c[w+4>>2]=c[n+4>>2];c[w+8>>2]=c[n+8>>2];c[w+12>>2]=c[n+12>>2];f=1;while(1){if((f|0)==4){f=1;break}F=f+g|0;h[w+(f<<4)>>3]=+h[b+(F<<4)>>3];h[w+(f<<4)+8>>3]=+h[b+(F<<4)+8>>3];f=f+1|0}while(1){if((f|0)==7)break;iP(x,w,3,+(f|0)/6.0,0,0);D=+h[x>>3];E=+h[m>>3];c[y>>2]=~~(D+(D>=0.0?.5:-.5));c[y+4>>2]=~~(E+(E>=0.0?.5:-.5));f=f+1|0;e=e+(i2(e,81371,y)|0)|0}p=p+6|0;g=i}f=c[u>>2]|0;E=+h[v>>3];c[A>>2]=3;c[A+4>>2]=o;c[A+8>>2]=f;c[A+12>>2]=q;c[A+16>>2]=r;c[A+20>>2]=j;c[A+24>>2]=s;c[A+28>>2]=0;c[A+32>>2]=k;h[A+40>>3]=E;c[A+48>>2]=0;c[A+52>>2]=0;c[A+56>>2]=0;c[A+60>>2]=p;sF(a,68654,A);c[z>>2]=t;sF(a,81378,z);l6(t);f=p+-1|0;e=0;while(1){if((e|0)>=(p|0))break;c[B>>2]=((e|0)%(f|0)|0|0)!=0&1;sF(a,81383,B);e=e+1|0}mF(a,153748)|0;l=C;return}function nd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0,j=0,k=0,m=0,n=0,o=0;e=l;l=l+96|0;f=e+8|0;m=e+80|0;n=e;o=c[a+16>>2]|0;k=~~+h[o+152>>3];j=c[o+16>>2]|0;i=c[46758]|0;pd(o,m,n);m=c[m>>2]|0;g=+h[n>>3];c[f>>2]=2;c[f+4>>2]=1;c[f+8>>2]=m;c[f+12>>2]=k;c[f+16>>2]=j;c[f+20>>2]=0;c[f+24>>2]=i;c[f+28>>2]=0;c[f+32>>2]=0;h[f+40>>3]=g;c[f+48>>2]=0;c[f+52>>2]=0;c[f+56>>2]=0;c[f+60>>2]=0;c[f+64>>2]=0;c[f+68>>2]=d;sF(a,68603,f);qd(a,b,d,0);l=e;return}function od(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;sF(a,68597,e);l=d;return}function pd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0;switch(c[a+144>>2]|0){case 1:{e=10.0;a=1;break}case 2:{e=10.0;a=2;break}default:{e=0.0;a=0}}c[b>>2]=a;h[d>>3]=e;return}function qd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0.0,m=0.0;j=l;l=l+16|0;i=j+8|0;g=j;f=0;while(1){if((f|0)>=(d|0))break;m=+h[b+(f<<4)>>3];k=+h[b+(f<<4)+8>>3];c[g>>2]=~~(m+(m>=0.0?.5:-.5));c[g+4>>2]=~~(k+(k>=0.0?.5:-.5));sF(a,81371,g);f=f+1|0}if(e|0){k=+h[b>>3];m=+h[b+8>>3];c[i>>2]=~~(k+(k>=0.0?.5:-.5));c[i+4>>2]=~~(m+(m>=0.0?.5:-.5));sF(a,81371,i)}mF(a,153748)|0;l=j;return}function rd(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c[a>>2]=0;m=c[46759]|0;h=195075;g=0;i=-1;while(1){j=192496+(g<<1)|0;k=193008+(g<<1)|0;l=193520+(g<<1)|0;if((g|0)>=(m|0)){n=6;break}o=(b[j>>1]|0)-d|0;k=(b[k>>1]|0)-e|0;j=(b[l>>1]|0)-f|0;j=(S(k,k)|0)+(S(o,o)|0)+(S(j,j)|0)|0;if((j|0)<(h|0))if(!j)break;else{h=j;i=g}g=g+1|0}if((n|0)==6){c[46759]=m+1;if((m|0)==256)g=i;else{b[j>>1]=d;b[k>>1]=e;b[l>>1]=f;c[a>>2]=1}}return g|0}function sd(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;h=i;d=c[46760]|0;if(!d){c[46761]=64;d=k6(64)|0;c[46760]=d;e=0}else e=0;while(1){g=b+1|0;f=a[b>>0]|0;if(!(f<<24>>24))break;b=c[46761]|0;if((e|0)>(b+-8|0)){d=b<<1;c[46761]=d;d=n6(c[46760]|0,d)|0;c[46760]=d;d=d+e|0}b=d+1|0;if(f<<24>>24<=-1){a[d>>0]=92;c[h>>2]=f&255;i2(b,81496,h)|0;b=g;d=d+4|0;e=e+4|0;continue}if(f<<24>>24==92){a[d>>0]=92;e=e+1|0;d=b}a[d>>0]=f;b=g;d=d+1|0;e=e+1|0}a[d>>0]=0;l=i;return c[46760]|0}function td(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;d=l;l=l+16|0;b=d;mF(a,73604)|0;if((c[a+64>>2]|0)==2)mF(a,73619)|0;else mF(a,153748)|0;g=c[c[a+12>>2]>>2]|0;f=c[g+4>>2]|0;e=c[g+8>>2]|0;c[b>>2]=c[g>>2];c[b+4>>2]=f;c[b+8>>2]=e;sF(a,73630,b);l=d;return}function ud(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=l;l=l+32|0;f=g+8|0;e=g;mF(a,73558)|0;b=a+64|0;d=a+12|0;if((c[b>>2]|0)!=2){c[e>>2]=c[(c[d>>2]|0)+28>>2];sF(a,73569,e)}if((c[(c[d>>2]|0)+20>>2]|0)==0?(c[b>>2]|0)!=2:0){b=c[a+476>>2]|0;d=c[a+480>>2]|0;e=c[a+484>>2]|0;c[f>>2]=c[a+472>>2];c[f+4>>2]=b;c[f+8>>2]=d;c[f+12>>2]=e;sF(a,69938,f)}mF(a,73584)|0;mF(a,73597)|0;l=g;return}function vd(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;k=l;l=l+32|0;j=k+24|0;f=k+8|0;i=k;g=c[b+16>>2]|0;a[194048]=0;e=b+12|0;h=g+8|0;if(!(c[(c[e>>2]|0)+28>>2]|0)){c[i>>2]=HB(c[h>>2]|0)|0;sF(b,69869,i);d=b+64|0;if((c[d>>2]|0)==2)mF(b,69902)|0;else mF(b,69884)|0;do if(!(c[(c[e>>2]|0)+20>>2]|0))if((c[d>>2]|0)==2){n=c[b+460>>2]|0;m=c[b+464>>2]|0;d=c[b+468>>2]|0;c[f>>2]=c[b+456>>2];c[f+4>>2]=n;c[f+8>>2]=m;c[f+12>>2]=d;sF(b,69938,f);break}else{mF(b,69914)|0;break}while(0);mF(b,69968)|0;wM(b,c[(c[e>>2]|0)+24>>2]|0,13040);yM(b);d=c[(c[e>>2]|0)+20>>2]|0;if(d|0){c[i>>2]=c[d>>2];c[i+4>>2]=0;wM(b,0,i)}}c[46762]=(a[(c[(c[h>>2]|0)+16>>2]|0)+115>>0]|0)==1?1:-1;if(!(a[194048]|0)){mF(b,69988)|0;a[194048]=1}d=c[g+208>>2]|0;if(d|0){c[j>>2]=zM(d,c[46762]|0)|0;sF(b,70001,j)}l=k;return}function wd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;b=l;l=l+16|0;f=b;c[f>>2]=d;c[f+4>>2]=e;sF(a,69853,f);l=b;return}function xd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0;s=l;l=l+144|0;r=s+128|0;q=s+112|0;p=s+72|0;o=s+56|0;n=s+40|0;m=s+32|0;e=s+24|0;b=s+8|0;d=s;f=c[a+456>>2]|0;j=c[a+460>>2]|0;g=c[a+464>>2]|0;i=c[a+468>>2]|0;k=a+12|0;t=(c[(c[k>>2]|0)+28>>2]|0)+1|0;c[d>>2]=t;c[d+4>>2]=t;sF(a,69480,d);if(!(c[(c[k>>2]|0)+20>>2]|0)){c[b>>2]=f;c[b+4>>2]=j;c[b+8>>2]=g;c[b+12>>2]=i;sF(a,69497,b)}d=a+360|0;c[e>>2]=c[d>>2]|0?69531:69541;sF(a,69550,e);b=a+64|0;if((c[b>>2]|0)==1){c[m>>2]=g;c[m+4>>2]=i;sF(a,69575,m)}m=c[a+200>>2]|0;t=c[a+204>>2]|0;c[n>>2]=c[a+196>>2];c[n+4>>2]=m;c[n+8>>2]=t;sF(a,69614,n);if(!(c[(c[k>>2]|0)+20>>2]|0)){c[o>>2]=f;c[o+4>>2]=j;c[o+8>>2]=g-f;c[o+12>>2]=i-j;sF(a,69634,o)}w=+h[a+496>>3];t=c[d>>2]|0;v=+h[a+504>>3];u=+h[a+512>>3];h[p>>3]=+h[a+488>>3];h[p+8>>3]=w;c[p+16>>2]=t;h[p+24>>3]=v;h[p+32>>3]=u;sF(a,69674,p);if((c[b>>2]|0)==1){if((g|0)>14399|(i|0)>14399){t=c[(c[k>>2]|0)+16>>2]|0;c[q>>2]=g;c[q+4>>2]=i;c[q+8>>2]=14400;lb[t&63](69717,q)}c[r>>2]=f;c[r+4>>2]=j;c[r+8>>2]=g;c[r+12>>2]=i;sF(a,69812,r)}l=s;return}function yd(a){a=a|0;var b=0,d=0,e=0;e=l;l=l+16|0;d=e;b=a+12|0;if(c[(c[b>>2]|0)+20>>2]|0){mF(a,69404)|0;wM(a,0,(c[(c[b>>2]|0)+20>>2]|0)+4|0)}mF(a,69421)|0;mF(a,69448)|0;c[d>>2]=c[(c[b>>2]|0)+28>>2];sF(a,69463,d);l=e;return}function zd(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=HB(c[(c[a+16>>2]|0)+8>>2]|0)|0;sF(a,69397,d);mF(a,69390)|0;l=b;return}function Ad(a){a=a|0;mF(a,84824)|0;return}function Bd(a){a=a|0;mF(a,69390)|0;return}function Cd(a){a=a|0;mF(a,84824)|0;return}function Dd(a){a=a|0;mF(a,69390)|0;return}function Ed(a){a=a|0;mF(a,84824)|0;return}function Fd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;e=l;l=l+16|0;d=e;if(b|0?(g=(c[a+16>>2]|0)+272|0,c[g>>2]|0):0){mF(a,69286)|0;wF(a,c[g>>2]|0,2);mF(a,69297)|0;c[d>>2]=zM(b,c[46762]|0)|0;sF(a,69301,d)}l=e;return}function Gd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+32|0;j=m+8|0;k=m;f=c[b+16>>2]|0;if(!(+h[f+40>>3]<.5)){Nd(b,f+16|0);f=e+4|0;tF(b,+h[(c[f>>2]|0)+16>>3]);c[j>>2]=c[c[f>>2]>>2];sF(b,69245,j);f=zM(c[e>>2]|0,c[46762]|0)|0;i=e+32|0;switch(a[e+48>>0]|0){case 114:{g=+h[i>>3];break}case 108:{g=0.0;break}default:g=+h[i>>3]*.5}h[d>>3]=+h[d>>3]-g;n=d+8|0;h[n>>3]=+h[e+24>>3]+ +h[n>>3];c[j>>2]=c[d>>2];c[j+4>>2]=c[d+4>>2];c[j+8>>2]=c[d+8>>2];c[j+12>>2]=c[d+12>>2];vF(b,j);mF(b,69260)|0;tF(b,+h[i>>3]);c[k>>2]=f;sF(b,69269,k)}l=m;return}function Hd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+32|0;f=g;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];h[f+16>>3]=+h[b+16>>3]-+h[b>>3];h[f+24>>3]=+h[b+24>>3]-+h[b+8>>3];b=a+16|0;if(d|0?(e=c[b>>2]|0,+h[e+80>>3]>.5):0){Nd(a,e+56|0);wF(a,f,2);mF(a,69203)|0}if(+h[(c[b>>2]|0)+40>>3]>.5){Od(a);Nd(a,(c[b>>2]|0)+16|0);wF(a,f,2);mF(a,69223)|0}l=g;return}function Id(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0;j=l;l=l+16|0;i=j;g=a+16|0;if(e|0?(f=c[g>>2]|0,+h[f+80>>3]>.5):0){Nd(a,f+56|0);mF(a,69124)|0;c[i>>2]=c[b>>2];c[i+4>>2]=c[b+4>>2];c[i+8>>2]=c[b+8>>2];c[i+12>>2]=c[b+12>>2];vF(a,i);mF(a,69133)|0;e=1;while(1){if((e|0)>=(d|0))break;f=b+(e<<4)|0;c[i>>2]=c[f>>2];c[i+4>>2]=c[f+4>>2];c[i+8>>2]=c[f+8>>2];c[i+12>>2]=c[f+12>>2];vF(a,i);mF(a,69142)|0;e=e+1|0}mF(a,69169)|0}if(+h[(c[g>>2]|0)+40>>3]>.5){Od(a);Nd(a,(c[g>>2]|0)+16|0);mF(a,69124)|0;c[i>>2]=c[b>>2];c[i+4>>2]=c[b+4>>2];c[i+8>>2]=c[b+8>>2];c[i+12>>2]=c[b+12>>2];vF(a,i);mF(a,69133)|0;e=1;while(1){if((e|0)>=(d|0))break;g=b+(e<<4)|0;c[i>>2]=c[g>>2];c[i+4>>2]=c[g+4>>2];c[i+8>>2]=c[g+8>>2];c[i+12>>2]=c[g+12>>2];vF(a,i);mF(a,69142)|0;e=e+1|0}mF(a,69185)|0}l=j;return}function Jd(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0;k=l;l=l+16|0;f=k;i=a+16|0;if(g|0?(j=c[i>>2]|0,+h[j+80>>3]>.5):0){Nd(a,j+56|0);mF(a,69124)|0;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];vF(a,f);mF(a,69133)|0;e=1;while(1){if((e|0)>=(d|0))break;wF(a,b+(e<<4)|0,3);mF(a,69159)|0;e=e+3|0}mF(a,69169)|0}if(+h[(c[i>>2]|0)+40>>3]>.5){Od(a);Nd(a,(c[i>>2]|0)+16|0);mF(a,69124)|0;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];vF(a,f);mF(a,69133)|0;e=1;while(1){if((e|0)>=(d|0))break;wF(a,b+(e<<4)|0,3);mF(a,69159)|0;e=e+3|0}mF(a,69151)|0}l=k;return}function Kd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0;g=l;l=l+16|0;f=g;e=a+16|0;if(+h[(c[e>>2]|0)+40>>3]>.5){Od(a);Nd(a,(c[e>>2]|0)+16|0);mF(a,69124)|0;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];vF(a,f);mF(a,69133)|0;e=1;while(1){if((e|0)>=(d|0))break;i=b+(e<<4)|0;c[f>>2]=c[i>>2];c[f+4>>2]=c[i+4>>2];c[f+8>>2]=c[i+8>>2];c[f+12>>2]=c[i+12>>2];vF(a,f);mF(a,69142)|0;e=e+1|0}mF(a,69151)|0}l=g;return}function Ld(a,b){a=a|0;b=b|0;mF(a,69121)|0;mF(a,b)|0;mF(a,153748)|0;return}function Md(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+32|0;g=n+16|0;m=n+8|0;k=n;i=a+16|0;if(f|0?(j=c[i>>2]|0,+h[j+80>>3]>.5):0){Nd(a,j+56|0);mF(a,84719)|0;wF(a,d,e);mF(a,102905)|0;c[g>>2]=c[d>>2];c[g+4>>2]=c[d+4>>2];c[g+8>>2]=c[d+8>>2];c[g+12>>2]=c[d+12>>2];vF(a,g);c[k>>2]=e;c[k+4>>2]=b;sF(a,69038,k)}if(+h[(c[i>>2]|0)+40>>3]>.5){Od(a);Nd(a,(c[i>>2]|0)+16|0);mF(a,84719)|0;wF(a,d,e);mF(a,102905)|0;c[g>>2]=c[d>>2];c[g+4>>2]=c[d+4>>2];c[g+8>>2]=c[d+8>>2];c[g+12>>2]=c[d+12>>2];vF(a,g);c[m>>2]=e;c[m+4>>2]=b;sF(a,69054,m)}l=n;return}function Nd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0,i=0.0;f=l;l=l+32|0;e=f;if(b|0){switch(c[(c[a+16>>2]|0)+4>>2]|0){case 1:case 0:{d=111795;break}case 2:{d=111782;break}case 3:{d=111751;break}default:d=69090}i=+h[b+8>>3];g=+h[b+16>>3];h[e>>3]=+h[b>>3];h[e+8>>3]=i;h[e+16>>3]=g;c[e+24>>2]=d;sF(a,69097,e)}l=f;return}function Od(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;k=m+8|0;j=m;g=b+16|0;i=c[g>>2]|0;d=c[i+160>>2]|0;tF(b,+h[i+152>>3]);mF(b,69071)|0;while(1){if(!d)break;i=d+4|0;f=c[d>>2]|0;if(!f)break;if(!(f2(f,111389)|0)){d=i;continue}else e=f;while(1){d=e+1|0;if(!(a[e>>0]|0))break;else e=d}a:while(1){if(!(a[d>>0]|0))break;c[j>>2]=d;sF(b,69086,j);while(1){e=d+1|0;if(!(a[d>>0]|0)){d=e;continue a}else d=e}}if(!(f2(f,134636)|0))h[(c[g>>2]|0)+152>>3]=0.0;c[k>>2]=f;sF(b,96971,k);d=i}l=m;return}function Pd(b){b=b|0;var d=0;mF(b,75110)|0;d=NA(c[(c[b>>2]|0)+168>>2]|0,75166)|0;if(d|0?a[d>>0]|0:0){mF(b,75177)|0;mF(b,d)|0;mF(b,75201)|0}mF(b,75222)|0;mF(b,75270)|0;mF(b,75324)|0;d=b+12|0;mF(b,DK(c[c[c[d>>2]>>2]>>2]|0)|0)|0;mF(b,78453)|0;mF(b,DK(c[(c[c[d>>2]>>2]|0)+4>>2]|0)|0)|0;mF(b,78463)|0;mF(b,DK(c[(c[c[d>>2]>>2]|0)+8>>2]|0)|0)|0;mF(b,75706)|0;mF(b,75730)|0;return}function Qd(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0.0,k=0.0,m=0.0;i=l;l=l+48|0;g=i+16|0;f=i+8|0;e=i;d=c[b+16>>2]|0;mF(b,74945)|0;d=d+8|0;if(a[(HB(c[d>>2]|0)|0)>>0]|0){mF(b,75669)|0;mF(b,DK(HB(c[d>>2]|0)|0)|0)|0}c[e>>2]=S(c[b+168>>2]|0,c[b+164>>2]|0)|0;sF(b,74950,e);e=c[b+452>>2]|0;c[f>>2]=c[b+448>>2];c[f+4>>2]=e;sF(b,74966,f);m=+h[b+392>>3];k=+h[b+400>>3];j=+h[b+408>>3];h[g>>3]=+h[b+384>>3];h[g+8>>3]=m;h[g+16>>3]=k;h[g+24>>3]=j;sF(b,74999,g);mF(b,75030)|0;mF(b,75066)|0;mF(b,76660)|0;l=i;return}function Rd(a){a=a|0;mF(a,74937)|0;return}function Sd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;ne(a,b,0,101811,c[(c[a+16>>2]|0)+8>>2]|0);mF(a,76660)|0;return}function Td(a){a=a|0;mF(a,74785)|0;return}function Ud(b){b=b|0;var d=0,e=0,f=0,g=0;e=l;l=l+16|0;f=e;g=c[b+16>>2]|0;d=g+8|0;ne(b,c[g+212>>2]|0,0,111795,c[d>>2]|0);mF(b,74889)|0;tF(b,+h[b+488>>3]);mF(b,102905)|0;tF(b,+h[b+496>>3]);c[f>>2]=0-(c[b+360>>2]|0);sF(b,74908,f);tF(b,+h[b+504>>3]);mF(b,102905)|0;tF(b,-+h[b+512>>3]);mF(b,74932)|0;if(a[(HB(c[d>>2]|0)|0)>>0]|0){mF(b,74841)|0;mF(b,DK(HB(c[d>>2]|0)|0)|0)|0;mF(b,74849)|0}l=e;return}function Vd(a){a=a|0;mF(a,74785)|0;return}function Wd(a){a=a|0;var b=0,d=0;d=c[a+16>>2]|0;b=d+8|0;ne(a,c[d+212>>2]|0,0,108307,c[b>>2]|0);mF(a,76660)|0;mF(a,74841)|0;mF(a,DK(HB(c[b>>2]|0)|0)|0)|0;mF(a,74849)|0;return}function Xd(a){a=a|0;mF(a,74785)|0;return}function Yd(a){a=a|0;var b=0,d=0,e=0;d=c[a+16>>2]|0;b=c[a+160>>2]|0;if((b|0)>1)b=c[(c[(c[a>>2]|0)+308>>2]|0)+(b<<2)>>2]|0;else b=0;e=d+8|0;ne(a,c[d+212>>2]|0,b,111782,c[e>>2]|0);mF(a,76660)|0;mF(a,74841)|0;mF(a,DK(HB(c[e>>2]|0)|0)|0)|0;mF(a,74849)|0;return}function Zd(a){a=a|0;mF(a,74785)|0;return}function _d(a){a=a|0;var b=0,d=0;d=c[a+16>>2]|0;b=d+8|0;ne(a,c[d+212>>2]|0,0,111751,c[b>>2]|0);mF(a,76660)|0;mF(a,74841)|0;b=CK(102396,c[b>>2]|0)|0;mF(a,DK(b)|0)|0;l6(b);mF(a,74849)|0;return}function $d(a){a=a|0;mF(a,74785)|0;return}function ae(b,c,d,e,f){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;mF(b,74791)|0;if(f|0){mF(b,74794)|0;mF(b,DK(f)|0)|0;mF(b,99045)|0}mF(b,74684)|0;mF(b,76621)|0;if(c|0?a[c>>0]|0:0){mF(b,74802)|0;mF(b,c)|0;mF(b,99045)|0}if(d|0?a[d>>0]|0:0){mF(b,74816)|0;mF(b,EK(d,1)|0)|0;mF(b,99045)|0}if(e|0?a[e>>0]|0:0){mF(b,74831)|0;mF(b,DK(e)|0)|0;mF(b,99045)|0}mF(b,76660)|0;return}function be(a){a=a|0;mF(a,76615)|0;mF(a,74785)|0;return}function ce(e,f,g){e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0;M=l;l=l+176|0;L=M+160|0;K=M+152|0;F=M+136|0;J=M+128|0;E=M+120|0;D=M+112|0;C=M+104|0;B=M+96|0;A=M+88|0;y=M+80|0;w=M+72|0;v=M+64|0;u=M+56|0;t=M+48|0;i=M+40|0;q=M+32|0;s=M+24|0;r=M+16|0;p=M+8|0;o=M;I=c[e+16>>2]|0;mF(e,74316)|0;switch(a[g+48>>0]|0){case 108:{mF(e,74322)|0;break}case 114:{mF(e,74343)|0;break}default:mF(e,74362)|0}H=f+8|0;G=+h[g+24>>3]+ +h[H>>3];h[H>>3]=G;H=I+260|0;if(!(b[H>>1]&512)){mF(e,74384)|0;tF(e,+h[f>>3]);mF(e,74389)|0;tF(e,-G);mF(e,99045)|0}x=g+4|0;f=c[x>>2]|0;n=c[f+8>>2]|0;if(n){f=n+16|0;i=n+8|0;switch(c[(c[(c[(c[e>>2]|0)+168>>2]|0)+16>>2]|0)+244>>2]|0){case 1:{m=n;break}case 2:{m=n+24|0;f=n+32|0;i=n+28|0;break}default:m=n+4|0}j=c[f>>2]|0;f=c[i>>2]|0;k=c[n+12>>2]|0;c[o>>2]=c[m>>2];sF(e,74395,o);i=c[n+24>>2]|0;if(i|0){c[p>>2]=i;sF(e,74412,p)}mF(e,99045)|0;if(f|0){c[r>>2]=f;sF(e,74416,r)}if(k|0){c[s>>2]=k;sF(e,74434,s)}if(!j)j=0;else{c[q>>2]=j;sF(e,74453,q)}}else{c[i>>2]=c[f>>2];sF(e,74470,i);j=0;f=0}i=c[x>>2]|0;if(i|0?(z=c[i+24>>2]|0,z&127|0):0){if(!((f|0)!=0|(z&1|0)==0))sF(e,74488,t);if(!((j|0)!=0|(z&2|0)==0))sF(e,74508,u);if(z&100|0){sF(e,74529,v);if(!(z&4))f=0;else{sF(e,106287,w);f=1}if(z&64){c[y>>2]=f|0?101300:195341;sF(e,74548,y);f=1}if(z&32|0){c[A>>2]=f|0?101300:195341;sF(e,74559,A)}sF(e,99045,B)}if(z&8|0)sF(e,74574,C);if(z&16|0)sF(e,74598,D)}h[E>>3]=+h[(c[x>>2]|0)+16>>3];sF(e,74620,E);f=I+16|0;switch(c[I+48>>2]|0){case 5:{f=c[f>>2]|0;if(C3(f,137615)|0){c[J>>2]=f;sF(e,74638,J)}break}case 1:{E=d[f+1>>0]|0;J=d[f+2>>0]|0;c[F>>2]=d[f>>0];c[F+4>>2]=E;c[F+8>>2]=J;sF(e,74649,F);break}default:Aa(138697,73830,486,74671)}mF(e,74684)|0;if(b[H>>1]&512){c[K>>2]=DK(c[I+212>>2]|0)|0;sF(e,74686,K);mF(e,74735)|0;tF(e,-G);mF(e,74753)|0}mF(e,EK(c[g>>2]|0,1)|0)|0;if(b[H>>1]&512)sF(e,74756,L);mF(e,74776)|0;l=M;return}function de(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;switch(c|0){case 2:{d=ke(a,b,2)|0;break}case 3:{d=le(a)|0;break}default:d=0}mF(a,74280)|0;ie(a,c,d);mF(a,74289)|0;tF(a,+h[b>>3]);mF(a,74295)|0;c=b+8|0;tF(a,-+h[c>>3]);mF(a,74302)|0;tF(a,+h[b+16>>3]-+h[b>>3]);mF(a,74309)|0;tF(a,+h[b+24>>3]-+h[c>>3]);mF(a,73696)|0;return}function ee(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;switch(d|0){case 2:{e=ke(a,b,c)|0;break}case 3:{e=le(a)|0;break}default:e=0}mF(a,74271)|0;ie(a,d,e);mF(a,73686)|0;e=0;while(1){if((e|0)>=(c|0))break;tF(a,+h[b+(e<<4)>>3]);mF(a,101300)|0;tF(a,-+h[b+(e<<4)+8>>3]);mF(a,102905)|0;e=e+1|0}tF(a,+h[b>>3]);mF(a,101300)|0;tF(a,-+h[b+8>>3]);mF(a,73696)|0;return}function fe(a,d,e,f,g,h){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;g=c[a+16>>2]|0;switch(h|0){case 2:{f=ke(a,d,e)|0;break}case 3:{f=le(a)|0;break}default:f=0}mF(a,73866)|0;if(b[g+260>>1]&512){mF(a,73872)|0;mF(a,DK(c[g+212>>2]|0)|0)|0;mF(a,73878)|0}ie(a,h,f);mF(a,73883)|0;me(a,d,e);mF(a,73696)|0;return}function ge(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;mF(a,73676)|0;ie(a,0,0);mF(a,73686)|0;d=0;while(1){if((d|0)>=(c|0))break;tF(a,+h[b+(d<<4)>>3]);mF(a,101300)|0;tF(a,-+h[b+(d<<4)+8>>3]);mF(a,102905)|0;d=d+1|0}mF(a,73696)|0;return}function he(a,b){a=a|0;b=b|0;mF(a,73670)|0;mF(a,DK(b)|0)|0;mF(a,75730)|0;return}function ie(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+96|0;k=q+48|0;p=q+40|0;n=q+32|0;o=q+24|0;j=q+16|0;g=q+8|0;f=q;m=c[b+16>>2]|0;mF(b,73701)|0;a:do switch(d|0){case 2:{c[f>>2]=e;sF(b,73709,f);break}case 3:{c[g>>2]=e;sF(b,73720,g);break}case 0:{mF(b,136010)|0;break}default:{d=m+56|0;f=k;g=d;i=f+40|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(i|0));je(b,k);if((c[m+88>>2]|0)==1){d=a[d+3>>0]|0;switch(d<<24>>24){case -1:case 0:break a;default:{}}h[j>>3]=+(d&255)/255.0;sF(b,73731,j)}}}while(0);mF(b,73750)|0;e=m+16|0;f=k;g=e;i=f+40|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(i|0));je(b,k);d=m+152|0;if(+h[d>>3]!=1.0){mF(b,73761)|0;tF(b,+h[d>>3])}switch(c[m+144>>2]|0){case 1:{c[o>>2]=73801;sF(b,73778,o);break}case 2:{c[n>>2]=73805;sF(b,73778,n);break}default:{}}b:do if((c[m+48>>2]|0)==1){d=a[e+3>>0]|0;switch(d<<24>>24){case -1:case 0:break b;default:{}}h[p>>3]=+(d&255)/255.0;sF(b,73809,p)}while(0);mF(b,99045)|0;l=q;return}function je(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0;g=l;l=l+16|0;f=g;a:do switch(c[e+32>>2]|0){case 5:{mF(b,c[e>>2]|0)|0;break}case 1:if(!(a[e+3>>0]|0)){mF(b,137680)|0;break a}else{i=d[e+1>>0]|0;h=d[e+2>>0]|0;c[f>>2]=d[e>>0];c[f+4>>2]=i;c[f+8>>2]=h;sF(b,75986,f);break a}default:Aa(138697,73830,117,73850)}while(0);l=g;return}function ke(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=l;l=l+112|0;o=t+64|0;r=t+56|0;n=t+48|0;m=t+40|0;i=t+32|0;k=t;q=c[46764]|0;c[46764]=q+1;p=c[b+16>>2]|0;f=+(c[p+136>>2]|0)*3.141592653589793/180.0;c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;c[k+20>>2]=0;c[k+24>>2]=0;c[k+28>>2]=0;nQ(d,k,e,f,0);c[o>>2]=q;sF(b,74103,o);mF(b,74168)|0;tF(b,+h[k>>3]);mF(b,74173)|0;tF(b,+h[k+8>>3]);mF(b,74180)|0;tF(b,+h[k+16>>3]);mF(b,74187)|0;tF(b,+h[k+24>>3]);mF(b,74194)|0;k=p+140|0;f=+g[k>>2];if(f>0.0){h[i>>3]=f+-.001;sF(b,74199,i)}else mF(b,73975)|0;d=p+56|0;e=o;i=d;j=e+40|0;do{c[e>>2]=c[i>>2];e=e+4|0;i=i+4|0}while((e|0)<(j|0));je(b,o);mF(b,74011)|0;a:do if((c[p+88>>2]|0)==1){d=a[d+3>>0]|0;switch(d<<24>>24){case -1:case 0:{s=7;break a}default:{}}h[m>>3]=+(d&255)/255.0;sF(b,99913,m)}else s=7;while(0);if((s|0)==7)mF(b,74026)|0;mF(b,74029)|0;f=+g[k>>2];if(f>0.0){h[n>>3]=f;sF(b,74199,n)}else mF(b,74035)|0;d=p+96|0;e=o;i=d;j=e+40|0;do{c[e>>2]=c[i>>2];e=e+4|0;i=i+4|0}while((e|0)<(j|0));je(b,o);mF(b,74011)|0;b:do if((c[p+128>>2]|0)==1){d=a[d+3>>0]|0;switch(d<<24>>24){case -1:case 0:{s=14;break b}default:{}}h[r>>3]=+(d&255)/255.0;sF(b,99913,r)}else s=14;while(0);if((s|0)==14)mF(b,74026)|0;mF(b,74239)|0;l=t;return q|0}function le(b){b=b|0;var d=0,e=0.0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0;q=l;l=l+64|0;k=q+16|0;o=q+8|0;j=q;n=c[46763]|0;c[46763]=n+1;m=c[b+16>>2]|0;r=+(c[m+136>>2]|0)*3.141592653589793/180.0;e=r;if(r==0.0){f=50;d=50}else{f=~~((+I(+e)+1.0)*50.0);d=~~((1.0-+J(+e))*50.0)}c[k>>2]=n;c[k+4>>2]=f;c[k+8>>2]=d;sF(b,73891,k);mF(b,73975)|0;d=m+56|0;f=k;g=d;i=f+40|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(i|0));je(b,k);mF(b,74011)|0;a:do if((c[m+88>>2]|0)==1){d=a[d+3>>0]|0;switch(d<<24>>24){case -1:case 0:{p=6;break a}default:{}}h[j>>3]=+(d&255)/255.0;sF(b,99913,j)}else p=6;while(0);if((p|0)==6)mF(b,74026)|0;mF(b,74029)|0;mF(b,74035)|0;d=m+96|0;f=k;g=d;i=f+40|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(i|0));je(b,k);mF(b,74011)|0;b:do if((c[m+128>>2]|0)==1){d=a[d+3>>0]|0;switch(d<<24>>24){case -1:case 0:{p=10;break b}default:{}}h[o>>3]=+(d&255)/255.0;sF(b,99913,o)}else p=10;while(0);if((p|0)==10)mF(b,74026)|0;mF(b,74071)|0;l=q;return n|0}function me(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0;i=l;l=l+16|0;g=i;e=77;f=0;while(1){if((f|0)>=(d|0))break;c[g>>2]=e;sF(a,73888,g);tF(a,+h[b+(f<<4)>>3]);mF(a,101300)|0;tF(a,-+h[b+(f<<4)+8>>3]);e=(f|0)==0?67:32;f=f+1|0}l=i;return}function ne(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;j=l;l=l+16|0;i=j+8|0;h=j;mF(b,74859)|0;mF(b,DK(d)|0)|0;if(e|0){c[h>>2]=DK(e)|0;sF(b,74867,h)}c[i>>2]=f;sF(b,74871,i);d=NA(g,74883)|0;if(d|0?a[d>>0]|0:0){mF(b,102905)|0;mF(b,DK(d)|0)|0}mF(b,99045)|0;l=j;return}function oe(a){a=a|0;var b=0;mF(a,75690)|0;b=a+12|0;mF(a,ye(c[c[c[b>>2]>>2]>>2]|0)|0)|0;mF(a,78453)|0;mF(a,ye(c[(c[c[b>>2]>>2]|0)+4>>2]|0)|0)|0;mF(a,78463)|0;mF(a,ye(c[(c[c[b>>2]>>2]|0)+8>>2]|0)|0)|0;mF(a,75706)|0;return}function pe(b){b=b|0;var d=0,e=0,f=0;f=l;l=l+16|0;e=f;d=c[b+16>>2]|0;mF(b,75667)|0;d=d+8|0;if(a[(HB(c[d>>2]|0)|0)>>0]|0){mF(b,75669)|0;mF(b,ye(HB(c[d>>2]|0)|0)|0)|0}c[e>>2]=S(c[b+168>>2]|0,c[b+164>>2]|0)|0;sF(b,75678,e);c[46765]=0;l=f;return}function qe(a){a=a|0;c[46765]=1;return}function re(a){a=a|0;c[46765]=-1;return}function se(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+48|0;i=n+8|0;m=n;f=c[b+16>>2]|0;if(c[f+144>>2]|0?(k=e+4|0,j=~~(+h[(c[k>>2]|0)+16>>3]*+h[b+352>>3]),j|0):0){ze(b);mF(b,75606)|0;g=d+8|0;h[g>>3]=+h[g>>3]-+(j|0)*.55;c[i>>2]=c[d>>2];c[i+4>>2]=c[d+4>>2];c[i+8>>2]=c[d+8>>2];c[i+12>>2]=c[d+12>>2];vF(b,i);mF(b,75620)|0;mF(b,c[e>>2]|0)|0;mF(b,75629)|0;mF(b,75427)|0;g=i;d=f+16|0;f=g+40|0;do{c[g>>2]=c[d>>2];g=g+4|0;d=d+4|0}while((g|0)<(f|0));Ae(b,i);mF(b,75631)|0;i=c[k>>2]|0;k=c[i+8>>2]|0;k=c[((k|0)==0?i:k+4|0)>>2]|0;mF(b,99045)|0;mF(b,k)|0;mF(b,99045)|0;c[m>>2]=j;sF(b,75640,m);switch(a[e+48>>0]|0){case 108:{mF(b,75645)|0;break}case 114:{mF(b,75656)|0;break}default:{}}Be(b);mF(b,153748)|0}l=n;return}function te(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0.0,m=0.0,n=0.0;j=l;l=l+48|0;f=j;g=c[a+16>>2]|0;i=g+144|0;if(c[i>>2]|0){n=+h[b>>3];e=b+8|0;m=+h[e>>3];k=+h[b+24>>3]-m;h[b>>3]=n-(+h[b+16>>3]-n);h[e>>3]=m-k;ze(a);mF(a,75592)|0;wF(a,b,2);mF(a,75427)|0;do if(!d)if(!(c[46765]|0)){mF(a,97610)|0;break}else{mF(a,137499)|0;break}else{b=f;d=g+56|0;e=b+40|0;do{c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}while((b|0)<(e|0));Ae(a,f)}while(0);if((c[46765]|0)==1)c[46765]=0;mF(a,75538)|0;tF(a,+h[g+152>>3]);mF(a,75581)|0;b=f;d=g+16|0;e=b+40|0;do{c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}while((b|0)<(e|0));Ae(a,f);b=c[i>>2]|0;if((b|0)==1){mF(a,75435)|0;b=c[i>>2]|0}if((b|0)==2)mF(a,75444)|0;Be(a);mF(a,153748)|0}l=j;return}function ue(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0;j=l;l=l+48|0;f=j;g=c[a+16>>2]|0;i=g+144|0;if(c[i>>2]|0){ze(a);mF(a,75564)|0;wF(a,b,d);mF(a,75427)|0;do if(!e)if(!(c[46765]|0)){mF(a,97610)|0;break}else{mF(a,137499)|0;break}else{b=f;d=g+56|0;e=b+40|0;do{c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}while((b|0)<(e|0));Ae(a,f)}while(0);if((c[46765]|0)==1)c[46765]=0;mF(a,75538)|0;tF(a,+h[g+152>>3]);mF(a,75581)|0;b=f;d=g+16|0;e=b+40|0;do{c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}while((b|0)<(e|0));Ae(a,f);b=c[i>>2]|0;if((b|0)==1){mF(a,75435)|0;b=c[i>>2]|0}if((b|0)==2)mF(a,75444)|0;Be(a);mF(a,153748)|0}l=j;return}function ve(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0;m=l;l=l+48|0;i=m;j=c[a+16>>2]|0;k=j+144|0;if(c[k>>2]|0){ze(a);mF(a,75413)|0;wF(a,b,d);mF(a,75427)|0;e=i;f=j+16|0;g=e+40|0;do{c[e>>2]=c[f>>2];e=e+4|0;f=f+4|0}while((e|0)<(g|0));Ae(a,i);mF(a,75538)|0;tF(a,+h[j+152>>3]);e=c[k>>2]|0;if((e|0)==1){mF(a,75435)|0;e=c[k>>2]|0}if((e|0)==2)mF(a,75444)|0;mF(a,75547)|0;Be(a);mF(a,153748)|0}l=m;return}function we(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+48|0;g=i;e=c[a+16>>2]|0;h=e+144|0;if(c[h>>2]|0){ze(a);mF(a,75413)|0;wF(a,b,d);mF(a,75427)|0;f=g;b=e+16|0;d=f+40|0;do{c[f>>2]=c[b>>2];f=f+4|0;b=b+4|0}while((f|0)<(d|0));Ae(a,g);b=c[h>>2]|0;if((b|0)==1){mF(a,75435)|0;b=c[h>>2]|0}if((b|0)==2)mF(a,75444)|0;Be(a);mF(a,153748)|0}l=i;return}function xe(a,b){a=a|0;b=b|0;mF(a,75410)|0;mF(a,ye(b)|0)|0;mF(a,153748)|0;return}function ye(a){a=a|0;return a|0}function ze(b){b=b|0;if(!(a[b+144>>0]|0))mF(b,75535)|0;else mF(b,c[b+148>>2]|0)|0;return}function Ae(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0;g=l;l=l+16|0;f=g;a:do switch(c[e+32>>2]|0){case 5:{mF(b,c[e>>2]|0)|0;break}case 1:if(!(a[e+3>>0]|0)){mF(b,97610)|0;break a}else{i=d[e+1>>0]|0;h=d[e+2>>0]|0;c[f>>2]=d[e>>0];c[f+4>>2]=i;c[f+8>>2]=h;sF(b,75986,f);break a}default:Aa(138697,75453,49,75517)}while(0);l=g;return}function Be(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;g=l;l=l+16|0;f=g;h=c[a+16>>2]|0;e=h+8|0;switch(c[h+12>>2]|0){case 8:{b=1;d=111782;break}case 10:{b=0;d=111782;break}case 3:case 2:case 9:{b=1;d=111751;break}case 7:case 6:case 11:{b=0;d=111751;break}case 0:{b=1;d=111795;break}case 4:{b=0;d=75489;break}case 1:{b=1;d=111795;break}case 5:{b=0;d=111795;break}default:Aa(138697,75453,106,75472)}h=c[(c[e>>2]|0)+8>>2]|0;c[f>>2]=b;c[f+4>>2]=d;c[f+8>>2]=h;sF(a,75501,f);l=g;return}function Ce(a){a=a|0;var b=0;mF(a,78425)|0;mF(a,78433)|0;b=a+12|0;mF(a,Ne(c[c[c[b>>2]>>2]>>2]|0)|0)|0;mF(a,78453)|0;mF(a,Ne(c[(c[c[b>>2]>>2]|0)+4>>2]|0)|0)|0;mF(a,78463)|0;mF(a,Ne(c[(c[c[b>>2]>>2]|0)+8>>2]|0)|0)|0;mF(a,78466)|0;return}function De(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0;j=l;l=l+32|0;i=j+24|0;g=j+16|0;f=j+8|0;e=j;d=c[b+16>>2]|0;c[46769]=~~(+h[b+232>>3]-+h[b+216>>3]);c[46768]=~~(+h[b+224>>3]-+h[b+208>>3]);mF(b,77112)|0;mF(b,77119)|0;d=HB(c[d+8>>2]|0)|0;if(a[d>>0]|0){mF(b,77188)|0;mF(b,Ne(d)|0)|0;mF(b,77196)|0}c[e>>2]=S(c[b+168>>2]|0,c[b+164>>2]|0)|0;sF(b,77205,e);mF(b,77225)|0;mF(b,77260)|0;mF(b,77288)|0;mF(b,77294)|0;mF(b,77337)|0;mF(b,77378)|0;mF(b,77397)|0;mF(b,77414)|0;mF(b,77462)|0;mF(b,77515)|0;mF(b,77591)|0;mF(b,77667)|0;mF(b,77676)|0;mF(b,77699)|0;mF(b,77726)|0;mF(b,77779)|0;mF(b,77801)|0;mF(b,77846)|0;mF(b,77858)|0;mF(b,77868)|0;mF(b,77894)|0;mF(b,77779)|0;mF(b,77946)|0;mF(b,77846)|0;mF(b,77858)|0;mF(b,77990)|0;mF(b,77699)|0;mF(b,77726)|0;mF(b,77779)|0;mF(b,77946)|0;mF(b,77846)|0;mF(b,77858)|0;mF(b,77868)|0;mF(b,77894)|0;mF(b,77779)|0;mF(b,77801)|0;mF(b,77846)|0;mF(b,77858)|0;mF(b,78003)|0;mF(b,78011)|0;mF(b,78017)|0;mF(b,78031)|0;mF(b,78039)|0;mF(b,78072)|0;e=(c[46769]|0)+10|0;c[f>>2]=c[46768];c[f+4>>2]=e;sF(b,78149,f);mF(b,78179)|0;mF(b,78188)|0;mF(b,78246)|0;mF(b,78256)|0;mF(b,78321)|0;f=c[46769]|0;c[g>>2]=c[46768];c[g+4>>2]=f;sF(b,78358,g);g=c[46769]|0;c[i>>2]=c[46768];c[i+4>>2]=g;sF(b,78386,i);l=j;return}function Ee(a){a=a|0;mF(a,76663)|0;mF(a,76675)|0;mF(a,76683)|0;mF(a,76746)|0;mF(a,76675)|0;mF(a,76791)|0;mF(a,76840)|0;mF(a,76894)|0;mF(a,76675)|0;mF(a,76994)|0;mF(a,77043)|0;mF(a,76675)|0;mF(a,77095)|0;return}function Fe(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;j=l;l=l+32|0;i=j+16|0;h=j+8|0;g=j;mF(b,76621)|0;if(d|0?a[d>>0]|0:0){c[g>>2]=Ne(d)|0;sF(b,76624,g)}if(e|0?a[e>>0]|0:0){c[h>>2]=Ne(e)|0;sF(b,76635,h)}if(f|0?a[f>>0]|0:0){c[i>>2]=Ne(f)|0;sF(b,76647,i)}mF(b,76660)|0;l=j;return}function Ge(a){a=a|0;mF(a,76615)|0;return}function He(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,D=0.0;A=l;l=l+112|0;y=A+96|0;z=A+88|0;w=A+80|0;q=A+72|0;v=A+64|0;t=A+56|0;s=A+48|0;r=A+40|0;p=A+24|0;o=A+8|0;n=A;x=c[b+16>>2]|0;m=+h[f+32>>3];switch(a[f+48>>0]|0){case 108:{j=+h[e>>3];break}case 114:{j=+h[e>>3]-m;break}default:j=+h[e>>3]-m*.5}g=f+40|0;i=+h[g>>3];u=f+4|0;k=+h[(c[u>>2]|0)+16>>3];if(i>3]=i}D=j+-8.0;B=+((c[46769]|0)>>>0)-+h[e+8>>3];C=k/5.0+(k<12.0?1.4:2.0);k=C+(B-i);sF(b,76277,n);h[o>>3]=D;h[o+8>>3]=k;sF(b,76214,o);h[p>>3]=m+j+8.0-D;h[p+8>>3]=C+B-k;sF(b,76238,p);mF(b,76312)|0;mF(b,76346)|0;g=c[u>>2]|0;e=c[g+8>>2]|0;if(e){c[r>>2]=c[e+4>>2];sF(b,76436,r);g=c[e+8>>2]|0;if(g|0){c[s>>2]=g;sF(b,76455,s)}g=c[e+12>>2]|0;if(g|0){c[t>>2]=g;sF(b,76472,t)}g=c[e+16>>2]|0;if(g|0){c[v>>2]=g;sF(b,76490,v)}}else{c[q>>2]=c[g>>2];sF(b,76436,q)}h[w>>3]=+h[(c[u>>2]|0)+16>>3];sF(b,76506,w);g=x+16|0;switch(c[x+48>>2]|0){case 5:{g=c[g>>2]|0;if(C3(g,137615)|0){c[z>>2]=g;sF(b,76526,z)}break}case 1:{x=d[g+1>>0]|0;z=d[g+2>>0]|0;c[y>>2]=d[g>>0];c[y+4>>2]=x;c[y+8>>2]=z;sF(b,76536,y);break}default:Aa(138697,76e3,438,76557)}mF(b,76570)|0;mF(b,Ne(c[f>>2]|0)|0)|0;mF(b,76581)|0;mF(b,76604)|0;l=A;return}function Ie(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0,k=0.0,m=0.0;e=l;l=l+32|0;f=e+16|0;j=e;mF(a,76178)|0;m=+h[b>>3];i=+h[b+16>>3]-m;k=+h[b+8>>3];g=+h[b+24>>3]-k;k=+((c[46769]|0)>>>0)-(k+g);h[j>>3]=m-i;h[j+8>>3]=k;sF(a,76214,j);h[f>>3]=i*2.0;h[f+8>>3]=g*2.0;sF(a,76238,f);Re(a,d);mF(a,76060)|0;Pe(a);mF(a,76266)|0;l=e;return}function Je(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0,i=0.0,j=0,k=0,m=0,n=0;m=l;l=l+48|0;k=m+24|0;j=m+8|0;g=m;mF(a,75783)|0;n=c[46769]|0;c[g>>2]=c[46768];c[g+4>>2]=n;sF(a,76036,g);Re(a,e);mF(a,76060)|0;Pe(a);mF(a,76063)|0;g=d+-1|0;e=0;while(1){if((e|0)>=(d|0))break;i=+h[b+(e<<4)>>3];f=+((c[46769]|0)>>>0)-+h[b+(e<<4)+8>>3];if(!e){mF(a,76090)|0;h[j>>3]=i;h[j+8>>3]=f;sF(a,76156,j);mF(a,76167)|0}else{h[k>>3]=i;h[k+8>>3]=f;sF(a,76156,k)}if((e|0)==(g|0))mF(a,76170)|0;e=e+1|0}mF(a,75899)|0;l=m;return}function Ke(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;f=l;l=l+16|0;e=f;mF(a,75783)|0;h=c[46769]|0;c[e>>2]=c[46768];c[e+4>>2]=h;sF(a,76036,e);Re(a,g);mF(a,76060)|0;Pe(a);mF(a,76063)|0;Se(a,b,d);mF(a,76076)|0;l=f;return}function Le(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0.0;k=l;l=l+48|0;j=k+24|0;i=k+8|0;f=k;mF(a,75783)|0;g=c[46769]|0;c[f>>2]=c[46768];c[f+4>>2]=g;sF(a,75820,f);mF(a,75860)|0;f=d+-1|0;g=b+8|0;e=0;while(1){if((e|0)>=(d|0))break;if(!e){mF(a,75872)|0;m=+((c[46769]|0)>>>0)-+h[g>>3];h[i>>3]=+h[b>>3];h[i+8>>3]=m;sF(a,75876,i);mF(a,75887)|0}else{m=+((c[46769]|0)>>>0)-+h[b+(e<<4)+8>>3];h[j>>3]=+h[b+(e<<4)>>3];h[j+8>>3]=m;sF(a,75876,j)}if((e|0)==(f|0))mF(a,75891)|0;e=e+1|0}mF(a,75895)|0;Pe(a);mF(a,75899)|0;l=k;return}function Me(a,b){a=a|0;b=b|0;mF(a,75718)|0;mF(a,Ne(b)|0)|0;mF(a,75730)|0;return}function Ne(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=l;l=l+16|0;e=u;d=c[46766]|0;if(!d){c[46767]=64;d=IK(64)|0;c[46766]=d}s=e+15|0;r=e+14|0;g=0;q=0;o=0;e=0;f=0;a:while(1){n=(o|0)!=0;m=g;p=b;j=e;k=f;b:while(1){if(!p){t=29;break a}b=a[p>>0]|0;if(!(b<<24>>24)){t=29;break a}e=c[46767]|0;if((q|0)>(e+-8|0)){d=e<<1;c[46767]=d;d=KK(c[46766]|0,d)|0;c[46766]=d;d=d+q|0;e=a[p>>0]|0}else e=b;b=p+1|0;switch(e<<24>>24){case 60:{e=4;f=102454;t=24;break b}case 62:{e=4;f=102437;t=25;break b}case 38:{t=11;break b}case 45:{e=5;f=102448;i=m;break b}default:{}}if(n&e<<24>>24==32){t=13;break}switch(e<<24>>24){case 34:{e=6;f=102411;t=24;break b}case 39:{e=5;f=102442;t=25;break b}default:{}}if(e<<24>>24<0){i=127;f=0}else{e=1;f=p;t=24;break}while(1){g=i&255;h=e&255;if(g>>>0>=h>>>0)break;e=h&i&255;i=g>>>1;f=f+1|0}g=(f|0)>1;j=v6(j|0,k|0,6)|0;k=g?f:m;f=w6(e&255|0,0,(g?0:j)|0,(g?0:D)|0)|0;g=D;m=k+-1|0;if((k|0)>1){p=b;j=f;k=g}else{t=19;break}}if((t|0)==11){t=0;f=(Oe(p)|0)==0;e=f?5:1;f=f?102431:p;i=m}else if((t|0)==13){t=0;f=(a[o>>0]|0)==32;e=f?6:1;f=f?102424:p;i=m}else if((t|0)==19){t=0;a[s>>0]=59;e=3;i=r;j=f;k=g;while(1){f=J6(j|0,k|0,10,0)|0;h=i+-1|0;a[i>>0]=f|48;f=j;j=E6(j|0,k|0,10,0)|0;g=k;k=D;o=e;e=e+1|0;if((o|0)>11){t=21;break a}if(!(g>>>0>0|(g|0)==0&f>>>0>9))break;else i=h}f=i+-2|0;a[h>>0]=35;a[f>>0]=38;i=m}else if((t|0)==24){t=0;i=m}else if((t|0)==25){t=0;i=m}h=d+e|0;g=e;while(1){if(!g)break;a[d>>0]=a[f>>0]|0;g=g+-1|0;f=f+1|0;d=d+1|0}g=i;q=e+q|0;o=p;d=h;e=j;f=k}if((t|0)==21){_3(75736,46,1,c[15715]|0)|0;$a(1)}else if((t|0)==29){a[d>>0]=0;l=u;return c[46766]|0}return 0}function Oe(b){b=b|0;var c=0,d=0;d=b+1|0;c=a[d>>0]|0;a:do if(c<<24>>24==35){d=b+2|0;c=a[d>>0]|0;switch(c<<24>>24){case 88:case 120:break;default:{b=d;while(1){d=b+1|0;if((c+-48&255)>=10)break a;b=d;c=a[d>>0]|0}}}d=b+3|0;while(1){c=a[d>>0]|0;if((c+-48&255)>=10)switch(c<<24>>24){case 65:case 66:case 67:case 68:case 69:case 70:case 97:case 98:case 99:case 100:case 101:case 102:break;default:break a}d=d+1|0}}else while(1){b=d+1|0;if(((c&-33)+-65&255)>=26)break a;d=b;c=a[b>>0]|0}while(0);return c<<24>>24==59|0}function Pe(a){a=a|0;var b=0.0,d=0,e=0,f=0,g=0,i=0,j=0,k=0;k=l;l=l+48|0;d=k+8|0;j=k;i=c[a+16>>2]|0;mF(a,75911)|0;e=d;f=i+16|0;g=e+40|0;do{c[e>>2]=c[f>>2];e=e+4|0;f=f+4|0}while((e|0)<(g|0));Qe(a,d);b=+h[i+152>>3];if(b!=1.0){h[j>>3]=b;sF(a,75929,j)}switch(c[i+144>>2]|0){case 1:{mF(a,75946)|0;break}case 2:{mF(a,75964)|0;break}default:{}}mF(a,75981)|0;l=k;return}function Qe(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0;g=l;l=l+16|0;f=g;a:do switch(c[e+32>>2]|0){case 5:{mF(b,c[e>>2]|0)|0;break}case 1:if(!(a[e+3>>0]|0)){mF(b,136010)|0;break a}else{i=d[e+1>>0]|0;h=d[e+2>>0]|0;c[f>>2]=d[e>>0];c[f+4>>2]=i;c[f+8>>2]=h;sF(b,75986,f);break a}default:Aa(138697,76e3,94,76020)}while(0);l=g;return}function Re(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=l;l=l+48|0;f=g;if(!b)mF(a,76139)|0;else{d=c[a+16>>2]|0;mF(a,76109)|0;b=f;d=d+56|0;e=b+40|0;do{c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}while((b|0)<(e|0));Qe(a,f);mF(a,76136)|0}l=g;return}function Se(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0.0,k=0.0;i=l;l=l+32|0;g=i;e=76090;f=0;while(1){if((f|0)>=(d|0))break;k=+h[b+(f<<4)>>3];j=+((c[46769]|0)>>>0)-+h[b+(f<<4)+8>>3];c[g>>2]=e;h[g+8>>3]=k;h[g+16>>3]=j;sF(a,76093,g);e=(f|0)==0?76106:195341;f=f+1|0}mF(a,99045)|0;l=i;return}function Te(a){a=a|0;var b=0,d=0,e=0;b=l;l=l+16|0;d=b+8|0;e=b;mF(a,80723)|0;mF(a,80738)|0;mF(a,80777)|0;mF(a,80826)|0;c[e>>2]=137615;c[e+4>>2]=80914;sF(a,80895,e);c[d>>2]=137499;c[d+4>>2]=80920;sF(a,80895,d);l=b;return}function Ue(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,g=0.0,i=0.0,j=0;b=l;l=l+64|0;d=b+8|0;j=b;c[j>>2]=HB(c[(c[a+16>>2]|0)+8>>2]|0)|0;sF(a,79676,j);i=+h[a+368>>3]*.5*+h[a+488>>3];g=+h[a+376>>3]*.5*+h[a+496>>3];f=+N(+(i/500.0))*180.0/3.141592653589793*2.0;e=+N(+(g/500.0))*180.0/3.141592653589793*2.0;h[d>>3]=i;h[d+8>>3]=g;h[d+16>>3]=-500.0;h[d+24>>3]=i;h[d+32>>3]=g;h[d+40>>3]=0.0;h[d+48>>3]=(f>e?f:e)*1.2;sF(a,79698,d);mF(a,79845)|0;mF(a,80675)|0;l=b;return}function Ve(a){a=a|0;mF(a,79659)|0;return}function We(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0;f=l;l=l+16|0;h=f;c[h>>2]=b;c[h+4>>2]=d;c[h+8>>2]=e;sF(a,79629,h);g[46770]=+(S(d,-10)|0);l=f;return}function Xe(a){a=a|0;mF(a,79612)|0;return}function Ye(a){a=a|0;mF(a,79594)|0;return}function Ze(a){a=a|0;mF(a,79578)|0;return}function _e(a){a=a|0;mF(a,79557)|0;g[46770]=+g[46770]+-2.0;return}function $e(a){a=a|0;mF(a,79538)|0;return}function af(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=HB(c[(c[a+16>>2]|0)+8>>2]|0)|0;sF(a,79516,d);l=b;return}function bf(a){a=a|0;mF(a,79500)|0;return}function cf(a){a=a|0;mF(a,79482)|0;g[46770]=+g[46770]+-5.0;return}function df(a){a=a|0;mF(a,79466)|0;g[46770]=+g[46770]+5.0;return}function ef(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0;r=l;l=l+144|0;o=r+104|0;q=r+56|0;m=r+32|0;j=r+24|0;i=r;p=e+4|0;n=c[p>>2]|0;f=+h[n+16>>3];n=c[n>>2]|0;c[i>>2]=c[e>>2];h[i+8>>3]=f;c[i+16>>2]=n;sF(b,79312,i);g[46771]=+g[46770]+-9.0;i=e+32|0;switch(a[e+48>>0]|0){case 108:{f=+h[d>>3];break}case 114:{f=+h[d>>3]-+h[i>>3];k=5;break}default:{f=+h[d>>3]-+h[i>>3]*.5;k=5}}if((k|0)==5)h[d>>3]=f;u=+h[b+488>>3];t=(f+ +h[b+504>>3])*u;s=(+h[d+8>>3]+ +h[b+512>>3])*+h[b+496>>3];h[j>>3]=u*+h[(c[p>>2]|0)+16>>3];n=lf(b,79364,j)|0;f=+(c[b+360>>2]|0);h[m>>3]=0.0;h[m+8>>3]=0.0;h[m+16>>3]=f;i=lf(b,78581,m)|0;f=+g[46771];h[o>>3]=t;h[o+8>>3]=s;h[o+16>>3]=f;d=lf(b,78613,o)|0;j=o;k=(c[b+16>>2]|0)+16|0;m=j+40|0;do{c[j>>2]=c[k>>2];j=j+4|0;k=k+4|0}while((j|0)<(m|0));o=mf(b,o,0.0)|0;e=c[e>>2]|0;c[q>>2]=c[c[p>>2]>>2];h[q+8>>3]=.25;h[q+16>>3]=0.0;c[q+24>>2]=e;c[q+28>>2]=79451;c[q+32>>2]=n;c[q+36>>2]=i;c[q+40>>2]=d;c[q+44>>2]=o;q=lf(b,79376,q)|0;mF(b,q)|0;l6(q);l6(i);l6(o);l6(d);l6(n);l=r;return}function ff(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,i=0.0,j=0.0,k=0.0,m=0,n=0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0;z=l;l=l+240|0;x=z+192|0;y=z+152|0;t=z+128|0;r=z+104|0;o=z+80|0;n=z+48|0;e=z+24|0;m=z;mF(a,79189)|0;g[46771]=+g[46770]+-6.0;j=+h[b>>3];i=+h[a+488>>3];p=(j+ +h[a+504>>3])*i;k=+h[b+8>>3];A=+h[a+496>>3];q=(k+ +h[a+512>>3])*A;j=i*(+h[b+16>>3]-j);k=A*(+h[b+24>>3]-k);s=a+16|0;A=j+k;i=+h[(c[s>>2]|0)+152>>3]/A*.5*5.0;h[m>>3]=j;h[m+8>>3]=A*.25;h[m+16>>3]=k;b=lf(a,78549,m)|0;m=a+360|0;A=+(c[m>>2]|0);h[e>>3]=90.0;h[e+8>>3]=0.0;h[e+16>>3]=A;e=lf(a,78581,e)|0;A=+g[46771];h[x>>3]=p;h[x+8>>3]=q;h[x+16>>3]=A;f=lf(a,78613,x)|0;u=x;v=(c[s>>2]|0)+16|0;w=u+40|0;do{c[u>>2]=c[v>>2];u=u+4|0;v=v+4|0}while((u|0)<(w|0));v=mf(a,x,0.0)|0;h[n>>3]=1.0;h[n+8>>3]=i;c[n+16>>2]=b;c[n+20>>2]=e;c[n+24>>2]=f;c[n+28>>2]=v;w=lf(a,79204,n)|0;mF(a,w)|0;l6(b);l6(e);l6(f);l6(v);l6(w);if(d|0){h[o>>3]=j;h[o+8>>3]=k;h[o+16>>3]=1.0;f=lf(a,78549,o)|0;A=+(c[m>>2]|0);h[r>>3]=0.0;h[r+8>>3]=0.0;h[r+16>>3]=A;e=lf(a,78581,r)|0;A=+g[46771];h[t>>3]=p;h[t+8>>3]=q;h[t+16>>3]=A;b=lf(a,78613,t)|0;u=x;v=(c[s>>2]|0)+56|0;w=u+40|0;do{c[u>>2]=c[v>>2];u=u+4|0;v=v+4|0}while((u|0)<(w|0));x=mf(a,x,0.0)|0;h[y>>3]=0.0;h[y+8>>3]=0.0;h[y+16>>3]=0.0;c[y+24>>2]=f;c[y+28>>2]=e;c[y+32>>2]=b;c[y+36>>2]=x;y=lf(a,79250,y)|0;mF(a,y)|0;l6(f);l6(e);l6(b);l6(x);l6(y)}l=z;return}function gf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;N=l;l=l+336|0;E=N+296|0;M=N+288|0;L=N+272|0;K=N+264|0;J=N+240|0;G=N+232|0;D=N+208|0;C=N+184|0;A=N+160|0;z=N+152|0;y=N+136|0;x=N+128|0;w=N+96|0;v=N+88|0;u=N+56|0;f=N+48|0;m=N+24|0;k=N;mF(a,79054)|0;g[46771]=+g[46770]+-2.0;s=a+488|0;t=a+496|0;q=+h[t>>3];h[k>>3]=+h[s>>3];h[k+8>>3]=q;h[k+16>>3]=1.0;k=lf(a,78549,k)|0;B=a+360|0;q=+(c[B>>2]|0);h[m>>3]=0.0;h[m+8>>3]=0.0;h[m+16>>3]=q;m=lf(a,78581,m)|0;q=+g[46771]+-2.0;h[E>>3]=0.0;h[E+8>>3]=0.0;h[E+16>>3]=q;n=lf(a,78613,E)|0;F=a+16|0;i=E;j=(c[F>>2]|0)+16|0;r=i+40|0;do{c[i>>2]=c[j>>2];i=i+4|0;j=j+4|0}while((i|0)<(r|0));j=mf(a,E,0.0)|0;c[f>>2]=78676;c[f+4>>2]=d+1;H=a+512|0;I=a+504|0;i=0;f=lf(a,78645,f)|0;while(1){o=+h[H>>3];p=+h[I>>3];q=+h[(c[F>>2]|0)+152>>3];if((i|0)>=(d|0))break;o=o+ +h[b+(i<<4)+8>>3];h[u>>3]=p+ +h[b+(i<<4)>>3];h[u+8>>3]=o;h[u+16>>3]=0.0;h[u+24>>3]=q;O=lf(a,78690,u)|0;c[v>>2]=f;c[v+4>>2]=O;r=lf(a,78719,v)|0;l6(O);l6(f);i=i+1|0;f=r}o=o+ +h[b+8>>3];h[w>>3]=p+ +h[b>>3];h[w+8>>3]=o;h[w+16>>3]=0.0;h[w+24>>3]=q;w=lf(a,78690,w)|0;c[x>>2]=f;c[x+4>>2]=w;O=lf(a,78719,x)|0;l6(w);l6(f);c[y>>2]=k;c[y+4>>2]=m;c[y+8>>2]=n;c[y+12>>2]=j;y=lf(a,79069,y)|0;c[z>>2]=O;c[z+4>>2]=y;O=lf(a,78774,z)|0;l6(y);mF(a,O)|0;l6(k);l6(m);l6(n);l6(j);l6(O);if(e|0){q=+h[t>>3];h[A>>3]=+h[s>>3];h[A+8>>3]=q;h[A+16>>3]=1.0;n=lf(a,78549,A)|0;q=+(c[B>>2]|0);h[C>>3]=0.0;h[C+8>>3]=0.0;h[C+16>>3]=q;m=lf(a,78581,C)|0;q=+g[46771]+-2.0;h[D>>3]=0.0;h[D+8>>3]=0.0;h[D+16>>3]=q;k=lf(a,78613,D)|0;i=E;j=(c[F>>2]|0)+56|0;r=i+40|0;do{c[i>>2]=c[j>>2];i=i+4|0;j=j+4|0}while((i|0)<(r|0));j=mf(a,E,.25)|0;c[G>>2]=d;i=0;f=lf(a,79114,G)|0;while(1){if((i|0)>=(d|0))break;q=+h[b+(i<<4)+8>>3]+ +h[H>>3];h[J>>3]=+h[b+(i<<4)>>3]+ +h[I>>3];h[J+8>>3]=q;h[J+16>>3]=0.0;G=lf(a,79129,J)|0;c[K>>2]=f;c[K+4>>2]=G;O=lf(a,79151,K)|0;l6(G);l6(f);i=i+1|0;f=O}c[L>>2]=n;c[L+4>>2]=m;c[L+8>>2]=k;c[L+12>>2]=j;L=lf(a,79161,L)|0;c[M>>2]=f;c[M+4>>2]=L;O=lf(a,78774,M)|0;l6(L);mF(a,O)|0;l6(n);l6(m);l6(k);l6(j);l6(O)}l=N;return}function hf(a,b,d,e,f,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0.0;B=l;l=l+208|0;e=B+160|0;A=B+152|0;z=B+136|0;y=B+128|0;x=B+96|0;w=B+88|0;v=B+56|0;k=B+48|0;s=B+24|0;r=B;mF(a,78981)|0;g[46771]=+g[46770]+-4.0;C=+h[a+496>>3];h[r>>3]=+h[a+488>>3];h[r+8>>3]=C;h[r+16>>3]=1.0;r=lf(a,78549,r)|0;C=+(c[a+360>>2]|0);h[s>>3]=0.0;h[s+8>>3]=0.0;h[s+16>>3]=C;s=lf(a,78581,s)|0;C=+g[46771]+-2.0;h[e>>3]=0.0;h[e+8>>3]=0.0;h[e+16>>3]=C;t=lf(a,78613,e)|0;u=a+16|0;f=e;i=(c[u>>2]|0)+56|0;j=f+40|0;do{c[f>>2]=c[i>>2];f=f+4|0;i=i+4|0}while((f|0)<(j|0));n=mf(a,e,0.0)|0;c[k>>2]=78995;c[k+4>>2]=d+2;o=a+504|0;p=a+512|0;q=d+-1|0;m=0;e=lf(a,78645,k)|0;while(1){if((m|0)>=(d|0))break;f=b+(m<<4)|0;i=b+(m<<4)+8|0;D=+h[i>>3]+ +h[p>>3];C=+h[(c[u>>2]|0)+152>>3];h[v>>3]=+h[f>>3]+ +h[o>>3];h[v+8>>3]=D;h[v+16>>3]=0.0;h[v+24>>3]=C;k=lf(a,78690,v)|0;c[w>>2]=e;c[w+4>>2]=k;j=lf(a,78719,w)|0;l6(k);l6(e);if((m|0)==0|(m|0)==(q|0)){C=+h[i>>3]+ +h[p>>3];D=+h[(c[u>>2]|0)+152>>3];h[x>>3]=+h[f>>3]+ +h[o>>3];h[x+8>>3]=C;h[x+16>>3]=0.0;h[x+24>>3]=D;k=lf(a,78690,x)|0;c[y>>2]=j;c[y+4>>2]=k;e=lf(a,78719,y)|0;l6(k);l6(j)}else e=j;m=m+1|0}c[z>>2]=r;c[z+4>>2]=s;c[z+8>>2]=t;c[z+12>>2]=n;b=lf(a,79004,z)|0;c[A>>2]=e;c[A+4>>2]=b;d=lf(a,78774,A)|0;l6(b);mF(a,d)|0;l6(r);l6(s);l6(t);l6(n);l6(d);l=B;return}function jf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0,y=0.0;v=l;l=l+160|0;e=v+120|0;u=v+112|0;t=v+96|0;s=v+88|0;r=v+56|0;m=v+48|0;n=v+24|0;q=v;mF(a,78533)|0;g[46771]=+g[46770]+-6.0;w=+h[a+496>>3];h[q>>3]=+h[a+488>>3];h[q+8>>3]=w;h[q+16>>3]=1.0;q=lf(a,78549,q)|0;w=+(c[a+360>>2]|0);h[n>>3]=0.0;h[n+8>>3]=0.0;h[n+16>>3]=w;n=lf(a,78581,n)|0;w=+g[46771];h[e>>3]=0.0;h[e+8>>3]=0.0;h[e+16>>3]=w;o=lf(a,78613,e)|0;p=a+16|0;f=e;i=(c[p>>2]|0)+16|0;j=f+40|0;do{c[f>>2]=c[i>>2];f=f+4|0;i=i+4|0}while((f|0)<(j|0));i=mf(a,e,0.0)|0;c[m>>2]=78676;c[m+4>>2]=d;j=a+504|0;k=a+512|0;f=0;e=lf(a,78645,m)|0;while(1){if((f|0)>=(d|0))break;y=+h[b+(f<<4)+8>>3]+ +h[k>>3];w=+h[(c[p>>2]|0)+152>>3];h[r>>3]=+h[b+(f<<4)>>3]+ +h[j>>3];h[r+8>>3]=y;h[r+16>>3]=0.0;h[r+24>>3]=w;x=lf(a,78690,r)|0;c[s>>2]=e;c[s+4>>2]=x;m=lf(a,78719,s)|0;l6(x);l6(e);f=f+1|0;e=m}c[t>>2]=q;c[t+4>>2]=n;c[t+8>>2]=o;c[t+12>>2]=i;t=lf(a,78728,t)|0;c[u>>2]=e;c[u+4>>2]=t;x=lf(a,78774,u)|0;l6(t);mF(a,x)|0;l6(q);l6(n);l6(o);l6(i);l6(x);l=v;return}function kf(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;sF(a,78514,e);l=d;return}function lf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+1056|0;h=i;e=i+24|0;f=i+8|0;c[f>>2]=d;g=k2(e,1024,b,f)|0;do if((g|0)>=0)if((g|0)>1023){a=k6(g+1|0)|0;c[f>>2]=d;j2(a,b,f)|0;break}else{a=Y3(e)|0;break}else{a=c[(c[a+12>>2]|0)+16>>2]|0;c[h>>2]=v2(c[(L1()|0)>>2]|0)|0;lb[a&63](78959,h);a=Y3(195341)|0}while(0);l=i;return a|0}function mf(a,b,e){a=a|0;b=b|0;e=+e;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0;q=l;l=l+112|0;o=q+104|0;j=q+96|0;i=q+64|0;m=q+48|0;p=q+32|0;n=q+16|0;k=q;g=c[b+32>>2]|0;a:do switch(g|0){case 5:{f=c[b>>2]|0;if(!(f2(f,136603)|0)){c[k>>2]=78796;h[k+8>>3]=e;f=lf(a,78779,k)|0;break a}if(!(f2(f,133733)|0)){c[n>>2]=78800;h[n+8>>3]=e;f=lf(a,78779,n)|0;break a}if(!(f2(f,131732)|0)){c[p>>2]=78806;h[p+8>>3]=e;f=lf(a,78779,p)|0;break a}else{c[m>>2]=f;h[m+8>>3]=e;f=lf(a,78779,m)|0;break a}}case 1:{s=+(d[b+1>>0]|0)*.00390625;r=+(d[b+2>>0]|0)*.00390625;h[i>>3]=+(d[b>>0]|0)*.00390625;h[i+8>>3]=s;h[i+16>>3]=r;h[i+24>>3]=e;f=lf(a,78811,i)|0;break}default:{p=c[15715]|0;n=c[b>>2]|0;c[j>>2]=g;c[j+4>>2]=n;z4(p,78850,j)|0;Aa(138697,78900,436,78920)}}while(0);c[o>>2]=f;p=lf(a,78937,o)|0;l6(f);l=q;return p|0}function nf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=l;l=l+32|0;d=b+24|0;e=b+16|0;g=b;f=c[a+16>>2]|0;h=c[c[a+12>>2]>>2]|0;j=c[h>>2]|0;i=c[h+4>>2]|0;h=c[h+8>>2]|0;c[g>>2]=81366;c[g+4>>2]=j;c[g+8>>2]=i;c[g+12>>2]=h;sF(a,83976,g);f=HB(c[f+8>>2]|0)|0;c[e>>2]=81366;c[e+4>>2]=f;sF(a,84008,e);c[d>>2]=81366;sF(a,84022,d);l=b;return}function of(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=81366;sF(a,83924,d);l=b;return}function pf(a){a=a|0;var b=0.0,d=0.0,e=0.0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0;W=l;l=l+304|0;V=W+296|0;U=W+288|0;T=W+272|0;R=W+264|0;Q=W+256|0;P=W+248|0;O=W+240|0;N=W+232|0;M=W+224|0;L=W+216|0;K=W+208|0;J=W+200|0;I=W+192|0;G=W+184|0;F=W+176|0;E=W+168|0;D=W+160|0;C=W+152|0;A=W+144|0;z=W+136|0;y=W+128|0;x=W+120|0;w=W+112|0;v=W+104|0;u=W+96|0;t=W+88|0;s=W+80|0;r=W+72|0;q=W+64|0;p=W+56|0;o=W+48|0;S=W+40|0;B=W+24|0;n=W+16|0;m=W;f=c[a+456>>2]|0;g=c[a+460>>2]|0;i=c[a+464>>2]|0;j=c[a+468>>2]|0;k=a+360|0;a:do if(c[4035]|0){switch(c[k>>2]|0){case 90:case 0:break a;default:{}}Bf();c[4035]=0}while(0);e=(+(j|0)-+(g|0))/72.0;b=(+(i|0)-+(f|0))/72.0;k=(c[k>>2]|0)==90;d=k?e:b;e=k?b:e;h[m>>3]=d;h[m+8>>3]=e;sF(a,81553,m);c[n>>2]=81366;sF(a,81568,n);if(d>0.0){b=+V3(d);h[19233]=b;b=b+(3.0-+(~~b|0))}else b=3.0;b=+H(10.0,+b);h[19233]=b;h[B>>3]=b;h[B+8>>3]=b;sF(a,81737,B);c[S>>2]=81366;sF(a,81772,S);c[o>>2]=81366;sF(a,81830,o);c[p>>2]=81366;sF(a,81890,p);c[q>>2]=81366;sF(a,81939,q);c[r>>2]=81366;sF(a,81978,r);c[s>>2]=81366;sF(a,82029,s);c[t>>2]=81366;sF(a,82091,t);c[u>>2]=81366;sF(a,82201,u);c[v>>2]=81366;sF(a,82292,v);c[w>>2]=81366;sF(a,82346,w);c[x>>2]=81366;sF(a,82415,x);sF(a,82451,y);c[z>>2]=81366;sF(a,82576,z);c[A>>2]=81366;sF(a,82605,A);sF(a,82645,C);c[D>>2]=81366;sF(a,82738,D);c[E>>2]=81366;sF(a,82797,E);c[F>>2]=81366;sF(a,82878,F);sF(a,82948,G);c[I>>2]=81366;sF(a,83037,I);c[J>>2]=81366;sF(a,83142,J);c[K>>2]=81366;sF(a,83218,K);c[L>>2]=81366;sF(a,83257,L);c[M>>2]=81366;sF(a,83356,M);c[N>>2]=81366;sF(a,83402,N);sF(a,83491,O);c[P>>2]=81366;sF(a,83532,P);c[Q>>2]=81366;sF(a,83615,Q);c[R>>2]=81366;sF(a,83716,R);h[T>>3]=e;h[T+8>>3]=d;sF(a,83780,T);sF(a,83808,U);sF(a,83816,V);l=W;return}function qf(a){a=a|0;var b=0;b=l;l=l+16|0;sF(a,81546,b);l=b;return}function rf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0.0,k=0,m=0.0,n=0,o=0,p=0,q=0,r=0;q=l;l=l+48|0;p=q+24|0;o=q+8|0;n=q;j=+h[e+32>>3];switch(a[e+48>>0]|0){case 108:{i=+h[d>>3];break}case 114:{g=j;f=4;break}default:{g=j*.5;f=4}}if((f|0)==4){i=+h[d>>3]-g;h[d>>3]=i}k=e+4|0;f=c[k>>2]|0;g=+h[f+16>>3];r=d+8|0;m=+h[r>>3]+g/216.0;h[r>>3]=m;i=j/144.0+i;h[d>>3]=i;f=c[f>>2]|0;do if(f){d=c[46772]|0;if(d|0?(f2(d,f)|0)==0:0)break;c[n>>2]=zf(f)|0;sF(b,81445,n);r=c[k>>2]|0;c[46772]=c[r>>2];g=+h[r+16>>3]}while(0);f=~~g;f=(f|0)>1?f:1;if((f|0)!=(c[46773]|0)){j=+h[19233];c[o>>2]=f;h[o+8>>3]=j;sF(b,81453,o);c[46773]=f}c[p>>2]=Af(c[e>>2]|0)|0;h[p+8>>3]=i;h[p+16>>3]=m;sF(b,81474,p);l=q;return}function sf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0.0,k=0.0;e=l;l=l+48|0;f=e;i=+h[b>>3];k=(+h[b+16>>3]-i)*2.0/72.0;g=+h[b+8>>3];j=(+h[b+24>>3]-g)*2.0/72.0;c[f>>2]=1;c[f+4>>2]=d|0?81387:195341;h[f+8>>3]=k;h[f+16>>3]=j;h[f+24>>3]=i/72.0;h[f+32>>3]=g/72.0;sF(a,81393,f);l=e;return}function tf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=l;l=l+16|0;xf(c[a+16>>2]|0,e+8|0,e);yf(a,b,d,1);l=e;return}function uf(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0;t=l;l=l+128|0;s=t+112|0;q=t+104|0;p=t+96|0;e=t+88|0;n=t+16|0;o=t;k=c[a+16>>2]|0;j=k6((d*140|0)+140|0)|0;xf(k,t+116|0,t+80|0);v=+h[b>>3];k=n+48|0;h[k>>3]=v;u=+h[b+8>>3];h[n+56>>3]=u;c[e>>2]=~~(v+(v>=0.0?.5:-.5));c[e+4>>2]=~~(u+(u>=0.0?.5:-.5));i=o+8|0;e=j+(i2(j,81371,e)|0)|0;r=1;g=0;while(1){m=g+3|0;if((m|0)>=(d|0))break;c[n>>2]=c[k>>2];c[n+4>>2]=c[k+4>>2];c[n+8>>2]=c[k+8>>2];c[n+12>>2]=c[k+12>>2];f=1;while(1){if((f|0)==4){f=1;break}w=f+g|0;h[n+(f<<4)>>3]=+h[b+(w<<4)>>3];h[n+(f<<4)+8>>3]=+h[b+(w<<4)+8>>3];f=f+1|0}while(1){if((f|0)==7)break;iP(o,n,3,+(f|0)/6.0,0,0);u=+h[o>>3];v=+h[i>>3];c[p>>2]=~~(u+(u>=0.0?.5:-.5));c[p+4>>2]=~~(v+(v>=0.0?.5:-.5));f=f+1|0;e=e+(i2(e,81371,p)|0)|0}r=r+6|0;g=m}c[q>>2]=j;sF(a,81378,q);l6(j);f=r+-1|0;e=0;while(1){if((e|0)>=(r|0))break;c[s>>2]=((e|0)%(f|0)|0|0)!=0&1;sF(a,81383,s);e=e+1|0}mF(a,153748)|0;l=t;return}function vf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=l;l=l+16|0;xf(c[a+16>>2]|0,e+8|0,e);yf(a,b,d,0);l=e;return}function wf(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=81366;c[e+4>>2]=b;sF(a,81359,e);l=d;return}function xf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0;switch(c[a+144>>2]|0){case 1:{e=10.0;a=1;break}case 2:{e=10.0;a=2;break}default:{e=0.0;a=0}}c[b>>2]=a;h[d>>3]=e;return}function yf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0.0,m=0.0;j=l;l=l+16|0;i=j+8|0;g=j;f=0;while(1){if((f|0)>=(d|0))break;m=+h[b+(f<<4)>>3];k=+h[b+(f<<4)+8>>3];c[g>>2]=~~(m+(m>=0.0?.5:-.5));c[g+4>>2]=~~(k+(k>=0.0?.5:-.5));sF(a,81371,g);f=f+1|0}if(e|0){k=+h[b>>3];m=+h[b+8>>3];c[i>>2]=~~(k+(k>=0.0?.5:-.5));c[i+4>>2]=~~(m+(m>=0.0?.5:-.5));sF(a,81371,i)}mF(a,153748)|0;l=j;return}function zf(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;h=l;l=l+16|0;f=h;a:while(1){d=15868;while(1){e=c[d+4>>2]|0;if(!e)break;if(!(f2(e,b)|0)){g=6;break a}d=d+8|0}c[f>>2]=81527;c[f+4>>2]=b;dA(1,81501,f)|0;d=I4(b,45)|0;if(!d){d=81544;break}a[d>>0]=0}l=h;return d|0}function Af(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;h=i;d=c[46774]|0;if(!d){c[46775]=64;d=k6(64)|0;c[46774]=d;e=0}else e=0;while(1){g=b+1|0;f=a[b>>0]|0;if(!(f<<24>>24))break;b=c[46775]|0;if((e|0)>(b+-8|0)){d=b<<1;c[46775]=d;d=n6(c[46774]|0,d)|0;c[46774]=d;d=d+e|0}b=d+1|0;if(f<<24>>24<=-1){a[d>>0]=92;c[h>>2]=f&255;i2(b,81496,h)|0;b=g;d=d+4|0;e=e+4|0;continue}if(f<<24>>24==92){a[d>>0]=92;e=e+1|0;d=b}a[d>>0]=f;b=g;d=d+1|0;e=e+1|0}a[d>>0]=0;l=i;return c[46774]|0}function Bf(){var a=0,b=0;a=l;l=l+16|0;b=a;c[b>>2]=81527;c[b+4>>2]=91570;dA(0,83906,b)|0;l=a;return}function Cf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0,k=0;e=l;l=l+32|0;f=e+8|0;j=e;b=b+8|0;k=c[b>>2]|0;c[j>>2]=k;c[j+4>>2]=k;sF(a,84495,j);i=(+h[d+16>>3]+ +h[d>>3])*.5;g=(+h[d+24>>3]+ +h[d+8>>3])*.5;c[f>>2]=c[b>>2];h[f+8>>3]=i;h[f+16>>3]=g;sF(a,84537,f);l=e;return}function Df(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0.0,k=0.0;e=l;l=l+48|0;f=e;i=+h[d>>3];k=+h[d+16>>3]-i;g=+h[d+24>>3];j=g-+h[d+8>>3];g=+(~~(+h[a+232>>3]-+h[a+216>>3])>>>0)-g;c[f>>2]=c[b+8>>2];h[f+8>>3]=k;h[f+16>>3]=j;h[f+24>>3]=i;h[f+32>>3]=g;sF(a,84582,f);mF(a,84674)|0;l=e;return}function Ef(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return}function Ff(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0;t=l;l=l+160|0;s=t+152|0;r=t+136|0;q=t+120|0;k=t+112|0;n=t+104|0;m=t+88|0;j=t+72|0;i=t+64|0;o=t;if(!a)Aa(111583,84679,212,84698);if(!b)Aa(111613,84679,213,84698);p=b+8|0;if(!(c[p>>2]|0))Aa(111616,84679,214,84698);if(c[b+52>>2]|0){c[o>>2]=c[d>>2];c[o+4>>2]=c[d+4>>2];c[o+8>>2]=c[d+8>>2];c[o+12>>2]=c[d+12>>2];b=o+32|0;d=d+16|0;c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];f=+h[o>>3];h[o+16>>3]=f;h[o+24>>3]=+h[o+40>>3];h[o+48>>3]=+h[b>>3];g=+h[o+8>>3];h[o+56>>3]=g;if(e<<24>>24){sF(a,84719,i);b=0;while(1){if((b|0)==4)break;u=+h[o+(b<<4)+8>>3];h[j>>3]=+h[o+(b<<4)>>3];h[j+8>>3]=u;sF(a,84722,j);b=b+1|0}h[m>>3]=f;h[m+8>>3]=g;sF(a,84722,m);m=c[p>>2]|0;c[n>>2]=4;c[n+4>>2]=m;sF(a,84729,n)}sF(a,84719,k);b=0;while(1){if((b|0)==4)break;u=+h[o+(b<<4)+8>>3];h[q>>3]=+h[o+(b<<4)>>3];h[q+8>>3]=u;sF(a,84722,q);b=b+1|0}h[r>>3]=f;h[r+8>>3]=g;sF(a,84722,r);r=c[p>>2]|0;c[s>>2]=4;c[s+4>>2]=r;sF(a,84744,s)}l=t;return}function Gf(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0.0;p=l;l=l+112|0;o=p+24|0;n=p+16|0;m=p;g=p+28|0;if(!b)Aa(111583,84679,153,84760);if(!d)Aa(111613,84679,154,84760);if(!(c[d+8>>2]|0))Aa(111616,84679,155,84760);j=d+52|0;k=d+60|0;if(c[j>>2]|0){f=c[k>>2]|0;if((f|0)==100)i=18;else{db[f&127](d);c[j>>2]=0;c[k>>2]=0;c[d+56>>2]=0;i=10}}else i=10;do if((i|0)==10){if(!((MF(d)|0)<<24>>24))break;f=V5(c[d+20>>2]|0)|0;if((c[d+24>>2]&-2|0)==6){i3(f,g)|0;g=c[g+36>>2]|0;c[d+56>>2]=g;f=K4(0,g,1,1,f,0)|0;c[j>>2]=f;a[d+16>>0]=1}else f=c[j>>2]|0;if(f|0)c[k>>2]=100;NF(d);if(c[j>>2]|0)i=18}while(0);if((i|0)==18){q=+h[e+8>>3]-+(c[d+36>>2]|0);h[m>>3]=+h[e>>3]-+(c[d+32>>2]|0);h[m+8>>3]=q;sF(b,84778,m);if(!(a[d+16>>0]|0)){c[n>>2]=c[d+12>>2];sF(b,84809,n)}else xM(b,d);sF(b,84824,o)}l=p;return}function Hf(a){a=a|0;E3(c[a+52>>2]|0,c[a+56>>2]|0)|0;return}function If(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+80|0;f=g+48|0;if(!a)Aa(111583,84679,121,84834);e=c[a+16>>2]|0;if(!e)Aa(100203,84679,123,84834);if(!b)Aa(111613,84679,124,84834);d=b+8|0;if(!(c[d>>2]|0))Aa(111616,84679,125,84834);if(!(c[e+8>>2]|0))Aa(139182,84679,128,84834);else{sF(a,84854,g);sF(a,84863,g+8|0);sF(a,84890,g+16|0);sF(a,84915,g+24|0);sF(a,84944,g+32|0);sF(a,84972,g+40|0);c[f>>2]=c[d>>2];sF(a,84979,f);sF(a,85018,g+56|0);sF(a,111309,g+64|0);l=g;return}}function Jf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0.0;i=l;l=l+128|0;g=i+80|0;f=i;if(!a)Aa(111583,84679,97,85023);if(!b)Aa(111613,84679,98,85023);e=c[b+8>>2]|0;if(!e)Aa(111616,84679,99,85023);else{m=+h[d>>3];j=~~(m+(m>=0.0?.5:-.5));m=+h[d+8>>3];b=~~(m+(m>=0.0?.5:-.5));m=+h[d+16>>3];k=~~(m+(m>=0.0?.5:-.5));m=+h[d+24>>3];d=~~(m+(m>=0.0?.5:-.5));c[f>>2]=2;c[f+4>>2]=5;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=-1;c[f+24>>2]=1;c[f+28>>2]=-1;c[f+32>>2]=0;h[f+40>>3]=0.0;c[f+48>>2]=0;c[f+52>>2]=0;c[f+56>>2]=0;c[f+60>>2]=0;c[f+64>>2]=0;c[f+68>>2]=5;c[f+72>>2]=0;c[f+76>>2]=e;sF(a,85042,f);c[g>>2]=j;c[g+4>>2]=b;c[g+8>>2]=j;c[g+12>>2]=d;c[g+16>>2]=k;c[g+20>>2]=d;c[g+24>>2]=k;c[g+28>>2]=b;c[g+32>>2]=j;c[g+36>>2]=b;sF(a,85100,g);l=i;return}}function Kf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0,k=0.0,m=0,n=0,o=0,p=0,q=0.0;p=l;l=l+96|0;o=p+56|0;n=p+32|0;m=p;q=+h[d+16>>3];i=+h[d>>3];k=q-i;j=+h[d+24>>3];f=+h[d+8>>3];g=j-f;i=(q+i-k)*.5;if(!a)Aa(111583,84679,53,85132);if(!b)Aa(111613,84679,54,85132);e=b+8|0;if(!(c[e>>2]|0))Aa(111616,84679,55,85132);mF(a,85151)|0;mF(a,c[e>>2]|0)|0;e=a+360|0;f=-((j+f+g)*.5);if(!(c[e>>2]|0)){h[o>>3]=k;h[o+8>>3]=g;h[o+16>>3]=i;h[o+24>>3]=f;sF(a,85280,o)}else{h[m>>3]=g;h[m+8>>3]=k;h[m+16>>3]=i;h[m+24>>3]=f;sF(a,85171,m);c[n>>2]=c[e>>2];h[n+8>>3]=i;h[n+16>>3]=f;sF(a,85250,n)}mF(a,85359)|0;l=p;return}function Lf(a){a=a|0;var b=0,c=0;b=gC(a)|0;while(1){if(!b)break;Mf(b);b=hC(a,b)|0}c=gC(a)|0;while(1){if(!c)break;b=UA(a,c)|0;while(1){if(!b)break;Nf(b);b=WA(a,b)|0}c=hC(a,c)|0}return}function Mf(a){a=a|0;var b=0,d=0;RC(a,137750,304,1)|0;qP(a);oQ(a,c[(c[(uC(a)|0)+16>>2]|0)+116>>2]&1);a=a+16|0;c[(c[a>>2]|0)+176>>2]=0;b=HK(20)|0;d=c[a>>2]|0;c[d+172>>2]=b;c[d+184>>2]=0;d=HK(20)|0;b=c[a>>2]|0;c[b+180>>2]=d;c[b+200>>2]=0;b=HK(12)|0;d=c[a>>2]|0;c[d+196>>2]=b;c[d+192>>2]=0;d=HK(12)|0;b=c[a>>2]|0;c[b+188>>2]=d;c[b+208>>2]=0;b=HK(12)|0;a=c[a>>2]|0;c[a+204>>2]=b;c[a+216>>2]=1;return}function Nf(d){d=d|0;var e=0,f=0,g=0,h=0,i=0;RC(d,137763,176,1)|0;rP(d)|0;h=XO(d,c[47236]|0,1,0)|0;g=d+16|0;c[(c[g>>2]|0)+156>>2]=h;h=_O(c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0,c[47230]|0,195341)|0;i=_O(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0,c[47230]|0,195341)|0;e=c[g>>2]|0;f=e+154|0;b[f>>1]=1;b[e+168>>1]=1;if((h|0)==(i|0)&(a[h>>0]|0)!=0){b[f>>1]=1e3;i=e+156|0;c[i>>2]=(c[i>>2]|0)*100}if(Jk(d)|0){i=c[g>>2]|0;b[i+154>>1]=0;c[i+156>>2]=0}i=(XO(d,c[47256]|0,0,0)|0)&255;a[(c[g>>2]|0)+152>>0]=i;i=(XO(d,c[47237]|0,1,0)|0)&65535;b[(c[g>>2]|0)+170>>1]=i;return}function Of(a){a=a|0;var b=0,d=0;Pf(c[(c[a+16>>2]|0)+192>>2]|0);d=gC(a)|0;while(1){if(!d)break;b=UA(a,d)|0;while(1){if(!b)break;WP(b);b=WA(a,b)|0}Qf(d);d=hC(a,d)|0}Rf(a);return}function Pf(b){b=b|0;var d=0,e=0,f=0,g=0;while(1){if(!b)break;f=b+16|0;g=c[(c[f>>2]|0)+164>>2]|0;Sf(b);d=c[f>>2]|0;if((a[d+156>>0]|0)!=1){b=g;continue}e=c[d+180>>2]|0;if(e){l6(e);d=c[f>>2]|0}e=c[d+172>>2]|0;if(e){l6(e);d=c[f>>2]|0}l6(d);l6(b);b=g}return}function Qf(a){a=a|0;var b=0,d=0,e=0;e=a+16|0;b=c[e>>2]|0;d=c[b+172>>2]|0;if(d){l6(d);b=c[e>>2]|0}d=c[b+180>>2]|0;if(d){l6(d);b=c[e>>2]|0}d=c[b+188>>2]|0;if(d){l6(d);b=c[e>>2]|0}d=c[b+196>>2]|0;if(d){l6(d);b=c[e>>2]|0}d=c[b+204>>2]|0;if(d){l6(d);b=c[e>>2]|0}AK(c[b+104>>2]|0);AK(c[(c[e>>2]|0)+108>>2]|0);b=c[(c[e>>2]|0)+8>>2]|0;if(b|0)db[c[(c[b+4>>2]|0)+4>>2]&127](a);TC(a,137750)|0;return}function Rf(a){a=a|0;var d=0,e=0,f=0,g=0,h=0;d=MD(a)|0;while(1){if(!d)break;Rf(d);d=ND(d)|0}if(RC(a,137786,0,1)|0){g=a+16|0;d=c[g>>2]|0;e=c[d+184>>2]|0;if(e){l6(e);d=c[g>>2]|0}e=c[d+268>>2]|0;if(e){l6(e);d=c[g>>2]|0}e=c[d+216>>2]|0;if(e){l6(e);d=c[g>>2]|0}e=c[d+196>>2]|0;do if(e|0){f=b[d+236>>1]|0;while(1){if((f|0)>(b[d+238>>1]|0))break;l6(c[e+(f<<6)+12>>2]|0);h=c[g>>2]|0;f=f+1|0;d=h;e=c[h+196>>2]|0}if((b[d+236>>1]|0)==-1){l6(e+-64|0);break}else{l6(e);break}}while(0);if((vC(a)|0)!=(a|0)){AK(c[(c[g>>2]|0)+12>>2]|0);TC(a,137786)|0}}return}function Sf(a){a=a|0;var b=0,d=0,e=0;e=a+16|0;d=c[e>>2]|0;b=c[d+176>>2]|0;while(1){a=b+-1|0;if((b|0)<=0)break;b=c[(c[d+172>>2]|0)+(a<<2)>>2]|0;fh(b);l6(c[b+16>>2]|0);l6(b);b=a;d=c[e>>2]|0}b=c[d+184>>2]|0;while(1){a=b+-1|0;if((b|0)<=0)break;b=c[(c[(c[e>>2]|0)+180>>2]|0)+(a<<2)>>2]|0;fh(b);l6(c[b+16>>2]|0);l6(b);b=a}return}function Tf(a){a=a|0;if(qB(a)|0)Uf(a);rM(a);return}function Uf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;h=l;l=l+48|0;g=h+32|0;f=h;b=jH(a,-1,8)|0;d=kH(a,0,f)|0;iH(a,2,8,f)|0;d=(d|0)==0;e=(b|0)<0;if(e&d)Vf(a);else{if(d)c[f+16>>2]=3;else b=e?8:b;c[f+8>>2]=b;c[f+20>>2]=0;e=EG(a,g,0)|0;b=c[g>>2]|0;do if((b|0)==1){Vf(a);b=0}else{if(c[(c[(c[a+16>>2]|0)+8>>2]|0)+84>>2]|0){Vf(a);b=0;break}c[f+12>>2]=1;d=0;while(1){if((d|0)>=(b|0))break;b=c[e+(d<<2)>>2]|0;Wf(b,a);Vf(b);d=d+1|0;b=c[g>>2]|0}Xf(a);hH(c[g>>2]|0,e,a,f)|0;Yf(a);Zf(c[g>>2]|0,e,a);b=0}while(0);while(1){if((b|0)>=(c[g>>2]|0))break;f=e+(b<<2)|0;l6(c[(c[(c[f>>2]|0)+16>>2]|0)+8>>2]|0);Rf(c[f>>2]|0);tC(a,c[f>>2]|0)|0;b=b+1|0}l6(e)}l=h;return}function Vf(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+48|0;k=m+40|0;e=m;i=XO(a,DA(a,0,85374,0)|0,-1,1)|0;mQ(a,10);d=Ik(a,e)|0;$f(a,a);Lf(a);f=(i|0)==1;g=e+32|0;h=(i|0)==2;i=(i|0)==3;j=e+28|0;e=e+24|0;while(1){uj(a,d);if(f){d=3;break}if(c[g>>2]|0){dA(0,85380,k)|0;c[e>>2]=0;d=0}Eh(a,(d|0)!=0&1);if(h){d=7;break}Hi(a,d);if(i){d=9;break}n=(c[j>>2]|0)+-1|0;c[j>>2]=n;if(!((n|0)!=0&(c[e>>2]|0)!=0)){d=11;break}}if((d|0)==3)ag(a,1);else if((d|0)==7)ag(a,2);else if((d|0)==9)ag(a,2);else if((d|0)==11){if(b[(c[a+16>>2]|0)+136>>1]&16)bg(a);ok(a);fg(a);if((bP(NA(a,85471)|0)|0)<<24>>24)il(a)}l=m;return}function Wf(b,d){b=b|0;d=d|0;var e=0,f=0;RC(b,137786,280,1)|0;e=HK(96)|0;b=c[b+16>>2]|0;c[b+8>>2]=e;d=c[d+16>>2]|0;f=c[d+8>>2]|0;h[e>>3]=+h[f>>3];h[e+24>>3]=+h[f+24>>3];c[b+144>>2]=c[d+144>>2];a[b+115>>0]=a[d+115>>0]|0;c[b+116>>2]=c[d+116>>2];c[b+248>>2]=c[d+248>>2];c[b+252>>2]=c[d+252>>2];c[b+244>>2]=c[d+244>>2];return}function Xf(a){a=a|0;var b=0,d=0,e=0;b=HK((qB(a)|0)<<4)|0;d=gC(a)|0;while(1){if(!d)break;e=c[d+16>>2]|0;c[e+132>>2]=b;h[b>>3]=+h[e+16>>3]/72.0;h[b+8>>3]=+h[e+24>>3]/72.0;b=b+16|0;d=hC(a,d)|0}return}function Yf(a){a=a|0;var b=0,d=0,e=0,f=0;e=c[(c[(gC(a)|0)+16>>2]|0)+132>>2]|0;b=e;d=gC(a)|0;while(1){if(!d)break;f=c[d+16>>2]|0;c[f+132>>2]=0;h[f+16>>3]=+h[b>>3]*72.0;h[f+24>>3]=+h[b+8>>3]*72.0;b=b+16|0;d=hC(a,d)|0}l6(e);return}function Zf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=0;f=0;while(1){if((e|0)>=(a|0))break;i=(c[(c[(c[b+(e<<2)>>2]|0)+16>>2]|0)+180>>2]|0)+f|0;e=e+1|0;f=i}i=d+16|0;c[(c[i>>2]|0)+180>>2]=f;g=HK((f<<2)+4|0)|0;c[(c[i>>2]|0)+184>>2]=g;g=0;e=1;while(1){if((g|0)>=(a|0))break;h=(c[b+(g<<2)>>2]|0)+16|0;f=1;while(1){d=c[h>>2]|0;if((f|0)>(c[d+180>>2]|0))break;d=DG(c[(c[d+184>>2]|0)+(f<<2)>>2]|0)|0;c[(c[(c[i>>2]|0)+184>>2]|0)+(e<<2)>>2]=d;_f(c[(c[(c[h>>2]|0)+184>>2]|0)+(f<<2)>>2]|0,d);f=f+1|0;e=e+1|0}g=g+1|0}return}function _f(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;RC(d,137786,280,1)|0;g=d+16|0;d=(c[g>>2]|0)+16|0;f=b+16|0;b=(c[f>>2]|0)+16|0;c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];c[d+16>>2]=c[b+16>>2];c[d+20>>2]=c[b+20>>2];c[d+24>>2]=c[b+24>>2];c[d+28>>2]=c[b+28>>2];b=c[f>>2]|0;d=c[g>>2]|0;a[d+275>>0]=a[b+275>>0]|0;d=d+48|0;b=b+48|0;e=d+64|0;do{c[d>>2]=c[b>>2];d=d+4|0;b=b+4|0}while((d|0)<(e|0));b=c[(c[f>>2]|0)+180>>2]|0;c[(c[g>>2]|0)+180>>2]=b;d=HK((b<<2)+4|0)|0;c[(c[g>>2]|0)+184>>2]=d;d=1;while(1){e=c[f>>2]|0;if((d|0)>(b|0))break;e=DG(c[(c[e+184>>2]|0)+(d<<2)>>2]|0)|0;c[(c[(c[g>>2]|0)+184>>2]|0)+(d<<2)>>2]=e;_f(c[(c[(c[f>>2]|0)+184>>2]|0)+(d<<2)>>2]|0,e);d=d+1|0}f=e+12|0;c[(c[g>>2]|0)+12>>2]=c[f>>2];c[f>>2]=0;return}function $f(a,b){a=a|0;b=b|0;if((vC(a)|0)!=(a|0))RC(a,137786,280,1)|0;if((a|0)==(b|0))c[(c[(vC(a)|0)+16>>2]|0)+188>>2]=a;a=MD(a)|0;while(1){if(!a)break;$f(a,b);a=ND(a)|0}return}function ag(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+1040|0;k=m+8|0;j=m;e=m+16|0;f=DA(a,1,87443,195341)|0;g=DA(a,1,85514,195341)|0;h=(b|0)>0;d=(b|0)==1;b=gC(a)|0;while(1){if(!b)break;if(h?(i=b+16|0,c[j>>2]=c[(c[i>>2]|0)+232>>2],i2(e,137696,j)|0,HA(b,f,e)|0,!d):0){c[k>>2]=c[(c[i>>2]|0)+236>>2];i2(e,137696,k)|0;HA(b,g,e)|0}b=hC(a,b)|0}l=m;return}function bg(a){a=a|0;var b=0,c=0,d=0;c=LD(a,86947,0)|0;if(c|0){b=gC(c)|0;while(1){if(!b)break;d=hC(c,b)|0;nh(a,b);cg(a,b);Qf(b);sC(a,b)|0;b=d}PD(a,c)|0}return}function cg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=c[(c[b+16>>2]|0)+232>>2]|0;i=a+16|0;a=c[(c[i>>2]|0)+196>>2]|0;d=c[a+(j<<6)>>2]|0;h=a+(j<<6)+4|0;g=0;e=0;while(1){if((e|0)>=(d|0)){f=7;break}f=c[(c[h>>2]|0)+(e<<2)>>2]|0;e=e+1|0;if((f|0)==(b|0)){f=4;break}else g=f}if((f|0)==4){while(1){if((e|0)>=(d|0))break;f=c[a+(j<<6)+4>>2]|0;c[f+(e+-1<<2)>>2]=c[f+(e<<2)>>2];f=c[(c[i>>2]|0)+196>>2]|0;e=e+1|0;d=c[f+(j<<6)>>2]|0;a=f;f=4}c[a+(j<<6)>>2]=d+-1}else if((f|0)==7?(g|0)!=(b|0):0)Aa(85480,85487,248,85497);return}function dg(a){a=a|0;return c[(c[(vC(a)|0)+16>>2]|0)+188>>2]|0}function eg(b,c){b=b|0;c=c|0;var d=0;d=a[b+28>>0]|0;if(a[c+28>>0]|0)if(d<<24>>24){d=~~(+h[b>>3]-+h[c>>3]);if(!d)d=~~(+h[b+8>>3]-+h[c+8>>3])}else d=-1;else d=d<<24>>24!=0&1;return d|0}function fg(a){a=a|0;gg(a,1);return}function gg(d,e){d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0;_=l;l=l+656|0;P=_+592|0;O=_+552|0;g=_+544|0;U=_+96|0;V=_;Z=_+632|0;W=d+16|0;Y=b[(c[W>>2]|0)+136>>1]&14;Q=Y&65535;R=U+16|0;c[R>>2]=_+368;S=V+16|0;c[S>>2]=_+192;do if(Y<<16>>16){T=Y<<16>>16==4;f=d+60|0;do if(T){hg(d);if(!(a[(c[(c[f>>2]|0)+16>>2]|0)+113>>0]&1))C=9;else{dA(0,85520,g)|0;C=9}}else if(Y<<16>>16==8){hg(d);if(!(a[(c[(c[f>>2]|0)+16>>2]|0)+113>>0]&1)){pQ(d,0);n=0;m=0;k=0;break}else{ig(d);pQ(d,1);n=0;m=0;k=0;break}}else C=9;while(0);if((C|0)==9){gl(d);if(DM()|0)break;X=HK(96)|0;L=c[(c[W>>2]|0)+248>>2]|0;c[Z+8>>2]=(L|0)/4|0;c[Z+12>>2]=L;q=HK(512)|0;G=Z+4|0;c[G>>2]=0;c[Z>>2]=0;j=c[W>>2]|0;D=b[j+236>>1]|0;E=0;M=0;N=q;F=q;m=q;n=q;p=q;I=0;J=0;a:while(1){if((D|0)>(b[j+238>>1]|0))break;r=c[j+196>>2]|0;i=c[r+(D<<6)>>2]|0;H=i+E|0;g=c[r+(D<<6)+4>>2]|0;f=c[g>>2]|0;if(!f)f=I;else{o=+(I|0);f=c[f+16>>2]|0;z=+h[f+16>>3]-+h[f+88>>3];f=~~(o>2]|0,(K|0)!=0):0){o=+(J|0);g=c[K+16>>2]|0;z=+h[g+16>>3]+ +h[g+96>>3];g=~~(o>z?o:z)}else g=J;B=f+-16|0;A=g+16|0;y=0;u=M;v=N;s=j;w=F;k=m;g=q;f=r;while(1){if((y|0)>=(i|0))break;q=c[(c[f+(D<<6)+4>>2]|0)+(y<<2)>>2]|0;x=q+16|0;f=c[x>>2]|0;i=c[f+112>>2]|0;if(i){i=i+16|0;j=c[(c[i>>2]|0)+96>>2]|0;if(!j){C=21;break a}t=j+56|0;f=f+16|0;c[t>>2]=c[f>>2];c[t+4>>2]=c[f+4>>2];c[t+8>>2]=c[f+8>>2];c[t+12>>2]=c[f+12>>2];a[(c[(c[i>>2]|0)+96>>2]|0)+81>>0]=1;f=c[x>>2]|0}if((a[f+156>>0]|0)!=0?(pb[c[17340>>2]&63](q)|0)<<24>>24==0:0){r=u;f=v;j=w;i=p}else{t=0;r=u;s=v;j=w;C=25}b:do if((C|0)==25){while(1){C=0;q=c[x>>2]|0;i=c[(c[q+180>>2]|0)+(t<<2)>>2]|0;if(!i)break;switch(a[(c[i+16>>2]|0)+112>>0]|0){case 6:case 4:{f=r;i=s;break}default:{jg(i,1,16,64);f=r+1|0;c[s+(r<<2)>>2]=i;if(!(f&127)){g=KK(g,(r<<2)+516|0)|0;i=g;j=g;k=g;n=g;p=g}else i=s}}t=t+1|0;r=f;s=i;C=25}f=c[q+188>>2]|0;c:do if(!f)i=p;else{t=0;i=p;while(1){f=c[f+(t<<2)>>2]|0;if(!f)break c;jg(f,2,0,128);p=r+1|0;c[s+(r<<2)>>2]=f;if(!(p&127)){g=KK(i,(r<<2)+516|0)|0;f=g;j=g;k=g;n=g;i=g}else f=s;q=c[x>>2]|0;t=t+1|0;r=p;s=f;f=c[q+188>>2]|0}}while(0);f=c[q+204>>2]|0;if(!f)f=s;else{if(!(a[q+156>>0]|0)){w=q+96|0;z=+h[w>>3];t=q+240|0;h[w>>3]=+h[t>>3];h[t>>3]=z;t=0;q=s}else{t=0;q=s}while(1){f=c[f+(t<<2)>>2]|0;if(!f){f=q;break b}jg(f,0,0,128);p=r+1|0;c[q+(r<<2)>>2]=f;if(!(p&127)){g=KK(n,(r<<2)+516|0)|0;f=g;j=g;k=g;n=g;i=g}else f=q;t=t+1|0;r=p;q=f;f=c[(c[x>>2]|0)+204>>2]|0}}}while(0);s=c[W>>2]|0;x=c[s+196>>2]|0;y=y+1|0;u=r;v=f;w=j;p=i;i=c[x+(D<<6)>>2]|0;f=x}D=D+1|0;E=H;M=u;N=v;F=w;j=s;m=k;q=g;I=B;J=A}if((C|0)==21)Aa(85588,85601,313,85614);c[Z>>2]=I;c[G>>2]=J;k3(F,M,4,58);c[X+84>>2]=HK((E<<5)+11520|0)|0;c[Z+16>>2]=HK(D<<5)|0;d:do if(Y<<16>>16==2){f=(c[W>>2]|0)+192|0;while(1){g=c[f>>2]|0;if(!g)break d;i=g+16|0;f=c[i>>2]|0;if((a[f+156>>0]|0)==1?(c[f+104>>2]|0)!=0:0){lg(g);f=c[i>>2]|0}f=f+164|0}}while(0);B=V+48|0;C=V+-48|0;D=U+48|0;E=U+-48|0;A=V+16|0;z=+(L|0);y=0;e:while(1){if((y|0)>=(M|0))break;v=N+(y<<2)|0;s=c[v>>2]|0;t=mg(s)|0;u=s+16|0;g=c[u>>2]|0;if(!(a[g+44>>0]|0)){g=(a[g+84>>0]|0)==0?t:s;f=g;g=c[g+16>>2]|0}else f=s;i=f+16|0;if(c[g+164>>2]&32){g=c[R>>2]|0;B6(g|0,c[i>>2]|0,176)|0;n=U;p=f;q=n+48|0;do{c[n>>2]=c[p>>2];n=n+4|0;p=p+4|0}while((n|0)<(q|0));c[R>>2]=g;p=c[f>>2]&3;n=c[U>>2]&3;c[((n|0)==3?U:D)+40>>2]=c[((p|0)==2?f:f+-48|0)+40>>2];c[((n|0)==2?U:E)+40>>2]=c[((p|0)==3?f:f+48|0)+40>>2];n=g+16|0;p=(c[i>>2]|0)+56|0;q=n+40|0;do{c[n>>2]=c[p>>2];n=n+4|0;p=p+4|0}while((n|0)<(q|0));n=g+56|0;p=(c[i>>2]|0)+16|0;q=n+40|0;do{c[n>>2]=c[p>>2];n=n+4|0;p=p+4|0}while((n|0)<(q|0));a[g+112>>0]=1;c[g+116>>2]=f;f=U}r=f+16|0;x=1;f=y;while(1){w=f+1|0;if((w|0)>=(M|0))break;j=N+(w<<2)|0;f=c[j>>2]|0;if((t|0)!=(mg(f)|0))break;if(!(a[(c[u>>2]|0)+113>>0]|0)){k=f+16|0;g=c[k>>2]|0;if(!(a[g+44>>0]|0)){g=(a[g+84>>0]|0)==0?t:f;f=g;g=c[g+16>>2]|0}i=f+16|0;if(c[g+164>>2]&32){g=c[S>>2]|0;B6(g|0,c[i>>2]|0,176)|0;n=V;p=f;q=n+48|0;do{c[n>>2]=c[p>>2];n=n+4|0;p=p+4|0}while((n|0)<(q|0));c[S>>2]=g;p=c[f>>2]&3;n=c[V>>2]&3;c[((n|0)==3?V:B)+40>>2]=c[((p|0)==2?f:f+-48|0)+40>>2];c[((n|0)==2?V:C)+40>>2]=c[((p|0)==3?f:f+48|0)+40>>2];n=g+16|0;p=(c[i>>2]|0)+56|0;q=n+40|0;do{c[n>>2]=c[p>>2];n=n+4|0;p=p+4|0}while((n|0)<(q|0));n=g+56|0;p=(c[i>>2]|0)+16|0;q=n+40|0;do{c[n>>2]=c[p>>2];n=n+4|0;p=p+4|0}while((n|0)<(q|0));a[g+112>>0]=1;c[g+116>>2]=f;g=c[A>>2]|0}i=c[r>>2]|0;f=g+16|0;n=O;p=i+16|0;q=n+40|0;do{c[n>>2]=c[p>>2];n=n+4|0;p=p+4|0}while((n|0)<(q|0));n=P;p=f;q=n+40|0;do{c[n>>2]=c[p>>2];n=n+4|0;p=p+4|0}while((n|0)<(q|0));if(eg(O,P)|0)break;f=g+56|0;n=O;p=i+56|0;q=n+40|0;do{c[n>>2]=c[p>>2];n=n+4|0;p=p+4|0}while((n|0)<(q|0));n=P;p=f;q=n+40|0;do{c[n>>2]=c[p>>2];n=n+4|0;p=p+4|0}while((n|0)<(q|0));if(eg(O,P)|0)break;L=c[u>>2]|0;if((c[L+164>>2]&15|0)==2?(c[L+96>>2]|0)!=(c[(c[k>>2]|0)+96>>2]|0):0)break;if(c[(c[(c[j>>2]|0)+16>>2]|0)+164>>2]&64|0)break}x=x+1|0;f=w}if(T){if((x|0)==1)f=P;else f=HK(x<<2)|0;c[f>>2]=mg(c[v>>2]|0)|0;g=1;while(1){if((g|0)>=(x|0))break;c[f+(g<<2)>>2]=c[v+(g<<2)>>2];g=g+1|0}NM(d,f,x,Q,17336);if((x|0)>1)l6(f);y=w;continue}f=c[s>>2]&3;L=c[((f|0)==3?s:s+48|0)+40>>2]|0;f=c[((f|0)==2?s:s+-48|0)+40>>2]|0;g=c[L+16>>2]|0;n=c[g+232>>2]|0;if((L|0)!=(f|0))if((n|0)==(c[(c[f+16>>2]|0)+232>>2]|0)){ng(d,Z,X,N,y,x,Q);y=w;continue}else{og(d,Z,X,N,y,x,Q);y=w;continue}j=c[W>>2]|0;f=j+196|0;k=n+-1|0;i=g+24|0;do if((n|0)==(b[j+238>>1]|0))if((n|0)>0){f=~~(+h[(c[(c[c[(c[f>>2]|0)+(k<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]-+h[i>>3]);break}else{f=~~+h[g+80>>3];break}else{g=c[f>>2]|0;o=+h[i>>3];f=~~(o-+h[(c[(c[c[g+(n+1<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]);if((n|0)!=(b[j+236>>1]|0)){L=~~(+h[(c[(c[c[g+(k<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]-o);f=(L|0)<(f|0)?L:f}}while(0);jO(X,N,y,x,z,+((f|0)/2|0|0),17336);f=0;while(1){if((f|0)>=(x|0)){y=w;continue e}g=c[(c[(c[N+(f+y<<2)>>2]|0)+16>>2]|0)+96>>2]|0;if(g|0)xP(d,g);f=f+1|0}}f=(c[W>>2]|0)+192|0;while(1){g=c[f>>2]|0;if(!g)break;i=g+16|0;f=c[i>>2]|0;if((a[f+156>>0]|0)==1?(c[f+104>>2]|0)!=0:0){lg(g);xP(d,c[(c[i>>2]|0)+104>>2]|0);f=c[i>>2]|0}f=f+164|0}if(!e){n=X;k=X}else{pg(d);n=X;k=X}}f:do if((c[47266]|0)!=0|(c[47267]|0)!=0?(c[47272]|0)!=0|(c[47271]|0)!=0:0){j=gC(d)|0;while(1){if(!j)break f;g:do if(c[47266]|0){f=XA(d,j)|0;while(1){if(!f)break g;g=f+-48|0;i=(c[f>>2]&3|0)==2?f:g;if(c[(c[i+16>>2]|0)+100>>2]|0){rO(i,1)|0;xP(d,c[(c[((c[f>>2]&3|0)==2?f:g)+16>>2]|0)+100>>2]|0)}f=YA(d,f)|0}}while(0);h:do if(c[47267]|0){f=UA(d,j)|0;while(1){if(!f)break h;g=f+16|0;if(c[(c[g>>2]|0)+104>>2]|0?rO(f,0)|0:0)xP(d,c[(c[g>>2]|0)+104>>2]|0);f=WA(d,f)|0}}while(0);j=hC(d,j)|0}}while(0);switch(Y&15){case 4:case 8:break;default:{l6(m);l6(c[n+84>>2]|0);l6(k);l6(c[Z+16>>2]|0);EM()}}c[47185]=1;c[47186]=1}while(0);l=_;return}function hg(a){a=a|0;var b=0,d=0,e=0.0,f=0;b=gC(a)|0;while(1){if(!b)break;d=c[b+16>>2]|0;if(c[d+204>>2]|0){f=d+96|0;e=+h[f>>3];d=d+240|0;h[f>>3]=+h[d>>3];h[d>>3]=e}b=hC(a,b)|0}return}function ig(b){b=b|0;var d=0,e=0,f=0,g=0;d=(c[b+16>>2]|0)+192|0;a:while(1){f=c[d>>2]|0;if(!f){d=12;break}g=f+16|0;d=c[g>>2]|0;do if((a[d+156>>0]|0)==1){e=c[d+112>>2]|0;if(!e){e=c[d+104>>2]|0;if(!e)break;lg(f);d=e}else{e=c[(c[e+16>>2]|0)+96>>2]|0;if(!e){d=6;break a}f=e+56|0;d=d+16|0;c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];a[e+81>>0]=1;d=e}xP(b,d);d=c[g>>2]|0}while(0);d=d+164|0}if((d|0)==6)Aa(85788,85601,234,85807);else if((d|0)==12)return}function jg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;h=b+-48|0;i=b+48|0;j=b+16|0;do if(!d){g=c[b>>2]&3;d=c[((g|0)==3?b:i)+40>>2]|0;g=c[((g|0)==2?b:h)+40>>2]|0;if((d|0)!=(g|0)){d=(c[(c[d+16>>2]|0)+232>>2]|0)==(c[(c[g+16>>2]|0)+232>>2]|0)?2:1;break}d=c[j>>2]|0;if(!(a[d+44>>0]|0))d=(a[d+84>>0]|0)==0?8:4;else d=4}while(0);a:do if(!e)switch(d|0){case 1:{e=c[b>>2]&3;e=(c[(c[(c[((e|0)==3?b:i)+40>>2]|0)+16>>2]|0)+232>>2]|0)<(c[(c[(c[((e|0)==2?b:h)+40>>2]|0)+16>>2]|0)+232>>2]|0)?16:32;break a}case 2:{e=c[b>>2]&3;e=(c[(c[(c[((e|0)==3?b:i)+40>>2]|0)+16>>2]|0)+236>>2]|0)<(c[(c[(c[((e|0)==2?b:h)+40>>2]|0)+16>>2]|0)+236>>2]|0)?16:32;break a}default:{e=16;break a}}while(0);c[(c[j>>2]|0)+164>>2]=d|f|e;return}function kg(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=l;l=l+624|0;y=C+584|0;x=C+544|0;r=C+368|0;s=C+96|0;u=C;t=s+16|0;c[t>>2]=r;v=u+16|0;c[v>>2]=C+192;B=c[b>>2]|0;A=c[d>>2]|0;w=B+16|0;p=c[w>>2]|0;d=c[p+164>>2]|0;e=d&15;z=A+16|0;b=c[z>>2]|0;f=c[b+164>>2]&15;do if((f|0)==(e|0)){o=mg(B)|0;q=mg(A)|0;m=c[o>>2]|0;f=m&3;e=c[(c[((f|0)==3?o:o+48|0)+40>>2]|0)+16>>2]|0;f=c[(c[((f|0)==2?o:o+-48|0)+40>>2]|0)+16>>2]|0;g=(c[e+232>>2]|0)-(c[f+232>>2]|0)|0;n=c[q>>2]|0;k=n&3;j=c[(c[((k|0)==3?q:q+48|0)+40>>2]|0)+16>>2]|0;k=c[(c[((k|0)==2?q:q+-48|0)+40>>2]|0)+16>>2]|0;i=(c[j+232>>2]|0)-(c[k+232>>2]|0)|0;g=(g|0)>-1?g:0-g|0;i=(i|0)>-1?i:0-i|0;if((g|0)!=(i|0)){b=g-i|0;break}f=~~(+h[e+16>>3]-+h[f+16>>3]);f=(f|0)>-1?f:0-f|0;e=~~(+h[j+16>>3]-+h[k+16>>3]);e=(e|0)>-1?e:0-e|0;if((f|0)!=(e|0)){b=f-e|0;break}f=m>>>4;e=n>>>4;if((f|0)!=(e|0)){b=f-e|0;break}if(!(a[p+44>>0]|0)){d=(a[p+84>>0]|0)==0?o:B;f=d;d=c[(c[d+16>>2]|0)+164>>2]|0}else f=B;e=f+16|0;if(d&32){B6(r|0,c[e>>2]|0,176)|0;g=s;i=f;j=g+48|0;do{c[g>>2]=c[i>>2];g=g+4|0;i=i+4|0}while((g|0)<(j|0));c[t>>2]=r;i=c[f>>2]&3;g=c[s>>2]&3;c[((g|0)==3?s:s+48|0)+40>>2]=c[((i|0)==2?f:f+-48|0)+40>>2];c[((g|0)==2?s:s+-48|0)+40>>2]=c[((i|0)==3?f:f+48|0)+40>>2];g=r+16|0;i=(c[e>>2]|0)+56|0;j=g+40|0;do{c[g>>2]=c[i>>2];g=g+4|0;i=i+4|0}while((g|0)<(j|0));g=r+56|0;i=(c[e>>2]|0)+16|0;j=g+40|0;do{c[g>>2]=c[i>>2];g=g+4|0;i=i+4|0}while((g|0)<(j|0));a[r+112>>0]=1;c[r+116>>2]=f;f=s;b=c[z>>2]|0}if(!(a[b+44>>0]|0)){b=(a[b+84>>0]|0)==0?q:A;e=b;b=c[b+16>>2]|0}else e=A;d=e+16|0;if(!(c[b+164>>2]&32))e=b;else{b=c[v>>2]|0;B6(b|0,c[d>>2]|0,176)|0;g=u;i=e;j=g+48|0;do{c[g>>2]=c[i>>2];g=g+4|0;i=i+4|0}while((g|0)<(j|0));c[v>>2]=b;i=c[e>>2]&3;g=c[u>>2]&3;c[((g|0)==3?u:u+48|0)+40>>2]=c[((i|0)==2?e:e+-48|0)+40>>2];c[((g|0)==2?u:u+-48|0)+40>>2]=c[((i|0)==3?e:e+48|0)+40>>2];g=b+16|0;i=(c[d>>2]|0)+56|0;j=g+40|0;do{c[g>>2]=c[i>>2];g=g+4|0;i=i+4|0}while((g|0)<(j|0));g=b+56|0;i=(c[d>>2]|0)+16|0;j=g+40|0;do{c[g>>2]=c[i>>2];g=g+4|0;i=i+4|0}while((g|0)<(j|0));a[b+112>>0]=1;c[b+116>>2]=e;e=c[u+16>>2]|0}d=c[f+16>>2]|0;b=e+16|0;g=x;i=d+16|0;j=g+40|0;do{c[g>>2]=c[i>>2];g=g+4|0;i=i+4|0}while((g|0)<(j|0));g=y;i=b;j=g+40|0;do{c[g>>2]=c[i>>2];g=g+4|0;i=i+4|0}while((g|0)<(j|0));b=eg(x,y)|0;if(!b){b=e+56|0;g=x;i=d+56|0;j=g+40|0;do{c[g>>2]=c[i>>2];g=g+4|0;i=i+4|0}while((g|0)<(j|0));g=y;i=b;j=g+40|0;do{c[g>>2]=c[i>>2];g=g+4|0;i=i+4|0}while((g|0)<(j|0));b=eg(x,y)|0;if(!b){d=c[(c[w>>2]|0)+164>>2]&192;b=c[(c[z>>2]|0)+164>>2]&192;if((d|0)==(b|0)){b=((c[B>>2]|0)>>>4)-((c[A>>2]|0)>>>4)|0;break}else{b=d-b|0;break}}}}else b=f-e|0;while(0);l=C;return b|0}function lg(b){b=b|0;var d=0,e=0,f=0,g=0.0,i=0.0;f=b+16|0;d=c[f>>2]|0;if(c[d+176>>2]|0){d=c[d+180>>2]|0;while(1){d=(c[d>>2]|0)+16|0;e=c[d>>2]|0;if(!(a[e+112>>0]|0))break;else d=e+116|0}e=c[e+96>>2]|0;g=+h[e+24>>3];i=+h[e+32>>3];e=(c[(c[(uC(b)|0)+16>>2]|0)+116>>2]&1|0)!=0;b=c[f>>2]|0;f=c[(c[d>>2]|0)+96>>2]|0;h[f+56>>3]=+h[b+16>>3]+(e?i:g)*.5;h[f+64>>3]=+h[b+24>>3];a[f+81>>0]=1}return}function mg(a){a=a|0;var b=0,d=0;while(1){b=c[a+16>>2]|0;d=c[b+172>>2]|0;if(!d)break;else a=d}while(1){b=c[b+116>>2]|0;if(!b)break;a=b;b=c[b+16>>2]|0}return a|0}function ng(b,d,e,f,g,i,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;var k=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0;B=l;l=l+1712|0;x=B+1664|0;o=B+1488|0;u=B+1392|0;A=B+1696|0;y=B+696|0;z=B;n=u+16|0;c[n>>2]=o;s=c[f+(g<<2)>>2]|0;t=s+16|0;k=c[t>>2]|0;v=a[k+113>>0]|0;if(c[k+164>>2]&32){B6(o|0,k|0,176)|0;p=u;q=s;r=p+48|0;do{c[p>>2]=c[q>>2];p=p+4|0;q=q+4|0}while((p|0)<(r|0));c[n>>2]=o;p=c[u>>2]&3;c[((p|0)==3?u:u+48|0)+40>>2]=c[((c[s>>2]&3|0)==2?s:s+-48|0)+40>>2];c[((p|0)==2?u:u+-48|0)+40>>2]=c[((c[s>>2]&3|0)==3?s:s+48|0)+40>>2];p=o+16|0;q=(c[t>>2]|0)+56|0;r=p+40|0;do{c[p>>2]=c[q>>2];p=p+4|0;q=q+4|0}while((p|0)<(r|0));k=c[n>>2]|0;p=k+56|0;q=(c[t>>2]|0)+16|0;r=p+40|0;do{c[p>>2]=c[q>>2];p=p+4|0;q=q+4|0}while((p|0)<(r|0));a[k+112>>0]=1;c[k+116>>2]=s;s=u}k=1;while(1){if((k|0)>=(i|0)){u=6;break}if(!(a[(c[(c[f+(k+g<<2)>>2]|0)+16>>2]|0)+113>>0]|0))k=k+1|0;else{u=7;break}}a:do if((u|0)==6)if(!(v<<24>>24)){k=c[s+16>>2]|0;if(c[k+96>>2]|0){Ng(b,d,e,s,j);break}n=s+48|0;o=s+-48|0;if((j|0)==2){A=c[s>>2]&3;Og(c[((A|0)==3?s:n)+40>>2]|0,c[((A|0)==2?s:o)+40>>2]|0,f,g,i,2);break}r=a[k+49>>0]|0;v=a[k+89>>0]|0;t=(j|0)==10;if(!(r<<24>>24==1&v<<24>>24!=4)?!(r<<24>>24!=4&v<<24>>24==1):0){p=c[s>>2]&3;q=c[((p|0)==3?s:n)+40>>2]|0;p=c[((p|0)==2?s:o)+40>>2]|0;k=c[q+16>>2]|0;n=c[k+232>>2]|0;o=c[b+16>>2]|0;if((n|0)>0){j=c[o+196>>2]|0;v=n+~(a[(c[(c[b+60>>2]|0)+16>>2]|0)+113>>0]&1)|0;m=+h[(c[(c[c[j+(v<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]-+h[j+(v<<6)+16>>3]-+h[k+24>>3]-+h[j+(n<<6)+24>>3]}else m=+(c[o+252>>2]|0);C=+(i+1|0);w=+(c[d+12>>2]|0)/C;m=m/C;Qg(b,d,e,q,s,y,1);Qg(b,d,e,p,s,z,0);p=y+52|0;q=z+52|0;r=e+80|0;k=0;while(1){if((k|0)>=(i|0))break a;s=c[f+(k+g<<2)>>2]|0;o=c[p>>2]|0;n=o+-1|0;G=+h[y+56+(n<<5)>>3];F=+h[y+56+(n<<5)+16>>3];C=+h[y+56+(n<<5)+24>>3];h[19234]=G;h[19235]=C;k=k+1|0;E=+(k|0);D=w*E;h[19236]=D+F;C=m*E+C;h[19237]=C;h[19238]=G;h[19239]=C;n=(c[q>>2]|0)+-1|0;G=+h[z+56+(n<<5)+16>>3];h[19240]=G;h[19241]=m+C;E=+h[z+56+(n<<5)>>3];F=+h[z+56+(n<<5)+24>>3];h[19244]=G;h[19243]=F;h[19242]=E-D;h[19245]=C;n=0;while(1){if((n|0)>=(o|0)){n=0;break}o=y+56+(n<<5)|0;c[x>>2]=c[o>>2];c[x+4>>2]=c[o+4>>2];c[x+8>>2]=c[o+8>>2];c[x+12>>2]=c[o+12>>2];c[x+16>>2]=c[o+16>>2];c[x+20>>2]=c[o+20>>2];c[x+24>>2]=c[o+24>>2];c[x+28>>2]=c[o+28>>2];dO(e,x);n=n+1|0;o=c[p>>2]|0}while(1){if((n|0)==3)break;d=153872+(n<<5)|0;c[x>>2]=c[d>>2];c[x+4>>2]=c[d+4>>2];c[x+8>>2]=c[d+8>>2];c[x+12>>2]=c[d+12>>2];c[x+16>>2]=c[d+16>>2];c[x+20>>2]=c[d+20>>2];c[x+24>>2]=c[d+24>>2];c[x+28>>2]=c[d+28>>2];dO(e,x);n=n+1|0}o=c[q>>2]|0;while(1){n=o+-1|0;if((o|0)<=0)break;o=z+56+(n<<5)|0;c[x>>2]=c[o>>2];c[x+4>>2]=c[o+4>>2];c[x+8>>2]=c[o+8>>2];c[x+12>>2]=c[o+12>>2];c[x+16>>2]=c[o+16>>2];c[x+20>>2]=c[o+20>>2];c[x+24>>2]=c[o+24>>2];c[x+28>>2]=c[o+28>>2];dO(e,x);o=n}if(t)n=FM(e,A)|0;else n=LM(e,A)|0;o=c[A>>2]|0;if(!o)break a;bO(s,c[((c[s>>2]&3|0)==2?s:s+-48|0)+40>>2]|0,n,o,17336);c[r>>2]=0}}Pg(b,d,e,f,g,i,s,t&1)}else u=7;while(0);if((u|0)==7)Mg(b,f,g,i,s,j);l=B;return}function og(b,d,e,f,g,i,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;var k=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0;da=l;l=l+2576|0;T=da+2528|0;aa=da+2568|0;k=da+2352|0;n=da+2176|0;w=da+1904|0;Z=da+1808|0;ba=da+1712|0;U=da+1016|0;V=da+320|0;W=da+256|0;Y=da+2564|0;_=da+2560|0;B=da+288|0;C=da+224|0;M=da+192|0;N=da+160|0;O=da+128|0;P=da+96|0;Q=da+64|0;R=da+32|0;X=da;t=w+16|0;c[t>>2]=k;o=Z+16|0;c[o>>2]=n;ca=ba+16|0;c[ca>>2]=da+2e3;if(!(c[46776]|0)){c[46776]=IK(32e3)|0;c[46777]=IK(32e3)|0;c[46778]=2e3;c[46779]=2e3}x=c[f+(g<<2)>>2]|0;K=c[x>>2]&3;p=x+48|0;q=x+-48|0;K=(c[(c[(c[((K|0)==3?x:p)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[(c[(c[((K|0)==2?x:q)+40>>2]|0)+16>>2]|0)+232>>2]|0)|0;u=w+-48|0;$=Z+-48|0;r=x+16|0;s=w+48|0;if((((K|0)>-1?K:0-K|0)|0)<=1){k=c[r>>2]|0;if(!(c[k+164>>2]&32)){w=x;n=0}else{n=c[t>>2]|0;B6(n|0,k|0,176)|0;y=w;z=x;A=y+48|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0));c[t>>2]=n;y=c[w>>2]&3;c[((y|0)==3?w:s)+40>>2]=c[((c[x>>2]&3|0)==2?x:q)+40>>2];c[((y|0)==2?w:u)+40>>2]=c[((c[x>>2]&3|0)==3?x:p)+40>>2];y=n+16|0;z=(c[r>>2]|0)+56|0;A=y+40|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0));k=c[t>>2]|0;y=k+56|0;z=(c[r>>2]|0)+16|0;A=y+40|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0));a[k+112>>0]=1;n=0;L=12}}else{B6(k|0,c[r>>2]|0,176)|0;y=w;z=x;A=y+48|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0));y=w+48|0;z=p;A=y+48|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0));c[t>>2]=k;k=c[r>>2]|0;if(!(c[k+164>>2]&32)){B6(n|0,k|0,176)|0;y=Z;z=x;A=y+48|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0));c[o>>2]=n;o=c[w>>2]|0;c[((o&3|0)==3?w:s)+40>>2]=c[((c[x>>2]&3|0)==3?x:p)+40>>2];y=Z+48|0;z=p;A=y+48|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0))}else{n=c[o>>2]|0;B6(n|0,k|0,176)|0;y=Z;z=x;A=y+48|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0));c[o>>2]=n;y=c[Z>>2]&3;c[((y|0)==3?Z:Z+48|0)+40>>2]=c[((c[x>>2]&3|0)==2?x:q)+40>>2];c[((y|0)==2?Z:$)+40>>2]=c[((c[x>>2]&3|0)==3?x:p)+40>>2];y=n+16|0;z=(c[r>>2]|0)+56|0;A=y+40|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0));k=c[o>>2]|0;y=k+56|0;z=(c[r>>2]|0)+16|0;A=y+40|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0));a[k+112>>0]=1;c[k+116>>2]=x;o=c[w>>2]|0;c[((o&3|0)==3?w:s)+40>>2]=c[((c[x>>2]&3|0)==2?x:q)+40>>2];y=(c[t>>2]|0)+16|0;z=(c[r>>2]|0)+56|0;A=y+40|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0))}k=mg(x)|0;while(1){n=c[(c[k+16>>2]|0)+172>>2]|0;if(!n)break;else k=n}c[((o&3|0)==2?w:u)+40>>2]=c[((c[k>>2]&3|0)==2?k:k+-48|0)+40>>2];k=c[t>>2]|0;a[k+84>>0]=0;a[k+112>>0]=1;n=k+56|0;c[n>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;n=1;L=12}if((L|0)==12)c[k+116>>2]=x;J=(j|0)==2;if(J?(v=sg(b,w,c[46776]|0,aa)|0,c[_>>2]=v,(v|0)!=0):0)L=63;else L=15;a:do if((L|0)==15){I=(j|0)==10;c[_>>2]=0;o=c[w>>2]&3;k=c[((o|0)==3?w:w+48|0)+40>>2]|0;o=c[((o|0)==2?w:w+-48|0)+40>>2]|0;c[aa>>2]=o;tg(B,b,d,k,0,w);c[U>>2]=c[B>>2];c[U+4>>2]=c[B+4>>2];c[U+8>>2]=c[B+8>>2];c[U+12>>2]=c[B+12>>2];c[U+16>>2]=c[B+16>>2];c[U+20>>2]=c[B+20>>2];c[U+24>>2]=c[B+24>>2];c[U+28>>2]=c[B+28>>2];c[W>>2]=c[B>>2];c[W+4>>2]=c[B+4>>2];c[W+8>>2]=c[B+8>>2];c[W+12>>2]=c[B+12>>2];c[W+16>>2]=c[B+16>>2];c[W+20>>2]=c[B+20>>2];eO(e,w,1,U,ug(k)|0);D=U+52|0;K=(c[D>>2]|0)+-1|0;F=W+24|0;h[F>>3]=+h[U+56+(K<<5)+24>>3];G=W+8|0;h[G>>3]=+h[U+56+(K<<5)+8>>3];K=c[k+16>>2]|0;H=b+16|0;m=+h[K+24>>3]-+h[(c[(c[H>>2]|0)+196>>2]|0)+(c[K+232>>2]<<6)+16>>3];c[T>>2]=c[W>>2];c[T+4>>2]=c[W+4>>2];c[T+8>>2]=c[W+8>>2];c[T+12>>2]=c[W+12>>2];c[T+16>>2]=c[W+16>>2];c[T+20>>2]=c[W+20>>2];c[T+24>>2]=c[W+24>>2];c[T+28>>2]=c[W+28>>2];vg(C,T,1,m);c[W>>2]=c[C>>2];c[W+4>>2]=c[C+4>>2];c[W+8>>2]=c[C+8>>2];c[W+12>>2]=c[C+12>>2];c[W+16>>2]=c[C+16>>2];c[W+20>>2]=c[C+20>>2];c[W+24>>2]=c[C+24>>2];c[W+28>>2]=c[C+28>>2];C=W+16|0;if(+h[W>>3]<+h[C>>3]?+h[G>>3]<+h[F>>3]:0){K=c[D>>2]|0;c[D>>2]=K+1;K=U+56+(K<<5)|0;c[K>>2]=c[W>>2];c[K+4>>2]=c[W+4>>2];c[K+8>>2]=c[W+8>>2];c[K+12>>2]=c[W+12>>2];c[K+16>>2]=c[W+16>>2];c[K+20>>2]=c[W+20>>2];c[K+24>>2]=c[W+24>>2];c[K+28>>2]=c[W+28>>2]}y=b+60|0;E=V+52|0;z=e+56|0;A=e+69|0;j=e+16|0;B=e+29|0;K=w;q=0;r=-1;b:while(1){s=0;p=0;v=K;while(1){t=o;x=o;u=s|1;o=153872+(s<<5)|0;k=k+16|0;if((a[(c[t+16>>2]|0)+156>>0]|0)!=1)break b;if((pb[c[17340>>2]&63](t)|0)<<24>>24)break b;wg(M,d,b,c[(c[k>>2]|0)+232>>2]|0);c[o>>2]=c[M>>2];c[o+4>>2]=c[M+4>>2];c[o+8>>2]=c[M+8>>2];c[o+12>>2]=c[M+12>>2];c[o+16>>2]=c[M+16>>2];c[o+20>>2]=c[M+20>>2];c[o+24>>2]=c[M+24>>2];c[o+28>>2]=c[M+28>>2];if(!p){q=xg(t)|0;o=(q|0)<((a[(c[(c[y>>2]|0)+16>>2]|0)+113>>0]<<1&2)+3&255|0);q=o?q:q+-2|0;r=o?r:1;o=(o^1)&1}else o=p;if(!((o|0)==0|(r|0)>0))break;u=153872+(u<<5)|0;tg(N,b,d,t,v,c[c[(c[t+16>>2]|0)+180>>2]>>2]|0);c[u>>2]=c[N>>2];c[u+4>>2]=c[N+4>>2];c[u+8>>2]=c[N+8>>2];c[u+12>>2]=c[N+12>>2];c[u+16>>2]=c[N+16>>2];c[u+20>>2]=c[N+20>>2];c[u+24>>2]=c[N+24>>2];c[u+28>>2]=c[N+28>>2];u=c[c[(c[x+16>>2]|0)+180>>2]>>2]|0;x=c[u>>2]&3;k=c[((x|0)==3?u:u+48|0)+40>>2]|0;x=c[((x|0)==2?u:u+-48|0)+40>>2]|0;c[aa>>2]=x;s=s+2|0;r=r+-1|0;p=o;v=u;o=x}tg(O,b,d,t,v,c[c[(c[t+16>>2]|0)+180>>2]>>2]|0);c[V>>2]=c[O>>2];c[V+4>>2]=c[O+4>>2];c[V+8>>2]=c[O+8>>2];c[V+12>>2]=c[O+12>>2];c[V+16>>2]=c[O+16>>2];c[V+20>>2]=c[O+20>>2];c[V+24>>2]=c[O+24>>2];c[V+28>>2]=c[O+28>>2];hO(e,v,1,V,ug(c[((c[v>>2]&3|0)==2?v:v+-48|0)+40>>2]|0)|0);t=V+56+((c[E>>2]|0)+-1<<5)|0;s=c[x+16>>2]|0;m=+h[s+24>>3]+ +h[(c[(c[H>>2]|0)+196>>2]|0)+(c[s+232>>2]<<6)+24>>3];c[T>>2]=c[t>>2];c[T+4>>2]=c[t+4>>2];c[T+8>>2]=c[t+8>>2];c[T+12>>2]=c[t+12>>2];c[T+16>>2]=c[t+16>>2];c[T+20>>2]=c[t+20>>2];c[T+24>>2]=c[t+24>>2];c[T+28>>2]=c[t+28>>2];vg(W,T,4,m);if(+h[W>>3]<+h[C>>3]?+h[G>>3]<+h[F>>3]:0){t=c[E>>2]|0;c[E>>2]=t+1;t=V+56+(t<<5)|0;c[t>>2]=c[W>>2];c[t+4>>2]=c[W+4>>2];c[t+8>>2]=c[W+8>>2];c[t+12>>2]=c[W+12>>2];c[t+16>>2]=c[W+16>>2];c[t+20>>2]=c[W+20>>2];c[t+24>>2]=c[W+24>>2];c[t+28>>2]=c[W+28>>2]}h[z>>3]=1.5707963267948966;a[A>>0]=1;yg(e,K,v,U,V,u);if(!I){k=LM(e,Y)|0;o=c[Y>>2]|0;if(J&(o|0)>4){v=k+16|0;c[v>>2]=c[k>>2];c[v+4>>2]=c[k+4>>2];c[v+8>>2]=c[k+8>>2];c[v+12>>2]=c[k+12>>2];v=k+32|0;o=k+(o+-1<<4)|0;c[v>>2]=c[o>>2];c[v+4>>2]=c[o+4>>2];c[v+8>>2]=c[o+8>>2];c[v+12>>2]=c[o+12>>2];I6(k+48|0,o|0,16)|0;c[Y>>2]=4;o=4}else L=33}else{k=FM(e,Y)|0;o=c[Y>>2]|0;L=33}if((L|0)==33){L=0;if(!o)break a}u=c[_>>2]|0;p=u+o|0;if((p|0)>(c[46778]|0)){c[46778]=p<<1;t=KK(c[46776]|0,p<<5)|0;c[46776]=t;o=c[Y>>2]|0}else t=c[46776]|0;s=0;p=u;while(1){if((s|0)>=(o|0))break;v=t+(p<<4)|0;u=k+(s<<4)|0;c[v>>2]=c[u>>2];c[v+4>>2]=c[u+4>>2];c[v+8>>2]=c[u+8>>2];c[v+12>>2]=c[u+12>>2];s=s+1|0;p=p+1|0}c[_>>2]=p;o=zg(c[c[(c[x+16>>2]|0)+180>>2]>>2]|0,q,t,_)|0;Ag(K,e);p=c[o>>2]&3;k=c[((p|0)==3?o:o+48|0)+40>>2]|0;p=c[((p|0)==2?o:o+-48|0)+40>>2]|0;c[aa>>2]=p;x=k+16|0;tg(P,b,d,k,c[c[(c[x>>2]|0)+172>>2]>>2]|0,o);c[U>>2]=c[P>>2];c[U+4>>2]=c[P+4>>2];c[U+8>>2]=c[P+8>>2];c[U+12>>2]=c[P+12>>2];c[U+16>>2]=c[P+16>>2];c[U+20>>2]=c[P+20>>2];c[U+24>>2]=c[P+24>>2];c[U+28>>2]=c[P+28>>2];eO(e,o,1,U,ug(k)|0);K=U+56+((c[D>>2]|0)+-1<<5)|0;x=c[x>>2]|0;m=+h[x+24>>3]-+h[(c[(c[H>>2]|0)+196>>2]|0)+(c[x+232>>2]<<6)+16>>3];c[T>>2]=c[K>>2];c[T+4>>2]=c[K+4>>2];c[T+8>>2]=c[K+8>>2];c[T+12>>2]=c[K+12>>2];c[T+16>>2]=c[K+16>>2];c[T+20>>2]=c[K+20>>2];c[T+24>>2]=c[K+24>>2];c[T+28>>2]=c[K+28>>2];vg(W,T,1,m);if(+h[W>>3]<+h[C>>3]?+h[G>>3]<+h[F>>3]:0){K=c[D>>2]|0;c[D>>2]=K+1;K=U+56+(K<<5)|0;c[K>>2]=c[W>>2];c[K+4>>2]=c[W+4>>2];c[K+8>>2]=c[W+8>>2];c[K+12>>2]=c[W+12>>2];c[K+16>>2]=c[W+16>>2];c[K+20>>2]=c[W+20>>2];c[K+24>>2]=c[W+24>>2];c[K+28>>2]=c[W+28>>2]}h[j>>3]=-1.5707963267948966;a[B>>0]=1;K=o;o=p}s=v+-48|0;wg(Q,d,b,c[(c[k>>2]|0)+232>>2]|0);c[o>>2]=c[Q>>2];c[o+4>>2]=c[Q+4>>2];c[o+8>>2]=c[Q+8>>2];c[o+12>>2]=c[Q+12>>2];c[o+16>>2]=c[Q+16>>2];c[o+20>>2]=c[Q+20>>2];c[o+24>>2]=c[Q+24>>2];c[o+28>>2]=c[Q+28>>2];tg(R,b,d,t,v,0);c[V>>2]=c[R>>2];c[V+4>>2]=c[R+4>>2];c[V+8>>2]=c[R+8>>2];c[V+12>>2]=c[R+12>>2];c[V+16>>2]=c[R+16>>2];c[V+20>>2]=c[R+20>>2];c[V+24>>2]=c[R+24>>2];c[V+28>>2]=c[R+28>>2];c[W>>2]=c[R>>2];c[W+4>>2]=c[R+4>>2];c[W+8>>2]=c[R+8>>2];c[W+12>>2]=c[R+12>>2];c[W+16>>2]=c[R+16>>2];c[W+20>>2]=c[R+20>>2];c[W+24>>2]=c[R+24>>2];c[W+28>>2]=c[R+28>>2];r=(n|0)!=0;hO(e,r?Z:v,1,V,ug(c[((c[v>>2]&3|0)==2?v:s)+40>>2]|0)|0);R=(c[E>>2]|0)+-1|0;h[F>>3]=+h[V+56+(R<<5)+24>>3];h[G>>3]=+h[V+56+(R<<5)+8>>3];R=c[x+16>>2]|0;m=+h[R+24>>3]+ +h[(c[(c[H>>2]|0)+196>>2]|0)+(c[R+232>>2]<<6)+24>>3];c[T>>2]=c[W>>2];c[T+4>>2]=c[W+4>>2];c[T+8>>2]=c[W+8>>2];c[T+12>>2]=c[W+12>>2];c[T+16>>2]=c[W+16>>2];c[T+20>>2]=c[W+20>>2];c[T+24>>2]=c[W+24>>2];c[T+28>>2]=c[W+28>>2];vg(X,T,4,m);c[W>>2]=c[X>>2];c[W+4>>2]=c[X+4>>2];c[W+8>>2]=c[X+8>>2];c[W+12>>2]=c[X+12>>2];c[W+16>>2]=c[X+16>>2];c[W+20>>2]=c[X+20>>2];c[W+24>>2]=c[X+24>>2];c[W+28>>2]=c[X+28>>2];if(+h[W>>3]<+h[C>>3]?+h[G>>3]<+h[F>>3]:0){X=c[E>>2]|0;c[E>>2]=X+1;X=V+56+(X<<5)|0;c[X>>2]=c[W>>2];c[X+4>>2]=c[W+4>>2];c[X+8>>2]=c[W+8>>2];c[X+12>>2]=c[W+12>>2];c[X+16>>2]=c[W+16>>2];c[X+20>>2]=c[W+20>>2];c[X+24>>2]=c[W+24>>2];c[X+28>>2]=c[W+28>>2]}yg(e,K,v,U,V,u);if(I)q=FM(e,Y)|0;else q=LM(e,Y)|0;k=c[Y>>2]|0;if(!(J&(k|0)>4)){if(!k)break}else{X=q+32|0;k=q+(k+-1<<4)|0;W=q+16|0;c[W>>2]=c[q>>2];c[W+4>>2]=c[q+4>>2];c[W+8>>2]=c[q+8>>2];c[W+12>>2]=c[q+12>>2];c[X>>2]=c[k>>2];c[X+4>>2]=c[k+4>>2];c[X+8>>2]=c[k+8>>2];c[X+12>>2]=c[k+12>>2];I6(q+48|0,k|0,16)|0;c[Y>>2]=4;k=4}o=c[_>>2]|0;n=o+k|0;if((n|0)>(c[46778]|0)){c[46778]=n<<1;p=KK(c[46776]|0,n<<5)|0;c[46776]=p;k=c[Y>>2]|0}else p=c[46776]|0;n=0;while(1){if((n|0)>=(k|0))break;Y=p+(o<<4)|0;X=q+(n<<4)|0;c[Y>>2]=c[X>>2];c[Y+4>>2]=c[X+4>>2];c[Y+8>>2]=c[X+8>>2];c[Y+12>>2]=c[X+12>>2];n=n+1|0;o=o+1|0}c[_>>2]=o;Ag(K,e);if(r)k=(c[Z>>2]&3|0)==2?Z:$;else k=(c[v>>2]&3|0)==2?v:s;c[aa>>2]=c[k+40>>2];v=o;L=63}while(0);c:do if((L|0)==63){if((i|0)==1){bO(w,c[aa>>2]|0,c[46776]|0,v,17336);break}t=d+12|0;u=v+-1|0;m=+((S(c[t>>2]|0,i+-1|0)|0)/2|0|0);n=c[46776]|0;k=1;while(1){if((k|0)>=(u|0))break;d=n+(k<<4)|0;h[d>>3]=+h[d>>3]-m;k=k+1|0}k=c[46778]|0;if((k|0)>(c[46779]|0)){c[46779]=k;o=KK(c[46777]|0,k<<4)|0;c[46777]=o;n=c[46776]|0}else o=c[46777]|0;k=0;while(1){if((k|0)>=(v|0))break;d=o+(k<<4)|0;$=n+(k<<4)|0;c[d>>2]=c[$>>2];c[d+4>>2]=c[$+4>>2];c[d+8>>2]=c[$+8>>2];c[d+12>>2]=c[$+12>>2];k=k+1|0}bO(w,c[aa>>2]|0,o,v,17336);r=ba+48|0;s=ba+-48|0;q=1;while(1){if((q|0)>=(i|0))break c;o=c[f+(q+g<<2)>>2]|0;p=o+16|0;k=c[p>>2]|0;if(c[k+164>>2]&32){n=c[ca>>2]|0;B6(n|0,k|0,176)|0;y=ba;z=o;A=y+48|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0));c[ca>>2]=n;y=c[ba>>2]&3;c[((y|0)==3?ba:r)+40>>2]=c[((c[o>>2]&3|0)==2?o:o+-48|0)+40>>2];c[((y|0)==2?ba:s)+40>>2]=c[((c[o>>2]&3|0)==3?o:o+48|0)+40>>2];y=n+16|0;z=(c[p>>2]|0)+56|0;A=y+40|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0));k=c[ca>>2]|0;y=k+56|0;z=(c[p>>2]|0)+16|0;A=y+40|0;do{c[y>>2]=c[z>>2];y=y+4|0;z=z+4|0}while((y|0)<(A|0));a[k+112>>0]=1;c[k+116>>2]=o;o=ba}p=c[46776]|0;k=1;while(1){if((k|0)>=(u|0))break;aa=p+(k<<4)|0;h[aa>>3]=+(c[t>>2]|0)+ +h[aa>>3];k=k+1|0}n=c[46777]|0;k=0;while(1){if((k|0)>=(v|0))break;aa=n+(k<<4)|0;d=p+(k<<4)|0;c[aa>>2]=c[d>>2];c[aa+4>>2]=c[d+4>>2];c[aa+8>>2]=c[d+8>>2];c[aa+12>>2]=c[d+12>>2];k=k+1|0}bO(o,c[((c[o>>2]&3|0)==2?o:o+-48|0)+40>>2]|0,n,v,17336);q=q+1|0}}while(0);l=da;return}function pg(a){a=a|0;var b=0,d=0,e=0;b=gC(a)|0;while(1){if(!b)break;d=UA(a,b)|0;while(1){if(!d)break;if((pb[c[4334]&63](d)|0)<<24>>24?(e=c[(c[d+16>>2]|0)+8>>2]|0,e|0):0)qg(e);d=WA(a,d)|0}b=hC(a,b)|0}return}function qg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;f=c[a+4>>2]|0;g=IK(f*48|0)|0;b=g;d=0;e=(c[a>>2]|0)+((f+-1|0)*48|0)|0;while(1){if((d|0)>=(f|0)){b=0;break}rg(e,b);b=b+48|0;d=d+1|0;e=e+-48|0}while(1){d=c[a>>2]|0;if((b|0)>=(f|0))break;l6(c[d+(b*48|0)>>2]|0);b=b+1|0}l6(d);c[a>>2]=g;return}function rg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;g=c[a+4>>2]|0;h=IK(g<<4)|0;d=h;e=0;f=(c[a>>2]|0)+(g+-1<<4)|0;while(1){if((e|0)>=(g|0))break;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];d=d+16|0;e=e+1|0;f=f+-16|0}c[b>>2]=h;c[b+4>>2]=g;c[b+8>>2]=c[a+12>>2];c[b+12>>2]=c[a+8>>2];h=b+16|0;g=a+32|0;c[h>>2]=c[g>>2];c[h+4>>2]=c[g+4>>2];c[h+8>>2]=c[g+8>>2];c[h+12>>2]=c[g+12>>2];h=b+32|0;g=a+16|0;c[h>>2]=c[g>>2];c[h+4>>2]=c[g+4>>2];c[h+8>>2]=c[g+8>>2];c[h+12>>2]=c[g+12>>2];return}function sg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;y=l;l=l+96|0;r=y+80|0;t=y+64|0;s=y+48|0;v=y+32|0;w=y+16|0;x=y;n=d;while(1){u=n+16|0;g=c[u>>2]|0;if(!(a[g+112>>0]|0))break;n=c[g+116>>2]|0}g=c[n>>2]&3;q=c[((g|0)==2?n:n+-48|0)+40>>2]|0;g=c[((g|0)==3?n:n+48|0)+40>>2]|0;n=q+16|0;o=g+16|0;z=(c[(c[n>>2]|0)+232>>2]|0)-(c[(c[o>>2]|0)+232>>2]|0)|0;switch(((z|0)>-1?z:0-z|0)|0){case 1:{g=0;break}case 2:{if(!(a[(c[(c[b+60>>2]|0)+16>>2]|0)+113>>0]&1))p=6;else g=0;break}default:p=6}do if((p|0)==6){if((c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0)==(g|0)){c[f>>2]=q;z=(c[o>>2]|0)+16|0;p=(c[u>>2]|0)+16|0;c[t>>2]=c[z>>2];c[t+4>>2]=c[z+4>>2];c[t+8>>2]=c[z+8>>2];c[t+12>>2]=c[z+12>>2];c[r>>2]=c[p>>2];c[r+4>>2]=c[p+4>>2];c[r+8>>2]=c[p+8>>2];c[r+12>>2]=c[p+12>>2];Kg(v,t,r);p=(c[n>>2]|0)+16|0;z=(c[u>>2]|0)+56|0;c[t>>2]=c[p>>2];c[t+4>>2]=c[p+4>>2];c[t+8>>2]=c[p+8>>2];c[t+12>>2]=c[p+12>>2];c[r>>2]=c[z>>2];c[r+4>>2]=c[z+4>>2];c[r+8>>2]=c[z+8>>2];c[r+12>>2]=c[z+12>>2];Kg(w,t,r)}else{c[f>>2]=g;z=(c[n>>2]|0)+16|0;p=(c[u>>2]|0)+56|0;c[t>>2]=c[z>>2];c[t+4>>2]=c[z+4>>2];c[t+8>>2]=c[z+8>>2];c[t+12>>2]=c[z+12>>2];c[r>>2]=c[p>>2];c[r+4>>2]=c[p+4>>2];c[r+8>>2]=c[p+8>>2];c[r+12>>2]=c[p+12>>2];Kg(v,t,r);p=(c[o>>2]|0)+16|0;z=(c[u>>2]|0)+16|0;c[t>>2]=c[p>>2];c[t+4>>2]=c[p+4>>2];c[t+8>>2]=c[p+8>>2];c[t+12>>2]=c[p+12>>2];c[r>>2]=c[z>>2];c[r+4>>2]=c[z+4>>2];c[r+8>>2]=c[z+8>>2];c[r+12>>2]=c[z+12>>2];Kg(w,t,r)}g=c[(c[u>>2]|0)+96>>2]|0;n=e+16|0;o=e+32|0;b=e+48|0;if(!g){c[e>>2]=c[v>>2];c[e+4>>2]=c[v+4>>2];c[e+8>>2]=c[v+8>>2];c[e+12>>2]=c[v+12>>2];c[n>>2]=c[v>>2];c[n+4>>2]=c[v+4>>2];c[n+8>>2]=c[v+8>>2];c[n+12>>2]=c[v+12>>2];c[o>>2]=c[w>>2];c[o+4>>2]=c[w+4>>2];c[o+8>>2]=c[w+8>>2];c[o+12>>2]=c[w+12>>2];c[b>>2]=c[w>>2];c[b+4>>2]=c[w+4>>2];c[b+8>>2]=c[w+8>>2];c[b+12>>2]=c[w+12>>2];g=4;break}k=+h[g+24>>3];m=+h[g+32>>3];q=(c[(c[(uC(q)|0)+16>>2]|0)+116>>2]&1|0)==0;z=(c[(c[u>>2]|0)+96>>2]|0)+56|0;c[x>>2]=c[z>>2];c[x+4>>2]=c[z+4>>2];c[x+8>>2]=c[z+8>>2];c[x+12>>2]=c[z+12>>2];c[s>>2]=c[w>>2];c[s+4>>2]=c[w+4>>2];c[s+8>>2]=c[w+8>>2];c[s+12>>2]=c[w+12>>2];c[t>>2]=c[v>>2];c[t+4>>2]=c[v+4>>2];c[t+8>>2]=c[v+8>>2];c[t+12>>2]=c[v+12>>2];c[r>>2]=c[z>>2];c[r+4>>2]=c[z+4>>2];c[r+8>>2]=c[z+8>>2];c[r+12>>2]=c[z+12>>2];z=(Lg(s,t,r)|0)==0;i=(q?k:m)*.5;j=+h[x>>3];g=x+8|0;k=(q?m:k)*.5;m=+h[g>>3];if(z){h[x>>3]=j-i;i=k+m}else{h[x>>3]=i+j;i=m-k}h[g>>3]=i;c[e>>2]=c[v>>2];c[e+4>>2]=c[v+4>>2];c[e+8>>2]=c[v+8>>2];c[e+12>>2]=c[v+12>>2];c[n>>2]=c[v>>2];c[n+4>>2]=c[v+4>>2];c[n+8>>2]=c[v+8>>2];c[n+12>>2]=c[v+12>>2];g=e+64|0;c[g>>2]=c[x>>2];c[g+4>>2]=c[x+4>>2];c[g+8>>2]=c[x+8>>2];c[g+12>>2]=c[x+12>>2];c[b>>2]=c[x>>2];c[b+4>>2]=c[x+4>>2];c[b+8>>2]=c[x+8>>2];c[b+12>>2]=c[x+12>>2];c[o>>2]=c[x>>2];c[o+4>>2]=c[x+4>>2];c[o+8>>2]=c[x+8>>2];c[o+12>>2]=c[x+12>>2];g=e+80|0;z=e+96|0;c[z>>2]=c[w>>2];c[z+4>>2]=c[w+4>>2];c[z+8>>2]=c[w+8>>2];c[z+12>>2]=c[w+12>>2];c[g>>2]=c[w>>2];c[g+4>>2]=c[w+4>>2];c[g+8>>2]=c[w+8>>2];c[g+12>>2]=c[w+12>>2];g=7}while(0);l=y;return g|0}function tg(b,d,e,f,g,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0.0,k=0,l=0,m=0.0,n=0,o=0.0,p=0,q=0.0,r=0,s=0;s=c[f+16>>2]|0;q=+h[s+16>>3];m=q-+h[s+88>>3]+-4.0;k=Gg(d,f,g,i,-1)|0;p=e+8|0;r=d+16|0;if(!k){n=~~(m+(m>=0.0?.5:-.5));k=c[e>>2]|0;k=(n|0)<(k|0)?n:k}else{l=Hg(d,f,k)|0;do if(!l){n=c[k+16>>2]|0;j=+h[n+16>>3]+ +h[n+240>>3];if(!(a[n+156>>0]|0)){j=j+ +(c[(c[r>>2]|0)+248>>2]|0)*.5;break}else{j=j+ +(c[p>>2]|0);break}}else j=+h[(c[l+16>>2]|0)+32>>3]+ +(c[p>>2]|0);while(0);o=j=0.0?.5:-.5))}o=+(k|0);n=(a[s+156>>0]|0)==1;if(n?(c[s+104>>2]|0)!=0:0)m=q+10.0;else m=q+ +h[s+96>>3]+4.0;l=Gg(d,f,g,i,1)|0;if(!l){p=~~(m+(m>=0.0?.5:-.5));k=c[e+4>>2]|0;k=(p|0)>(k|0)?p:k}else{k=Hg(d,f,l)|0;do if(!k){f=c[l+16>>2]|0;j=+h[f+16>>3]-+h[f+88>>3];if(!(a[f+156>>0]|0)){j=j-+(c[(c[r>>2]|0)+248>>2]|0)*.5;break}else{j=j-+(c[p>>2]|0);break}}else j=+h[(c[k+16>>2]|0)+16>>3]-+(c[p>>2]|0);while(0);m=j>m?j:m;k=~~(m+(m>=0.0?.5:-.5))}j=+(k|0);if(n?(c[s+104>>2]|0)!=0:0){j=j-+h[s+96>>3];if(j>3];r=c[(c[r>>2]|0)+196>>2]|0;s=c[s+232>>2]|0;m=q-+h[r+(s<<6)+16>>3];q=q+ +h[r+(s<<6)+24>>3];h[b>>3]=o;h[b+8>>3]=m;h[b+16>>3]=j;h[b+24>>3]=q;return}function ug(b){b=b|0;b=c[b+16>>2]|0;if((a[b+156>>0]|0)==1)if((c[b+176>>2]|0)>1)b=1;else b=(c[b+184>>2]|0)>1&1;else b=0;return b|0}function vg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0,g=0,i=0;i=l;l=l+32|0;f=i;g=b+16|0;switch(d|0){case 1:{Fg(f,+h[b>>3],e,+h[g>>3],+h[b+8>>3]);break}case 4:{Fg(f,+h[b>>3],+h[b+24>>3],+h[g>>3],e);break}default:{}}c[a>>2]=c[f>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];c[a+16>>2]=c[f+16>>2];c[a+20>>2]=c[f+20>>2];c[a+24>>2]=c[f+24>>2];c[a+28>>2]=c[f+28>>2];l=i;return}function wg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0,k=0,l=0,m=0,n=0,o=0;l=c[b+16>>2]|0;k=l+(e<<5)|0;j=+h[k>>3];m=l+(e<<5)+8|0;g=+h[m>>3];n=l+(e<<5)+16|0;f=+h[n>>3];l=l+(e<<5)+24|0;i=+h[l>>3];if(j==f){d=c[(c[d+16>>2]|0)+196>>2]|0;o=e+1|0;j=+(c[b>>2]|0);g=+h[(c[(c[c[d+(o<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]+ +h[d+(o<<6)+24>>3];f=+(c[b+4>>2]|0);i=+h[(c[(c[c[d+(e<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]-+h[d+(e<<6)+16>>3];h[k>>3]=j;h[m>>3]=g;h[n>>3]=f;h[l>>3]=i}h[a>>3]=j;h[a+8>>3]=g;h[a+16>>3]=f;h[a+24>>3]=i;return}function xg(b){b=b|0;var d=0,e=0;b=c[b+16>>2]|0;e=b+16|0;d=0;while(1){b=c[c[b+180>>2]>>2]|0;b=c[(c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)+16>>2]|0;if((a[b+156>>0]|0)!=1)break;if((c[b+184>>2]|0)!=1)break;if((c[b+176>>2]|0)!=1)break;if(+h[b+16>>3]!=+h[e>>3])break;d=d+1|0}return d|0}function yg(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;k=l;l=l+32|0;j=k;h=Cg(b,-1)|0;b=Cg(b,1)|0;if(!((h|0)!=0?!(sO(h)|0):0))i=3;do if((i|0)==3){if(b|0?(sO(b)|0)==0:0)break;h=Dg(d,-1)|0;b=Dg(d,1)|0;if(h|0?(sO(h)|0)==0:0)break;if(b|0?(sO(b)|0)==0:0)break;h=e+52|0;b=0;while(1){if((b|0)>=(c[h>>2]|0))break;d=e+56+(b<<5)|0;c[j>>2]=c[d>>2];c[j+4>>2]=c[d+4>>2];c[j+8>>2]=c[d+8>>2];c[j+12>>2]=c[d+12>>2];c[j+16>>2]=c[d+16>>2];c[j+20>>2]=c[d+20>>2];c[j+24>>2]=c[d+24>>2];c[j+28>>2]=c[d+28>>2];dO(a,j);b=b+1|0}h=c[a+80>>2]|0;i=g+-3|0;b=0;while(1){if((b|0)>=(g|0))break;e=153872+(b<<5)|0;c[j>>2]=c[e>>2];c[j+4>>2]=c[e+4>>2];c[j+8>>2]=c[e+8>>2];c[j+12>>2]=c[e+12>>2];c[j+16>>2]=c[e+16>>2];c[j+20>>2]=c[e+20>>2];c[j+24>>2]=c[e+24>>2];c[j+28>>2]=c[e+28>>2];dO(a,j);b=b+1|0}d=h+1|0;i=i+d|0;h=c[f+52>>2]|0;while(1){b=h+-1|0;if((h|0)<=0)break;h=f+56+(b<<5)|0;c[j>>2]=c[h>>2];c[j+4>>2]=c[h+4>>2];c[j+8>>2]=c[h+8>>2];c[j+12>>2]=c[h+12>>2];c[j+16>>2]=c[h+16>>2];c[j+20>>2]=c[h+20>>2];c[j+24>>2]=c[h+24>>2];c[j+28>>2]=c[h+28>>2];dO(a,j);h=b}Eg(a,d,i)}while(0);l=k;return}function zg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=c[e>>2]|0;while(1){if(!b)break;a=c[c[(c[(c[((c[a>>2]&3|0)==2?a:a+-48|0)+40>>2]|0)+16>>2]|0)+180>>2]>>2]|0;b=b+-1|0}c[e>>2]=f+1;g=d+(f<<4)|0;b=d+(f+-1<<4)|0;c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];f=c[e>>2]|0;c[e>>2]=f+1;f=d+(f<<4)|0;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];f=d+(c[e>>2]<<4)|0;e=(c[(c[((c[a>>2]&3|0)==3?a:a+48|0)+40>>2]|0)+16>>2]|0)+16|0;c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[f+12>>2]=c[e+12>>2];return a|0}function Ag(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0.0,i=0,j=0,k=0,l=0,m=0,n=0;n=d+80|0;m=d+84|0;e=0;d=b;a:while(1){k=c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0;l=k+16|0;if((a[(c[l>>2]|0)+156>>0]|0)!=1)break;if((pb[c[17340>>2]&63](k)|0)<<24>>24)break;d=c[n>>2]|0;while(1){if((e|0)>=(d|0))break a;b=c[m>>2]|0;j=c[l>>2]|0;f=+h[j+24>>3];if(!(+h[b+(e<<5)+8>>3]>f))break;e=e+1|0}do if(!(+h[b+(e<<5)+24>>3]>3];i=~~g;f=+h[b+(e<<5)+16>>3];d=~~f;if(!(c[j+104>>2]|0)){Bg(k,i,~~((g+f)*.5),d);break}else{Bg(k,i,d,~~(f+ +h[j+96>>3]));break}}while(0);d=c[c[(c[l>>2]|0)+180>>2]>>2]|0}return}function Bg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=c[a+16>>2]|0;h[a+16>>3]=+(d|0);h[a+88>>3]=+(d-b|0);h[a+96>>3]=+(e-d|0);return}function Cg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=c[a>>2]&3;i=c[(c[(c[((h|0)==3?a:a+48|0)+40>>2]|0)+16>>2]|0)+180>>2]|0;h=((h|0)==2?a:a+-48|0)+40|0;g=0;a=0;while(1){e=c[i+(g<<2)>>2]|0;if(!e)break;f=c[(c[(c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0;do if((S(f-(c[(c[(c[h>>2]|0)+16>>2]|0)+236>>2]|0)|0,b)|0)>=1){d=c[e+16>>2]|0;if(!(c[d+8>>2]|0)){d=c[d+116>>2]|0;if(!d)break;if(!(c[(c[d+16>>2]|0)+8>>2]|0))break}if(a|0?(S((c[(c[(c[((c[a>>2]&3|0)==2?a:a+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0)-f|0,b)|0)<=0:0)break;a=e}while(0);g=g+1|0}return a|0}function Dg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=c[a>>2]&3;i=c[(c[(c[((h|0)==2?a:a+-48|0)+40>>2]|0)+16>>2]|0)+172>>2]|0;h=((h|0)==3?a:a+48|0)+40|0;g=0;a=0;while(1){e=c[i+(g<<2)>>2]|0;if(!e)break;f=c[(c[(c[((c[e>>2]&3|0)==3?e:e+48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0;do if((S(f-(c[(c[(c[h>>2]|0)+16>>2]|0)+236>>2]|0)|0,b)|0)>=1){d=c[e+16>>2]|0;if(!(c[d+8>>2]|0)){d=c[d+116>>2]|0;if(!d)break;if(!(c[(c[d+16>>2]|0)+8>>2]|0))break}if(a|0?(S((c[(c[(c[((c[a>>2]&3|0)==3?a:a+48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0)-f|0,b)|0)<=0:0)break;a=e}while(0);g=g+1|0}return a|0}function Eg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,i=0,j=0.0,k=0.0,l=0.0,m=0,n=0,o=0,p=0;p=a+84|0;f=b+-1|0;while(1){if((f|0)>(d|0))break;i=c[p>>2]|0;g=i+(f<<5)|0;e=+h[g>>3];i=i+(f<<5)+16|0;j=+h[i>>3];o=~~((e+j)*.5);k=+(o+-8|0);l=+(o+8|0);if(!(f-b&1)){if(e>=j){h[g>>3]=k;h[i>>3]=l}}else if(e+16.0>j){h[g>>3]=k;h[i>>3]=l}f=f+1|0}o=(c[a+80>>2]|0)+-1|0;f=0;while(1){if((f|0)>=(o|0))break;g=c[p>>2]|0;n=f+1|0;i=g+(n<<5)|0;m=g+(f<<5)+16|0;a=g+(n<<5)+16|0;g=g+(f<<5)|0;if(!((f|0)<(b|0)|(f|0)>(d|0))?(f-b&1|0)==0:0){e=+h[g>>3]+16.0;if(e>+h[a>>3])h[a>>3]=e;e=+h[m>>3]+-16.0;if(!(e<+h[i>>3])){f=n;continue}h[i>>3]=e;f=n;continue}if(!((f|0)<(d|0)&(n|0)>=(b|0))){f=n;continue}if(n-b&1|0){f=n;continue}e=+h[a>>3];if(+h[g>>3]+16.0>e)h[g>>3]=e+-16.0;e=+h[i>>3];if(!(+h[m>>3]+-16.0>3]=e+16.0;f=n}return}function Fg(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;h[a>>3]=b;h[a+8>>3]=c;h[a+16>>3]=d;h[a+24>>3]=e;return}function Gg(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;k=c[(c[b+16>>2]|0)+196>>2]|0;h=c[d+16>>2]|0;j=c[h+232>>2]|0;i=k+(j<<6)|0;j=k+(j<<6)+4|0;h=c[h+236>>2]|0;a:do{h=h+g|0;if((h|0)<=-1){b=0;break}if((h|0)>=(c[i>>2]|0)){b=0;break}b=c[(c[j>>2]|0)+(h<<2)>>2]|0;k=c[b+16>>2]|0;switch(a[k+156>>0]|0){case 0:break a;case 1:{if(c[k+104>>2]|0)break a;break}default:{}}}while((Jg(b,d,e,f)|0)<<24>>24!=0);return b|0}function Hg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;d=c[d+16>>2]|0;if(!(a[d+156>>0]|0)){i=c[d+212>>2]|0;h=i}else{i=c[(c[(c[c[d+180>>2]>>2]|0)+16>>2]|0)+116>>2]|0;g=c[i>>2]&3;h=c[(c[(c[((g|0)==2?i:i+-48|0)+40>>2]|0)+16>>2]|0)+212>>2]|0;i=c[(c[(c[((g|0)==3?i:i+48|0)+40>>2]|0)+16>>2]|0)+212>>2]|0}d=c[e+16>>2]|0;if(!(a[d+156>>0]|0)){e=c[d+212>>2]|0;e=(e|0)==(b|0)?0:e;return ((e|0)==(h|0)|((e|0)==0|(e|0)==(i|0))?0:e)|0}f=c[(c[(c[c[d+180>>2]>>2]|0)+16>>2]|0)+116>>2]|0;g=c[f>>2]&3;d=c[(c[(c[((g|0)==3?f:f+48|0)+40>>2]|0)+16>>2]|0)+212>>2]|0;d=(d|0)==(b|0)?0:d;if(!(!((d|0)==(h|0)|((d|0)==0|(d|0)==(i|0)))?(Ig(d,e)|0)!=0:0)){d=c[(c[(c[((g|0)==2?f:f+-48|0)+40>>2]|0)+16>>2]|0)+212>>2]|0;d=(d|0)==(b|0)?0:d;if((d|0)==(h|0)|((d|0)==0|(d|0)==(i|0)))d=0;else{e=(Ig(d,e)|0)==0;return (e?0:d)|0}}return d|0}function Ig(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0;d=c[a+16>>2]|0;a=c[b+16>>2]|0;f=+h[a+16>>3];if((+h[d+16>>3]<=f?f<=+h[d+32>>3]:0)?(e=+h[a+24>>3],+h[d+24>>3]<=e):0)a=e<=+h[d+40>>3];else a=0;return a&1|0}function Jg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;i=c[b+16>>2]|0;j=(c[i+236>>2]|0)>(c[(c[d+16>>2]|0)+236>>2]|0);a:do if((c[i+184>>2]|0)==1){b:do if(f|0){h=0;b=c[c[i+180>>2]>>2]|0;while(1){if((h|0)>=2)break b;b=c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0;d=c[((c[f>>2]&3|0)==2?f:f+-48|0)+40>>2]|0;if((b|0)==(d|0))break b;g=c[b+16>>2]|0;b=c[d+16>>2]|0;if(j^(c[g+236>>2]|0)>(c[b+236>>2]|0)){b=1;break a}if((c[g+184>>2]|0)!=1)break b;if(!(a[g+156>>0]|0))break b;if((c[b+184>>2]|0)!=1)break b;if(!(a[b+156>>0]|0))break b;h=h+1|0;f=c[c[b+180>>2]>>2]|0;b=c[c[g+180>>2]>>2]|0}}while(0);if(e|0?(c[i+176>>2]|0)==1:0){g=0;d=e;b=c[c[i+172>>2]>>2]|0;while(1){if((g|0)>=2){b=0;break a}b=c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0;d=c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0;if((b|0)==(d|0)){b=0;break a}f=c[b+16>>2]|0;b=c[d+16>>2]|0;if(j^(c[f+236>>2]|0)>(c[b+236>>2]|0)){b=1;break a}if((c[f+176>>2]|0)!=1){b=0;break a}if(!(a[f+156>>0]|0)){b=0;break a}if((c[b+176>>2]|0)!=1){b=0;break a}if(!(a[b+156>>0]|0)){b=0;break a}g=g+1|0;d=c[c[b+172>>2]>>2]|0;b=c[c[f+172>>2]>>2]|0}}else b=0}else b=0;while(0);return b|0}function Kg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=+h[b+8>>3]+ +h[c+8>>3];h[a>>3]=+h[b>>3]+ +h[c>>3];h[a+8>>3]=d;return}function Lg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0;e=+h[b+8>>3];d=+h[b>>3];return (~~((+h[a+8>>3]-e)*(+h[c>>3]-d)-(+h[c+8>>3]-e)*(+h[a>>3]-d))|0)>0|0}function Mg(b,d,e,f,g,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;S=l;l=l+256|0;E=S+232|0;D=S+216|0;Q=S+88|0;P=S+80|0;L=S+64|0;M=S+200|0;N=S+184|0;O=S;F=S+168|0;G=S+152|0;H=S+136|0;I=S+120|0;J=S+104|0;C=c[g>>2]&3;K=c[((C|0)==3?g:g+48|0)+40>>2]|0;C=c[((C|0)==2?g:g+-48|0)+40>>2]|0;do if((UM(K)|0)!=2?(UM(C)|0)!=2:0){g=0;j=0;m=0;while(1){if((m|0)>=(f|0))break;B=c[(c[d+(m+e<<2)>>2]|0)+16>>2]|0;g=((c[B+96>>2]|0)!=0&1)+g|0;if(!((a[B+44>>0]|0)==0?(a[B+84>>0]|0)==0:0))j=1;m=m+1|0}if(!j)if(!g){Og(K,C,d,e,f,i);break}else{Tg(K,C,d,e,f,i,g);break}z=HK(156)|0;A=Ug(b,z)|0;w=LD(A,85750,1)|0;RC(w,137786,280,1)|0;PA(w,87443,87457)|0;k=+h[(c[C+16>>2]|0)+16>>3];n=+h[(c[K+16>>2]|0)+16>>3];B=b+16|0;u=(c[(c[B>>2]|0)+116>>2]&1|0)==0;v=u?C:K;u=u?K:C;w=Vg(w,u)|0;x=Vg(A,v)|0;g=0;t=0;while(1){s=(g|0)!=0;if((t|0)>=(f|0))break;j=d+(t+e<<2)|0;while(1){r=c[j>>2]|0;q=r+16|0;j=c[q>>2]|0;if(!(a[j+112>>0]|0))break;else j=j+116|0}if((c[((c[r>>2]&3|0)==3?r:r+48|0)+40>>2]|0)==(u|0))m=Wg(A,w,x,r)|0;else m=Wg(A,x,w,r)|0;j=c[q>>2]|0;c[j+120>>2]=m;if(!s)if((a[j+44>>0]|0)==0?(a[j+84>>0]|0)==0:0){c[(c[m+16>>2]|0)+120>>2]=r;g=m}else g=0;t=t+1|0}if(s)y=g;else y=fB(A,w,x,0,1)|0;HA(y,c[47236]|0,85754)|0;g=A+16|0;r=c[g>>2]|0;c[r+144>>2]=c[(c[B>>2]|0)+144>>2];c[r+188>>2]=A;mQ(A,i);Lf(A);uj(A,0);Eh(A,0);Hi(A,0);r=u+16|0;u=c[r>>2]|0;i=c[v+16>>2]|0;s=w+16|0;p=+(~~((+h[(c[s>>2]|0)+16>>3]+ +h[(c[x+16>>2]|0)+16>>3])*.5)|0);o=+(~~k|0);k=+(~~n|0);n=+(~~((+h[u+16>>3]-+h[u+96>>3]+ +h[i+16>>3]+ +h[i+88>>3])*.5)|0);g=(c[g>>2]|0)+192|0;while(1){g=c[g>>2]|0;if(!g)break;j=c[g+16>>2]|0;m=j+16|0;q=j+24|0;do if((g|0)!=(w|0))if((g|0)==(x|0)){h[q>>3]=k;h[m>>3]=p;break}else{h[q>>3]=n;break}else{h[q>>3]=o;h[m>>3]=p}while(0);g=j+164|0}ok(A);gg(A,0);rM(A);w=c[r>>2]|0;p=+h[w+16>>3];x=c[s>>2]|0;k=+h[w+24>>3];n=+h[x+16>>3];o=+h[x+24>>3];if(!(c[(c[B>>2]|0)+116>>2]&1)){h[L>>3]=p-n;k=k-o}else{h[L>>3]=p-o;k=k+n}h[L+8>>3]=k;v=O+16|0;i=O+32|0;w=O+48|0;u=0;while(1){if((u|0)>=(f|0))break;g=d+(u+e<<2)|0;while(1){j=c[g>>2]|0;t=j+16|0;g=c[t>>2]|0;if(!(a[g+112>>0]|0))break;else g=g+116|0}x=c[g+120>>2]|0;s=x+16|0;g=c[s>>2]|0;if(!((x|0)==(y|0)&(c[g+120>>2]|0)==0)){q=c[c[g+8>>2]>>2]|0;r=q+4|0;j=aO(j,c[r>>2]|0)|0;c[j+8>>2]=c[q+8>>2];g=j+16|0;x=q+16|0;m=c[(c[B>>2]|0)+116>>2]&1;c[D>>2]=c[x>>2];c[D+4>>2]=c[x+4>>2];c[D+8>>2]=c[x+8>>2];c[D+12>>2]=c[x+12>>2];c[E>>2]=c[L>>2];c[E+4>>2]=c[L+4>>2];c[E+8>>2]=c[L+8>>2];c[E+12>>2]=c[L+12>>2];Xg(M,D,E,m);c[g>>2]=c[M>>2];c[g+4>>2]=c[M+4>>2];c[g+8>>2]=c[M+8>>2];c[g+12>>2]=c[M+12>>2];c[j+12>>2]=c[q+12>>2];g=j+32|0;m=q+32|0;x=c[(c[B>>2]|0)+116>>2]&1;c[D>>2]=c[m>>2];c[D+4>>2]=c[m+4>>2];c[D+8>>2]=c[m+8>>2];c[D+12>>2]=c[m+12>>2];c[E>>2]=c[L>>2];c[E+4>>2]=c[L+4>>2];c[E+8>>2]=c[L+8>>2];c[E+12>>2]=c[L+12>>2];Xg(N,D,E,x);c[g>>2]=c[N>>2];c[g+4>>2]=c[N+4>>2];c[g+8>>2]=c[N+8>>2];c[g+12>>2]=c[N+12>>2];g=0;while(1){if((g|0)>=(c[r>>2]|0))break;m=(c[j>>2]|0)+(g<<4)|0;T=(c[q>>2]|0)+(g<<4)|0;x=c[(c[B>>2]|0)+116>>2]&1;c[D>>2]=c[T>>2];c[D+4>>2]=c[T+4>>2];c[D+8>>2]=c[T+8>>2];c[D+12>>2]=c[T+12>>2];c[E>>2]=c[L>>2];c[E+4>>2]=c[L+4>>2];c[E+8>>2]=c[L+8>>2];c[E+12>>2]=c[L+12>>2];Xg(F,D,E,x);c[m>>2]=c[F>>2];c[m+4>>2]=c[F+4>>2];c[m+8>>2]=c[F+8>>2];c[m+12>>2]=c[F+12>>2];c[O>>2]=c[F>>2];c[O+4>>2]=c[F+4>>2];c[O+8>>2]=c[F+8>>2];c[O+12>>2]=c[F+12>>2];m=g+1|0;if((m|0)>=(c[r>>2]|0)){R=48;break}x=(c[j>>2]|0)+(m<<4)|0;m=(c[q>>2]|0)+(m<<4)|0;T=c[(c[B>>2]|0)+116>>2]&1;c[D>>2]=c[m>>2];c[D+4>>2]=c[m+4>>2];c[D+8>>2]=c[m+8>>2];c[D+12>>2]=c[m+12>>2];c[E>>2]=c[L>>2];c[E+4>>2]=c[L+4>>2];c[E+8>>2]=c[L+8>>2];c[E+12>>2]=c[L+12>>2];Xg(G,D,E,T);c[x>>2]=c[G>>2];c[x+4>>2]=c[G+4>>2];c[x+8>>2]=c[G+8>>2];c[x+12>>2]=c[G+12>>2];c[v>>2]=c[G>>2];c[v+4>>2]=c[G+4>>2];c[v+8>>2]=c[G+8>>2];c[v+12>>2]=c[G+12>>2];x=g+2|0;T=(c[j>>2]|0)+(x<<4)|0;x=(c[q>>2]|0)+(x<<4)|0;m=c[(c[B>>2]|0)+116>>2]&1;c[D>>2]=c[x>>2];c[D+4>>2]=c[x+4>>2];c[D+8>>2]=c[x+8>>2];c[D+12>>2]=c[x+12>>2];c[E>>2]=c[L>>2];c[E+4>>2]=c[L+4>>2];c[E+8>>2]=c[L+8>>2];c[E+12>>2]=c[L+12>>2];Xg(H,D,E,m);c[T>>2]=c[H>>2];c[T+4>>2]=c[H+4>>2];c[T+8>>2]=c[H+8>>2];c[T+12>>2]=c[H+12>>2];c[i>>2]=c[H>>2];c[i+4>>2]=c[H+4>>2];c[i+8>>2]=c[H+8>>2];c[i+12>>2]=c[H+12>>2];T=g+3|0;m=(c[q>>2]|0)+(T<<4)|0;x=c[(c[B>>2]|0)+116>>2]&1;c[D>>2]=c[m>>2];c[D+4>>2]=c[m+4>>2];c[D+8>>2]=c[m+8>>2];c[D+12>>2]=c[m+12>>2];c[E>>2]=c[L>>2];c[E+4>>2]=c[L+4>>2];c[E+8>>2]=c[L+8>>2];c[E+12>>2]=c[L+12>>2];Xg(I,D,E,x);c[w>>2]=c[I>>2];c[w+4>>2]=c[I+4>>2];c[w+8>>2]=c[I+8>>2];c[w+12>>2]=c[I+12>>2];jI((c[B>>2]|0)+16|0,O);g=T}if((R|0)==48)R=0;g=c[(c[t>>2]|0)+96>>2]|0;if(g|0){T=g+56|0;s=(c[(c[s>>2]|0)+96>>2]|0)+56|0;x=c[(c[B>>2]|0)+116>>2]&1;c[D>>2]=c[s>>2];c[D+4>>2]=c[s+4>>2];c[D+8>>2]=c[s+8>>2];c[D+12>>2]=c[s+12>>2];c[E>>2]=c[L>>2];c[E+4>>2]=c[L+4>>2];c[E+8>>2]=c[L+8>>2];c[E+12>>2]=c[L+12>>2];Xg(J,D,E,x);c[T>>2]=c[J>>2];c[T+4>>2]=c[J+4>>2];c[T+8>>2]=c[J+8>>2];c[T+12>>2]=c[J+12>>2];T=c[(c[t>>2]|0)+96>>2]|0;a[T+81>>0]=1;xP(b,T)}}u=u+1|0}Yg(A,z)}else R=3;while(0);if((R|0)==3?(c[46780]|0)==0:0){c[46780]=1;dA(0,85627,P)|0;P=HB(K)|0;R=(uB(b)|0)!=0;T=HB(C)|0;c[Q>>2]=P;c[Q+4>>2]=R?138041:142050;c[Q+8>>2]=T;dA(3,85733,Q)|0}l=S;return}function Ng(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0;z=l;l=l+1600|0;u=z+1552|0;n=z+1536|0;t=z+840|0;v=z+144|0;w=z+1584|0;j=z+32|0;s=z+16|0;o=z;q=c[f>>2]&3;p=c[((q|0)==3?f:f+48|0)+40>>2]|0;x=f+-48|0;q=c[((q|0)==2?f:x)+40>>2]|0;r=f+16|0;k=c[r>>2]|0;i=c[k+172>>2]|0;while(1){m=c[(c[i+16>>2]|0)+172>>2]|0;if(!m)break;else i=m}k=(c[k+96>>2]|0)+56|0;i=(c[((c[i>>2]&3|0)==3?i:i+48|0)+40>>2]|0)+16|0;m=(c[i>>2]|0)+16|0;c[k>>2]=c[m>>2];c[k+4>>2]=c[m+4>>2];c[k+8>>2]=c[m+8>>2];c[k+12>>2]=c[m+12>>2];k=c[r>>2]|0;a[(c[k+96>>2]|0)+81>>0]=1;m=c[p+16>>2]|0;if((g|0)!=2){k=c[i>>2]|0;C=+h[k+16>>3];E=C-+h[k+88>>3];C=C+ +h[k+96>>3];B=+h[k+24>>3];D=B+ +h[k+80>>3]*.5;k=c[(c[b+16>>2]|0)+196>>2]|0;j=c[m+232>>2]|0;B=+(~~(+(~~(B-+h[k+(j<<6)+16>>3]-+h[m+24>>3]+ +h[k+(j<<6)+24>>3])|0)/6.0)|0);B=D-(B<5.0?5.0:B);Qg(b,d,e,p,f,t,1);Qg(b,d,e,q,f,v,0);j=t+52|0;k=c[j>>2]|0;m=k+-1|0;A=+h[t+56+(m<<5)>>3];h[19234]=A;h[19235]=+h[t+56+(m<<5)+24>>3];h[19236]=E;h[19237]=B;h[19238]=A;h[19239]=B;m=v+52|0;i=(c[m>>2]|0)+-1|0;A=+h[v+56+(i<<5)+16>>3];h[19240]=A;h[19241]=D;h[19242]=C;h[19245]=B;h[19243]=+h[v+56+(i<<5)+24>>3];h[19244]=A;i=0;while(1){if((i|0)>=(k|0)){i=0;break}k=t+56+(i<<5)|0;c[u>>2]=c[k>>2];c[u+4>>2]=c[k+4>>2];c[u+8>>2]=c[k+8>>2];c[u+12>>2]=c[k+12>>2];c[u+16>>2]=c[k+16>>2];c[u+20>>2]=c[k+20>>2];c[u+24>>2]=c[k+24>>2];c[u+28>>2]=c[k+28>>2];dO(e,u);i=i+1|0;k=c[j>>2]|0}while(1){if((i|0)==3)break;t=153872+(i<<5)|0;c[u>>2]=c[t>>2];c[u+4>>2]=c[t+4>>2];c[u+8>>2]=c[t+8>>2];c[u+12>>2]=c[t+12>>2];c[u+16>>2]=c[t+16>>2];c[u+20>>2]=c[t+20>>2];c[u+24>>2]=c[t+24>>2];c[u+28>>2]=c[t+28>>2];dO(e,u);i=i+1|0}j=c[m>>2]|0;while(1){i=j+-1|0;if((j|0)<=0)break;j=v+56+(i<<5)|0;c[u>>2]=c[j>>2];c[u+4>>2]=c[j+4>>2];c[u+8>>2]=c[j+8>>2];c[u+12>>2]=c[j+12>>2];c[u+16>>2]=c[j+16>>2];c[u+20>>2]=c[j+20>>2];c[u+24>>2]=c[j+24>>2];c[u+28>>2]=c[j+28>>2];dO(e,u);j=i}if((g|0)==10)j=FM(e,w)|0;else j=LM(e,w)|0;i=c[w>>2]|0;if(i|0)y=17}else{i=m+16|0;v=k+16|0;c[n>>2]=c[i>>2];c[n+4>>2]=c[i+4>>2];c[n+8>>2]=c[i+8>>2];c[n+12>>2]=c[i+12>>2];c[u>>2]=c[v>>2];c[u+4>>2]=c[v+4>>2];c[u+8>>2]=c[v+8>>2];c[u+12>>2]=c[v+12>>2];Kg(s,n,u);v=(c[q+16>>2]|0)+16|0;i=(c[r>>2]|0)+56|0;c[n>>2]=c[v>>2];c[n+4>>2]=c[v+4>>2];c[n+8>>2]=c[v+8>>2];c[n+12>>2]=c[v+12>>2];c[u>>2]=c[i>>2];c[u+4>>2]=c[i+4>>2];c[u+8>>2]=c[i+8>>2];c[u+12>>2]=c[i+12>>2];Kg(o,n,u);i=c[(c[r>>2]|0)+96>>2]|0;D=+h[i+56>>3];E=+h[i+64>>3]-+h[i+32>>3]*.5;i=j+16|0;c[j>>2]=c[s>>2];c[j+4>>2]=c[s+4>>2];c[j+8>>2]=c[s+8>>2];c[j+12>>2]=c[s+12>>2];c[i>>2]=c[s>>2];c[i+4>>2]=c[s+4>>2];c[i+8>>2]=c[s+8>>2];c[i+12>>2]=c[s+12>>2];i=j+32|0;v=j+48|0;y=j+64|0;h[j+64>>3]=D;h[j+72>>3]=E;c[v>>2]=c[y>>2];c[v+4>>2]=c[y+4>>2];c[v+8>>2]=c[y+8>>2];c[v+12>>2]=c[y+12>>2];c[i>>2]=c[y>>2];c[i+4>>2]=c[y+4>>2];c[i+8>>2]=c[y+8>>2];c[i+12>>2]=c[y+12>>2];i=j+80|0;y=j+96|0;c[y>>2]=c[o>>2];c[y+4>>2]=c[o+4>>2];c[y+8>>2]=c[o+8>>2];c[y+12>>2]=c[o+12>>2];c[i>>2]=c[o>>2];c[i+4>>2]=c[o+4>>2];c[i+8>>2]=c[o+8>>2];c[i+12>>2]=c[o+12>>2];c[w>>2]=7;i=7;y=17}if((y|0)==17)bO(f,c[((c[f>>2]&3|0)==2?f:x)+40>>2]|0,j,i,17336);l=z;return}function Og(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0.0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0;P=l;l=l+352|0;z=P+336|0;y=P+320|0;N=P+144|0;u=P+304|0;A=P+128|0;O=P+112|0;G=P+96|0;H=P+80|0;I=P+64|0;J=P+48|0;K=P+32|0;L=P+16|0;M=P;a=a+16|0;s=(c[a>>2]|0)+16|0;x=(c[d+(e<<2)>>2]|0)+16|0;t=(c[x>>2]|0)+16|0;c[y>>2]=c[s>>2];c[y+4>>2]=c[s+4>>2];c[y+8>>2]=c[s+8>>2];c[y+12>>2]=c[s+12>>2];c[z>>2]=c[t>>2];c[z+4>>2]=c[t+4>>2];c[z+8>>2]=c[t+8>>2];c[z+12>>2]=c[t+12>>2];Kg(u,y,z);E=+h[u>>3];F=+h[u+8>>3];u=(c[b+16>>2]|0)+16|0;x=(c[x>>2]|0)+56|0;c[y>>2]=c[u>>2];c[y+4>>2]=c[u+4>>2];c[y+8>>2]=c[u+8>>2];c[y+12>>2]=c[u+12>>2];c[z>>2]=c[x>>2];c[z+4>>2]=c[x+4>>2];c[z+8>>2]=c[x+8>>2];c[z+12>>2]=c[x+12>>2];Kg(A,y,z);C=+h[A>>3];D=+h[A+8>>3];if((f|0)>1){B=+h[(c[a>>2]|0)+80>>3];i=B*.5;B=B/+(f+-1|0)}else{i=0.0;B=0.0}r=(g|8|0)==10;o=N+8|0;s=N+16|0;t=N+48|0;u=N+32|0;v=(E*2.0+C)/3.0;w=(E+C*2.0)/3.0;p=N+24|0;x=N+64|0;y=N+80|0;z=N+96|0;A=N+112|0;m=N+128|0;q=N+136|0;n=N+144|0;i=F-i;b=0;while(1){if((b|0)>=(f|0))break;k=c[d+(b+e<<2)>>2]|0;h[N>>3]=E;h[o>>3]=F;if(r){Sg(O,v,i);c[s>>2]=c[O>>2];c[s+4>>2]=c[O+4>>2];c[s+8>>2]=c[O+8>>2];c[s+12>>2]=c[O+12>>2];Sg(G,w,i);c[u>>2]=c[G>>2];c[u+4>>2]=c[G+4>>2];c[u+8>>2]=c[G+8>>2];c[u+12>>2]=c[G+12>>2];a=4;g=3;j=t}else{h[s>>3]=E;h[p>>3]=F;Sg(H,v,i);c[u>>2]=c[H>>2];c[u+4>>2]=c[H+4>>2];c[u+8>>2]=c[H+8>>2];c[u+12>>2]=c[H+12>>2];Sg(I,v,i);c[t>>2]=c[I>>2];c[t+4>>2]=c[I+4>>2];c[t+8>>2]=c[I+8>>2];c[t+12>>2]=c[I+12>>2];Sg(J,v,i);c[x>>2]=c[J>>2];c[x+4>>2]=c[J+4>>2];c[x+8>>2]=c[J+8>>2];c[x+12>>2]=c[J+12>>2];Sg(K,w,i);c[y>>2]=c[K>>2];c[y+4>>2]=c[K+4>>2];c[y+8>>2]=c[K+8>>2];c[y+12>>2]=c[K+12>>2];Sg(L,w,i);c[z>>2]=c[L>>2];c[z+4>>2]=c[L+4>>2];c[z+8>>2]=c[L+8>>2];c[z+12>>2]=c[L+12>>2];Sg(M,w,i);c[A>>2]=c[M>>2];c[A+4>>2]=c[M+4>>2];c[A+8>>2]=c[M+8>>2];c[A+12>>2]=c[M+12>>2];h[m>>3]=C;h[q>>3]=D;a=10;g=9;j=n}h[j>>3]=C;h[N+(g<<4)+8>>3]=D;bO(k,c[((c[k>>2]&3|0)==2?k:k+-48|0)+40>>2]|0,N,a,17336);i=B+i;b=b+1|0}l=P;return}function Pg(a,d,e,f,g,i,j,k){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;k=k|0;var m=0,n=0.0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0;x=l;l=l+1440|0;t=x+1392|0;v=x+1424|0;w=x+696|0;u=x;r=c[j>>2]&3;q=c[((r|0)==3?j:j+48|0)+40>>2]|0;r=c[((r|0)==2?j:j+-48|0)+40>>2]|0;m=c[q+16>>2]|0;o=c[m+232>>2]|0;p=c[a+16>>2]|0;if((o|0)<(b[p+238>>1]|0)){y=c[p+196>>2]|0;p=o+1|0;n=+h[m+24>>3]-+h[y+(o<<6)+32>>3]-(+h[(c[(c[c[y+(p<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]+ +h[y+(p<<6)+40>>3])}else n=+(c[p+252>>2]|0);z=+(i+1|0);s=+(c[d+12>>2]|0)/z;n=n/z;Rg(a,d,e,q,j,w,1);Rg(a,d,e,r,j,u,0);r=w+52|0;j=u+52|0;a=(k|0)==0;d=e+80|0;m=0;while(1){if((m|0)>=(i|0))break;q=c[f+(m+g<<2)>>2]|0;p=c[r>>2]|0;o=p+-1|0;D=+h[w+56+(o<<5)>>3];B=+h[w+56+(o<<5)+8>>3];C=+h[w+56+(o<<5)+16>>3];h[19234]=D;h[19237]=B;m=m+1|0;z=+(m|0);A=s*z;h[19236]=A+C;z=B-n*z;h[19235]=z;h[19238]=D;h[19241]=z;o=(c[j>>2]|0)+-1|0;D=+h[u+56+(o<<5)+16>>3];h[19240]=D;h[19239]=z-n;B=+h[u+56+(o<<5)>>3];C=+h[u+56+(o<<5)+8>>3];h[19244]=D;h[19245]=C;h[19242]=B-A;h[19243]=z;o=0;while(1){if((o|0)>=(p|0)){o=0;break}p=w+56+(o<<5)|0;c[t>>2]=c[p>>2];c[t+4>>2]=c[p+4>>2];c[t+8>>2]=c[p+8>>2];c[t+12>>2]=c[p+12>>2];c[t+16>>2]=c[p+16>>2];c[t+20>>2]=c[p+20>>2];c[t+24>>2]=c[p+24>>2];c[t+28>>2]=c[p+28>>2];dO(e,t);o=o+1|0;p=c[r>>2]|0}while(1){if((o|0)==3)break;y=153872+(o<<5)|0;c[t>>2]=c[y>>2];c[t+4>>2]=c[y+4>>2];c[t+8>>2]=c[y+8>>2];c[t+12>>2]=c[y+12>>2];c[t+16>>2]=c[y+16>>2];c[t+20>>2]=c[y+20>>2];c[t+24>>2]=c[y+24>>2];c[t+28>>2]=c[y+28>>2];dO(e,t);o=o+1|0}p=c[j>>2]|0;while(1){o=p+-1|0;if((p|0)<=0)break;p=u+56+(o<<5)|0;c[t>>2]=c[p>>2];c[t+4>>2]=c[p+4>>2];c[t+8>>2]=c[p+8>>2];c[t+12>>2]=c[p+12>>2];c[t+16>>2]=c[p+16>>2];c[t+20>>2]=c[p+20>>2];c[t+24>>2]=c[p+24>>2];c[t+28>>2]=c[p+28>>2];dO(e,t);p=o}if(a)o=LM(e,v)|0;else o=FM(e,v)|0;p=c[v>>2]|0;if(!p)break;bO(q,c[((c[q>>2]&3|0)==2?q:q+-48|0)+40>>2]|0,o,p,17336);c[d>>2]=0}l=x;return}function Qg(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0.0;n=l;l=l+128|0;j=n+96|0;k=n+64|0;o=n+32|0;m=n;tg(o,a,b,e,0,f);c[g>>2]=c[o>>2];c[g+4>>2]=c[o+4>>2];c[g+8>>2]=c[o+8>>2];c[g+12>>2]=c[o+12>>2];c[g+16>>2]=c[o+16>>2];c[g+20>>2]=c[o+20>>2];c[g+24>>2]=c[o+24>>2];c[g+28>>2]=c[o+28>>2];c[k>>2]=c[o>>2];c[k+4>>2]=c[o+4>>2];c[k+8>>2]=c[o+8>>2];c[k+12>>2]=c[o+12>>2];c[k+16>>2]=c[o+16>>2];c[k+20>>2]=c[o+20>>2];c[k+24>>2]=c[o+24>>2];c[k+28>>2]=c[o+28>>2];c[g+48>>2]=4;if(!(i<<24>>24))hO(d,f,2,g,0);else eO(d,f,2,g,0);b=g+52|0;f=(c[b>>2]|0)+-1|0;o=k+24|0;h[o>>3]=+h[g+56+(f<<5)+24>>3];i=k+8|0;h[i>>3]=+h[g+56+(f<<5)+8>>3];e=c[e+16>>2]|0;p=+h[e+24>>3]+ +h[(c[(c[a+16>>2]|0)+196>>2]|0)+(c[e+232>>2]<<6)+24>>3];c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];c[j+16>>2]=c[k+16>>2];c[j+20>>2]=c[k+20>>2];c[j+24>>2]=c[k+24>>2];c[j+28>>2]=c[k+28>>2];vg(m,j,4,p);c[k>>2]=c[m>>2];c[k+4>>2]=c[m+4>>2];c[k+8>>2]=c[m+8>>2];c[k+12>>2]=c[m+12>>2];c[k+16>>2]=c[m+16>>2];c[k+20>>2]=c[m+20>>2];c[k+24>>2]=c[m+24>>2];c[k+28>>2]=c[m+28>>2];if(+h[k>>3]<+h[k+16>>3]?+h[i>>3]<+h[o>>3]:0){o=c[b>>2]|0;c[b>>2]=o+1;o=g+56+(o<<5)|0;c[o>>2]=c[k>>2];c[o+4>>2]=c[k+4>>2];c[o+8>>2]=c[k+8>>2];c[o+12>>2]=c[k+12>>2];c[o+16>>2]=c[k+16>>2];c[o+20>>2]=c[k+20>>2];c[o+24>>2]=c[k+24>>2];c[o+28>>2]=c[k+28>>2]}l=n;return}function Rg(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0.0;n=l;l=l+128|0;j=n+96|0;k=n+64|0;o=n+32|0;m=n;tg(o,a,b,e,0,f);c[g>>2]=c[o>>2];c[g+4>>2]=c[o+4>>2];c[g+8>>2]=c[o+8>>2];c[g+12>>2]=c[o+12>>2];c[g+16>>2]=c[o+16>>2];c[g+20>>2]=c[o+20>>2];c[g+24>>2]=c[o+24>>2];c[g+28>>2]=c[o+28>>2];c[k>>2]=c[o>>2];c[k+4>>2]=c[o+4>>2];c[k+8>>2]=c[o+8>>2];c[k+12>>2]=c[o+12>>2];c[k+16>>2]=c[o+16>>2];c[k+20>>2]=c[o+20>>2];c[k+24>>2]=c[o+24>>2];c[k+28>>2]=c[o+28>>2];c[g+48>>2]=1;if(!(i<<24>>24))hO(d,f,2,g,0);else eO(d,f,2,g,0);b=g+52|0;f=(c[b>>2]|0)+-1|0;o=k+24|0;h[o>>3]=+h[g+56+(f<<5)+24>>3];i=k+8|0;h[i>>3]=+h[g+56+(f<<5)+8>>3];e=c[e+16>>2]|0;p=+h[e+24>>3]-+h[(c[(c[a+16>>2]|0)+196>>2]|0)+(c[e+232>>2]<<6)+24>>3];c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];c[j+16>>2]=c[k+16>>2];c[j+20>>2]=c[k+20>>2];c[j+24>>2]=c[k+24>>2];c[j+28>>2]=c[k+28>>2];vg(m,j,1,p);c[k>>2]=c[m>>2];c[k+4>>2]=c[m+4>>2];c[k+8>>2]=c[m+8>>2];c[k+12>>2]=c[m+12>>2];c[k+16>>2]=c[m+16>>2];c[k+20>>2]=c[m+20>>2];c[k+24>>2]=c[m+24>>2];c[k+28>>2]=c[m+28>>2];if(+h[k>>3]<+h[k+16>>3]?+h[i>>3]<+h[o>>3]:0){o=c[b>>2]|0;c[b>>2]=o+1;o=g+56+(o<<5)|0;c[o>>2]=c[k>>2];c[o+4>>2]=c[k+4>>2];c[o+8>>2]=c[k+8>>2];c[o+12>>2]=c[k+12>>2];c[o+16>>2]=c[k+16>>2];c[o+20>>2]=c[k+20>>2];c[o+24>>2]=c[k+24>>2];c[o+28>>2]=c[k+28>>2]}l=n;return}function Sg(a,b,c){a=a|0;b=+b;c=+c;h[a>>3]=b;h[a+8>>3]=c;return}function Tg(b,d,e,f,g,i,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0.0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;$=l;l=l+288|0;U=$+256|0;T=$+240|0;S=$+224|0;Y=$+280|0;Z=$+272|0;_=$+32|0;V=$+16|0;W=$;m=$+208|0;n=$+192|0;o=c[e+(f<<2)>>2]|0;X=HK(g<<2)|0;k=0;while(1){if((k|0)>=(g|0))break;c[X+(k<<2)>>2]=c[e+(k+f<<2)>>2];k=k+1|0}k3(X,g,4,59);E=b+16|0;G=(c[E>>2]|0)+16|0;F=o+16|0;K=(c[F>>2]|0)+16|0;c[T>>2]=c[G>>2];c[T+4>>2]=c[G+4>>2];c[T+8>>2]=c[G+8>>2];c[T+12>>2]=c[G+12>>2];c[U>>2]=c[K>>2];c[U+4>>2]=c[K+4>>2];c[U+8>>2]=c[K+8>>2];c[U+12>>2]=c[K+12>>2];Kg(m,T,U);c[V>>2]=c[m>>2];c[V+4>>2]=c[m+4>>2];c[V+8>>2]=c[m+8>>2];c[V+12>>2]=c[m+12>>2];K=d+16|0;G=(c[K>>2]|0)+16|0;F=(c[F>>2]|0)+56|0;c[T>>2]=c[G>>2];c[T+4>>2]=c[G+4>>2];c[T+8>>2]=c[G+8>>2];c[T+12>>2]=c[G+12>>2];c[U>>2]=c[F>>2];c[U+4>>2]=c[F+4>>2];c[U+8>>2]=c[F+8>>2];c[U+12>>2]=c[F+12>>2];Kg(n,T,U);c[W>>2]=c[n>>2];c[W+4>>2]=c[n+4>>2];c[W+8>>2]=c[n+8>>2];c[W+12>>2]=c[n+12>>2];y=+h[V>>3]+ +h[(c[E>>2]|0)+96>>3];z=+h[W>>3]-+h[(c[K>>2]|0)+88>>3];x=(y+z)*.5;K=c[X>>2]|0;c[_>>2]=c[V>>2];c[_+4>>2]=c[V+4>>2];c[_+8>>2]=c[V+8>>2];c[_+12>>2]=c[V+12>>2];E=_+16|0;c[E>>2]=c[V>>2];c[E+4>>2]=c[V+4>>2];c[E+8>>2]=c[V+8>>2];c[E+12>>2]=c[V+12>>2];F=_+32|0;c[F>>2]=c[W>>2];c[F+4>>2]=c[W+4>>2];c[F+8>>2]=c[W+8>>2];c[F+12>>2]=c[W+12>>2];G=_+48|0;c[G>>2]=c[W>>2];c[G+4>>2]=c[W+4>>2];c[G+8>>2]=c[W+8>>2];c[G+12>>2]=c[W+12>>2];bO(K,c[((c[K>>2]&3|0)==2?K:K+-48|0)+40>>2]|0,_,4,17336);K=c[(c[K+16>>2]|0)+96>>2]|0;h[K+56>>3]=x;H=V+8|0;v=+h[H>>3];w=+h[K+32>>3];h[K+64>>3]=v+(w+6.0)*.5;a[K+81>>0]=1;v=v+3.0;J=+h[K+24>>3]*.5;I=x-J;J=x+J;K=W+8|0;L=_+72|0;M=_+40|0;N=_+120|0;O=_+64|0;P=Y+4|0;Q=_+56|0;R=_+24|0;o=(i|0)==6&1;e=_+104|0;f=_+96|0;i=_+80|0;C=_+88|0;D=_+112|0;t=0.0;s=0.0;w=v+w;m=1;while(1){if((m|0)>=(j|0)){B=6;break}d=c[X+(m<<2)>>2]|0;p=+h[V>>3];q=+h[K>>3];r=+h[W>>3];u=+h[H>>3];n=d+16|0;if(!(m&1)){c[_>>2]=c[V>>2];c[_+4>>2]=c[V+4>>2];c[_+8>>2]=c[V+8>>2];c[_+12>>2]=c[V+12>>2];h[E>>3]=I;h[R>>3]=u;h[F>>3]=I;h[M>>3]=w;h[G>>3]=J;h[Q>>3]=w;h[O>>3]=J;h[L>>3]=q;h[i>>3]=r;h[C>>3]=q;h[f>>3]=r;A=w+6.0;h[e>>3]=A;h[D>>3]=p;h[N>>3]=A;A=+h[(c[(c[n>>2]|0)+96>>2]|0)+32>>3];p=w+A*.5+6.0;w=w+(A+6.0)}else{k=c[(c[n>>2]|0)+96>>2]|0;if((m|0)==1){s=+h[k+24>>3]*.5;t=x+s;s=x-s}v=v-(+h[k+32>>3]+6.0);c[_>>2]=c[V>>2];c[_+4>>2]=c[V+4>>2];c[_+8>>2]=c[V+8>>2];c[_+12>>2]=c[V+12>>2];h[E>>3]=p;p=v+-6.0;h[R>>3]=p;h[F>>3]=r;h[M>>3]=p;c[G>>2]=c[W>>2];c[G+4>>2]=c[W+4>>2];c[G+8>>2]=c[W+8>>2];c[G+12>>2]=c[W+12>>2];h[O>>3]=t;h[L>>3]=q;h[i>>3]=t;h[C>>3]=v;h[f>>3]=s;h[e>>3]=v;h[D>>3]=s;h[N>>3]=u;p=v+ +h[(c[(c[n>>2]|0)+96>>2]|0)+32>>3]*.5}c[P>>2]=8;c[Y>>2]=_;c[S>>2]=c[V>>2];c[S+4>>2]=c[V+4>>2];c[S+8>>2]=c[V+8>>2];c[S+12>>2]=c[V+12>>2];c[T>>2]=c[W>>2];c[T+4>>2]=c[W+4>>2];c[T+8>>2]=c[W+8>>2];c[T+12>>2]=c[W+12>>2];c[U>>2]=c[Y>>2];c[U+4>>2]=c[Y+4>>2];k=BM(S,T,U,Z,o)|0;b=c[Z>>2]|0;if(!b)break;n=c[(c[n>>2]|0)+96>>2]|0;h[n+56>>3]=x;h[n+64>>3]=p;a[n+81>>0]=1;bO(d,c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0,k,b,17336);m=m+1|0}a:do if((B|0)==6){A=(y*2.0+z)/3.0;x=(y+z*2.0)/3.0;while(1){if((m|0)>=(g|0))break;d=c[X+(m<<2)>>2]|0;p=+h[V>>3];q=+h[K>>3];r=+h[W>>3];u=+h[H>>3];if(!(m&1)){c[_>>2]=c[V>>2];c[_+4>>2]=c[V+4>>2];c[_+8>>2]=c[V+8>>2];c[_+12>>2]=c[V+12>>2];h[E>>3]=I;h[R>>3]=u;h[F>>3]=I;h[M>>3]=w;h[G>>3]=J;h[Q>>3]=w;h[O>>3]=J;h[L>>3]=q;h[i>>3]=r;h[C>>3]=q;h[f>>3]=r;q=w+6.0;w=q;r=q}else{B=(m|0)==1;y=B?A:s;t=B?x:t;z=v+-6.0;c[_>>2]=c[V>>2];c[_+4>>2]=c[V+4>>2];c[_+8>>2]=c[V+8>>2];c[_+12>>2]=c[V+12>>2];h[E>>3]=p;v=z+-6.0;h[R>>3]=v;h[F>>3]=r;h[M>>3]=v;c[G>>2]=c[W>>2];c[G+4>>2]=c[W+4>>2];c[G+8>>2]=c[W+8>>2];c[G+12>>2]=c[W+12>>2];h[O>>3]=t;h[L>>3]=q;h[i>>3]=t;h[C>>3]=z;h[f>>3]=y;v=z;s=y;r=u;p=y;q=z}h[e>>3]=q;h[D>>3]=p;h[N>>3]=r;c[P>>2]=8;c[Y>>2]=_;c[S>>2]=c[V>>2];c[S+4>>2]=c[V+4>>2];c[S+8>>2]=c[V+8>>2];c[S+12>>2]=c[V+12>>2];c[T>>2]=c[W>>2];c[T+4>>2]=c[W+4>>2];c[T+8>>2]=c[W+8>>2];c[T+12>>2]=c[W+12>>2];c[U>>2]=c[Y>>2];c[U+4>>2]=c[Y+4>>2];k=BM(S,T,U,Z,o)|0;b=c[Z>>2]|0;if(!b)break a;bO(d,c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0,k,b,17336);m=m+1|0}l6(X)}while(0);l=$;return}function Ug(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0;g=l;l=l+16|0;f=g;j=(uB(b)|0)==0;c[f>>2]=c[(j?18636:18628)>>2];f=lB(85765,f,0)|0;RC(f,137786,280,1)|0;DA(f,0,87443,195341)|0;j=HK(96)|0;e=c[f+16>>2]|0;c[e+8>>2]=j;i=c[b+16>>2]|0;k=c[i+8>>2]|0;h[j>>3]=+h[k>>3];h[j+24>>3]=+h[k+24>>3];a[e+115>>0]=a[i+115>>0]|0;c[e+116>>2]=c[i+116>>2]&1^1;c[e+248>>2]=c[i+248>>2];c[e+252>>2]=c[i+252>>2];e=IA(vC(b)|0,1,0)|0;while(1){if(!e)break;DA(f,1,c[e+8>>2]|0,c[e+12>>2]|0)|0;e=IA(vC(b)|0,1,e)|0}e=IA(vC(b)|0,2,0)|0;while(1){if(!e)break;DA(f,2,c[e+8>>2]|0,c[e+12>>2]|0)|0;e=IA(vC(b)|0,2,e)|0}if(!(DA(f,2,111765,0)|0))DA(f,2,111765,195341)|0;if(!(DA(f,2,111756,0)|0))DA(f,2,111756,195341)|0;Zg(f,d);l=g;return f|0}function Vg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;e=l;l=l+16|0;d=e;a=qC(a,HB(b)|0,1)|0;RC(a,137750,304,1)|0;RA(b,a)|0;if((UM(b)|0)==2){f=b+16|0;b=IK((D3(c[c[(c[f>>2]|0)+104>>2]>>2]|0)|0)+3|0)|0;c[d>>2]=c[c[(c[f>>2]|0)+104>>2]>>2];i2(b,85760,d)|0;PA(a,108525,b)|0}l=e;return a|0}function Wg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=fB(a,b,c,0,1)|0;RC(c,137763,176,1)|0;RA(d,c)|0;return c|0}function Xg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0.0;i=l;l=l+32|0;g=i+16|0;f=i;if(e|0){j=+h[b>>3];e=b+8|0;h[b>>3]=+h[e>>3];h[e>>3]=-j};c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];c[g>>2]=c[d>>2];c[g+4>>2]=c[d+4>>2];c[g+8>>2]=c[d+8>>2];c[g+12>>2]=c[d+12>>2];Kg(a,f,g);l=i;return}function Yg(a,b){a=a|0;b=b|0;c[47258]=c[b>>2];c[47262]=c[b+4>>2];c[47263]=c[b+8>>2];c[47236]=c[b+12>>2];c[47237]=c[b+16>>2];c[47250]=c[b+20>>2];c[47249]=c[b+24>>2];c[47248]=c[b+28>>2];c[47274]=c[b+32>>2];c[47266]=c[b+36>>2];c[47251]=c[b+40>>2];c[47261]=c[b+44>>2];c[47270]=c[b+48>>2];c[47269]=c[b+52>>2];c[47268]=c[b+56>>2];c[47273]=c[b+60>>2];c[47267]=c[b+64>>2];c[47252]=c[b+68>>2];c[47199]=c[b+72>>2];c[47200]=c[b+76>>2];c[47201]=c[b+80>>2];c[47219]=c[b+84>>2];c[47212]=c[b+88>>2];c[47213]=c[b+92>>2];c[47214]=c[b+96>>2];c[47216]=c[b+100>>2];c[47217]=c[b+104>>2];c[47220]=c[b+108>>2];c[47223]=c[b+112>>2];c[47221]=c[b+116>>2];c[47222]=c[b+120>>2];c[47225]=c[b+124>>2];c[47224]=c[b+128>>2];c[47226]=c[b+132>>2];c[47227]=c[b+136>>2];c[47218]=c[b+140>>2];c[47230]=c[b+144>>2];c[47194]=c[b+148>>2];c[47185]=c[b+152>>2];l6(b);Of(a);pB(a)|0;return}function Zg(a,b){a=a|0;b=b|0;c[b>>2]=c[47258];c[b+4>>2]=c[47262];c[b+8>>2]=c[47263];c[b+12>>2]=c[47236];c[b+16>>2]=c[47237];c[b+20>>2]=c[47250];c[b+24>>2]=c[47249];c[b+28>>2]=c[47248];c[b+32>>2]=c[47274];c[b+36>>2]=c[47266];c[b+40>>2]=c[47251];c[b+44>>2]=c[47261];c[b+48>>2]=c[47270];c[b+52>>2]=c[47269];c[b+56>>2]=c[47268];c[b+60>>2]=c[47273];c[b+64>>2]=c[47267];c[b+68>>2]=c[47252];c[b+72>>2]=c[47199];c[b+76>>2]=c[47200];c[b+80>>2]=c[47201];c[b+84>>2]=c[47219];c[b+88>>2]=c[47212];c[b+92>>2]=c[47213];c[b+96>>2]=c[47214];c[b+100>>2]=c[47216];c[b+104>>2]=c[47217];c[b+108>>2]=c[47220];c[b+112>>2]=c[47223];c[b+116>>2]=c[47221];c[b+120>>2]=c[47222];c[b+124>>2]=c[47225];c[b+128>>2]=c[47224];c[b+132>>2]=c[47226];c[b+136>>2]=c[47227];c[b+140>>2]=c[47218];c[b+144>>2]=c[47230];c[b+152>>2]=c[47185];c[b+148>>2]=c[47194];c[47258]=0;c[47262]=DA(a,2,87684,0)|0;c[47263]=DA(a,2,87693,0)|0;b=DA(a,2,101842,0)|0;c[47236]=b;if(!b)c[47236]=DA(a,2,101842,195341)|0;c[47237]=0;c[47250]=0;c[47249]=DA(a,2,101738,0)|0;c[47248]=DA(a,2,101729,0)|0;c[47274]=DA(a,2,102018,0)|0;c[47266]=0;c[47251]=DA(a,2,108525,0)|0;c[47261]=DA(a,2,85770,0)|0;c[47270]=0;c[47269]=DA(a,2,101918,0)|0;c[47268]=DA(a,2,101904,0)|0;c[47273]=DA(a,2,102009,0)|0;c[47267]=0;c[47252]=0;c[47199]=DA(a,1,141351,0)|0;c[47200]=DA(a,1,141419,0)|0;c[47201]=DA(a,1,108531,0)|0;c[47219]=0;c[47212]=DA(a,1,101729,0)|0;c[47213]=DA(a,1,101738,0)|0;c[47214]=0;c[47216]=DA(a,1,108525,0)|0;c[47217]=0;c[47220]=0;c[47223]=DA(a,1,101710,0)|0;c[47221]=DA(a,1,141379,0)|0;c[47222]=DA(a,1,101773,0)|0;c[47225]=DA(a,1,101785,0)|0;c[47224]=DA(a,1,101649,0)|0;c[47226]=DA(a,1,101790,0)|0;c[47227]=DA(a,1,85782,0)|0;c[47218]=0;c[47230]=0;c[47194]=DA(a,0,101710,0)|0;return}function _g(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,g=0.0,i=0.0;d=c[(c[(c[a>>2]|0)+16>>2]|0)+96>>2]|0;a=c[(c[(c[b>>2]|0)+16>>2]|0)+96>>2]|0;b=(a|0)!=0;if(d)if(b?(f=+h[d+24>>3],i=+h[d+32>>3],e=+h[a+24>>3],g=+h[a+32>>3],!(f>e)):0)if(!(fg)a=-1;else a=i>0]|0)!=37?(h=c[i>>2]|0,h=wb[c[(c[h+4>>2]|0)+4>>2]&63](c[h+16>>2]|0,d,e,f,g)|0,h|0):0)break;h=JB(b,d,e,f)|0;if(!h)k=5}else k=5;while(0);if((k|0)==5)if(g){h=c[i>>2]|0;h=wb[c[(c[h+4>>2]|0)+4>>2]&63](c[h+16>>2]|0,d,0,f,g)|0;if(j&(h|0)!=0){k=f;KB(b,d,e,c[k>>2]|0,c[k+4>>2]|0)}}else h=0;return h|0}function FB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=c[a+64>>2]|0;return tb[c[(c[a+4>>2]|0)+8>>2]&127](c[a+16>>2]|0,b,d,e)|0}function GB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;PB(a,b,d,e)|0;a=c[a+64>>2]|0;xb[c[(c[a+4>>2]|0)+12>>2]&31](c[a+16>>2]|0,b,d,e);return}function HB(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;h=l;l=l+16|0;g=h;d=uC(a)|0;f=a+8|0;b=f;b=NB(d,c[a>>2]&3,c[b>>2]|0,c[b+4>>2]|0)|0;do if(!b){b=c[d+64>>2]|0;d=c[(c[b+4>>2]|0)+16>>2]|0;if(d|0?(e=f,e=tb[d&127](c[b+16>>2]|0,c[a>>2]&3,c[e>>2]|0,c[e+4>>2]|0)|0,e|0):0){b=e;break}if((c[a>>2]&3|0)==2)b=0;else{e=c[f>>2]|0;f=c[f+4>>2]|0;c[g>>2]=37;b=g+8|0;c[b>>2]=e;c[b+4>>2]=f;i2(195053,96757,g)|0;b=195053}}while(0);l=h;return b|0}function IB(a,b,d){a=a|0;b=b|0;d=d|0;a=c[a+64>>2]|0;rb[c[(c[a+4>>2]|0)+24>>2]&127](c[a+16>>2]|0,b,d);return}function JB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+32|0;h=i;b=c[(c[a+64>>2]|0)+56+(((b|0)==3?2:b)<<2)>>2]|0;if(((b|0)!=0?(f=aD(a,d)|0,(f|0)!=0):0)?(c[h+24>>2]=f,g=eb[c[b>>2]&63](b,h,4)|0,(g|0)!=0):0){d=g+16|0;h=c[d+4>>2]|0;b=e;c[b>>2]=c[d>>2];c[b+4>>2]=h;b=1}else b=0;l=i;return b|0}function KB(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=aC(a,32)|0;g=h+16|0;c[g>>2]=e;c[g+4>>2]=f;c[h+24>>2]=dD(a,d)|0;e=(b|0)==3?2:b;g=a+64|0;d=c[g>>2]|0;b=c[d+56+(e<<2)>>2]|0;if(!b){f=SD(a,18684,c[4599]|0)|0;c[(c[g>>2]|0)+56+(e<<2)>>2]=f;b=c[g>>2]|0}else{f=b;b=d}b=c[b+68+(e<<2)>>2]|0;if(!b){b=SD(a,18720,c[4599]|0)|0;c[(c[g>>2]|0)+68+(e<<2)>>2]=b}eb[c[f>>2]&63](f,h,1)|0;eb[c[b>>2]&63](b,h,1)|0;return}function LB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=b+16|0;b=c[a>>2]|0;a=c[a+4>>2]|0;d=d+16|0;e=c[d>>2]|0;d=c[d+4>>2]|0;return (a>>>0>d>>>0|(a|0)==(d|0)&b>>>0>e>>>0?1:(a>>>0>>0|(a|0)==(d|0)&b>>>0>>0)<<31>>31)|0}function MB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;b=c[b+24>>2]|0;e=c[d+24>>2]|0;return (b>>>0>e>>>0?1:(b>>>0>>0)<<31>>31)|0}function NB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=OB(a,b,d,e)|0;if(!a)a=0;else a=c[a+24>>2]|0;return a|0}function OB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+32|0;f=g;a=c[(c[a+64>>2]|0)+68+(((b|0)==3?2:b)<<2)>>2]|0;if(!a)a=0;else{b=f+16|0;c[b>>2]=d;c[b+4>>2]=e;a=eb[c[a>>2]&63](a,f,4)|0}l=g;return a|0}function PB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=(b|0)==3?2:b;b=OB(a,f,d,e)|0;if(!b)b=0;else{e=a+64|0;d=c[(c[e>>2]|0)+56+(f<<2)>>2]|0;eb[c[d>>2]&63](d,b,2)|0;e=c[(c[e>>2]|0)+68+(f<<2)>>2]|0;eb[c[e>>2]&63](e,b,2)|0;fD(a,c[b+24>>2]|0)|0;bC(a,b);b=1}return b|0}function QB(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;c[46985]=b;g=c[b+64>>2]|0;f=0;while(1){if((f|0)==3)break;h=g+56+(f<<2)|0;d=c[h>>2]|0;a:do if(d|0){d=eb[c[d>>2]&63](d,0,128)|0;while(1){if(!d)break a;e=c[h>>2]|0;e=eb[c[e>>2]&63](e,d,8)|0;if((a[c[d+24>>2]>>0]|0)!=37){d=e;continue}i=d+16|0;PB(b,f,c[i>>2]|0,c[i+4>>2]|0)|0;d=e}}while(0);f=f+1|0}return}function RB(a){a=a|0;c[46985]=a;a=a+64|0;SB((c[a>>2]|0)+56|0);SB((c[a>>2]|0)+68|0);return}function SB(a){a=a|0;var b=0,d=0,e=0;b=0;while(1){if((b|0)==3)break;d=a+(b<<2)|0;e=c[d>>2]|0;if(e|0){Oz(e)|0;c[d>>2]=0}b=b+1|0}return}function TB(a,b,c){a=a|0;b=b|0;c=c|0;if(!(o4(b,c,a)|0))a=0;else a=D3(b)|0;return a|0}function UB(a,b){a=a|0;b=b|0;return Z3(b,a)|0}function VB(a){a=a|0;return m4(a)|0}function WB(a){a=a|0;var b=0,d=0,e=0;b=l;l=l+32|0;e=b+12|0;d=b;c[4693]=c[4690];c[4694]=c[4691];c[e>>2]=a;c[e+4>>2]=D3(a)|0;c[e+8>>2]=0;c[d>>2]=18780;c[d+4>>2]=18656;c[d+8>>2]=18768;a=hF(e,d)|0;iD(0);l=b;return a|0}function XB(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;if((e|0)!=0?(h=b+8|0,f=c[h>>2]|0,(f|0)<(c[b+4>>2]|0)):0){i=(c[b>>2]|0)+f|0;b=0;g=a[i>>0]|0;f=d;d=i;while(1){d=d+1|0;a[f>>0]=g;b=b+1|0;if(!(g<<24>>24!=10&(b|0)<(e|0)))break;g=a[d>>0]|0;if(!(g<<24>>24))break;else f=f+1|0}c[h>>2]=(c[h>>2]|0)+b}else b=0;return b|0}function YB(a){a=a|0;return 0}function ZB(a,b){a=a|0;b=b|0;a=k6(b)|0;u6(a|0,0,b|0)|0;return a|0}function _B(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;a=n6(b,d)|0;if(d>>>0>c>>>0)u6(a+c|0,0,d-c|0)|0;return a|0}function $B(a,b){a=a|0;b=b|0;l6(b);return}function aC(a,b){a=a|0;b=b|0;var d=0;d=l;l=l+16|0;a=c[a+64>>2]|0;a=vb[c[(c[a>>2]|0)+4>>2]&127](c[a+12>>2]|0,b)|0;if(!a)dA(1,96763,d)|0;l=d;return a|0}function bC(a,b){a=a|0;b=b|0;if(b|0){a=c[a+64>>2]|0;lb[c[(c[a>>2]|0)+12>>2]&63](c[a+12>>2]|0,b)}return}function cC(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=(c[b+16>>2]|0)+8|0;b=c[a>>2]|0;a=c[a+4>>2]|0;d=(c[d+16>>2]|0)+8|0;e=c[d>>2]|0;d=c[d+4>>2]|0;return (a>>>0>>0|(a|0)==(d|0)&b>>>0>>0?-1:(a>>>0>d>>>0|(a|0)==(d|0)&b>>>0>e>>>0)&1)|0}function dC(a,b,d){a=a|0;b=b|0;d=d|0;a=c[b+16>>2]|0;if((a+28|0)!=(b|0))bC(c[a+24>>2]|0,b);return}function eC(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;b=(c[c[b+16>>2]>>2]|0)>>>4;e=(c[c[d+16>>2]>>2]|0)>>>4;return (b>>>0>>0?-1:b>>>0>e>>>0&1)|0}function fC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=186424;c[e>>2]=b;c[e+4>>2]=d;c[46990]=186416;a=c[a+40>>2]|0;a=eb[c[a>>2]&63](a,187944,4)|0;if(!a)a=0;else a=c[a+16>>2]|0;return a|0}function gC(a){a=a|0;a=c[a+36>>2]|0;a=eb[c[a>>2]&63](a,0,128)|0;if(!a)a=0;else a=c[a+16>>2]|0;return a|0}function hC(a,b){a=a|0;b=b|0;var d=0;b=VA(a,b)|0;if((b|0)!=0?(d=c[a+36>>2]|0,d=eb[c[d>>2]&63](d,b,8)|0,(d|0)!=0):0)b=c[d+16>>2]|0;else b=0;return b|0}function iC(a){a=a|0;a=c[a+36>>2]|0;a=eb[c[a>>2]&63](a,0,256)|0;if(!a)a=0;else a=c[a+16>>2]|0;return a|0}function jC(a,b){a=a|0;b=b|0;var d=0;b=VA(a,b)|0;if((b|0)!=0?(d=c[a+36>>2]|0,d=eb[c[d>>2]&63](d,b,16)|0,(d|0)!=0):0)b=c[d+16>>2]|0;else b=0;return b|0}function kC(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=fC(a,b,c)|0;do if((d|0)!=0&(e|0)==0){e=vC(a)|0;if((e|0)!=(a|0)?(f=fC(e,b,c)|0,f|0):0){lC(a,f,1)|0;e=f;break}if(!(FB(a,1,b,c)|0))e=0;else{e=oB(a,1)|0;e=mC(a,b,c,e,D)|0;nC(a,e);oC(a,e)}}while(0);return e|0}function lC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=vC(a)|0;if((e|0)==(c[b+24>>2]|0)){e=b+8|0;e=fC(a,c[e>>2]|0,c[e+4>>2]|0)|0;if((d|0)!=0&(e|0)==0){e=OD(a)|0;if(!e)e=0;else{d=lC(e,b,d)|0;pC(a,d);return d|0}}}else e=0;return e|0}function mC(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;g=aC(b,64)|0;h=c[g>>2]|0;i=g+8|0;c[i>>2]=d;c[i+4>>2]=e;c[g>>2]=h&12|f<<4|1;c[g+24>>2]=vC(b)|0;if(a[(vC(b)|0)+24>>0]&64)RC(g,c[4610]|0,16,0)|0;return g|0}function nC(a,b){a=a|0;b=b|0;do{pC(a,b);a=OD(a)|0}while((a|0)!=0);return}function oC(b,c){b=b|0;c=c|0;if(a[(vC(b)|0)+24>>0]&64)rA(b,c);wC(b,c);return}function pC(a,b){a=a|0;b=b|0;var d=0,e=0;e=a+40|0;Uz(c[e>>2]|0)|0;if((vC(a)|0)==(a|0))d=b+28|0;else d=aC(a,36)|0;c[d+16>>2]=b;e=c[e>>2]|0;eb[c[e>>2]&63](e,d,1)|0;e=c[a+36>>2]|0;eb[c[e>>2]&63](e,d,1)|0;return}function qC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;g=j;h=vC(a)|0;e=(d|0)!=0;if(EB(a,1,b,g,0)|0){d=g;d=fC(a,c[d>>2]|0,c[d+4>>2]|0)|0;if(!d)if(!((h|0)==(a|0)|e^1)?(f=g,f=fC(h,c[f>>2]|0,c[f+4>>2]|0)|0,(f|0)!=0):0)d=lC(a,f,1)|0;else i=6}else i=6;if((i|0)==6)if(e?(EB(a,1,b,g,1)|0)!=0:0){i=g;h=c[i>>2]|0;i=c[i+4>>2]|0;d=oB(a,1)|0;d=mC(a,h,i,d,D)|0;nC(a,d);oC(a,d);IB(a,1,d)}else d=0;l=j;return d|0}function rC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;c[46999]=b;d=ZA(a,b)|0;while(1){if(!d)break;e=_A(a,d,b)|0;gB(a,d,0);d=e}e=c[a+40>>2]|0;eb[c[e>>2]&63](e,187980,2)|0;e=c[a+36>>2]|0;eb[c[e>>2]&63](e,187980,2)|0;return}function sC(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;f=d+8|0;e=f;if(fC(b,c[e>>2]|0,c[e+4>>2]|0)|0){if((vC(b)|0)==(b|0)){e=ZA(b,d)|0;while(1){if(!e)break;g=_A(b,e,d)|0;iB(b,e)|0;e=g}if(a[b+24>>0]&64)LA(d);AC(b,d);ZC(d);g=f;GB(b,1,c[g>>2]|0,c[g+4>>2]|0)}if(!(zE(b,d,59,0,0)|0))if((vC(b)|0)==(b|0)){bC(b,d);e=0}else e=0;else e=-1}else e=-1;return e|0}function tC(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;h=l;l=l+16|0;e=h;d=c[b>>2]|0;do if(!(d&3))if((OD(b)|0)==(a|0)){d=c[b>>2]|0;g=5;break}else{dA(1,96789,e)|0;f=-1;break}else g=5;while(0);a:do if((g|0)==5)switch(d&3){case 1:{f=sC(a,b)|0;break a}case 2:case 3:{f=iB(a,b)|0;break a}case 0:{f=pB(b)|0;break a}default:{}}while(0);l=h;return f|0}function uC(a){a=a|0;var b=0;switch(c[a>>2]&3){case 2:case 3:{b=c[(c[a+40>>2]|0)+24>>2]|0;break}case 1:{b=c[a+24>>2]|0;break}case 0:{b=a;break}default:{}}return b|0}function vC(a){a=a|0;var b=0;switch(c[a>>2]&3){case 2:case 3:{b=(c[a+40>>2]|0)+24|0;break}case 1:{b=a+24|0;break}case 0:{b=a+60|0;break}default:{}}return c[b>>2]|0}function wC(b,d){b=b|0;d=d|0;var e=0;e=c[b+64>>2]|0;if(!(a[e+52>>0]|0))GC(b,d,100,0);else xC(b,d,c[e+48>>2]|0);return}function xC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;a:do if(d|0){xC(a,b,c[d+8>>2]|0);switch(c[b>>2]&3){case 0:{e=c[d>>2]|0;break}case 1:{e=(c[d>>2]|0)+12|0;break}case 2:{e=(c[d>>2]|0)+24|0;break}default:break a}e=c[e>>2]|0;if(e|0)rb[e&127](a,b,c[d+4>>2]|0)}while(0);return}function yC(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=c[b+64>>2]|0;if(!(a[f+52>>0]|0))GC(b,d,101,e);else zC(b,d,e,c[f+48>>2]|0);return}function zC(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;a:do if(e|0){zC(a,b,d,c[e+8>>2]|0);switch(c[b>>2]&3){case 0:{f=(c[e>>2]|0)+4|0;break}case 1:{f=(c[e>>2]|0)+16|0;break}case 2:{f=(c[e>>2]|0)+28|0;break}default:break a}f=c[f>>2]|0;if(f|0)xb[f&31](a,b,c[e+4>>2]|0,d)}while(0);return}function AC(b,d){b=b|0;d=d|0;var e=0;e=c[b+64>>2]|0;if(!(a[e+52>>0]|0))GC(b,d,102,0);else BC(b,d,c[e+48>>2]|0);return}function BC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;a:do if(d|0){BC(a,b,c[d+8>>2]|0);switch(c[b>>2]&3){case 0:{e=(c[d>>2]|0)+8|0;break}case 1:{e=(c[d>>2]|0)+20|0;break}case 2:{e=(c[d>>2]|0)+32|0;break}default:break a}e=c[e>>2]|0;if(e|0)rb[e&127](a,b,c[d+4>>2]|0)}while(0);return}function CC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=aC(a,12)|0;c[e>>2]=b;c[e+4>>2]=d;d=(c[a+64>>2]|0)+48|0;c[e+8>>2]=c[d>>2];c[d>>2]=e;return}function DC(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;e=(c[a+64>>2]|0)+48|0;d=c[e>>2]|0;a:do if(!d)d=-1;else{if((c[d>>2]|0)!=(b|0)){while(1){e=d+8|0;if(!d){d=-1;break a}f=c[e>>2]|0;if((c[f>>2]|0)==(b|0))break;else d=f}if(f)c[e>>2]=c[f+8>>2]}else c[e>>2]=c[d+8>>2];bC(a,d);d=0}while(0);return d|0}function EC(a,b){a=a|0;b=b|0;var d=0;d=vC(a)|0;a:do if((d|0)==(vC(b)|0))switch(c[b>>2]&3){case 0:{while(1){if((b|0)==(a|0)){b=1;break a}b=OD(b)|0;if(!b){b=0;break}}break}case 1:{b=b+8|0;b=(kC(a,c[b>>2]|0,c[b+4>>2]|0,0)|0)!=0;break a}default:{b=(jB(a,b,0)|0)!=0;break a}}else b=0;while(0);return b&1|0}function FC(a){a=a|0;return c[a>>2]&3|0}function GC(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+16|0;f=g;e=RC(a,96813,44,0)|0;switch(c|0){case 100:{c=HC(e,b,100)|0;if(!(IC(c,b)|0))JC(c,a,b,d)|0;break}case 101:{if((IC(HC(e,b,100)|0,b)|0)==0?(IC(HC(e,b,102)|0,b)|0)==0:0){e=HC(e,b,101)|0;c=IC(e,b)|0;if(!c)c=JC(e,a,b,d)|0;KC(b,c,d)}break}case 102:{LC(HC(e,b,100)|0,b);LC(HC(e,b,101)|0,b);c=HC(e,b,102)|0;if(!(IC(c,b)|0))JC(c,a,b,d)|0;break}default:dA(1,96825,f)|0}l=g;return}function HC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+16|0;e=g;a:do switch(c[b>>2]&3){case 0:switch(d|0){case 100:{d=a+8|0;break a}case 101:{d=a+20|0;break a}case 102:{d=a+32|0;break a}default:{f=14;break a}}case 1:switch(d|0){case 100:{d=a+12|0;break a}case 101:{d=a+24|0;break a}case 102:{d=a+36|0;break a}default:{f=14;break a}}case 2:switch(d|0){case 100:{d=a+16|0;break a}case 101:{d=a+28|0;break a}case 102:{d=a+40|0;break a}default:{f=14;break a}}default:f=14}while(0);if((f|0)==14){dA(1,96859,e)|0;d=0}a=c[d>>2]|0;if(!a){a=uC(b)|0;a=SD(a,18872,c[4599]|0)|0;c[d>>2]=a}l=g;return a|0}function IC(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+32|0;e=d;f=MC(b)|0;b=e+8|0;c[b>>2]=f;c[b+4>>2]=D;b=eb[c[a>>2]&63](a,e,4)|0;l=d;return b|0}function JC(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=aC(uC(d)|0,32)|0;c[f+20>>2]=d;g=MC(d)|0;d=f+8|0;c[d>>2]=g;c[d+4>>2]=D;c[f+16>>2]=b;if(e|0){g=aC(b,8)|0;c[f+24>>2]=g;c[g>>2]=e}eb[c[a>>2]&63](a,f,1)|0;return f|0}function KC(a,b,d){a=a|0;b=b|0;d=d|0;a=b+24|0;while(1){a=c[a>>2]|0;if(!a)break;if((c[a>>2]|0)==(d|0))break;else a=a+4|0}return}function LC(a,b){a=a|0;b=b|0;b=IC(a,b)|0;if(b|0)eb[c[a>>2]&63](a,b,2)|0;return}function MC(a){a=a|0;a=a+8|0;D=c[a+4>>2]|0;return c[a>>2]|0}function NC(a,b,d){a=a|0;b=b|0;d=d|0;OC(b);bC(c[b+16>>2]|0,b);return}function OC(a){a=a|0;var b=0,d=0;b=a+16|0;a=c[a+24>>2]|0;while(1){if(!a)break;d=c[a+4>>2]|0;bC(c[b>>2]|0,a);a=d}return}function PC(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;i=k;h=c[b+16>>2]|0;f=h;while(1){if(!f){f=0;break}g=c[f>>2]|0;if((g|0)==(d|0)){j=7;break}if((a[d>>0]|0)==(a[g>>0]|0)?(f2(d,g)|0)==0:0){j=7;break}f=c[f+4>>2]|0;if((f|0)==(h|0)){f=0;break}}do if((j|0)==7){if(!(c[b>>2]&4)){if((f|0)==(h|0)&(e|0)==0){f=h;break}QC(b,f,e);break}if(e)if((h|0)==(f|0))f=h;else dA(1,96884,i)|0}while(0);l=k;return f|0}function QC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;c[a+16>>2]=b;e=c[a>>2]|0;d=d<<2&4;c[a>>2]=e&-5|d;if(e&2|0){e=(e&3|0)==3?-1:1;c[a+(e*48|0)+16>>2]=b;e=a+(e*48|0)|0;c[e>>2]=c[e>>2]&-5|d}return}function RC(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=uC(a)|0;f=PC(a,b,0)|0;a:do if((d|0)!=0&(f|0)==0){d=aC(h,d)|0;c[d>>2]=dD(h,b)|0;switch(c[a>>2]&3){case 0:{SC(a,d);g=d;break a}case 1:{SC(a,d);g=d;break a}case 2:case 3:{SC(a,d);g=d;break a}default:{}}}else g=f;while(0);if(e|0)PC(a,b,1)|0;return g|0}function SC(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=c[a+16>>2]|0;do if(d){e=d+4|0;f=c[e>>2]|0;if((f|0)==(d|0)){c[e>>2]=b;e=d;d=b;break}else{c[b+4>>2]=f;e=b;break}}else{e=b;d=b}while(0);c[d+4>>2]=e;if(!(c[a>>2]&4))QC(a,b,0);return}function TC(a,b){a=a|0;b=b|0;var d=0,e=0;e=uC(a)|0;d=PC(a,b,0)|0;if(!d)b=-1;else{UC(a,d);if(!(c[a>>2]&3)){VC(e,a,d);b=d}else{zE(vC(e)|0,a,60,d,0)|0;b=d}fD(e,c[d>>2]|0)|0;bC(e,b);b=0}return b|0}function UC(a,b){a=a|0;b=b|0;var d=0;a=c[a+16>>2]|0;do{d=a+4|0;a=c[d>>2]|0}while((a|0)!=(b|0));c[d>>2]=c[b+4>>2];return}function VC(a,b,d){a=a|0;b=b|0;d=d|0;if((c[b+16>>2]|0)==(d|0)){a=c[d+4>>2]|0;QC(b,(a|0)==(d|0)?0:a,0)}return}function WC(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;f=(d|0)>-1;g=f?d:0-d|0;a:do switch(b|0){case 0:{RC(a,c,g,e)|0;if(!f){b=MD(a)|0;while(1){if(!b)break a;WC(b,0,c,d,e);b=ND(b)|0}}break}case 3:case 2:case 1:{d=(b|0)==1;b=gC(a)|0;while(1){if(!b)break a;b:do if(d)RC(b,c,g,e)|0;else{f=UA(a,b)|0;while(1){if(!f)break b;RC(f,c,g,e)|0;f=WA(a,f)|0}}while(0);b=hC(a,b)|0}}default:{}}while(0);return}function XC(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;a:do switch(b|0){case 0:{zE(a,a,61,c,1)|0;break}case 3:case 2:case 1:{e=(b|0)==1;d=gC(a)|0;while(1){if(!d)break a;b:do if(e)TC(d,c)|0;else{b=UA(a,d)|0;while(1){if(!b)break b;TC(b,c)|0;b=WA(a,b)|0}}while(0);d=hC(a,d)|0}}default:{}}while(0);return}function YC(a,b,c){a=a|0;b=b|0;c=c|0;TC(b,c)|0;return}function ZC(a){a=a|0;var b=0,d=0,e=0;d=uC(a)|0;b=a+16|0;a=c[b>>2]|0;if(a|0)do{e=a;a=c[a+4>>2]|0;fD(d,c[e>>2]|0)|0;bC(d,e)}while((a|0)!=(c[b>>2]|0));c[b>>2]=0;return}function _C(a){a=a|0;return UD(a,$C(a)|0)|0}function $C(a){a=a|0;var b=0,d=0;if(!a)d=188016;else d=(c[a+64>>2]|0)+20|0;b=c[d>>2]|0;if(!b){b=SD(a,18908,c[4599]|0)|0;c[d>>2]=b;a=186480;c[a>>2]=-2147483648;c[a+4>>2]=0;a=186488;c[a>>2]=2147483647;c[a+4>>2]=-1}return b|0}function aD(a,b){a=a|0;b=b|0;return bD($C(a)|0,b)|0}function bD(a,b){a=a|0;b=b|0;a=cD(a,b)|0;if(!a)a=0;else a=c[a+16>>2]|0;return a|0}function cD(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+32|0;e=d;c[e+16>>2]=b;b=eb[c[a>>2]&63](a,e,4)|0;l=d;return b|0}function dD(a,b){a=a|0;b=b|0;var d=0,e=0;if(!b)d=0;else{e=$C(a)|0;d=cD(e,b)|0;if(!d){d=(D3(b)|0)+24|0;if(!a)d=k6(d)|0;else d=aC(a,d)|0;a=d+8|0;c[a>>2]=1;c[a+4>>2]=0;a=d+20|0;O3(a,b)|0;c[d+16>>2]=a;eb[c[e>>2]&63](e,d,1)|0}else{e=d+8|0;b=e;b=w6(c[b>>2]|0,c[b+4>>2]|0,1,0)|0;c[e>>2]=b;c[e+4>>2]=D}d=c[d+16>>2]|0}return d|0}function eD(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;if(!b)d=0;else{e=$C(a)|0;d=cD(e,b)|0;if(!d){d=(D3(b)|0)+24|0;if(!a)d=k6(d)|0;else d=aC(a,d)|0;g=186480;f=c[g+4>>2]|0;a=d+8|0;c[a>>2]=c[g>>2]|1;c[a+4>>2]=f;a=d+20|0;O3(a,b)|0;c[d+16>>2]=a;eb[c[e>>2]&63](e,d,1)|0}else{g=d+8|0;f=g;f=w6(c[f>>2]|0,c[f+4>>2]|0,1,0)|0;c[g>>2]=f;c[g+4>>2]=D}d=c[d+16>>2]|0}return d|0}function fD(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;if((b|0)!=0?(d=$C(a)|0,e=cD(d,b)|0,(e|0)!=0):0)if((c[e+16>>2]|0)==(b|0)?(b=e+8|0,g=b,g=w6(c[g>>2]|0,c[g+4>>2]|0,-1,-1)|0,f=D,b,c[b>>2]=g,c[b+4>>2]=f,b=186488,!(((g|0)!=0|(f|0)!=0)&((c[b>>2]|0)!=0|(c[b+4>>2]|0)!=0))):0){TD(a,d,e)|0;a=0}else a=0;else a=-1;return a|0}function gD(a){a=a|0;var b=0;if(!a)a=0;else{a=a+-12|0;b=186480;a=c[b>>2]&c[a>>2]}return a|0}function hD(a){a=a|0;var b=0,d=0,e=0;if(a|0){d=186480;a=a+-12|0;e=a;b=c[e+4>>2]|c[d+4>>2];c[a>>2]=c[e>>2]|c[d>>2];c[a+4>>2]=b}return}function iD(a){a=a|0;c[47009]=a;c[4736]=1;return}function jD(a,b){a=a|0;b=b|0;c[47010]=a;c[47011]=b;c[47012]=0;return}function kD(){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;if(!(c[47013]|0)){c[47013]=1;if(!(c[47014]|0))c[47014]=1;if(!(c[47005]|0))c[47005]=c[15808];if(!(c[47006]|0))c[47006]=c[15840];k=c[47015]|0;if(!((k|0)!=0?(c[k+(c[47016]<<2)>>2]|0)!=0:0)){lD();k=mD(c[47005]|0,16384)|0;c[(c[47015]|0)+(c[47016]<<2)>>2]=k}nD()}a:while(1){h=c[47017]|0;a[h>>0]=a[195085]|0;e=(c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]|0)+(c[47014]|0)|0;f=h;b:while(1){i=f;while(1){f=c[18948+(d[i>>0]<<2)>>2]|0;if(b[64128+(e<<1)>>1]|0){c[47018]=e;c[47019]=i}c:while(1){g=f&255;do{f=(b[64314+(e<<1)>>1]|0)+g|0;if((b[64524+(f<<1)>>1]|0)==(e|0))break c;k=b[65060+(e<<1)>>1]|0;e=k<<16>>16}while(k<<16>>16<=92);f=c[19972+(g<<2)>>2]|0}e=b[65270+(f<<1)>>1]|0;f=i+1|0;if((b[64314+(e<<1)>>1]|0)==219)break;else i=f}d:while(1){k=h;e:while(1){e=b[64128+(e<<1)>>1]|0;if(!(e<<16>>16)){e=b[64128+(c[47018]<<1)>>1]|0;f=c[47019]|0}else e=e<<16>>16;c[47007]=h;j=f;c[47008]=j-k;a[195085]=a[f>>0]|0;a[f>>0]=0;c[47017]=f;f:while(1){switch(e|0){case 1:{m=27;break a}case 12:{m=53;break a}case 13:{m=55;break a}case 14:{m=57;break a}case 15:{m=61;break a}case 16:{m=65;break a}case 17:{m=67;break a}case 18:{m=69;break a}case 19:{m=72;break a}case 20:{m=75;break a}case 21:{m=78;break a}case 23:{m=86;break a}case 33:{m=118;break a}case 39:case 38:case 37:case 36:{l=0;break a}case 2:{m=29;break b}case 3:{m=32;break b}case 4:{m=35;break b}case 5:{m=37;break b}case 6:{m=39;break b}case 7:{m=42;break b}case 8:{m=44;break b}case 9:{m=47;break b}case 10:{m=49;break b}case 11:{m=51;break b}case 22:{m=83;break b}case 24:{m=89;break b}case 25:{m=92;break b}case 26:{m=95;break b}case 27:{m=98;break b}case 28:{m=101;break b}case 29:{m=104;break b}case 30:{m=109;break b}case 31:{m=112;break b}case 32:{m=115;break b}case 34:{m=121;break b}case 0:break f;case 35:break;default:{m=134;break a}}i=c[47007]|0;a[f>>0]=a[195085]|0;e=(c[47015]|0)+(c[47016]<<2)|0;g=c[e>>2]|0;if(!(c[g+44>>2]|0)){n=c[g+16>>2]|0;c[47021]=n;c[g>>2]=c[47005];g=c[e>>2]|0;c[g+44>>2]=1;e=n}else e=c[47021]|0;if((c[47017]|0)>>>0<=((c[g+4>>2]|0)+e|0)>>>0){m=128;break e}switch(wD()|0){case 0:{m=132;break d}case 2:{m=133;break e}case 1:break;default:continue a}c[47017]=c[47007];e=(((c[47014]|0)+-1|0)/2|0)+36|0}a[f>>0]=a[195085]|0;f=c[47019]|0;e=c[47018]|0}if((m|0)==128){m=0;g=(c[47007]|0)+(j-i+-1)|0;c[47017]=g;e=uD()|0;f=vD(e)|0;h=c[47007]|0;if(!f){f=g;continue}else{m=129;break}}else if((m|0)==133){m=0;f=(c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+4>>2]|0)+(c[47021]|0)|0;c[47017]=f;e=uD()|0;h=c[47007]|0;continue}}if((m|0)==129){m=0;n=g+1|0;c[47017]=n;e=f;f=n;continue}else if((m|0)==132){m=0;f=(c[47007]|0)+(j-i+-1)|0;c[47017]=f;e=uD()|0;h=c[47007]|0;continue}}switch(m|0){case 29:{m=0;e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;c[4736]=(c[4736]|0)+1;continue a}case 32:{m=0;e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;c[47014]=3;continue a}case 35:{m=0;e=c[47008]|0;if(!e)continue a;c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;continue a}case 37:{m=0;e=c[47008]|0;if(!e)continue a;c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;continue a}case 39:{m=0;e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;c[47014]=1;continue a}case 42:{m=0;e=c[47008]|0;if(!e)continue a;c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;continue a}case 44:{m=0;e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;oD();continue a}case 47:{m=0;e=c[47008]|0;if(!e)continue a;c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;continue a}case 49:{m=0;e=c[47008]|0;if(!e)continue a;c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;continue a}case 51:{m=0;e=c[47008]|0;if(!e)continue a;c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;continue a}case 83:{m=0;e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;c[47014]=5;qD();continue a}case 89:{m=0;e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;sD(99045);continue a}case 92:{m=0;e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;sD(96917);continue a}case 95:{m=0;e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;c[4736]=(c[4736]|0)+1;continue a}case 98:{m=0;e=c[47008]|0;f=c[47007]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[f+(e+-1)>>0]|0)==10&1;sD(f);continue a}case 101:{m=0;e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;c[47014]=7;c[47020]=1;qD();continue a}case 104:{m=0;e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;n=(c[47020]|0)+-1|0;c[47020]=n;if(!n){m=108;break a}sD(c[47007]|0);continue a}case 109:{m=0;e=c[47008]|0;f=c[47007]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[f+(e+-1)>>0]|0)==10&1;c[47020]=(c[47020]|0)+1;sD(f);continue a}case 112:{m=0;e=c[47008]|0;f=c[47007]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[f+(e+-1)>>0]|0)==10&1;sD(f);c[4736]=(c[4736]|0)+1;continue a}case 115:{m=0;e=c[47008]|0;f=c[47007]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[f+(e+-1)>>0]|0)==10&1;sD(f);continue a}case 121:{m=0;e=c[47008]|0;f=c[47007]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[f+(e+-1)>>0]|0)==10&1;_3(f,e,1,c[47006]|0)|0;continue a}}}switch(m|0){case 27:{e=c[47008]|0;if(!e)l=-1;else{c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;l=-1}break}case 53:{e=c[47008]|0;if(!e)l=259;else{c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;l=259}break}case 55:{e=c[47008]|0;if(!e)l=260;else{c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;l=260}break}case 57:{e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;if(!(c[47012]|0)){c[47012]=258;l=258}else l=258;break}case 61:{e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;if(!(c[47012]|0)){c[47012]=261;l=261}else l=261;break}case 65:{e=c[47008]|0;if(!e)l=263;else{c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;l=263}break}case 67:{e=c[47008]|0;if(!e)l=262;else{c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;l=262}break}case 69:{e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;l=(c[47012]|0)==261?264:45;break}case 72:{e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;l=(c[47012]|0)==258?264:45;break}case 75:{e=c[47008]|0;f=c[47007]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[f+(e+-1)>>0]|0)==10&1;c[47036]=dD(c[46985]|0,f)|0;l=267;break}case 78:{e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;if(pD()|0){m=(c[47008]|0)+-1|0;a[f>>0]=a[195085]|0;n=h+m|0;c[47017]=n;c[47007]=h;c[47008]=m;a[195085]=a[n>>0]|0;a[n>>0]=0;c[47017]=n}c[47036]=dD(c[46985]|0,c[47007]|0)|0;l=267;break}case 86:{e=c[47008]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[(c[47007]|0)+(e+-1)>>0]|0)==10&1;c[47014]=1;rD();l=268;break}case 108:{c[47014]=1;tD();l=268;break}case 118:{e=c[47008]|0;f=c[47007]|0;if(e|0)c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]=(a[f+(e+-1)>>0]|0)==10&1;l=a[f>>0]|0;break}case 134:{xD(96920);break}}return l|0}function lD(){var a=0,b=0,d=0;b=c[47015]|0;do if(!b){a=ED(4)|0;c[47015]=a;if(!a)xD(97278);else{c[a>>2]=0;c[47027]=1;c[47016]=0;break}}else{a=c[47027]|0;if((c[47016]|0)>>>0>=(a+-1|0)>>>0){d=a+8|0;a=yD(b,d<<2)|0;c[47015]=a;if(!a)xD(97278);else{b=a+(c[47027]<<2)|0;c[b>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b+16>>2]=0;c[b+20>>2]=0;c[b+24>>2]=0;c[b+28>>2]=0;c[47027]=d;break}}}while(0);return}function mD(a,b){a=a|0;b=b|0;var d=0;d=ED(48)|0;if(!d)xD(97233);c[d+12>>2]=b;b=ED(b+2|0)|0;c[d+4>>2]=b;if(!b)xD(97233);else{c[d+20>>2]=1;AD(d,a);return d|0}return 0}function nD(){var b=0,d=0;d=(c[47015]|0)+(c[47016]<<2)|0;b=c[d>>2]|0;c[47021]=c[b+16>>2];b=c[b+8>>2]|0;c[47017]=b;c[47007]=b;c[47005]=c[c[d>>2]>>2];a[195085]=a[b>>0]|0;return}function oD(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0;g=l;l=l+32|0;f=g;d=g+16|0;e=g+12|0;h=c[47007]|0;b=h+1|0;i=(h2(b,97217,4)|0)==0;b=i?h+5|0:b;c[f>>2]=e;c[f+4>>2]=g+20;c[f+8>>2]=d;f=q4(b,97222,f)|0;if((f|0)>0?(c[4736]=(c[e>>2]|0)+-1,(f|0)!=1):0){d=b+(c[d>>2]|0)|0;b=d;a:while(1){e=a[b>>0]|0;switch(e<<24>>24){case 0:case 34:break a;default:{}}b=b+1|0}if((b|0)!=(d|0)&e<<24>>24==34){a[b>>0]=0;DD(d,b-d|0)}}l=g;return}function pD(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;j=l;l=l+2080|0;i=j+8|0;f=j;b=j+1056|0;d=j+32|0;h=j+16|0;k=a[(c[47007]|0)+((c[47008]|0)+-1)>>0]|0;e=k<<24>>24==46;if(e|((k&255)+-48|0)>>>0<10)if(e?(CD()|0)!=0:0)g=4;else b=0;else g=4;if((g|0)==4){k=c[47009]|0;hA(h,1024,b);kA(h,97128)|0;kA(h,c[47007]|0)|0;c[f>>2]=c[4736];i2(d,97172,f)|0;kA(h,d)|0;kA(h,(k|0)==0?97122:k)|0;kA(h,97189)|0;d=h+4|0;b=c[d>>2]|0;if(b>>>0>=(c[h+8>>2]|0)>>>0){iA(h,1)|0;b=c[d>>2]|0}a[b>>0]=0;b=c[h>>2]|0;c[d>>2]=b;c[i>>2]=b;dA(0,97214,i)|0;lA(h);b=1}l=j;return b|0}function qD(){var b=0;b=c[47022]|0;if(!b){b=k6(1024)|0;c[47022]=b;c[47024]=b+1024}c[47023]=b;a[b>>0]=0;return}function rD(){c[47036]=dD(c[46985]|0,c[47022]|0)|0;a[c[47022]>>0]=0;return}function sD(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;e=c[47023]|0;d=c[47022]|0;if(e>>>0>d>>>0){e=e+-1|0;f=3}a:while(1){if((f|0)==3)c[47023]=e;f=c[47024]|0;g=f;do{h=b;b=b+1|0;h=a[h>>0]|0;i=e;e=e+1|0;a[i>>0]=h;if(!(h<<24>>24))break a}while(e>>>0>>0);c[47023]=e;f=d;i=g-f<<1;d=n6(d,i)|0;c[47022]=d;c[47024]=d+i;e=d+(e-f)|0;f=3}c[47023]=e;return}function tD(){c[47036]=eD(c[46985]|0,c[47022]|0)|0;a[c[47022]>>0]=0;return}function uD(){var d=0,e=0,f=0,g=0,h=0;h=c[47017]|0;g=c[47007]|0;e=(c[(c[(c[47015]|0)+(c[47016]<<2)>>2]|0)+28>>2]|0)+(c[47014]|0)|0;while(1){if(g>>>0>=h>>>0)break;d=a[g>>0]|0;if(!(d<<24>>24))d=1;else d=c[18948+((d&255)<<2)>>2]|0;if(b[64128+(e<<1)>>1]|0){c[47018]=e;c[47019]=g}a:while(1){f=d&255;do{d=(b[64314+(e<<1)>>1]|0)+f|0;if((b[64524+(d<<1)>>1]|0)==(e|0))break a;d=b[65060+(e<<1)>>1]|0;e=d<<16>>16}while(d<<16>>16<=92);d=c[19972+(f<<2)>>2]|0}g=g+1|0;e=b[65270+(d<<1)>>1]|0}return e|0}function vD(a){a=a|0;var d=0;if(b[64128+(a<<1)>>1]|0){d=c[47017]|0;c[47018]=a;c[47019]=d}while(1){d=(b[64314+(a<<1)>>1]|0)+1|0;if((b[64524+(d<<1)>>1]|0)==(a|0))break;a=b[65060+(a<<1)>>1]|0}d=b[65270+(d<<1)>>1]|0;return (d<<16>>16==92?0:d<<16>>16)|0}function wD(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;i=(c[47015]|0)+(c[47016]<<2)|0;g=c[i>>2]|0;h=c[g+4>>2]|0;e=c[47007]|0;l=c[47017]|0;j=l;if(l>>>0>(h+((c[47021]|0)+1)|0)>>>0)xD(96975);f=j-e|0;if(!(c[g+40>>2]|0))b=(f|0)==1?1:2;else{l=f+-1|0;g=h;f=0;while(1){if((f|0)>=(l|0))break;a[g>>0]=a[e>>0]|0;g=g+1|0;e=e+1|0;f=f+1|0}e=c[i>>2]|0;do if((c[e+44>>2]|0)==2){c[47021]=0;c[e+16>>2]=0;m=17}else{while(1){h=e+12|0;g=c[h>>2]|0;f=g-l+-1|0;if(f|0){m=16;break}f=e+4|0;i=c[f>>2]|0;if(!(c[e+20>>2]|0)){m=12;break}e=g<<1;e=(e|0)==0?(g>>>3)+g|0:e;c[h>>2]=e;e=yD(i,e+2|0)|0;c[f>>2]=e;if(!e)break;i=e+(j-i)|0;c[47017]=i;e=c[(c[47015]|0)+(c[47016]<<2)>>2]|0;j=i}if((m|0)==12)c[f>>2]=0;else if((m|0)==16){d=eb[c[c[(c[47010]|0)+8>>2]>>2]&63](c[47011]|0,(c[e+4>>2]|0)+l|0,f>>>0<8192?f:8192)|0;c[47021]=d;e=c[(c[47015]|0)+(c[47016]<<2)>>2]|0;c[e+16>>2]=d;if(!d){m=17;break}else{b=0;k=e;break}}xD(97031)}while(0);do if((m|0)==17)if(!l){zD(c[47005]|0);b=1;d=c[47021]|0;k=c[(c[47015]|0)+(c[47016]<<2)>>2]|0;break}else{c[e+44>>2]=2;b=2;d=0;k=e;break}while(0);e=d+l|0;do if(e>>>0>(c[k+12>>2]|0)>>>0){m=yD(c[k+4>>2]|0,e+(d>>>1)|0)|0;d=(c[47015]|0)+(c[47016]<<2)|0;c[(c[d>>2]|0)+4>>2]=m;d=c[(c[d>>2]|0)+4>>2]|0;if(!d)xD(97075);else{n=c[47021]|0;o=d;break}}else{n=d;o=c[k+4>>2]|0}while(0);n=n+l|0;c[47021]=n;a[o+n>>0]=0;o=(c[47015]|0)+(c[47016]<<2)|0;a[(c[(c[o>>2]|0)+4>>2]|0)+((c[47021]|0)+1)>>0]=0;c[47007]=c[(c[o>>2]|0)+4>>2]}return b|0}function xD(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=c[15715]|0;c[b>>2]=a;z4(d,96971,b)|0;$a(2)}function yD(a,b){a=a|0;b=b|0;return n6(a,b)|0}function zD(a){a=a|0;var b=0,d=0,e=0;d=c[47015]|0;if((d|0)!=0?(b=c[d+(c[47016]<<2)>>2]|0,(b|0)!=0):0)e=4;else{lD();b=mD(c[47005]|0,16384)|0;d=c[47015]|0;c[d+(c[47016]<<2)>>2]=b;if(!d)b=0;else e=4}AD(b,a);nD();return}function AD(a,b){a=a|0;b=b|0;var d=0;d=c[(L1()|0)>>2]|0;BD(a);c[a>>2]=b;c[a+40>>2]=1;b=c[47015]|0;if(!b)b=0;else b=c[b+(c[47016]<<2)>>2]|0;if((b|0)!=(a|0)){c[a+32>>2]=1;c[a+36>>2]=0}c[a+24>>2]=0;c[(L1()|0)>>2]=d;return}function BD(b){b=b|0;var d=0;if(b|0){c[b+16>>2]=0;d=b+4|0;a[c[d>>2]>>0]=0;a[(c[d>>2]|0)+1>>0]=0;c[b+8>>2]=c[d>>2];c[b+28>>2]=1;c[b+44>>2]=0;d=c[47015]|0;if(!d)d=0;else d=c[d+(c[47016]<<2)>>2]|0;if((d|0)==(b|0))nD()}return}function CD(){var b=0,d=0;d=c[47007]|0;b=(c[47008]|0)+-2|0;while(1){if((b|0)<=-1){b=0;break}if((a[d+b>>0]|0)==46){b=1;break}else b=b+-1|0}return b|0}function DD(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[47025]|0;if((d|0)<(b|0)){e=b+1|0;if(!d)d=k6(e)|0;else d=n6(c[47026]|0,e)|0;c[47026]=d;c[47025]=b}else d=c[47026]|0;O3(d,a)|0;c[47009]=c[47026];return}function ED(a){a=a|0;return k6(a)|0}function FD(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+2112|0;k=m+32|0;i=m+24|0;h=m+16|0;g=m+8|0;f=m;d=m+56|0;j=m+40|0;hA(j,1024,m+1080|0);e=c[47009]|0;if(e|0){kA(j,e)|0;kA(j,97328)|0}kA(j,b)|0;c[f>>2]=c[4736];i2(d,97331,f)|0;kA(j,d)|0;a:do if(!(a[c[47007]>>0]|0))switch(((c[47014]|0)+-1|0)/2|0|0){case 2:{c[g>>2]=16384;i2(d,97351,g)|0;kA(j,d)|0;b=c[47022]|0;if(!(a[b>>0]|0))break a;i=D3(b)|0;kA(j,97413)|0;b=c[47022]|0;if((i|0)>80)a[b+80>>0]=0;kA(j,b)|0;break a}case 3:{c[h>>2]=16384;i2(d,97432,h)|0;kA(j,d)|0;b=c[47022]|0;if(!(a[b>>0]|0))break a;i=D3(b)|0;kA(j,97500)|0;b=c[47022]|0;if((i|0)>80)a[b+80>>0]=0;kA(j,b)|0;break a}case 1:{c[i>>2]=16384;i2(d,97519,i)|0;kA(j,d)|0;break a}default:break a}else{kA(j,97343)|0;kA(j,c[47007]|0)|0;d=j+4|0;b=c[d>>2]|0;if(b>>>0>=(c[j+8>>2]|0)>>>0){iA(j,1)|0;b=c[d>>2]|0}c[d>>2]=b+1;a[b>>0]=39}while(0);e=j+4|0;b=c[e>>2]|0;d=j+8|0;if(b>>>0>=(c[d>>2]|0)>>>0){iA(j,1)|0;b=c[e>>2]|0}c[e>>2]=b+1;a[b>>0]=10;b=c[e>>2]|0;if(b>>>0>=(c[d>>2]|0)>>>0){iA(j,1)|0;b=c[e>>2]|0}a[b>>0]=0;i=c[j>>2]|0;c[e>>2]=i;c[k>>2]=i;dA(1,97214,k)|0;lA(j);l=m;return}function GD(){HD(c[47007]|0);return}function HD(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=c[47017]|0;a[j>>0]=a[195085]|0;i=(c[47015]|0)+(c[47016]<<2)|0;e=c[i>>2]|0;d=c[e+4>>2]|0;if(j>>>0<(d+2|0)>>>0){f=d+((c[47021]|0)+2)|0;g=d+((c[e+12>>2]|0)+2)|0;k=d;h=e;while(1){if(f>>>0<=k>>>0)break;e=f+-1|0;k=g+-1|0;a[k>>0]=a[e>>0]|0;h=c[i>>2]|0;f=e;g=k;k=c[h+4>>2]|0}e=g-f|0;d=j+e|0;j=c[h+12>>2]|0;c[47021]=j;c[h+16>>2]=j;if(d>>>0<(k+2|0)>>>0)xD(97578);else{l=b+e|0;m=d}}else{l=b;m=j}b=m+-1|0;a[b>>0]=64;c[47007]=l;a[195085]=a[b>>0]|0;c[47017]=b;return}function ID(){var a=0;a=c[47015]|0;if(!a)a=0;else a=c[a+(c[47016]<<2)>>2]|0;BD(a);return}function JD(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+80|0;f=e;g=a+52|0;VD(a,c[g>>2]|0,18592);a=f+8|0;c[a>>2]=b;c[a+4>>2]=d;d=c[g>>2]|0;d=eb[c[d>>2]&63](d,f,4)|0;l=e;return d|0}function KD(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=JD(b,d,e)|0;if(!f){f=aC(b,72)|0;c[f+64>>2]=c[b+64>>2];g=f+24|0;h=c[b+24>>2]|0;c[g>>2]=h;a[g>>0]=h&255&-9;c[f+56>>2]=b;c[f+60>>2]=c[b+60>>2];b=f+8|0;c[b>>2]=d;c[b+4>>2]=e;nB(f)|0}return f|0}function LD(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+16|0;f=g;if(!(((b|0)!=0?(EB(a,0,b,f,0)|0)!=0:0)?(e=f,e=JD(a,c[e>>2]|0,c[e+4>>2]|0)|0,(e|0)!=0):0))if((d|0)!=0?(EB(a,0,b,f,1)|0)!=0:0){e=f;e=KD(a,c[e>>2]|0,c[e+4>>2]|0)|0;IB(a,0,e)}else e=0;l=g;return e|0}function MD(a){a=a|0;a=c[a+52>>2]|0;return eb[c[a>>2]&63](a,0,128)|0}function ND(a){a=a|0;var b=0;b=OD(a)|0;if(!b)a=0;else{b=c[b+52>>2]|0;a=eb[c[b>>2]&63](b,a,8)|0}return a|0}function OD(a){a=a|0;return c[a+56>>2]|0}function PD(a,b){a=a|0;b=b|0;a=c[a+52>>2]|0;return eb[c[a>>2]&63](a,b,2)|0}function QD(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=c[47028]|0;e=(b|0)!=0;do if(!a)if(e){l6(b);a=0;break}else{a=k6(d)|0;break}else if(e){bC(a,b);a=0;break}else{a=aC(a,d)|0;break}while(0);return a|0}function RD(a,b,d){a=a|0;b=b|0;d=d|0;a=c[47028]|0;if(!a)l6(b);else bC(a,b);return}function SD(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=b+28|0;f=c[e>>2]|0;c[e>>2]=7;c[47028]=a;d=Sz(b,d)|0;c[e>>2]=f;c[47028]=0;return d|0}function TD(a,b,d){a=a|0;b=b|0;d=d|0;c[47028]=a;return eb[c[b>>2]&63](b,d,2)|0}function UD(a,b){a=a|0;b=b|0;var d=0,e=0;d=(_z(b,0,0)|0)+28|0;e=c[d>>2]|0;c[d>>2]=7;c[47028]=a;if(!(Oz(b)|0)){c[d>>2]=e;c[47028]=0;a=0}else a=1;return a|0}function VD(a,b,c){a=a|0;b=b|0;c=c|0;if(c|0?(_z(b,0,0)|0)!=(c|0):0)_z(b,c,0)|0;return}function WD(a,b){a=a|0;b=b|0;if(!(gD(a)|0))b=YD(a,b)|0;else XD(a,b)|0;return b|0}function XD(b,c){b=b|0;c=c|0;var d=0,e=0,f=0;a[c>>0]=60;f=c+1|0;while(1){d=a[b>>0]|0;e=f+1|0;if(!(d<<24>>24))break;a[f>>0]=d;f=e;b=b+1|0}a[f>>0]=62;a[e>>0]=0;return c|0}function YD(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;a:do if((b|0)!=0?(a[b>>0]|0)!=0:0){a[d>>0]=34;k=a[b>>0]|0;t=0;g=((k+-45&255)<2|((k&255)+-48|0)>>>0<10)&1;h=0;i=0;j=0;e=d+1|0;f=b+1|0;b:while(1){o=g;l=e;p=k;while(1){g=l+1|0;if(!(p<<24>>24))break b;e=p&255;c:do if(p<<24>>24==34){a[l>>0]=92;h=1}else{if(!o){g=p<<24>>24>-1&(p<<24>>24!=95&(O2(e)|0)==0);o=0;h=g?1:h;g=l;break}switch(p<<24>>24){case 45:{g=(j|0)==0;o=g?o:0;h=g?h:1;g=l;break c}case 46:{g=(i|0)==0;o=g?o:0;h=g?h:1;i=i+1|0;g=l;break c}default:{g=(e+-48|0)>>>0<10;o=g?o:0;h=g?h:1;g=l;break c}}}while(0);e=g+1|0;a[g>>0]=p;s=f+1|0;r=a[f>>0]|0;j=j+1|0;f=c[5042]|0;if(!f){l=e;f=s;p=r;continue}k=r&255;l=r<<24>>24!=0;m=g+2|0;n=r<<24>>24>-1;q=g+3|0;if((t&l?!(p<<24>>24==92|p<<24>>24>-1&((p+-45&255)>1&(O2(p<<24>>24)|0)==0)^1):0)?(r+-45&255)<2|(O2(k)|0)!=0|n^1:0)break;if((j|0)<(f|0)|l^1){l=e;f=s;p=r;continue}if(p<<24>>24==92|p<<24>>24>-1&((O2(p<<24>>24)|0)==0&(p+-45&255)>1)^1){t=1;g=o;k=r;f=s;continue b}if(!((r+-45&255)<2|(O2(k)|0)!=0|n^1)){t=1;g=o;k=r;f=s;continue b}a[e>>0]=92;a[m>>0]=10;h=1;j=0;l=q;f=s;p=r}a[e>>0]=92;a[m>>0]=10;t=0;g=o;h=1;j=0;k=r;e=q;f=s}a[l>>0]=34;a[g>>0]=0;if(!h){if((j|0)==1?((a[b>>0]|0)+-45&255)<2:0){b=d;break}else e=20172;while(1){f=c[e>>2]|0;if(!f)break a;if(!(C3(f,b)|0)){b=d;break}else e=e+4|0}}else b=d}else b=97610;while(0);return b|0}function ZD(a){a=a|0;return WD(a,_D(a)|0)|0}function _D(a){a=a|0;var b=0;b=((D3(a)|0)<<1)+2|0;b=b>>>0>1024?b:1024;a=c[47030]|0;if(b>>>0>(c[47029]|0)>>>0){if(!a)a=k6(b)|0;else a=n6(a,b)|0;c[47030]=a;c[47029]=b}return a|0}function $D(a,b){a=a|0;b=b|0;a=MD(a)|0;while(1){if(!a){a=0;break}if((aE(a)|0)==0?lC(a,b,0)|0:0){a=1;break}a=ND(a)|0}return a|0}function aE(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=HB(b)|0;if((h|0)!=0?(a[h>>0]|0)!=37:0)d=0;else e=3;a:do if((e|0)==3){d=tA(b)|0;b:do if(d|0?(f=tA(OD(b)|0)|0,f|0):0){h=Uz(c[(tA(vC(b)|0)|0)+8>>2]|0)|0;g=d+12|0;e=f+12|0;d=0;while(1){if((d|0)>=(h|0))break b;f=c[(c[g>>2]|0)+(d<<2)>>2]|0;if((f|0?(i=c[(c[e>>2]|0)+(d<<2)>>2]|0,i|0):0)?f2(f,i)|0:0){d=0;break a}d=d+1|0}}while(0);d=oA(b,0)|0;if(d)if((Uz(c[d+8>>2]|0)|0)>0)d=0;else return (Uz(c[d+12>>2]|0)|0)<1|0;else d=1}while(0);return d|0}function bE(b,d){b=b|0;d=d|0;var e=0,f=0;c[47031]=0;e=NA(b,97620)|0;if((e|0?((a[e>>0]|0)+-48|0)>>>0<10:0)?(f=$1(e,0,10)|0,(f|0)==0|(f|0)>59):0)c[5042]=f;cE(b,1);if(((dE(b,d,1)|0)!=-1?(eE(b,d)|0)!=-1:0)?(fE(b,d)|0)!=-1:0){c[5042]=128;b=pb[c[(c[(c[b+64>>2]|0)+8>>2]|0)+8>>2]&63](d)|0}else b=-1;return b|0}function cE(a,b){a=a|0;b=b|0;var d=0;c[a>>2]=c[a>>2]&-9;d=MD(a)|0;while(1){if(!d)break;cE(d,0);d=ND(d)|0}a:do if(b|0){b=gC(a)|0;while(1){if(!b)break a;c[b>>2]=c[b>>2]&-9;d=UA(a,b)|0;while(1){if(!d)break;c[d>>2]=c[d>>2]&-9;d=WA(a,d)|0}b=hC(a,b)|0}}while(0);return}function dE(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;if((e|0)==0?(OD(b)|0)!=0:0){i=0;g=195341;k=109815}else{k=(a[b+24>>0]&1)==0?195341:97664;g=(wB(b)|0)==0;c[47032]=DA(b,2,111756,0)|0;c[47033]=DA(b,2,111765,0)|0;i=1;g=g?195341:97667}f=HB(b)|0;if((f|0)!=0?(a[f>>0]|0)!=37:0){h=1;j=102905}else{h=0;j=195341;f=195341}do if((gE(b,d)|0)!=-1?(hE(b,d,g)|0)!=-1:0){g=(h|0)==0;if(h|i|0){if((hE(b,d,k)|0)==-1){f=-1;break}if((hE(b,d,102898)|0)==-1){f=-1;break}}if(!g?(sE(b,d,f)|0)==-1:0){f=-1;break}if(((hE(b,d,j)|0)!=-1?(hE(b,d,97675)|0)!=-1:0)?(c[47031]=(c[47031]|0)+1,(xE(b,d,e)|0)!=-1):0){c[b>>2]=c[b>>2]|8;f=0}else f=-1}else f=-1;while(0);return f|0}function eE(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;a:do if((iE(a,b)|0)==-1)d=-1;else{k=oA(vC(a)|0,0)|0;i=(k|0)!=0;j=k+8|0;k=k+12|0;h=gC(a)|0;while(1){if(!h){d=0;break a}if(jE(a,h,(c[h>>2]|0)>>>4,0)|0){if(i)d=c[j>>2]|0;else d=0;if((kE(h,b,d)|0)==-1){d=-1;break a}}g=UA(a,h)|0;d=h;while(1){if(!g)break;f=g+-48|0;e=c[((c[g>>2]&3|0)==2?g:f)+40>>2]|0;if((d|0)!=(e|0)?(jE(a,e,(c[h>>2]|0)>>>4,0)|0)!=0:0){if(i)d=c[j>>2]|0;else d=0;if((kE(c[((c[g>>2]&3|0)==2?g:f)+40>>2]|0,b,d)|0)==-1){d=-1;break a}d=c[((c[g>>2]&3|0)==2?g:f)+40>>2]|0}if(lE(a,g)|0){if(i)e=c[k>>2]|0;else e=0;if((mE(g,b,e)|0)==-1){d=-1;break a}}g=WA(a,g)|0}h=hC(a,h)|0}}while(0);return d|0}function fE(a,b){a=a|0;b=b|0;c[47031]=(c[47031]|0)+-1;if((gE(a,b)|0)==-1)a=-1;else a=((hE(a,b,111309)|0)==-1)<<31>>31;return a|0}function gE(a,b){a=a|0;b=b|0;var d=0;d=c[47031]|0;while(1){if((d|0)<=0){d=0;break}if((hE(a,b,153746)|0)==-1){d=-1;break}else d=d+-1|0}return d|0}function hE(a,b,d){a=a|0;b=b|0;d=d|0;return vb[c[(c[(c[a+64>>2]|0)+8>>2]|0)+4>>2]&127](b,d)|0}function iE(a,b){a=a|0;b=b|0;a=MD(a)|0;while(1){if(!a){a=0;break}if(!(aE(a)|0)){if((dE(a,b,0)|0)==-1){a=-1;break}if((eE(a,b)|0)==-1){a=-1;break}if((fE(a,b)|0)==-1){a=-1;break}}else iE(a,b)|0;a=ND(a)|0}return a|0}function jE(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;if(($D(a,b)|0)==0?(uE(a,b,c,d)|0)!=0:0)if((vE(a,b)|0)==0?(wE(b)|0)==0:0)e=5;else a=1;else e=5;if((e|0)==5)a=0;return a|0}function kE(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=uC(a)|0;do if((gE(d,b)|0)!=-1?(nE(a,b)|0)!=-1:0){if((pE(a)|0)==0?(qE(a,b,c)|0)==-1:0){a=-1;break}a=hE(d,b,97631)|0}else a=-1;while(0);return a|0}function lE(a,b){a=a|0;b=b|0;a=MD(a)|0;while(1){if(!a){a=1;break}if((aE(a)|0)==0?jB(a,b,0)|0:0){a=0;break}a=ND(a)|0}return a|0}function mE(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=c[a>>2]&3;g=c[((e|0)==3?a:a+48|0)+40>>2]|0;e=c[((e|0)==2?a:a+-48|0)+40>>2]|0;f=uC(g)|0;do if((((((gE(f,b)|0)!=-1?(nE(g,b)|0)!=-1:0)?(oE(a,b,c[47032]|0)|0)!=-1:0)?(g=(uB(uC(g)|0)|0)!=0,(hE(f,b,g?100380:100385)|0)!=-1):0)?(nE(e,b)|0)!=-1:0)?(oE(a,b,c[47033]|0)|0)!=-1:0){if(!(pE(a)|0)){if((qE(a,b,d)|0)==-1){a=-1;break}}else if((rE(a,b,1)|0)==-1){a=-1;break}a=hE(f,b,97631)|0}else a=-1;while(0);return a|0}function nE(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;i=l;l=l+32|0;g=i;d=i+8|0;e=HB(a)|0;f=uC(a)|0;if(!e){j=a+8|0;a=c[j+4>>2]|0;e=g;c[e>>2]=c[j>>2];c[e+4>>2]=a;i2(d,97651,g)|0;if((hE(f,b,d)|0)==-1)a=-1;else h=4}else if((sE(f,b,e)|0)==-1)a=-1;else h=4;if((h|0)==4)a=0;l=i;return a|0}function oE(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;a:do if((d|0)!=0?(e=uC(b)|0,f=OA(b,d)|0,(a[f>>0]|0)!=0):0)if((hE(e,c,108285)|0)==-1)b=-1;else{do if(gD(f)|0){if((sE(e,c,f)|0)==-1){b=-1;break a}}else{b=F3(f,58)|0;if(!b)if((tE(e,c,f,0)|0)==-1){b=-1;break a}else break;a[b>>0]=0;if((tE(e,c,f,0)|0)==-1){b=-1;break a}if((hE(e,c,108285)|0)==-1){b=-1;break a}if((tE(e,c,b+1|0,0)|0)==-1){b=-1;break a}a[b>>0]=58}while(0);b=0}else b=0;while(0);return b|0}function pE(a){a=a|0;return (c[a>>2]|0)>>>3&1|0}function qE(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;a:do if(!(c[a>>2]&2)){e=0;k=4}else{switch(rE(a,b,0)|0){case -1:{e=-1;break a}case 0:{e=0;k=4;break a}default:{}}e=1;k=4}while(0);b:do if((k|0)==4){f=tA(a)|0;j=uC(a)|0;c:do if(f){i=f+12|0;h=eb[c[d>>2]&63](d,0,128)|0;while(1){if(!h)break c;f=h+16|0;do if(c[a>>2]&2){g=c[47032]|0;if(g|0?(c[f>>2]|0)==(c[g+16>>2]|0):0)break;g=c[47033]|0;if(!((g|0)!=0?(c[f>>2]|0)==(c[g+16>>2]|0):0))k=12}else k=12;while(0);if((k|0)==12){k=0;if((c[(c[i>>2]|0)+(c[f>>2]<<2)>>2]|0)!=(c[h+12>>2]|0)){g=e+1|0;if(e){if((hE(j,b,97646)|0)==-1){e=-1;break b}if((gE(j,b)|0)==-1){e=-1;break b}}else{if((gE(j,b)|0)==-1){e=-1;break b}if((hE(j,b,97643)|0)==-1){e=-1;break b}c[47031]=(c[47031]|0)+1}if((sE(j,b,c[h+8>>2]|0)|0)==-1){e=-1;break b}if((hE(j,b,97649)|0)==-1){e=-1;break b}if((sE(j,b,c[(c[i>>2]|0)+(c[f>>2]<<2)>>2]|0)|0)==-1){e=-1;break b}else e=g}}h=eb[c[d>>2]&63](d,h,8)|0}}while(0);if((e|0)>0){if((hE(j,b,97641)|0)==-1){e=-1;break}c[47031]=(c[47031]|0)+-1}c[a>>2]=c[a>>2]|8;e=0}while(0);return e|0}function rE(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;e=HB(b)|0;b=uC(b)|0;if((e|0)!=0?(a[e>>0]|0)!=0:0)if((hE(b,c,97634)|0)!=-1?(sE(b,c,e)|0)!=-1:0)if((d|0)!=0?(hE(b,c,97641)|0)==-1:0)b=-1;else{b=1;f=7}else b=-1;else{b=0;f=7}return b|0}function sE(a,b,c){a=a|0;b=b|0;c=c|0;return tE(a,b,c,1)|0}function tE(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(!d)c=YD(c,_D(c)|0)|0;else c=ZD(c)|0;return hE(a,b,c)|0}function uE(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a:do if(0>>0|(0==(e|0)?(c[b>>2]|0)>>>4>>>0>>0:0))b=0;else{b=XA(a,b)|0;while(1){if(!b){b=1;break a}if(0>>0|(0==(e|0)?(c[c[b+40>>2]>>2]|0)>>>4>>>0>>0:0)){b=0;break a}b=YA(a,b)|0}}while(0);return b|0}function vE(a,b){a=a|0;b=b|0;if(!(XA(a,b)|0))a=(UA(a,b)|0)==0;else a=0;return a&1|0}function wE(a){a=a|0;var b=0,d=0,e=0;a=tA(a)|0;a:do if(!a)a=0;else{d=a+8|0;e=c[d>>2]|0;b=a+12|0;a=eb[c[e>>2]&63](e,0,128)|0;while(1){if(!a){a=0;break a}if((c[(c[b>>2]|0)+(c[a+16>>2]<<2)>>2]|0)!=(c[a+12>>2]|0)){a=1;break a}e=c[d>>2]|0;a=eb[c[e>>2]&63](e,a,8)|0}}while(0);return a|0}function xE(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=oA(a,0)|0;if(e)if(((yE(a,b,111795,c[e+16>>2]|0,d)|0)!=-1?(yE(a,b,111782,c[e+8>>2]|0,d)|0)!=-1:0)?(yE(a,b,111751,c[e+12>>2]|0,d)|0)!=-1:0)f=5;else a=-1;else f=5;if((f|0)==5)a=0;return a|0}function yE(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;m=(g|0)!=0;if(m)l=0;else l=Xz(f,0)|0;k=(l|0)==0;j=eb[c[f>>2]&63](f,0,128)|0;g=0;while(1){if(!j){n=23;break}i=j+12|0;n=c[i>>2]|0;if((n|0)!=0?(a[n>>0]|0)!=0:0)n=12;else n=7;do if((n|0)==7){n=0;if(!(a[j+22>>0]|0)){if(!k){h=eb[c[l>>2]&63](l,j,4)|0;o=c[h+12>>2]|0;if(o|0?a[o>>0]|0:0){n=12;break}if(!(a[h+22>>0]|0))n=12}}else n=12}while(0);if((n|0)==12){n=0;h=g+1|0;if(g){if((hE(b,d,97646)|0)==-1){g=-1;break}if((gE(b,d)|0)==-1){g=-1;break}}else{if((gE(b,d)|0)==-1){g=-1;break}if((hE(b,d,e)|0)==-1){g=-1;break}if((hE(b,d,97643)|0)==-1){g=-1;break}c[47031]=(c[47031]|0)+1}if((sE(b,d,c[j+8>>2]|0)|0)==-1){g=-1;break}if((hE(b,d,97649)|0)==-1){g=-1;break}if((sE(b,d,c[i>>2]|0)|0)==-1){g=-1;break}else g=h}j=eb[c[f>>2]&63](f,j,8)|0}do if((n|0)==23){if((g|0)>0){c[47031]=(c[47031]|0)+-1;if((g|0)!=1){if((hE(b,d,153748)|0)==-1){g=-1;break}if((gE(b,d)|0)==-1){g=-1;break}}g=(hE(b,d,97678)|0)==-1;if(m|g){g=g<<31>>31;break}}else if(m){g=0;break}Xz(f,l)|0;g=0}while(0);return g|0}function zE(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;switch(c[b>>2]&3){case 0:{g=82;break}case 1:{g=83;break}case 3:case 2:{g=84;break}default:{}}b=vb[g&127](a,b)|0;if(!b)b=-1;else{DE(a,b,d,e,g,f);b=0}return b|0}function AE(a,b){a=a|0;b=b|0;if((uC(b)|0)!=(a|0))b=jB(a,b,0)|0;return b|0}function BE(a,b){a=a|0;b=b|0;if((uC(b)|0)!=(a|0))b=lC(a,b,0)|0;return b|0}function CE(a,b){a=a|0;b=b|0;return a|0}function DE(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;h=(f|0)!=0;if(h)rb[c&127](a,b,d);g=MD(a)|0;while(1){if(!g)break;i=vb[e&127](g,b)|0;if(i|0)DE(g,i,c,d,e,f);g=ND(g)|0}if(!h)rb[c&127](a,b,d);return}function EE(){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=l;l=l+1200|0;s=u+800|0;h=u;c[47034]=0;c[47035]=-2;f=s;i=200;n=h;o=0;p=0;g=s;a:while(1){b[g>>1]=o;if((f+(i<<1)+-2|0)>>>0>g>>>0){q=i;r=f;k=h}else{m=(g-f>>1)+1|0;if(i>>>0>9999){t=76;break}j=i<<1;j=j>>>0<1e4?j:1e4;e=k6(j*6|3)|0;if(e){B6(e|0,f|0,m<<1|0)|0;i=e+(j>>>1<<2)|0;B6(i|0,n|0,m<<2|0)|0;if((f|0)==(s|0)){k=0;f=e}else{l6(f);k=0;f=e}}else{k=4;i=n}e=(k|0)==0;switch((e?((j|0)>(m|0)?0:9):k)&15){case 9:{e=1;t=77;break a}case 4:{t=76;break a}case 0:{q=j;r=f;k=e?i+(m<<2)+-4|0:h;n=i;g=e?f+(m<<1)+-2|0:g;break}default:{e=0;break a}}}if((o|0)==6){e=0;f=r;t=77;break}e=a[97682+o>>0]|0;i=e<<24>>24;j=(p|0)!=0;do if(e<<24>>24!=-18){f=c[47035]|0;if((f|0)==-2){f=kD()|0;c[47035]=f}if((f|0)>=1)if(f>>>0<269)h=d[97762+f>>0]|0;else h=2;else{c[47035]=0;h=0}f=h+i|0;if(f>>>0<=59?(d[98031+f>>0]|0)==(h|0):0){o=a[98091+f>>0]|0;e=o<<24>>24;if(o<<24>>24<1){f=0-e|0;t=23;break}else{c[47035]=-2;h=k+4|0;c[h>>2]=c[47036];j=j?p+-1|0:0;break}}else t=22}else t=22;while(0);if((t|0)==22){t=0;o=a[98151+o>>0]|0;f=o&255;if(!(o<<24>>24)){do if(j)if((p|0)==3){f=c[47035]|0;if((f|0)<1)if(!f){e=1;f=r;t=77;break a}else{f=k;break}else{c[47035]=-2;f=k;break}}else f=k;else{c[47034]=(c[47034]|0)+1;FD(142682);f=k}while(0);while(1){if(e<<24>>24==18)break;if((g|0)==(r|0)){e=1;f=r;t=77;break a}e=g+-2|0;f=f+-4|0;g=e;e=a[97682+(b[e>>1]|0)>>0]|0}h=f+4|0;c[h>>2]=c[47036];e=1;j=3}else t=23}do if((t|0)==23){t=0;j=d[98231+f>>0]|0;e=c[k+(1-j<<2)>>2]|0;h=k+-4|0;i=k+-8|0;b:do switch(f|0){case 2:{FE();GE();break}case 3:{if(c[47037]|0){FE();GE();pB(c[47037]|0)|0;c[46985]=0;c[47037]=0}break}case 6:{HE(c[k>>2]|0,c[h>>2]|0,c[i>>2]|0);break}case 7:{e=c[k>>2]|0;break}case 8:{e=0;break}case 9:{e=1;break}case 10:{e=0;break}case 11:{e=0;break}case 12:{e=1;break}case 21:if(!(c[h>>2]|0)){JE();break b}else{IE();break b}case 24:{KE();break}case 25:{KE();break}case 26:{e=1;break}case 27:{e=0;break}case 30:{LE(c[k>>2]|0,0,0);break}case 31:{LE(c[i>>2]|0,c[k>>2]|0,0);break}case 32:{LE(c[k+-16>>2]|0,c[i>>2]|0,c[k>>2]|0);break}case 33:{ME(c[i>>2]|0,c[h>>2]|0);break}case 34:{ME(258,0);break}case 35:{e=258;break}case 36:{e=259;break}case 37:{e=260;break}case 38:{e=c[h>>2]|0;break}case 39:{e=0;break}case 48:{NE(c[i>>2]|0,c[k>>2]|0);break}case 49:{NE(c[k>>2]|0,0);break}case 51:{OE(c[k>>2]|0);break}case 52:{PE();break}case 53:{e=c[k>>2]|0;break}case 54:{e=0;break}case 55:{e=0;break}case 59:{e=c[k>>2]|0;break}case 60:{e=c[k>>2]|0;break}case 61:{e=c[k>>2]|0;break}case 62:{e=QE(c[i>>2]|0,c[k>>2]|0)|0;break}default:{}}while(0);h=0-j|0;o=k+(h<<2)|0;g=g+(h<<1)|0;h=o+4|0;c[o+4>>2]=e;e=(d[98294+f>>0]|0)+-24|0;o=b[g>>1]|0;f=o+(a[98357+e>>0]|0)|0;if(f>>>0<60?(d[98031+f>>0]|0)==(o|0):0){e=a[98091+f>>0]|0;j=p;break}e=a[98392+e>>0]|0;j=p}while(0);f=r;i=q;o=e;p=j;g=g+2|0}if((t|0)==76){FD(140861);e=2;t=77}if((t|0)==77)if((f|0)!=(s|0))l6(f);l=u;return e|0}function FE(){var a=0,b=0;a=c[47038]|0;while(1){if(!a)break;YE(a+8|0);YE((c[47038]|0)+24|0);YE((c[47038]|0)+16|0);b=RE(c[47038]|0)|0;c[47038]=b;a=b}return}function GE(){GD();QB(c[47037]|0);return}function HE(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+16|0;g=h;f=c[47037]|0;if(!f){a[188156]=d&1|(e&255)<<1&2|a[188156]&-12|8;f=c[47040]|0;c[g>>2]=c[47039];f=lB(b,g,f)|0;c[47037]=f}c[46985]=f;c[47038]=SE(c[47038]|0,f)|0;fD(0,b)|0;l=h;return}function IE(){var b=0,d=0,e=0,f=0,g=0,h=0;XE(2);e=c[47038]|0;f=a[98427]|0;h=0;b=e+24|0;while(1){d=c[b>>2]|0;if(!d)break;if(((c[d>>2]|0)==267?(g=c[d+4>>2]|0,(a[g>>0]|0)==f<<24>>24):0)?(f2(g,98427)|0)==0:0)b=c[d+8>>2]|0;else b=h;h=b;b=d+12|0}b=e+16|0;a:while(1){e=c[b>>2]|0;b=e+12|0;if(!(c[b>>2]|0))break;d=e+4|0;if((c[e>>2]|0)==262){e=c[d>>2]|0;d=gC(e)|0;while(1){if(!d)continue a;g=lC(c[c[47038]>>2]|0,d,0)|0;dF(g,0,c[b>>2]|0,h);d=hC(e,d)|0}}else while(1){d=c[d>>2]|0;if(!d)continue a;dF(c[d+4>>2]|0,c[d+8>>2]|0,c[b>>2]|0,h);d=d+12|0}}YE((c[47038]|0)+8|0);YE((c[47038]|0)+16|0);YE((c[47038]|0)+24|0);c[(c[47038]|0)+4>>2]=0;return}function JE(){var a=0;XE(1);a=(c[47038]|0)+8|0;while(1){a=c[a>>2]|0;if(!a)break;cF(c[a+4>>2]|0);a=a+12|0}YE((c[47038]|0)+8|0);YE((c[47038]|0)+24|0);YE((c[47038]|0)+16|0);c[(c[47038]|0)+4>>2]=0;return}function KE(){var a=0,b=0;a=c[47038]|0;b=c[a+8>>2]|0;if(!b){b=c[a+4>>2]|0;if(!b)b=0;else{b=bF(b)|0;a=c[47038]|0}c[a+4>>2]=0}else{b=aF(b)|0;a=c[47038]|0;c[a+12>>2]=0;c[a+8>>2]=0}if(b|0)UE(a+16|0,b);return}function LE(a,b,d){a=a|0;b=b|0;d=d|0;if(d)b=_E(b,d)|0;d=$E(qC(c[c[47038]>>2]|0,a,1)|0,b)|0;UE((c[47038]|0)+8|0,d);fD(c[47037]|0,a)|0;return}function ME(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;if(d|0)WE();d=(c[47038]|0)+24|0;while(1){d=c[d>>2]|0;if(!d)break;if(!(c[d+8>>2]|0))WE();d=d+12|0}g=(b|0)==260?2:(b|0)==259&1;XE(g);b=c[47038]|0;d=b+24|0;while(1){f=c[d>>2]|0;if(!f)break;do if((c[f>>2]|0)!=267){d=c[f+4>>2]|0;e=c[b>>2]|0;if(!((a[d+21>>0]|0)!=0&(e|0)==(c[47037]|0))){d=DA(e,g,c[d+8>>2]|0,c[f+8>>2]|0)|0;b=c[47038]|0;if((c[b>>2]|0)!=(c[47037]|0))break}a[d+22>>0]=1}while(0);d=f+12|0}YE(b+24|0);return}function NE(a,b){a=a|0;b=b|0;b=TE(a,b)|0;UE((c[47038]|0)+24|0,b);return}function OE(a){a=a|0;var b=0;b=c[47038]|0;c[47038]=SE(b,LD(c[b>>2]|0,a,1)|0)|0;fD(c[47037]|0,a)|0;return}function PE(){var a=0,b=0;a=c[47038]|0;b=c[a>>2]|0;a=RE(a)|0;c[47038]=a;c[a+4>>2]=b;return}function QE(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=l;l=l+1024|0;f=g;d=D3(a)|0;d=d+1+(D3(b)|0)|0;if(d>>>0<1025)d=f;else d=k6(d)|0;O3(d,a)|0;g6(d,b)|0;e=dD(c[47037]|0,d)|0;fD(c[47037]|0,a)|0;fD(c[47037]|0,b)|0;if((d|0)!=(f|0))l6(d);l=g;return e|0}function RE(a){a=a|0;var b=0;b=c[(c[47038]|0)+32>>2]|0;bC(c[47037]|0,a);return b|0}function SE(a,b){a=a|0;b=b|0;var d=0;d=aC(c[47037]|0,36)|0;c[d+32>>2]=a;c[d>>2]=b;return d|0}function TE(a,b){a=a|0;b=b|0;return VE(267,a,b)|0}function UE(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+4|0;e=c[d>>2]|0;if(e|0)c[e+12>>2]=b;c[d>>2]=b;if(!(c[a>>2]|0))c[a>>2]=b;return}function VE(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=aC(c[47037]|0,16)|0;c[e>>2]=a;c[e+4>>2]=b;c[e+8>>2]=d;return e|0}function WE(){var a=0;a=l;l=l+16|0;dA(0,98431,a)|0;l=a;return}function XE(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;g=(b|0)==2;d=(c[47038]|0)+24|0;while(1){d=c[d>>2]|0;if(!d)break;e=d+4|0;f=c[e>>2]|0;if(!((g?(a[f>>0]|0)==(a[98427]|0):0)?!(f2(f,98427)|0):0)){h=DA(c[c[47038]>>2]|0,b,f,0)|0;c[e>>2]=h;if(!h)c[e>>2]=DA(c[c[47038]>>2]|0,b,f,195341)|0;c[d>>2]=266;fD(c[47037]|0,f)|0}d=d+12|0}return}function YE(a){a=a|0;ZE(c[a>>2]|0);c[a+4>>2]=0;c[a>>2]=0;return}function ZE(a){a=a|0;var b=0;while(1){if(!a)break;b=c[a+12>>2]|0;switch(c[a>>2]|0){case 265:{ZE(c[a+4>>2]|0);break}case 266:case 267:{fD(c[47037]|0,c[a+8>>2]|0)|0;break}default:{}}bC(c[47037]|0,a);a=b}return}function _E(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;h=l;l=l+1040|0;f=h;g=h+8|0;d=D3(a)|0;d=d+2+(D3(b)|0)|0;if(d>>>0<1025)e=g;else e=k6(d)|0;c[f>>2]=a;c[f+4>>2]=b;i2(e,98464,f)|0;d=dD(c[47037]|0,e)|0;fD(c[47037]|0,a)|0;fD(c[47037]|0,b)|0;if((e|0)!=(g|0))l6(e);l=h;return d|0}function $E(a,b){a=a|0;b=b|0;return VE(259,a,b)|0}function aF(a){a=a|0;return VE(265,a,0)|0}function bF(a){a=a|0;return VE(262,a,0)|0}function cF(a){a=a|0;var b=0,d=0;b=(c[47038]|0)+24|0;while(1){b=c[b>>2]|0;if(!b)break;if((c[b>>2]|0)==266?(d=c[b+4>>2]|0,d|0):0)HA(a,d,c[b+8>>2]|0)|0;b=b+12|0}return}function dF(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=d+4|0;a:do if((c[d>>2]|0)==262){d=c[f>>2]|0;f=gC(d)|0;while(1){if(!f)break a;eF(a,b,lC(c[c[47038]>>2]|0,f,0)|0,0,e);f=hC(d,f)|0}}else while(1){f=c[f>>2]|0;if(!f)break a;d=lC(c[c[47038]>>2]|0,c[f+4>>2]|0,0)|0;eF(a,b,d,c[f+8>>2]|0,e);f=f+12|0}while(0);return}function eF(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;d=fB(c[c[47038]>>2]|0,a,d,f,1)|0;if(d|0){g=c[d>>2]&3;f=c[((g|0)==2?d:d+-48|0)+40>>2]|0;a=(f|0)==(a|0)?(c[((g|0)==3?d:d+48|0)+40>>2]|0)!=(f|0):0;fF(d,111756,a?e:b);fF(d,111765,a?b:e);cF(d)}return}function fF(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if(d|0){e=DA(c[c[47038]>>2]|0,2,b,0)|0;if(!e)e=DA(c[c[47038]>>2]|0,2,b,195341)|0;HA(a,e,d)|0}return}function gF(a,b,d){a=a|0;b=b|0;d=d|0;c[47005]=b;c[47037]=a;c[46985]=0;a=d|0?d:18644;c[47040]=a;jD(a,b);EE()|0;a=c[46985]|0;if(!a){ID();a=c[46985]|0}return a|0}function hF(a,b){a=a|0;b=b|0;return gF(0,a,b)|0}function iF(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;k=m+8|0;j=m;d=c[b+76>>2]|0;f=c[b>>2]|0;i=b+12|0;if((d|0)!=0?(e=c[d>>2]|0,(e|0)!=0):0){db[e&127](b);g=12}else g=4;do if((g|0)==4)if((c[b+40>>2]|0)==0?(h=b+36|0,(c[h>>2]|0)==0):0){if(a[f+13>>0]|0)jF(b);d=b+32|0;e=c[d>>2]|0;if(!e){c[h>>2]=c[15840];g=12;break}f=f4(e,106813)|0;c[h>>2]=f;if(!f){k=c[(c[i>>2]|0)+16>>2]|0;i=c[d>>2]|0;d=v2(c[(L1()|0)>>2]|0)|0;c[j>>2]=i;c[j+4>>2]=d;lb[k&63](98470,j);d=1}else g=12}else g=12;while(0);if((g|0)==12)if(!(c[b+152>>2]&1024))d=0;else{lb[c[(c[i>>2]|0)+16>>2]&63](98508,k);d=1}l=m;return d|0}function jF(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=l;l=l+112|0;e=h;g=h+4|0;d=c[b+24>>2]|0;if(!d)a[g>>0]=0;else{c[e>>2]=d+1;i2(g,98526,e)|0}e=c[b+20>>2]|0;e=e|0?e:98530;d=D3(e)|0;i=D3(g)|0;f=b+52|0;i=d+1+i+(D3(c[f>>2]|0)|0)|0;d=i+11|0;if((c[47041]|0)>>>0<(i+1|0)>>>0){c[47041]=d;d=n6(c[47042]|0,d)|0;c[47042]=d}else d=c[47042]|0;O3(d,e)|0;g6(c[47042]|0,g)|0;d=c[47042]|0;d=d+(D3(d)|0)|0;a[d>>0]=46;a[d+1>>0]=0;d=Y3(c[f>>2]|0)|0;f=c[47042]|0;while(1){e=I4(d,58)|0;if(!e)break;g6(f,e+1|0)|0;i=c[47042]|0;g=i+(D3(i)|0)|0;a[g>>0]=46;a[g+1>>0]=0;a[e>>0]=0;f=i}g6(f,d)|0;l6(d);c[b+32>>2]=c[47042];l=h;return}function kF(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;h=i+8|0;g=i;if((b|0)!=0&(d|0)!=0){f=a+12|0;if(c[a+152>>2]&1024|0){lb[c[(c[f>>2]|0)+16>>2]&63](98508,g);$a(1)}if((lF(a,b,d)|0)==(d|0))e=d;else{g=c[(c[f>>2]|0)+16>>2]|0;c[h>>2]=d;lb[g&63](98540,h);$a(1)}}else e=0;l=i;return e|0}function lF(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;n=o;f=c[(c[b>>2]|0)+104>>2]|0;do if(!f){j=b+40|0;h=c[j>>2]|0;if(!h){e=_3(d,1,e,c[b+36>>2]|0)|0;break}f=b+44|0;i=b+48|0;g=c[i>>2]|0;do if(((c[f>>2]|0)+-1-g|0)>>>0>>0){g=e+4096+g&-4096;c[f>>2]=g;f=n6(h,g)|0;c[j>>2]=f;if(!f){lb[c[(c[b+12>>2]|0)+16>>2]&63](98565,n);$a(1)}else{k=f;m=c[i>>2]|0;break}}else{k=h;m=g}while(0);B6(k+m|0,d|0,e|0)|0;n=(c[i>>2]|0)+e|0;c[i>>2]=n;a[(c[j>>2]|0)+n>>0]=0}else e=eb[f&63](b,d,e)|0;while(0);l=o;return e|0}function mF(a,b){a=a|0;b=b|0;var c=0;c=D3(b)|0;b=(kF(a,b,c)|0)==(c|0);return (b?1:-1)|0}function nF(b,c){b=b|0;c=c|0;var d=0,e=0;d=l;l=l+16|0;e=d;a[e>>0]=c;b=(kF(b,e,1)|0)==1;l=d;return (b?c:-1)|0}function oF(b){b=b|0;var d=0;d=c[b+36>>2]|0;if(((d|0)!=0?(a[b+144>>0]|0)==0:0)?(c[(c[b>>2]|0)+104>>2]|0)==0:0)b=m4(d)|0;else b=0;return b|0}function pF(a){a=a|0;var b=0,d=0;b=c[a+76>>2]|0;if(b|0?(d=c[b+4>>2]|0,d|0):0)db[d&127](a);oF(a)|0;return}function qF(a){a=a|0;var b=0,d=0,e=0;e=l;l=l+16|0;d=c[a+76>>2]|0;if(c[a+152>>2]&1024|0){lb[c[(c[a+12>>2]|0)+16>>2]&63](98592,e);$a(1)}if((d|0)!=0?(b=c[d+8>>2]|0,(b|0)!=0):0)db[b&127](a);else{oF(a)|0;rF(a)}l=e;return}function rF(b){b=b|0;var d=0,e=0,f=0;d=b+32|0;if((c[d>>2]|0?(e=b+36|0,f=c[e>>2]|0,(f|0)!=(c[15840]|0)):0)?(a[b+144>>0]|0)==0:0){if(f|0){l4(f)|0;c[e>>2]=0}c[d>>2]=0}return}function sF(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+1056|0;f=i;h=i+24|0;g=i+8|0;c[g>>2]=d;e=k2(h,1024,b,g)|0;if((e|0)>=0){if((e|0)>1023){e=IK(e+1|0)|0;c[g>>2]=d;f=e;e=j2(e,b,g)|0}else f=h;kF(a,f,e)|0;if((f|0)!=(h|0))l6(f)}else{c[f>>2]=v2(c[(L1()|0)>>2]|0)|0;dA(1,98609,f)|0}l=i;return}function tF(a,b){a=a|0;b=+b;var d=0,e=0,f=0;d=l;l=l+16|0;e=d;f=uF(e,b)|0;kF(a,f,c[e>>2]|0)|0;l=d;return}function uF(b,d){b=b|0;d=+d;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if(!(d<-1.0e15))if(!(d>1.0e15)){d=d*1.0e4;f=~~(d+(d<0.0?-.5:.5));if(!f){f=138697;e=1}else{l=(f|0)<0;k=4;i=0;e=195106;f=l?0-f|0:f;while(1){h=e+-1|0;if(!((f|0)!=0|(k|0)>0))break;g=(f|0)%10|0;j=(f|0)/10|0;if((g|0)==0&i<<24>>24==0)f=0;else{a[h>>0]=g|48;f=1;e=h}if((k|0)==1)if(!(f<<24>>24))f=1;else{e=e+-1|0;a[e>>0]=46;f=1}k=k+-1|0;i=f;f=j}if(l){a[h>>0]=45;e=h}f=e;e=195106-e|0}}else{f=98624;e=18}else{f=98623;e=19}c[b>>2]=e;return f|0}function vF(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d;f=uF(e,+h[b>>3])|0;kF(a,f,c[e>>2]|0)|0;kF(a,102905,1)|0;b=uF(e,+h[b+8>>3])|0;kF(a,b,c[e>>2]|0)|0;l=d;return}function wF(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=l;l=l+16|0;f=g;e=0;while(1){h=b+(e<<4)|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];vF(a,f);e=e+1|0;if((e|0)>=(d|0))break;kF(a,102905,1)|0}l=g;return}function xF(a,b){a=a|0;b=b|0;var d=0;d=HK(392)|0;if(d|0){c[d>>2]=20200;c[d+16>>2]=23;c[d+32>>2]=a;c[d+36>>2]=b}return d|0}function yF(a){a=a|0;var b=0,d=0,e=0,f=0;b=HK(392)|0;d=b;e=a;f=d+40|0;do{c[d>>2]=c[e>>2];d=d+4|0;e=e+4|0}while((d|0)<(f|0));f=b+60|0;e=a+60|0;c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[f+12>>2]=c[e+12>>2];c[f+16>>2]=c[e+16>>2];f=b+80|0;e=a+80|0;c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[f+12>>2]=c[e+12>>2];c[f+16>>2]=c[e+16>>2];return b|0}function zF(a){a=a|0;GF(a);l6(a);return}function AF(a,b){a=a|0;b=b|0;var d=0,e=0;e=a+160|0;d=c[e>>2]|0;if(d){e=c[47043]|0;if(e){d=c[e+4>>2]|0;if(!d){d=HK(632)|0;c[(c[47043]|0)+4>>2]=d}}}else{d=HK(632)|0;c[e>>2]=d;c[a+164>>2]=d}c[47043]=d;c[d+32>>2]=b;c[d>>2]=a;return}function BF(a,b){a=a|0;b=b|0;var d=0,e=0;e=a+160|0;d=c[e>>2]|0;if(d){e=c[47044]|0;if(e){d=c[e+4>>2]|0;if(!d){d=HK(632)|0;c[(c[47044]|0)+4>>2]=d}}}else{d=HK(632)|0;c[e>>2]=d;c[a+164>>2]=d}c[47044]=d;c[d+52>>2]=b;c[d>>2]=a;return (JF(a,3,b)|0)!=0|0}function CF(a){a=a|0;var b=0;b=c[a+160>>2]|0;c[a+164>>2]=b;return b|0}function DF(a){a=a|0;var b=0,d=0,e=0;a=a+164|0;b=c[a>>2]|0;d=c[b+4>>2]|0;if(d|0?(e=d+52|0,(c[e>>2]|0)==0):0)c[e>>2]=c[b+52>>2];c[a>>2]=d;return d|0}function EF(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=a+8|0;f=b+10|0;if((c[e>>2]|0)>(b|0))a=c[a>>2]|0;else{c[e>>2]=f;f=KK(c[a>>2]|0,f<<2)|0;c[a>>2]=f;a=f}c[a+(b<<2)>>2]=d;return}function FF(a){a=a|0;var b=0;b=c[a>>2]|0;if(b|0)l6(b);c[a>>2]=0;c[a+8>>2]=0;c[a+4>>2]=0;return}function GF(a){a=a|0;var b=0,d=0,e=0;d=a+160|0;b=c[d>>2]|0;while(1){if(!b)break;e=c[b+4>>2]|0;FF(b+604|0);FF(b+592|0);l6(c[b+584>>2]|0);l6(c[b+588>>2]|0);l6(b);b=e}c[47044]=0;c[47043]=0;c[a+192>>2]=0;c[a+164>>2]=0;c[d>>2]=0;c[a+28>>2]=0;return}function HF(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0;m=l;l=l+128|0;j=m+64|0;k=m;N4(j,e,63)|0;i=F3(j,58)|0;if(i|0)a[i>>0]=0;d=b+60+(d<<2)|0;while(1){b=c[d>>2]|0;if(!b)break;N4(k,c[b+4>>2]|0,63)|0;b=F3(k,58)|0;if(b|0)a[b>>0]=0;if((f2(j,k)|0)<1)break;d=c[d>>2]|0}while(1){b=c[d>>2]|0;if(!b)break;N4(k,c[b+4>>2]|0,63)|0;b=F3(k,58)|0;if(b|0)a[b>>0]=0;if(f2(j,k)|0)break;b=c[d>>2]|0;if((c[b+8>>2]|0)>(f|0))d=b;else break}k=IK(20)|0;c[k>>2]=c[d>>2];c[d>>2]=k;c[k+4>>2]=e;c[k+8>>2]=f;c[k+12>>2]=g;c[k+16>>2]=h;l=m;return 1}function IF(a,b){a=a|0;b=b|0;b=l;l=l+16|0;dA(1,98697,b)|0;l=b;return 0}function JF(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+144|0;r=s;o=s+80|0;p=s+16|0;n=(d+-3|0)>>>0<2?0:d;N4(o,e,63)|0;e=F3(o,58)|0;if(e){f=e+1|0;a[e>>0]=0;e=F3(f,58)|0;if(!e)m=0;else{a[e>>0]=0;m=e+1|0}}else{m=0;f=0}i=(f|0)!=0;j=(m|0)==0;k=(n|0)==(d|0);h=b+60+(d<<2)|0;a:while(1){e=c[h>>2]|0;if(!e){e=0;break}N4(p,c[e+4>>2]|0,63)|0;e=F3(p,58)|0;if(!e)e=0;else{a[e>>0]=0;e=e+1|0}do if(!(f2(p,o)|0)){g=(e|0)!=0;if(i&g?f2(e,f)|0:0)break;if(!j?f2(m,c[(c[(c[h>>2]|0)+12>>2]|0)+8>>2]|0)|0:0)break;if(k|g^1){q=16;break a}if(JF(b,n,e)|0){q=16;break a}}while(0);h=c[h>>2]|0}do if((q|0)==16){e=c[h>>2]|0;f=e+16|0;g=b+8|0;if(e){if((c[f>>2]|0)==0?(IF(0,0)|0,(c[f>>2]|0)==0):0){e=0;break}if((c[g>>2]|0)>0){q=c[15715]|0;o=c[e+4>>2]|0;p=c[(c[e+12>>2]|0)+8>>2]|0;c[r>>2]=c[20212+(d<<2)>>2];c[r+4>>2]=o;c[r+8>>2]=p;z4(q,98728,r)|0}}else e=0}while(0);c[b+80+(d<<2)>>2]=e;l=s;return e|0}function KF(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;do if(!e)e=0;else{if(c[5058]|0){hA(188180,0,0);c[5058]=0}h=Y3(e)|0;e=F3(h,58)|0;if(e){a[e>>0]=0;f=b+60+(d<<2)|0;e=1;g=f;while(1){b=c[g>>2]|0;if(!b)break;d=Y3(c[b+4>>2]|0)|0;b=F3(d,58)|0;if(b|0)a[b>>0]=0;if(!((a[h>>0]|0)!=0?(C3(h,d)|0)!=0:0)){e=c[47046]|0;if(e>>>0>=(c[47047]|0)>>>0){iA(188180,1)|0;e=c[47046]|0}c[47046]=e+1;a[e>>0]=32;kA(188180,c[(c[g>>2]|0)+4>>2]|0)|0;e=c[47046]|0;if(e>>>0>=(c[47047]|0)>>>0){iA(188180,1)|0;e=c[47046]|0}c[47046]=e+1;a[e>>0]=58;kA(188180,c[(c[(c[g>>2]|0)+12>>2]|0)+8>>2]|0)|0;e=0}l6(d);g=c[g>>2]|0}l6(h);if(e<<24>>24){g=0;i=19}}else{l6(h);g=0;f=b+60+(d<<2)|0;e=1;i=19}if((i|0)==19){while(1){b=c[f>>2]|0;if(!b)break;d=Y3(c[b+4>>2]|0)|0;b=F3(d,58)|0;if(b|0)a[b>>0]=0;if(!((g|0)!=0?(C3(g,d)|0)==0:0)){e=c[47046]|0;if(e>>>0>=(c[47047]|0)>>>0){iA(188180,1)|0;e=c[47046]|0}c[47046]=e+1;a[e>>0]=32;kA(188180,d)|0;e=0}g=d;f=c[f>>2]|0;i=19}if(e<<24>>24){e=195341;break}}e=c[47046]|0;if(e>>>0>=(c[47047]|0)>>>0){iA(188180,1)|0;e=c[47046]|0}a[e>>0]=0;e=c[47045]|0;c[47046]=e}while(0);return e|0}function LF(b){b=b|0;var d=0;if(!b)Aa(111509,98745,573,98759);if(!(a[b>>0]|0))Aa(111514,98745,574,98759);d=c[47049]|0;if(!d)b=0;else b=eb[c[d>>2]&63](d,b,512)|0;return b|0}function MF(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;j=k+8|0;i=k;if(!b)Aa(111613,98745,589,98776);g=b+8|0;e=c[g>>2]|0;if(!e)Aa(111616,98745,590,98776);if(!(a[e>>0]|0))Aa(111625,98745,591,98776);h=b+20|0;f=c[h>>2]|0;do if(!f){d=kP(e)|0;if(!d){c[i>>2]=c[g>>2];dA(0,98800,i)|0;d=0;break}i=f4(d,139124)|0;c[h>>2]=i;if(!i){c[j>>2]=v2(c[(L1()|0)>>2]|0)|0;c[j+4>>2]=d;dA(0,98825,j)|0;d=0;break}d=c[47050]|0;if((d|0)>49){a[b+17>>0]=1;d=1;break}else{c[47050]=d+1;d=1;break}}else{y4(f,0,0)|0;if(!(c[h>>2]|0))Aa(98846,98745,614,98776);else d=1}while(0);l=k;return d|0}function NF(b){b=b|0;var d=0,e=0;if(a[b+17>>0]|0?(d=b+20|0,e=c[d>>2]|0,e|0):0){l4(e)|0;c[d>>2]=0}return}function OF(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0.0,i=0;if(!b){e=-1;d=-1}else{i=c[b+48>>2]|0;e=d+8|0;f=+(i|0);if(!i){g=+h[d>>3];f=+h[e>>3]}else{h[e>>3]=f;h[d>>3]=f;g=f}e=~~(+((c[b+40>>2]|0)*72|0)/g);d=~~(+((c[b+44>>2]|0)*72|0)/f)}c[a>>2]=e;c[a+4>>2]=d;return}function PF(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0.0;n=l;l=l+48|0;f=n+16|0;j=n;k=n+32|0;m=b+4|0;if((e|0)!=0?(a[e>>0]|0)!=0:0){if(((c[47179]|0)==0?(g=c[47178]|0,(c[47051]|0)!=(g|0)):0)?(c[47051]=g,i=c[47049]|0,i|0):0){Oz(i)|0;c[47049]=0}o=+h[(c[(c[d+16>>2]|0)+8>>2]|0)+24>>3];o=!(o>=1.0)?96.0:o;h[j+8>>3]=o;h[j>>3]=o;d=QF(e)|0;c[f>>2]=c[j>>2];c[f+4>>2]=c[j+4>>2];c[f+8>>2]=c[j+8>>2];c[f+12>>2]=c[j+12>>2];OF(k,d,f);d=c[k+4>>2]|0;f=c[k>>2]|0}else{d=-1;f=-1}c[b>>2]=f;c[m>>2]=d;l=n;return}function QF(a){a=a|0;var b=0,d=0,e=0,f=0;f=l;l=l+16|0;e=f;if(!a)Aa(111509,98745,638,98852);if(!(c[47049]|0))c[47049]=Sz(20236,c[4599]|0)|0;b=LF(a)|0;a:do if(!b){b=HK(64)|0;if(!b)b=0;else{d=b+8|0;c[d>>2]=dD(0,a)|0;if(!((MF(b)|0)<<24>>24)){RF(b);b=0;break}if(!(c[b+20>>2]|0))Aa(98846,98745,653,98852);do switch(SF(b)|0){case 0:{a=gN(c[d>>2]|0)|0;c[b+52>>2]=a;if(!a){c[e>>2]=c[d>>2];dA(0,98869,e)|0;RF(b);b=0;break a}break}case 2:{TF(b);break}case 3:{UF(b);break}case 1:{VF(b);break}case 4:{WF(b);break}case 6:{XF(b);break}case 11:{YF(b);break}case 8:{ZF(b);break}case 5:{_F(b);break}case 12:{$F(b);break}default:{}}while(0);NF(b);e=c[47049]|0;eb[c[e>>2]&63](e,b,1)|0}}else NF(b);while(0);l=f;return b|0}function RF(a){a=a|0;var b=0;b=c[a+8>>2]|0;if(b|0)fD(0,b)|0;l6(a);return}function SF(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+224|0;e=j+200|0;f=j;g=a+20|0;b=c[g>>2]|0;h=a+24|0;d=a+28|0;a:do if((b|0)!=0?(X5(e,1,20,b)|0)==20:0){b=0;while(1){if(b>>>0>=10){i=13;break a}if(!(g2(e,c[20272+(b<<4)>>2]|0,c[20272+(b<<4)+4>>2]|0)|0))break;b=b+1|0}c[d>>2]=c[20272+(b<<4)+12>>2];a=c[20272+(b<<4)+8>>2]|0;c[h>>2]=a;switch(b|0){case 7:break;case 8:{if(g2(e+8|0,99085,4)|0)break a;c[d>>2]=99090;c[h>>2]=11;a=11;break a}default:break a}while(1){if(!(o4(f,200,c[g>>2]|0)|0)){i=11;break}if(!(g2(f,99080,4)|0)){i=8;break}}if((i|0)==8){c[d>>2]=102104;c[h>>2]=8;a=8;break}else if((i|0)==11){a=c[h>>2]|0;break}}else i=13;while(0);if((i|0)==13){c[d>>2]=99095;c[h>>2]=0;a=0}l=j;return a|0}function TF(a){a=a|0;var b=0,d=0,e=0,f=0;f=l;l=l+16|0;b=f+4|0;d=f;c[a+48>>2]=0;e=a+20|0;y4(c[e>>2]|0,6,0)|0;if((iG(c[e>>2]|0,2,b)|0)<<24>>24?(iG(c[e>>2]|0,2,d)|0)<<24>>24:0){c[a+40>>2]=c[b>>2];c[a+44>>2]=c[d>>2]}l=f;return}function UF(a){a=a|0;var b=0,d=0,e=0,f=0;f=l;l=l+16|0;b=f+4|0;d=f;c[a+48>>2]=0;e=a+20|0;y4(c[e>>2]|0,16,0)|0;if((aG(c[e>>2]|0,4,b)|0)<<24>>24?(aG(c[e>>2]|0,4,d)|0)<<24>>24:0){c[a+40>>2]=c[b>>2];c[a+44>>2]=c[d>>2]}l=f;return}function VF(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;h=l;l=l+16|0;b=h+12|0;d=h+8|0;e=h+4|0;f=h;c[a+48>>2]=0;g=a+20|0;y4(c[g>>2]|0,16,0)|0;if((((iG(c[g>>2]|0,2,b)|0)<<24>>24?(iG(c[g>>2]|0,2,d)|0)<<24>>24:0)?(iG(c[g>>2]|0,2,e)|0)<<24>>24:0)?(iG(c[g>>2]|0,2,f)|0)<<24>>24:0){c[a+40>>2]=c[b>>2]<<16|c[d>>2];c[a+44>>2]=c[e>>2]<<16|c[f>>2]}l=h;return}function WF(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+32|0;b=o+16|0;e=o+12|0;j=o+8|0;k=o+4|0;m=o;c[a+48>>2]=0;n=a+20|0;while(1){if(!((aG(c[n>>2]|0,1,b)|0)<<24>>24))break;d=c[b>>2]|0;if((d|0)==255)continue;if(F3(99068,d)|0)continue;if((d|0)==192){i=6;break}f=c[n>>2]|0;if((d|0)==194){i=11;break}if(!((aG(f,2,e)|0)<<24>>24))break;y4(c[n>>2]|0,(c[e>>2]|0)+-2|0,1)|0}if((i|0)==6){d=a+40|0;b=a+44|0;if(((aG(c[n>>2]|0,3,m)|0)<<24>>24?(aG(c[n>>2]|0,2,j)|0)<<24>>24:0)?(aG(c[n>>2]|0,2,k)|0)<<24>>24:0){c[b>>2]=c[j>>2];c[d>>2]=c[k>>2]}}else if((((i|0)==11?(g=a+40|0,h=a+44|0,(aG(f,3,m)|0)<<24>>24):0)?(aG(c[n>>2]|0,2,j)|0)<<24>>24:0)?(aG(c[n>>2]|0,2,k)|0)<<24>>24:0){c[h>>2]=c[j>>2];c[g>>2]=c[k>>2]}l=o;return}function XF(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+1056|0;j=m;b=m+32|0;e=m+28|0;f=m+24|0;g=m+20|0;h=m+16|0;c[a+48>>2]=72;i=a+20|0;y4(c[i>>2]|0,0,0)|0;while(1){if(!(o4(b,1024,c[i>>2]|0)|0))break;d=C4(b,99053)|0;if(!d)continue;c[j>>2]=e;c[j+4>>2]=f;c[j+8>>2]=g;c[j+12>>2]=h;if((q4(d,104612,j)|0)==4){k=5;break}}if((k|0)==5){j=c[e>>2]|0;c[a+32>>2]=j;k=c[f>>2]|0;c[a+36>>2]=k;c[a+40>>2]=(c[g>>2]|0)-j;c[a+44>>2]=(c[h>>2]|0)-k}l=m;return}function YF(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;h=l;l=l+16|0;b=h+4|0;e=h;c[a+48>>2]=0;f=a+20|0;y4(c[f>>2]|0,15,0)|0;i=(S5(c[f>>2]|0)|0)==88;g=c[f>>2]|0;d=a+40|0;a=a+44|0;if(i){y4(g,24,0)|0;if((iG(c[f>>2]|0,4,b)|0)<<24>>24?(iG(c[f>>2]|0,4,e)|0)<<24>>24:0){c[d>>2]=c[b>>2];c[a>>2]=c[e>>2]}}else{y4(g,26,0)|0;if((iG(c[f>>2]|0,2,b)|0)<<24>>24?(iG(c[f>>2]|0,2,e)|0)<<24>>24:0){c[d>>2]=c[b>>2];c[a>>2]=c[e>>2]}}l=h;return}function ZF(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=l;l=l+352|0;C=F+80|0;B=F+72|0;E=F+64|0;D=F+56|0;A=F+48|0;d=F+40|0;s=F+32|0;t=F+24|0;u=F+16|0;v=F+8|0;w=F;x=F+328|0;y=F+128|0;z=F+96|0;if(!(c[47052]|0)){if(X4(188212,98938,1)|0){c[d>>2]=98938;dA(1,98965,d)|0}c[47052]=188212}m=b+20|0;y4(c[m>>2]|0,0,0)|0;n=z+12|0;o=z+20|0;p=z+8|0;q=z+16|0;r=z+4|0;d=0;g=0;f=0;e=0;a:while(1){if(!(o4(y,200,c[m>>2]|0)|0))break;if(g<<24>>24==0|d<<24>>24==0){i=y;k=e}else break;b:while(1){j=f;c:while(1){while(1){if(M5(188212,i,4,z,0)|0){f=j;e=k;continue a}a[i+(c[n>>2]|0)>>0]=0;a[i+(c[o>>2]|0)>>0]=0;e=i+(c[p>>2]|0)|0;f=i+(c[q>>2]|0)|0;i=i+((c[r>>2]|0)+1)|0;if(!(f2(e,141419)|0))break;if(!(f2(e,141351)|0))break c;if(f2(e,99012)|0)continue;c[C>>2]=t;c[C+4>>2]=u;c[C+8>>2]=v;c[C+12>>2]=w;if((q4(f,99020,C)|0)==4)break b}c[A>>2]=s;c[A+4>>2]=x;if((q4(f,99002,A)|0)!=2){c[D>>2]=s;if((q4(f,101510,D)|0)==1){e=1;f=hG(+h[s>>3],99009)|0}else{e=g;f=j}}else{e=1;f=hG(+h[s>>3],x)|0}if(!(d<<24>>24)){d=0;g=e;j=f}else{g=e;e=k;continue a}}c[E>>2]=s;c[E+4>>2]=x;if((q4(f,99002,E)|0)!=2){c[B>>2]=s;if((q4(f,101510,B)|0)==1){d=1;e=hG(+h[s>>3],99009)|0}else e=k}else{d=1;e=hG(+h[s>>3],x)|0}if(!(g<<24>>24)){g=0;f=j;k=e}else{f=j;continue a}}d=1;g=1;f=~~(+h[v>>3]-+h[t>>3]+1.0)>>>0;e=~~(+h[w>>3]-+h[u>>3]+1.0)>>>0}c[b+48>>2]=0;c[b+40>>2]=f;c[b+44>>2]=e;l=F;return}function _F(a){a=a|0;var b=0,d=0,e=0,f=0.0,g=0.0;d=l;l=l+32|0;b=d;c[a+48>>2]=0;e=a+20|0;y4(c[e>>2]|0,0,0)|0;if(!(bG(c[e>>2]|0,b)|0)){g=+h[b>>3];c[a+32>>2]=~~g;f=+h[b+8>>3];c[a+36>>2]=~~f;c[a+40>>2]=~~(+h[b+16>>3]-g);c[a+44>>2]=~~(+h[b+24>>3]-f)}l=d;return}function $F(a){a=a|0;var b=0,d=0,e=0,f=0;f=l;l=l+16|0;b=f+4|0;d=f;c[a+48>>2]=0;e=a+20|0;y4(c[e>>2]|0,6,0)|0;if((aG(c[e>>2]|0,1,b)|0)<<24>>24?(aG(c[e>>2]|0,1,d)|0)<<24>>24:0){c[a+40>>2]=c[b>>2];c[a+44>>2]=c[d>>2]}l=f;return}function aG(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;c[d>>2]=0;e=0;while(1){if(e>>>0>=b>>>0){e=1;break}f=S5(a)|0;if(p4(a)|0){e=0;break}c[d>>2]=c[d>>2]<<8|f;e=e+1|0}return e|0}function bG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;h=l;l=l+1040|0;d=h;e=h+16|0;while(1){if(!(o4(e,1024,a)|0)){a=1;break}f=C4(e,98928)|0;if(f|0){g=4;break}}if((g|0)==4){c[d+4>>2]=e;c[d>>2]=f+9;c[d+8>>2]=a;a=cG(d,b)|0}l=h;return a|0}function cG(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+1024|0;f=g;dG(b);e=a[c[b>>2]>>0]|0;if(!(e<<24>>24))e=(eG(b)|0)&255;else e=e<<24>>24;if((((e|0)==91?(c[b>>2]=(c[b>>2]|0)+1,fG(b,f),(gG(f,d)|0)==0):0)?(fG(b,f),(gG(f,d+8|0)|0)==0):0)?(fG(b,f),(gG(f,d+16|0)|0)==0):0){fG(b,f);e=(gG(f,d+24|0)|0)!=0&1}else e=1;l=g;return e|0}function dG(b){b=b|0;var d=0;d=c[b>>2]|0;while(1){d=a[d>>0]|0;if(!(d<<24>>24))d=(eG(b)|0)&255;else d=d<<24>>24;if(!((d&255)<<24>>24))break;if(!(X1(d&255)|0))break;d=(c[b>>2]|0)+1|0;c[b>>2]=d}return}function eG(b){b=b|0;var d=0;d=b+4|0;if(!(o4(c[d>>2]|0,1024,c[b+8>>2]|0)|0))b=0;else{d=c[d>>2]|0;c[b>>2]=d;b=a[d>>0]|0}return b|0}function fG(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;dG(b);e=0;f=c[b>>2]|0;while(1){f=a[f>>0]|0;if(!(f<<24>>24))g=(eG(b)|0)&255;else g=f<<24>>24;f=g<<24>>24;if(!f)break;if(!((f|0)==46|(f+-48|0)>>>0<10))break;a[d+e>>0]=g;e=e+1|0;f=(c[b>>2]|0)+1|0;c[b>>2]=f;if((e|0)==1023){e=1023;break}}a[d+e>>0]=0;return}function gG(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0;e=l;l=l+16|0;f=e;d=+b6(a,f);if((c[f>>2]|0)==(a|0))a=1;else{h[b>>3]=d;a=0}l=e;return a|0}function hG(a,b){a=+a;b=b|0;var c=0.0,d=0.0;d=a*72.0;do if(!(f2(b,99036)|0)){c=d;a=d>=0.0?.5:-.5}else{if(!(f2(b,99039)|0)){a=d/96.0;c=a;a=a>=0.0?.5:-.5;break}if(!(f2(b,99042)|0)){a=d/6.0;c=a;a=a>=0.0?.5:-.5;break}if(f2(b,99009)|0?f2(b,99045)|0:0)if(!(f2(b,99047)|0)){a=a*28.346456664;c=a;a=a>=0.0?.5:-.5;break}else{b=(f2(b,99050)|0)==0;d=a*2.8346456663999997;return (b?~~(d+(d>=0.0?.5:-.5)):0)|0}c=a>=0.0?.5:-.5}while(0);return ~~(a+c)|0}function iG(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;c[d>>2]=0;e=0;while(1){if(e>>>0>=b>>>0){e=1;break}f=S5(a)|0;if(p4(a)|0){e=0;break}c[d>>2]=c[d>>2]|f<<(e<<3);e=e+1|0}return e|0}function jG(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;a=c[b+20>>2]|0;if(a|0)l4(a)|0;if(c[b+52>>2]|0?(e=c[b+60>>2]|0,e|0):0)db[e&127](b);l6(b);return}function kG(){var a=0;DA(0,1,108525,105794)|0;a=xF(0,1)|0;_S(a,0);return a|0}function lG(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0;m=l;l=l+304|0;k=m+24|0;j=m+8|0;f=m;i=m+40|0;if((tS(b,e)|0)!=999)if((uS(b,d)|0)==-1)b=-1;else{n=c[d+16>>2]|0;p=+h[n+32>>3];q=+h[n+16>>3];r=+h[n+24>>3];o=+h[n+40>>3];b=~~(r+(r>=0.0?.5:-.5));e=~~(q+(q>=0.0?.5:-.5));f=~~(p+(p>=0.0?.5:-.5));g=~~(o+(o>=0.0?.5:-.5));if(!(a[(c[n+8>>2]|0)+81>>0]|0)){c[k>>2]=e;c[k+4>>2]=b;c[k+8>>2]=f;c[k+12>>2]=g;i2(i,99200,k)|0}else{c[j>>2]=b;c[j+4>>2]=e;c[j+8>>2]=g;c[j+12>>2]=f;i2(i,99200,j)|0}QA(d,102972,i,195341)|0;b=0}else{b=KF(b,1,e)|0;c[f>>2]=e;c[f+4>>2]=b;dA(1,111534,f)|0;b=-1}l=m;return b|0}function mG(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i;f=c[b+60>>2]|0;BF(a,d)|0;d=c[a+164>>2]|0;c[d+56>>2]=HR(d,c[d+52>>2]|0)|0;b=d+152|0;if((RC(f,137786,0,1)|0)!=0?(c[(c[f+16>>2]|0)+8>>2]|0)!=0:0)h=5;else if(!(c[b>>2]&67108864)){gA(99212,g);b=-1}else h=5;if((h|0)==5){c[d+36>>2]=e;if(!e)c[b>>2]=c[b>>2]|134217728;b=QJ(a,f)|0;JR(d);GF(a)}l=i;return b|0}function nG(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i;f=c[b+60>>2]|0;BF(a,d)|0;b=c[a+164>>2]|0;c[b+56>>2]=HR(b,c[b+52>>2]|0)|0;if((RC(f,137786,0,1)|0)!=0?(c[(c[f+16>>2]|0)+8>>2]|0)!=0:0)h=5;else if(!(c[b+152>>2]&67108864)){gA(99212,g);b=-1}else h=5;if((h|0)==5){AF(a,e);h=QJ(a,f)|0;JR(b);qF(b);GF(a);b=h}l=i;return b|0}function oG(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;h=m+8|0;g=m;b=c[b+60>>2]|0;BF(a,d)|0;j=c[a+164>>2]|0;c[j+56>>2]=HR(j,c[j+52>>2]|0)|0;if((RC(b,137786,0,1)|0)!=0?(c[(c[b+16>>2]|0)+8>>2]|0)!=0:0)k=5;else if(!(c[j+152>>2]&67108864)){gA(99212,g);b=-1}else k=5;do if((k|0)==5){if(e|0?(i=k6(4096)|0,c[e>>2]=i,i|0):0){g=j+40|0;c[g>>2]=i;c[j+44>>2]=4096;d=j+48|0;c[d>>2]=0;b=QJ(a,b)|0;JR(j);if(!b){c[e>>2]=c[g>>2];c[f>>2]=c[d>>2]}GF(a);break}dA(1,99233,h)|0;b=-1}while(0);l=m;return b|0}function pG(a,b){a=a|0;b=b|0;YS(a,0,b);return}function qG(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0;G=l;l=l+4288|0;C=G+8|0;B=G;E=4;F=k6(40)|0;c[F>>2]=0;y=G+4152|0;z=G+4148|0;A=G+4128|0;j=G+4112|0;k=G+16|0;o=0;i=la(24,b|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;a:do if((h|0)!=1){if(!i){c[d>>2]=0;g=0;break}o=0;n=aa(32,e|0,z|0,y|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)!=1){o=0;m=la(23,40)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)!=1){o=0;ba(16,A|0,j|0,k|0,24,85);g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)!=1){o=0;e=la(25,b|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)!=1){j=A+16|0;i=c[j>>2]|0;g=e;while(1){if(!g)break;o=0;ra(i|0,g|0,0)|0;h=o;o=0;if((h|0)!=0&(p|0)!=0){e=A6(c[h>>2]|0,F|0,E|0)|0;if(!e)Ca(h|0,p|0);D=p}else e=-1;if((e|0)==1){x=0;w=j;v=m;u=n;g=D;m=15;break a}o=0;g=ra(86,b|0,g|0)|0;h=o;o=0;if((h|0)!=0&(p|0)!=0){e=A6(c[h>>2]|0,F|0,E|0)|0;if(!e)Ca(h|0,p|0);D=p}else e=-1;if((e|0)==1){x=0;w=j;v=m;u=n;g=D;m=15;break a}}F=x6(188244,1,F|0,E|0)|0;E=D;o=0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){x=m;w=j;v=m;u=n;g=D;m=15}else{x=m;w=j;v=m;u=n;g=0;m=15}}else{x=0;w=0;v=m;u=n;g=D;m=15}}else{x=0;w=0;v=m;u=n;g=D;m=15}}else{x=0;w=0;v=m;u=n;g=D;m=15}}else{x=0;w=0;v=0;u=n;g=D;m=15}}else{x=0;w=0;v=0;u=0;g=D;m=15}while(0);do if((m|0)==15){b:while(1){c:do if(!g){o=0;e=la(25,b|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}t=u+(c[z>>2]|0)|0;k=0;m=0;j=0;while(1){if(!e)break;o=0;g=ra(c[w>>2]|0,e|0,-1)|0;h=o;o=0;if((h|0)!=0&(p|0)!=0){i=A6(c[h>>2]|0,F|0,E|0)|0;if(!i)Ca(h|0,p|0);D=p}else i=-1;if((i|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}if((g|0)==0?(a[(c[e+16>>2]|0)+119>>0]|0)==3:0){if(!m){o=0;c[B>>2]=j;aa(33,t|0,137696,B|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}o=0;i=aa(34,b|0,u|0,1)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}o=0;pa(53,i|0,137786,280,1)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}c[x+(j<<2)>>2]=i;k=1;j=j+1|0}else i=m;o=0;pa(54,b|0,e|0,i|0,A|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}}else i=m;o=0;e=ra(86,b|0,e|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}m=i}o=0;e=la(25,b|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}i=10;q=x;n=v;s=v;while(1){if(!e){e=0;m=q;i=s;break c}o=0;g=ra(c[w>>2]|0,e|0,-1)|0;h=o;o=0;if((h|0)!=0&(p|0)!=0){m=A6(c[h>>2]|0,F|0,E|0)|0;if(!m)Ca(h|0,p|0);D=p}else m=-1;if((m|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}if(!g){o=0;c[C>>2]=j;aa(33,t|0,137696,C|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}o=0;r=aa(34,b|0,u|0,1)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}o=0;pa(53,r|0,137786,280,1)|0;h=o;o=0;if((h|0)!=0&(p|0)!=0){g=A6(c[h>>2]|0,F|0,E|0)|0;if(!g)Ca(h|0,p|0);D=p}else g=-1;if((g|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}o=0;pa(54,b|0,e|0,r|0,A|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}if((j|0)==(i|0)){i=j<<1;o=0;m=ra(87,n|0,j<<3|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}g=m;n=m;h=m}else{g=q;h=s}c[g+(j<<2)>>2]=r;q=g;j=j+1|0;m=h}else m=s;o=0;e=ra(86,b|0,e|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}s=m}}else{e=1;k=0;m=x;j=0;i=v}while(0);o=0;$(108,A|0);g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue}if((u|0)!=(y|0)){o=0;$(105,u|0);g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue}}if(!e){o=0;g=ra(87,i|0,j<<2|0)|0;h=o;o=0;if((h|0)!=0&(p|0)!=0){e=A6(c[h>>2]|0,F|0,E|0)|0;if(!e)Ca(h|0,p|0);D=p}else e=-1;if((e|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue}else{m=58;break}}c[d>>2]=0;g=0;while(1){if((g|0)>=(j|0))break;o=0;la(26,c[m+(g<<2)>>2]|0)|0;h=o;o=0;if((h|0)!=0&(p|0)!=0){e=A6(c[h>>2]|0,F|0,E|0)|0;if(!e)Ca(h|0,p|0);D=p}else e=-1;if((e|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15;continue b}g=g+1|0}o=0;$(105,i|0);g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,F|0,E|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){r=u;s=v;t=w;m=x;g=D;u=r;v=s;w=t;x=m;m=15}else{m=56;break}}if((m|0)==56){g=0;break}else if((m|0)==58){c[d>>2]=j;a[f>>0]=k;break}}while(0);l6(F|0);l=G;return g|0}function rG(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;if(!((a|0)!=0?(AG(a)|0)!=0:0))a=99289;f=D3(a)|0;e=f+25|0;if((e|0)>=129){d=IK(e)|0;if(!d)d=0;else g=6}else g=6;if((g|0)==6){O3(d,a)|0;c[b>>2]=f}return d|0}function sG(a,b){a=a|0;b=b|0;lC(b,a,1)|0;return}function tG(b,d){b=b|0;d=d|0;var e=0;b=(c[b+16>>2]|0)+157|0;e=a[b>>0]|0;if((d|0)>=0)a[b>>0]=d;return e|0}function uG(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;c[b>>2]=d;c[b+4>>2]=d+4096;c[b+12>>2]=0;c[b+8>>2]=0;c[a>>2]=b;c[a+4>>2]=b;c[a+8>>2]=d;c[a+12>>2]=e;c[a+16>>2]=f;return}function vG(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;yG(e,b);i=e+12|0;j=e+16|0;b=0;a:while(1){k=zG(e)|0;if(!k)break;b=b+1|0;f=c[i>>2]|0;if(f|0)lb[f&63](k,d);h=ZA(a,k)|0;while(1){if(!h)continue a;g=c[h>>2]&3;f=c[((g|0)==3?h:h+48|0)+40>>2]|0;if((f|0)==(k|0))f=c[((g|0)==2?h:h+-48|0)+40>>2]|0;if(!(vb[c[j>>2]&127](f,-1)|0))yG(e,f);h=_A(a,h,k)|0}}return b|0}function wG(a){a=a|0;var b=0;a=c[(c[a>>2]|0)+12>>2]|0;while(1){if(!a)break;b=c[a+12>>2]|0;xG(a);a=b}return}function xG(a){a=a|0;l6(c[a>>2]|0);l6(a);return}function yG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;j=k+8|0;f=k;g=a+8|0;i=a+4|0;d=c[i>>2]|0;if((c[g>>2]|0)==(c[d+4>>2]|0)){d=c[d+12>>2]|0;do if(!d){e=IK(16)|0;if(!e){dA(1,99270,f)|0;Ca(188244,1)}c[e+8>>2]=c[i>>2];c[e+12>>2]=0;d=IK(4e6)|0;c[e>>2]=d;if(!d){dA(1,99270,j)|0;Ca(188244,1)}else{c[e+4>>2]=d+4e6;c[(c[i>>2]|0)+12>>2]=e;h=e;break}}else h=d;while(0);c[i>>2]=h;c[g>>2]=c[h>>2]}vb[c[a+16>>2]&127](b,1)|0;j=c[g>>2]|0;c[g>>2]=j+4;c[j>>2]=b;l=k;return}function zG(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;f=a+8|0;b=c[f>>2]|0;d=a+4|0;e=c[d>>2]|0;if((b|0)==(c[e>>2]|0))if((e|0)==(c[a>>2]|0))b=0;else{b=c[e+8>>2]|0;c[d>>2]=b;b=c[b+4>>2]|0;c[f>>2]=b;g=4}else g=4;if((g|0)==4){b=b+-4|0;c[f>>2]=b;b=c[b>>2]|0}return b|0}function AG(b){b=b|0;var c=0;a:while(1){c=b;b=b+1|0;c=a[c>>0]|0;switch(c<<24>>24){case 95:continue a;case 0:{b=1;break a}default:{}}if(!(O2(c&255)|0)){b=0;break}}return b|0}function BG(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;z=l;l=l+4272|0;w=z;x=4;y=k6(40)|0;c[y>>2]=0;t=z+4144|0;u=z+4140|0;v=z+4120|0;h=z+4104|0;i=z+8|0;o=0;f=la(24,a|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){e=A6(c[g>>2]|0,y|0,x|0)|0;if(!e)Ca(g|0,p|0);D=p}else e=-1;a:do if((e|0)!=1)if(f){o=0;k=aa(32,d|0,u|0,t|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){d=A6(c[e>>2]|0,y|0,x|0)|0;if(!d)Ca(e|0,p|0);D=p}else d=-1;if((d|0)!=1){o=0;j=la(23,40)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){d=A6(c[e>>2]|0,y|0,x|0)|0;if(!d)Ca(e|0,p|0);D=p}else d=-1;if((d|0)!=1){o=0;ba(16,v|0,h|0,i|0,24,85);e=o;o=0;if((e|0)!=0&(p|0)!=0){d=A6(c[e>>2]|0,y|0,x|0)|0;if(!d)Ca(e|0,p|0);D=p}else d=-1;if((d|0)!=1){o=0;f=la(25,a|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){d=A6(c[e>>2]|0,y|0,x|0)|0;if(!d)Ca(e|0,p|0);D=p}else d=-1;if((d|0)!=1){h=v+16|0;g=c[h>>2]|0;e=f;while(1){if(!e)break;o=0;ra(g|0,e|0,0)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){f=A6(c[d>>2]|0,y|0,x|0)|0;if(!f)Ca(d|0,p|0);D=p}else f=-1;if((f|0)==1){s=h;r=j;q=k;e=D;j=14;break a}o=0;e=ra(86,a|0,e|0)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){f=A6(c[d>>2]|0,y|0,x|0)|0;if(!f)Ca(d|0,p|0);D=p}else f=-1;if((f|0)==1){s=h;r=j;q=k;e=D;j=14;break a}}y=x6(188244,1,y|0,x|0)|0;x=D;o=0;e=o;o=0;if((e|0)!=0&(p|0)!=0){d=A6(c[e>>2]|0,y|0,x|0)|0;if(!d)Ca(e|0,p|0);D=p}else d=-1;if((d|0)==1){s=h;r=j;q=k;e=D;j=14}else{s=h;r=j;q=k;e=0;j=14}}else{s=0;r=j;q=k;e=D;j=14}}else{s=0;r=j;q=k;e=D;j=14}}else{s=0;r=j;q=k;e=D;j=14}}else{s=0;r=0;q=k;e=D;j=14}}else{d=0;e=0}else{s=0;r=0;q=0;e=D;j=14}while(0);b:do if((j|0)==14){c:while(1){if(e|0){o=0;$(108,v|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){d=A6(c[e>>2]|0,y|0,x|0)|0;if(!d)Ca(e|0,p|0);D=p}else d=-1;if((d|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue}o=0;$(105,r|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){d=A6(c[e>>2]|0,y|0,x|0)|0;if(!d)Ca(e|0,p|0);D=p}else d=-1;if((d|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue}if((q|0)==(t|0)){d=0;e=0;break b}o=0;$(105,q|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){d=A6(c[e>>2]|0,y|0,x|0)|0;if(!d)Ca(e|0,p|0);D=p}else d=-1;if((d|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue}else{j=19;break}}o=0;f=la(25,a|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){d=A6(c[e>>2]|0,y|0,x|0)|0;if(!d)Ca(e|0,p|0);D=p}else d=-1;if((d|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue}n=q+(c[u>>2]|0)|0;m=10;i=r;e=0;j=r;while(1){if(!f)break;o=0;d=ra(c[s>>2]|0,f|0,-1)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){h=A6(c[g>>2]|0,y|0,x|0)|0;if(!h)Ca(g|0,p|0);D=p}else h=-1;if((h|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue c}if(!d){o=0;c[w>>2]=e;aa(33,n|0,137696,w|0)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){g=A6(c[d>>2]|0,y|0,x|0)|0;if(!g)Ca(d|0,p|0);D=p}else g=-1;if((g|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue c}o=0;k=aa(34,a|0,q|0,1)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){g=A6(c[d>>2]|0,y|0,x|0)|0;if(!g)Ca(d|0,p|0);D=p}else g=-1;if((g|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue c}o=0;pa(53,k|0,137786,280,1)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){g=A6(c[d>>2]|0,y|0,x|0)|0;if(!g)Ca(d|0,p|0);D=p}else g=-1;if((g|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue c}o=0;pa(54,a|0,f|0,k|0,v|0)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){g=A6(c[d>>2]|0,y|0,x|0)|0;if(!g)Ca(d|0,p|0);D=p}else g=-1;if((g|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue c}if((e|0)==(m|0)){h=e<<1;o=0;i=ra(87,j|0,e<<3|0)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){g=A6(c[d>>2]|0,y|0,x|0)|0;if(!g)Ca(d|0,p|0);D=p}else g=-1;if((g|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue c}g=i;d=i}else{h=m;g=i;d=j}c[g+(e<<2)>>2]=k;e=e+1|0;i=g;j=d}else h=m;o=0;f=ra(86,a|0,f|0)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){g=A6(c[d>>2]|0,y|0,x|0)|0;if(!g)Ca(d|0,p|0);D=p}else g=-1;if((g|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue c}m=h}o=0;$(108,v|0);d=o;o=0;if((d|0)!=0&(p|0)!=0){f=A6(c[d>>2]|0,y|0,x|0)|0;if(!f)Ca(d|0,p|0);D=p}else f=-1;if((f|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue}o=0;d=ra(87,j|0,e<<2|0)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){g=A6(c[f>>2]|0,y|0,x|0)|0;if(!g)Ca(f|0,p|0);D=p}else g=-1;if((g|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14;continue}if((q|0)==(t|0))break b;o=0;$(105,q|0);f=o;o=0;if((f|0)!=0&(p|0)!=0){g=A6(c[f>>2]|0,y|0,x|0)|0;if(!g)Ca(f|0,p|0);D=p}else g=-1;if((g|0)==1){m=q;n=r;j=s;e=D;q=m;r=n;s=j;j=14}else{j=39;break}}if((j|0)==19){d=0;e=0;break}else if((j|0)==39)break}while(0);c[b>>2]=e;l6(y|0);l=z;return d|0}function CG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=0;f=gC(a)|0;while(1){if(!f)break;e=UA(b,f)|0;while(1){if(!e)break;if(lC(a,c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0,0)|0){jB(a,e,1)|0;d=d+1|0}e=WA(b,e)|0}f=hC(a,f)|0}return d|0}function DG(a){a=a|0;a=PC(a,99294,0)|0;if(!a)Aa(99299,99302,529,99311);else return c[a+8>>2]|0;return 0}function EG(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;u=l;l=l+4320|0;s=u+24|0;r=u+8|0;q=u;t=u+4184|0;p=u+4160|0;f=u+40|0;if(qB(b)|0){WC(b,0,99320,-12,0);WC(b,1,99332,16,0);o=rG(e,f,t)|0;k=FG(b)|0;m=IK((qB(k)|0)<<2)|0;uG(p,u+4144|0,u+48|0,24,88);h=gC(k)|0;n=p+16|0;i=o+(c[f>>2]|0)|0;j=c[15715]|0;e=0;while(1){if(!h)break;if(!(vb[c[n>>2]&127](h,-1)|0)){c[q>>2]=e;i2(i,100234,q)|0;v=LD(k,o,1)|0;w=LD(b,o,1)|0;RC(w,99320,12,0)|0;a[(PC(w,99320,0)|0)+8>>0]=1;f=vG(k,h,v,p)|0;HG(v,w);g=IG(w)|0;JG(b,w);c[m+(e<<2)>>2]=w;tC(k,v)|0;if(a[195234]|0){c[r>>2]=e;c[r+4>>2]=f;c[r+8>>2]=g;z4(j,99344,r)|0}e=e+1|0}h=hC(k,h)|0}if(a[195234]|0){r=qB(b)|0;v=rB(b)|0;w=HB(b)|0;c[s>>2]=r;c[s+4>>2]=v;c[s+8>>2]=e;c[s+12>>2]=w;z4(j,99374,s)|0}pB(k)|0;XC(b,0,99320);XC(b,1,99332);wG(p);f=KK(m,e<<2)|0;if((o|0)!=(t|0))l6(o)}else{f=0;e=0}c[d>>2]=e;l=u;return f|0}function FG(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;h=l;l=l+16|0;g=h;c[g>>2]=c[4660];g=lB(99421,g,0)|0;MG(g,a);b=gC(a)|0;while(1){if(!b)break;if(!(c[(PC(b,99332,0)|0)+12>>2]|0)){f=qC(g,HB(b)|0,1)|0;RC(f,99332,16,1)|0;c[(c[f+16>>2]|0)+12>>2]=b;c[(PC(b,99332,0)|0)+12>>2]=f}b=hC(a,b)|0}d=gC(a)|0;while(1){if(!d)break;e=c[(PC(d,99332,0)|0)+12>>2]|0;b=UA(a,d)|0;while(1){if(!b)break;f=c[(PC(c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0,99332,0)|0)+12>>2]|0;do if((f|0)!=(e|0))if(f>>>0>e>>>0){fB(g,e,f,0,1)|0;break}else{fB(g,f,e,0,1)|0;break}while(0);b=WA(a,b)|0}d=hC(a,d)|0}l=h;return g|0}function GG(b,d){b=b|0;d=d|0;var e=0;b=(c[b+16>>2]|0)+8|0;e=a[b>>0]|0;if((d|0)>=0)a[b>>0]=d;return e|0}function HG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;e=gC(a)|0;while(1){if(!e)break;f=c[(c[e+16>>2]|0)+12>>2]|0;a:do if((c[f>>2]&3|0)==1)lC(b,f,1)|0;else{d=gC(f)|0;while(1){if(!d)break a;lC(b,d,1)|0;d=hC(f,d)|0}}while(0);e=hC(a,e)|0}return}function IG(a){a=a|0;return CG(a,c[a+60>>2]|0)|0}function JG(a,b){a=a|0;b=b|0;KG(a,b,0);return}function KG(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;g=(d|0)==0;b=MD(b)|0;while(1){if(!b)break;if((a[(PC(b,99320,0)|0)+8>>0]|0)==0?(f=LG(b,c,d)|0,f|0):0){if(g)e=(h2(HB(b)|0,108307,7)|0)==0;else e=1;KG(b,f,e&1)}b=ND(b)|0}return}function LG(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=0;h=gC(a)|0;while(1){f=(e|0)==0;if(!h)break;g=qC(b,HB(h)|0,0)|0;if(g){if(f)e=LD(b,HB(a)|0,1)|0;lC(e,g,1)|0}h=hC(a,h)|0}if((d|0)!=0&f)e=LD(b,HB(a)|0,1)|0;if(e|0?(CG(e,a)|0,RA(a,e)|0,(h2(HB(e)|0,108307,7)|0)==0):0)c[(RC(e,99294,12,0)|0)+8>>2]=a;return e|0}function MG(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=l;l=l+16|0;g=h;d=MD(b)|0;e=c[15715]|0;while(1){if(!d)break;a:do if(!(h2(HB(d)|0,108307,7)|0)){f=qC(a,HB(d)|0,1)|0;RC(f,99332,16,1)|0;c[(c[f+16>>2]|0)+12>>2]=d;b=gC(d)|0;while(1){if(!b)break a;if(c[(PC(b,99332,0)|0)+12>>2]|0){k=HB(b)|0;j=HB(d)|0;i=HB(c[(PC(b,99332,0)|0)+12>>2]|0)|0;c[g>>2]=k;c[g+4>>2]=j;c[g+8>>2]=i;z4(e,99424,g)|0}c[(PC(b,99332,0)|0)+12>>2]=f;b=hC(d,b)|0}}else MG(a,d);while(0);d=ND(d)|0}l=h;return}function NG(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0.0;n=+h[a>>3];j=~~(n+(n>=0.0?.5:-.5));n=+h[a+8>>3];a=~~(n+(n>=0.0?.5:-.5));n=+h[b>>3];g=~~(n+(n>=0.0?.5:-.5));n=+h[b+8>>3];f=~~(n+(n>=0.0?.5:-.5));l=g-j|0;i=((l|0)>-1?l:0-l|0)<<1;l=l>>31|1;m=f-a|0;k=((m|0)>-1?m:0-m|0)<<1;m=m>>31|1;a:do if((i|0)>(k|0)){e=0-i|0;d=k-(i>>1)|0;b=j;while(1){OL(c,b,a);if((b|0)==(g|0))break a;j=(d|0)>-1;d=d+k+(j?e:0)|0;b=b+l|0;a=(j?m:0)+a|0}}else{e=0-k|0;d=j;b=i-(k>>1)|0;while(1){OL(c,d,a);if((a|0)==(f|0))break a;k=(b|0)>-1;d=(k?l:0)+d|0;b=b+i+(k?e:0)|0;a=a+m|0}}while(0);return}function OG(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+16|0;k=n;j=n+4|0;do if((a|0)<1)d=0;else{f=e+16|0;if((c[f>>2]|0)>>>0<4){d=PG(a,b,d,e)|0;break}m=IK(a<<5)|0;d=0;while(1){if((d|0)==(a|0))break;g=c[b+(d<<2)>>2]|0;zP(g);h=m+(d<<5)|0;g=(c[g+16>>2]|0)+16|0;c[h>>2]=c[g>>2];c[h+4>>2]=c[g+4>>2];c[h+8>>2]=c[g+8>>2];c[h+12>>2]=c[g+12>>2];c[h+16>>2]=c[g+16>>2];c[h+20>>2]=c[g+20>>2];c[h+24>>2]=c[g+24>>2];c[h+28>>2]=c[g+28>>2];d=d+1|0}if((c[f>>2]|0)==4){h=e+28|0;a:do if(c[h>>2]&2|0){f=e+24|0;c[f>>2]=HK(a<<2)|0;d=0;while(1){if((d|0)==(a|0))break a;g=NA(c[b+(d<<2)>>2]|0,99491)|0;if(g|0?(c[k>>2]=j,g=(q4(g,137696,k)|0)>0,i=c[j>>2]|0,g&(i|0)>-1):0)c[(c[f>>2]|0)+(d<<2)>>2]=i;d=d+1|0}}while(0);d=QG(a,m,e)|0;if(c[h>>2]&2)l6(c[e+24>>2]|0)}else d=0;l6(m)}while(0);l=n;return d|0}function PG(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0.0,K=0.0,L=0.0;H=l;l=l+144|0;C=H+136|0;B=H+64|0;G=H+48|0;w=H+40|0;v=H;u=H+120|0;A=H+104|0;D=H+96|0;E=c[g+20>>2]|0;c[A>>2]=0;c[A+4>>2]=0;c[A+8>>2]=0;c[A+12>>2]=0;a:do if((b|0)>=1){x=A+12|0;y=A+8|0;z=A+4|0;p=(E|0)==0;F=c[15715]|0;q=u+4|0;r=u+8|0;s=u+12|0;o=0;i=0;while(1){if((o|0)==(b|0))break;t=c[e+(o<<2)>>2]|0;zP(t);if(!p?(a[E+o>>0]|0)!=0:0){n=c[t+16>>2]|0;I=+h[n+16>>3];j=~~(I+(I>=0.0?.5:-.5));c[u>>2]=j;I=+h[n+24>>3];k=~~(I+(I>=0.0?.5:-.5));c[q>>2]=k;I=+h[n+32>>3];m=~~(I+(I>=0.0?.5:-.5));c[r>>2]=m;I=+h[n+40>>3];n=~~(I+(I>=0.0?.5:-.5));c[s>>2]=n;if(!i){c[A>>2]=c[u>>2];c[A+4>>2]=c[u+4>>2];c[A+8>>2]=c[u+8>>2];c[A+12>>2]=c[u+12>>2]}else{c[A>>2]=c[((j|0)<(c[A>>2]|0)?u:A)>>2];c[z>>2]=c[((k|0)<(c[z>>2]|0)?u:A)+4>>2];c[y>>2]=c[((m|0)>(c[y>>2]|0)?u:A)+8>>2];c[x>>2]=c[((n|0)>(c[x>>2]|0)?u:A)+12>>2]}i=i+1|0}if((d[195234]|0)>2){n=HB(t)|0;t=c[t+16>>2]|0;L=+h[t+16>>3];K=+h[t+24>>3];J=+h[t+32>>3];I=+h[t+40>>3];c[v>>2]=n;h[v+8>>3]=L;h[v+16>>3]=K;h[v+24>>3]=J;h[v+32>>3]=I;z4(F,99558,v)|0}o=o+1|0}r=IK(b<<5)|0;i=0;while(1){if((i|0)==(b|0))break;v=r+(i<<5)|0;u=(c[(c[e+(i<<2)>>2]|0)+16>>2]|0)+16|0;c[v>>2]=c[u>>2];c[v+4>>2]=c[u+4>>2];c[v+8>>2]=c[u+8>>2];c[v+12>>2]=c[u+12>>2];c[v+16>>2]=c[u+16>>2];c[v+20>>2]=c[u+20>>2];c[v+24>>2]=c[u+24>>2];c[v+28>>2]=c[u+28>>2];i=i+1|0}p=g+8|0;q=TG(b,r,c[p>>2]|0)|0;if(a[195234]|0){c[w>>2]=q;z4(F,99586,w)|0}if((q|0)>=1){o=(E|0)!=0;i=D+4|0;if(o){c[D>>2]=((c[y>>2]|0)+(c[A>>2]|0)|0)/2|0;c[i>>2]=((c[x>>2]|0)+(c[z>>2]|0)|0)/2|0}else{c[i>>2]=0;c[D>>2]=0}n=HK(b<<4)|0;m=g+16|0;i=0;while(1){if((i|0)>=(b|0))break;j=c[e+(i<<2)>>2]|0;k=n+(i<<4)|0;c[n+(i<<4)+12>>2]=i;if((c[m>>2]|0)==3){y=(c[j+16>>2]|0)+16|0;z=c[p>>2]|0;A=HB(j)|0;c[B>>2]=c[y>>2];c[B+4>>2]=c[y+4>>2];c[B+8>>2]=c[y+8>>2];c[B+12>>2]=c[y+12>>2];c[B+16>>2]=c[y+16>>2];c[B+20>>2]=c[y+20>>2];c[B+24>>2]=c[y+24>>2];c[B+28>>2]=c[y+28>>2];c[C>>2]=c[D>>2];c[C+4>>2]=c[D+4>>2];UG(B,k,q,z,C,A)}else{c[C>>2]=c[D>>2];c[C+4>>2]=c[D+4>>2];VG(f,j,k,q,g,C)}i=i+1|0}k=HK(b<<2)|0;i=0;while(1){if((i|0)>=(b|0))break;c[k+(i<<2)>>2]=n+(i<<4);i=i+1|0}k3(k,b,4,89);m=IL()|0;i=HK(b<<3)|0;b:do if(o){j=0;while(1){if((j|0)>=(b|0)){j=0;break}if(a[E+j>>0]|0){f=c[k+(j<<2)>>2]|0;g=i+(c[f+12>>2]<<3)|0;c[C>>2]=c[D>>2];c[C+4>>2]=c[D+4>>2];XG(f,m,g,C)}j=j+1|0}while(1){if((j|0)>=(b|0))break b;if(!(a[E+j>>0]|0)){D=c[k+(j<<2)>>2]|0;YG(j,D,m,i+(c[D+12>>2]<<3)|0,q,c[p>>2]|0,r)}j=j+1|0}}else{j=0;while(1){if((j|0)>=(b|0))break b;E=c[k+(j<<2)>>2]|0;YG(j,E,m,i+(c[E+12>>2]<<3)|0,q,c[p>>2]|0,r);j=j+1|0}}while(0);l6(k);j=0;while(1){if((j|0)>=(b|0))break;l6(c[n+(j<<4)+4>>2]|0);j=j+1|0}l6(n);LL(m);l6(r);if((d[195234]|0)>1){j=0;while(1){if((j|0)>=(b|0))break a;D=c[i+(j<<3)>>2]|0;E=c[i+(j<<3)+4>>2]|0;c[G>>2]=j;c[G+4>>2]=D;c[G+8>>2]=E;z4(F,99602,G)|0;j=j+1|0}}}else i=0}else i=0;while(0);l=H;return i|0}function QG(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=l;l=l+16|0;f=C;A=HK(b<<3)|0;y=c[e+4>>2]|0;B=e+28|0;z=(c[B>>2]&1|0)==0;v=(y|0)>0;w=b+-1|0;x=~~+R(+(+G(+(+(b|0)))));w=v?(w+y|0)/(y|0)|0:(w+x|0)/(x|0)|0;x=v?y:x;y=z?x:w;x=z?w:x;if(a[195234]|0){w=c[15715]|0;c[f>>2]=z?99497:99507;c[f+4>>2]=x;c[f+8>>2]=y;z4(w,99520,f)|0}u=HK((y<<3)+8|0)|0;v=HK((x<<3)+8|0)|0;w=HK(b*24|0)|0;j=e+8|0;f=0;i=w;while(1){if((f|0)>=(b|0))break;o=+h[d+(f<<5)+8>>3];n=+h[d+(f<<5)+24>>3];p=+((c[j>>2]|0)>>>0);h[i>>3]=+h[d+(f<<5)+16>>3]-+h[d+(f<<5)>>3]+p;h[i+8>>3]=n-o+p;c[i+16>>2]=f;f=f+1|0;i=i+24|0}t=HK(b<<2)|0;f=0;while(1){if((f|0)>=(b|0))break;c[t+(f<<2)>>2]=w+(f*24|0);f=f+1|0}f=c[e+24>>2]|0;if(!f)if(!(c[B>>2]&64)){k3(t,b,4,91);i=0;f=0;k=0}else{i=0;f=0;k=0}else{c[47100]=f;k3(t,b,4,90);i=0;f=0;k=0}while(1){if((k|0)>=(b|0)){g=0.0;f=0;break}e=c[t+(k<<2)>>2]|0;j=u+(f<<3)|0;p=+h[j>>3];o=+h[e>>3];h[j>>3]=p>o?p:o;j=v+(i<<3)|0;o=+h[j>>3];p=+h[e+8>>3];h[j>>3]=o>p?o:p;j=i+1|0;e=f+1|0;if(z){f=(e|0)==(y|0);i=f?j:i;f=f?0:e}else{s=(j|0)==(x|0);i=s?0:j;f=s?e:f}k=k+1|0}while(1){if((f|0)>(y|0)){g=0.0;f=x;break}s=u+(f<<3)|0;p=+h[s>>3];h[s>>3]=g;g=g+p;f=f+1|0}while(1){if((f|0)<=0)break;s=f+-1|0;p=+h[v+(s<<3)>>3];h[v+(f<<3)>>3]=g;g=g+p;f=s}h[v>>3]=g;i=0;f=0;s=0;while(1){if((s|0)>=(b|0))break;q=c[(c[t+(s<<2)>>2]|0)+16>>2]|0;g=+h[d+(q<<5)>>3];p=+h[d+(q<<5)+8>>3];m=+h[d+(q<<5)+16>>3];o=+h[d+(q<<5)+24>>3];k=c[B>>2]|0;j=u+(f<<3)|0;r=f+1|0;do if(!(k&4)){n=+h[u+(r<<3)>>3];if(!(k&8)){g=(n+ +h[j>>3]-m-g)*.5;break}else{g=n-(m-g);break}}else g=+h[j>>3];while(0);c[A+(q<<3)>>2]=~~g;j=v+(i<<3)|0;e=i+1|0;if(!(k&16)){g=+h[v+(e<<3)>>3];if(!(k&32))g=(g+ +h[j>>3]-o-p)*.5}else g=+h[j>>3]-(o-p);c[A+(q<<3)+4>>2]=~~g;if(z){f=(r|0)==(y|0);i=f?e:i;f=f?0:r}else{q=(e|0)==(x|0);i=q?0:e;f=q?r:f}s=s+1|0}l6(w);l6(t);l6(u);l6(v);l=C;return A|0}function RG(a,b){a=a|0;b=b|0;var d=0;d=c[47100]|0;a=c[d+(c[(c[a>>2]|0)+16>>2]<<2)>>2]|0;b=c[d+(c[(c[b>>2]|0)+16>>2]<<2)>>2]|0;return ((a|0)>(b|0)?1:((a|0)<(b|0))<<31>>31)|0}function SG(a,b){a=a|0;b=b|0;var d=0.0,e=0.0;a=c[a>>2]|0;b=c[b>>2]|0;e=+h[a+8>>3]+ +h[a>>3];d=+h[b+8>>3]+ +h[b>>3];return (ed)<<31>>31)|0}function TG(a,b,e){a=a|0;b=b|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0,k=0.0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0,t=0;t=l;l=l+96|0;r=t+80|0;s=t+48|0;q=t+8|0;n=t;m=(a*100|0)+-1|0;f=+(e<<1|0);o=0.0;p=0.0;e=0;while(1){if((e|0)>=(a|0))break;j=f+(+h[b+(e<<5)+16>>3]-+h[b+(e<<5)>>3]);k=f+(+h[b+(e<<5)+24>>3]-+h[b+(e<<5)+8>>3]);o=o-(j+k);p=p-j*k;e=e+1|0}j=+(m|0);k=o*o-j*4.0*p;if(!(k<0.0)){f=+G(+k);i=j*2.0;g=(f-o)/i;i=(-o-f)/i;e=~~g;e=(e|0)==0?1:e;if((d[195234]|0)>2){n=c[15715]|0;_3(99745,27,1,n)|0;h[q>>3]=j;h[q+8>>3]=o;h[q+16>>3]=p;h[q+24>>3]=k;h[q+32>>3]=f;z4(n,99773,q)|0;c[s>>2]=e;h[s+8>>3]=g;c[s+16>>2]=~~i;h[s+24>>3]=i;z4(n,99799,s)|0;h[r>>3]=p+(o*g+g*(j*g));h[r+8>>3]=p+(o*i+i*(j*i));z4(n,99821,r)|0}}else{h[n>>3]=k;dA(1,99718,n)|0;e=-1}l=t;return e|0}function UG(a,b,e,f,g,i){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0.0,x=0.0;v=l;l=l+32|0;u=v+16|0;t=v;q=+h[a>>3];r=+h[a+8>>3];o=+h[a+16>>3];p=+h[a+24>>3];s=IL()|0;k=c[g>>2]|0;a=k-f|0;m=c[g+4>>2]|0;j=m-f|0;k=f-~~(q+(q>=0.0?.5:-.5))+k+~~(o+(o>=0.0?.5:-.5))|0;m=f-~~(r+(r>=0.0?.5:-.5))+m+~~(p+(p>=0.0?.5:-.5))|0;if((a|0)>-1)g=(a|0)/(e|0)|0;else g=((a+1|0)/(e|0)|0)+-1|0;if((j|0)>-1)n=(j|0)/(e|0)|0;else n=((j+1|0)/(e|0)|0)+-1|0;if((k|0)>-1)k=(k|0)/(e|0)|0;else k=((k+1|0)/(e|0)|0)+-1|0;if((m|0)>-1)j=(m|0)/(e|0)|0;else j=((m+1|0)/(e|0)|0)+-1|0;while(1){if((g|0)>(k|0))break;else a=n;while(1){if((a|0)>(j|0))break;OL(s,g,a);a=a+1|0}g=g+1|0}m=b+4|0;c[m>>2]=SL(s)|0;k=RL(s)|0;n=b+8|0;c[n>>2]=k;x=+(f<<1|0);w=+(e|0);j=~~+R(+((x+(o-q))/w));a=~~+R(+((x+(p-r))/w));c[b>>2]=a+j;a:do if((d[195234]|0)>2){g=c[15715]|0;c[t>>2]=i;c[t+4>>2]=k;c[t+8>>2]=j;c[t+12>>2]=a;z4(g,99677,t)|0;a=0;while(1){if((a|0)>=(c[n>>2]|0))break a;i=c[m>>2]|0;t=c[i+(a<<3)+4>>2]|0;c[u>>2]=c[i+(a<<3)>>2];c[u+4>>2]=t;z4(g,99704,u)|0;a=a+1|0}}while(0);LL(s);l=v;return}function VG(a,b,e,f,g,i){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0.0,S=0.0;P=l;l=l+128|0;G=P+112|0;F=P+104|0;O=P+16|0;N=P;I=P+64|0;J=P+56|0;A=P+40|0;B=P+96|0;z=P+88|0;w=P+24|0;x=P+80|0;y=P+72|0;L=c[g+8>>2]|0;H=c[g+12>>2]|0;D=(a|0)==0?b:a;M=IL()|0;K=b+16|0;C=c[K>>2]|0;u=+h[C+16>>3];E=(c[i>>2]|0)-~~(u+(u>=0.0?.5:-.5))|0;u=+h[C+24>>3];C=(c[i+4>>2]|0)-~~(u+(u>=0.0?.5:-.5))|0;a:do if((c[g+16>>2]|0)==1){w=IK((qB(b)|0)<<2)|0;a=0;i=gC(b)|0;while(1){if(!i)break;y=i+16|0;c[w+(a<<2)>>2]=c[(c[y>>2]|0)+112>>2];c[(c[y>>2]|0)+112>>2]=0;a=a+1|0;i=hC(b,i)|0}p=E-L|0;q=C-L|0;r=E+L|0;s=C+L|0;o=1;while(1){a=c[K>>2]|0;if((o|0)>(c[a+180>>2]|0))break;n=c[(c[a+184>>2]|0)+(o<<2)>>2]|0;j=c[n+16>>2]|0;u=+h[j+16>>3];a=~~(u+(u>=0.0?.5:-.5));u=+h[j+24>>3];i=~~(u+(u>=0.0?.5:-.5));u=+h[j+32>>3];g=~~(u+(u>=0.0?.5:-.5));u=+h[j+40>>3];j=~~(u+(u>=0.0?.5:-.5));b:do if((g|0)>(a|0)&(j|0)>(i|0)){a=p+a|0;k=q+i|0;g=r+g|0;m=s+j|0;if((a|0)>-1)i=(a|0)/(f|0)|0;else i=((a+1|0)/(f|0)|0)+-1|0;if((k|0)>-1)k=(k|0)/(f|0)|0;else k=((k+1|0)/(f|0)|0)+-1|0;if((g|0)>-1)j=(g|0)/(f|0)|0;else j=((g+1|0)/(f|0)|0)+-1|0;if((m|0)>-1)g=(m|0)/(f|0)|0;else g=((m+1|0)/(f|0)|0)+-1|0;while(1){if((i|0)>(j|0))break;else a=k;while(1){if((a|0)>(g|0))break;OL(M,i,a);a=a+1|0}i=i+1|0}a=gC(n)|0;while(1){if(!a)break b;c[(c[a+16>>2]|0)+212>>2]=n;a=hC(n,a)|0}}while(0);o=o+1|0}s=A+8|0;t=I+4|0;u=+(L|0);v=J+4|0;r=B+4|0;q=z+4|0;p=gC(b)|0;while(1){if(!p)break;hP(A,p);S=+h[A>>3];Q=+h[s>>3];n=~~(S+(S>=0.0?.5:-.5))+E|0;c[I>>2]=n;o=~~(Q+(Q>=0.0?.5:-.5))+C|0;c[t>>2]=o;i=p+16|0;a=c[i>>2]|0;c:do if(!(c[a+212>>2]|0)){c[J>>2]=~~(u+(+h[a+88>>3]+ +h[a+96>>3])*.5);c[v>>2]=~~(u+ +h[a+80>>3]*.5);c[F>>2]=c[I>>2];c[F+4>>2]=c[I+4>>2];c[G>>2]=c[J>>2];c[G+4>>2]=c[J+4>>2];_G(B,F,G);a=c[B>>2]|0;g=c[r>>2]|0;c[F>>2]=c[I>>2];c[F+4>>2]=c[I+4>>2];c[G>>2]=c[J>>2];c[G+4>>2]=c[J+4>>2];$G(z,F,G);j=c[z>>2]|0;k=c[q>>2]|0;if((a|0)>-1)i=(a|0)/(f|0)|0;else i=((a+1|0)/(f|0)|0)+-1|0;if((g|0)>-1)m=(g|0)/(f|0)|0;else m=((g+1|0)/(f|0)|0)+-1|0;if((j|0)>-1)j=(j|0)/(f|0)|0;else j=((j+1|0)/(f|0)|0)+-1|0;if((k|0)>-1)g=(k|0)/(f|0)|0;else g=((k+1|0)/(f|0)|0)+-1|0;while(1){if((i|0)>(j|0))break;else a=m;while(1){if((a|0)>(g|0))break;OL(M,i,a);a=a+1|0}i=i+1|0}if((n|0)>-1)a=(n|0)/(f|0)|0;else a=((n+1|0)/(f|0)|0)+-1|0;c[I>>2]=a;if((o|0)>-1)a=(o|0)/(f|0)|0;else a=((o+1|0)/(f|0)|0)+-1|0;c[t>>2]=a;a=UA(D,p)|0;while(1){if(!a)break c;c[G>>2]=c[I>>2];c[G+4>>2]=c[I+4>>2];aH(a,G,M,E,C,f,H);a=WA(D,a)|0}}else{if((n|0)>-1)a=(n|0)/(f|0)|0;else a=((n+1|0)/(f|0)|0)+-1|0;c[I>>2]=a;if((o|0)>-1)a=(o|0)/(f|0)|0;else a=((o+1|0)/(f|0)|0)+-1|0;c[t>>2]=a;a=UA(D,p)|0;while(1){if(!a)break c;if((c[(c[i>>2]|0)+212>>2]|0)!=(c[(c[(c[((c[a>>2]&3|0)==2?a:a+-48|0)+40>>2]|0)+16>>2]|0)+212>>2]|0)){c[G>>2]=c[I>>2];c[G+4>>2]=c[I+4>>2];aH(a,G,M,E,C,f,H)}a=WA(D,a)|0}}while(0);p=hC(b,p)|0}a=0;i=gC(b)|0;while(1){if(!i)break;c[(c[i+16>>2]|0)+112>>2]=c[w+(a<<2)>>2];a=a+1|0;i=hC(b,i)|0}l6(w)}else{s=w+8|0;t=I+4|0;u=+(L|0);v=J+4|0;r=x+4|0;q=y+4|0;p=gC(b)|0;while(1){if(!p)break a;hP(w,p);Q=+h[w>>3];S=+h[s>>3];n=~~(Q+(Q>=0.0?.5:-.5))+E|0;c[I>>2]=n;o=~~(S+(S>=0.0?.5:-.5))+C|0;c[t>>2]=o;a=c[p+16>>2]|0;c[J>>2]=~~(u+(+h[a+88>>3]+ +h[a+96>>3])*.5);c[v>>2]=~~(u+ +h[a+80>>3]*.5);c[F>>2]=c[I>>2];c[F+4>>2]=c[I+4>>2];c[G>>2]=c[J>>2];c[G+4>>2]=c[J+4>>2];_G(x,F,G);a=c[x>>2]|0;g=c[r>>2]|0;c[F>>2]=c[I>>2];c[F+4>>2]=c[I+4>>2];c[G>>2]=c[J>>2];c[G+4>>2]=c[J+4>>2];$G(y,F,G);j=c[y>>2]|0;k=c[q>>2]|0;if((a|0)>-1)i=(a|0)/(f|0)|0;else i=((a+1|0)/(f|0)|0)+-1|0;if((g|0)>-1)m=(g|0)/(f|0)|0;else m=((g+1|0)/(f|0)|0)+-1|0;if((j|0)>-1)j=(j|0)/(f|0)|0;else j=((j+1|0)/(f|0)|0)+-1|0;if((k|0)>-1)g=(k|0)/(f|0)|0;else g=((k+1|0)/(f|0)|0)+-1|0;while(1){if((i|0)>(j|0))break;else a=m;while(1){if((a|0)>(g|0))break;OL(M,i,a);a=a+1|0}i=i+1|0}if((n|0)>-1)a=(n|0)/(f|0)|0;else a=((n+1|0)/(f|0)|0)+-1|0;c[I>>2]=a;if((o|0)>-1)a=(o|0)/(f|0)|0;else a=((o+1|0)/(f|0)|0)+-1|0;c[t>>2]=a;a=UA(D,p)|0;while(1){if(!a)break;c[G>>2]=c[I>>2];c[G+4>>2]=c[I+4>>2];aH(a,G,M,E,C,f,H);a=WA(D,a)|0}p=hC(b,p)|0}}while(0);j=e+4|0;c[j>>2]=SL(M)|0;k=e+8|0;c[k>>2]=RL(M)|0;i=c[K>>2]|0;Q=+(L<<1|0);S=+(f|0);a=~~+R(+((Q+(+h[i+32>>3]-+h[i+16>>3]))/S));i=~~+R(+((Q+(+h[i+40>>3]-+h[i+24>>3]))/S));c[e>>2]=i+a;d:do if((d[195234]|0)>2){g=c[15715]|0;e=HB(b)|0;b=c[k>>2]|0;c[N>>2]=e;c[N+4>>2]=b;c[N+8>>2]=a;c[N+12>>2]=i;z4(g,99677,N)|0;a=0;while(1){if((a|0)>=(c[k>>2]|0))break d;b=c[j>>2]|0;N=c[b+(a<<3)+4>>2]|0;c[O>>2]=c[b+(a<<3)>>2];c[O+4>>2]=N;z4(g,99704,O)|0;a=a+1|0}}while(0);LL(M);l=P;return}function WG(a,b){a=a|0;b=b|0;return (c[c[b>>2]>>2]|0)-(c[c[a>>2]>>2]|0)|0}function XG(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0;k=l;l=l+32|0;i=k+16|0;j=k;m=c[a+4>>2]|0;h=c[a+8>>2]|0;c[e>>2]=0-(c[f>>2]|0);g=e+4|0;c[g>>2]=0-(c[f+4>>2]|0);a=0;f=m;while(1){if((a|0)>=(h|0))break;c[i>>2]=c[f>>2];c[i+4>>2]=c[f+4>>2];ML(b,i);a=a+1|0;f=f+8|0}if((d[195234]|0)>1){m=c[15715]|0;b=c[e>>2]|0;e=c[g>>2]|0;c[j>>2]=h;c[j+4>>2]=b;c[j+8>>2]=e;z4(m,99651,j)|0}l=k;return}function YG(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0.0,k=0.0,l=0,m=0,n=0.0,o=0.0;m=c[b+12>>2]|0;j=+h[i+(m<<5)+24>>3]-+h[i+(m<<5)+8>>3];k=+h[i+(m<<5)+16>>3]-+h[i+(m<<5)>>3];if(!((a|0)==0?(o=+(g<<1|0),n=+(f|0),(ZG((~~+R(+((o+k)/n))|0)/-2|0,(~~+R(+((o+j)/n))|0)/-2|0,b,d,e,f,i)|0)!=0):0))l=3;a:do if((l|0)==3?(ZG(0,0,b,d,e,f,i)|0)==0:0)if((~~+R(+k)|0)<(~~+R(+j)|0)){m=1;while(1){l=0-m|0;a=0;while(1){if((a|0)<=(l|0)){g=l;break}if(ZG(l,a,b,d,e,f,i)|0)break a;a=a+-1|0}while(1){if((g|0)>=(m|0))break;if(ZG(g,a,b,d,e,f,i)|0)break a;g=g+1|0}while(1){if((a|0)>=(m|0))break;if(ZG(g,a,b,d,e,f,i)|0)break a;a=a+1|0}while(1){if((g|0)<=(l|0))break;if(ZG(g,a,b,d,e,f,i)|0)break a;g=g+-1|0}while(1){if((a|0)<=0)break;if(!(ZG(g,a,b,d,e,f,i)|0))a=a+-1|0;else break a}m=m+1|0}}else{m=1;while(1){l=0-m|0;a=0;while(1){if((a|0)>=(m|0)){g=l;break}if(ZG(a,l,b,d,e,f,i)|0)break a;a=a+1|0}while(1){if((g|0)>=(m|0))break;if(ZG(a,g,b,d,e,f,i)|0)break a;g=g+1|0}while(1){if((a|0)<=(l|0))break;if(ZG(a,g,b,d,e,f,i)|0)break a;a=a+-1|0}while(1){if((g|0)<=(l|0))break;if(ZG(a,g,b,d,e,f,i)|0)break a;g=g+-1|0}while(1){if((a|0)>=0)break;if(!(ZG(a,g,b,d,e,f,i)|0))a=a+1|0;else break a}m=m+1|0}}while(0);return}function ZG(a,b,e,f,g,i,j){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0;u=l;l=l+48|0;s=u+32|0;t=u+8|0;r=u;n=e+4|0;p=c[e+8>>2]|0;q=r+4|0;k=c[n>>2]|0;m=0;while(1){if((m|0)>=(p|0)){o=5;break}w=k;v=c[w+4>>2]|0;c[r>>2]=(c[w>>2]|0)+a;c[q>>2]=v+b;c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];if(PL(f,s)|0){k=0;break}k=k+8|0;m=m+1|0}if((o|0)==5){e=c[e+12>>2]|0;y=+h[j+(e<<5)>>3];x=+h[j+(e<<5)+8>>3];c[g>>2]=(S(i,a)|0)-~~(y+(y>=0.0?.5:-.5));e=g+4|0;c[e>>2]=(S(i,b)|0)-~~(x+(x>=0.0?.5:-.5));k=c[n>>2]|0;m=0;while(1){if((m|0)>=(p|0))break;v=k;w=c[v+4>>2]|0;c[r>>2]=(c[v>>2]|0)+a;c[q>>2]=w+b;c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];ML(f,s);k=k+8|0;m=m+1|0}if((d[195234]|0)>1){k=c[15715]|0;v=c[g>>2]|0;w=c[e>>2]|0;c[t>>2]=p;c[t+4>>2]=a;c[t+8>>2]=b;c[t+12>>2]=v;c[t+16>>2]=w;z4(k,99617,t)|0;k=1}else k=1}l=u;return k|0}function _G(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=(c[b+4>>2]|0)-(c[d+4>>2]|0)|0;c[a>>2]=(c[b>>2]|0)-(c[d>>2]|0);c[a+4>>2]=e;return}function $G(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=(c[d+4>>2]|0)+(c[b+4>>2]|0)|0;c[a>>2]=(c[d>>2]|0)+(c[b>>2]|0);c[a+4>>2]=e;return}function aH(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0.0,k=0.0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0,x=0,y=0,z=0,A=0;A=l;l=l+112|0;x=A+96|0;w=A+80|0;q=A+48|0;r=A+32|0;y=A+16|0;z=A;n=A+64|0;h[y>>3]=+(c[b>>2]|0);s=y+8|0;h[s>>3]=+(c[b+4>>2]|0);v=+(g|0);a:do if((i|0)!=0?(t=a+16|0,m=c[(c[t>>2]|0)+8>>2]|0,(m|0)!=0):0){p=+(e|0);o=+(f|0);i=z+8|0;e=0;while(1){if((e|0)>=(c[m+4>>2]|0))break a;n=c[m>>2]|0;b=c[n+(e*48|0)>>2]|0;g=c[n+(e*48|0)+4>>2]|0;f=c[n+(e*48|0)+8>>2]|0;a=c[n+(e*48|0)+12>>2]|0;m=n+(e*48|0)+16|0;c[q>>2]=c[m>>2];c[q+4>>2]=c[m+4>>2];c[q+8>>2]=c[m+8>>2];c[q+12>>2]=c[m+12>>2];n=n+(e*48|0)+32|0;c[r>>2]=c[n>>2];c[r+4>>2]=c[n+4>>2];c[r+8>>2]=c[n+8>>2];c[r+12>>2]=c[n+12>>2];if(!f){c[y>>2]=c[b>>2];c[y+4>>2]=c[b+4>>2];c[y+8>>2]=c[b+8>>2];c[y+12>>2]=c[b+12>>2];m=b+16|0;c[z>>2]=c[m>>2];c[z+4>>2]=c[m+4>>2];c[z+8>>2]=c[m+8>>2];c[z+12>>2]=c[m+12>>2];m=2}else{c[y>>2]=c[q>>2];c[y+4>>2]=c[q+4>>2];c[y+8>>2]=c[q+8>>2];c[y+12>>2]=c[q+12>>2];c[z>>2]=c[b>>2];c[z+4>>2]=c[b+4>>2];c[z+8>>2]=c[b+8>>2];c[z+12>>2]=c[b+12>>2];m=1}j=p+ +h[y>>3];h[y>>3]=j;k=o+ +h[s>>3];h[s>>3]=k;if(!(j>=0.0))j=(j+1.0)/v+-1.0;else j=j/v;h[y>>3]=j;if(!(k>=0.0))j=(k+1.0)/v+-1.0;else j=k/v;h[s>>3]=j;j=p+ +h[z>>3];h[z>>3]=j;k=o+ +h[i>>3];h[i>>3]=k;if(!(j>=0.0))j=(j+1.0)/v+-1.0;else j=j/v;h[z>>3]=j;if(!(k>=0.0))j=(k+1.0)/v+-1.0;else j=k/v;h[i>>3]=j;c[w>>2]=c[y>>2];c[w+4>>2]=c[y+4>>2];c[w+8>>2]=c[y+8>>2];c[w+12>>2]=c[y+12>>2];c[x>>2]=c[z>>2];c[x+4>>2]=c[z+4>>2];c[x+8>>2]=c[z+8>>2];c[x+12>>2]=c[z+12>>2];NG(w,x,d);while(1){if((m|0)>=(g|0))break;c[y>>2]=c[z>>2];c[y+4>>2]=c[z+4>>2];c[y+8>>2]=c[z+8>>2];c[y+12>>2]=c[z+12>>2];f=b+(m<<4)|0;c[z>>2]=c[f>>2];c[z+4>>2]=c[f+4>>2];c[z+8>>2]=c[f+8>>2];c[z+12>>2]=c[f+12>>2];j=p+ +h[z>>3];h[z>>3]=j;k=o+ +h[i>>3];h[i>>3]=k;if(!(j>=0.0))j=(j+1.0)/v+-1.0;else j=j/v;h[z>>3]=j;if(!(k>=0.0))j=(k+1.0)/v+-1.0;else j=k/v;h[i>>3]=j;c[w>>2]=c[y>>2];c[w+4>>2]=c[y+4>>2];c[w+8>>2]=c[y+8>>2];c[w+12>>2]=c[y+12>>2];c[x>>2]=c[z>>2];c[x+4>>2]=c[z+4>>2];c[x+8>>2]=c[z+8>>2];c[x+12>>2]=c[z+12>>2];NG(w,x,d);m=m+1|0}if(a|0){c[y>>2]=c[z>>2];c[y+4>>2]=c[z+4>>2];c[y+8>>2]=c[z+8>>2];c[y+12>>2]=c[z+12>>2];c[z>>2]=c[r>>2];c[z+4>>2]=c[r+4>>2];c[z+8>>2]=c[r+8>>2];c[z+12>>2]=c[r+12>>2];j=p+ +h[z>>3];h[z>>3]=j;k=o+ +h[i>>3];h[i>>3]=k;if(!(j>=0.0))j=(j+1.0)/v+-1.0;else j=j/v;h[z>>3]=j;if(!(k>=0.0))j=(k+1.0)/v+-1.0;else j=k/v;h[i>>3]=j;c[w>>2]=c[y>>2];c[w+4>>2]=c[y+4>>2];c[w+8>>2]=c[y+8>>2];c[w+12>>2]=c[y+12>>2];c[x>>2]=c[z>>2];c[x+4>>2]=c[z+4>>2];c[x+8>>2]=c[z+8>>2];c[x+12>>2]=c[z+12>>2];NG(w,x,d)}e=e+1|0;m=c[(c[t>>2]|0)+8>>2]|0}}else u=4;while(0);if((u|0)==4){hP(n,c[((c[a>>2]&3|0)==2?a:a+-48|0)+40>>2]|0);c[z>>2]=c[n>>2];c[z+4>>2]=c[n+4>>2];c[z+8>>2]=c[n+8>>2];c[z+12>>2]=c[n+12>>2];j=+(e|0)+ +h[z>>3];h[z>>3]=j;m=z+8|0;k=+(f|0)+ +h[m>>3];h[m>>3]=k;if(!(j>=0.0))j=(j+1.0)/v+-1.0;else j=j/v;h[z>>3]=j;if(!(k>=0.0))j=(k+1.0)/v+-1.0;else j=k/v;h[m>>3]=j;c[w>>2]=c[y>>2];c[w+4>>2]=c[y+4>>2];c[w+8>>2]=c[y+8>>2];c[w+12>>2]=c[y+12>>2];c[x>>2]=c[z>>2];c[x+4>>2]=c[z+4>>2];c[x+8>>2]=c[z+8>>2];c[x+12>>2]=c[z+12>>2];NG(w,x,d)}l=A;return}function bH(a,b,d){a=a|0;b=b|0;d=d|0;a:do if((a|0)<1)a=0;else switch(c[d+16>>2]|0){case 4:{a=QG(a,b,d)|0;break a}case 3:{a=cH(a,b,d)|0;break a}default:{a=0;break a}}while(0);return a|0}function cH(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;p=l;l=l+80|0;i=p+64|0;h=p+24|0;o=p+8|0;g=p;j=p+56|0;m=f+8|0;n=TG(b,e,c[m>>2]|0)|0;if(a[195234]|0){k=c[15715]|0;c[g>>2]=n;z4(k,99586,g)|0}a:do if((n|0)>=1){c[j+4>>2]=0;c[j>>2]=0;k=HK(b<<4)|0;f=0;while(1){if((f|0)>=(b|0))break;c[k+(f<<4)+12>>2]=f;q=e+(f<<5)|0;g=c[m>>2]|0;c[h>>2]=c[q>>2];c[h+4>>2]=c[q+4>>2];c[h+8>>2]=c[q+8>>2];c[h+12>>2]=c[q+12>>2];c[h+16>>2]=c[q+16>>2];c[h+20>>2]=c[q+20>>2];c[h+24>>2]=c[q+24>>2];c[h+28>>2]=c[q+28>>2];c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];UG(h,k+(f<<4)|0,n,g,i,195341);f=f+1|0}h=HK(b<<2)|0;f=0;while(1){if((f|0)>=(b|0))break;c[h+(f<<2)>>2]=k+(f<<4);f=f+1|0}k3(h,b,4,89);i=IL()|0;f=HK(b<<3)|0;g=0;while(1){if((g|0)>=(b|0))break;q=c[h+(g<<2)>>2]|0;YG(g,q,i,f+(c[q+12>>2]<<3)|0,n,c[m>>2]|0,e);g=g+1|0}l6(h);g=0;while(1){if((g|0)>=(b|0))break;l6(c[k+(g<<4)+4>>2]|0);g=g+1|0}l6(k);LL(i);if((d[195234]|0)>1){h=c[15715]|0;g=0;while(1){if((g|0)>=(b|0))break a;e=c[f+(g<<3)>>2]|0;q=c[f+(g<<3)+4>>2]|0;c[o>>2]=g;c[o+4>>2]=e;c[o+8>>2]=q;z4(h,99602,o)|0;g=g+1|0}}}else f=0;while(0);l=p;return f|0}function dH(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0;a:do if((a|0)<1)f=0-a|0;else{s=(e|0)==0;q=(f|0)==0;j=0;while(1){if((j|0)==(a|0)){f=0;break a}r=c[b+(j<<2)>>2]|0;g=s?r:e;k=c[d+(j<<3)>>2]|0;l=c[d+(j<<3)+4>>2]|0;m=+(k|0);n=m/72.0;o=+(l|0);p=o/72.0;i=gC(r)|0;while(1){if(!i)break;f=c[i+16>>2]|0;t=c[f+132>>2]|0;h[t>>3]=n+ +h[t>>3];t=t+8|0;h[t>>3]=p+ +h[t>>3];t=f+16|0;h[t>>3]=m+ +h[t>>3];t=f+24|0;h[t>>3]=o+ +h[t>>3];f=c[f+108>>2]|0;if(f|0){t=f+56|0;h[t>>3]=m+ +h[t>>3];t=f+64|0;h[t>>3]=o+ +h[t>>3]}b:do if(!q){f=UA(g,i)|0;while(1){if(!f)break b;eH(f,k,l);f=WA(g,f)|0}}while(0);i=hC(r,i)|0}fH(r,k,l);j=j+1|0}}while(0);return f|0}function eH(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0.0,m=0.0,n=0;e=c[a+16>>2]|0;a=c[e+96>>2]|0;m=+(b|0);l=+(d|0);if(a|0){k=a+56|0;h[k>>3]=m+ +h[k>>3];k=a+64|0;h[k>>3]=l+ +h[k>>3]}a=c[e+108>>2]|0;if(a|0){k=a+56|0;h[k>>3]=m+ +h[k>>3];k=a+64|0;h[k>>3]=l+ +h[k>>3]}a=c[e+100>>2]|0;if(a|0){k=a+56|0;h[k>>3]=m+ +h[k>>3];k=a+64|0;h[k>>3]=l+ +h[k>>3]}a=c[e+104>>2]|0;if(a|0){k=a+56|0;h[k>>3]=m+ +h[k>>3];k=a+64|0;h[k>>3]=l+ +h[k>>3]}j=c[e+8>>2]|0;a:do if(j|0){d=c[j+4>>2]|0;a=0;while(1){if((a|0)>=(d|0))break a;k=c[j>>2]|0;e=c[k+(a*48|0)>>2]|0;f=c[k+(a*48|0)+4>>2]|0;g=c[k+(a*48|0)+8>>2]|0;i=c[k+(a*48|0)+12>>2]|0;b=0;while(1){if((b|0)>=(f|0))break;n=e+(b<<4)|0;h[n>>3]=m+ +h[n>>3];n=e+(b<<4)+8|0;h[n>>3]=l+ +h[n>>3];b=b+1|0}if(g|0){n=k+(a*48|0)+16|0;h[n>>3]=m+ +h[n>>3];n=k+(a*48|0)+24|0;h[n>>3]=l+ +h[n>>3]}if(i|0){n=k+(a*48|0)+32|0;h[n>>3]=m+ +h[n>>3];n=k+(a*48|0)+40|0;h[n>>3]=l+ +h[n>>3]}a=a+1|0}}while(0);return}function fH(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0,k=0.0,l=0.0,m=0,n=0.0,o=0;j=b+16|0;b=c[j>>2]|0;o=b+16|0;m=b+24|0;f=b+32|0;b=b+40|0;g=+(d|0);l=g+ +h[f>>3];i=+(e|0);n=i+ +h[m>>3];k=i+ +h[b>>3];h[o>>3]=g+ +h[o>>3];h[m>>3]=n;h[f>>3]=l;h[b>>3]=k;b=c[j>>2]|0;f=c[b+12>>2]|0;if((f|0)!=0?(a[f+81>>0]|0)!=0:0){o=f+56|0;h[o>>3]=g+ +h[o>>3];f=f+64|0;h[f>>3]=i+ +h[f>>3];f=1}else f=1;while(1){if((f|0)>(c[b+180>>2]|0))break;fH(c[(c[b+184>>2]|0)+(f<<2)>>2]|0,d,e);f=f+1|0;b=c[j>>2]|0}return}function gH(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=OG(a,b,d,e)|0;if(!f)a=1;else{a=dH(a,b,f,d,c[e+12>>2]|0)|0;l6(f)}return a|0}function hH(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;p=l;l=l+32|0;o=p;n=gH(a,b,d,e)|0;if(!n){zP(d);m=(c[d+16>>2]|0)+16|0;c[o>>2]=c[m>>2];c[o+4>>2]=c[m+4>>2];c[o+8>>2]=c[m+8>>2];c[o+12>>2]=c[m+12>>2];c[o+16>>2]=c[m+16>>2];c[o+20>>2]=c[m+20>>2];c[o+24>>2]=c[m+24>>2];c[o+28>>2]=c[m+28>>2];f=o+8|0;g=o+16|0;i=o+24|0;e=0;while(1){if((e|0)>=(a|0))break;k=c[(c[b+(e<<2)>>2]|0)+16>>2]|0;j=c[k+180>>2]|0;k=k+184|0;d=1;while(1){if((d|0)>(j|0))break;r=c[(c[(c[k>>2]|0)+(d<<2)>>2]|0)+16>>2]|0;q=r+16|0;h[o>>3]=+h[(+h[o>>3]<+h[q>>3]?o:q)>>3];h[f>>3]=+h[(+h[f>>3]<+h[r+24>>3]?o:q)+8>>3];h[g>>3]=+h[(+h[g>>3]>+h[r+32>>3]?o:q)+16>>3];h[i>>3]=+h[(+h[i>>3]>+h[r+40>>3]?o:q)+24>>3];d=d+1|0}e=e+1|0}c[m>>2]=c[o>>2];c[m+4>>2]=c[o+4>>2];c[m+8>>2]=c[o+8>>2];c[m+12>>2]=c[o+12>>2];c[m+16>>2]=c[o+16>>2];c[m+20>>2]=c[o+20>>2];c[m+24>>2]=c[o+24>>2];c[m+28>>2]=c[o+28>>2]}l=p;return n|0}function iH(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;h=l;l=l+16|0;g=h;if(!f)Aa(99835,99841,1400,99848);e=jH(b,e,e)|0;c[f+8>>2]=e;if(a[195234]|0){i=c[15715]|0;c[g>>2]=e;z4(i,99860,g)|0}c[f+12>>2]=0;c[f+20>>2]=0;kH(b,d,f)|0;l=h;return c[f+16>>2]|0}function jH(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;h=i;f=i+4|0;g=NA(b,99990)|0;a:do if(g){c[h>>2]=f;h=(q4(g,137696,h)|0)==1;b=c[f>>2]|0;if(h&(b|0)>-1)d=b;else{switch(a[g>>0]|0){case 84:case 116:break;default:break a}d=e}}while(0);l=i;return d|0}function kH(a,b,c){a=a|0;b=b|0;c=c|0;return lH(NA(a,99873)|0,b,c)|0}function lH(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0;u=l;l=l+64|0;r=u+40|0;q=u+32|0;t=u+24|0;s=u+16|0;m=u+8|0;k=u;i=u+48|0;j=u+44|0;if(!e)Aa(99835,99841,1292,99882);o=e+28|0;c[o>>2]=0;p=e+16|0;c[p>>2]=d;n=e+4|0;c[n>>2]=0;c[e+24>>2]=0;a:do if(b|0?(f=a[b>>0]|0,f<<24>>24):0)switch(f<<24>>24|0){case 97:{d=b+5|0;if(!(h2(b,99900,5)|0)){c[p>>2]=4;m=mH(d,e)|0;c[k>>2]=j;m=(q4(m,137696,k)|0)>0;d=c[j>>2]|0;if(!(m&(d|0)>0))break a;c[n>>2]=d;break a}else{if(h2(b,99906,6)|0)break a;c[p>>2]=5;c[m>>2]=i;m=(q4(d,99913,m)|0)>0;v=+g[i>>2];g[e>>2]=m&v>0.0?v:1.0;break a}}case 99:{if(f<<24>>24!=99)break a;if(f2(b,108307)|0)break a;c[p>>2]=1;break a}case 103:{if(f<<24>>24!=103)break a;if(f2(b,111795)|0)break a;c[p>>2]=3;break a}case 110:{if(f<<24>>24!=110)break a;if(f2(b,111782)|0)break a;c[p>>2]=2;break a}default:break a}while(0);if(a[195234]|0){d=c[15715]|0;_3(99916,11,1,d)|0;c[s>>2]=nH(c[p>>2]|0)|0;z4(d,99928,s)|0;if((c[p>>2]|0)==5){h[t>>3]=+g[e>>2];z4(d,99941,t)|0}c[q>>2]=c[n>>2];z4(d,99954,q)|0;c[r>>2]=c[o>>2];z4(d,99967,r)|0}l=u;return c[p>>2]|0}function mH(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;a:do if((a[b>>0]|0)==95){f=d+28|0;e=1;while(1){b=b+1|0;b:while(1){if(!e)break a;d=a[b>>0]|0;if(!(d<<24>>24))break a;switch(d<<24>>24|0){case 99:{g=10;break b}case 105:{g=9;break b}case 117:{g=11;break b}case 116:{g=12;break b}case 98:{d=32;break b}case 108:{g=7;break b}case 114:{g=8;break b}default:e=0}}if((g|0)==7){g=0;d=4}else if((g|0)==8){g=0;d=8}else if((g|0)==9){g=0;d=64}else if((g|0)==10){g=0;d=1}else if((g|0)==11){g=0;d=2}else if((g|0)==12){g=0;d=16}c[f>>2]=c[f>>2]|d}}while(0);return b|0}function nH(a){a=a|0;switch(a|0){case 1:{a=108307;break}case 2:{a=111782;break}case 3:{a=111795;break}case 4:{a=99900;break}case 5:{a=99906;break}default:a=99980}return a|0}function oH(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+96|0;k=n;m=n+80|0;do if(a){if(!e){e=m6(1,20)|0;c[e+4>>2]=d>>>0>80?d:80}d=c[e>>2]|0;j=c[e+4>>2]|0;if(!d){h=100;d=a;i=m6(100,j)|0}else{h=d+100|0;i=n6(c[e+8>>2]|0,S(h,j)|0)|0;u6(i+(S(j,d)|0)|0,0,j*100|0)|0;d=a}while(1){d=pH(k,d,b,m)|0;if(!d)break;a=c[e>>2]|0;f=h<<1;g=S(h,j)|0;if((a|0)==(h|0)){i=n6(i,S(f,j)|0)|0;u6(i+g|0,0,g|0)|0;a=c[e>>2]|0}else f=h;a=i+(S(a,j)|0)|0;g=k;h=a+80|0;do{c[a>>2]=c[g>>2];a=a+4|0;g=g+4|0}while((a|0)<(h|0));c[e>>2]=(c[e>>2]|0)+1;h=f}if(c[m>>2]|0){m=e+16|0;c[m>>2]=c[m>>2]|1}d=c[e>>2]|0;if(!d){l6(i);l6(e);e=0;break}else{c[e+8>>2]=n6(i,S(d,j)|0)|0;break}}while(0);l=n;return e|0}function pH(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+80|0;n=r+64|0;g=r;c[f>>2]=0;do{h=a[d>>0]|0;d=d+1|0}while((X1(h)|0)!=0);p=(e|0)!=0;j=e+4|0;k=g+8|0;q=b+72|0;m=e+8|0;o=e+40|0;i=b+8|0;a:do switch(h|0){case 69:{c[b>>2]=0;d=qH(d,i)|0;if(!d){c[f>>2]=1;d=0;break a}if(p)c[q>>2]=c[e>>2];break}case 101:{c[b>>2]=1;d=qH(d,i)|0;if(!d){c[f>>2]=1;d=0;break a}if(p)c[q>>2]=c[e>>2];break}case 80:{c[b>>2]=2;d=rH(d,i)|0;if(!d){c[f>>2]=1;d=0;break a}if(p)c[q>>2]=c[j>>2];break}case 112:{c[b>>2]=3;d=rH(d,i)|0;if(!d){c[f>>2]=1;d=0;break a}if(p)c[q>>2]=c[j>>2];break}case 98:{c[b>>2]=4;d=rH(d,i)|0;if(!d){c[f>>2]=1;d=0;break a}if(p)c[q>>2]=c[m>>2];break}case 66:{c[b>>2]=5;d=rH(d,i)|0;if(!d){c[f>>2]=1;d=0;break a}if(p)c[q>>2]=c[m>>2];break}case 99:{d=sH(d,n)|0;if(!d){c[f>>2]=1;d=0;break a}m=tH(c[n>>2]|0,g)|0;c[n>>2]=m;if(!m){c[f>>2]=1;d=0;break a}if(!(c[g>>2]|0)){c[b>>2]=9;c[i>>2]=c[k>>2];if(!p)break a;c[q>>2]=c[e+24>>2];break a}else{c[b>>2]=14;h=i+64|0;do{c[i>>2]=c[g>>2];i=i+4|0;g=g+4|0}while((i|0)<(h|0));if(!p)break a;c[q>>2]=c[o>>2];break a}}case 67:{d=sH(d,n)|0;if(!d){c[f>>2]=1;d=0;break a}m=tH(c[n>>2]|0,g)|0;c[n>>2]=m;if(!m){c[f>>2]=1;d=0;break a}if(!(c[g>>2]|0)){c[b>>2]=8;c[i>>2]=c[k>>2];if(!p)break a;c[q>>2]=c[e+20>>2];break a}else{c[b>>2]=13;h=i+64|0;do{c[i>>2]=c[g>>2];i=i+4|0;g=g+4|0}while((i|0)<(h|0));if(!p)break a;c[q>>2]=c[o>>2];break a}}case 76:{c[b>>2]=6;d=rH(d,i)|0;if(!d){c[f>>2]=1;d=0;break a}if(p)c[q>>2]=c[e+12>>2];break}case 84:{c[b>>2]=7;d=uH(d,i)|0;if(!d){c[f>>2]=1;d=0;break a}d=uH(d,b+16|0)|0;if(!d){c[f>>2]=1;d=0;break a}d=vH(d,b+24|0)|0;if(!d){c[f>>2]=1;d=0;break a}d=uH(d,b+32|0)|0;if(!d){c[f>>2]=1;d=0;break a}d=sH(d,b+40|0)|0;if(!d){c[f>>2]=1;d=0;break a}if(p)c[q>>2]=c[e+16>>2];break}case 70:{c[b>>2]=10;d=uH(d,i)|0;if(!d){c[f>>2]=1;d=0;break a}d=sH(d,b+16|0)|0;if(!d){c[f>>2]=1;d=0;break a}if(p)c[q>>2]=c[e+28>>2];break}case 83:{c[b>>2]=11;d=sH(d,i)|0;if(!d){c[f>>2]=1;d=0;break a}if(p)c[q>>2]=c[e+32>>2];break}case 73:{c[b>>2]=12;d=qH(d,i)|0;if(!d){c[f>>2]=1;d=0;break a}d=sH(d,b+40|0)|0;if(!d){c[f>>2]=1;d=0;break a}if(p)c[q>>2]=c[e+36>>2];break}case 116:{c[b>>2]=15;d=wH(d,i)|0;if(!d){c[f>>2]=1;d=0;break a}if(p)c[q>>2]=c[e+44>>2];break}case 0:{d=0;break}default:{c[f>>2]=1;d=0}}while(0);l=r;return d|0}function qH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0;i=l;l=l+16|0;e=i;h[b>>3]=+b6(a,e);f=c[e>>2]|0;if(((f|0)!=(a|0)?(h[b+8>>3]=+b6(f,e),g=c[e>>2]|0,(f|0)!=(g|0)):0)?(h[b+16>>3]=+b6(g,e),d=c[e>>2]|0,(g|0)!=(d|0)):0){h[b+24>>3]=+b6(d,e);a=c[e>>2]|0;a=(d|0)==(a|0)?0:a}else a=0;l=i;return a|0}function rH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0;k=l;l=l+16|0;j=k+4|0;g=k;a=xH(a,j)|0;do if(a){d=c[j>>2]|0;i=m6(d,24)|0;c[b>>2]=d;e=i;f=0;while(1){if((f|0)>=(d|0)){d=9;break}h[e>>3]=+b6(a,g);d=c[g>>2]|0;if((a|0)==(d|0)){d=5;break}h[e+8>>3]=+b6(d,g);a=c[g>>2]|0;if((d|0)==(a|0)){d=7;break}h[e+16>>3]=0.0;e=e+24|0;d=c[b>>2]|0;f=f+1|0}if((d|0)==5){c[j>>2]=f;l6(i);a=0;break}else if((d|0)==7){c[j>>2]=f;l6(i);a=0;break}else if((d|0)==9){c[j>>2]=f;c[b+4>>2]=i;break}}else a=0;while(0);l=k;return a|0}function sH(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;i=j;b=xH(b,i)|0;f=c[i>>2]|0;do if(!((b|0)==0|(f|0)<1)){do{h=a[b>>0]|0;e=h<<24>>24==0;b=b+1|0}while(h<<24>>24!=45&(e^1));if(!e){h=m6(f+1|0,1)|0;g=h;e=f;while(1){if((e|0)<=0){e=9;break}e=a[b>>0]|0;if(!(e<<24>>24)){e=8;break}a[g>>0]=e;e=(c[i>>2]|0)+-1|0;c[i>>2]=e;g=g+1|0;b=b+1|0}if((e|0)==8){l6(h);b=0;break}else if((e|0)==9){a[g>>0]=0;c[d>>2]=h;break}}else b=0}else b=0;while(0);l=j;return b|0}function tH(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=a[b>>0]|0;f=d+8|0;g=b+1|0;switch(e|0){case 91:{b=yH(g,d)|0;break}case 40:{b=zH(g,d)|0;break}case 47:case 35:{c[d>>2]=0;c[f>>2]=b;break}default:if(!(O2(e)|0))b=0;else{c[d>>2]=0;c[f>>2]=b}}return b|0}function uH(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0;f=l;l=l+16|0;d=f;e=+b6(a,d);d=c[d>>2]|0;if((d|0)==(a|0))d=0;else h[b>>3]=e;l=f;return d|0}function vH(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;a=xH(a,e)|0;e=c[e>>2]|0;c[b>>2]=(e|0)<0?0:e|0?2:1;l=d;return a|0}function wH(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[b>>2]=_1(a,e,10)|0;b=c[e>>2]|0;l=d;return ((b|0)==(a|0)?0:b)|0}function xH(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[b>>2]=$1(a,e,10)|0;b=c[e>>2]|0;l=d;return ((b|0)==(a|0)?0:b)|0}function yH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;m=o;c[b>>2]=1;n=b+8|0;i=uH(a,n)|0;do if(((((i|0)!=0?(j=uH(i,b+16|0)|0,(j|0)!=0):0)?(e=uH(j,b+24|0)|0,(e|0)!=0):0)?(f=uH(e,b+32|0)|0,(f|0)!=0):0)?(k=b+40|0,d=xH(f,k)|0,(d|0)!=0):0){b=c[k>>2]|0;f=m6(b,8)|0;e=0;while(1){if((e|0)>=(b|0)){d=13;break}d=uH(d,m)|0;if(!d){d=9;break}g[f+(e<<3)>>2]=+h[m>>3];d=sH(d,f+(e<<3)+4|0)|0;if(!d){d=12;break}e=e+1|0;b=c[k>>2]|0}if((d|0)==9){l6(f);a=0;break}else if((d|0)==12){l6(f);a=0;break}else if((d|0)==13){c[n+36>>2]=f;break}}else a=0;while(0);l=o;return a|0}function zH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+16|0;n=p;c[b>>2]=2;k=uH(a,b+8|0)|0;do if(((((((k|0)!=0?(m=uH(k,b+16|0)|0,(m|0)!=0):0)?(e=uH(m,b+24|0)|0,(e|0)!=0):0)?(f=uH(e,b+32|0)|0,(f|0)!=0):0)?(i=uH(f,b+40|0)|0,(i|0)!=0):0)?(j=uH(i,b+48|0)|0,(j|0)!=0):0)?(o=b+56|0,d=xH(j,o)|0,(d|0)!=0):0){e=c[o>>2]|0;i=m6(e,8)|0;f=0;while(1){if((f|0)>=(e|0)){d=15;break}d=uH(d,n)|0;if(!d){d=11;break}g[i+(f<<3)>>2]=+h[n>>3];d=sH(d,i+(f<<3)+4|0)|0;if(!d){d=14;break}f=f+1|0;e=c[o>>2]|0}if((d|0)==11){l6(i);a=0;break}else if((d|0)==14){l6(i);a=0;break}else if((d|0)==15){c[b+60>>2]=i;break}}else a=0;while(0);l=p;return a|0}function AH(a,b,c){a=a|0;b=b|0;c=c|0;return oH(a,b,c,0)|0}function BH(a){a=a|0;return AH(a,0,0)|0}function CH(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;e=c[a+12>>2]|0;if(a|0){f=c[a+8>>2]|0;g=a+4|0;h=(e|0)==0;b=0;while(1){if((b|0)>=(c[a>>2]|0))break;d=f+(S(c[g>>2]|0,b)|0)|0;if(!h)db[e&127](d);DH(d);b=b+1|0}l6(f);l6(a)}return}function DH(a){a=a|0;var b=0,d=0;b=a+8|0;d=b+4|0;switch(c[a>>2]|0){case 3:case 2:{l6(c[d>>2]|0);break}case 5:case 4:{l6(c[d>>2]|0);break}case 6:{l6(c[d>>2]|0);break}case 7:{l6(c[a+40>>2]|0);break}case 9:case 8:{l6(c[b>>2]|0);break}case 14:case 13:{EH(b);break}case 10:{l6(c[a+16>>2]|0);break}case 11:{l6(c[b>>2]|0);break}case 12:{l6(c[a+40>>2]|0);break}default:{}}return}function EH(a){a=a|0;var b=0,d=0,e=0;switch(c[a>>2]|0){case 1:{e=a+40|0;b=a+8+36|0;a=0;while(1){d=c[b>>2]|0;if((a|0)>=(c[e>>2]|0))break;l6(c[d+(a<<3)+4>>2]|0);a=a+1|0}l6(d);break}case 2:{e=a+56|0;d=a+60|0;a=0;while(1){b=c[d>>2]|0;if((a|0)>=(c[e>>2]|0))break;l6(c[b+(a<<3)+4>>2]|0);a=a+1|0}l6(b);break}default:{}}return}function FH(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;k=o+4|0;n=o;c[d>>2]=0;c[e>>2]=(uB(uC(b)|0)|0)!=0&1;f=c[47253]|0;a:do if(f|0?(h=OA(b,f)|0,i=a[h>>0]|0,i<<24>>24):0){f=20432;while(1){g=c[f>>2]|0;if(!g)break a;if(i<<24>>24==(a[g>>0]|0)?(f2(h,g)|0)==0:0)break;f=f+12|0}c[d>>2]=c[f+4>>2];c[e>>2]=c[f+8>>2]}while(0);f=c[47264]|0;if((f|0?(c[e>>2]|0)==1:0)?(j=OA(b,f)|0,a[j>>0]|0):0)GH(j,e);f=c[47265]|0;if((f|0?(c[d>>2]|0)==1:0)?(m=OA(b,f)|0,a[m>>0]|0):0)GH(m,d);if(a[(c[b+16>>2]|0)+153>>0]|0){j=b+-48|0;i=uC(c[((c[b>>2]&3|0)==2?b:j)+40>>2]|0)|0;m=c[b>>2]&3;FH(fB(i,c[((m|0)==2?b:j)+40>>2]|0,c[((m|0)==3?b:b+48|0)+40>>2]|0,0,0)|0,k,n);c[e>>2]=c[k>>2]|c[e>>2];c[d>>2]=c[n>>2]|c[d>>2]}l=o;return}function GH(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;m=o;k=o+4|0;j=0;e=0;a:while(1){c[d>>2]=e;f=(j|0)<4;g=(j|0)==3;h=(j|0)==0;while(1){if(!(f&(a[b>>0]|0)!=0))break a;c[k>>2]=0;i=HH(b,k)|0;e=c[k>>2]|0;if(!e){n=5;break a}b=(e|0)==8;if(!(g&b)){if(!(h&b)){b=e;break}if(a[i>>0]|0){b=8;break}}c[k>>2]=0;b=i}e=c[d>>2]|b<<(j<<3);j=j+1|0;b=i}if((n|0)==5){c[m>>2]=b;dA(0,99995,m)|0}l=o;return}function HH(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=l;l=l+16|0;e=f;c[e>>2]=0;d=IH(a,20492,e)|0;if((d|0)==(a|0)){while(1){d=IH(a,20508,e)|0;if((a|0)==(d|0))break;else a=d}d=IH(a,20556,e)|0}a=c[e>>2]|0;if((a|0)!=0&(a&15|0)==0){a=a|1;c[e>>2]=a}c[b>>2]=c[b>>2]|a;l=f;return d|0}function IH(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;while(1){e=c[b>>2]|0;if(!e)break;f=D3(e)|0;if(!(h2(a,e,f)|0)){g=4;break}b=b+8|0}if((g|0)==4){c[d>>2]=c[d>>2]|c[b+4>>2];a=a+f|0}return a|0}function JH(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0,g=0,i=0;g=0;d=0.0;while(1){if((g|0)==4)break;f=b>>(g<<3)&15;e=1400;while(1){if(!(c[e+16>>2]|0))break;if((f|0)==(c[e>>2]|0)){i=6;break}e=e+24|0}if((i|0)==6){i=0;d=d+ +h[e+8>>3]}g=g+1|0}return +(d*10.0*+YO(a,c[47257]|0,1.0,0.0))}function KH(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var i=0.0,j=0,k=0.0,m=0.0,n=0,o=0.0,p=0,q=0,r=0,s=0;s=l;l=l+96|0;n=s+80|0;r=s;m=f>4.0?f*.25*.35:.35;k=+h[d+8>>3];o=m*k;i=+h[d>>3];m=m*i;f=+h[b>>3];i=i+f;h[n>>3]=i;e=+h[b+8>>3];k=k+e;h[n+8>>3]=k;d=r+64|0;p=r+32|0;q=r+16|0;j=r+24|0;if(!(g&32)){c[d>>2]=c[n>>2];c[d+4>>2]=c[n+4>>2];c[d+8>>2]=c[n+8>>2];c[d+12>>2]=c[n+12>>2];c[r>>2]=c[n>>2];c[r+4>>2]=c[n+4>>2];c[r+8>>2]=c[n+8>>2];c[r+12>>2]=c[n+12>>2];h[q>>3]=o+i;h[j>>3]=k-m;c[p>>2]=c[b>>2];c[p+4>>2]=c[b+4>>2];c[p+8>>2]=c[b+8>>2];c[p+12>>2]=c[b+12>>2];f=i;e=k}else{c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];c[r>>2]=c[b>>2];c[r+4>>2]=c[b+4>>2];c[r+8>>2]=c[b+8>>2];c[r+12>>2]=c[b+12>>2];h[q>>3]=o+f;h[j>>3]=e-m;c[p>>2]=c[n>>2];c[p+4>>2]=c[n+4>>2];c[p+8>>2]=c[n+8>>2];c[p+12>>2]=c[n+12>>2]}h[r+48>>3]=f-o;h[r+56>>3]=m+e;d=g>>>4&1^1;do if(!(g&64))if(!(g&128)){lS(a,q,3,d);break}else{lS(a,p,3,d);break}else lS(a,r,3,d);while(0);l=s;return}function LH(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0.0,C=0,D=0,E=0;D=l;l=l+160|0;A=D+144|0;C=D;u=e*4.0;E=(g&32|0)!=0;z=E^1;u=!(u1.0)|z?0.0:(f+-1.0)*.05/e;y=+h[d+8>>3];v=-y;B=u*v;x=+h[d>>3];u=u*x;v=w*v;w=w*x;f=+h[b>>3];s=x+f;h[A>>3]=s;t=+h[b+8>>3];e=y+t;h[A+8>>3]=e;x=f+x*.5;y=y*.5+t;d=C+128|0;i=x-v;j=y-w;z=C+48|0;k=C+64|0;m=C+40|0;n=C+32|0;o=C+24|0;p=C+16|0;q=C+80|0;r=C+56|0;if(E){c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];c[C>>2]=c[b>>2];c[C+4>>2]=c[b+4>>2];c[C+8>>2]=c[b+8>>2];c[C+12>>2]=c[b+12>>2];h[p>>3]=s-B;h[o>>3]=e-u;h[n>>3]=i;h[m>>3]=j;h[z>>3]=s-v;h[r>>3]=e-w;c[k>>2]=c[A>>2];c[k+4>>2]=c[A+4>>2];c[k+8>>2]=c[A+8>>2];c[k+12>>2]=c[A+12>>2];h[q>>3]=v+s;i=w+e;f=s}else{c[d>>2]=c[A>>2];c[d+4>>2]=c[A+4>>2];c[d+8>>2]=c[A+8>>2];c[d+12>>2]=c[A+12>>2];c[C>>2]=c[A>>2];c[C+4>>2]=c[A+4>>2];c[C+8>>2]=c[A+8>>2];c[C+12>>2]=c[A+12>>2];h[p>>3]=f-B;h[o>>3]=t-u;h[n>>3]=i;h[m>>3]=j;h[z>>3]=f;h[r>>3]=t;c[k>>2]=c[b>>2];c[k+4>>2]=c[b+4>>2];c[k+8>>2]=c[b+8>>2];c[k+12>>2]=c[b+12>>2];h[q>>3]=f;i=t;e=t}h[C+88>>3]=i;h[C+96>>3]=v+x;h[C+104>>3]=w+y;h[C+112>>3]=B+f;h[C+120>>3]=u+e;do if(!(g&64))if(!(g&128)){lS(a,C,9,1);break}else{lS(a,z,6,1);break}else lS(a,C,6,1);while(0);l=D;return}function MH(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0;q=l;l=l+64|0;p=q;t=+h[d+8>>3];s=+h[d>>3];k=+h[b>>3];e=s+k;m=+h[b+8>>3];f=t+m;i=k+s*.2;j=t*.2+m;k=k+s*.6;m=t*.6+m;h[p>>3]=i-t;h[p+8>>3]=s+j;n=p+16|0;h[n>>3]=t+i;o=p+24|0;h[o>>3]=j-s;h[p+32>>3]=t+k;h[p+40>>3]=m-s;h[p+48>>3]=k-t;h[p+56>>3]=s+m;if(!(g&64)){if(g&128|0){d=2;g=1;r=3}}else{d=3;g=0;r=3}if((r|0)==3){h[p+(g<<4)>>3]=i;h[p+(g<<4)+8>>3]=j;h[p+(d<<4)>>3]=k;h[p+(d<<4)+8>>3]=m}lS(a,p,4,1);c[p>>2]=c[b>>2];c[p+4>>2]=c[b+4>>2];c[p+8>>2]=c[b+8>>2];c[p+12>>2]=c[b+12>>2];h[n>>3]=e;h[o>>3]=f;oS(a,p,2);l=q;return}function NH(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0;o=l;l=l+64|0;n=o;j=+h[d+8>>3];r=j*-.4;i=+h[d>>3];q=i*.4;t=+h[b>>3];e=t+i*.8;s=+h[b+8>>3];f=j*.8+s;i=i+t;j=j+s;h[n>>3]=r+t;k=n+8|0;h[k>>3]=q+s;d=n+16|0;h[d>>3]=t-r;m=n+24|0;h[m>>3]=s-q;h[n+32>>3]=e-r;h[n+40>>3]=f-q;h[n+48>>3]=r+e;h[n+56>>3]=q+f;if(!(g&64)){if(g&128|0){c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];d=2;p=5}}else{c[n>>2]=c[b>>2];c[n+4>>2]=c[b+4>>2];c[n+8>>2]=c[b+8>>2];c[n+12>>2]=c[b+12>>2];d=3;p=5}if((p|0)==5){h[n+(d<<4)>>3]=e;h[n+(d<<4)+8>>3]=f}lS(a,n,4,g>>>4&1^1);h[n>>3]=e;h[k>>3]=f;h[n+16>>3]=i;h[m>>3]=j;oS(a,n,2);l=o;return}function OH(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var i=0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;k=l;l=l+80|0;j=k;p=+h[d+8>>3];m=-p/3.0;r=+h[d>>3];f=r/3.0;q=+h[b>>3];n=q+r*.5;o=+h[b+8>>3];e=p*.5+o;i=j+64|0;h[j+64>>3]=r+q;h[j+72>>3]=p+o;c[j>>2]=c[i>>2];c[j+4>>2]=c[i+4>>2];c[j+8>>2]=c[i+8>>2];c[j+12>>2]=c[i+12>>2];h[j+16>>3]=m+n;h[j+24>>3]=f+e;i=j+32|0;c[i>>2]=c[b>>2];c[i+4>>2]=c[b+4>>2];c[i+8>>2]=c[b+8>>2];c[i+12>>2]=c[b+12>>2];h[j+48>>3]=n-m;h[j+56>>3]=e-f;d=g>>>4&1^1;do if(!(g&64))if(!(g&128)){lS(a,j,4,d);break}else{lS(a,j,3,d);break}else lS(a,i,3,d);while(0);l=k;return}function PH(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=+d;e=+e;f=f|0;var g=0,i=0,j=0.0;g=l;l=l+32|0;i=g;j=+h[c>>3];e=+h[c+8>>3];d=+G(+(j*j+e*e))*.5;j=j*.5+ +h[b>>3];h[i>>3]=j-d;e=e*.5+ +h[b+8>>3];h[i+8>>3]=e-d;h[i+16>>3]=d+j;h[i+24>>3]=d+e;kS(a,i,2,f>>>4&1^1);l=g;return}function QH(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0;r=l;l=l+112|0;o=r+48|0;p=r+16|0;q=r;t=f>4.0?f*.5*.25:.5;s=+h[b>>3];m=+h[d>>3];f=+h[b+8>>3];e=+h[d+8>>3];k=t*e;t=t*m;c[p>>2]=c[b>>2];c[p+4>>2]=c[b+4>>2];c[p+8>>2]=c[b+8>>2];c[p+12>>2]=c[b+12>>2];h[p+16>>3]=s+m;h[p+24>>3]=f+e;h[o>>3]=t+(s-k);e=f+t+k;h[o+8>>3]=e;h[o+48>>3]=t+(s+k);f=f-t+k;h[o+56>>3]=f;m=k*-.95;i=t+(s+m);j=t*4.0/3.0;b=o+32|0;k=k*4.0/3.0;m=t+(s-m);d=o+16|0;n=o+24|0;if(!(g&32)){h[d>>3]=i-j;h[n>>3]=e-k;h[b>>3]=m-j;e=f-k}else{h[d>>3]=j+i;h[n>>3]=k+e;h[b>>3]=j+m;e=f+k}h[o+40>>3]=e;oS(a,p,2);if(!(g&64)){if(g&128|0)iP(q,o,3,.5,o,0)}else iP(q,o,3,.5,0,o);nS(a,o,4,0,0,0);l=r;return}function RH(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var i=0;g=l;l=l+32|0;i=g;e=+h[b>>3]+ +h[d>>3];f=+h[b+8>>3]+ +h[d+8>>3];c[i>>2]=c[b>>2];c[i+4>>2]=c[b+4>>2];c[i+8>>2]=c[b+8>>2];c[i+12>>2]=c[b+12>>2];h[i+16>>3]=e;h[i+24>>3]=f;oS(a,i,2);l=g;return}function SH(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0.0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0;n=l;l=l+80|0;j=n+72|0;k=n+8|0;m=n;i=+JH(a,g);i=i*i;h[m>>3]=i;c[f+12>>2]=g;g=f+32|0;a=e+3|0;f=b+(a<<4)|0;c[g>>2]=c[f>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];c[g+12>>2]=c[f+12>>2];if((e|0)>(d|0)?(p=+h[b+(e<<4)>>3]-+h[f>>3],o=+h[b+(e<<4)+8>>3]-+h[b+(a<<4)+8>>3],p*p+o*o>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];q=k+32|0;a=b+(e+1<<4)|0;c[q>>2]=c[a>>2];c[q+4>>2]=c[a+4>>2];c[q+8>>2]=c[a+8>>2];c[q+12>>2]=c[a+12>>2];f=k+16|0;d=b+(e+2<<4)|0;c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];c[k>>2]=c[g>>2];c[k+4>>2]=c[g+4>>2];c[k+8>>2]=c[g+8>>2];c[k+12>>2]=c[g+12>>2];c[j>>2]=k;c[j+4>>2]=m;ZN(j,92,k,1);c[r>>2]=c[s>>2];c[r+4>>2]=c[s+4>>2];c[r+8>>2]=c[s+8>>2];c[r+12>>2]=c[s+12>>2];c[a>>2]=c[q>>2];c[a+4>>2]=c[q+4>>2];c[a+8>>2]=c[q+8>>2];c[a+12>>2]=c[q+12>>2];c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];m=b+(e+3<<4)|0;c[m>>2]=c[k>>2];c[m+4>>2]=c[k+4>>2];c[m+8>>2]=c[k+8>>2];c[m+12>>2]=c[k+12>>2];l=n;return e|0}function TH(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0;f=c[a>>2]|0;e=+h[b>>3]-+h[f>>3];d=+h[b+8>>3]-+h[f+8>>3];return e*e+d*d<=+h[c[a+4>>2]>>3]|0}function UH(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0.0,k=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0,s=0;o=l;l=l+80|0;k=o+72|0;m=o+8|0;n=o;j=+JH(a,g);j=j*j;h[n>>3]=j;c[f+8>>2]=g;f=f+16|0;a=b+(d<<4)|0;c[f>>2]=c[a>>2];c[f+4>>2]=c[a+4>>2];c[f+8>>2]=c[a+8>>2];c[f+12>>2]=c[a+12>>2];if(!((e|0)>(d|0)?(i=d+3|0,q=+h[a>>3]-+h[b+(i<<4)>>3],p=+h[b+(d<<4)+8>>3]-+h[b+(i<<4)+8>>3],q*q+p*p>2]=c[e>>2];c[m+4>>2]=c[e+4>>2];c[m+8>>2]=c[e+8>>2];c[m+12>>2]=c[e+12>>2];g=m+16|0;d=b+(i+2<<4)|0;c[g>>2]=c[d>>2];c[g+4>>2]=c[d+4>>2];c[g+8>>2]=c[d+8>>2];c[g+12>>2]=c[d+12>>2];r=m+32|0;a=b+(i+1<<4)|0;c[r>>2]=c[a>>2];c[r+4>>2]=c[a+4>>2];c[r+8>>2]=c[a+8>>2];c[r+12>>2]=c[a+12>>2];s=m+48|0;c[s>>2]=c[f>>2];c[s+4>>2]=c[f+4>>2];c[s+8>>2]=c[f+8>>2];c[s+12>>2]=c[f+12>>2];c[k>>2]=s;c[k+4>>2]=n;ZN(k,92,m,0);n=b+(i<<4)|0;c[n>>2]=c[s>>2];c[n+4>>2]=c[s+4>>2];c[n+8>>2]=c[s+8>>2];c[n+12>>2]=c[s+12>>2];c[a>>2]=c[r>>2];c[a+4>>2]=c[r+4>>2];c[a+8>>2]=c[r+8>>2];c[a+12>>2]=c[r+12>>2];c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];c[e>>2]=c[m>>2];c[e+4>>2]=c[m+4>>2];c[e+8>>2]=c[m+8>>2];c[e+12>>2]=c[m+12>>2];l=o;return i|0}function VH(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,H=0;t=(g|0)!=0;p=(i|0)!=0;F=f+24|0;D=f+12|0;A=e+3|0;B=b+(A<<4)|0;x=e+1|0;E=f+16|0;A=b+(A<<4)+8|0;C=b+(x<<4)|0;z=f+32|0;v=b+(e<<4)|0;H=f+8|0;w=f+40|0;y=b+(e+2<<4)|0;x=b+(x<<4)+8|0;f=b+(e<<4)+8|0;if(!((e|0)==(d|0)&(t&p))){if(p){j=+JH(a,i);o=+h[v>>3];n=+h[f>>3];l=+h[B>>3];m=+h[A>>3];r=o-l;s=n-m;s=+G(+(r*r+s*s))*.9;j=j>=s?s:j;if(n==m){k=l+(o>3]=o;h[x>>3]=n;h[B>>3]=k;h[A>>3]=j;c[y>>2]=c[B>>2];c[y+4>>2]=c[B+4>>2];c[y+8>>2]=c[B+8>>2];c[y+12>>2]=c[B+12>>2];c[D>>2]=i;h[z>>3]=l;h[w>>3]=m}if(t){l=+JH(a,g);f=b+(d<<4)|0;k=+h[f>>3];j=+h[b+(d<<4)+8>>3];D=d+3|0;n=+h[b+(D<<4)>>3];o=+h[b+(D<<4)+8>>3];r=k-n;s=j-o;s=+G(+(r*r+s*s))*.9;l=l>=s?s:l;if(j==o){m=k+(k>3]=m;h[b+(D<<4)+8>>3]=l;c[f>>2]=c[u>>2];c[f+4>>2]=c[u+4>>2];c[f+8>>2]=c[u+8>>2];c[f+12>>2]=c[u+12>>2];u=d+2|0;h[b+(u<<4)>>3]=n;h[b+(u<<4)+8>>3]=o;u=16}}else{s=+h[v>>3];r=+h[f>>3];k=+h[B>>3];j=+h[A>>3];l=+JH(a,g);q=+JH(a,i);o=s-k;m=r-j;m=+G(+(o*o+m*m));d=!(l+q>=m);m=m/3.0;l=d?l:m;m=d?q:m;if(r==j){d=s>3]=q;h[x>>3]=n;c[v>>2]=c[C>>2];c[v+4>>2]=c[C+4>>2];c[v+8>>2]=c[C+8>>2];c[v+12>>2]=c[C+12>>2];h[B>>3]=o;h[A>>3]=l;c[y>>2]=c[B>>2];c[y+4>>2]=c[B+4>>2];c[y+8>>2]=c[B+8>>2];c[y+12>>2]=c[B+12>>2];c[D>>2]=i;h[z>>3]=s;h[w>>3]=r;u=16}if((u|0)==16){c[H>>2]=g;h[E>>3]=k;h[F>>3]=j}return}function WH(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0;m=+h[b>>3];k=+h[c>>3]-m;o=+h[b+8>>3];j=+h[c+8>>3]-o;l=d*10.0/(+G(+(j*j+k*k))+.0001);k=(k+(k>=0.0?.0001:-.0001))*l;j=l*(j+(j>=0.0?.0001:-.0001));l=k*.5;n=j*.5;i=m-n;f=o-l;n=m+n;l=o+l;o=k+i;m=f+j;k=k+n;j=l+j;g=o>k?o:k;g=n>g?n:g;d=m>j?m:j;d=l>d?l:d;k=o>3]=i>3]=f>3]=i>g?i:g;h[a+24>>3]=f>d?f:d;return}function XH(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;g=+g;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0;q=l;l=l+48|0;m=q+32|0;k=q+16|0;p=q;n=(c[a+16>>2]|0)+12|0;o=c[n>>2]|0;c[n>>2]=b;jS(a,c[(c[a>>2]|0)+336>>2]|0);sS(a,g);t=+h[e>>3]-+h[d>>3];b=e+8|0;r=+h[b>>3]-+h[d+8>>3];s=10.0/(+G(+(r*r+t*t))+.0001);h[e>>3]=(t+(t>=0.0?.0001:-.0001))*s;h[b>>3]=s*(r+(r>=0.0?.0001:-.0001));b=0;while(1){if((b|0)>=4)break;j=i>>(b<<3)&255;if(!j)break;c[k>>2]=c[d>>2];c[k+4>>2]=c[d+4>>2];c[k+8>>2]=c[d+8>>2];c[k+12>>2]=c[d+12>>2];c[m>>2]=c[e>>2];c[m+4>>2]=c[e+4>>2];c[m+8>>2]=c[e+8>>2];c[m+12>>2]=c[e+12>>2];YH(p,a,k,m,f,g,j);c[d>>2]=c[p>>2];c[d+4>>2]=c[p+4>>2];c[d+8>>2]=c[p+8>>2];c[d+12>>2]=c[p+12>>2];b=b+1|0}c[n>>2]=o;l=q;return}function YH(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;g=+g;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0;q=l;l=l+32|0;m=q+16|0;k=q;n=i&15;j=1400;while(1){o=c[j>>2]|0;if(!o)break;if((n|0)==(o|0)){p=4;break}j=j+24|0}if((p|0)==4){r=+h[j+8>>3]*f;h[e>>3]=+h[e>>3]*r;o=e+8|0;h[o>>3]=r*+h[o>>3];p=c[j+16>>2]|0;c[k>>2]=c[d>>2];c[k+4>>2]=c[d+4>>2];c[k+8>>2]=c[d+8>>2];c[k+12>>2]=c[d+12>>2];c[m>>2]=c[e>>2];c[m+4>>2]=c[e+4>>2];c[m+8>>2]=c[e+8>>2];c[m+12>>2]=c[e+12>>2];nb[p&15](b,k,m,f,g,i);h[d>>3]=+h[d>>3]+ +h[e>>3];p=d+8|0;h[p>>3]=+h[p>>3]+ +h[o>>3]};c[a>>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];l=q;return}function ZH(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i+8|0;f=i;d=NA(b,100097)|0;if((d|0)!=0?(a[d>>0]|0)!=0:0){e=d;h=5}else{d=NA(b,100109)|0;if((d|0)!=0?(a[d>>0]|0)!=0:0){e=d;h=5}else d=0}if((h|0)==5){d=AH(e,0,120)|0;if(!d){c[f>>2]=HB(b)|0;dA(0,100116,f)|0;c[g>>2]=e;dA(3,100169,g)|0}}l=i;return d|0}function _H(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0;k=l;l=l+16|0;j=HK(304)|0;if(!j)dA(1,100177,k)|0;b=a+16|0;a=c[b>>2]|0;c[j>>2]=a;c[b>>2]=j;b=j+152|0;d=j+144|0;e=j+148|0;if(!a){c[d>>2]=3;c[e>>2]=0;h[b>>3]=1.0}else{f=j+16|0;g=a+16|0;i=f+40|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(i|0));f=j+56|0;g=a+56|0;i=f+40|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(i|0));c[d>>2]=c[a+144>>2];c[e>>2]=c[a+148>>2];h[b>>3]=+h[a+152>>3];c[j+136>>2]=c[a+136>>2];f=j+96|0;g=a+96|0;i=f+40|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(i|0))}l=k;return j|0}function $H(a){a=a|0;var b=0;a=a+16|0;b=c[a>>2]|0;if(!b)Aa(100203,100207,117,100214);else{l6(c[b+212>>2]|0);l6(c[b+208>>2]|0);l6(c[b+216>>2]|0);l6(c[b+220>>2]|0);l6(c[b+224>>2]|0);l6(c[b+228>>2]|0);l6(c[b+232>>2]|0);l6(c[b+236>>2]|0);l6(c[b+240>>2]|0);l6(c[b+244>>2]|0);l6(c[b+248>>2]|0);l6(c[b+252>>2]|0);l6(c[b+256>>2]|0);l6(c[b+272>>2]|0);l6(c[b+284>>2]|0);l6(c[b+280>>2]|0);c[a>>2]=c[b>>2];l6(b);return}}function aI(d,e,f,g,h,i,j){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0;m=c[d+16>>2]|0;l=c[d+152>>2]|0;k=m+192|0;if((e|0)!=0&(l&32768|0)!=0)c[k>>2]=e;if(((l&65536|0)!=0?(c[m+212>>2]=CK(i,j)|0,(f|0)!=0):0)?(a[f>>0]|0)!=0:0){c[m+208>>2]=CK(f,j)|0;d=1}else d=0;do if(l&4194304){if(g|0?a[g>>0]|0:0){c[m+228>>2]=CK(g,j)|0;d=m+260|0;b[d>>1]=b[d>>1]|1;d=1;break}e=c[k>>2]|0;if(e){c[m+228>>2]=Y3(e)|0;d=1}}while(0);if((h|0)!=0&(l&8388608|0)!=0?(a[h>>0]|0)!=0:0){c[m+244>>2]=CK(h,j)|0;d=1}return d|0}function bI(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;j=l;l=l+80|0;i=j;h=j+8|0;g=c[(c[b>>2]|0)+168>>2]|0;f=c[(c[(c[g+16>>2]|0)+8>>2]|0)+92>>2]|0;cI(b,e);b=NA(d,141363)|0;if((b|0)!=0?(a[b>>0]|0)!=0:0){kA(e,b)|0;f=e+4|0;b=c[f>>2]|0;if(b>>>0>=(c[e+8>>2]|0)>>>0){iA(e,1)|0;b=c[f>>2]|0}a[b>>0]=0;b=c[e>>2]|0;c[f>>2]=b}else{if((g|0)!=(d|0)&(f|0)!=0){kA(e,f)|0;f=e+4|0;b=c[f>>2]|0;if(b>>>0>=(c[e+8>>2]|0)>>>0){iA(e,1)|0;b=c[f>>2]|0}c[f>>2]=b+1;a[b>>0]=95}switch(FC(d)|0){case 0:{f=(g|0)==(d|0)?111795:100228;b=(c[d>>2]|0)>>>4;break}case 1:{f=111782;b=(c[d>>2]|0)>>>4;break}case 2:{f=111751;b=(c[d>>2]|0)>>>4;break}default:{f=0;b=0}}kA(e,f)|0;c[i>>2]=b;i2(h,100234,i)|0;kA(e,h)|0;f=e+4|0;b=c[f>>2]|0;if(b>>>0>=(c[e+8>>2]|0)>>>0){iA(e,1)|0;b=c[f>>2]|0}a[b>>0]=0;b=c[e>>2]|0;c[f>>2]=b}l=j;return b|0}function cI(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+144|0;h=i;g=i+8|0;e=c[b+160>>2]|0;if((e|0)>1?c[b+152>>2]&64|0:0){kA(d,c[(c[(c[b>>2]|0)+308>>2]|0)+(e<<2)>>2]|0)|0;f=d+4|0;e=c[f>>2]|0;if(e>>>0>=(c[d+8>>2]|0)>>>0){iA(d,1)|0;e=c[f>>2]|0}c[f>>2]=e+1;a[e>>0]=95}f=c[b+196>>2]|0;e=c[b+200>>2]|0;if((f|0)>0|(e|0)>0){c[h>>2]=f;c[h+4>>2]=e;i2(g,100238,h)|0;kA(d,g)|0}l=i;return}function dI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,i=0.0,j=0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0.0,s=0;s=l;l=l+48|0;p=s+16|0;f=s+32|0;q=s;r=+h[(c[a+16>>2]|0)+152>>3];o=eI(d,0,f)|0;if((o+-1|0)>>>0>=2){e=+h[b+16>>3];k=(+h[b>>3]+e)*.5;h[q>>3]=k;i=+h[b+24>>3];m=(+h[b+8>>3]+i)*.5;h[q+8>>3]=m;k=e-k;m=i-m;n=r>.5;if(n)sS(a,.5);j=c[f>>2]|0;i=0.0;f=c[j+8>>2]|0;while(1){d=c[f>>2]|0;if(!d)break;b=f+4|0;if(+g[b>>2]==0.0)e=i;else{hS(a,d);if(!(c[f+12>>2]|0))e=6.283185307179586;else e=i+ +g[b>>2]*6.283185307179586;c[p>>2]=c[q>>2];c[p+4>>2]=c[q+4>>2];c[p+8>>2]=c[q+8>>2];c[p+12>>2]=c[q+12>>2];b=GT(p,k,m,i,e)|0;nS(a,c[b>>2]|0,c[b+4>>2]|0,0,0,1);CY(b)}i=e;f=f+12|0}if(n)sS(a,r);fI(j)}l=s;return o|0}function eI(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0.0,k=0.0,m=0.0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;n=q+8|0;i=q;p=HK(12)|0;h=Y3(b)|0;a:do if(!d){d=1;f=h;while(1){switch(a[f>>0]|0){case 0:break a;case 58:{d=d+1|0;break}default:{}}f=f+1|0}}while(0);c[p+4>>2]=h;o=HK((d*12|0)+12|0)|0;c[p+8>>2]=o;j=1.0;f=0;d=0;while(1){h=i6(h,108285)|0;if(!h){h=20;break}k=+gI(h);if(!(k>=0.0)){h=17;break}m=k-j;if(m>0.0)if((c[5167]|0)!=0?!(m<1.0e-05&m>-1.0e-05):0){c[i>>2]=b;dA(0,100249,i)|0;c[5167]=0;k=j;d=3}else k=j;j=j-k;if(k>0.0)a[o+(f*12|0)+8>>0]=1;if(a[h>>0]|0)c[o+(f*12|0)>>2]=h;g[o+(f*12|0)+4>>2]=k;if(j<1.0e-05&j>-1.0e-05){h=30;break}else{f=f+1|0;h=0}}b:do if((h|0)==17){if(!(c[5167]|0))d=1;else{c[n>>2]=b;dA(1,100284,n)|0;c[5167]=0;d=2}fI(p)}else if((h|0)==20){b=f+-1|0;if(j>0.0){h=0;i=0;while(1){if((h|0)>=(f|0))break;n=(+g[o+(h*12|0)+4>>2]==0.0&1)+i|0;h=h+1|0;i=n}if((i|0)<=0){f=o+(b*12|0)+4|0;g[f>>2]=j+ +g[f>>2];f=b;h=30;break}j=j/+(i|0);h=0;while(1){if((h|0)>=(f|0)){f=b;h=30;break b}i=o+(h*12|0)+4|0;if(+g[i>>2]==0.0)g[i>>2]=j;h=h+1|0}}else{f=b;h=30}}while(0);if((h|0)==30){while(1){if((f|0)<=-1)break;if(+g[o+(f*12|0)+4>>2]>0.0)break;f=f+-1|0}n=f+1|0;c[o+(n*12|0)>>2]=0;c[p>>2]=n;c[e>>2]=p}l=q;return d|0}function fI(a){a=a|0;l6(c[a+4>>2]|0);l6(c[a+8>>2]|0);l6(a);return}function gI(b){b=b|0;var d=0.0,e=0,f=0,g=0;f=l;l=l+16|0;e=f;b=F3(b,59)|0;if(!b)d=0.0;else{g=b+1|0;a[b>>0]=0;d=+b6(g,e);d=(d>=0.0?(c[e>>2]|0)!=(g|0):0)?d:-1.0}l=f;return +d}function hI(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,i=0,j=0,k=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0;u=l;l=l+80|0;o=u+64|0;s=u;t=+h[(c[a+16>>2]|0)+152>>3];p=eI(d,0,o)|0;if((p+-1|0)>>>0>=2){q=s+16|0;d=s+48|0;i=b+48|0;r=s+32|0;j=b+32|0;k=b+16|0;if(!e){c[s>>2]=c[b>>2];c[s+4>>2]=c[b+4>>2];c[s+8>>2]=c[b+8>>2];c[s+12>>2]=c[b+12>>2];c[q>>2]=c[k>>2];c[q+4>>2]=c[k+4>>2];c[q+8>>2]=c[k+8>>2];c[q+12>>2]=c[k+12>>2];c[r>>2]=c[j>>2];c[r+4>>2]=c[j+4>>2];c[r+8>>2]=c[j+8>>2];c[r+12>>2]=c[j+12>>2];c[d>>2]=c[i>>2];c[d+4>>2]=c[i+4>>2];c[d+8>>2]=c[i+8>>2];c[d+12>>2]=c[i+12>>2]}else{c[s>>2]=c[j>>2];c[s+4>>2]=c[j+4>>2];c[s+8>>2]=c[j+8>>2];c[s+12>>2]=c[j+12>>2];c[q>>2]=c[i>>2];c[q+4>>2]=c[i+4>>2];c[q+8>>2]=c[i+8>>2];c[q+12>>2]=c[i+12>>2];c[r>>2]=c[b>>2];c[r+4>>2]=c[b+4>>2];c[r+8>>2]=c[b+8>>2];c[r+12>>2]=c[b+12>>2];c[d>>2]=c[k>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2]}m=+h[q>>3];f=+h[s>>3];n=m-f;h[r>>3]=f;h[q>>3]=f;e=t>.5;if(e)sS(a,.5);k=c[o>>2]|0;b=s+48|0;j=c[k+8>>2]|0;while(1){d=c[j>>2]|0;if(!d)break;i=j+4|0;if(!(+g[i>>2]==0.0)){hS(a,d);if(!(c[j+12>>2]|0))f=m;else f=+h[s>>3]+n*+g[i>>2];h[r>>3]=f;h[q>>3]=f;lS(a,s,4,1);f=+h[q>>3];h[b>>3]=f;h[s>>3]=f}j=j+12|0}if(e)sS(a,t);fI(k)}l=u;return p|0}function iI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=c[a+16>>2]|0;e=c[a+152>>2]|0;if(e&4259840|0){f=e&131072;g=f>>>16^2;c[d+264>>2]=g;h=d+268|0;c[h>>2]=g+2;g=d+272|0;l6(c[g>>2]|0);d=HK(c[h>>2]<<4)|0;c[g>>2]=d;c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];g=d+16|0;b=b+16|0;c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];if(!(e&8192))LR(a,d,d,2)|0;if(!f)hK(d)}return}function jI(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0,f=0.0,g=0.0,i=0.0,j=0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+144|0;c=r+80|0;e=r+16|0;j=r;k=+h[b>>3];o=a+16|0;m=+h[o>>3];p=a+24|0;n=a+8|0;if(!(((((((((!(k>m)?(d=+h[a>>3],!(k>3],g=+h[p>>3],!(f>g)):0)?(i=+h[n>>3],!(f>3],!(k>m|k>3],!(k>g|k>3],!(k>m|k>3],!(k>g|k>3],!(k>m|k>3],!(m>g|m>3];if(!(d>+h[o>>3])){if(d<+h[a>>3]){c=a;q=15}}else{c=o;q=15}if((q|0)==15){q=0;h[c>>3]=d}d=+h[b+(e<<4)+8>>3];if(!(d>+h[p>>3])){if(d<+h[n>>3]){c=a;q=18}}else{c=o;q=18}if((q|0)==18){q=0;h[c+8>>3]=d}e=e+1|0}}while(0);l=r;return}function kI(a){a=a|0;var b=0,d=0,e=0,f=0,g=0.0,h=0,i=0;b=l;l=l+48|0;d=b+32|0;e=b+16|0;f=b;i=a+48|0;h=a+16|0;c[f>>2]=c[a>>2];c[f+4>>2]=c[a+4>>2];c[f+8>>2]=c[a+8>>2];c[f+12>>2]=c[a+12>>2];c[e>>2]=c[i>>2];c[e+4>>2]=c[i+4>>2];c[e+8>>2]=c[i+8>>2];c[e+12>>2]=c[i+12>>2];c[d>>2]=c[h>>2];c[d+4>>2]=c[h+4>>2];c[d+8>>2]=c[h+8>>2];c[d+12>>2]=c[h+12>>2];g=+mK(f,e,d);h=a+32|0;c[f>>2]=c[a>>2];c[f+4>>2]=c[a+4>>2];c[f+8>>2]=c[a+8>>2];c[f+12>>2]=c[a+12>>2];c[e>>2]=c[i>>2];c[e+4>>2]=c[i+4>>2];c[e+8>>2]=c[i+8>>2];c[e+12>>2]=c[i+12>>2];c[d>>2]=c[h>>2];c[d+4>>2]=c[h+4>>2];c[d+8>>2]=c[h+8>>2];c[d+12>>2]=c[h+12>>2];a=g<4.0&+mK(f,e,d)<4.0&1;l=b;return a|0}function lI(b,d){b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0,I=0.0,J=0.0,K=0.0,L=0,M=0;G=l;l=l+272|0;x=G+256|0;y=G+224|0;z=G+192|0;A=G+160|0;B=G+64|0;C=G;D=G+128|0;E=G+96|0;F=G+32|0;w=c[d+16>>2]|0;v=c[w+144>>2]|0;u=w+16|0;c[A>>2]=c[u>>2];c[A+4>>2]=c[u+4>>2];c[A+8>>2]=c[u+8>>2];c[A+12>>2]=c[u+12>>2];c[A+16>>2]=c[u+16>>2];c[A+20>>2]=c[u+20>>2];c[A+24>>2]=c[u+24>>2];c[A+28>>2]=c[u+28>>2];w=c[(c[w+8>>2]|0)+88>>2]|0;c[C>>2]=0;c[C+4>>2]=0;c[C+8>>2]=0;c[C+12>>2]=0;c[C+16>>2]=0;c[C+20>>2]=0;c[C+24>>2]=0;c[C+28>>2]=0;if(!w){c[b>>2]=c[A>>2];c[b+4>>2]=c[A+4>>2];c[b+8>>2]=c[A+8>>2];c[b+12>>2]=c[A+12>>2];c[b+16>>2]=c[A+16>>2];c[b+20>>2]=c[A+20>>2];c[b+24>>2]=c[A+24>>2];c[b+28>>2]=c[A+28>>2]}else{d=A+16|0;if(+h[A>>3]==+h[d>>3]?(e=A+8|0,f=A+24|0,+h[e>>3]==+h[f>>3]):0){h[e>>3]=1797693134862315708145274.0e284;h[A>>3]=1797693134862315708145274.0e284;h[f>>3]=-1797693134862315708145274.0e284;h[d>>3]=-1797693134862315708145274.0e284}n=y+8|0;o=y+16|0;p=y+24|0;q=B+16|0;r=B+24|0;s=v+144|0;t=z+16|0;u=w+12|0;d=0;k=c[w+8>>2]|0;e=0;g=0.0;m=0;while(1){if((m|0)>=(c[w>>2]|0))break;c[B>>2]=c[C>>2];c[B+4>>2]=c[C+4>>2];c[B+8>>2]=c[C+8>>2];c[B+12>>2]=c[C+12>>2];c[B+16>>2]=c[C+16>>2];c[B+20>>2]=c[C+20>>2];c[B+24>>2]=c[C+24>>2];c[B+28>>2]=c[C+28>>2];j=k+8|0;f=k+80|0;i=j+4|0;switch(c[k>>2]|0){case 1:case 0:{K=+h[j>>3];J=+h[k+24>>3];h[y>>3]=K-J;I=+h[k+16>>3];H=+h[k+32>>3];h[n>>3]=I-H;h[o>>3]=K+J;h[p>>3]=I+H;c[f>>2]=c[y>>2];c[f+4>>2]=c[y+4>>2];c[f+8>>2]=c[y+8>>2];c[f+12>>2]=c[y+12>>2];j=k+96|0;c[j>>2]=c[o>>2];c[j+4>>2]=c[o+4>>2];c[j+8>>2]=c[o+8>>2];c[j+12>>2]=c[o+12>>2];c[x>>2]=c[y>>2];c[x+4>>2]=c[y+4>>2];c[x+8>>2]=c[y+8>>2];c[x+12>>2]=c[y+12>>2];mI(A,x);c[x>>2]=c[o>>2];c[x+4>>2]=c[o+4>>2];c[x+8>>2]=c[o+8>>2];c[x+12>>2]=c[o+12>>2];mI(A,x);break}case 3:case 2:{nI(D,c[i>>2]|0,c[j>>2]|0,A);c[f>>2]=c[D>>2];c[f+4>>2]=c[D+4>>2];c[f+8>>2]=c[D+8>>2];c[f+12>>2]=c[D+12>>2];c[f+16>>2]=c[D+16>>2];c[f+20>>2]=c[D+20>>2];c[f+24>>2]=c[D+24>>2];c[f+28>>2]=c[D+28>>2];break}case 5:case 4:{nI(E,c[i>>2]|0,c[j>>2]|0,A);c[f>>2]=c[E>>2];c[f+4>>2]=c[E+4>>2];c[f+8>>2]=c[E+8>>2];c[f+12>>2]=c[E+12>>2];c[f+16>>2]=c[E+16>>2];c[f+20>>2]=c[E+20>>2];c[f+24>>2]=c[E+24>>2];c[f+28>>2]=c[E+28>>2];break}case 6:{nI(F,c[i>>2]|0,c[j>>2]|0,A);c[f>>2]=c[F>>2];c[f+4>>2]=c[F+4>>2];c[f+8>>2]=c[F+8>>2];c[f+12>>2]=c[F+12>>2];c[f+16>>2]=c[F+16>>2];c[f+20>>2]=c[F+20>>2];c[f+24>>2]=c[F+24>>2];c[f+28>>2]=c[F+28>>2];break}case 7:{i=k+112|0;c[i>>2]=HK(56)|0;L=Y3(c[k+40>>2]|0)|0;M=c[i>>2]|0;c[M>>2]=L;a[M+48>>0]=a[100330+(c[k+24>>2]|0)>>0]|0;c[B>>2]=e;h[q>>3]=g;c[r>>2]=c[r>>2]&-128|d&127;M=c[s>>2]|0;M=eb[c[M>>2]&63](M,B,1)|0;L=c[i>>2]|0;c[L+4>>2]=M;JO(x,v,L);oI(z,+h[j>>3],+h[k+16>>3],c[i>>2]|0);c[f>>2]=c[z>>2];c[f+4>>2]=c[z+4>>2];c[f+8>>2]=c[z+8>>2];c[f+12>>2]=c[z+12>>2];c[f+16>>2]=c[z+16>>2];c[f+20>>2]=c[z+20>>2];c[f+24>>2]=c[z+24>>2];c[f+28>>2]=c[z+28>>2];c[x>>2]=c[z>>2];c[x+4>>2]=c[z+4>>2];c[x+8>>2]=c[z+8>>2];c[x+12>>2]=c[z+12>>2];mI(A,x);c[x>>2]=c[t>>2];c[x+4>>2]=c[t+4>>2];c[x+8>>2]=c[t+8>>2];c[x+12>>2]=c[t+12>>2];mI(A,x);if(!(c[u>>2]|0))c[u>>2]=109;break}case 10:{e=c[k+16>>2]|0;g=+h[j>>3];break}case 15:{d=c[j>>2]|0;break}default:{}}k=k+120|0;m=m+1|0}c[b>>2]=c[A>>2];c[b+4>>2]=c[A+4>>2];c[b+8>>2]=c[A+8>>2];c[b+12>>2]=c[A+12>>2];c[b+16>>2]=c[A+16>>2];c[b+20>>2]=c[A+20>>2];c[b+24>>2]=c[A+24>>2];c[b+28>>2]=c[A+28>>2]}l=G;return}function mI(a,b){a=a|0;b=b|0;var c=0.0,d=0;c=+h[b>>3];d=a+16|0;if(c>+h[d>>3])h[d>>3]=c;if(c<+h[a>>3])h[a>>3]=c;c=+h[b+8>>3];b=a+24|0;if(c>+h[b>>3])h[b>>3]=c;b=a+8|0;if(c<+h[b>>3])h[b>>3]=c;return}function nI(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+48|0;k=r+32|0;n=r;f=+h[b>>3];o=n+16|0;h[o>>3]=f;h[n>>3]=f;f=+h[b+8>>3];p=n+24|0;h[p>>3]=f;m=n+8|0;h[m>>3]=f;j=1;while(1){if((j|0)>=(d|0))break;i=b+24|0;f=+h[i>>3];if(!(f<+h[n>>3])){if(f>+h[o>>3]){g=o;q=5}}else{g=n;q=5}if((q|0)==5){q=0;h[g>>3]=f}f=+h[b+32>>3];if(!(f<+h[m>>3])){if(f>+h[p>>3]){b=o;q=8}}else{b=n;q=8}if((q|0)==8){q=0;h[b+8>>3]=f}j=j+1|0;b=i}c[k>>2]=c[n>>2];c[k+4>>2]=c[n+4>>2];c[k+8>>2]=c[n+8>>2];c[k+12>>2]=c[n+12>>2];mI(e,k);c[k>>2]=c[o>>2];c[k+4>>2]=c[o+4>>2];c[k+8>>2]=c[o+8>>2];c[k+12>>2]=c[o+12>>2];mI(e,k);c[a>>2]=c[n>>2];c[a+4>>2]=c[n+4>>2];c[a+8>>2]=c[n+8>>2];c[a+12>>2]=c[n+12>>2];c[a+16>>2]=c[n+16>>2];c[a+20>>2]=c[n+20>>2];c[a+24>>2]=c[n+24>>2];c[a+28>>2]=c[n+28>>2];l=r;return}function oI(b,c,d,e){b=b|0;c=+c;d=+d;e=e|0;var f=0.0,g=0,i=0,j=0,k=0.0,m=0,n=0;n=l;l=l+16|0;i=n+8|0;j=n;f=+h[e+32>>3];k=+h[e+40>>3];switch(a[e+48>>0]|0){case 108:{h[i>>3]=c;f=f+c;g=j;m=5;break}case 110:{f=f*.5;h[i>>3]=c-f;f=f+c;g=j;m=5;break}case 114:{h[j>>3]=c;f=c-f;g=i;m=5;break}default:{c=0.0;f=0.0}}if((m|0)==5){h[g>>3]=f;c=+h[i>>3];f=+h[j>>3]}d=+h[e+16>>3]+d;h[b>>3]=c;h[b+8>>3]=d-k;h[b+16>>3]=f;h[b+24>>3]=d;l=n;return}function pI(a){a=a|0;if((c[a>>2]|0)==7)zK(c[a+112>>2]|0,1);return}function qI(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0.0,i=0.0,j=0,k=0,m=0,n=0.0,o=0,p=0;m=l;l=l+16|0;k=m;j=c[b+152>>2]|0;g=+h[b+352>>3];n=+h[b+432>>3];f=g*n/72.0;h[b+488>>3]=f;i=+h[b+440>>3];g=g*i/72.0;h[b+496>>3]=g;h[b+520>>3]=n/72.0;i=i/72.0;e=b+528|0;h[e>>3]=i;if(c[47187]|j&4096|0)h[e>>3]=-i;p=(c[b+360>>2]|0)==0;o=b+376|0;n=+((c[b+452>>2]|0)>>>0);e=b+368|0;h[(p?e:o)>>3]=+((c[b+448>>2]|0)>>>0)/(p?f:g);h[(p?o:e)>>3]=n/(p?g:f);pS(b,_O(d,DA(d,0,101823,0)|0,195341)|0);c[b+160>>2]=0;rI(b,d);if(j&2|0)sI(b,d);e=gC(d)|0;while(1){if(!e)break;a[(c[e+16>>2]|0)+116>>0]=0;e=hC(d,e)|0}tI(b,k);while(1){if(!((uI(b)|0)<<24>>24))break;if((vI(b)|0)>1)QR(b);wI(b);while(1){if(!((xI(b)|0)<<24>>24))break;yI(b,d);zI(b)}if((vI(b)|0)>1)RR(b);AI(b,k)}BI(b);l=m;return}function rI(a,b){a=a|0;b=b|0;var d=0;d=_H(a)|0;c[d+4>>2]=0;c[d+8>>2]=b;c[d+12>>2]=0;AJ(a,c[(c[b+16>>2]|0)+12>>2]|0,b);MR(a,b);return}function sI(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0;hS(b,135101);d=NA(c,141280)|0;if(d|0?a[d>>0]|0:0)hS(b,d);d=NA(c,101747)|0;if(d|0?a[d>>0]|0:0)fS(b,d);MJ(b,c);g=gC(c)|0;while(1){if(!g)break;d=NA(g,141126)|0;if(d|0?a[d>>0]|0:0)fS(b,d);d=NA(g,138032)|0;if(d|0?a[d>>0]|0:0)hS(b,d);d=NA(g,101719)|0;do if(d|0?a[d>>0]|0:0){if(!(F3(d,58)|0)){fS(b,d);break}e=Y3(d)|0;d=e;while(1){d=i6(d,108285)|0;if(!d)break;if(!(a[d>>0]|0)){d=0;continue}fS(b,d);d=0}l6(e)}while(0);d=NA(g,101747)|0;if(d|0?a[d>>0]|0:0)fS(b,d);f=UA(c,g)|0;while(1){if(!f)break;d=NA(f,141126)|0;do if(d|0?a[d>>0]|0:0){if(!(F3(d,58)|0)){fS(b,d);break}e=Y3(d)|0;d=e;while(1){d=i6(d,108285)|0;if(!d)break;if(!(a[d>>0]|0)){d=0;continue}fS(b,d);d=0}l6(e)}while(0);d=NA(f,101747)|0;if(d|0?a[d>>0]|0:0)fS(b,d);f=WA(c,f)|0}g=hC(c,g)|0}return}function tI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;e=m+8|0;j=m;h=c[a>>2]|0;d=c[h+312>>2]|0;g=a+156|0;c[g>>2]=d;h=c[h+316>>2]|0;i=a+152|0;f=a+52|0;k=a+160|0;if(!h)if((d|0)>1?(c[i>>2]&64|0)==0:0){c[e>>2]=c[f>>2];dA(0,100868,e)|0;c[g>>2]=1;d=0;a=1}else{d=0;a=1}else{a=h+4|0;if((c[h>>2]|0)>1?(c[i>>2]&64|0)==0:0){c[j>>2]=c[f>>2];dA(0,100868,j)|0;c[h+8>>2]=(c[g>>2]|0)+1}d=h+8|0;a=c[a>>2]|0}c[k>>2]=a;c[b>>2]=d;l=m;return}function uI(a){a=a|0;return (c[a+160>>2]|0)<=(c[a+156>>2]|0)|0}function vI(a){a=a|0;var b=0;b=c[(c[a>>2]|0)+316>>2]|0;return c[((b|0)==0?a+156|0:b)>>2]|0}function wI(a){a=a|0;var b=0,d=0;d=a+172|0;b=c[d+4>>2]|0;a=a+196|0;c[a>>2]=c[d>>2];c[a+4>>2]=b;return}function xI(a){a=a|0;var b=0,d=0;d=c[a+196>>2]|0;if(((d|0)>-1?(d|0)<(c[a+164>>2]|0):0)?(b=c[a+200>>2]|0,(b|0)>-1):0)a=(b|0)<(c[a+168>>2]|0)&1;else a=0;return a|0}function yI(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;q=l;l=l+176|0;m=q;f=q+48|0;n=q+32|0;o=c[d+16>>2]|0;p=c[d+152>>2]|0;if((c[d+160>>2]|0)<=1?(c[d+196>>2]|0)<=0:0)h=0;else{hA(n,128,f);g=o+212|0;h=c[g>>2]|0;cI(d,n);kA(n,h)|0;i=n+4|0;f=c[i>>2]|0;if(f>>>0>=(c[n+8>>2]|0)>>>0){iA(n,1)|0;f=c[i>>2]|0}a[f>>0]=0;j=c[n>>2]|0;c[i>>2]=j;c[g>>2]=j}FT(NA(e,100333)|0);DI(d);OR(d);fS(d,137615);hS(d,135101);i=o+208|0;j=o+260|0;do if(p&4259840|0){if((c[i>>2]|0)==0?(b[j>>1]&1)==0:0)break;if(p&655360){g=p&131072;c[o+264>>2]=g>>>16^2;f=HK((g>>>12^32)+32|0)|0;r=d+288|0;c[f>>2]=c[r>>2];c[f+4>>2]=c[r+4>>2];c[f+8>>2]=c[r+8>>2];c[f+12>>2]=c[r+12>>2];r=f+16|0;s=d+304|0;c[r>>2]=c[s>>2];c[r+4>>2]=c[s+4>>2];c[r+8>>2]=c[s+8>>2];c[r+12>>2]=c[s+12>>2];if(!g){hK(f);g=4}else g=2}else{f=0;g=0}if(!(p&8192))LR(d,f,f,g)|0;c[o+272>>2]=f;c[o+268>>2]=g}while(0);f=e+16|0;if(p&32768|0?(k=c[(c[f>>2]|0)+12>>2]|0,k|0):0)c[o+192>>2]=c[k>>2];g=(p&4|0)!=0;do if(!g){if((c[i>>2]|0)==0?(b[j>>1]&1)==0:0)break;s=d+256|0;c[m>>2]=c[s>>2];c[m+4>>2]=c[s+4>>2];c[m+8>>2]=c[s+8>>2];c[m+12>>2]=c[s+12>>2];c[m+16>>2]=c[s+16>>2];c[m+20>>2]=c[s+20>>2];c[m+24>>2]=c[s+24>>2];c[m+28>>2]=c[s+28>>2];iI(d,m);aS(d,c[i>>2]|0,c[o+228>>2]|0,c[o+244>>2]|0,c[o+212>>2]|0)}while(0);EI(d,e);f=c[(c[f>>2]|0)+12>>2]|0;if(f|0)BK(d,4,f);do if(!g){if((c[i>>2]|0)==0?(b[j>>1]&1)==0:0)break;bS(d)}while(0);FI(d,e,p);PR(d);if(h|0){lA(n);c[o+212>>2]=h}l=q;return}function zI(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;h=l;l=l+32|0;d=h+24|0;b=h+16|0;j=h+8|0;f=h;g=a+196|0;i=a+188|0;c[b>>2]=c[g>>2];c[b+4>>2]=c[g+4>>2];c[d>>2]=c[i>>2];c[d+4>>2]=c[i+4>>2];CI(j,b,d);i=c[j+4>>2]|0;e=g;c[e>>2]=c[j>>2];c[e+4>>2]=i;if(!((xI(a)|0)<<24>>24)){e=a+180|0;if(!(c[a+184>>2]|0))c[a+200>>2]=c[a+176>>2];else c[g>>2]=c[a+172>>2];c[b>>2]=c[g>>2];c[b+4>>2]=c[g+4>>2];c[d>>2]=c[e>>2];c[d+4>>2]=c[e+4>>2];CI(f,b,d);i=c[f+4>>2]|0;j=g;c[j>>2]=c[f>>2];c[j+4>>2]=i}l=h;return}function AI(a,b){a=a|0;b=b|0;var d=0;d=c[b>>2]|0;a=a+160|0;if(!d)c[a>>2]=(c[a>>2]|0)+1;else{c[a>>2]=c[d>>2];c[b>>2]=d+4}return}function BI(a){a=a|0;NR(a);$H(a);return}function CI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=(c[d+4>>2]|0)+(c[b+4>>2]|0)|0;c[a>>2]=(c[d>>2]|0)+(c[b>>2]|0);c[a+4>>2]=e;return}function DI(a){a=a|0;var b=0.0,d=0,e=0,f=0.0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0;v=l;l=l+48|0;n=v+32|0;g=v+24|0;j=v+8|0;k=v+16|0;m=v;e=a+196|0;d=c[e>>2]|0;e=c[e+4>>2]|0;o=g;c[o>>2]=d;c[o+4>>2]=e;o=a+164|0;i=c[o>>2]|0;o=c[o+4>>2]|0;u=j;c[u>>2]=i;c[u+4>>2]=o;u=a+360|0;if(c[u>>2]|0){c[n>>2]=c[g>>2];c[n+4>>2]=c[g+4>>2];LJ(k,n);e=k;d=c[e>>2]|0;e=c[e+4>>2]|0;o=g;c[o>>2]=d;c[o+4>>2]=e;c[n>>2]=c[j>>2];c[n+4>>2]=c[j+4>>2];LJ(m,n);o=m;i=c[o>>2]|0;o=c[o+4>>2]|0;n=j;c[n>>2]=i;c[n+4>>2]=o}r=+(d|0);s=+h[a+320>>3];f=r*s-+h[a+240>>3];h[a+288>>3]=f;p=+(e|0);q=+h[a+328>>3];t=p*q-+h[a+248>>3];h[a+296>>3]=t;h[a+304>>3]=s+f;h[a+312>>3]=q+t;d=a+472|0;e=a+456|0;if(!(c[(c[a+12>>2]|0)+28>>2]|0)){c[d>>2]=c[e>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[d+12>>2]=c[e+12>>2]}else{c[d>>2]=c[((c[d>>2]|0)<(c[e>>2]|0)?d:e)>>2];n=a+476|0;c[n>>2]=c[((c[n>>2]|0)<(c[a+460>>2]|0)?d:e)+4>>2];n=a+480|0;c[n>>2]=c[((c[n>>2]|0)>(c[a+464>>2]|0)?d:e)+8>>2];n=a+484|0;c[n>>2]=c[((c[n>>2]|0)>(c[a+468>>2]|0)?d:e)+12>>2]}j=c[a+152>>2]|0;b=+h[a+336>>3];d=a+256|0;e=a+264|0;f=+h[a+344>>3];g=a+272|0;if(!(j&128)){b=b+s*(r-+(i|0)*.5);h[d>>3]=b;t=f+q*(p-+(o|0)*.5);h[e>>3]=t;r=s+b;h[g>>3]=r;f=q+t;s=b;q=r}else{q=+h[a+368>>3]*.5;s=b-q;h[d>>3]=s;r=+h[a+376>>3]*.5;t=f-r;h[e>>3]=t;q=b+q;h[g>>3]=q;f=f+r}h[a+280>>3]=f;b=+h[a+352>>3];d=a+512|0;e=a+504|0;g=(c[47187]|j&4096|0)!=0;r=+h[a+384>>3]/b;b=+h[a+392>>3]/b;if(!(c[u>>2]|0)){h[e>>3]=r-s;p=b;b=b-t}else{h[d>>3]=-f-b;p=r;f=q;d=e;b=r-s}h[d>>3]=g?-f-p:b;l=v;return} +function EI(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+48|0;q=s;o=s+40|0;p=s+36|0;r=s+32|0;e=NA(d,141280)|0;if(!e){j=1;e=137499}else{i=(a[e>>0]|0)==0;j=i&1;e=i?137499:e}h=c[b+152>>2]|0;i=(a[e>>0]|0)==116;if(!(h&256))if(i){m=(f2(e,137680)|0)==0;k=m?137499:e;m=m?1:j;n=8}else{k=e;m=j;n=8}else if(!(i?!(f2(e,137680)|0):0)){k=e;m=j;n=8}if((n|0)==8?!((m|0)!=0&(h&33554432|0)!=0):0)if(!((HJ(k,o,p)|0)<<24>>24)){hS(b,k);fS(b,137680);r=b+256|0;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];c[q+16>>2]=c[r+16>>2];c[q+20>>2]=c[r+20>>2];c[q+24>>2]=c[r+24>>2];c[q+28>>2]=c[r+28>>2];mS(b,q,1)}else{c[r>>2]=0;i=c[o>>2]|0;hS(b,i);fS(b,137680);GJ(d,r)|0;e=c[o+4>>2]|0;h=XO(d,c[47197]|0,0,0)|0;f=+g[p>>2];if(!e)iS(b,137615,h,f);else iS(b,e,h,f);r=(c[r>>2]|0)>>>1&1|2;p=b+256|0;c[q>>2]=c[p>>2];c[q+4>>2]=c[p+4>>2];c[q+8>>2]=c[p+8>>2];c[q+12>>2]=c[p+12>>2];c[q+16>>2]=c[p+16>>2];c[q+20>>2]=c[p+20>>2];c[q+24>>2]=c[p+24>>2];c[q+28>>2]=c[p+28>>2];mS(b,q,r);l6(i)}e=c[(c[(c[d+16>>2]|0)+8>>2]|0)+88>>2]|0;if(e|0)JJ(b,e);l=s;return}function FI(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=(c[a>>2]|0)+28|0;c[g>>2]=(c[g>>2]|0)+1;g=(d&4|0)!=0;if(!g)GI(a,b,d);a:do if(!(d&1)){if(d&16|0){WR(a);f=gC(b)|0;while(1){if(!f)break;e=UA(b,f)|0;while(1){if(!e)break;II(a,e);e=WA(b,e)|0}f=hC(b,f)|0}XR(a);UR(a);e=gC(b)|0;while(1){if(!e)break;HI(a,e);e=hC(b,e)|0}VR(a);break}if(!(d&8)){f=gC(b)|0;while(1){if(!f)break a;HI(a,f);e=UA(b,f)|0;while(1){if(!e)break;HI(a,c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0);II(a,e);e=WA(b,e)|0}f=hC(b,f)|0}}UR(a);e=gC(b)|0;while(1){if(!e)break;if((JI(b,e)|0)<<24>>24)HI(a,e);e=hC(b,e)|0}VR(a);WR(a);f=gC(b)|0;while(1){if(!f)break;e=UA(b,f)|0;while(1){if(!e)break;if((KI(b,e)|0)<<24>>24)II(a,e);e=WA(b,e)|0}f=hC(b,f)|0}XR(a)}else{UR(a);e=gC(b)|0;while(1){if(!e)break;HI(a,e);e=hC(b,e)|0}VR(a);WR(a);f=gC(b)|0;while(1){if(!f)break;e=UA(b,f)|0;while(1){if(!e)break;II(a,e);e=WA(b,e)|0}f=hC(b,f)|0}XR(a)}while(0);if(g)GI(a,b,d);return}function GI(e,f,i){e=e|0;f=f|0;i=i|0;var j=0,k=0,m=0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;R=l;l=l+128|0;y=R+72|0;P=R+64|0;J=R+112|0;K=R;L=R+104|0;M=f+16|0;N=(i&4|0)!=0;O=e+16|0;z=K+24|0;A=K+56|0;C=K+8|0;D=K+16|0;E=K+32|0;F=K+40|0;G=K+48|0;H=(i&8|0)==0;I=L+4|0;x=1;while(1){j=c[M>>2]|0;if((x|0)>(c[j+180>>2]|0))break;w=c[(c[j+184>>2]|0)+(x<<2)>>2]|0;if((EJ(e,w)|0)<<24>>24){if(N)GI(e,w,i);FJ(e,w);j=c[O>>2]|0;s=j+208|0;if(!(c[s>>2]|0))v=(b[j+260>>1]&1)!=0;else v=1;FT(NA(w,100333)|0);t=j+212|0;u=j+228|0;q=j+244|0;r=w+16|0;if(!(N|v^1)){p=(c[r>>2]|0)+16|0;c[y>>2]=c[p>>2];c[y+4>>2]=c[p+4>>2];c[y+8>>2]=c[p+8>>2];c[y+12>>2]=c[p+12>>2];c[y+16>>2]=c[p+16>>2];c[y+20>>2]=c[p+20>>2];c[y+24>>2]=c[p+24>>2];c[y+28>>2]=c[p+28>>2];iI(e,y);aS(e,c[s>>2]|0,c[u>>2]|0,c[q>>2]|0,c[t>>2]|0)}c[J>>2]=0;j=GJ(w,J)|0;if(!j)o=0;else{jS(e,j);o=c[J>>2]&1}j=d[(c[r>>2]|0)+112>>0]|0;do if(!(j&1)){if(j&2|0){j=$O(w,c[47188]|0,106557)|0;k=$O(w,c[47189]|0,106565)|0;Q=29;break}if(j&8|0){j=$O(w,c[47192]|0,106573)|0;k=$O(w,c[47193]|0,106581)|0;Q=29;break}if(j&4|0){j=$O(w,c[47190]|0,106589)|0;k=$O(w,c[47191]|0,106597)|0;Q=29;break}j=NA(w,141126)|0;if(!j)k=0;else k=(a[j>>0]|0)==0?0:j;j=NA(w,138032)|0;if(!j)j=k;else j=(a[j>>0]|0)==0?k:j;m=NA(w,101719)|0;if(m)k=(a[m>>0]|0)==0?k:m;if(!((o|0)!=0&(k|0)!=0)){m=NA(w,141280)|0;if(m|0?a[m>>0]|0:0){k=m;Q=29;break}j=(j|0)==0?137615:j;m=(k|0)==0?135101:k;c[L>>2]=0;if(!o){k=0;o=m}else{o=m;Q=31}}else Q=29}else{j=$O(w,c[47188]|0,106541)|0;k=$O(w,c[47189]|0,106549)|0;Q=29}while(0);if((Q|0)==29){c[L>>2]=0;j=(j|0)==0?137615:j;o=(k|0)==0?135101:k;Q=31}if((Q|0)==31){Q=0;if(!((HJ(o,L,y)|0)<<24>>24)){hS(e,o);k=1}else{hS(e,c[L>>2]|0);k=c[I>>2]|0;m=XO(w,c[47197]|0,0,0)|0;n=+g[y>>2];if(!k)iS(e,137615,m,n);else iS(e,k,m,n);k=(c[J>>2]|0)>>>1&1|2}}m=c[47196]|0;if((m|0?(B=OA(w,m)|0,B|0):0)?a[B>>0]|0:0)sS(e,+YO(w,c[47196]|0,1.0,0.0));p=c[J>>2]|0;m=c[47195]|0;do if(p&4){m=XO(w,m,1,0)|0;if(m|k|0){o=c[r>>2]|0;S=o+16|0;c[K>>2]=c[S>>2];c[K+4>>2]=c[S+4>>2];c[K+8>>2]=c[S+8>>2];c[K+12>>2]=c[S+12>>2];o=o+32|0;c[E>>2]=c[o>>2];c[E+4>>2]=c[o+4>>2];c[E+8>>2]=c[o+8>>2];c[E+12>>2]=c[o+12>>2];h[D>>3]=+h[E>>3];h[z>>3]=+h[C>>3];h[G>>3]=+h[K>>3];h[A>>3]=+h[F>>3];if(!m)fS(e,137680);else fS(e,j);RM(e,K,4,p,k)}}else{if(!(p&64)){if(XO(w,m,1,0)|0){fS(e,j);S=(c[r>>2]|0)+16|0;c[y>>2]=c[S>>2];c[y+4>>2]=c[S+4>>2];c[y+8>>2]=c[S+8>>2];c[y+12>>2]=c[S+12>>2];c[y+16>>2]=c[S+16>>2];c[y+20>>2]=c[S+20>>2];c[y+24>>2]=c[S+24>>2];c[y+28>>2]=c[S+28>>2];mS(e,y,k);break}if(!k)break;fS(e,137680);S=(c[r>>2]|0)+16|0;c[y>>2]=c[S>>2];c[y+4>>2]=c[S+4>>2];c[y+8>>2]=c[S+8>>2];c[y+12>>2]=c[S+12>>2];c[y+16>>2]=c[S+16>>2];c[y+20>>2]=c[S+20>>2];c[y+24>>2]=c[S+24>>2];c[y+28>>2]=c[S+28>>2];mS(e,y,k);break}S=c[r>>2]|0;p=S+16|0;c[K>>2]=c[p>>2];c[K+4>>2]=c[p+4>>2];c[K+8>>2]=c[p+8>>2];c[K+12>>2]=c[p+12>>2];S=S+32|0;c[E>>2]=c[S>>2];c[E+4>>2]=c[S+4>>2];c[E+8>>2]=c[S+8>>2];c[E+12>>2]=c[S+12>>2];h[D>>3]=+h[E>>3];h[z>>3]=+h[C>>3];h[G>>3]=+h[K>>3];h[A>>3]=+h[F>>3];if(!(XO(w,m,1,0)|0))fS(e,137680);else fS(e,j);if((hI(e,K,o,0)|0)>1){c[P>>2]=HB(w)|0;dA(3,100701,P)|0}S=(c[r>>2]|0)+16|0;c[y>>2]=c[S>>2];c[y+4>>2]=c[S+4>>2];c[y+8>>2]=c[S+8>>2];c[y+12>>2]=c[S+12>>2];c[y+16>>2]=c[S+16>>2];c[y+20>>2]=c[S+20>>2];c[y+24>>2]=c[S+24>>2];c[y+28>>2]=c[S+28>>2];mS(e,y,0)}while(0);l6(c[L>>2]|0);j=c[(c[r>>2]|0)+12>>2]|0;if(j|0)BK(e,5,j);if(v){if(N){S=(c[r>>2]|0)+16|0;c[y>>2]=c[S>>2];c[y+4>>2]=c[S+4>>2];c[y+8>>2]=c[S+8>>2];c[y+12>>2]=c[S+12>>2];c[y+16>>2]=c[S+16>>2];c[y+20>>2]=c[S+20>>2];c[y+24>>2]=c[S+24>>2];c[y+28>>2]=c[S+28>>2];iI(e,y);aS(e,c[s>>2]|0,c[u>>2]|0,c[q>>2]|0,c[t>>2]|0)}bS(e)}a:do if(!H){k=gC(w)|0;while(1){if(!k)break a;HI(e,k);j=UA(w,k)|0;while(1){if(!j)break;II(e,j);j=WA(w,j)|0}k=hC(w,k)|0}}while(0);IJ(e,f);if(!N)GI(e,w,i)}x=x+1|0}l=R;return}function HI(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;j=l;l=l+32|0;e=j;h=c[b>>2]|0;i=d+16|0;a:do if(((c[(c[i>>2]|0)+8>>2]|0?(wJ(b,uC(d)|0,d)|0)<<24>>24:0)?(k=b+256|0,c[e>>2]=c[k>>2],c[e+4>>2]=c[k+4>>2],c[e+8>>2]=c[k+8>>2],c[e+12>>2]=c[k+12>>2],c[e+16>>2]=c[k+16>>2],c[e+20>>2]=c[k+20>>2],c[e+24>>2]=c[k+24>>2],c[e+28>>2]=c[k+28>>2],(xJ(d,e)|0)<<24>>24):0)?(f=(c[i>>2]|0)+116|0,g=c[h+28>>2]|0,(a[f>>0]|0)!=(g|0)):0){a[f>>0]=g;pS(b,HB(d)|0);e=_O(d,c[47231]|0,195341)|0;if(a[e>>0]|0)pS(b,e);e=_O(d,c[47219]|0,195341)|0;b:do if(a[e>>0]|0){NI(e)|0;e=188404;while(1){f=e;e=e+4|0;f=c[f>>2]|0;if(!f)break b;if((a[f>>0]|0)!=105)continue;if(!(f2(f,134636)|0))break a}}while(0);yJ(b,d);lb[c[(c[(c[(c[i>>2]|0)+8>>2]|0)+4>>2]|0)+20>>2]&63](b,d);e=c[(c[i>>2]|0)+108>>2]|0;if(e|0?a[e+81>>0]|0:0)BK(b,10,e);zJ(b)}while(0);l=j;return}function II(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=l;l=l+32|0;g=h;e=b+256|0;c[g>>2]=c[e>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];c[g+12>>2]=c[e+12>>2];c[g+16>>2]=c[e+16>>2];c[g+20>>2]=c[e+20>>2];c[g+24>>2]=c[e+24>>2];c[g+28>>2]=c[e+28>>2];a:do if((LI(d,g)|0)<<24>>24?(f=d+-48|0,(MI(b,d)|0)<<24>>24):0){i=d+48|0;e=D3(HB(c[((c[d>>2]&3|0)==3?d:i)+40>>2]|0)|0)|0;e=k6(e+3+(D3(HB(c[((c[d>>2]&3|0)==2?d:f)+40>>2]|0)|0)|0)|0)|0;O3(e,HB(c[((c[d>>2]&3|0)==3?d:i)+40>>2]|0)|0)|0;i=(uB(uC(c[((c[d>>2]&3|0)==2?d:f)+40>>2]|0)|0)|0)==0;g=e+(D3(e)|0)|0;if(i){a[g>>0]=a[142050]|0;a[g+1>>0]=a[142051]|0;a[g+2>>0]=a[142052]|0}else{a[g>>0]=a[138041]|0;a[g+1>>0]=a[138042]|0;a[g+2>>0]=a[138043]|0}g6(e,HB(c[((c[d>>2]&3|0)==2?d:f)+40>>2]|0)|0)|0;pS(b,e);l6(e);e=_O(d,c[47260]|0,195341)|0;if(a[e>>0]|0)pS(b,e);e=_O(d,c[47254]|0,195341)|0;b:do if(!(a[e>>0]|0))e=0;else{NI(e)|0;e=188404;while(1){f=e;e=e+4|0;f=c[f>>2]|0;if(!f){e=188404;break b}if((a[f>>0]|0)!=105)continue;if(!(f2(f,134636)|0))break a}}while(0);OI(b,d,e);PI(b,d,e);QI(b)}while(0);l=h;return}function JI(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+16|0;a=1;while(1){e=c[d>>2]|0;if((a|0)>(c[e+180>>2]|0)){a=1;break}if(!(EC(c[(c[e+184>>2]|0)+(a<<2)>>2]|0,b)|0))a=a+1|0;else{a=0;break}}return a|0}function KI(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+16|0;a=1;while(1){e=c[d>>2]|0;if((a|0)>(c[e+180>>2]|0)){a=1;break}if(!(EC(c[(c[e+184>>2]|0)+(a<<2)>>2]|0,b)|0))a=a+1|0;else{a=0;break}}return a|0}function LI(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+64|0;i=j+32|0;f=j;g=b+16|0;b=c[g>>2]|0;e=c[b+8>>2]|0;if((e|0)!=0?(e=e+8|0,c[f>>2]=c[e>>2],c[f+4>>2]=c[e+4>>2],c[f+8>>2]=c[e+8>>2],c[f+12>>2]=c[e+12>>2],c[f+16>>2]=c[e+16>>2],c[f+20>>2]=c[e+20>>2],c[f+24>>2]=c[e+24>>2],c[f+28>>2]=c[e+28>>2],c[i>>2]=c[d>>2],c[i+4>>2]=c[d+4>>2],c[i+8>>2]=c[d+8>>2],c[i+12>>2]=c[d+12>>2],c[i+16>>2]=c[d+16>>2],c[i+20>>2]=c[d+20>>2],c[i+24>>2]=c[d+24>>2],c[i+28>>2]=c[d+28>>2],(vJ(f,i)|0)!=0):0)b=1;else h=3;do if((h|0)==3){e=c[b+96>>2]|0;if(e){c[i>>2]=c[d>>2];c[i+4>>2]=c[d+4>>2];c[i+8>>2]=c[d+8>>2];c[i+12>>2]=c[d+12>>2];c[i+16>>2]=c[d+16>>2];c[i+20>>2]=c[d+20>>2];c[i+24>>2]=c[d+24>>2];c[i+28>>2]=c[d+28>>2];if((gQ(e,i)|0)<<24>>24){b=1;break}b=c[g>>2]|0}b=c[b+108>>2]|0;if((b|0?a[b+81>>0]|0:0)?(c[i>>2]=c[d>>2],c[i+4>>2]=c[d+4>>2],c[i+8>>2]=c[d+8>>2],c[i+12>>2]=c[d+12>>2],c[i+16>>2]=c[d+16>>2],c[i+20>>2]=c[d+20>>2],c[i+24>>2]=c[d+24>>2],c[i+28>>2]=c[d+28>>2],(gQ(b,i)|0)<<24>>24):0){b=1;break}b=0}while(0);l=j;return b|0}function MI(b,d){b=b|0;d=d|0;var e=0,f=0;a:do if((c[b+156>>2]|0)>=2?(e=_O(d,c[47259]|0,195341)|0,(rJ(b,e)|0)<<24>>24==0):0)if(!(a[e>>0]|0)){e=0;while(1){if((e|0)>=2){e=0;break a}f=(e|0)==1;f=_O(c[((c[d>>2]&3|0)==((f?2:3)|0)?d:d+((f?-1:1)*48|0)|0)+40>>2]|0,c[47229]|0,195341)|0;if(!(a[f>>0]|0)){e=1;break a}if(!((rJ(b,f)|0)<<24>>24))e=e+1|0;else{e=1;break}}}else e=0;else e=1;while(0);return e|0}function NI(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+192|0;q=r+24|0;p=r+16|0;o=r+8|0;n=r;i=r+48|0;m=r+32|0;if(a[100583]|0){hA(188668,128,195106);a[100583]=0}hA(m,128,r+56|0);c[i>>2]=b;j=m+4|0;k=m+8|0;d=0;h=0;a:while(1){b:while(1){e=pJ(i,m)|0;f=d<<24>>24!=0;if(!e){d=22;break a}g=d<<24>>24==0;switch(e|0){case 40:if(f){d=8;break a}else{d=1;continue b}case 41:if(g){d=10;break a}else{d=0;continue b}default:break b}}f=188404+(h<<2)|0;if(g){if((h|0)==63){d=13;break}e=c[47168]|0;if(e>>>0>=(c[47169]|0)>>>0){iA(188668,1)|0;e=c[47168]|0}c[47168]=e+1;a[e>>0]=0;c[f>>2]=c[47168];f=h+1|0}else f=h;e=c[j>>2]|0;if(e>>>0>=(c[k>>2]|0)>>>0){iA(m,1)|0;e=c[j>>2]|0}a[e>>0]=0;e=c[m>>2]|0;c[j>>2]=e;kA(188668,e)|0;e=c[47168]|0;if(e>>>0>=(c[47169]|0)>>>0){iA(188668,1)|0;e=c[47168]|0}c[47168]=e+1;a[e>>0]=0;h=f}do if((d|0)==8){c[n>>2]=b;dA(1,100584,n)|0;c[47101]=0;lA(m)}else if((d|0)==10){c[o>>2]=b;dA(1,100618,o)|0;c[47101]=0;lA(m)}else if((d|0)==13){c[p>>2]=b;dA(0,100646,p)|0;c[f>>2]=0;lA(m)}else if((d|0)==22){if(f){c[q>>2]=b;dA(1,100669,q)|0;c[47101]=0;lA(m);break}c[188404+(h<<2)>>2]=0;lA(m);d=c[47168]|0;if(d>>>0>=(c[47169]|0)>>>0){iA(188668,1)|0;d=c[47168]|0}a[d>>0]=0;c[47168]=c[47167]}while(0);l=r;return 188404}function OI(d,f,g){d=d|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=l;l=l+160|0;B=E+24|0;z=E+20|0;y=E+16|0;k=E;n=E+32|0;A=c[d+152>>2]|0;c[B>>2]=0;c[z>>2]=0;c[y>>2]=0;C=_H(d)|0;c[C+4>>2]=3;c[C+8>>2]=f;c[C+12>>2]=9;w=f+16|0;t=c[(c[w>>2]|0)+96>>2]|0;D=C+260|0;if((t|0?(a[t+82>>0]|0)==0:0)?(cP(NA(f,100406)|0,0)|0)<<24>>24:0)b[D>>1]=b[D>>1]|512;if(g|0?c[(c[w>>2]|0)+8>>2]|0:0)jS(d,g);g=c[47275]|0;if((g|0?(i=OA(f,g)|0,i|0):0)?a[i>>0]|0:0)sS(d,+YO(f,c[47275]|0,1.0,0.0));do if(A&16777216|0){g=f+48|0;i=C+176|0;if((e[(c[(uC(c[((c[f>>2]&3|0)==3?f:g)+40>>2]|0)|0)+16>>2]|0)+178>>1]|0)>2){m=+h[(c[(c[(c[((c[f>>2]&3|0)==3?f:g)+40>>2]|0)+16>>2]|0)+132>>2]|0)+16>>3]*72.0;h[i>>3]=+(~~(m+(m>=0.0?.5:-.5))|0);m=+h[(c[(c[(c[((c[f>>2]&3|0)==2?f:f+-48|0)+40>>2]|0)+16>>2]|0)+132>>2]|0)+16>>3]*72.0;h[C+184>>3]=+(~~(m+(m>=0.0?.5:-.5))|0);break}else{c[i>>2]=0;c[i+4>>2]=0;c[i+8>>2]=0;c[i+12>>2]=0;break}}while(0);r=C+200|0;s=C+204|0;q=C+192|0;if(A&32768|0){j=c[w>>2]|0;g=c[j+96>>2]|0;if(!g)g=c[q>>2]|0;else{g=c[g>>2]|0;c[q>>2]=g}i=C+196|0;c[i>>2]=g;c[s>>2]=g;c[r>>2]=g;g=c[j+108>>2]|0;if(g|0)c[i>>2]=c[g>>2];g=c[j+104>>2]|0;if(g|0)c[r>>2]=c[g>>2];g=c[j+100>>2]|0;if(g|0)c[s>>2]=c[g>>2]}t=C+208|0;if(!(A&65536))k=0;else{hA(k,128,n);c[C+212>>2]=CK(bI(d,f,k)|0,f)|0;lA(k);g=NA(f,141358)|0;if((g|0)!=0?(a[g>>0]|0)!=0:0)p=31;else{g=NA(f,111778)|0;if((g|0)!=0?(a[g>>0]|0)!=0:0)p=31;else j=0}if((p|0)==31)j=CK(g,f)|0;g=NA(f,100419)|0;i=(j|0)!=0;if((g|0)!=0?(a[g>>0]|0)!=0:0)p=36;else p=34;do if((p|0)==34){g=NA(f,100428)|0;if(g|0?a[g>>0]|0:0){p=36;break}if(i){g=Y3(j)|0;p=39}}while(0);if((p|0)==36){g=CK(g,f)|0;p=39}if((p|0)==39)c[t>>2]=g;g=NA(f,100436)|0;if((g|0)!=0?(a[g>>0]|0)!=0:0)p=44;else p=42;do if((p|0)==42){g=NA(f,100446)|0;if(g|0?a[g>>0]|0:0){p=44;break}if(i){g=Y3(j)|0;p=47}}while(0);if((p|0)==44){g=CK(g,f)|0;p=47}if((p|0)==47)c[C+216>>2]=g;g=NA(f,100455)|0;if((g|0)!=0?(a[g>>0]|0)!=0:0)p=52;else p=50;do if((p|0)==50){g=NA(f,100464)|0;if(g|0?a[g>>0]|0:0){p=52;break}if(i)c[C+220>>2]=Y3(j)|0}while(0);if((p|0)==52){c[C+220>>2]=CK(g,f)|0;b[D>>1]=b[D>>1]|128}g=NA(f,100472)|0;if((g|0)!=0?(a[g>>0]|0)!=0:0)p=59;else p=57;do if((p|0)==57){g=NA(f,100481)|0;if(g|0?a[g>>0]|0:0){p=59;break}if(i)c[C+224>>2]=Y3(j)|0}while(0);if((p|0)==59){c[C+224>>2]=CK(g,f)|0;b[D>>1]=b[D>>1]|256}k=j}o=C+244|0;do if(A&8388608){g=NA(f,141391)|0;if((g|0)!=0?(a[g>>0]|0)!=0:0)i=CK(g,f)|0;else i=0;g=NA(f,100489)|0;j=(i|0)!=0;if((g|0)!=0?(a[g>>0]|0)!=0:0){b[D>>1]=b[D>>1]|64;g=CK(g,f)|0;p=72}else p=70;if((p|0)==70?j:0){g=Y3(i)|0;p=72}if((p|0)==72)c[o>>2]=g;g=NA(f,100500)|0;if((g|0)!=0?(a[g>>0]|0)!=0:0){g=CK(g,f)|0;p=78}else p=76;if((p|0)==76?j:0){g=Y3(i)|0;p=78}if((p|0)==78)c[C+248>>2]=g;g=NA(f,100512)|0;if((g|0)!=0?(a[g>>0]|0)!=0:0){c[C+252>>2]=CK(g,f)|0;b[D>>1]=b[D>>1]|16}else p=82;if((p|0)==82?j:0)c[C+252>>2]=Y3(i)|0;g=NA(f,100523)|0;if(g|0?a[g>>0]|0:0){b[D>>1]=b[D>>1]|32;c[C+256>>2]=CK(g,f)|0;break}if(j)c[C+256>>2]=Y3(i)|0;else i=0}else i=0;while(0);do if(A&4194304|0){g=NA(f,141404)|0;if((g|0)!=0?(a[g>>0]|0)!=0:0)p=94;else p=92;do if((p|0)==92){g=NA(f,100534)|0;if(g|0?a[g>>0]|0:0){p=94;break}g=c[q>>2]|0;if(g|0)c[C+228>>2]=Y3(g)|0}while(0);if((p|0)==94){n=hJ(g,f)|0;c[C+228>>2]=CK(n,f)|0;l6(n);b[D>>1]=b[D>>1]|1}g=NA(f,100546)|0;if((g|0)!=0?(a[g>>0]|0)!=0:0){n=hJ(g,f)|0;c[C+232>>2]=CK(n,f)|0;l6(n);b[D>>1]=b[D>>1]|8}else p=100;if((p|0)==100?(u=c[q>>2]|0,u|0):0)c[C+232>>2]=Y3(u)|0;g=NA(f,100559)|0;if((g|0)!=0?(a[g>>0]|0)!=0:0){u=hJ(g,f)|0;c[C+236>>2]=CK(u,f)|0;l6(u);b[D>>1]=b[D>>1]|2}else p=105;if((p|0)==105?(v=c[r>>2]|0,v|0):0)c[C+236>>2]=Y3(v)|0;g=NA(f,100571)|0;if(g|0?a[g>>0]|0:0){v=hJ(g,f)|0;c[C+240>>2]=CK(v,f)|0;l6(v);b[D>>1]=b[D>>1]|4;break}g=c[s>>2]|0;if(g|0)c[C+240>>2]=Y3(g)|0}while(0);l6(k);l6(i);n=C+228|0;do if(A&4259840|0?(x=c[(c[w>>2]|0)+8>>2]|0,x|0):0){if(!(c[t>>2]|0)){if((A&524288|0)==0|(c[n>>2]|0)==0)break}else if(!(A&524288))break;m=+h[(c[d+16>>2]|0)+152>>3]*.5;m=m>2.0?m:2.0;i=c[x+4>>2]|0;g=0;while(1){if((g|0)>=(i|0))break;iJ(B,z,y,(c[x>>2]|0)+(g*48|0)|0,m);g=g+1|0}j=c[y>>2]|0;c[C+276>>2]=j;k=c[z>>2]|0;c[C+280>>2]=k;if(!(A&8192)){g=0;i=0;while(1){if((i|0)>=(j|0))break;g=(c[k+(i<<2)>>2]|0)+g|0;i=i+1|0}B=c[B>>2]|0;LR(d,B,B,g)|0;g=B}else g=c[B>>2]|0;c[C+284>>2]=g;c[C+264>>2]=2;c[C+272>>2]=g;c[C+268>>2]=c[k>>2]}while(0);_R(d,f);g=c[t>>2]|0;if(!((g|0)==0?!(b[D>>1]&1):0))aS(d,g,c[n>>2]|0,c[o>>2]|0,c[C+212>>2]|0);l=E;return}function PI(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0.0,R=0.0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0;T=l;l=l+240|0;P=T+224|0;O=T+208|0;z=T+144|0;y=T+112|0;S=T+64|0;C=T+48|0;D=T+32|0;E=T+16|0;F=T;G=T+192|0;H=T+176|0;A=T+160|0;B=T+128|0;c[E>>2]=0;c[E+4>>2]=0;c[E+8>>2]=0;c[E+12>>2]=0;Q=+h[(c[b+16>>2]|0)+152>>3];FT(NA(e,100333)|0);N=e+16|0;a:do if(c[(c[N>>2]|0)+8>>2]|0){R=+YO(e,c[47257]|0,1.0,0.0);k=_O(e,c[47238]|0,195341)|0;r=(f|0)!=0;b:do if(r){g=f;while(1){i=g;g=g+4|0;i=c[i>>2]|0;if(!i){p=0;break b}if((a[i>>0]|0)!=116)continue;if(!(f2(i,111418)|0)){p=1;break}}}else p=0;while(0);j=k;q=0;i=0;c:while(1){g=q+1|0;switch(a[j>>0]|0){case 0:break c;case 58:break;case 59:{g=q;i=i+1|0;break}default:g=q}j=j+1|0;q=g}o=(q|0)!=0;if((i|0)!=0&o)if(!(XI(b,e,f,k,g,R,Q)|0))break;else m=137615;else m=k;g=d[(c[N>>2]|0)+115>>0]|0;if(!(g&1))if(!(g&2))if(!(g&8))if(!(g&4)){u=m;g=$O(e,c[47239]|0,m)|0}else{j=106597;g=106589;k=188980;i=188976;n=18}else{j=106581;g=106573;k=188988;i=188984;n=18}else{j=106565;g=106557;k=188972;i=188968;n=18}else{j=106549;g=106541;k=188964;i=188960;n=18}if((n|0)==18){i=c[i>>2]|0;i=$O(e,i,YI(m,g)|0)|0;g=$O(e,c[k>>2]|0,j)|0;if((i|0)==(m|0))u=m;else{fS(b,i);u=i}}if((g|0)!=(m|0))hS(b,g);J=S+16|0;L=S+4|0;M=S+32|0;K=S+12|0;I=S+8|0;if(p<<24>>24){i=(a[u>>0]|0)==0?137615:u;g=(a[g>>0]|0)==0?137615:g;fS(b,137680);hS(b,i);o=S;m=c[c[(c[N>>2]|0)+8>>2]>>2]|0;n=o+48|0;do{c[o>>2]=c[m>>2];o=o+4|0;m=m+4|0}while((o|0)<(n|0));N=xO(S,ZI(e)|0,Q,0,0)|0;lS(b,c[N+8>>2]|0,c[N>>2]|0,1);_I(N);fS(b,i);if((g|0)!=(i|0))hS(b,g);g=c[I>>2]|0;if(g|0){N=c[S>>2]|0;c[O>>2]=c[J>>2];c[O+4>>2]=c[J+4>>2];c[O+8>>2]=c[J+8>>2];c[O+12>>2]=c[J+12>>2];c[P>>2]=c[N>>2];c[P+4>>2]=c[N+4>>2];c[P+8>>2]=c[N+8>>2];c[P+12>>2]=c[N+12>>2];XH(b,2,O,P,R,Q,g)}g=c[K>>2]|0;if(!g)break;S=(c[S>>2]|0)+((c[L>>2]|0)+-1<<4)|0;c[O>>2]=c[M>>2];c[O+4>>2]=c[M+4>>2];c[O+8>>2]=c[M+8>>2];c[O+12>>2]=c[M+12>>2];c[P>>2]=c[S>>2];c[P+4>>2]=c[S+4>>2];c[P+8>>2]=c[S+8>>2];c[P+12>>2]=c[S+12>>2];XH(b,3,O,P,R,Q,g);break}i=c[N>>2]|0;if(!o){do if(!(a[i+115>>0]&3)){if(a[u>>0]|0){fS(b,u);hS(b,g);break}fS(b,137615);if(!(a[g>>0]|0)){hS(b,137615);break}else{hS(b,g);break}}while(0);k=b+152|0;j=0;while(1){g=c[(c[N>>2]|0)+8>>2]|0;if((j|0)>=(c[g+4>>2]|0))break a;o=S;m=(c[g>>2]|0)+(j*48|0)|0;n=o+48|0;do{c[o>>2]=c[m>>2];o=o+4|0;m=m+4|0}while((o|0)<(n|0));g=c[S>>2]|0;i=c[L>>2]|0;do if(!(c[k>>2]&16384)){nS(b,g,i,0,0,0);g=c[I>>2]|0;if(g|0){H=c[S>>2]|0;c[O>>2]=c[J>>2];c[O+4>>2]=c[J+4>>2];c[O+8>>2]=c[J+8>>2];c[O+12>>2]=c[J+12>>2];c[P>>2]=c[H>>2];c[P+4>>2]=c[H+4>>2];c[P+8>>2]=c[H+8>>2];c[P+12>>2]=c[H+12>>2];XH(b,2,O,P,R,Q,g)}g=c[K>>2]|0;if(g|0){H=(c[S>>2]|0)+((c[L>>2]|0)+-1<<4)|0;c[O>>2]=c[M>>2];c[O+4>>2]=c[M+4>>2];c[O+8>>2]=c[M+8>>2];c[O+12>>2]=c[M+12>>2];c[P>>2]=c[H>>2];c[P+4>>2]=c[H+4>>2];c[P+8>>2]=c[H+8>>2];c[P+12>>2]=c[H+12>>2];XH(b,3,O,P,R,Q,g)}if((c[(c[(c[N>>2]|0)+8>>2]|0)+4>>2]|0)>1){if(!(c[I>>2]|0)){if(!(r&(c[K>>2]|0)!=0))break}else if(!r)break;jS(b,f)}}else nS(b,g,i,c[I>>2]|0,c[K>>2]|0,0);while(0);j=j+1|0}}w=c[(c[i+8>>2]|0)+4>>2]|0;v=w*48|0;x=k6(v)|0;v=k6(v)|0;t=+(q+2|0)*.5;e=C+8|0;f=D+8|0;r=E+8|0;s=F+8|0;q=0;while(1){if((q|0)>=(w|0))break;o=S;m=(c[c[(c[N>>2]|0)+8>>2]>>2]|0)+(q*48|0)|0;n=o+48|0;do{c[o>>2]=c[m>>2];o=o+4|0;m=m+4|0}while((o|0)<(n|0));g=c[L>>2]|0;c[x+(q*48|0)+4>>2]=g;c[v+(q*48|0)+4>>2]=g;k=g<<4;j=k6(k)|0;c[x+(q*48|0)>>2]=j;k=k6(k)|0;c[v+(q*48|0)>>2]=k;i=c[S>>2]|0;c[F>>2]=c[i>>2];c[F+4>>2]=c[i+4>>2];c[F+8>>2]=c[i+8>>2];c[F+12>>2]=c[i+12>>2];i=0;while(1){m=j+(i<<4)|0;n=k+(i<<4)+8|0;o=k+(i<<4)|0;p=j+(i<<4)+8|0;if((i|0)>=(g+-1|0))break;c[C>>2]=c[F>>2];c[C+4>>2]=c[F+4>>2];c[C+8>>2]=c[F+8>>2];c[C+12>>2]=c[F+12>>2];g=i+1|0;U=(c[S>>2]|0)+(g<<4)|0;c[D>>2]=c[U>>2];c[D+4>>2]=c[U+4>>2];c[D+8>>2]=c[U+8>>2];c[D+12>>2]=c[U+12>>2];if(!i){c[O>>2]=c[C>>2];c[O+4>>2]=c[C+4>>2];c[O+8>>2]=c[C+8>>2];c[O+12>>2]=c[C+12>>2];c[P>>2]=c[D>>2];c[P+4>>2]=c[D+4>>2];c[P+8>>2]=c[D+8>>2];c[P+12>>2]=c[D+12>>2];$I(G,O,P);c[m>>2]=c[G>>2];c[m+4>>2]=c[G+4>>2];c[m+8>>2]=c[G+8>>2];c[m+12>>2]=c[G+12>>2]}else{c[O>>2]=c[E>>2];c[O+4>>2]=c[E+4>>2];c[O+8>>2]=c[E+8>>2];c[O+12>>2]=c[E+12>>2];c[P>>2]=c[D>>2];c[P+4>>2]=c[D+4>>2];c[P+8>>2]=c[D+8>>2];c[P+12>>2]=c[D+12>>2];$I(H,O,P);c[m>>2]=c[H>>2];c[m+4>>2]=c[H+4>>2];c[m+8>>2]=c[H+8>>2];c[m+12>>2]=c[H+12>>2]}Y=c[S>>2]|0;V=i+2|0;Z=Y+(V<<4)|0;c[E>>2]=c[Z>>2];c[E+4>>2]=c[Z+4>>2];c[E+8>>2]=c[Z+8>>2];c[E+12>>2]=c[Z+12>>2];U=i+3|0;Y=Y+(U<<4)|0;c[F>>2]=c[Y>>2];c[F+4>>2]=c[Y+4>>2];c[F+8>>2]=c[Y+8>>2];c[F+12>>2]=c[Y+12>>2];X=j+(g<<4)|0;W=j+(V<<4)|0;c[y>>2]=c[C>>2];c[y+4>>2]=c[C+4>>2];c[y+8>>2]=c[C+8>>2];c[y+12>>2]=c[C+12>>2];c[z>>2]=c[D>>2];c[z+4>>2]=c[D+4>>2];c[z+8>>2]=c[D+8>>2];c[z+12>>2]=c[D+12>>2];c[O>>2]=c[Z>>2];c[O+4>>2]=c[Z+4>>2];c[O+8>>2]=c[Z+8>>2];c[O+12>>2]=c[Z+12>>2];c[P>>2]=c[Y>>2];c[P+4>>2]=c[Y+4>>2];c[P+8>>2]=c[Y+8>>2];c[P+12>>2]=c[Y+12>>2];aJ(A,y,z,O,P);c[W>>2]=c[A>>2];c[W+4>>2]=c[A+4>>2];c[W+8>>2]=c[A+8>>2];c[W+12>>2]=c[A+12>>2];c[X>>2]=c[A>>2];c[X+4>>2]=c[A+4>>2];c[X+8>>2]=c[A+8>>2];c[X+12>>2]=c[A+12>>2];h[o>>3]=+h[C>>3]-t*+h[m>>3];h[n>>3]=+h[e>>3]-t*+h[p>>3];h[k+(g<<4)>>3]=+h[D>>3]-t*+h[X>>3];h[k+(g<<4)+8>>3]=+h[f>>3]-t*+h[j+(g<<4)+8>>3];h[k+(V<<4)>>3]=+h[E>>3]-t*+h[W>>3];h[k+(V<<4)+8>>3]=+h[r>>3]-t*+h[j+(V<<4)+8>>3];i=U;g=c[L>>2]|0}c[O>>2]=c[E>>2];c[O+4>>2]=c[E+4>>2];c[O+8>>2]=c[E+8>>2];c[O+12>>2]=c[E+12>>2];c[P>>2]=c[F>>2];c[P+4>>2]=c[F+4>>2];c[P+8>>2]=c[F+8>>2];c[P+12>>2]=c[F+12>>2];$I(B,O,P);c[m>>2]=c[B>>2];c[m+4>>2]=c[B+4>>2];c[m+8>>2]=c[B+8>>2];c[m+12>>2]=c[B+12>>2];h[o>>3]=+h[F>>3]-t*+h[m>>3];h[n>>3]=+h[s>>3]-t*+h[p>>3];q=q+1|0}s=Y3(u)|0;f=0;r=u;i=u;j=u;g=s;while(1){g=i6(g,108285)|0;if(!g)break;e=(a[g>>0]|0)==0?137615:g;if((e|0)!=(j|0))if(!(a[(c[N>>2]|0)+115>>0]&3)){fS(b,e);hS(b,e);j=e}else j=e;m=(f|0)==0;n=(f|1|0)==1;g=0;while(1){if((g|0)>=(w|0))break;o=c[v+(g*48|0)>>2]|0;p=c[x+(g*48|0)>>2]|0;q=c[v+(g*48|0)+4>>2]|0;k=0;while(1){if((k|0)>=(q|0))break;Z=o+(k<<4)|0;h[Z>>3]=+h[p+(k<<4)>>3]+ +h[Z>>3];Z=o+(k<<4)+8|0;h[Z>>3]=+h[p+(k<<4)+8>>3]+ +h[Z>>3];k=k+1|0}nS(b,o,q,0,0,0);g=g+1|0}f=f+1|0;r=m?e:r;i=n?e:i;g=0}g=c[I>>2]|0;if(!g)i=0;else{if(i){if(!(a[(c[N>>2]|0)+115>>0]&3)){fS(b,i);hS(b,i)}}else i=0;Z=c[S>>2]|0;c[O>>2]=c[J>>2];c[O+4>>2]=c[J+4>>2];c[O+8>>2]=c[J+8>>2];c[O+12>>2]=c[J+12>>2];c[P>>2]=c[Z>>2];c[P+4>>2]=c[Z+4>>2];c[P+8>>2]=c[Z+8>>2];c[P+12>>2]=c[Z+12>>2];XH(b,2,O,P,R,Q,g)}g=c[K>>2]|0;if(g|0){if((i|0)!=(r|0)?(a[(c[N>>2]|0)+115>>0]&3)==0:0){fS(b,r);hS(b,r);g=c[K>>2]|0}Z=(c[S>>2]|0)+((c[L>>2]|0)+-1<<4)|0;c[O>>2]=c[M>>2];c[O+4>>2]=c[M+4>>2];c[O+8>>2]=c[M+8>>2];c[O+12>>2]=c[M+12>>2];c[P>>2]=c[Z>>2];c[P+4>>2]=c[Z+4>>2];c[P+8>>2]=c[Z+8>>2];c[P+12>>2]=c[Z+12>>2];XH(b,3,O,P,R,Q,g)}l6(s);g=0;while(1){if((g|0)>=(w|0))break;l6(c[x+(g*48|0)>>2]|0);l6(c[v+(g*48|0)>>2]|0);g=g+1|0}l6(x);l6(v)}while(0);l=T;return}function QI(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=l;l=l+64|0;q=D+48|0;t=D+32|0;s=D+16|0;r=D;z=c[a+16>>2]|0;A=c[z+8>>2]|0;p=z+208|0;C=z+212|0;m=z+268|0;B=z+260|0;n=z+272|0;if(!((c[p>>2]|0)==0?!(b[B>>1]&1):0))d=3;a:do if((d|0)==3?(bS(a),o=z+276|0,e=c[o>>2]|0,e|0):0){h=z+280|0;d=c[h>>2]|0;i=z+284|0;j=z+228|0;k=z+244|0;f=c[d>>2]|0;g=1;while(1){if((g|0)>=(e|0))break a;c[m>>2]=c[d+(g<<2)>>2];c[n>>2]=(c[i>>2]|0)+(f<<4);aS(a,c[p>>2]|0,c[j>>2]|0,c[k>>2]|0,c[C>>2]|0);bS(a);y=c[h>>2]|0;f=(c[y+(g<<2)>>2]|0)+f|0;g=g+1|0;e=c[o>>2]|0;d=y}}while(0);c[m>>2]=0;c[n>>2]=0;o=A+16|0;d=c[o>>2]|0;e=c[d+8>>2]|0;p=z+236|0;u=z+240|0;v=z+224|0;w=z+256|0;x=z+220|0;y=z+252|0;if(e){m=c[e>>2]|0;d=c[m>>2]|0;n=c[m+8>>2]|0;k=m+16|0;c[s>>2]=c[k>>2];c[s+4>>2]=c[k+4>>2];c[s+8>>2]=c[k+8>>2];c[s+12>>2]=c[k+12>>2];m=m+32|0;c[r>>2]=c[m>>2];c[r+4>>2]=c[m+4>>2];c[r+8>>2]=c[m+8>>2];c[r+12>>2]=c[m+12>>2];if(!n){c[t>>2]=c[d>>2];c[t+4>>2]=c[d+4>>2];c[t+8>>2]=c[d+8>>2];c[t+12>>2]=c[d+12>>2]}else{c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2]}m=b[B>>1]|0;k=c[x>>2]|0;c[q>>2]=c[t>>2];c[q+4>>2]=c[t+4>>2];c[q+8>>2]=c[t+8>>2];c[q+12>>2]=c[t+12>>2];RI(a,q,(m<<8&65535)<<16>>16>>15&255,k,(m<<14&65535)<<16>>16>>15&255);m=c[(c[o>>2]|0)+8>>2]|0;k=c[m>>2]|0;m=(c[m+4>>2]|0)+-1|0;d=c[k+(m*48|0)>>2]|0;e=c[k+(m*48|0)+4>>2]|0;n=c[k+(m*48|0)+12>>2]|0;j=k+(m*48|0)+16|0;c[s>>2]=c[j>>2];c[s+4>>2]=c[j+4>>2];c[s+8>>2]=c[j+8>>2];c[s+12>>2]=c[j+12>>2];s=k+(m*48|0)+32|0;c[r>>2]=c[s>>2];c[r+4>>2]=c[s+4>>2];c[r+8>>2]=c[s+8>>2];c[r+12>>2]=c[s+12>>2];if(!n){s=d+(e+-1<<4)|0;c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2]}else{c[t>>2]=c[r>>2];c[t+4>>2]=c[r+4>>2];c[t+8>>2]=c[r+8>>2];c[t+12>>2]=c[r+12>>2]}d=b[B>>1]|0;s=c[v>>2]|0;c[q>>2]=c[t>>2];c[q+4>>2]=c[t+4>>2];c[q+8>>2]=c[t+8>>2];c[q+12>>2]=c[t+12>>2];RI(a,q,(d<<7&65535)<<16>>16>>15&255,s,(d<<13&65535)<<16>>16>>15&255);d=c[o>>2]|0}g=c[d+96>>2]|0;h=(b[B>>1]<<12&65535)<<16>>16>>15<<16>>16;k=z+216|0;i=c[k>>2]|0;m=z+232|0;j=c[m>>2]|0;n=z+248|0;e=c[n>>2]|0;f=c[C>>2]|0;if(!((bP(_O(A,c[47255]|0,137609)|0)|0)<<24>>24))d=0;else d=c[(c[o>>2]|0)+8>>2]|0;SI(a,g,11,h,i,j,e,f,d);i=c[(c[o>>2]|0)+108>>2]|0;j=(b[B>>1]<<12&65535)<<16>>16>>15<<16>>16;h=c[k>>2]|0;g=c[m>>2]|0;e=c[n>>2]|0;f=c[C>>2]|0;if(!((bP(_O(A,c[47255]|0,137609)|0)|0)<<24>>24))d=0;else d=c[(c[o>>2]|0)+8>>2]|0;SI(a,i,11,j,h,g,e,f,d);SI(a,c[(c[o>>2]|0)+100>>2]|0,7,(b[B>>1]<<13&65535)<<16>>16>>15<<16>>16,c[v>>2]|0,c[u>>2]|0,c[w>>2]|0,c[C>>2]|0,0);SI(a,c[(c[o>>2]|0)+104>>2]|0,6,(b[B>>1]<<14&65535)<<16>>16>>15<<16>>16,c[x>>2]|0,c[p>>2]|0,c[y>>2]|0,c[C>>2]|0,0);$R(a);$H(a);l=D;return}function RI(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;j=l;l=l+16|0;h=j;i=c[a+16>>2]|0;if(!(e<<24>>24))f=c[i+208>>2]|0;if(!(g<<24>>24==0?((f|0)==0?(b[i+260>>1]&1)==0:0):0)){c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];WI(a,h)}l=j;return}function SI(b,d,e,f,g,h,i,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+16|0;o=s;r=c[b+152>>2]|0;if(d|0?a[d+81>>0]|0:0){if(!j)n=0;else{n=HK((D3(j)|0)+11|0)|0;switch(e|0){case 11:{m=108525;break}case 7:{m=101884;break}case 6:{m=101894;break}default:Aa(138697,100207,2730,100345)}c[o>>2]=j;c[o+4>>2]=m;i2(n,100361,o)|0}o=b+16|0;q=(c[o>>2]|0)+12|0;p=c[q>>2]|0;c[q>>2]=e;q=(g|0)!=0;j=(f|0)!=0;m=(r&4|0)!=0;if(!(m|(j|q)^1)){TI(b,d);aS(b,g,h,i,n)}BK(b,e,d);if(k|0)UI(b,d,k);if(j|q){if(m){TI(b,d);aS(b,g,h,i,n)}bS(b)}l6(n);c[(c[o>>2]|0)+12>>2]=p}l=s;return}function TI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0;d=c[a+16>>2]|0;e=c[a+152>>2]|0;if(e&4259840|0){f=e&131072;j=f>>>16^2;c[d+264>>2]=j;i=d+268|0;c[i>>2]=j+2;j=d+272|0;l6(c[j>>2]|0);d=HK(c[i>>2]<<4)|0;c[j>>2]=d;j=b+56|0;i=b+24|0;h[d>>3]=+h[j>>3]-+h[i>>3]*.5;g=b+64|0;b=b+32|0;h[d+8>>3]=+h[g>>3]-+h[b>>3]*.5;h[d+16>>3]=+h[j>>3]+ +h[i>>3]*.5;h[d+24>>3]=+h[g>>3]+ +h[b>>3]*.5;if(!(e&8192))LR(a,d,d,2)|0;if(!f)hK(d)}return}function UI(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0.0;o=l;l=l+96|0;g=o+80|0;i=o+32|0;j=o+16|0;k=o;f=c[d>>2]|0;while(1){m=a[f>>0]|0;if(!(m<<24>>24))break;if(!(X1(m&255)|0)){n=4;break}else f=f+1|0}if((n|0)==4){p=+h[d+24>>3];m=d+56|0;VI(i,p*.5+ +h[m>>3],+h[d+64>>3]-+h[d+32>>3]*.5);n=i+16|0;VI(j,+h[i>>3]-p,+h[i+8>>3]);c[n>>2]=c[j>>2];c[n+4>>2]=c[j+4>>2];c[n+8>>2]=c[j+8>>2];c[n+12>>2]=c[j+12>>2];n=i+32|0;c[g>>2]=c[m>>2];c[g+4>>2]=c[m+4>>2];c[g+8>>2]=c[m+8>>2];c[g+12>>2]=c[m+12>>2];oP(k,e,g);c[n>>2]=c[k>>2];c[n+4>>2]=c[k+4>>2];c[n+8>>2]=c[k+8>>2];c[n+12>>2]=c[k+12>>2];jS(b,c[(c[b>>2]|0)+336>>2]|0);fS(b,c[d+8>>2]|0);oS(b,i,3)}l=o;return}function VI(a,b,c){a=a|0;b=+b;c=+c;h[a>>3]=b;h[a+8>>3]=c;return}function WI(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0,i=0.0,j=0,k=0;d=c[a+16>>2]|0;e=c[a+152>>2]|0;if(e&4259840|0){f=e&131072;j=f>>>16^2;c[d+264>>2]=j;k=d+268|0;c[k>>2]=j+2;j=d+272|0;l6(c[j>>2]|0);d=HK(c[k>>2]<<4)|0;c[j>>2]=d;i=+h[b>>3];h[d>>3]=i+-3.0;g=+h[b+8>>3];h[d+8>>3]=g+-3.0;h[d+16>>3]=i+3.0;h[d+24>>3]=g+3.0;if(!(e&8192))LR(a,d,d,2)|0;if(!f)hK(d)}return}function XI(a,b,d,e,f,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=+h;i=+i;var j=0,k=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;I=l;l=l+256|0;C=I+224|0;B=I+208|0;j=I+192|0;E=I+144|0;F=I+96|0;G=I+48|0;D=I;k=I+240|0;e=eI(e,f,k)|0;if((e|0)>1){y=b+48|0;z=uC(c[((c[b>>2]&3|0)==3?b:y)+40>>2]|0)|0;y=HB(c[((c[b>>2]&3|0)==3?b:y)+40>>2]|0)|0;z=(uB(z)|0)!=0;A=HB(c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)|0;c[j>>2]=y;c[j+4>>2]=z?100380:100385;c[j+8>>2]=A;dA(3,100390,j)|0;if((e|0)==2)e=1;else H=4}else if((e|0)==1)e=1;else H=4;if((H|0)==4){A=b+16|0;r=c[k>>2]|0;s=r+8|0;t=G+4|0;u=E+8|0;v=E+12|0;q=(d|0)!=0;w=E+32|0;x=E+4|0;y=E+16|0;z=D+4|0;e=0;p=0;while(1){f=c[(c[A>>2]|0)+8>>2]|0;if((p|0)>=(c[f+4>>2]|0))break;j=E;f=(c[f>>2]|0)+(p*48|0)|0;b=j+48|0;do{c[j>>2]=c[f>>2];j=j+4|0;f=f+4|0}while((j|0)<(b|0));b=1;m=1.0;o=c[s>>2]|0;a:while(1){f=c[o>>2]|0;if(!f)break;k=o+4|0;n=+g[k>>2];do if(n<1.0e-05&n>-1.0e-05)f=b;else{fS(a,f);n=+g[k>>2];m=m-n;e=c[o>>2]|0;if(b|0){fJ(E,n,G,D);k=c[G>>2]|0;nS(a,k,c[t>>2]|0,0,0,0);l6(k);if(m<1.0e-05&m>-1.0e-05){H=11;break a}else{f=0;break}}if(m<1.0e-05&m>-1.0e-05){H=13;break a}j=F;f=D;b=j+48|0;do{c[j>>2]=c[f>>2];j=j+4|0;f=f+4|0}while((j|0)<(b|0));n=+g[k>>2];fJ(F,n/(m+n),G,D);l6(c[F>>2]|0);f=c[G>>2]|0;nS(a,f,c[t>>2]|0,0,0,0);l6(f);f=0}while(0);b=f;o=o+12|0}if((H|0)==11){H=0;l6(c[D>>2]|0)}else if((H|0)==13){H=0;o=c[D>>2]|0;nS(a,o,c[z>>2]|0,0,0,0);l6(o)}if(c[u>>2]|0){fS(a,c[c[s>>2]>>2]|0);hS(a,c[c[s>>2]>>2]|0);k=c[E>>2]|0;o=c[u>>2]|0;c[B>>2]=c[y>>2];c[B+4>>2]=c[y+4>>2];c[B+8>>2]=c[y+8>>2];c[B+12>>2]=c[y+12>>2];c[C>>2]=c[k>>2];c[C+4>>2]=c[k+4>>2];c[C+8>>2]=c[k+8>>2];c[C+12>>2]=c[k+12>>2];XH(a,2,B,C,h,i,o)}if(c[v>>2]|0){fS(a,e);hS(a,e);k=(c[E>>2]|0)+((c[x>>2]|0)+-1<<4)|0;o=c[v>>2]|0;c[B>>2]=c[w>>2];c[B+4>>2]=c[w+4>>2];c[B+8>>2]=c[w+8>>2];c[B+12>>2]=c[w+12>>2];c[C>>2]=c[k>>2];c[C+4>>2]=c[k+4>>2];c[C+8>>2]=c[k+8>>2];c[C+12>>2]=c[k+12>>2];XH(a,3,B,C,h,i,o)}do if((c[(c[(c[A>>2]|0)+8>>2]|0)+4>>2]|0)>1){if(!(c[u>>2]|0)){if(!(q&(c[v>>2]|0)!=0))break}else if(!q)break;jS(a,d)}while(0);p=p+1|0}fI(r);e=0}l=I;return e|0}function YI(b,d){b=b|0;d=d|0;var e=0,f=0;e=1;a:while(1){switch(a[b>>0]|0){case 0:break a;case 58:{e=e+1|0;break}default:{}}b=b+1|0}f=S((D3(d)|0)+1|0,e)|0;b=f+10|0;if((c[47165]|0)<(f|0)){c[47165]=b;b=n6(c[47166]|0,b)|0;c[47166]=b}else b=c[47166]|0;O3(b,d)|0;while(1){e=e+-1|0;b=c[47166]|0;if(!e)break;f=b+(D3(b)|0)|0;a[f>>0]=58;a[f+1>>0]=0;g6(b,d)|0}return b|0}function ZI(b){b=b|0;var d=0,e=0;d=c[47253]|0;a:do if(!d)e=7;else{d=OA(b,d)|0;switch(a[d>>0]|0){case 110:if(!(f2(d,136010)|0)){d=2;break a}else{e=7;break a}case 102:if(!(f2(d,100367)|0)){d=1;break a}else{e=7;break a}case 98:{if(!(f2(d,100375)|0)){d=3;break a}if(!(f2(d,111522)|0)){d=4;break a}else{e=7;break a}}default:{e=7;break a}}}while(0);if((e|0)==7){d=(uB(uC(c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)|0)|0)!=0;d=d?1:2}return d|0}function _I(a){a=a|0;if(a|0){l6(c[a+8>>2]|0);l6(a)}return}function $I(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0;e=+h[b>>3]-+h[c>>3];f=+h[b+8>>3]-+h[c+8>>3];d=2.0/+G(+(e*e+f*f+.0001));h[a>>3]=f*d;h[a+8>>3]=-(e*d);return}function aJ(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0;g=+h[c>>3]-+h[d>>3];i=+h[c+8>>3]-+h[d+8>>3];f=+G(+(g*g+i*i));if(f<.0001){j=+h[b>>3]-+h[e>>3];f=+h[b+8>>3]-+h[e+8>>3];i=f;g=j;f=+G(+(j*j+f*f+.0001))}j=2.0/f;h[a>>3]=j*i;h[a+8>>3]=-(g*j);return}function bJ(a,b,c){a=+a;b=+b;c=+c;return +((1.0-a/b)*c*.5)}function cJ(a,b,c){a=+a;b=+b;c=+c;return +(c*.5)}function dJ(a,b,c){a=+a;b=+b;c=+c;return +(a/b*c*.5)}function eJ(a,b,c){a=+a;b=+b;c=+c;b=a/b;return +((!(b<=.5)?1.0-b:b)*c)}function fJ(a,b,d,e){a=a|0;b=+b;d=d|0;e=e|0;var f=0,g=0,i=0.0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0;r=l;l=l+16|0;q=r;p=c[a+4>>2]|0;j=(p+-1|0)/3|0;k=d+4|0;if((p+-4|0)>>>0<3){c[k>>2]=4;c[d>>2]=HK(64)|0;c[e+4>>2]=4;p=HK(64)|0;c[e>>2]=p;iP(q,c[a>>2]|0,3,b,c[d>>2]|0,p)}else{p=HK(j<<3)|0;f=0;g=c[a>>2]|0;i=0.0;while(1){if((f|0)>=(j|0))break;s=+gJ(g);h[p+(f<<3)>>3]=s;f=f+1|0;g=g+48|0;i=i+s}b=b*i;n=0;i=0.0;while(1){f=n+1|0;o=p+(n<<3)|0;if((j|0)<=(n|0))break;i=i+ +h[o>>3];if(!(i>=b))n=f;else break}f=(f*3|0)+1|0;c[k>>2]=f;c[d>>2]=HK(f<<4)|0;f=((j-n|0)*3|0)+1|0;m=e+4|0;c[m>>2]=f;c[e>>2]=HK(f<<4)|0;f=0;while(1){if((f|0)>=(c[k>>2]|0))break;j=(c[d>>2]|0)+(f<<4)|0;g=(c[a>>2]|0)+(f<<4)|0;c[j>>2]=c[g>>2];c[j+4>>2]=c[g+4>>2];c[j+8>>2]=c[g+8>>2];c[j+12>>2]=c[g+12>>2];f=f+1|0}f=f+-4|0;g=0;while(1){j=c[a>>2]|0;k=c[e>>2]|0;if((g|0)>=(c[m>>2]|0))break;k=k+(g<<4)|0;j=j+(f<<4)|0;c[k>>2]=c[j>>2];c[k+4>>2]=c[j+4>>2];c[k+8>>2]=c[j+8>>2];c[k+12>>2]=c[j+12>>2];f=f+1|0;g=g+1|0}s=+h[o>>3];e=n*3|0;iP(q,j+(e<<4)|0,3,(b-(i-s))/s,(c[d>>2]|0)+(e<<4)|0,k);l6(p)}l=r;return}function gJ(a){a=a|0;var b=0.0,c=0.0,d=0.0,e=0.0,f=0.0;e=+h[a+16>>3];c=+h[a>>3]-e;d=+h[a+24>>3];f=+h[a+8>>3]-d;f=+G(+(c*c+f*f));c=+h[a+32>>3];e=e-c;b=+h[a+40>>3];d=d-b;d=f+ +G(+(e*e+d*d));c=c-+h[a+48>>3];b=b-+h[a+56>>3];return +(d+ +G(+(c*c+b*b)))}function hJ(b,d){b=b|0;d=d|0;d=vC(d)|0;if((a[(c[d+16>>2]|0)+115>>0]|0)==1)d=cQ(b)|0;else d=$P(b,d)|0;return oJ(d)|0}function iJ(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;q=l;l=l+1664|0;m=q+1600|0;n=q+800|0;o=q;p=IK(24)|0;c[p+16>>2]=1;j=((c[e+4>>2]|0)+-1|0)/3|0;h=0;i=p;while(1){if((h|0)>=(j|0))break;k=h*3|0;g=0;while(1){if((g|0)==4)break;r=m+(g<<4)|0;s=(c[e>>2]|0)+(g+k<<4)|0;c[r>>2]=c[s>>2];c[r+4>>2]=c[s+4>>2];c[r+8>>2]=c[s+8>>2];c[r+12>>2]=c[s+12>>2];g=g+1|0}h=h+1|0;i=jJ(m,i)|0}g=0;h=0;i=p;while(1){if(!i){h=p;g=p;break}j=c[i+16>>2]|0;k=n+(g<<4)|0;e=o+(g<<4)|0;kJ(h,i,j,k,e,f);g=g+1|0;if(!((g|0)==50|(j|0)==0)){h=i;i=j;continue}lJ(a,b,d,g,n,o);c[n>>2]=c[k>>2];c[n+4>>2]=c[k+4>>2];c[n+8>>2]=c[k+8>>2];c[n+12>>2]=c[k+12>>2];c[o>>2]=c[e>>2];c[o+4>>2]=c[e+4>>2];c[o+8>>2]=c[e+8>>2];c[o+12>>2]=c[e+12>>2];h=i;g=1;i=j}while(1){if(!h)break;s=c[h+16>>2]|0;l6(g);h=s;g=s}l=q;return}function jJ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=l;l=l+144|0;f=g+128|0;d=g+64|0;e=g;if(!(kI(a)|0)){iP(f,a,3,.5,d,e);d=jJ(e,jJ(d,b)|0)|0}else{d=b+16|0;if((c[d>>2]|0)==1){c[d>>2]=0;c[b>>2]=c[a>>2];c[b+4>>2]=c[a+4>>2];c[b+8>>2]=c[a+8>>2];c[b+12>>2]=c[a+12>>2]}d=a+48|0;c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];d=nJ(f,b)|0}l=g;return d|0}function kJ(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=+g;var i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0;t=l;l=l+96|0;p=t+80|0;o=t+64|0;n=t+48|0;q=t+32|0;r=t+16|0;s=t;c[q>>2]=c[b>>2];c[q+4>>2]=c[b+4>>2];c[q+8>>2]=c[b+8>>2];c[q+12>>2]=c[b+12>>2];m=q+8|0;b=s+8|0;k=r+8|0;do if(a){c[r>>2]=c[a>>2];c[r+4>>2]=c[a+4>>2];c[r+8>>2]=c[a+8>>2];c[r+12>>2]=c[a+12>>2];if(!d){j=+h[q>>3];h[s>>3]=j*2.0-+h[r>>3];i=+h[m>>3];h[b>>3]=i*2.0-+h[k>>3];break}else{c[s>>2]=c[d>>2];c[s+4>>2]=c[d+4>>2];c[s+8>>2]=c[d+8>>2];c[s+12>>2]=c[d+12>>2];j=+h[q>>3];i=+h[m>>3];break}}else{c[s>>2]=c[d>>2];c[s+4>>2]=c[d+4>>2];c[s+8>>2]=c[d+8>>2];c[s+12>>2]=c[d+12>>2];j=+h[q>>3];h[r>>3]=j*2.0-+h[s>>3];i=+h[m>>3];h[k>>3]=i*2.0-+h[b>>3]}while(0);c[n>>2]=c[r>>2];c[n+4>>2]=c[r+4>>2];c[n+8>>2]=c[r+8>>2];c[n+12>>2]=c[r+12>>2];c[o>>2]=c[q>>2];c[o+4>>2]=c[q+4>>2];c[o+8>>2]=c[q+8>>2];c[o+12>>2]=c[q+12>>2];c[p>>2]=c[s>>2];c[p+4>>2]=c[s+4>>2];c[p+8>>2]=c[s+8>>2];c[p+12>>2]=c[s+12>>2];v=+mJ(n,o,p);u=+I(+v)*g;g=+J(+v)*g;h[e>>3]=u+j;h[e+8>>3]=g+i;h[f>>3]=j-u;h[f+8>>3]=i-g;l=t;return}function lJ(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0;i=e<<1;j=c[d>>2]|0;k=c[b>>2]|0;h=0;l=0;while(1){if((h|0)>=(j|0))break;m=(c[k+(h<<2)>>2]|0)+l|0;h=h+1|0;l=m}m=j+1|0;c[d>>2]=m;m=KK(k,m<<2)|0;c[b>>2]=m;c[m+(h<<2)>>2]=i;c[a>>2]=KK(c[a>>2]|0,l+i<<4)|0;b=i+-1+l|0;h=0;while(1){if((h|0)>=(e|0))break;m=(c[a>>2]|0)+(h+l<<4)|0;k=f+(h<<4)|0;c[m>>2]=c[k>>2];c[m+4>>2]=c[k+4>>2];c[m+8>>2]=c[k+8>>2];c[m+12>>2]=c[k+12>>2];m=(c[a>>2]|0)+(b-h<<4)|0;k=g+(h<<4)|0;c[m>>2]=c[k>>2];c[m+4>>2]=c[k+4>>2];c[m+8>>2]=c[k+8>>2];c[m+12>>2]=c[k+12>>2];h=h+1|0}return}function mJ(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0;f=+h[b+8>>3];e=+h[b>>3];d=+O(+(+h[c+8>>3]-f),+(+h[c>>3]-e));e=+O(+(+h[a+8>>3]-f),+(+h[a>>3]-e));d=d-e;return +(e+(d>0.0?d+-6.283185307179586:d)*.5)}function nJ(a,b){a=a|0;b=b|0;var d=0;d=IK(24)|0;c[d+16>>2]=0;c[d>>2]=c[a>>2];c[d+4>>2]=c[a+4>>2];c[d+8>>2]=c[a+8>>2];c[d+12>>2]=c[a+12>>2];c[b+16>>2]=d;return d|0}function oJ(b){b=b|0;var c=0,d=0,e=0,f=0,g=0;c=b;g=b;a:while(1){d=0;while(1){e=c;c=c+1|0;e=a[e>>0]|0;if(!(e<<24>>24))break a;if(d<<24>>24){f=5;break}if(e<<24>>24!=92){f=10;break}else d=1}b:do if((f|0)==5){d=g+1|0;switch(e<<24>>24|0){case 114:{e=13;break b}case 108:case 110:{e=10;break b}default:break b}}else if((f|0)==10)d=g+1|0;while(0);a[g>>0]=e;g=d}a[g>>0]=0;return b|0}function pJ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=c[b>>2]|0;while(1){j=a[e>>0]|0;f=j<<24>>24;if(!(j<<24>>24)){h=3;break}g=e+1|0;if(j<<24>>24==44|(X1(f)|0)!=0)e=g;else break}if((h|0)==3)g=e+1|0;a:do switch(f|0){case 0:{f=0;break}case 41:case 40:{e=g;break}default:{h=d+4|0;i=d+8|0;g=j;while(1){if((qJ(g<<24>>24)|0)<<24>>24){f=1;break a}f=c[h>>2]|0;if(f>>>0>=(c[i>>2]|0)>>>0){iA(d,1)|0;f=c[h>>2]|0}c[h>>2]=f+1;a[f>>0]=g;j=e+1|0;e=j;g=a[j>>0]|0}}}while(0);c[b>>2]=e;return f|0}function qJ(a){a=a|0;switch(a|0){case 0:case 44:case 41:case 40:{a=1;break}default:a=0}return a|0}function rJ(a,b){a=a|0;b=b|0;return sJ(c[a>>2]|0,c[a+160>>2]|0,c[a+156>>2]|0,b)|0}function sJ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+160|0;k=o+20|0;m=o+16|0;n=o;c[k>>2]=0;c[m>>2]=0;hA(n,128,o+24|0);kA(n,f)|0;g=n+4|0;f=c[g>>2]|0;if(f>>>0>=(c[n+8>>2]|0)>>>0){iA(n,1)|0;f=c[g>>2]|0}a[f>>0]=0;h=c[n>>2]|0;c[g>>2]=h;i=b+300|0;j=b+296|0;f=0;g=h;a:while(1){if(f){f=1;break}f=j6(g,c[i>>2]|0,k)|0;if(!f){f=0;break}g=j6(f,c[j>>2]|0,m)|0;h=(g|0)!=0;if(h)f=j6(0,c[j>>2]|0,m)|0;else f=0;switch(((f|0)!=0&1)+(h&1)&3){case 2:{g=tJ(b,g,0)|0;f=tJ(b,f,e)|0;h=(g|0)>(f|0);f=(f&g|0)>-1&(((h?g:f)|0)>=(d|0)&((h?f:g)|0)<=(d|0));g=0;continue a}case 1:{f=(tJ(b,g,d)|0)==(d|0);g=0;continue a}default:{f=0;g=0;continue a}}}lA(n);l=o;return f|0}function tJ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=a[d>>0]|0;if(!(h<<24>>24==97?(f2(d,100697)|0)==0:0))f=3;a:do if((f|0)==3){if((uJ(d)|0)<<24>>24){e=d6(d)|0;break}g=c[b+308>>2]|0;if(!g)e=-1;else{b=c[b+312>>2]|0;e=1;while(1){if((e|0)>(b|0)){e=-1;break a}f=c[g+(e<<2)>>2]|0;if(h<<24>>24==(a[f>>0]|0)?(f2(d,f)|0)==0:0)break a;e=e+1|0}}}while(0);return e|0}function uJ(b){b=b|0;var c=0;while(1){c=a[b>>0]|0;if(!(c<<24>>24)){b=1;break}if(((c&255)+-48|0)>>>0<10)b=b+1|0;else{b=0;break}}return b|0}function vJ(a,b){a=a|0;b=b|0;if((+h[a+16>>3]>=+h[b>>3]?+h[b+16>>3]>=+h[a>>3]:0)?+h[a+24>>3]>=+h[b+8>>3]:0)a=+h[b+24>>3]>=+h[a+8>>3];else a=0;return a&1|0}function wJ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;a:do if((c[b+156>>2]|0)>=2?(f=_O(e,c[47229]|0,195341)|0,(rJ(b,f)|0)<<24>>24==0):0)if(!(a[f>>0]|0))if(!(ZA(d,e)|0))f=1;else{f=ZA(d,e)|0;while(1){if(!f){f=0;break a}g=_O(f,c[47259]|0,195341)|0;if(!(a[g>>0]|0)){f=1;break a}if((rJ(b,g)|0)<<24>>24){f=1;break a}f=_A(d,f,e)|0}}else f=0;else f=1;while(0);return f|0}function xJ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+64|0;e=d+32|0;f=d;a=(c[a+16>>2]|0)+48|0;c[f>>2]=c[a>>2];c[f+4>>2]=c[a+4>>2];c[f+8>>2]=c[a+8>>2];c[f+12>>2]=c[a+12>>2];c[f+16>>2]=c[a+16>>2];c[f+20>>2]=c[a+20>>2];c[f+24>>2]=c[a+24>>2];c[f+28>>2]=c[a+28>>2];c[e>>2]=c[b>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];c[e+16>>2]=c[b+16>>2];c[e+20>>2]=c[b+20>>2];c[e+24>>2]=c[b+24>>2];c[e+28>>2]=c[b+28>>2];b=(vJ(f,e)|0)&255;l=d;return b|0}function yJ(a,d){a=a|0;d=d|0;var f=0,g=0.0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0.0,w=0.0;s=c[a+152>>2]|0;t=_H(a)|0;c[t+4>>2]=2;c[t+8>>2]=d;c[t+12>>2]=8;n=d+16|0;if(s&16777216|0){if((e[(c[(uC(d)|0)+16>>2]|0)+178>>1]|0)>2){g=+h[(c[(c[n>>2]|0)+132>>2]|0)+16>>3]*72.0;g=+(~~(g+(g>=0.0?.5:-.5))|0)}else g=0.0;h[t+168>>3]=g}AJ(a,c[(c[n>>2]|0)+104>>2]|0,d);do if(s&4259840|0){if((c[t+208>>2]|0)==0?(b[t+260>>1]&1)==0:0)break;q=UM(d)|0;l=c[n>>2]|0;g=+h[l+16>>3];r=+h[l+24>>3];l=BJ(d)|0;a:do if((q|2|0)==3){m=c[(c[n>>2]|0)+12>>2]|0;if(!((CJ(m)|0)<<24>>24))f=0;else f=(c[m+4>>2]|l|0)!=0;o=t+264|0;if(!((s&524288|0)==0|((m|0)==0|f))){i=m+8|0;p=c[i>>2]|0;p=(p|0)<3?1:p;j=m+4|0;k=c[j>>2]|0;k=(k|0)>1?k:1;q=c[m+44>>2]|0;f=NA(d,103006)|0;if(!f)f=0;else f=d6(f)|0;f=(f+-4|0)>>>0>56?20:f;if(!(c[j>>2]|l)){c[o>>2]=0;i=HK(32)|0;f=c[n>>2]|0;w=+h[f+88>>3];h[i>>3]=g-w;v=+h[f+80>>3]*.5;h[i+8>>3]=r-v;h[i+16>>3]=g+w;h[i+24>>3]=r+v;f=2;break}i=c[i>>2]|0;if(((i|0)<3?+h[m+32>>3]==0.0:0)?+h[m+24>>3]==0.0:0){if(c[m>>2]|0){c[o>>2]=1;i=HK(32)|0;h[i>>3]=g;h[i+8>>3]=r;f=(k<<1)+-1|0;h[i+16>>3]=g+ +h[q+(f<<4)>>3];h[i+24>>3]=r+ +h[q+(f<<4)+8>>3];f=2;break}c[o>>2]=2;i=(k<<1)+-1|0;i=DJ(+h[q+(i<<4)>>3],+h[q+(i<<4)+8>>3],f)|0;j=0;while(1){if((j|0)>=(f|0))break a;q=i+(j<<4)|0;h[q>>3]=g+ +h[q>>3];q=i+(j<<4)+8|0;h[q>>3]=r+ +h[q>>3];j=j+1|0}}m=S(i,k+-1|0)|0;c[o>>2]=2;if((i|0)<(f|0)){i=HK(p<<4)|0;f=0;while(1){if((f|0)>=(p|0)){f=p;break a}o=f+m|0;h[i+(f<<4)>>3]=g+ +h[q+(o<<4)>>3];h[i+(f<<4)+8>>3]=r+ +h[q+(o<<4)+8>>3];f=f+1|0}}else{l=(i|0)/(f|0)|0;i=HK(f<<4)|0;j=0;k=0;while(1){if((j|0)>=(f|0))break a;p=k+m|0;h[i+(j<<4)>>3]=g+ +h[q+(p<<4)>>3];h[i+(j<<4)+8>>3]=r+ +h[q+(p<<4)+8>>3];j=j+1|0;k=k+l|0}}}else{f=o;u=32}}else{f=t+264|0;u=32}while(0);if((u|0)==32){c[f>>2]=0;i=HK(32)|0;f=c[n>>2]|0;h[i>>3]=g-+h[f+88>>3];w=+h[f+80>>3]*.5;h[i+8>>3]=r-w;h[i+16>>3]=g+ +h[f+96>>3];h[i+24>>3]=r+w;f=2}if(!(s&8192))LR(a,i,i,f)|0;c[t+272>>2]=i;c[t+268>>2]=f}while(0);FT(NA(d,100333)|0);YR(a,d);return}function zJ(a){a=a|0;ZR(a);$H(a);return}function AJ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+144|0;j=m;f=NA(e,141358)|0;i=NA(e,141404)|0;k=NA(e,141391)|0;hA(j,128,m+16|0);if(!d)h=0;else h=c[d>>2]|0;if(!((f|0)!=0?(a[f>>0]|0)!=0:0))f=NA(e,111778)|0;g=bI(b,e,j)|0;if(!i)d=0;else d=hJ(i,e)|0;aI(b,h,f,d,k,g,e)|0;l6(d);lA(j);l=m;return}function BJ(b){b=b|0;var d=0,e=0;b=$O(b,c[47219]|0,195341)|0;a:do if(!(a[b>>0]|0))b=0;else{NI(b)|0;b=0;d=188404;while(1){e=c[d>>2]|0;if(!e)break a;e=(f2(e,111402)|0)==0;b=e?1:b;d=d+4|0}}while(0);return b|0}function CJ(a){a=a|0;var b=0.0;if(((c[a+8>>2]|0)==4?(b=+h[a+16>>3],((~~(b+(b>=0.0?.5:-.5))|0)%90|0|0)==0):0)?+h[a+24>>3]==0.0:0)a=+h[a+32>>3]==0.0&1;else a=0;return a|0}function DJ(a,b,c){a=+a;b=+b;c=c|0;var d=0.0,e=0,f=0.0,g=0;f=6.283185307179586/+(c|0);g=HK(c<<4)|0;d=0.0;e=0;while(1){if((e|0)>=(c|0))break;h[g+(e<<4)>>3]=+I(+d)*a;h[g+(e<<4)+8>>3]=+J(+d)*b;d=f+d;e=e+1|0}return g|0}function EJ(b,d){b=b|0;d=d|0;var e=0;a:do if((c[b+156>>2]|0)>=2?(e=_O(d,DA(d,0,101811,0)|0,195341)|0,(rJ(b,e)|0)<<24>>24==0):0)if(!(a[e>>0]|0)){e=gC(d)|0;while(1){if(!e){e=0;break a}if((wJ(b,d,e)|0)<<24>>24){e=1;break a}e=hC(d,e)|0}}else e=0;else e=1;while(0);return e|0}function FJ(a,b){a=a|0;b=b|0;var d=0;d=_H(a)|0;c[d+4>>2]=1;c[d+8>>2]=b;c[d+12>>2]=1;AJ(a,c[(c[b+16>>2]|0)+12>>2]|0,b);SR(a,b);return}function GJ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;b=NA(b,141385)|0;a:do if((b|0)!=0?(a[b>>0]|0)!=0:0){NI(b)|0;e=188404;b=0;while(1){g=e;while(1){f=c[g>>2]|0;if(!f){e=188404;break a}e=g+4|0;if(!(f2(f,111402)|0)){f=1;break}if(!(f2(f,106635)|0)){e=g;h=9;break}if(!(f2(f,106642)|0)){e=g;h=11;break}if(!(f2(f,106617)|0)){e=g;h=13;break}else g=e}if((h|0)==9)while(1){h=0;i=e;e=e+4|0;f=c[e>>2]|0;c[i>>2]=f;if(!f){e=g;f=3;break}else h=9}else if((h|0)==11)while(1){h=0;f=e;e=e+4|0;i=c[e>>2]|0;c[f>>2]=i;if(!i){e=g;f=64;break}else h=11}else if((h|0)==13)while(1){h=0;f=e;e=e+4|0;i=c[e>>2]|0;c[f>>2]=i;if(!i){e=g;f=4;break}else h=13}b=b|f}}else{e=0;b=0}while(0);c[d>>2]=b;return e|0}function HJ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,m=0;k=l;l=l+16|0;i=k;j=k+4|0;c[j>>2]=0;m=(eI(b,0,j)|0)==0;j=c[j>>2]|0;if((m?(f=c[j>>2]|0,(f|0)>=2):0)?(h=j+8|0,(c[c[h>>2]>>2]|0)!=0):0){if((f|0)>2)dA(0,100716,i)|0;m=IK((D3(b)|0)+1|0)|0;c[d>>2]=m;O3(m,c[c[h>>2]>>2]|0)|0;if(!(c[(c[h>>2]|0)+12>>2]|0))c[d+4>>2]=0;else{m=c[d>>2]|0;m=m+((D3(m)|0)+1)|0;c[d+4>>2]=m;O3(m,c[(c[h>>2]|0)+12>>2]|0)|0}b=c[h>>2]|0;do if(!(a[b+8>>0]|0))if(!(a[b+20>>0]|0)){g[e>>2]=0.0;break}else{g[e>>2]=1.0-+g[b+16>>2];break}else c[e>>2]=c[b+4>>2];while(0);fI(j);b=1}else{c[d>>2]=0;fI(j);b=0}l=k;return b|0}function IJ(a,b){a=a|0;b=b|0;TR(a,b);$H(a);return}function JJ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,i=0,j=0.0,k=0,m=0,n=0,o=0.0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0;A=l;l=l+96|0;s=A+48|0;v=A+16|0;z=A+8|0;y=A;w=A+80|0;c[w>>2]=1e3;f=IK(16e3)|0;x=a+256|0;e=1;d=1;i=0;t=0;u=c[b+8>>2]|0;while(1){if((t|0)>=(c[b>>2]|0))break;p=c[u>>2]|0;k=u+80|0;m=f+8|0;q=u+8|0;n=q+4|0;a:do switch(p|0){case 1:case 0:{c[v>>2]=c[k>>2];c[v+4>>2]=c[k+4>>2];c[v+8>>2]=c[k+8>>2];c[v+12>>2]=c[k+12>>2];c[v+16>>2]=c[k+16>>2];c[v+20>>2]=c[k+20>>2];c[v+24>>2]=c[k+24>>2];c[v+28>>2]=c[k+28>>2];c[s>>2]=c[x>>2];c[s+4>>2]=c[x+4>>2];c[s+8>>2]=c[x+8>>2];c[s+12>>2]=c[x+12>>2];c[s+16>>2]=c[x+16>>2];c[s+20>>2]=c[x+20>>2];c[s+24>>2]=c[x+24>>2];c[s+28>>2]=c[x+28>>2];if(vJ(v,s)|0){B=+h[q>>3];j=+h[u+24>>3];h[f>>3]=B-j;o=+h[u+16>>3];r=+h[u+32>>3];h[m>>3]=o-r;h[f+16>>3]=B+j;h[f+24>>3]=o+r;kS(a,f,2,(p|0)==0?d:0)}break}case 3:case 2:{c[v>>2]=c[k>>2];c[v+4>>2]=c[k+4>>2];c[v+8>>2]=c[k+8>>2];c[v+12>>2]=c[k+12>>2];c[v+16>>2]=c[k+16>>2];c[v+20>>2]=c[k+20>>2];c[v+24>>2]=c[k+24>>2];c[v+28>>2]=c[k+28>>2];c[s>>2]=c[x>>2];c[s+4>>2]=c[x+4>>2];c[s+8>>2]=c[x+8>>2];c[s+12>>2]=c[x+12>>2];c[s+16>>2]=c[x+16>>2];c[s+20>>2]=c[x+20>>2];c[s+24>>2]=c[x+24>>2];c[s+28>>2]=c[x+28>>2];if(vJ(v,s)|0){f=KJ(f,w,c[n>>2]|0,c[q>>2]|0)|0;lS(a,f,c[q>>2]|0,(c[u>>2]|0)==2?d:0)}break}case 5:case 4:{c[v>>2]=c[k>>2];c[v+4>>2]=c[k+4>>2];c[v+8>>2]=c[k+8>>2];c[v+12>>2]=c[k+12>>2];c[v+16>>2]=c[k+16>>2];c[v+20>>2]=c[k+20>>2];c[v+24>>2]=c[k+24>>2];c[v+28>>2]=c[k+28>>2];c[s>>2]=c[x>>2];c[s+4>>2]=c[x+4>>2];c[s+8>>2]=c[x+8>>2];c[s+12>>2]=c[x+12>>2];c[s+16>>2]=c[x+16>>2];c[s+20>>2]=c[x+20>>2];c[s+24>>2]=c[x+24>>2];c[s+28>>2]=c[x+28>>2];if(vJ(v,s)|0){f=KJ(f,w,c[n>>2]|0,c[q>>2]|0)|0;nS(a,f,c[q>>2]|0,0,0,(c[u>>2]|0)==4?d&255:0)}break}case 6:{c[v>>2]=c[k>>2];c[v+4>>2]=c[k+4>>2];c[v+8>>2]=c[k+8>>2];c[v+12>>2]=c[k+12>>2];c[v+16>>2]=c[k+16>>2];c[v+20>>2]=c[k+20>>2];c[v+24>>2]=c[k+24>>2];c[v+28>>2]=c[k+28>>2];c[s>>2]=c[x>>2];c[s+4>>2]=c[x+4>>2];c[s+8>>2]=c[x+8>>2];c[s+12>>2]=c[x+12>>2];c[s+16>>2]=c[x+16>>2];c[s+20>>2]=c[x+20>>2];c[s+24>>2]=c[x+24>>2];c[s+28>>2]=c[x+28>>2];if(vJ(v,s)|0){f=KJ(f,w,c[n>>2]|0,c[q>>2]|0)|0;oS(a,f,c[q>>2]|0)}break}case 7:{c[v>>2]=c[k>>2];c[v+4>>2]=c[k+4>>2];c[v+8>>2]=c[k+8>>2];c[v+12>>2]=c[k+12>>2];c[v+16>>2]=c[k+16>>2];c[v+20>>2]=c[k+20>>2];c[v+24>>2]=c[k+24>>2];c[v+28>>2]=c[k+28>>2];c[s>>2]=c[x>>2];c[s+4>>2]=c[x+4>>2];c[s+8>>2]=c[x+8>>2];c[s+12>>2]=c[x+12>>2];c[s+16>>2]=c[x+16>>2];c[s+20>>2]=c[x+20>>2];c[s+24>>2]=c[x+24>>2];c[s+28>>2]=c[x+28>>2];if(vJ(v,s)|0){h[f>>3]=+h[q>>3];h[m>>3]=+h[u+16>>3];q=c[u+112>>2]|0;c[s>>2]=c[f>>2];c[s+4>>2]=c[f+4>>2];c[s+8>>2]=c[f+8>>2];c[s+12>>2]=c[f+12>>2];eS(a,s,q)}break}case 8:{hS(a,c[q>>2]|0);d=1;break}case 9:{fS(a,c[q>>2]|0);d=1;break}case 13:{d=u+16|0;if((c[q>>2]|0)!=2){p=c[d+36>>2]|0;q=c[p+12>>2]|0;B=+g[p+8>>2];d=~~(+O(+(+h[u+40>>3]-+h[u+24>>3]),+(+h[u+32>>3]-+h[d>>3]))*180.0/3.141592653589793);hS(a,c[p+4>>2]|0);iS(a,q,d,B);d=2;break a}q=c[u+68>>2]|0;k=c[q+4>>2]|0;m=c[q+12>>2]|0;r=+g[q+8>>2];o=+h[u+40>>3];j=+h[d>>3];if(o==j?+h[u+48>>3]==+h[u+24>>3]:0)d=0;else d=~~(+L(+((j-o)/+h[u+32>>3]))*180.0/3.141592653589793);hS(a,k);iS(a,m,d,r);d=3;break}case 14:{dA(0,100782,y)|0;break}case 12:{if(!e)e=0;else{dA(0,100822,z)|0;e=0}break}case 11:{NI(c[q>>2]|0)|0;jS(a,188404);i=188404;break}default:{}}while(0);t=t+1|0;u=u+120|0}if(i|0)jS(a,c[(c[a>>2]|0)+336>>2]|0);l6(f);l=A;return}function KJ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=c[b>>2]|0;f=g<<1;f=(f|0)>(e|0)?f:e;if((g|0)<(e|0)){a=KK(a,f<<4)|0;c[b>>2]=f}b=0;while(1){if((b|0)>=(e|0))break;h[a+(b<<4)>>3]=+h[d+(b*24|0)>>3];h[a+(b<<4)+8>>3]=+h[d+(b*24|0)+8>>3];b=b+1|0}return a|0}function LJ(a,b){a=a|0;b=b|0;var d=0;d=c[b>>2]|0;c[a>>2]=c[b+4>>2];c[a+4>>2]=d;return}function MJ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;g=d+16|0;f=1;while(1){d=c[g>>2]|0;if((f|0)>(c[d+180>>2]|0))break;e=c[(c[d+184>>2]|0)+(f<<2)>>2]|0;MJ(b,e);d=NA(e,141126)|0;if(d|0?a[d>>0]|0:0)fS(b,d);d=NA(e,138032)|0;if(d|0?a[d>>0]|0:0)fS(b,d);d=NA(e,141280)|0;if(d|0?a[d>>0]|0:0)fS(b,d);d=NA(e,101719)|0;if(d|0?a[d>>0]|0:0)hS(b,d);d=NA(e,101747)|0;if(d|0?a[d>>0]|0:0)fS(b,d);f=f+1|0}return}function NJ(a){a=a|0;var b=0,d=0,e=0;b=c[47171]|0;if(!b){b=Sz(20672,c[4591]|0)|0;c[47171]=b}if(!(eb[c[b>>2]&63](b,a,4)|0)){d=c[47171]|0;e=c[d>>2]|0;b=Y3(a)|0;eb[e&63](d,b,1)|0;b=1}else b=0;return b|0}function OJ(a,b,c){a=a|0;b=b|0;c=c|0;l6(b);return}function PJ(a){a=a|0;var b=0;b=c[47172]|0;if(!a){if((b|0)>0?(b=b+-1|0,c[47172]=b,(b|0)==0):0){L3(1,c[47173]|0)|0;l6(c[47173]|0)}}else{c[47172]=b+1;if(!b){c[47173]=Y3(L3(1,0)|0)|0;L3(1,153740)|0}}return}function QJ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0;v=l;l=l+96|0;s=v+72|0;r=v+56|0;q=v+48|0;u=v+32|0;t=v+24|0;f=v+8|0;e=v;if(a[195234]|0)RO();do if((RC(d,137786,0,1)|0)!=0?(p=d+16|0,(c[(c[p>>2]|0)+8>>2]|0)!=0):0){RJ(d);SJ(b,d);TJ(b,d);PJ(1);k=b+56|0;m=b+184|0;n=b+192|0;o=b+28|0;j=CF(b)|0;a:while(1){if(!j){i=33;break}e=c[k>>2]|0;f=j+20|0;if(!e){c[f>>2]=0;e=0}else{c[f>>2]=c[e+8>>2];e=c[e+12>>2]|0}c[j+24>>2]=e;c[j+12>>2]=b;c[j+28>>2]=c[m>>2];c[j+620>>2]=25812;c[j+624>>2]=c[6481];if(!(c[(c[p>>2]|0)+8>>2]|0)){i=13;break}f=j+52|0;i=HR(j,c[f>>2]|0)|0;c[j+56>>2]=i;switch(i|0){case 999:{i=16;break a}case 21:{e=1;break}case 24:{e=520;break}default:e=UJ(d)|0}g=j+152|0;c[g>>2]=c[g>>2]|e;e=c[n>>2]|0;do if(!e)i=24;else{if(c[e+152>>2]&32|0?(f2(c[f>>2]|0,c[e+52>>2]|0)|0)==0:0){e=c[47174]|0;if(!e){i=27;break}c[e+8>>2]=j;c[j+36>>2]=c[e+36>>2];i=29;break}JR(e);c[n>>2]=0;c[o>>2]=0;i=24}while(0);if((i|0)==24){c[47174]=0;i=27}if((i|0)==27?(i=0,(IR(j)|0)==0):0){c[n>>2]=j;i=29}if((i|0)==29){c[j+8>>2]=0;c[j+104>>2]=25928;VJ(j);WJ(j);XJ(j,d);YJ(j,d);ZJ(j,d);if(!(c[g>>2]&128))qI(j,d);c[47174]=j}j=DF(b)|0}if((i|0)==13){dA(1,100980,t)|0;PJ(0);if(!(a[195234]|0)){e=-1;break}e=c[15715]|0;t=HB(d)|0;w=+SO();c[u>>2]=t;h[u+8>>3]=w;z4(e,100951,u)|0;e=-1;break}else if((i|0)==16){c[q>>2]=c[f>>2];dA(1,101001,q)|0;PJ(0);if(!(a[195234]|0)){e=-1;break}e=c[15715]|0;u=HB(d)|0;w=+SO();c[r>>2]=u;h[r+8>>3]=w;z4(e,100951,r)|0;e=-1;break}else if((i|0)==33){PJ(0);if(!(a[195234]|0)){e=0;break}e=c[15715]|0;u=HB(d)|0;w=+SO();c[s>>2]=u;h[s+8>>3]=w;z4(e,100951,s)|0;e=0;break}}else i=5;while(0);if((i|0)==5){dA(1,100903,e)|0;if(!(a[195234]|0))e=-1;else{e=c[15715]|0;u=HB(d)|0;w=+SO();c[f>>2]=u;h[f+8>>3]=w;z4(e,100951,f)|0;e=-1}}l=v;return e|0}function RJ(a){a=a|0;var b=0;b=gC(a)|0;while(1){if(!b)break;cK(a,b);b=hC(a,b)|0}return}function SJ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0.0;o=l;l=l+32|0;k=o+24|0;f=o+16|0;j=o+8|0;n=o;c[b+168>>2]=d;g=b+293|0;a[g>>0]=0;e=NA(d,105797)|0;if(e|0?(c[f>>2]=j,c[f+4>>2]=n,i=q4(e,105804,f)|0,(i|0)>0):0){p=+h[j>>3]*72.0;e=b+208|0;h[e>>3]=p;h[b+200>>3]=p;if((i|0)!=1)h[e>>3]=+h[n>>3]*72.0;a[g>>0]=1}f=b+292|0;a[f>>0]=0;e=NA(d,101403)|0;if(e|0?(c[k>>2]=j,c[k+4>>2]=n,m=q4(e,105804,k)|0,(m|0)>0):0){p=+h[j>>3]*72.0;e=b+224|0;h[e>>3]=p;h[b+216>>3]=p;if((m|0)!=1)h[e>>3]=+h[n>>3]*72.0;a[f>>0]=1}e=b+294|0;a[e>>0]=0;f=b+232|0;g=d+16|0;n=(c[(c[g>>2]|0)+8>>2]|0)+48|0;c[f>>2]=c[n>>2];c[f+4>>2]=c[n+4>>2];c[f+8>>2]=c[n+8>>2];c[f+12>>2]=c[n+12>>2];f=c[(c[g>>2]|0)+8>>2]|0;if(+h[f+48>>3]>.001?+h[f+56>>3]>.001:0)a[e>>0]=1;c[b+288>>2]=a[f+81>>0]|0?90:0;e=b+196|0;c[e>>2]=101407;f=NA(d,101410)|0;if(f|0?a[f>>0]|0:0)c[e>>2]=f;n=b+256|0;m=(c[g>>2]|0)+16|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];c[n+16>>2]=c[m+16>>2];c[n+20>>2]=c[m+20>>2];c[n+24>>2]=c[m+24>>2];c[n+28>>2]=c[m+28>>2];c[47195]=DA(d,0,101773,0)|0;c[47196]=DA(d,0,101764,0)|0;c[b+320>>2]=$O(0,c[47213]|0,108295)|0;h[b+328>>3]=+YO(0,c[47212]|0,14.0,1.0);c[b+336>>2]=20708;c[b+188>>2]=HB(d)|0;l=o;return}function TJ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=b+304|0;f=c[e>>2]|0;if(f|0){l6(f);c[e>>2]=0}g=b+308|0;e=c[g>>2]|0;if(e|0){l6(e);c[g>>2]=0}h=b+316|0;e=c[h>>2]|0;if(e|0){l6(e);c[h>>2]=0}e=NA(d,101154)|0;f=b+312|0;if(e){c[f>>2]=aK(b,d,e)|0;e=NA(d,101161)|0;if(e|0?a[e>>0]|0:0)c[h>>2]=bK(b,e)|0}else{c[g>>2]=0;c[f>>2]=1}return}function UJ(b){b=b|0;var c=0;b=NA(b,101122)|0;a:do if(!b)b=0;else{c=b+1|0;switch(a[b>>0]|0){case 110:{if(!(f2(c,101134)|0))b=1;else{b=0;break a}break}case 101:{if(!(f2(c,101144)|0))b=16;else{b=0;break a}break}default:{b=0;break a}}}while(0);return b|0}function VJ(b){b=b|0;var d=0,e=0.0,f=0;d=c[b>>2]|0;f=b+240|0;if(!(a[d+292>>0]|0)){if((c[b+56>>2]|0)==300)e=+h[(c[b+68>>2]|0)+8>>3];else e=4.0;h[b+248>>3]=e;h[f>>3]=e}else{b=d+216|0;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2]}return}function WJ(b){b=b|0;var d=0,e=0;d=c[b>>2]|0;e=b+416|0;a:do if(!(a[d+293>>0]|0))switch(c[b+56>>2]|0){case 300:{d=(c[b+84>>2]|0)+8|0;c[e>>2]=c[d>>2];c[e+4>>2]=c[d+4>>2];c[e+8>>2]=c[d+8>>2];c[e+12>>2]=c[d+12>>2];break a}case 30:case 21:case 22:case 4:case 3:case 2:{h[b+424>>3]=36.0;h[e>>3]=36.0;break a}default:{c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;break a}}else{d=d+200|0;c[e>>2]=c[d>>2];c[e+4>>2]=c[d+4>>2];c[e+8>>2]=c[d+8>>2];c[e+12>>2]=c[d+12>>2]}while(0);return}function XJ(b,d){b=b|0;d=d|0;var e=0.0,f=0,g=0;g=c[(c[b>>2]|0)+192>>2]|0;e=+h[(c[(c[d+16>>2]|0)+8>>2]|0)+24>>3];d=b+432|0;f=b+440|0;do if(!(e!=0.0)){if(g|0?a[g+128>>0]|0:0){g=g+112|0;c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];break}if((c[b+56>>2]|0)==300){g=(c[b+84>>2]|0)+40|0;c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];break}else{h[f>>3]=96.0;h[d>>3]=96.0;break}}else{h[f>>3]=e;h[d>>3]=e}while(0);return}function YJ(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0.0,j=0.0,k=0.0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;B=l;l=l+112|0;u=B+80|0;v=B+56|0;t=B+40|0;w=B+32|0;x=B+24|0;y=B+16|0;z=B+8|0;A=B;m=c[b>>2]|0;p=+h[m+272>>3];r=+h[m+280>>3];q=+h[m+256>>3];s=+h[m+264>>3];f=+h[b+240>>3];e=q-f;h[b+208>>3]=e;i=+h[b+248>>3];j=s-i;h[b+216>>3]=j;f=p+f;h[b+224>>3]=f;i=r+i;h[b+232>>3]=i;e=f-e;j=i-j;h[y>>3]=1.0;g=c[(c[d+16>>2]|0)+8>>2]|0;i=+h[g+64>>3];do if(i>.001?(k=+h[g+72>>3],k>.001):0){e=e==0.0?i:e;f=j==0.0?k:j;if(!(if&(i>e&(a[g+80>>0]|0)!=0)):0){k=e;j=f;i=1.0;break}o=i/e>3]=i;k=e;j=f}else{k=e;i=1.0}while(0);f=(p+q)*.5;h[z>>3]=f;e=(r+s)*.5;h[A>>3]=e;c[b+360>>2]=c[m+288>>2];k=k*i;h[w>>3]=k;j=j*i;h[x>>3]=j;o=NA(d,101053)|0;if(o){m=k6((D3(o)|0)+1|0)|0;n=k6((D3(o)|0)+1|0)|0;c[t>>2]=w;c[t+4>>2]=x;c[t+8>>2]=y;c[t+12>>2]=m;g=d+60|0;do if((q4(o,101062,t)|0)==4){g=qC(c[g>>2]|0,m,0)|0;if(g|0){v=c[g+16>>2]|0;h[z>>3]=+h[v+16>>3];h[A>>3]=+h[v+24>>3]}}else{c[v>>2]=w;c[v+4>>2]=x;c[v+8>>2]=y;c[v+12>>2]=m;c[v+16>>2]=n;if((q4(o,101082,v)|0)!=4){c[u>>2]=w;c[u+4>>2]=x;c[u+8>>2]=y;c[u+12>>2]=z;c[u+16>>2]=A;q4(o,101102,u)|0;break}g=qC(c[g>>2]|0,m,0)|0;if(g|0){v=c[g+16>>2]|0;h[z>>3]=+h[v+16>>3];h[A>>3]=+h[v+24>>3]}}while(0);l6(m);l6(n);k=+h[w>>3];j=+h[x>>3];i=+h[y>>3];f=+h[z>>3];e=+h[A>>3]}h[b+368>>3]=k;h[b+376>>3]=j;h[b+352>>3]=i;h[b+336>>3]=f;h[b+344>>3]=e;l=B;return}function ZJ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0;M=l;l=l+224|0;J=M+200|0;x=M+176|0;C=M+152|0;G=M+120|0;D=M+96|0;F=M+80|0;e=M+184|0;t=M+168|0;u=M+144|0;w=M+136|0;v=M+112|0;y=M+64|0;z=M+48|0;A=M+32|0;B=M+16|0;K=M+8|0;L=M;s=c[b>>2]|0;c[F>>2]=0;c[F+4>>2]=0;c[F+8>>2]=0;c[F+12>>2]=0;H=b+368|0;c[G>>2]=c[H>>2];c[G+4>>2]=c[H+4>>2];c[G+8>>2]=c[H+8>>2];c[G+12>>2]=c[H+12>>2];H=b+360|0;if(c[H>>2]|0){c[J>>2]=c[G>>2];c[J+4>>2]=c[G+4>>2];c[J+8>>2]=c[G+8>>2];c[J+12>>2]=c[G+12>>2];_J(e,J);c[G>>2]=c[e>>2];c[G+4>>2]=c[e+4>>2];c[G+8>>2]=c[e+8>>2];c[G+12>>2]=c[e+12>>2]}E=b+416|0;c[D>>2]=c[E>>2];c[D+4>>2]=c[E+4>>2];c[D+8>>2]=c[E+8>>2];c[D+12>>2]=c[E+12>>2];E=D+8|0;I=G+8|0;q=C+8|0;o=b+204|0;f=b+164|0;i=b+168|0;if((a[s+294>>0]|0)!=0?(c[b+152>>2]&32|0)!=0:0){m=+h[s+232>>3]-+h[D>>3]*2.0;h[C>>3]=m;k=+h[s+240>>3]-+h[E>>3]*2.0;h[q>>3]=k;if(!(m<.0001)){p=+h[G>>3];e=~~(p/m);c[f>>2]=e;if(p-m*+(e|0)>.0001){e=e+1|0;r=8}}else{e=1;r=8}if((r|0)==8)c[f>>2]=e;j=+h[I>>3];if(!(k<.0001)){f=~~(j/k);c[i>>2]=f;if(j-k*+(f|0)>.0001){f=f+1|0;r=12}}else{f=1;r=12}if((r|0)==12)c[i>>2]=f;c[o>>2]=S(f,e)|0;g=+h[(+h[G>>3]>3];h[G>>3]=g;e=G;j=+h[(j>3];r=21}else{if(c[b+68>>2]|0){e=c[b+84>>2]|0;g=+h[e+24>>3]-+h[D>>3]*2.0;g=g<0.0?0.0:g;h[C>>3]=g;p=+h[e+32>>3]-+h[E>>3]*2.0;h[q>>3]=p;if(p<0.0){e=q;r=17}else j=g}else{h[q>>3]=0.0;e=C;r=17}if((r|0)==17){h[e>>3]=0.0;j=+h[C>>3]}c[o>>2]=1;c[i>>2]=1;c[f>>2]=1;g=+h[G>>3];if(j>3]=g;m=g}else m=j;j=+h[q>>3];k=+h[I>>3];if(j>3]=j;p=+h[q>>3]}n=+h[D>>3];q=b+432|0;k=+h[q>>3]*(m+n*2.0)/72.0;c[b+448>>2]=~~(k+(k>=0.0?.5:-.5));k=+h[E>>3];r=b+440|0;j=+h[r>>3]*(p+k*2.0)/72.0;c[b+452>>2]=~~(j+(j>=0.0?.5:-.5));i=b+188|0;o=b+180|0;e=b+172|0;f=s+196|0;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;$J(t,b,a[c[f>>2]>>0]|0);s=t;t=c[s+4>>2]|0;e=o;c[e>>2]=c[s>>2];c[e+4>>2]=t;$J(u,b,a[(c[f>>2]|0)+1>>0]|0);e=u;u=c[e>>2]|0;e=c[e+4>>2]|0;t=i;c[t>>2]=u;c[t+4>>2]=e;u=u+(c[o>>2]|0)|0;if(!((((u|0)>-1?u:0-u|0)|0)==1?(u=e+(c[b+184>>2]|0)|0,(((u|0)>-1?u:0-u|0)|0)==1):0)){$J(w,b,66);t=w;w=c[t+4>>2]|0;u=o;c[u>>2]=c[t>>2];c[u+4>>2]=w;$J(v,b,76);u=v;v=c[u+4>>2]|0;w=i;c[w>>2]=c[u>>2];c[w+4>>2]=v;c[x>>2]=c[f>>2];dA(0,101033,x)|0}e=F+8|0;if(a[(c[(c[d+16>>2]|0)+8>>2]|0)+82>>0]|0){if(m>g){m=(m-g)*.5;h[F>>3]=m}else m=0.0;j=+h[I>>3];if(p>j){j=(p-j)*.5;h[e>>3]=j}else j=0.0}else{j=0.0;m=0.0}if(!(c[H>>2]|0))i=1;else{c[J>>2]=c[G>>2];c[J+4>>2]=c[G+4>>2];c[J+8>>2]=c[G+8>>2];c[J+12>>2]=c[G+12>>2];_J(y,J);c[G>>2]=c[y>>2];c[G+4>>2]=c[y+4>>2];c[G+8>>2]=c[y+8>>2];c[G+12>>2]=c[y+12>>2];c[J>>2]=c[C>>2];c[J+4>>2]=c[C+4>>2];c[J+8>>2]=c[C+8>>2];c[J+12>>2]=c[C+12>>2];_J(z,J);c[C>>2]=c[z>>2];c[C+4>>2]=c[z+4>>2];c[C+8>>2]=c[z+8>>2];c[C+12>>2]=c[z+12>>2];c[J>>2]=c[D>>2];c[J+4>>2]=c[D+4>>2];c[J+8>>2]=c[D+8>>2];c[J+12>>2]=c[D+12>>2];_J(A,J);c[D>>2]=c[A>>2];c[D+4>>2]=c[A+4>>2];c[D+8>>2]=c[A+8>>2];c[D+12>>2]=c[A+12>>2];c[J>>2]=c[F>>2];c[J+4>>2]=c[F+4>>2];c[J+8>>2]=c[F+8>>2];c[J+12>>2]=c[F+12>>2];_J(B,J);c[F>>2]=c[B>>2];c[F+4>>2]=c[B+4>>2];c[F+8>>2]=c[B+8>>2];c[F+12>>2]=c[B+12>>2];n=+h[D>>3];m=+h[F>>3];k=+h[E>>3];j=+h[e>>3];g=+h[G>>3];i=(c[H>>2]|0)==0}n=n+m;h[b+384>>3]=n;j=k+j;h[b+392>>3]=j;m=n+g;h[b+400>>3]=m;N=+h[I>>3];p=j+N;h[b+408>>3]=p;k=+h[b+352>>3];h[b+320>>3]=g/k;h[b+328>>3]=N/k;k=+h[q>>3];n=n*k/72.0;f=b+456|0;c[f>>2]=~~(n+(n>=0.0?.5:-.5));n=+h[r>>3];j=j*n/72.0;c[b+460>>2]=~~(j+(j>=0.0?.5:-.5));m=k*m/72.0;e=b+464|0;c[e>>2]=~~(m+(m>=0.0?.5:-.5));p=n*p/72.0;c[b+468>>2]=~~(p+(p>=0.0?.5:-.5));if(!i){c[J>>2]=c[f>>2];c[J+4>>2]=c[f+4>>2];LJ(K,J);I=K;K=c[I+4>>2]|0;b=f;c[b>>2]=c[I>>2];c[b+4>>2]=K;c[J>>2]=c[e>>2];c[J+4>>2]=c[e+4>>2];LJ(L,J);b=L;K=c[b+4>>2]|0;L=e;c[L>>2]=c[b>>2];c[L+4>>2]=K}l=M;return}function _J(a,b){a=a|0;b=b|0;var c=0.0;c=+h[b>>3];h[a>>3]=+h[b+8>>3];h[a+8>>3]=c;return}function $J(a,b,d){a=a|0;b=b|0;d=d|0;d=(d<<24>>24)+-66|0;switch(d>>>1|d<<31|0){case 9:{c[b+176>>2]=(c[b+168>>2]|0)+-1;b=0;d=-1;break}case 0:{b=0;d=1;break}case 5:{b=1;d=0;break}case 8:{c[b+172>>2]=(c[b+164>>2]|0)+-1;b=-1;d=0;break}default:{b=0;d=0}}c[a>>2]=b;c[a+4>>2]=d;return}function aK(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;g=j;f=NA(d,101274)|0;i=b+296|0;c[i>>2]=(f|0)==0?101283:f;d=NA(d,101287)|0;f=b+300|0;d=(d|0)==0?101300:d;c[f>>2]=d;d=h6(c[i>>2]|0,d)|0;if(d|0){c[g>>2]=a[d>>0];dA(0,101302,g)|0;c[f>>2]=195341}d=Y3(e)|0;c[b+304>>2]=d;h=b+308|0;f=0;b=0;while(1){e=i6(d,c[i>>2]|0)|0;if(!e)break;g=b+1|0;if((b|0)<(f|0))d=c[h>>2]|0;else{f=f+128|0;d=c[h>>2]|0;b=f<<2;if(!d)d=IK(b)|0;else d=KK(d,b)|0;c[h>>2]=d}c[d+(g<<2)>>2]=e;b=g;d=0}if(b|0){i=KK(c[h>>2]|0,(b<<2)+8|0)|0;c[h>>2]=i;c[i>>2]=0;c[(c[h>>2]|0)+(b+1<<2)>>2]=0}l=j;return b|0}function bK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;k=m;j=a+312|0;d=IK((c[j>>2]<<2)+8|0)|0;e=0;i=1;while(1){g=c[j>>2]|0;h=e+1|0;f=d+(h<<2)|0;if((i|0)>(g|0))break;if((sJ(a,i,g,b)|0)<<24>>24){c[f>>2]=i;e=h}i=i+1|0}if(!e){c[k>>2]=b;dA(0,101173,k)|0;l6(d);d=0}else{c[d>>2]=e;c[f>>2]=(c[j>>2]|0)+1}l=m;return d|0}function cK(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,g=0.0;d=c[b+16>>2]|0;g=+h[d+16>>3];h[d+48>>3]=g-+h[d+88>>3];f=+h[d+24>>3];e=+h[d+80>>3]*.5;h[d+56>>3]=f-e;h[d+64>>3]=g+ +h[d+96>>3];h[d+72>>3]=f+e;b=UA(a,b)|0;while(1){if(!b)break;dK(b);b=WA(a,b)|0}return}function dK(a){a=a|0;a=c[(c[a+16>>2]|0)+8>>2]|0;if(a|0)eK(a);return}function eK(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=l;l=l+240|0;v=C+192|0;u=C+176|0;w=C+64|0;x=C+32|0;y=C;z=C+144|0;A=C+112|0;B=a+4|0;if((c[B>>2]|0)<=0)Aa(101441,100207,3994,101455);b=c[a>>2]|0;d=w;e=b;f=d+48|0;do{c[d>>2]=c[e>>2];d=d+4|0;e=e+4|0}while((d|0)<(f|0));d=v;e=b;f=d+48|0;do{c[d>>2]=c[e>>2];d=d+4|0;e=e+4|0}while((d|0)<(f|0));fK(x,v);i=x+8|0;j=y+8|0;k=x+16|0;m=y+16|0;n=x+24|0;o=y+24|0;p=w+8|0;q=w+12|0;r=w+32|0;s=w+4|0;t=w+16|0;g=0;while(1){if((g|0)>=(c[B>>2]|0))break;if((g|0)>0){b=(c[a>>2]|0)+(g*48|0)|0;d=w;e=b;f=d+48|0;do{c[d>>2]=c[e>>2];d=d+4|0;e=e+4|0}while((d|0)<(f|0));d=v;e=b;f=d+48|0;do{c[d>>2]=c[e>>2];d=d+4|0;e=e+4|0}while((d|0)<(f|0));fK(y,v);h[x>>3]=+h[(+h[x>>3]<+h[y>>3]?x:y)>>3];h[i>>3]=+h[(+h[i>>3]<+h[j>>3]?x:y)+8>>3];h[k>>3]=+h[(+h[k>>3]>+h[m>>3]?x:y)+16>>3];h[n>>3]=+h[(+h[n>>3]>+h[o>>3]?x:y)+24>>3]}b=c[p>>2]|0;if(b|0){f=c[w>>2]|0;c[u>>2]=c[t>>2];c[u+4>>2]=c[t+4>>2];c[u+8>>2]=c[t+8>>2];c[u+12>>2]=c[t+12>>2];c[v>>2]=c[f>>2];c[v+4>>2]=c[f+4>>2];c[v+8>>2]=c[f+8>>2];c[v+12>>2]=c[f+12>>2];WH(z,u,v,1.0,b);c[y>>2]=c[z>>2];c[y+4>>2]=c[z+4>>2];c[y+8>>2]=c[z+8>>2];c[y+12>>2]=c[z+12>>2];c[y+16>>2]=c[z+16>>2];c[y+20>>2]=c[z+20>>2];c[y+24>>2]=c[z+24>>2];c[y+28>>2]=c[z+28>>2];h[x>>3]=+h[(+h[x>>3]<+h[y>>3]?x:y)>>3];h[i>>3]=+h[(+h[i>>3]<+h[j>>3]?x:y)+8>>3];h[k>>3]=+h[(+h[k>>3]>+h[m>>3]?x:y)+16>>3];h[n>>3]=+h[(+h[n>>3]>+h[o>>3]?x:y)+24>>3]}b=c[q>>2]|0;if(b|0){f=(c[w>>2]|0)+((c[s>>2]|0)+-1<<4)|0;c[u>>2]=c[r>>2];c[u+4>>2]=c[r+4>>2];c[u+8>>2]=c[r+8>>2];c[u+12>>2]=c[r+12>>2];c[v>>2]=c[f>>2];c[v+4>>2]=c[f+4>>2];c[v+8>>2]=c[f+8>>2];c[v+12>>2]=c[f+12>>2];WH(A,u,v,1.0,b);c[y>>2]=c[A>>2];c[y+4>>2]=c[A+4>>2];c[y+8>>2]=c[A+8>>2];c[y+12>>2]=c[A+12>>2];c[y+16>>2]=c[A+16>>2];c[y+20>>2]=c[A+20>>2];c[y+24>>2]=c[A+24>>2];c[y+28>>2]=c[A+28>>2];h[x>>3]=+h[(+h[x>>3]<+h[y>>3]?x:y)>>3];h[i>>3]=+h[(+h[i>>3]<+h[j>>3]?x:y)+8>>3];h[k>>3]=+h[(+h[k>>3]>+h[m>>3]?x:y)+16>>3];h[n>>3]=+h[(+h[n>>3]>+h[o>>3]?x:y)+24>>3]}g=g+1|0}B=a+8|0;c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];c[B+8>>2]=c[x+8>>2];c[B+12>>2]=c[x+12>>2];c[B+16>>2]=c[x+16>>2];c[B+20>>2]=c[x+20>>2];c[B+24>>2]=c[x+24>>2];c[B+28>>2]=c[x+28>>2];l=C;return}function fK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0;n=l;l=l+48|0;i=n+32|0;j=n;k=c[b+4>>2]|0;if((k|0)<=0)Aa(101471,100207,3968,101483);if(((k>>>0)%3|0|0)!=1)Aa(101493,100207,3969,101483);m=j+16|0;d=c[b>>2]|0;c[m>>2]=c[d>>2];c[m+4>>2]=c[d+4>>2];c[m+8>>2]=c[d+8>>2];c[m+12>>2]=c[d+12>>2];c[j>>2]=c[d>>2];c[j+4>>2]=c[d+4>>2];c[j+8>>2]=c[d+8>>2];c[j+12>>2]=c[d+12>>2];e=i+8|0;f=j+8|0;g=j+24|0;b=1;while(1){if((b|0)>=(k|0))break;o=+h[d+(b<<4)+8>>3];t=b+1|0;p=+h[d+(t<<4)+8>>3];r=(+h[d+(b<<4)>>3]+ +h[d+(t<<4)>>3])*.5;h[i>>3]=r;p=(o+p)*.5;h[e>>3]=p;o=+h[(+h[j>>3]>3];h[j>>3]=o;s=+h[(+h[f>>3]>3];h[f>>3]=s;r=+h[(+h[m>>3]>r?m:i)>>3];h[m>>3]=r;p=+h[(+h[g>>3]>p?m:i)+8>>3];h[g>>3]=p;t=d+(b+2<<4)|0;c[i>>2]=c[t>>2];c[i+4>>2]=c[t+4>>2];c[i+8>>2]=c[t+8>>2];c[i+12>>2]=c[t+12>>2];q=+h[i>>3];h[j>>3]=+h[(o>3];o=+h[e>>3];h[f>>3]=+h[(s>3];h[m>>3]=+h[(r>q?m:i)>>3];h[g>>3]=+h[(p>o?m:i)+8>>3];b=b+3|0}c[a>>2]=c[j>>2];c[a+4>>2]=c[j+4>>2];c[a+8>>2]=c[j+8>>2];c[a+12>>2]=c[j+12>>2];c[a+16>>2]=c[j+16>>2];c[a+20>>2]=c[j+20>>2];c[a+24>>2]=c[j+24>>2];c[a+28>>2]=c[j+28>>2];l=n;return}function gK(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,g=0.0,i=0.0,j=0,k=0.0,l=0.0,m=0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0;t=+h[a>>3];u=+h[c>>3];o=t>=u;q=c+8|0;r=c+16|0;m=a+8|0;s=c+24|0;if((o?t<=+h[r>>3]:0)?(d=+h[m>>3],d>=+h[q>>3]):0)c=d<=+h[s>>3];else c=0;d=+h[b>>3];j=d>=u;a=b+8|0;if((j?d<=+h[r>>3]:0)?(e=+h[a>>3],e>=+h[q>>3]):0){a=e<=+h[s>>3];if(!(c^a))if(c&a)a=1;else{n=e;p=12}else a=0}else if(c)a=0;else{n=+h[a>>3];p=12}a:do if((p|0)==12){l=+h[m>>3];do if(t==d){u=+h[q>>3];if(o&(l>=u^n>=u)?t<=+h[r>>3]:0){a=0;break a}}else{if(l==n){if(!(o^j))break;if(!(l>=+h[q>>3]))break;if(!(l<=+h[s>>3]))break;else{a=0;break a}}k=(n-l)/(d-t);p=t>3];if(!(!(u>=f)|!(u<=d)|!(e>=i))?e<=+h[s>>3]:0){a=0;break a}g=+h[r>>3];e=e+k*(g-u);if(e>=i?!(!(g<=d)|(g>=f?!(e<=+h[s>>3]):1)):0){a=0;break a}r=l=f)|(!(d>=u)|!(d<=g))))){a=0;break a}n=+h[s>>3];t=d+(n-i)/k;if(!(!(n<=e)|(!(n>=f)|(!(t>=u)|!(t<=g))))){a=0;break a}}while(0);a=-1}while(0);return a|0}function hK(a){a=a|0;var b=0,c=0.0;b=a+16|0;c=+h[b>>3];h[a+32>>3]=c;h[a+48>>3]=c;h[a+40>>3]=+h[a+24>>3];h[a+56>>3]=+h[a+8>>3];h[b>>3]=+h[a>>3];return}function iK(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,g=0.0,i=0.0;if((c[47175]|0)!=(d|0)){X3(+(d|0)/6.283185307179586,186496,186504);c[47175]=d}f=+h[b>>3];i=+h[23313];g=+h[b+8>>3];e=+h[23312];h[a>>3]=f*i-g*e;h[a+8>>3]=i*g+f*e;return}function jK(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0.0,i=0,j=0,k=0;k=l;l=l+16|0;f=k;e=+h[b>>3];i=b+8|0;g=+h[i>>3];a:do switch(d|0){case 0:{j=11;break}case 90:{h[b>>3]=g;e=-e;j=10;break}case 180:{e=-g;j=10;break}case 270:{h[b>>3]=g;j=10;break}default:{if((d|0)<0){c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];kK(a,f,0-d|0);break a}if((d|0)>360){c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];jK(a,f,(d>>>0)%360|0);break a}else{c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];iK(a,f,d);break a}}}while(0);if((j|0)==10){h[i>>3]=e;j=11}if((j|0)==11){c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2]}l=k;return}function kK(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0.0,j=0,k=0,m=0;m=l;l=l+16|0;g=m;e=+h[b>>3];j=b+8|0;f=+h[j>>3];i=-f;a:do switch(d|0){case 0:{k=10;break}case 90:{f=i;k=8;break}case 180:{e=i;k=9;break}case 270:{k=8;break}default:{if((d|0)<0){c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];jK(a,g,0-d|0);break a}if((d|0)>360){c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];kK(a,g,(d>>>0)%360|0);break a}else{c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];iK(a,g,360-d|0);break a}}}while(0);if((k|0)==8){h[b>>3]=f;k=9}if((k|0)==9){h[j>>3]=e;k=10}if((k|0)==10){c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2]}l=m;return}function lK(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,g=0.0;g=+h[c>>3];d=+h[c+8>>3];f=+h[b>>3]+d;e=+h[b+24>>3]+g;d=+h[b+16>>3]+d;h[a>>3]=+h[b+8>>3]+g;h[a+8>>3]=f;h[a+16>>3]=e;h[a+24>>3]=d;return}function mK(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,g=0.0;f=+h[a>>3];e=+h[b>>3]-f;g=+h[a+8>>3];d=+h[b+8>>3]-g;f=e*(+h[c+8>>3]-g)-d*(+h[c>>3]-f);f=f*f;return +(f<1.0e-10?0.0:f/(e*e+d*d))}function nK(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+16|0;f=g+8|0;e=g;a=NA(a,b)|0;if(a|0?(c[f>>2]=e,(q4(a,101510,f)|0)>0):0)h[d>>3]=+h[e>>3];l=g;return}function oK(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+16|0;g=n+8|0;i=n;e=HK(96)|0;m=b+16|0;c[(c[m>>2]|0)+8>>2]=e;e=NA(b,101514)|0;if(!e){e=Na(101523)|0;if(e|0)k=3}else k=3;if((k|0)==3)za(101535,e|0,1)|0;e=(pK(b)|0)&255;a[(c[m>>2]|0)+115>>0]=e;if((c[47179]|0)==0?(e=NA(b,101546)|0,c[47178]=e,(e|0)==0):0)c[47178]=c[47177];f=+YO(b,DA(b,0,101556,0)|0,0.0,0.0);h[c[(c[m>>2]|0)+8>>2]>>3]=f;e=NA(b,101564)|0;a:do if(!e)e=0;else{switch(a[e>>0]|0){case 76:{if(!(f2(e,101572)|0)){e=1;break a}break}case 66:{if(!(f2(e,101575)|0)){e=2;break a}break}case 82:{e=(f2(e,101578)|0)==0;e=e?3:0;break a}default:{e=0;break a}}e=0}while(0);c[(c[m>>2]|0)+116>>2]=e<<2|(d<<24>>24==0?0:e);f=+YO(b,DA(b,0,101581,0)|0,.25,.02);h[i>>3]=f;f=f*72.0;c[(c[m>>2]|0)+248>>2]=~~(f+(f>=0.0?.5:-.5));e=_O(b,DA(b,0,101589,0)|0,0)|0;if(e){c[g>>2]=i;if(q4(e,101510,g)|0){f=+h[i>>3];if(f<.02){h[i>>3]=.02;f=.02}}else{h[i>>3]=.5;f=.5}if(C4(e,101597)|0)a[(c[m>>2]|0)+276>>0]=1}else{h[i>>3]=.5;f=.5}f=f*72.0;c[(c[m>>2]|0)+252>>2]=~~(f+(f>=0.0?.5:-.5));i=(XO(b,DA(b,0,101605,0)|0,0,0)|0)&255;a[(c[m>>2]|0)+243>>0]=i;i=nP(_O(b,DA(b,0,101615,0)|0,0)|0,20724,20740)|0;c[(c[m>>2]|0)+244>>2]=i;qK(b);i=rK(b,101625,(c[(c[m>>2]|0)+8>>2]|0)+64|0)|0;e=c[(c[m>>2]|0)+8>>2]|0;a[e+80>>0]=i;rK(b,101630,e+48|0)|0;e=bP(NA(b,101635)|0)|0;a[(c[(c[m>>2]|0)+8>>2]|0)+82>>0]=e;e=NA(b,101642)|0;do if(!e){e=NA(b,101649)|0;if(e|0){e=(a[e>>0]|32)<<24>>24==108&1;k=27;break}e=NA(b,101661)|0;if(e|0){e=bP(e)|0;k=27}}else{e=(d6(e)|0)==90&1;k=27}while(0);if((k|0)==27)a[(c[(c[m>>2]|0)+8>>2]|0)+81>>0]=e;c[47182]=nP(NA(b,101671)|0,20756,20772)|0;a[195236]=bP(NA(b,101683)|0)|0;c[47185]=0;c[47186]=0;h[(c[(c[m>>2]|0)+8>>2]|0)+24>>3]=0.0;e=NA(b,101695)|0;if((e|0)!=0?(a[e>>0]|0)!=0:0)k=32;else k=30;if(((k|0)==30?(j=NA(b,101699)|0,j|0):0)?a[j>>0]|0:0){e=j;k=32}if((k|0)==32){f=+a6(e);h[(c[(c[m>>2]|0)+8>>2]|0)+24>>3]=f}sK(b);h[23316]=1.e+37;c[47194]=DA(b,0,101710,0)|0;c[47197]=DA(b,0,141337,0)|0;c[47198]=DA(b,0,105797,0)|0;c[47199]=DA(b,1,141351,0)|0;c[47200]=DA(b,1,141419,0)|0;c[47201]=DA(b,1,108531,0)|0;c[47202]=DA(b,1,141126,0)|0;c[47203]=DA(b,1,101719,0)|0;c[47219]=DA(b,1,141385,0)|0;c[47212]=DA(b,1,101729,0)|0;c[47213]=DA(b,1,101738,0)|0;c[47214]=DA(b,1,101747,0)|0;k=DA(b,1,108525,0)|0;c[47216]=k;if(!k)c[47216]=DA(b,1,108525,105794)|0;c[47217]=DA(b,1,101757,0)|0;c[47220]=DA(b,1,101605,0)|0;c[47234]=DA(b,1,101764,0)|0;c[47223]=DA(b,1,101710,0)|0;c[47215]=DA(b,1,105797,0)|0;c[47221]=DA(b,1,141379,0)|0;c[47222]=DA(b,1,101773,0)|0;c[47225]=DA(b,1,101785,0)|0;c[47224]=DA(b,1,101649,0)|0;c[47226]=DA(b,1,101790,0)|0;c[47227]=DA(b,1,141327,0)|0;c[47228]=DA(b,1,137598,0)|0;c[47218]=DA(b,1,101801,0)|0;c[47229]=DA(b,1,101811,0)|0;c[47230]=DA(b,1,101817,0)|0;c[47231]=DA(b,1,101823,0)|0;c[47232]=DA(b,1,101831,0)|0;c[47233]=DA(b,1,101840,0)|0;c[47235]=DA(b,1,141337,0)|0;c[47236]=DA(b,2,101842,0)|0;c[47238]=DA(b,2,141126,0)|0;c[47239]=DA(b,2,101719,0)|0;c[47248]=DA(b,2,101729,0)|0;c[47249]=DA(b,2,101738,0)|0;c[47250]=DA(b,2,101747,0)|0;c[47251]=DA(b,2,108525,0)|0;c[47252]=DA(b,2,101757,0)|0;c[47261]=DA(b,2,101849,0)|0;c[47253]=DA(b,2,101860,0)|0;c[47264]=DA(b,2,101864,0)|0;c[47265]=DA(b,2,101874,0)|0;c[47266]=DA(b,2,101884,0)|0;c[47267]=DA(b,2,101894,0)|0;c[47268]=DA(b,2,101904,0)|0;c[47269]=DA(b,2,101918,0)|0;c[47270]=DA(b,2,101932,0)|0;c[47271]=DA(b,2,101947,0)|0;c[47272]=DA(b,2,101961,0)|0;c[47237]=DA(b,2,101972,0)|0;c[47256]=DA(b,2,101605,0)|0;c[47254]=DA(b,2,141385,0)|0;c[47255]=DA(b,2,101979,0)|0;c[47257]=DA(b,2,101988,0)|0;c[47258]=DA(b,2,101998,0)|0;c[47259]=DA(b,2,101811,0)|0;c[47260]=DA(b,2,101823,0)|0;c[47273]=DA(b,2,102009,0)|0;c[47274]=DA(b,2,102018,0)|0;c[47275]=DA(b,2,101764,0)|0;e=ZH(b)|0;c[(c[(c[m>>2]|0)+8>>2]|0)+88>>2]=e;e=NA(b,141363)|0;if(e|0?a[e>>0]|0:0){b=CK(e,b)|0;c[(c[(c[m>>2]|0)+8>>2]|0)+92>>2]=b}l=n;return}function pK(a){a=a|0;var b=0,d=0;d=l;l=l+16|0;b=d;a=$O(a,DA(a,0,102108,0)|0,102116)|0;if(((((((C3(a,102122)|0)!=0?(C3(a,102130)|0)!=0:0)?(C3(a,102137)|0)!=0:0)?(C3(a,102140)|0)!=0:0)?(C3(a,102151)|0)!=0:0)?(C3(a,102162)|0)!=0:0)?(C3(a,102172)|0)!=0:0)if((C3(a,102183)|0)!=0?(C3(a,102189)|0)!=0:0)if((C3(a,102116)|0)!=0?(C3(a,102194)|0)!=0:0){c[b>>2]=a;dA(0,102199,b)|0;a=0}else a=0;else a=2;else a=1;l=d;return a|0}function qK(b){b=b|0;var d=0.0,e=0,f=0;e=NA(b,102066)|0;a:do if(e|0?(f=a[e>>0]|0,f<<24>>24):0){b=b+16|0;switch(f<<24>>24|0){case 97:{if(f<<24>>24!=97)break a;if(f2(e,102072)|0)break a;c[(c[(c[b>>2]|0)+8>>2]|0)+84>>2]=4;break a}case 99:{if(f<<24>>24!=99)break a;if(f2(e,102077)|0)break a;c[(c[(c[b>>2]|0)+8>>2]|0)+84>>2]=3;break a}case 101:{if(f<<24>>24!=101)break a;if(f2(e,102086)|0)break a;c[(c[(c[b>>2]|0)+8>>2]|0)+84>>2]=5;break a}case 102:{if(f<<24>>24!=102)break a;if(f2(e,102093)|0)break a;c[(c[(c[b>>2]|0)+8>>2]|0)+84>>2]=2;break a}default:{d=+a6(e);if(!(d>0.0))break a;f=c[(c[b>>2]|0)+8>>2]|0;c[f+84>>2]=1;h[f+16>>3]=d;break a}}}while(0);return}function rK(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+48|0;m=o+32|0;i=o+16|0;k=o+8|0;j=o;n=o+40|0;a[n>>0]=0;d=NA(b,d)|0;do if(d){c[i>>2]=k;c[i+4>>2]=j;c[i+8>>2]=n;i=(q4(d,102050,i)|0)>1;g=+h[k>>3];f=+h[j>>3];b=e+8|0;if(i&g>0.0&f>0.0){g=g*72.0;h[e>>3]=+(~~(g+(g>=0.0?.5:-.5))|0);g=f*72.0;h[b>>3]=+(~~(g+(g>=0.0?.5:-.5))|0);b=(a[n>>0]|0)==33;break}a[n>>0]=0;c[m>>2]=k;c[m+4>>2]=n;m=(q4(d,102060,m)|0)>0;f=+h[k>>3];if(m&f>0.0){g=f*72.0;g=+(~~(g+(g>=0.0?.5:-.5))|0);h[e>>3]=g;h[b>>3]=g;b=(a[n>>0]|0)==33}else b=0}else b=0;while(0);l=o;return b&1|0}function sK(b){b=b|0;var d=0,e=0,f=0,g=0.0,i=0.0,j=0;d=NA(b,108525)|0;do if(d|0?a[d>>0]|0:0){e=(c[(c[b+60>>2]|0)+16>>2]|0)+113|0;a[e>>0]=a[e>>0]|8;e=(gD(d)|0)!=0;i=+YO(b,DA(b,0,101729,0)|0,14.0,1.0);j=$O(b,DA(b,0,101738,0)|0,108295)|0;d=xK(b,d,e?2:0,i,j,$O(b,DA(b,0,101747,0)|0,137615)|0)|0;j=b+16|0;c[(c[j>>2]|0)+12>>2]=d;d=NA(b,105929)|0;e=(d|0)!=0;do if((vC(b)|0)==(b|0)){if(e?(a[d>>0]|0)==116:0){d=1;break}d=0}else{if(e?(a[d>>0]|0)==98:0){d=0;break}d=1}while(0);e=NA(b,102027)|0;a:do if(e){f=d&255;switch(a[e>>0]|0){case 108:{d=(f|2)&255;break a}case 114:{d=(f|4)&255;break a}default:break a}}while(0);a[(c[j>>2]|0)+275>>0]=d;if((vC(b)|0)!=(b|0)){d=c[(c[j>>2]|0)+12>>2]|0;g=+h[d+24>>3]+16.0;i=+h[d+32>>3]+8.0;b=(c[(c[(vC(b)|0)+16>>2]|0)+116>>2]&1|0)==0;d=c[j>>2]|0;e=a[d+275>>0]<<1&2;if(b){b=e&255;h[d+48+(b<<4)>>3]=g;h[d+48+(b<<4)+8>>3]=i;break}else{b=(e^3)&255;h[d+48+(b<<4)>>3]=i;h[d+48+(b<<4)+8>>3]=g;break}}}while(0);return}function tK(a){a=a|0;var b=0,d=0,e=0;e=a+16|0;d=c[e>>2]|0;b=c[d+8>>2]|0;do if(!b)b=d;else{d=c[b+88>>2]|0;if(d){CH(d);d=c[e>>2]|0;b=c[d+8>>2]|0;if(!b){b=d;break}}l6(c[b+92>>2]|0);b=c[e>>2]|0}while(0);l6(c[b+8>>2]|0);e=c[e>>2]|0;c[e+8>>2]=0;AK(c[e+12>>2]|0);XC(a,0,137786);return}function uK(a){a=a|0;var b=0,d=0;d=l;l=l+16|0;b=d;switch(a|0){case 0:{a=102272;break}case 1:{a=102140;break}case 2:{a=102278;break}default:{c[b>>2]=a;dA(1,102242,b)|0;a=102272}}l=d;return a|0}function vK(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=c[d>>2]|0;m=d+24|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;if(a[f>>0]|0){g=IK((D3(f)|0)+1|0)|0;a[g>>0]=0;k=d+12|0;e=g;a:while(1){b:while(1){i=f+1|0;h=a[f>>0]|0;if(!(h<<24>>24))break a;j=e+1|0;f=f+2|0;if(!(h<<24>>24==-1|((h&255)<161|(c[k>>2]|0)!=2))){a[e>>0]=h;i=a[i>>0]|0;e=e+2|0;a[j>>0]=i;if(!(i<<24>>24))break a;else continue}switch(h<<24>>24){case 92:break b;case 10:{l=12;break b}default:{}}a[e>>0]=h;e=j;f=i}if((l|0)==12){l=0;a[e>>0]=0;wK(b,d,g,110);e=j;g=j;f=i;continue}h=a[i>>0]|0;switch(h<<24>>24|0){case 114:case 108:case 110:{a[e>>0]=0;wK(b,d,g,a[i>>0]|0);g=j;break}default:a[e>>0]=h}e=j;f=(a[i>>0]|0)==0?i:f}if((g|0)!=(e|0)){a[e>>0]=0;wK(b,d,g,110)}d=d+40|0;c[d>>2]=c[m>>2];c[d+4>>2]=c[m+4>>2];c[d+8>>2]=c[m+8>>2];c[d+12>>2]=c[m+12>>2]}return}function wK(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0.0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=l;l=l+32|0;r=t+16|0;q=t;s=e+76|0;m=b[s>>1]|0;o=e+72|0;n=c[o>>2]|0;i=m+2|0;if(!n)p=HK(i*56|0)|0;else p=JK(n,i,56,m+1|0)|0;c[o>>2]=p;i=b[s>>1]|0;m=i<<16>>16;n=p+(m*56|0)|0;c[n>>2]=f;a[p+(m*56|0)+48>>0]=g;j=+h[e+16>>3];if((f|0)!=0?(a[f>>0]|0)!=0:0){c[46636]=c[e+4>>2];h[23320]=j;i=c[d+144>>2]|0;c[p+(m*56|0)+4>>2]=eb[c[i>>2]&63](i,186544,1)|0;JO(q,d,n);k=+h[q>>3];h[r>>3]=k;j=+h[q+8>>3];i=b[s>>1]|0}else{h[r>>3]=0.0;j=+(~~(j*1.2)|0);h[p+(m*56|0)+40>>3]=j;k=0.0}b[s>>1]=i+1<<16>>16;s=e+24|0;h[s>>3]=+h[(+h[s>>3]>k?s:r)>>3];s=e+32|0;h[s>>3]=j+ +h[s>>3];l=t;return}function xK(b,e,f,g,i,j){b=b|0;e=e|0;f=f|0;g=+g;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=l;l=l+32|0;r=u+16|0;q=u+8|0;p=u;t=HK(88)|0;switch(FC(b)|0){case 0:{m=0;s=c[b+60>>2]|0;n=b;o=0;break}case 1:{m=0;s=vC(uC(b)|0)|0;n=0;o=b;break}case 2:{m=b;s=vC(uC(c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)|0)|0;n=0;o=0;break}default:{m=0;s=0;n=0;o=0}}c[t+4>>2]=i;c[t+8>>2]=j;h[t+16>>3]=g;k=s+16|0;j=t+12|0;c[j>>2]=d[(c[k>>2]|0)+115>>0];a:do if(f&4){c[t>>2]=Y3(e)|0;if(f&2|0)a[t+82>>0]=1}else switch(f|0){case 2:{c[t>>2]=Y3(e)|0;a[t+82>>0]=1;if(!(zU(b,t)|0))break a;switch(FC(b)|0){case 0:{c[p>>2]=HB(n)|0;dA(3,102284,p)|0;break a}case 1:{c[q>>2]=HB(o)|0;dA(3,102306,q)|0;break a}case 2:{p=HB(c[((c[m>>2]&3|0)==3?m:m+48|0)+40>>2]|0)|0;q=(uB(s)|0)!=0;s=HB(c[((c[m>>2]&3|0)==2?m:m+-48|0)+40>>2]|0)|0;c[r>>2]=p;c[r+4>>2]=q?138041:142050;c[r+8>>2]=s;dA(3,102327,r)|0;break a}default:break a}}case 0:{i=yK(e,b,0)|0;c[t>>2]=i;if((c[j>>2]|0)==1)i=cQ(i)|0;else i=$P(i,s)|0;l6(c[t>>2]|0);c[t>>2]=i;vK(c[(c[k>>2]|0)+144>>2]|0,t);break a}default:Aa(102354,102370,166,102379)}while(0);l=u;return t|0}function yK(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;m=(b|0)!=0;switch(FC(d)|0){case 0:{i=HB(d)|0;g=D3(i)|0;f=c[(c[d+16>>2]|0)+12>>2]|0;if(f){f=c[f>>2]|0;if(m){v=0;t=2;u=2;s=2;h=2;y=102402;n=102399;j=105794;o=195341;r=195341;q=0;p=0;m=D3(f)|0;w=f;x=102396}else{v=0;t=2;u=2;s=2;h=2;y=102402;n=102399;j=105794;o=195341;r=195341;q=0;p=0;m=2;w=f;x=102396}}else{v=0;t=2;u=2;s=2;h=2;y=102402;n=102399;j=105794;o=195341;r=195341;q=0;p=0;m=2;w=102390;x=102396}break}case 1:{i=HB(uC(d)|0)|0;g=D3(i)|0;j=HB(d)|0;h=D3(j)|0;f=c[(c[d+16>>2]|0)+104>>2]|0;if(f){f=c[f>>2]|0;if(m){v=0;t=2;u=2;s=2;y=102402;n=102399;o=195341;r=195341;q=0;p=0;m=D3(f)|0;w=f;x=102396}else{v=0;t=2;u=2;s=2;y=102402;n=102399;o=195341;r=195341;q=0;p=0;m=2;w=f;x=102396}}else{v=0;t=2;u=2;s=2;y=102402;n=102399;o=195341;r=195341;q=0;p=0;m=2;w=102390;x=102396}break}case 2:{h=d+48|0;i=HB(vC(uC(c[((c[d>>2]&3|0)==3?d:h)+40>>2]|0)|0)|0)|0;g=D3(i)|0;l=HB(c[((c[d>>2]&3|0)==3?d:h)+40>>2]|0)|0;k=D3(l)|0;f=d+16|0;r=c[(c[f>>2]|0)+52>>2]|0;if(!r)p=0;else p=D3(r)|0;n=HB(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)|0;f=c[f>>2]|0;o=c[f+92>>2]|0;if(!o)q=0;else q=D3(o)|0;j=D3(n)|0;f=c[f+96>>2]|0;if(f){f=c[f>>2]|0;if(m)m=D3(f)|0;else m=2}else{m=2;f=102390}x=(uB(vC(uC(c[((c[d>>2]&3|0)==3?d:h)+40>>2]|0)|0)|0)|0)==0;v=1;t=k;u=j;s=k+2+(p|0?p+1|0:0)+j+(q|0?q+1|0:0)|0;h=2;y=l;j=105794;w=f;x=x?142050:138041;break}default:{v=0;t=2;u=2;s=2;h=2;g=2;y=102402;n=102399;j=105794;i=102393;o=195341;r=195341;q=0;p=0;m=2;w=102390;x=102396}}e=(e|0)!=0;k=0;f=b;a:while(1){d=f+1|0;l=k+1|0;switch(a[f>>0]|0){case 0:break a;case 92:break;default:{k=l;f=d;continue a}}f=f+2|0;switch(a[d>>0]|0){case 71:{k=k+g|0;continue a}case 78:{k=k+h|0;continue a}case 69:{k=k+s|0;continue a}case 72:{k=k+u|0;continue a}case 84:{k=k+t|0;continue a}case 76:{k=k+m|0;continue a}case 92:{if(e){k=l;continue a}break}default:{}}k=k+2|0}t=IK(l)|0;s=(v|0)==0;p=(p|0)==0;m=(q|0)==0;f=t;g=b;b:while(1){k=g+1|0;h=a[g>>0]|0;if(!(h<<24>>24))break;d=f+1|0;if(h<<24>>24!=92){a[f>>0]=h;f=d;g=k;continue}l=g+2|0;g=a[k>>0]|0;switch(g<<24>>24|0){case 71:{g=i;while(1){b=a[g>>0]|0;a[f>>0]=b;if(!(b<<24>>24)){g=l;continue b}g=g+1|0;f=f+1|0}}case 78:{g=j;while(1){b=a[g>>0]|0;a[f>>0]=b;if(!(b<<24>>24)){g=l;continue b}g=g+1|0;f=f+1|0}}case 69:{if(s){g=l;continue b}else g=y;while(1){b=a[g>>0]|0;a[f>>0]=b;h=f+1|0;if(!(b<<24>>24))break;else{g=g+1|0;f=h}}c:do if(p)g=x;else{a[f>>0]=58;g=r;f=h;while(1){b=a[g>>0]|0;a[f>>0]=b;if(!(b<<24>>24)){g=x;break c}g=g+1|0;f=f+1|0}}while(0);while(1){b=a[g>>0]|0;a[f>>0]=b;if(!(b<<24>>24)){g=n;break}g=g+1|0;f=f+1|0}while(1){b=a[g>>0]|0;a[f>>0]=b;h=f+1|0;if(!(b<<24>>24))break;else{g=g+1|0;f=h}}if(m){g=l;continue b}a[f>>0]=58;g=o;f=h;while(1){b=a[g>>0]|0;a[f>>0]=b;if(!(b<<24>>24)){g=l;continue b}g=g+1|0;f=f+1|0}}case 84:{g=y;while(1){b=a[g>>0]|0;a[f>>0]=b;if(!(b<<24>>24)){g=l;continue b}g=g+1|0;f=f+1|0}}case 72:{g=n;while(1){b=a[g>>0]|0;a[f>>0]=b;if(!(b<<24>>24)){g=l;continue b}f=f+1|0;g=g+1|0}}case 76:{g=w;while(1){b=a[g>>0]|0;a[f>>0]=b;if(!(b<<24>>24)){g=l;continue b}f=f+1|0;g=g+1|0}}case 92:{if(e){a[f>>0]=92;f=d;g=l;continue b}break}default:{}}a[f>>0]=92;a[d>>0]=g;f=f+2|0;g=l}a[f>>0]=0;return t|0}function zK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;if(a|0){d=a;e=0;while(1){if((e|0)>=(b|0))break;if(!e)l6(c[d>>2]|0);g=c[d+8>>2]|0;if(g|0?(f=c[d+12>>2]|0,f|0):0)db[f&127](g);d=d+56|0;e=e+1|0}l6(a)}return}function AK(d){d=d|0;var e=0;if(d|0){l6(c[d>>2]|0);e=d+72|0;if(a[d+82>>0]|0){e=c[e>>2]|0;if(e|0)kU(e,1)}else zK(c[e>>2]|0,b[d+76>>1]|0);l6(d)}return}function BK(d,e,f){d=d|0;e=e|0;f=f|0;var g=0.0,i=0,j=0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=l;l=l+32|0;q=u+16|0;r=u;m=c[d+16>>2]|0;s=m+12|0;t=c[s>>2]|0;c[s>>2]=e;o=f+72|0;if(!(a[f+82>>0]|0)){p=f+76|0;if((b[p>>1]|0)>=1){cS(d,0);fS(d,c[f+8>>2]|0);e=f+64|0;i=f+48|0;j=f+32|0;switch(a[f+80>>0]|0){case 116:{k=+h[e>>3];g=k+ +h[i>>3]*.5;break}case 98:{k=+h[e>>3];g=+h[j>>3]+(k-+h[i>>3]*.5);break}default:{k=+h[e>>3];g=k+ +h[j>>3]*.5}}g=g-+h[f+16>>3];n=r+8|0;h[n>>3]=g;if(b[m+260>>1]&512)h[n>>3]=g-k;m=f+40|0;i=f+56|0;e=0;while(1){if((e|0)>=(b[p>>1]|0))break;f=c[o>>2]|0;j=f+(e*56|0)|0;switch(a[f+(e*56|0)+48>>0]|0){case 108:{g=+h[i>>3]-+h[m>>3]*.5;break}case 114:{g=+h[i>>3]+ +h[m>>3]*.5;break}default:g=+h[i>>3]}h[r>>3]=g;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];eS(d,q,j);h[n>>3]=+h[n>>3]-+h[(c[o>>2]|0)+(e*56|0)+40>>3];e=e+1|0}dS(d);i=18}}else{RT(d,c[o>>2]|0,f);i=18}if((i|0)==18)c[s>>2]=t;l=u;return}function CK(a,b){a=a|0;b=b|0;return yK(a,b,1)|0}function DK(a){a=a|0;return EK(a,0)|0}function EK(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=c[47276]|0;if(!e){c[47277]=64;e=IK(64)|0;c[47276]=e}j=d<<24>>24!=0;i=0;f=0;h=b;while(1){if(!h)break;d=a[h>>0]|0;if(!(d<<24>>24))break;b=c[47277]|0;if((i|0)>(b+-8|0)){e=b<<1;c[47277]=e;e=KK(c[47276]|0,e)|0;c[47276]=e;e=e+i|0;d=a[h>>0]|0}a:do switch(d<<24>>24){case 38:{if(!j?(FK(h)|0)!=0:0)k=19;else{f=5;d=102431}break}case 60:{f=4;d=102454;break}case 62:{f=4;d=102437;break}case 45:{f=5;d=102448;break}default:{if((f|0)!=0&d<<24>>24==32)if((a[f>>0]|0)==32){f=6;d=102424;break a}else{k=19;break a}switch(d<<24>>24){case 34:{f=6;d=102411;break a}case 39:{f=5;d=102442;break a}case 10:if(j){f=5;d=102418;break a}else{k=19;break a}case 13:if(j){f=5;d=102405;break a}else{k=19;break a}default:{k=19;break a}}}}while(0);if((k|0)==19){k=0;f=1;d=h}g=e+f|0;b=f;while(1){if(!b)break;a[e>>0]=a[d>>0]|0;b=b+-1|0;d=d+1|0;e=e+1|0}b=h;i=f+i|0;e=g;h=h+1|0;f=b}a[e>>0]=0;return c[47276]|0}function FK(b){b=b|0;var c=0,d=0;d=b+1|0;c=a[d>>0]|0;a:do if(c<<24>>24==35){d=b+2|0;c=a[d>>0]|0;switch(c<<24>>24){case 88:case 120:break;default:{b=d;while(1){d=b+1|0;if((c+-48&255)>=10)break a;b=d;c=a[d>>0]|0}}}d=b+3|0;while(1){c=a[d>>0]|0;if((c+-48&255)>=10)switch(c<<24>>24){case 65:case 66:case 67:case 68:case 69:case 70:case 97:case 98:case 99:case 100:case 101:case 102:break;default:break a}d=d+1|0}}else while(1){b=d+1|0;if(((c&-33)+-65&255)>=26)break a;d=b;c=a[b>>0]|0}while(0);return c<<24>>24==59|0}function GK(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=c[47278]|0;if(!d){c[47279]=64;d=IK(64)|0;c[47278]=d;i=0;h=b}else{i=0;h=b}while(1){if(!h)break;b=a[h>>0]|0;if(!(b<<24>>24))break;e=c[47279]|0;if((i|0)>(e+-8|0)){d=e<<1;c[47279]=d;d=KK(c[47278]|0,d)|0;c[47278]=d;d=d+i|0;b=a[h>>0]|0}switch(b<<24>>24){case 38:{if(!(FK(h)|0)){f=5;b=102431}else j=12;break}case 60:{f=4;b=102454;break}case 62:{f=4;b=102437;break}case 34:{f=6;b=102411;break}case 39:{f=5;b=102442;break}default:j=12}if((j|0)==12){j=0;f=1;b=h}g=d+f|0;e=f;while(1){if(!e)break;a[d>>0]=a[b>>0]|0;e=e+-1|0;b=b+1|0;d=d+1|0}i=f+i|0;d=g;h=h+1|0}a[d>>0]=0;return c[47278]|0}function HK(a){a=a|0;var b=0;if(!a)a=0;else{b=IK(a)|0;u6(b|0,0,a|0)|0;a=b}return a|0}function IK(a){a=a|0;if(a){a=k6(a)|0;if(!a){_3(112041,14,1,c[15715]|0)|0;a=0}}else a=0;return a|0}function JK(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=n6(a,S(d,b)|0)|0;if(!((b|0)!=0&(a|0)==0)){if(b>>>0>e>>>0)u6(a+(S(e,d)|0)|0,0,S(b-e|0,d)|0)|0}else _3(112041,14,1,c[15715]|0)|0;return a|0}function KK(a,b){a=a|0;b=b|0;a=n6(a,b)|0;if((b|0)!=0&(a|0)==0)_3(112041,14,1,c[15715]|0)|0;return a|0}function LK(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0.0,n=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+80|0;s=v+40|0;r=v+32|0;q=v+24|0;n=v;t=4;u=k6(40)|0;c[u>>2]=0;g=v+68|0;i=v+64|0;if(a[195234]|0){o=0;na(62,b|0,g|0,i|0);j=o;o=0;if((j|0)!=0&(p|0)!=0){k=A6(c[j>>2]|0,u|0,t|0)|0;if(!k)Ca(j|0,p|0);D=p}else k=-1;if((k|0)!=1){k=c[15715]|0;j=c[g>>2]|0;g=c[i>>2]|0;o=0;c[n>>2]=102503;c[n+4>>2]=j;c[n+8>>2]=g;c[n+12>>2]=e;c[n+16>>2]=d;aa(35,k|0,102459,n|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)!=1){o=0;oa(1);g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)!=1)k=6;else{g=D;k=15}}else{g=D;k=15}}else{g=D;k=15}}else k=6;do if((k|0)==6){o=0;g=la(27,b|0)|0;i=o;o=0;if((i|0)!=0&(p|0)!=0){j=A6(c[i>>2]|0,u|0,t|0)|0;if(!j)Ca(i|0,p|0);D=p}else j=-1;if((j|0)!=1){if(!g){o=0;oa(2);g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;break}}if((e|0)<1){o=0;oa(3);g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;break}g=0;break}else{c[47280]=(f|0)>-1?f:30;u=x6(189124,1,u|0,t|0)|0;t=D;o=0;g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;break}g=0;k=15;break}}else{g=D;k=15}}while(0);a:do if((k|0)==15){b:while(1){if(g|0){g=2;break a}o=0;oa(4);g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;continue}b=c[15715]|0;n=0;while(1){o=0;k=ea(2)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;continue b}if(!k)break;o=0;g=la(28,k|0)|0;i=o;o=0;if((i|0)!=0&(p|0)!=0){j=A6(c[i>>2]|0,u|0,t|0)|0;if(!j)Ca(i|0,p|0);D=p}else j=-1;if((j|0)==1){g=D;k=15;continue b}o=0;ha(25,k|0,g|0);g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;continue b}n=n+1|0;do if(((n|0)%100|0|0)==0&(a[195234]|0)!=0){g=(n|0)%1e3|0;if((g|0)==100){o=0;ra(93,102503,b|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;continue b}o=0;c[q>>2]=n;aa(35,b|0,102521,q|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;continue b}break}o=0;c[r>>2]=n;aa(35,b|0,102521,r|0)|0;i=o;o=0;if((i|0)!=0&(p|0)!=0){j=A6(c[i>>2]|0,u|0,t|0)|0;if(!j)Ca(i|0,p|0);D=p}else j=-1;if((j|0)==1){g=D;k=15;continue b}if(!g){o=0;ra(94,10,b|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;continue b}}}while(0);if((n|0)>=(e|0))break}switch(d|0){case 1:{o=0;oa(5);g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;continue b}break}case 2:{o=0;oa(6);g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;continue b}break}default:{o=0;oa(7);g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;continue b}o=0;oa(3);g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;continue b}}}if(!(a[195234]|0)){g=0;break a}if((n|0)>99){o=0;ra(94,10,b|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15;continue}}g=c[47320]|0;i=c[47321]|0;o=0;m=+ca(1);j=o;o=0;if((j|0)!=0&(p|0)!=0){k=A6(c[j>>2]|0,u|0,t|0)|0;if(!k)Ca(j|0,p|0);D=p}else k=-1;if((k|0)==1){g=D;k=15;continue}o=0;c[s>>2]=102503;c[s+4>>2]=g;c[s+8>>2]=i;c[s+12>>2]=n;h[s+16>>3]=m;aa(35,b|0,102525,s|0)|0;g=o;o=0;if((g|0)!=0&(p|0)!=0){i=A6(c[g>>2]|0,u|0,t|0)|0;if(!i)Ca(g|0,p|0);D=p}else i=-1;if((i|0)==1){g=D;k=15}else break}g=0}while(0);l6(u|0);l=v;return g|0}function MK(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;a=(c[a+16>>2]|0)+192|0;e=0;h=0;while(1){a=c[a>>2]|0;if(!a)break;g=c[a+16>>2]|0;f=c[g+180>>2]|0;a=0;while(1){if(!(c[f+(a<<2)>>2]|0))break;a=a+1|0;e=e+1|0}a=g+164|0;h=h+1|0}c[b>>2]=h;c[d>>2]=e;return}function NK(b){b=b|0;var d=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;c[47324]=b;c[47331]=0;c[47321]=0;c[47320]=0;i=b+16|0;b=(c[i>>2]|0)+192|0;h=0;f=0;while(1){b=c[b>>2]|0;if(!b)break;g=c[b+16>>2]|0;a[g+157>>0]=0;h=h+1|0;c[47320]=h;d=c[g+180>>2]|0;b=0;while(1){if(!(c[d+(b<<2)>>2]|0))break;k=f+1|0;c[47321]=k;b=b+1|0;f=k}b=g+164|0}b=c[47332]|0;if(!b)b=IK(h<<2)|0;else b=KK(b,h<<2)|0;c[47332]=b;c[47333]=0;b=c[47326]|0;d=c[47320]<<2;if(!b)b=IK(d)|0;else b=KK(b,d)|0;c[47326]=b;c[47325]=0;d=1;b=(c[i>>2]|0)+192|0;while(1){b=c[b>>2]|0;if(!b)break;k=b+16|0;h=c[k>>2]|0;i=h+292|0;c[i>>2]=0;h=c[h+172>>2]|0;j=d;b=0;d=0;while(1){g=c[h+(b<<2)>>2]|0;b=b+1|0;if(!g)break;d=d+1|0;c[i>>2]=d;f=c[g+16>>2]|0;c[f+160>>2]=0;c[f+164>>2]=-1;if(!j){j=0;continue}l=c[g>>2]&3;j=((c[(c[(c[((l|0)==2?g:g+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[(c[(c[((l|0)==3?g:g+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)|0)<(e[f+170>>1]|0|0)?0:j}b=HK(b<<2)|0;d=c[k>>2]|0;c[d+264>>2]=b;c[d+268>>2]=0;d=c[d+180>>2]|0;b=0;do{l=b;b=b+1|0}while((c[d+(l<<2)>>2]|0)!=0);d=HK(b<<2)|0;b=c[k>>2]|0;c[b+272>>2]=d;c[b+276>>2]=0;d=j;b=b+164|0}return d|0}function OK(){var a=0,b=0,d=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;n=o+8|0;k=o;m=TO(c[47320]|0)|0;a=(c[(c[47324]|0)+16>>2]|0)+192|0;while(1){b=c[a>>2]|0;if(!b){j=0;break}d=b+16|0;a=c[d>>2]|0;if(!(c[a+292>>2]|0)){VO(m,b);a=c[d>>2]|0}a=a+164|0}while(1){a=WO(m)|0;if(!a)break;i=a+16|0;a=c[i>>2]|0;f=a+232|0;c[f>>2]=0;d=c[a+172>>2]|0;b=0;h=0;while(1){g=c[d+(b<<2)>>2]|0;if(!g){f=0;break}g=(e[(c[g+16>>2]|0)+170>>1]|0)+(c[(c[(c[((c[g>>2]&3|0)==3?g:g+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)|0;g=(h|0)>(g|0)?h:g;c[f>>2]=g;b=b+1|0;h=g}while(1){b=c[(c[a+180>>2]|0)+(f<<2)>>2]|0;if(!b)break;d=b+-48|0;g=(c[(c[((c[b>>2]&3|0)==2?b:d)+40>>2]|0)+16>>2]|0)+292|0;h=c[g>>2]|0;c[g>>2]=h+-1;if((h|0)<2){VO(m,c[((c[b>>2]&3|0)==2?b:d)+40>>2]|0);a=c[i>>2]|0}f=f+1|0}j=j+1|0}a:do if((j|0)!=(c[47320]|0)){dA(1,102857,k)|0;a=(c[(c[47324]|0)+16>>2]|0)+192|0;while(1){b=c[a>>2]|0;if(!b)break a;d=b+16|0;a=c[d>>2]|0;if(c[a+292>>2]|0){k=HB(b)|0;a=c[(c[d>>2]|0)+292>>2]|0;c[n>>2]=k;c[n+4>>2]=a;dA(3,102879,n)|0;a=c[d>>2]|0}a=a+164|0}}while(0);UO(m);l=o;return}function PK(){var b=0,d=0,e=0;b=(c[(c[47324]|0)+16>>2]|0)+192|0;while(1){b=c[b>>2]|0;if(!b)break;e=b+16|0;b=c[e>>2]|0;d=c[b+264>>2]|0;if(d){l6(d);b=c[e>>2]|0}d=c[b+272>>2]|0;if(d){l6(d);b=c[e>>2]|0}a[b+157>>0]=0;b=b+164|0}return}function QK(){var a=0,b=0,d=0,e=0,f=0;a=(c[(c[47324]|0)+16>>2]|0)+192|0;while(1){a=c[a>>2]|0;if(!a)break;a=c[a+16>>2]|0;c[a+280>>2]=0;a=a+164|0}f=HK(c[47320]<<2)|0;e=0;a=(c[(c[47324]|0)+16>>2]|0)+192|0;while(1){b=c[a>>2]|0;if(!b)break;d=b+16|0;a=c[d>>2]|0;if(!(c[a+280>>2]|0)){c[f+(e<<2)>>2]=bL(b)|0;b=e+1|0;a=c[d>>2]|0}else b=e;e=b;a=a+164|0}a=cL(f,e)|0;while(1){if((dL(a)|0)<=1)break;hL(a,c[(gL(fL(eL(a)|0)|0)|0)+8>>2]|0)}l6(a);a=0;while(1){if((a|0)>=(e|0))break;l6(c[f+(a<<2)>>2]|0);a=a+1|0}l6(f);if((c[47325]|0)==((c[47320]|0)+-1|0)){iL();return}else Aa(102602,102632,523,102637)}function RK(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;i=c[47331]|0;f=c[47325]|0;j=c[47326]|0;k=c[47280]|0;b=0;a=0;g=i;while(1){if((g|0)>=(f|0)){h=8;break}e=c[j+(g<<2)>>2]|0;d=c[(c[e+16>>2]|0)+160>>2]|0;if((d|0)<0){if(!a)a=e;else a=(c[(c[a+16>>2]|0)+160>>2]|0)>(d|0)?e:a;b=b+1|0;if((b|0)>=(k|0))break}e=g+1|0;c[47331]=e;g=e}if((h|0)==8)if((i|0)>0){f=0;while(1){if((f|0)>=(i|0))break;d=c[j+(f<<2)>>2]|0;e=c[(c[d+16>>2]|0)+160>>2]|0;if((e|0)<0){if(!a)a=d;else a=(c[(c[a+16>>2]|0)+160>>2]|0)>(e|0)?d:a;b=b+1|0;if((b|0)>=(k|0))break}f=f+1|0}c[47331]=f}return a|0}function SK(a){a=a|0;var b=0,d=0;b=c[a>>2]&3;d=c[((b|0)==3?a:a+48|0)+40>>2]|0;a=c[((b|0)==2?a:a+-48|0)+40>>2]|0;b=(c[(c[d+16>>2]|0)+288>>2]|0)<(c[(c[a+16>>2]|0)+288>>2]|0);a=b?d:a;c[47327]=0;c[47328]=2147483647;d=c[a+16>>2]|0;c[47329]=c[d+284>>2];c[47330]=c[d+288>>2];if(b)aL(a);else $K(a);return c[47327]|0}function TK(a,b){a=a|0;b=b|0;var d=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+16|0;o=p;h=c[b>>2]&3;n=b+-48|0;k=b+48|0;m=b+16|0;h=(c[(c[(c[((h|0)==2?b:n)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[(c[(c[((h|0)==3?b:k)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(e[(c[m>>2]|0)+170>>1]|0)|0;do if((h|0)>0){d=c[a>>2]&3;i=c[((d|0)==3?a:a+48|0)+40>>2]|0;j=c[i+16>>2]|0;if(((c[j+276>>2]|0)+(c[j+268>>2]|0)|0)==1){XK(i,h);break}d=c[((d|0)==2?a:a+-48|0)+40>>2]|0;f=c[d+16>>2]|0;g=0-h|0;if(((c[f+276>>2]|0)+(c[f+268>>2]|0)|0)==1){XK(d,g);break}if((c[j+288>>2]|0)<(c[f+288>>2]|0)){XK(i,h);break}else{XK(d,g);break}}while(0);d=a+16|0;f=c[(c[d>>2]|0)+160>>2]|0;g=c[b>>2]&3;g=YK(c[((g|0)==3?b:k)+40>>2]|0,c[((g|0)==2?b:n)+40>>2]|0,f,1)|0;j=c[b>>2]&3;if((YK(c[((j|0)==2?b:n)+40>>2]|0,c[((j|0)==3?b:k)+40>>2]|0,f,0)|0)==(g|0)){c[(c[m>>2]|0)+160>>2]=0-f;c[(c[d>>2]|0)+160>>2]=0;ZK(a,b);o=c[g+16>>2]|0;_K(g,c[o+280>>2]|0,c[o+284>>2]|0)|0;l=p;return}else{dA(1,102563,o)|0;Ca(189124,1)}}function UK(){var b=0,d=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;WK();n=HK((c[47323]<<2)+4|0)|0;d=c[47323]|0;b=0;while(1){if((b|0)>(d|0))break;c[n+(b<<2)>>2]=0;b=b+1|0}b=c[(c[(c[47324]|0)+16>>2]|0)+192>>2]|0;d=b;while(1){if(!d)break;d=c[d+16>>2]|0;if(!(a[d+156>>0]|0)){m=n+(c[d+232>>2]<<2)|0;c[m>>2]=(c[m>>2]|0)+1}d=c[d+164>>2]|0}while(1){if(!b)break;m=b+16|0;b=c[m>>2]|0;if(!(a[b+156>>0]|0)){h=c[47323]|0;f=c[b+172>>2]|0;k=0;j=0;d=0;while(1){g=c[f+(d<<2)>>2]|0;if(!g)break;i=c[g+16>>2]|0;l=(e[i+170>>1]|0)+(c[(c[(c[((c[g>>2]&3|0)==3?g:g+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)|0;k=(c[i+156>>2]|0)+k|0;j=(j|0)>(l|0)?j:l;d=d+1|0}g=c[b+180>>2]|0;i=0;l=h;d=0;while(1){f=c[g+(d<<2)>>2]|0;if(!f)break;o=c[f+16>>2]|0;h=(c[(c[(c[((c[f>>2]&3|0)==2?f:f+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(e[o+170>>1]|0)|0;i=(c[o+156>>2]|0)+i|0;l=(l|0)<(h|0)?l:h;d=d+1|0}d=(j|0)>0?j:0;if((k|0)==(i|0)){h=d;f=d;while(1){d=f+1|0;g=n+(h<<2)|0;if((f|0)>=(l|0))break;h=(c[n+(d<<2)>>2]|0)<(c[g>>2]|0)?d:h;f=d}o=b+232|0;l=n+(c[o>>2]<<2)|0;c[l>>2]=(c[l>>2]|0)+-1;c[g>>2]=(c[g>>2]|0)+1;c[o>>2]=h}d=c[b+264>>2]|0;if(d){l6(d);b=c[m>>2]|0}d=c[b+272>>2]|0;if(d){l6(d);b=c[m>>2]|0}a[b+157>>0]=0}b=c[b+164>>2]|0}l6(n);return}function VK(){var a=0,b=0,d=0,f=0,g=0,h=0;b=0;while(1){if((b|0)>=(c[47325]|0))break;a=c[(c[47326]|0)+(b<<2)>>2]|0;do if(((c[(c[a+16>>2]|0)+160>>2]|0)==0?(d=SK(a)|0,d|0):0)?(f=c[d>>2]&3,f=(c[(c[(c[((f|0)==2?d:d+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[(c[(c[((f|0)==3?d:d+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(e[(c[d+16>>2]|0)+170>>1]|0)|0,(f|0)>=2):0){h=c[a>>2]&3;g=c[((h|0)==3?a:a+48|0)+40>>2]|0;a=c[((h|0)==2?a:a+-48|0)+40>>2]|0;if((c[(c[g+16>>2]|0)+288>>2]|0)<(c[(c[a+16>>2]|0)+288>>2]|0)){XK(g,f>>>1);break}else{XK(a,(f|0)/-2|0);break}}while(0);b=b+1|0}PK();return}function WK(){var b=0,d=0,e=0,f=0,g=0;c[47322]=2147483647;c[47323]=-2147483647;b=c[(c[(c[47324]|0)+16>>2]|0)+192>>2]|0;e=b;d=2147483647;f=-2147483647;while(1){if(!e)break;e=c[e+16>>2]|0;if(!(a[e+156>>0]|0)){g=c[e+232>>2]|0;d=(d|0)<(g|0)?d:g;c[47322]=d;f=(f|0)>(g|0)?f:g;c[47323]=f}e=c[e+164>>2]|0}if(d|0){while(1){if(!b)break;g=c[b+16>>2]|0;e=g+232|0;c[e>>2]=(c[e>>2]|0)-d;b=c[g+164>>2]|0}c[47323]=f-d;c[47322]=0}return}function XK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=a+16|0;a=c[f>>2]|0;e=a+232|0;c[e>>2]=(c[e>>2]|0)-b;e=0;while(1){d=c[(c[a+272>>2]|0)+(e<<2)>>2]|0;if(!d){e=0;break}if((d|0)!=(c[a+280>>2]|0)){XK(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0,b);a=c[f>>2]|0}e=e+1|0}while(1){d=c[(c[a+264>>2]|0)+(e<<2)>>2]|0;if(!d)break;if((d|0)!=(c[a+280>>2]|0)){XK(c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0,b);a=c[f>>2]|0}e=e+1|0}return}function YK(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;g=(e|0)==0&1;h=0-d|0;f=c[(c[b+16>>2]|0)+288>>2]|0;b=a;while(1){a=c[b+16>>2]|0;if((c[a+284>>2]|0)<=(f|0)?(f|0)<=(c[a+288>>2]|0):0)break;a=c[a+280>>2]|0;i=a+48|0;j=(c[a+16>>2]|0)+160|0;c[j>>2]=(((b|0)==(c[((c[a>>2]&3|0)==3?a:i)+40>>2]|0)?e:g)|0?d:h)+(c[j>>2]|0);j=c[a>>2]&3;i=c[((j|0)==3?a:i)+40>>2]|0;a=c[((j|0)==2?a:a+-48|0)+40>>2]|0;b=(c[(c[i+16>>2]|0)+288>>2]|0)>(c[(c[a+16>>2]|0)+288>>2]|0)?i:a}return b|0}function ZK(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;e=a+16|0;h=(c[e>>2]|0)+164|0;c[(c[b+16>>2]|0)+164>>2]=c[h>>2];c[(c[47326]|0)+(c[h>>2]<<2)>>2]=b;c[(c[e>>2]|0)+164>>2]=-1;e=(c[((c[a>>2]&3|0)==3?a:a+48|0)+40>>2]|0)+16|0;h=c[e>>2]|0;d=h+276|0;f=c[d>>2]|0;g=f+-1|0;c[d>>2]=g;h=c[h+272>>2]|0;d=0;while(1){i=h+(d<<2)|0;if((d|0)>=(f|0))break;if((c[i>>2]|0)==(a|0))break;else d=d+1|0}c[i>>2]=c[h+(g<<2)>>2];c[(c[(c[e>>2]|0)+272>>2]|0)+(g<<2)>>2]=0;e=(c[((c[a>>2]&3|0)==2?a:a+-48|0)+40>>2]|0)+16|0;h=c[e>>2]|0;d=h+268|0;f=c[d>>2]|0;g=f+-1|0;c[d>>2]=g;h=c[h+264>>2]|0;d=0;while(1){i=h+(d<<2)|0;if((d|0)>=(f|0))break;if((c[i>>2]|0)==(a|0))break;else d=d+1|0}c[i>>2]=c[h+(g<<2)>>2];c[(c[(c[e>>2]|0)+264>>2]|0)+(g<<2)>>2]=0;a=(c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0)+16|0;i=c[a>>2]|0;h=c[i+272>>2]|0;i=i+276|0;g=c[i>>2]|0;c[i>>2]=g+1;c[h+(g<<2)>>2]=b;a=c[a>>2]|0;c[(c[a+272>>2]|0)+(c[a+276>>2]<<2)>>2]=0;a=(c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)+16|0;g=c[a>>2]|0;h=c[g+264>>2]|0;g=g+268|0;i=c[g>>2]|0;c[g>>2]=i+1;c[h+(i<<2)>>2]=b;b=c[a>>2]|0;c[(c[b+264>>2]|0)+(c[b+268>>2]<<2)>>2]=0;return}function _K(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=a+16|0;a=c[g>>2]|0;c[a+280>>2]=b;c[a+284>>2]=d;f=0;while(1){e=c[(c[a+272>>2]|0)+(f<<2)>>2]|0;if(!e){f=0;break}if((e|0)!=(b|0)){d=_K(c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0,e,d)|0;a=c[g>>2]|0}f=f+1|0}while(1){e=c[(c[a+264>>2]|0)+(f<<2)>>2]|0;if(!e)break;if((e|0)!=(b|0)){d=_K(c[((c[e>>2]&3|0)==3?e:e+48|0)+40>>2]|0,e,d)|0;a=c[g>>2]|0}f=f+1|0}c[a+288>>2]=d;return d+1|0}function $K(a){a=a|0;var b=0,d=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;l=a+16|0;b=0;while(1){a=c[l>>2]|0;i=c[(c[a+180>>2]|0)+(b<<2)>>2]|0;if(!i){d=0;break}j=c[i+16>>2]|0;d=c[i>>2]&3;f=c[((d|0)==2?i:i+-48|0)+40>>2]|0;g=c[f+16>>2]|0;h=c[g+288>>2]|0;if((c[j+164>>2]|0)<0){if((c[47329]|0)>(h|0)|(h|0)>(c[47330]|0)?(k=(c[g+232>>2]|0)-(c[(c[(c[((d|0)==3?i:i+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(e[j+170>>1]|0)|0,(k|0)<(c[47328]|0)|(c[47327]|0)==0):0){c[47327]=i;c[47328]=k}}else if((h|0)<(c[a+288>>2]|0))$K(f);b=b+1|0}while(1){b=c[(c[a+264>>2]|0)+(d<<2)>>2]|0;if(!((b|0)!=0&(c[47328]|0)>0))break;b=c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0;if((c[(c[b+16>>2]|0)+288>>2]|0)<(c[a+288>>2]|0)){$K(b);a=c[l>>2]|0}d=d+1|0}return}function aL(a){a=a|0;var b=0,d=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;l=a+16|0;b=0;while(1){a=c[l>>2]|0;i=c[(c[a+172>>2]|0)+(b<<2)>>2]|0;if(!i){d=0;break}j=c[i+16>>2]|0;d=c[i>>2]&3;f=c[((d|0)==3?i:i+48|0)+40>>2]|0;g=c[f+16>>2]|0;h=c[g+288>>2]|0;if((c[j+164>>2]|0)<0){if((c[47329]|0)>(h|0)|(h|0)>(c[47330]|0)?(k=(c[(c[(c[((d|0)==2?i:i+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[g+232>>2]|0)-(e[j+170>>1]|0)|0,(k|0)<(c[47328]|0)|(c[47327]|0)==0):0){c[47327]=i;c[47328]=k}}else if((h|0)<(c[a+288>>2]|0))aL(f);b=b+1|0}while(1){b=c[(c[a+272>>2]|0)+(d<<2)>>2]|0;if(!((b|0)!=0&(c[47328]|0)>0))break;b=c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0;if((c[(c[b+16>>2]|0)+288>>2]|0)<(c[a+288>>2]|0)){aL(b);a=c[l>>2]|0}d=d+1|0}return}function bL(a){a=a|0;var b=0;b=HK(16)|0;c[b>>2]=a;c[b+4>>2]=rL(a,b)|0;c[b+12>>2]=b;return b|0}function cL(a,b){a=a|0;b=b|0;var d=0,e=0;e=HK(8)|0;c[e>>2]=a;c[e+4>>2]=b;d=0;while(1){if((d|0)>=(b|0))break;c[(c[a+(d<<2)>>2]|0)+8>>2]=d;d=d+1|0}d=(b|0)/2|0;while(1){if((d|0)<=-1)break;hL(e,d);d=d+-1|0}return e|0}function dL(a){a=a|0;return c[a+4>>2]|0}function eL(a){a=a|0;var b=0,d=0,e=0,f=0;f=c[a>>2]|0;b=c[f>>2]|0;c[b+8>>2]=-1;d=a+4|0;e=(c[d>>2]|0)+-1|0;c[f>>2]=c[f+(e<<2)>>2];f=c[a>>2]|0;c[(c[f>>2]|0)+8>>2]=0;c[f+(e<<2)>>2]=b;c[d>>2]=e;hL(a,0);return b|0}function fL(a){a=a|0;return qL(c[a>>2]|0,0,0)|0}function gL(a){a=a|0;var b=0,d=0,f=0,g=0,h=0,i=0;b=a+16|0;if((c[(c[b>>2]|0)+164>>2]|0)>-1)Aa(102651,102632,463,102665);g=a+48|0;d=mL(c[((c[a>>2]&3|0)==3?a:g)+40>>2]|0)|0;i=a+-48|0;f=mL(c[((c[a>>2]&3|0)==2?a:i)+40>>2]|0)|0;h=c[a>>2]&3;b=(c[(c[(c[((h|0)==2?a:i)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[(c[(c[((h|0)==3?a:g)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(e[(c[b>>2]|0)+170>>1]|0)|0;if((c[d+8>>2]|0)==-1)nL(c[d>>2]|0,0,b);else nL(c[f>>2]|0,0,0-b|0);oL(a);return pL(d,f)|0}function hL(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=c[a>>2]|0;h=c[a+4>>2]|0;while(1){a=b<<1;f=a+2|0;a=a|1;g=i+(b<<2)|0;if(!((a|0)<(h|0)?(c[(c[i+(a<<2)>>2]|0)+4>>2]|0)<(c[(c[g>>2]|0)+4>>2]|0):0))a=b;if((f|0)>=(h|0))break;d=i+(f<<2)|0;e=c[d>>2]|0;if((f|0)==(b|0)?1:(c[e+4>>2]|0)>=(c[(c[i+(a<<2)>>2]|0)+4>>2]|0))break;a=c[g>>2]|0;c[g>>2]=e;c[d>>2]=a;c[(c[g>>2]|0)+8>>2]=b;c[a+8>>2]=f;b=f}return}function iL(){_K(c[(c[(c[47324]|0)+16>>2]|0)+192>>2]|0,0,1)|0;jL(c[(c[(c[47324]|0)+16>>2]|0)+192>>2]|0,0);return}function jL(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=a+16|0;d=0;while(1){a=c[f>>2]|0;e=c[(c[a+272>>2]|0)+(d<<2)>>2]|0;if(!e){e=0;break}if((e|0)!=(b|0))jL(c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0,e);d=d+1|0}while(1){d=c[(c[a+264>>2]|0)+(e<<2)>>2]|0;if(!d)break;if((d|0)!=(b|0)){jL(c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0,d);a=c[f>>2]|0}e=e+1|0}if(b|0)kL(b);return}function kL(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;b=c[a>>2]&3;d=c[((b|0)==3?a:a+48|0)+40>>2]|0;e=c[d+16>>2]|0;if((c[e+280>>2]|0)==(a|0))i=1;else{e=c[((b|0)==2?a:a+-48|0)+40>>2]|0;i=-1;d=e;e=c[e+16>>2]|0}g=c[e+180>>2]|0;b=0;f=0;while(1){h=c[g+(f<<2)>>2]|0;if(!h)break;b=(lL(h,d,i)|0)+b|0;f=f+1|0}g=c[e+172>>2]|0;e=0;while(1){f=c[g+(e<<2)>>2]|0;if(!f)break;b=(lL(f,d,i)|0)+b|0;e=e+1|0}c[(c[a+16>>2]|0)+160>>2]=b;return}function lL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=c[a>>2]&3;f=c[((h|0)==3?a:a+48|0)+40>>2]|0;e=(f|0)==(b|0);h=((h|0)==2?a:a+-48|0)+40|0;if(e)f=c[h>>2]|0;g=c[b+16>>2]|0;i=c[(c[f+16>>2]|0)+288>>2]|0;f=c[a+16>>2]|0;a=c[f+156>>2]|0;if((c[g+284>>2]|0)<=(i|0)?(i|0)<=(c[g+288>>2]|0):0){if((c[f+164>>2]|0)>-1)f=c[f+160>>2]|0;else f=0;g=0;f=f-a|0}else{g=1;f=a}if((d|0)>0)e=(c[h>>2]|0)==(b|0);i=e?1:-1;return ((((g|0)==0?i:0-i|0)|0)<0?0-f|0:f)|0}function mL(a){a=a|0;var b=0,d=0;a=c[(c[a+16>>2]|0)+280>>2]|0;while(1){b=a+12|0;d=c[b>>2]|0;if(!((d|0)!=(a|0)&(d|0)!=0))break;a=c[d+12>>2]|0;if(!a){a=d;continue}c[b>>2]=a}return a|0}function nL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=a+16|0;e=c[h>>2]|0;g=e+232|0;c[g>>2]=(c[g>>2]|0)+d;g=0;while(1){f=c[(c[e+264>>2]|0)+(g<<2)>>2]|0;if(!f){g=0;break}f=c[((c[f>>2]&3|0)==3?f:f+48|0)+40>>2]|0;if((f|0)!=(b|0)){nL(f,a,d);e=c[h>>2]|0}g=g+1|0}while(1){f=c[(c[e+272>>2]|0)+(g<<2)>>2]|0;if(!f)break;f=c[((c[f>>2]&3|0)==2?f:f+-48|0)+40>>2]|0;if((f|0)!=(b|0)){nL(f,a,d);e=c[h>>2]|0}g=g+1|0}return}function oL(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=l;l=l+32|0;d=(c[b+16>>2]|0)+164|0;if((c[d>>2]|0)>-1){dA(1,102754,h)|0;Ca(189124,1)}g=c[47325]|0;c[d>>2]=g;d=c[47326]|0;c[47325]=g+1;c[d+(g<<2)>>2]=b;d=c[b>>2]|0;g=b+48|0;e=c[((d&3|0)==3?b:g)+40>>2]|0;if(!(a[(c[e+16>>2]|0)+157>>0]|0)){f=c[47332]|0;d=c[47333]|0;c[47333]=d+1;c[f+(d<<2)>>2]=e;d=c[b>>2]|0}f=b+-48|0;e=c[((d&3|0)==2?b:f)+40>>2]|0;if(!(a[(c[e+16>>2]|0)+157>>0]|0)){i=c[47332]|0;d=c[47333]|0;c[47333]=d+1;c[i+(d<<2)>>2]=e;d=c[b>>2]|0}i=(c[((d&3|0)==3?b:g)+40>>2]|0)+16|0;d=c[i>>2]|0;a[d+157>>0]=1;e=c[d+272>>2]|0;d=d+276|0;g=c[d>>2]|0;c[d>>2]=g+1;c[e+(g<<2)>>2]=b;g=c[i>>2]|0;c[(c[g+272>>2]|0)+(c[g+276>>2]<<2)>>2]=0;i=c[i>>2]|0;if(!(c[(c[i+180>>2]|0)+((c[i+276>>2]|0)+-1<<2)>>2]|0)){dA(1,102788,h+8|0)|0;Ca(189124,1)}i=(c[((c[b>>2]&3|0)==2?b:f)+40>>2]|0)+16|0;e=c[i>>2]|0;a[e+157>>0]=1;f=c[e+264>>2]|0;e=e+268|0;g=c[e>>2]|0;c[e>>2]=g+1;c[f+(g<<2)>>2]=b;b=c[i>>2]|0;c[(c[b+264>>2]|0)+(c[b+268>>2]<<2)>>2]=0;i=c[i>>2]|0;if(!(c[(c[i+172>>2]|0)+((c[i+268>>2]|0)+-1<<2)>>2]|0)){dA(1,102823,h+16|0)|0;Ca(189124,1)}else{l=h;return}}function pL(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;while(1){i=a+12|0;d=c[i>>2]|0;if((d|0)==0|(d|0)==(a|0))break;else a=d}while(1){h=b+12|0;d=c[h>>2]|0;if((d|0)==0|(d|0)==(b|0))break;else b=d}if((a|0)!=(b|0)){d=c[a+8>>2]|0;e=c[b+8>>2]|0;if((e&d|0)<=-1)Aa(102677,102632,327,102724);f=c[a+4>>2]|0;g=c[b+4>>2]|0;if((e|0)!=-1){d=(d|0)==-1?b:(g|0)<(f|0)?a:b;a=d;d=c[d+8>>2]|0}c[h>>2]=a;c[i>>2]=a;c[a+4>>2]=g+f;if((d|0)>-1)j=a;else Aa(102735,102632,335,102724)}else j=a;return j|0}function qL(a,b,d){a=a|0;b=b|0;d=d|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;l=mL(a)|0;if(d){k=c[d>>2]&3;if(((c[(c[(c[((k|0)==2?d:d+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[(c[(c[((k|0)==3?d:d+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)|0)!=(e[(c[d+16>>2]|0)+170>>1]|0|0))f=3}else{d=0;f=3}a:do if((f|0)==3){k=a+16|0;j=0;while(1){f=c[k>>2]|0;i=c[(c[f+180>>2]|0)+(j<<2)>>2]|0;if(!i){j=0;break}f=i+16|0;g=i+-48|0;h=c[((c[i>>2]&3|0)==2?i:g)+40>>2]|0;do if((c[(c[f>>2]|0)+164>>2]|0)>-1){if((h|0)!=(b|0))d=qL(h,a,d)|0}else if((mL(h)|0)!=(l|0)){if(d|0?(m=c[i>>2]&3,h=c[d>>2]&3,((c[(c[(c[((m|0)==2?i:g)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[(c[(c[((m|0)==3?i:i+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(e[(c[f>>2]|0)+170>>1]|0)|0)>=((c[(c[(c[((h|0)==2?d:d+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[(c[(c[((h|0)==3?d:d+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(e[(c[d+16>>2]|0)+170>>1]|0)|0)):0)break;d=i}while(0);j=j+1|0}while(1){f=c[(c[f+172>>2]|0)+(j<<2)>>2]|0;if(!f)break a;g=f+16|0;h=f+48|0;i=c[((c[f>>2]&3|0)==3?f:h)+40>>2]|0;do if((c[(c[g>>2]|0)+164>>2]|0)>-1){if((i|0)!=(b|0))d=qL(i,a,d)|0}else if((mL(i)|0)!=(l|0)){if(d|0?(i=c[f>>2]&3,m=c[d>>2]&3,((c[(c[(c[((i|0)==2?f:f+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[(c[(c[((i|0)==3?f:h)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(e[(c[g>>2]|0)+170>>1]|0)|0)>=((c[(c[(c[((m|0)==2?d:d+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[(c[(c[((m|0)==3?d:d+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(e[(c[d+16>>2]|0)+170>>1]|0)|0)):0)break;d=f}while(0);j=j+1|0;f=c[k>>2]|0}}while(0);return d|0}function rL(a,b){a=a|0;b=b|0;var d=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;l=a+16|0;d=c[l>>2]|0;c[d+280>>2]=b;a=1;h=0;while(1){g=c[(c[d+172>>2]|0)+(h<<2)>>2]|0;if(!g){h=0;break}f=c[g+16>>2]|0;if(((c[f+164>>2]|0)<=-1?(i=c[g>>2]&3,j=g+48|0,k=c[(c[((i|0)==3?g:j)+40>>2]|0)+16>>2]|0,(c[k+280>>2]|0)==0):0)?((c[(c[(c[((i|0)==2?g:g+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[k+232>>2]|0)|0)==(e[f+170>>1]|0|0):0){oL(g);a=(rL(c[((c[g>>2]&3|0)==3?g:j)+40>>2]|0,b)|0)+a|0;d=c[l>>2]|0}h=h+1|0}while(1){f=c[(c[d+180>>2]|0)+(h<<2)>>2]|0;if(!f)break;g=c[f+16>>2]|0;if(((c[g+164>>2]|0)<=-1?(m=c[f>>2]&3,n=f+-48|0,o=c[(c[((m|0)==2?f:n)+40>>2]|0)+16>>2]|0,(c[o+280>>2]|0)==0):0)?((c[o+232>>2]|0)-(c[(c[(c[((m|0)==3?f:f+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)|0)==(e[g+170>>1]|0|0):0){oL(f);a=(rL(c[((c[f>>2]&3|0)==2?f:n)+40>>2]|0,b)|0)+a|0;d=c[l>>2]|0}h=h+1|0}return a|0}function sL(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=NA(a,102887)|0;if(!d)d=30;else d=d6(d)|0;return LK(a,b,c,d)|0}function tL(a){a=+a;return +((c[47187]|0)==0?a:+h[23322]-a)}function uL(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0;s=l;l=l+16|0;r=s;c[47334]=c[(c[(c[d+64>>2]|0)+8>>2]|0)+4>>2];vL(d);i=c[d+16>>2]|0;u=+h[i+32>>3];t=+h[i+40>>3];wL(e,102898,+h[b+352>>3]);wL(e,102905,u/72.0);wL(e,102905,t/72.0);xL(e);i=gC(d)|0;while(1){if(!i)break;g=i+16|0;if(!(a[(c[g>>2]|0)+118>>0]|0)){yL(e,102907,ZD(HB(i)|0)|0);q=(c[g>>2]|0)+16|0;c[r>>2]=c[q>>2];c[r+4>>2]=c[q+4>>2];c[r+8>>2]=c[q+8>>2];c[r+12>>2]=c[q+12>>2];zL(e,r);if(!(a[(c[(c[g>>2]|0)+104>>2]|0)+82>>0]|0)){b=uC(i)|0;b=AL(b,c[c[(c[g>>2]|0)+104>>2]>>2]|0)|0}else b=ZD(OA(i,c[47216]|0)|0)|0;wL(e,102905,+h[(c[g>>2]|0)+32>>3]);wL(e,102905,+h[(c[g>>2]|0)+40>>3]);yL(e,102905,b);yL(e,102905,$O(i,c[47219]|0,111368)|0);yL(e,102905,c[c[(c[g>>2]|0)+8>>2]>>2]|0);yL(e,102905,$O(i,c[47202]|0,137615)|0);b=$O(i,c[47203]|0,195341)|0;if(!(a[b>>0]|0))b=$O(i,c[47202]|0,135101)|0;yL(e,102905,b);xL(e)}i=hC(d,i)|0}o=f<<24>>24==0;n=gC(d)|0;while(1){if(!n)break;m=UA(d,n)|0;while(1){if(!m)break;if(o){f=195341;j=195341}else{j=NA(m,111756)|0;f=NA(m,111765)|0;f=f|0?f:195341;j=j|0?j:195341}p=m+16|0;b=c[p>>2]|0;k=c[b+8>>2]|0;q=m+48|0;a:do if(k){i=c[k+4>>2]|0;b=0;g=0;while(1){if((b|0)>=(i|0))break;v=(c[(c[k>>2]|0)+(b*48|0)+4>>2]|0)+g|0;b=b+1|0;g=v}yL(e,0,111751);BL(e,c[((c[m>>2]&3|0)==3?m:q)+40>>2]|0,j);BL(e,c[((c[m>>2]&3|0)==2?m:m+-48|0)+40>>2]|0,f);CL(e,g);f=0;while(1){b=c[p>>2]|0;g=c[b+8>>2]|0;if((f|0)>=(c[g+4>>2]|0))break a;i=c[g>>2]|0;g=c[i+(f*48|0)>>2]|0;i=c[i+(f*48|0)+4>>2]|0;b=0;while(1){if((b|0)>=(i|0))break;v=g+(b<<4)|0;c[r>>2]=c[v>>2];c[r+4>>2]=c[v+4>>2];c[r+8>>2]=c[v+8>>2];c[r+12>>2]=c[v+12>>2];zL(e,r);b=b+1|0}f=f+1|0}}while(0);if(c[b+96>>2]|0){v=uC(c[((c[m>>2]&3|0)==3?m:q)+40>>2]|0)|0;yL(e,102905,AL(v,c[c[(c[p>>2]|0)+96>>2]>>2]|0)|0);v=(c[(c[p>>2]|0)+96>>2]|0)+56|0;c[r>>2]=c[v>>2];c[r+4>>2]=c[v+4>>2];c[r+8>>2]=c[v+8>>2];c[r+12>>2]=c[v+12>>2];zL(e,r)}yL(e,102905,$O(m,c[47254]|0,111368)|0);yL(e,102905,$O(m,c[47238]|0,137615)|0);xL(e);m=WA(d,m)|0}n=hC(d,n)|0}DL(102913,e);l=s;return}function vL(a){a=a|0;var b=0.0;if(c[47187]|0){a=c[a+16>>2]|0;b=+h[a+40>>3]+ +h[a+24>>3];h[23322]=b;h[23323]=b/72.0}return}function wL(a,b,c){a=a|0;b=b|0;c=+c;var d=0,e=0,f=0;f=l;l=l+1040|0;e=f;d=f+8|0;if(b|0)DL(b,a);h[e>>3]=c;i2(d,102919,e)|0;DL(d,a);l=f;return}function xL(b){b=b|0;a[195237]=10;vb[c[47334]&127](b,195237)|0;return}function yL(a,b,c){a=a|0;b=b|0;c=c|0;if(b|0)DL(b,a);DL(c,a);return}function zL(a,b){a=a|0;b=b|0;var d=0.0;wL(a,102905,+h[b>>3]/72.0);d=+h[b+8>>3];wL(a,102905,((c[47187]|0)==0?d:+h[23322]-d)/72.0);return}function AL(a,b){a=a|0;b=b|0;var c=0;c=dD(a,b)|0;b=ZD(c)|0;fD(a,c)|0;return b|0}function BL(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;if(!(a[(c[d+16>>2]|0)+118>>0]|0))d=ZD(HB(d)|0)|0;else{f=uC(d)|0;d=AL(f,(F3(HB(d)|0,58)|0)+1|0)|0}yL(b,102905,d);if(e|0?a[e>>0]|0:0)yL(b,108285,ZD(e)|0);return}function CL(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+1040|0;f=d;e=d+8|0;DL(102905,a);c[f>>2]=b;i2(e,137696,f)|0;DL(e,a);l=d;return}function DL(a,b){a=a|0;b=b|0;vb[c[47334]&127](b,a)|0;return}function EL(d,f,g){d=d|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0.0,Z=0;X=l;l=l+2288|0;V=X+208|0;U=X+192|0;T=X+176|0;S=X+160|0;R=X+144|0;Q=X+128|0;O=X+112|0;N=X+96|0;M=X+80|0;L=X+64|0;K=X+56|0;H=X+48|0;W=X+32|0;P=X+24|0;G=X;D=X+1264|0;E=X+224|0;F=d+16|0;B=(e[(c[F>>2]|0)+178>>1]|0)>2;PJ(1);vL(d);hA(E,1024,X+240|0);YP(d,1,102924,195341)|0;YP(d,1,102928,195341)|0;c[47200]=YP(d,1,141419,195341)|0;c[47199]=YP(d,1,141351,195341)|0;YP(d,2,102924,195341)|0;i=a[(c[F>>2]|0)+113>>0]|0;if(i&16){YP(d,1,102934,195341)|0;i=a[(c[F>>2]|0)+113>>0]|0}if(i&1){YP(d,2,102938,195341)|0;i=a[(c[F>>2]|0)+113>>0]|0}if(i&32){YP(d,2,102934,195341)|0;i=a[(c[F>>2]|0)+113>>0]|0}if(i&2){YP(d,2,102941,195341)|0;i=a[(c[F>>2]|0)+113>>0]|0}if(i&4){YP(d,2,102949,195341)|0;i=a[(c[F>>2]|0)+113>>0]|0}if(!(i&8)){u=0;v=0;w=0}else{w=YP(d,0,102938,195341)|0;v=YP(d,0,102957,195341)|0;u=YP(d,0,102964,195341)|0}y=YP(d,0,102972,195341)|0;z=E+4|0;A=E+8|0;t=0;i=0;x=gC(d)|0;while(1){if(!x)break;s=x+16|0;j=c[s>>2]|0;n=+h[j+16>>3];o=+h[j+24>>3];o=(c[47187]|0)==0?o:+h[23322]-o;if(B){Y=+h[(c[j+132>>2]|0)+16>>3]*72.0;h[G>>3]=n;h[G+8>>3]=o;h[G+16>>3]=Y;i2(D,102975,G)|0;kA(E,D)|0;j=3;while(1){if((j|0)>=(e[(c[F>>2]|0)+178>>1]|0))break;h[P>>3]=+h[(c[(c[s>>2]|0)+132>>2]|0)+(j<<3)>>3]*72.0;i2(D,102990,P)|0;kA(E,D)|0;j=j+1|0}j=c[z>>2]|0;if(j>>>0>=(c[A>>2]|0)>>>0){iA(E,1)|0;j=c[z>>2]|0}a[j>>0]=0;r=c[E>>2]|0;c[z>>2]=r;PA(x,102924,r)|0;r=x}else{h[W>>3]=n;h[W+8>>3]=o;i2(D,102996,W)|0;PA(x,102924,D)|0;r=x}h[H>>3]=+h[(c[s>>2]|0)+80>>3]/72.0;i2(D,102919,H)|0;HA(r,c[47199]|0,D)|0;j=c[s>>2]|0;h[K>>3]=(+h[j+88>>3]+ +h[j+96>>3])/72.0;i2(D,102919,K)|0;HA(r,c[47200]|0,D)|0;j=c[s>>2]|0;k=c[j+108>>2]|0;if((k|0)!=0?(a[k+81>>0]|0)!=0:0){Y=+h[k+64>>3];Y=(c[47187]|0)==0?Y:+h[23322]-Y;h[L>>3]=+h[k+56>>3];h[L+8>>3]=Y;i2(D,102996,L)|0;PA(r,102934,D)|0;j=c[s>>2]|0}if(f2(c[c[j+8>>2]>>2]|0,106521)|0){if(c[47232]|0?(fN(x)|0)<<24>>24:0){k=c[(c[s>>2]|0)+12>>2]|0;q=k+8|0;j=c[q>>2]|0;if((j|0)<3){j=NA(r,103006)|0;if(!j)j=8;else j=d6(j)|0;j=(j|0)<3?8:j}p=k+44|0;n=+(j|0);m=0;while(1){if((m|0)>=(j|0))break;if((m|0)>0){k=c[z>>2]|0;if(k>>>0>=(c[A>>2]|0)>>>0){iA(E,1)|0;k=c[z>>2]|0}c[z>>2]=k+1;a[k>>0]=32}k=(c[47187]|0)!=0;if((c[q>>2]|0)>2){Z=c[p>>2]|0;Y=+h[Z+(m<<4)+8>>3]/72.0;Y=k?+h[23323]-Y:Y;h[M>>3]=+h[Z+(m<<4)>>3]/72.0;h[M+8>>3]=Y;i2(D,103019,M)|0}else{Z=c[s>>2]|0;Y=+(m|0)/n*3.141592653589793*2.0;o=+h[Z+32>>3]*.5*+I(+Y);Y=+h[Z+40>>3]*.5*+J(+Y);Y=k?+h[23323]-Y:Y;h[N>>3]=o;h[N+8>>3]=Y;i2(D,103019,N)|0}kA(E,D)|0;m=m+1|0}k=c[47232]|0;j=c[z>>2]|0;if(j>>>0>=(c[A>>2]|0)>>>0){iA(E,1)|0;j=c[z>>2]|0}a[j>>0]=0;Z=c[E>>2]|0;c[z>>2]=Z;HA(r,k,Z)|0}}else{FL(x,c[j+12>>2]|0,E);mA(E)|0;j=c[z>>2]|0;if(j>>>0>=(c[A>>2]|0)>>>0){iA(E,1)|0;j=c[z>>2]|0}a[j>>0]=0;Z=c[E>>2]|0;c[z>>2]=Z;PA(r,102928,Z)|0}a:do if((c[47185]|0)>0){s=UA(d,x)|0;j=t;while(1){if(!s)break a;r=s+16|0;k=c[r>>2]|0;do if((a[k+112>>0]|0)!=6?(C=c[k+8>>2]|0,(C|0)!=0):0){q=0;k=C;while(1){if((q|0)>=(c[k+4>>2]|0))break;if((q|0)>0){k=c[z>>2]|0;if(k>>>0>=(c[A>>2]|0)>>>0){iA(E,1)|0;k=c[z>>2]|0}c[z>>2]=k+1;a[k>>0]=59;k=c[(c[r>>2]|0)+8>>2]|0}k=c[k>>2]|0;if(c[k+(q*48|0)+8>>2]|0){Y=+h[k+(q*48|0)+24>>3];Y=(c[47187]|0)==0?Y:+h[23322]-Y;h[O>>3]=+h[k+(q*48|0)+16>>3];h[O+8>>3]=Y;i2(D,103029,O)|0;kA(E,D)|0;i=1;k=c[c[(c[r>>2]|0)+8>>2]>>2]|0}if(c[k+(q*48|0)+12>>2]|0){Y=+h[k+(q*48|0)+40>>3];Y=(c[47187]|0)==0?Y:+h[23322]-Y;h[Q>>3]=+h[k+(q*48|0)+32>>3];h[Q+8>>3]=Y;i2(D,103042,Q)|0;kA(E,D)|0;j=1}p=0;while(1){k=c[(c[r>>2]|0)+8>>2]|0;m=c[k>>2]|0;if((p|0)>=(c[m+(q*48|0)+4>>2]|0))break;if((p|0)>0){k=c[z>>2]|0;if(k>>>0>=(c[A>>2]|0)>>>0){iA(E,1)|0;k=c[z>>2]|0}c[z>>2]=k+1;a[k>>0]=32;k=c[c[(c[r>>2]|0)+8>>2]>>2]|0}else k=m;Z=c[k+(q*48|0)>>2]|0;Y=+h[Z+(p<<4)+8>>3];Y=(c[47187]|0)==0?Y:+h[23322]-Y;h[R>>3]=+h[Z+(p<<4)>>3];h[R+8>>3]=Y;i2(D,102996,R)|0;kA(E,D)|0;p=p+1|0}q=q+1|0}k=c[z>>2]|0;if(k>>>0>=(c[A>>2]|0)>>>0){iA(E,1)|0;k=c[z>>2]|0}a[k>>0]=0;k=c[E>>2]|0;c[z>>2]=k;PA(s,102924,k)|0;k=c[r>>2]|0;m=c[k+96>>2]|0;if(m){Y=+h[m+64>>3];Y=(c[47187]|0)==0?Y:+h[23322]-Y;h[S>>3]=+h[m+56>>3];h[S+8>>3]=Y;i2(D,102996,S)|0;PA(s,102938,D)|0;k=c[r>>2]|0}m=c[k+108>>2]|0;do if(m){if(!(a[m+81>>0]|0))break;Y=+h[m+64>>3];Y=(c[47187]|0)==0?Y:+h[23322]-Y;h[T>>3]=+h[m+56>>3];h[T+8>>3]=Y;i2(D,102996,T)|0;PA(s,102934,D)|0;k=c[r>>2]|0}while(0);m=c[k+100>>2]|0;if(m){Y=+h[m+64>>3];Y=(c[47187]|0)==0?Y:+h[23322]-Y;h[U>>3]=+h[m+56>>3];h[U+8>>3]=Y;i2(D,102996,U)|0;PA(s,102941,D)|0;k=c[r>>2]|0}k=c[k+104>>2]|0;if(!k)break;Y=+h[k+64>>3];Y=(c[47187]|0)==0?Y:+h[23322]-Y;h[V>>3]=+h[k+56>>3];h[V+8>>3]=Y;i2(D,102996,V)|0;PA(s,102949,D)|0}while(0);s=WA(d,s)|0}}else j=t;while(0);t=j;x=hC(d,x)|0}GL(d,y,w,v,u);lA(E);if(b[(c[F>>2]|0)+136>>1]&1)SP(d);c[f>>2]=i;c[g>>2]=t;PJ(0);l=X;return}function FL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0.0,k=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0;i=l;l=l+1056|0;f=i;e=i+32|0;g=b+48|0;if(!(c[g>>2]|0)){q=c[a+16>>2]|0;p=+h[q+16>>3];m=(c[47187]|0)!=0;j=+h[q+24>>3];o=j+ +h[b+24>>3];k=+h[23322];n=p+ +h[b+32>>3];j=j+ +h[b+40>>3];h[f>>3]=+h[b+16>>3]+p;h[f+8>>3]=m?k-o:o;h[f+16>>3]=n;h[f+24>>3]=m?k-j:j;i2(e,103080,f)|0;kA(d,e)|0}e=b+56|0;b=0;while(1){if((b|0)>=(c[g>>2]|0))break;FL(a,c[(c[e>>2]|0)+(b<<2)>>2]|0,d);b=b+1|0}l=i;return}function GL(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,v=0;p=l;l=l+1088|0;k=p+56|0;n=p+48|0;m=p+32|0;i=p;j=p+64|0;o=b+16|0;v=c[o>>2]|0;s=(c[47187]|0)!=0;u=+h[v+24>>3];r=+h[23322];t=+h[v+32>>3];q=+h[v+40>>3];h[i>>3]=+h[v+16>>3];h[i+8>>3]=s?r-u:u;h[i+16>>3]=t;h[i+24>>3]=s?r-q:q;i2(j,103055,i)|0;HA(b,d,j)|0;i=c[(c[o>>2]|0)+12>>2]|0;if((i|0)!=0?(a[c[i>>2]>>0]|0)!=0:0){u=+h[i+64>>3];u=(c[47187]|0)==0?u:+h[23322]-u;h[m>>3]=+h[i+56>>3];h[m+8>>3]=u;i2(j,102996,m)|0;HA(b,e,j)|0;v=c[(c[o>>2]|0)+12>>2]|0;u=+h[v+32>>3];h[n>>3]=+h[v+24>>3]/72.0;i2(j,103075,n)|0;HA(b,f,j)|0;h[k>>3]=u/72.0;i2(j,103075,k)|0;HA(b,g,j)|0;b=1}else b=1;while(1){i=c[o>>2]|0;if((b|0)>(c[i+180>>2]|0))break;GL(c[(c[i+184>>2]|0)+(b<<2)>>2]|0,d,e,f,g);b=b+1|0}l=p;return}function HL(a){a=a|0;var b=0;b=l;l=l+16|0;EL(a,b,b+4|0);l=b;return}function IL(){return Sz(20788,c[4591]|0)|0}function JL(a,b,c){a=a|0;b=b|0;c=c|0;l6(b);return}function KL(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=c[b>>2]|0;e=c[d>>2]|0;if((a|0)<=(e|0))if((a|0)<(e|0))a=-1;else{b=c[b+4>>2]|0;d=c[d+4>>2]|0;return ((b|0)>(d|0)?1:((b|0)<(d|0))<<31>>31)|0}else a=1;return a|0}function LL(a){a=a|0;Oz(a)|0;return}function ML(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=c[b>>2];c[e+4>>2]=c[b+4>>2];b=NL(e)|0;if((eb[c[a>>2]&63](a,b,1)|0)!=(b|0))l6(b);l=d;return}function NL(a){a=a|0;var b=0,d=0,e=0;b=HK(16)|0;e=a;d=c[e+4>>2]|0;a=b+8|0;c[a>>2]=c[e>>2];c[a+4>>2]=d;return b|0}function OL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+16|0;f=e+8|0;g=e;c[g>>2]=b;c[g+4>>2]=d;c[f>>2]=c[g>>2];c[f+4>>2]=c[g+4>>2];b=NL(f)|0;if((eb[c[a>>2]&63](a,b,1)|0)!=(b|0))l6(b);l=e;return}function PL(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=l;l=l+16|0;e=d;g=b;f=c[g+4>>2]|0;b=e+8|0;c[b>>2]=c[g>>2];c[b+4>>2]=f;b=(eb[c[a>>2]&63](a,e,4)|0)!=0&1;l=d;return b|0}function QL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f+8>>2]=b;c[f+12>>2]=d;d=(eb[c[a>>2]&63](a,f,4)|0)!=0&1;l=e;return d|0}function RL(a){a=a|0;return Uz(a)|0}function SL(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;d=HK((Uz(a)|0)<<3)|0;b=d;a=Qz(a)|0;while(1){if(!a)break;g=a+8|0;f=c[g+4>>2]|0;e=b;c[e>>2]=c[g>>2];c[e+4>>2]=f;b=b+8|0;a=c[a>>2]|0}return d|0}function TL(){var a=0,b=0,d=0,e=0;a=IK(40)|0;b=a;d=20824;e=b+36|0;do{c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}while((b|0)<(e|0));c[a+36>>2]=0;return Sz(a,c[4591]|0)|0}function UL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;d=d+36|0;a=c[d>>2]|0;if(!a)a=IK(20)|0;else c[d>>2]=c[a>>2];f=b+8|0;e=c[f+4>>2]|0;d=a+8|0;c[d>>2]=c[f>>2];c[d+4>>2]=e;c[a+16>>2]=c[b+16>>2];return a|0}function VL(a,b,d){a=a|0;b=b|0;d=d|0;d=d+36|0;c[b>>2]=c[d>>2];c[d>>2]=b;return}function WL(a){a=a|0;eb[c[a>>2]&63](a,0,64)|0;return}function XL(a){a=a|0;var b=0,d=0;b=c[a+4>>2]|0;Oz(a)|0;a=c[b+36>>2]|0;while(1){if(!a)break;d=c[a>>2]|0;l6(a);a=d}l6(b);return}function YL(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+32|0;g=f;c[g+8>>2]=b;c[g+12>>2]=d;c[g+16>>2]=e;e=c[(eb[c[a>>2]&63](a,g,1)|0)+16>>2]|0;l=f;return e|0}function ZL(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,g=0.0,i=0.0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=l;l=l+160|0;q=t+144|0;d=t+64|0;j=t+128|0;k=t+112|0;m=t+96|0;n=t+48|0;o=t+32|0;p=t+16|0;r=t;s=a+16|0;a=c[s>>2]|0;e=+h[a+16>>3];f=+h[a+24>>3];g=+h[a+32>>3];i=+h[a+40>>3];a=d+16|0;if((b+-1|0)>>>0<2){_L(j,e,i);c[q>>2]=c[j>>2];c[q+4>>2]=c[j+4>>2];c[q+8>>2]=c[j+8>>2];c[q+12>>2]=c[j+12>>2];$L(d,q);_L(k,g,f);c[q>>2]=c[k>>2];c[q+4>>2]=c[k+4>>2];c[q+8>>2]=c[k+8>>2];c[q+12>>2]=c[k+12>>2];$L(m,q);c[a>>2]=c[m>>2];c[a+4>>2]=c[m+4>>2];c[a+8>>2]=c[m+8>>2];c[a+12>>2]=c[m+12>>2]}else{_L(n,e,f);c[q>>2]=c[n>>2];c[q+4>>2]=c[n+4>>2];c[q+8>>2]=c[n+8>>2];c[q+12>>2]=c[n+12>>2];$L(d,q);_L(o,g,i);c[q>>2]=c[o>>2];c[q+4>>2]=c[o+4>>2];c[q+8>>2]=c[o+8>>2];c[q+12>>2]=c[o+12>>2];$L(p,q);c[a>>2]=c[p>>2];c[a+4>>2]=c[p+4>>2];c[a+8>>2]=c[p+8>>2];c[a+12>>2]=c[p+12>>2]}a=(c[s>>2]|0)+16|0;c[a>>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];c[a+16>>2]=c[d+16>>2];c[a+20>>2]=c[d+20>>2];c[a+24>>2]=c[d+24>>2];c[a+28>>2]=c[d+28>>2];a=c[(c[s>>2]|0)+12>>2]|0;if(!a)a=1;else{a=a+56|0;c[q>>2]=c[a>>2];c[q+4>>2]=c[a+4>>2];c[q+8>>2]=c[a+8>>2];c[q+12>>2]=c[a+12>>2];$L(r,q);c[a>>2]=c[r>>2];c[a+4>>2]=c[r+4>>2];c[a+8>>2]=c[r+8>>2];c[a+12>>2]=c[r+12>>2];a=1}while(1){d=c[s>>2]|0;if((a|0)>(c[d+180>>2]|0))break;ZL(c[(c[d+184>>2]|0)+(a<<2)>>2]|0,b);a=a+1|0}l=t;return}function _L(a,b,c){a=a|0;b=+b;c=+c;h[a>>3]=b;h[a+8>>3]=c;return}function $L(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=l;l=l+32|0;g=d+16|0;e=d;f=(c[47335]|0)*90|0;c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];kK(e,g,f);c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];h[b>>3]=+h[b>>3]-+h[23324];e=b+8|0;h[e>>3]=+h[e>>3]-+h[23325];c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];l=d;return}function aM(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0.0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0;A=l;l=l+1168|0;x=A+144|0;z=A+96|0;y=A+64|0;w=A+48|0;s=A+32|0;t=A+16|0;u=A;c[w>>2]=0;c[w+4>>2]=0;c[w+8>>2]=0;c[w+12>>2]=0;v=b+16|0;q=c[(c[v>>2]|0)+116>>2]|0;c[47335]=q&3;q=q&1;a[195239]=q;if(!(q<<24>>24))cM(b);else bM(b);dM(b);q=c[v>>2]|0;g=c[q+12>>2]|0;do if(g|0?(a[g+81>>0]|0)==0:0){j=g+24|0;c[w>>2]=c[j>>2];c[w+4>>2]=c[j+4>>2];c[w+8>>2]=c[j+8>>2];c[w+12>>2]=c[j+12>>2];r=+h[w>>3]+16.0;h[w>>3]=r;j=w+8|0;e=+h[j>>3]+8.0;h[j>>3]=e;j=(a[q+275>>0]&1)!=0;m=q+16|0;n=q+40|0;o=q+24|0;p=q+32|0;if(a[195239]|0){if(j)h[p>>3]=e+ +h[p>>3];else h[m>>3]=+h[m>>3]-e;e=+h[n>>3];f=+h[o>>3];B=e-f;i=(r-B)*.5;if(!(r>B))break;h[o>>3]=f-i;h[n>>3]=e+i;break}k=(c[47335]|0)==0;do if(j)if(k){h[n>>3]=e+ +h[n>>3];break}else{h[o>>3]=+h[o>>3]-e;break}else if(k){h[o>>3]=+h[o>>3]-e;break}else{h[n>>3]=e+ +h[n>>3];break}while(0);e=+h[p>>3];f=+h[m>>3];B=e-f;i=(r-B)*.5;if(r>B){h[m>>3]=f-i;h[p>>3]=e+i}}while(0);if(d){switch(c[47335]|0){case 0:{u=q+16|0;c[46648]=c[u>>2];c[46649]=c[u+4>>2];c[46650]=c[u+8>>2];c[46651]=c[u+12>>2];break}case 1:{_L(s,-+h[q+40>>3],+h[q+16>>3]);c[46648]=c[s>>2];c[46649]=c[s+4>>2];c[46650]=c[s+8>>2];c[46651]=c[s+12>>2];break}case 2:{_L(t,+h[q+16>>3],-+h[q+40>>3]);c[46648]=c[t>>2];c[46649]=c[t+4>>2];c[46650]=c[t+8>>2];c[46651]=c[t+12>>2];break}case 3:{_L(u,+h[q+24>>3],+h[q+16>>3]);c[46648]=c[u>>2];c[46649]=c[u+4>>2];c[46650]=c[u+8>>2];c[46651]=c[u+12>>2];break}default:{}}eM(b);g=c[(c[v>>2]|0)+12>>2]|0}if(g|0?(a[g+81>>0]|0)==0:0){c[x>>2]=c[w>>2];c[x+4>>2]=c[w+4>>2];c[x+8>>2]=c[w+8>>2];c[x+12>>2]=c[w+12>>2];fM(b,x)}if(c[47181]|0){e=+h[23324];f=+h[23325];if(!(a[195239]|0)){h[z>>3]=f;h[z+8>>3]=e;h[z+16>>3]=f;h[z+24>>3]=e;h[z+32>>3]=-e;h[z+40>>3]=-f;i2(x,103316,z)|0}else{h[y>>3]=e;h[y+8>>3]=f;h[y+16>>3]=e;h[y+24>>3]=f;i2(x,103101,y)|0}z=Y3(x)|0;c[c[47181]>>2]=z}l=A;return}function bM(b){b=b|0;var d=0,e=0.0,f=0.0,g=0,i=0,j=0.0,k=0,l=0;l=b+16|0;if(((vC(b)|0)!=(b|0)?(i=c[l>>2]|0,k=c[i+12>>2]|0,(k|0)!=0):0)?(a[k+81>>0]|0)==0:0){b=a[i+275>>0]|0;if(!(b&1)){j=+h[i+16>>3]+ +h[i+96>>3]*.5;d=i+104|0}else{j=+h[i+32>>3]-+h[i+64>>3]*.5;d=i+72|0}g=b<<24>>24;f=+h[d>>3]*.5;b=i+24|0;do if(!(g&4)){e=+h[i+40>>3];if(!(g&2)){e=(e+ +h[b>>3])*.5;break}else{e=e-f;break}}else e=f+ +h[b>>3];while(0);h[k+56>>3]=j;h[k+64>>3]=e;a[(c[(c[l>>2]|0)+12>>2]|0)+81>>0]=1;b=1}else b=1;while(1){d=c[l>>2]|0;if((b|0)>(c[d+180>>2]|0))break;bM(c[(c[d+184>>2]|0)+(b<<2)>>2]|0);b=b+1|0}return}function cM(b){b=b|0;var d=0,e=0.0,f=0.0,g=0,i=0,j=0.0,k=0,l=0;l=b+16|0;if(((vC(b)|0)!=(b|0)?(i=c[l>>2]|0,k=c[i+12>>2]|0,(k|0)!=0):0)?(a[k+81>>0]|0)==0:0){b=a[i+275>>0]|0;if(!(b&1)){j=+h[i+24>>3]+ +h[i+56>>3]*.5;d=i+48|0}else{j=+h[i+40>>3]-+h[i+88>>3]*.5;d=i+80|0}g=b<<24>>24;f=+h[d>>3]*.5;b=i+32|0;do if(!(g&4)){e=+h[i+16>>3];if(!(g&2)){e=(e+ +h[b>>3])*.5;break}else{e=f+e;break}}else e=+h[b>>3]-f;while(0);h[k+56>>3]=e;h[k+64>>3]=j;a[(c[(c[l>>2]|0)+12>>2]|0)+81>>0]=1;b=1}else b=1;while(1){d=c[l>>2]|0;if((b|0)>(c[d+180>>2]|0))break;cM(c[(c[d+184>>2]|0)+(b<<2)>>2]|0);b=b+1|0}return}function dM(e){e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;S=l;l=l+544|0;L=S+504|0;R=S+448|0;Q=S+408|0;K=S+352|0;J=S+312|0;I=S+304|0;H=S+248|0;M=S+200|0;B=S+184|0;O=S+96|0;q=S+488|0;C=S+456|0;D=S+416|0;E=S+376|0;F=S+360|0;G=S+320|0;w=S+288|0;x=S+256|0;y=S+232|0;z=S+152|0;A=S+136|0;f=S+56|0;N=S+16|0;P=S;p=e+16|0;u=c[p>>2]|0;g=b[u+136>>1]&14;u=d[u+113>>0]|0;if(!((u&54|0)==0?(u&1|0)==0|(c[47186]|0)!=0:0)){u=g<<16>>16!=0;o=gC(e)|0;h=0;j=0;i=0;while(1){if(!o)break;g=c[(c[o+16>>2]|0)+108>>2]|0;do if(g)if(!(a[g+81>>0]|0)){i=i+1|0;break}else{h=h+1|0;break}while(0);n=UA(e,o)|0;g=j;while(1){if(!n)break;k=c[n+16>>2]|0;j=c[k+108>>2]|0;m=k+8|0;do if(j){if(a[j+81>>0]|0){h=h+1|0;break}if(u)g=((c[m>>2]|0)!=0&1)+g|0}while(0);j=c[k+100>>2]|0;do if(j){if(a[j+81>>0]|0){h=h+1|0;break}if(u)g=((c[m>>2]|0)!=0&1)+g|0}while(0);j=c[k+104>>2]|0;do if(j){if(a[j+81>>0]|0){h=h+1|0;break}if(u)g=((c[m>>2]|0)!=0&1)+g|0}while(0);j=c[k+96>>2]|0;do if(j){if(a[j+81>>0]|0){h=h+1|0;break}if(u)g=((c[m>>2]|0)!=0&1)+g|0}while(0);n=WA(e,n)|0}o=hC(e,o)|0;j=g}if(!(a[(c[p>>2]|0)+113>>0]&8))o=0;else o=hM(e)|0;t=j+i|0;if(t|0){p=h+j+o+(qB(e)|0)|0;r=HK(p*40|0)|0;s=HK(t*40|0)|0;_L(M,2147483647.0,2147483647.0);g=M+16|0;_L(q,-2147483647.0,-2147483647.0);c[g>>2]=c[q>>2];c[g+4>>2]=c[q+4>>2];c[g+8>>2]=c[q+8>>2];c[g+12>>2]=c[q+12>>2];g=s;i=r;n=gC(e)|0;while(1){if(!n)break;c[L>>2]=c[M>>2];c[L+4>>2]=c[M+4>>2];c[L+8>>2]=c[M+8>>2];c[L+12>>2]=c[M+12>>2];c[L+16>>2]=c[M+16>>2];c[L+20>>2]=c[M+20>>2];c[L+24>>2]=c[M+24>>2];c[L+28>>2]=c[M+28>>2];iM(C,n,i,L);c[M>>2]=c[C>>2];c[M+4>>2]=c[C+4>>2];c[M+8>>2]=c[C+8>>2];c[M+12>>2]=c[C+12>>2];c[M+16>>2]=c[C+16>>2];c[M+20>>2]=c[C+20>>2];c[M+24>>2]=c[C+24>>2];c[M+28>>2]=c[C+28>>2];h=c[(c[n+16>>2]|0)+108>>2]|0;do if(h)if(!(a[h+81>>0]|0)){c[L>>2]=c[B>>2];c[L+4>>2]=c[B+4>>2];c[L+8>>2]=c[B+8>>2];c[L+12>>2]=c[B+12>>2];kM(h,i,g,0,L);g=g+40|0;break}else{i=i+40|0;c[L>>2]=c[M>>2];c[L+4>>2]=c[M+4>>2];c[L+8>>2]=c[M+8>>2];c[L+12>>2]=c[M+12>>2];c[L+16>>2]=c[M+16>>2];c[L+20>>2]=c[M+20>>2];c[L+24>>2]=c[M+24>>2];c[L+28>>2]=c[M+28>>2];jM(D,h,i,L);c[M>>2]=c[D>>2];c[M+4>>2]=c[D+4>>2];c[M+8>>2]=c[D+8>>2];c[M+12>>2]=c[D+12>>2];c[M+16>>2]=c[D+16>>2];c[M+20>>2]=c[D+20>>2];c[M+24>>2]=c[D+24>>2];c[M+28>>2]=c[D+28>>2];break}while(0);m=UA(e,n)|0;i=i+40|0;while(1){if(!m)break;k=m+16|0;h=c[k>>2]|0;j=c[h+96>>2]|0;a:do if(!j)v=52;else{do if(!(a[j+81>>0]|0)){if(u?c[h+8>>2]|0:0){tO(F,e,m);c[L>>2]=c[F>>2];c[L+4>>2]=c[F+4>>2];c[L+8>>2]=c[F+8>>2];c[L+12>>2]=c[F+12>>2];kM(j,i,g,1,L);g=g+40|0;break}c[H>>2]=c[j>>2];dA(0,104128,H)|0;break a}else{c[L>>2]=c[M>>2];c[L+4>>2]=c[M+4>>2];c[L+8>>2]=c[M+8>>2];c[L+12>>2]=c[M+12>>2];c[L+16>>2]=c[M+16>>2];c[L+20>>2]=c[M+20>>2];c[L+24>>2]=c[M+24>>2];c[L+28>>2]=c[M+28>>2];jM(E,j,i,L);c[M>>2]=c[E>>2];c[M+4>>2]=c[E+4>>2];c[M+8>>2]=c[E+8>>2];c[M+12>>2]=c[E+12>>2];c[M+16>>2]=c[E+16>>2];c[M+20>>2]=c[E+20>>2];c[M+24>>2]=c[E+24>>2];c[M+28>>2]=c[E+28>>2]}while(0);i=i+40|0;h=c[k>>2]|0;v=52}while(0);b:do if((v|0)==52){v=0;j=c[h+104>>2]|0;if(j){do if(!(a[j+81>>0]|0)){if(u?c[h+8>>2]|0:0){lM(w,m);c[L>>2]=c[w>>2];c[L+4>>2]=c[w+4>>2];c[L+8>>2]=c[w+8>>2];c[L+12>>2]=c[w+12>>2];kM(j,i,g,1,L);g=g+40|0;break}c[I>>2]=c[j>>2];dA(0,104163,I)|0;break b}else{c[L>>2]=c[M>>2];c[L+4>>2]=c[M+4>>2];c[L+8>>2]=c[M+8>>2];c[L+12>>2]=c[M+12>>2];c[L+16>>2]=c[M+16>>2];c[L+20>>2]=c[M+20>>2];c[L+24>>2]=c[M+24>>2];c[L+28>>2]=c[M+28>>2];jM(G,j,i,L);c[M>>2]=c[G>>2];c[M+4>>2]=c[G+4>>2];c[M+8>>2]=c[G+8>>2];c[M+12>>2]=c[G+12>>2];c[M+16>>2]=c[G+16>>2];c[M+20>>2]=c[G+20>>2];c[M+24>>2]=c[G+24>>2];c[M+28>>2]=c[G+28>>2]}while(0);i=i+40|0;h=c[k>>2]|0}j=c[h+100>>2]|0;if(j){do if(!(a[j+81>>0]|0)){if(u?c[h+8>>2]|0:0){mM(y,m);c[L>>2]=c[y>>2];c[L+4>>2]=c[y+4>>2];c[L+8>>2]=c[y+8>>2];c[L+12>>2]=c[y+12>>2];kM(j,i,g,1,L);g=g+40|0;break}c[J>>2]=c[j>>2];dA(0,104203,J)|0;break b}else{c[L>>2]=c[M>>2];c[L+4>>2]=c[M+4>>2];c[L+8>>2]=c[M+8>>2];c[L+12>>2]=c[M+12>>2];c[L+16>>2]=c[M+16>>2];c[L+20>>2]=c[M+20>>2];c[L+24>>2]=c[M+24>>2];c[L+28>>2]=c[M+28>>2];jM(x,j,i,L);c[M>>2]=c[x>>2];c[M+4>>2]=c[x+4>>2];c[M+8>>2]=c[x+8>>2];c[M+12>>2]=c[x+12>>2];c[M+16>>2]=c[x+16>>2];c[M+20>>2]=c[x+20>>2];c[M+24>>2]=c[x+24>>2];c[M+28>>2]=c[x+28>>2]}while(0);i=i+40|0;h=c[k>>2]|0}j=c[h+108>>2]|0;if(j){do if(!(a[j+81>>0]|0)){if(u?c[h+8>>2]|0:0){tO(A,e,m);c[L>>2]=c[A>>2];c[L+4>>2]=c[A+4>>2];c[L+8>>2]=c[A+8>>2];c[L+12>>2]=c[A+12>>2];kM(j,i,g,1,L);g=g+40|0;break}c[K>>2]=c[j>>2];dA(0,104243,K)|0;break b}else{c[L>>2]=c[M>>2];c[L+4>>2]=c[M+4>>2];c[L+8>>2]=c[M+8>>2];c[L+12>>2]=c[M+12>>2];c[L+16>>2]=c[M+16>>2];c[L+20>>2]=c[M+20>>2];c[L+24>>2]=c[M+24>>2];c[L+28>>2]=c[M+28>>2];jM(z,j,i,L);c[M>>2]=c[z>>2];c[M+4>>2]=c[z+4>>2];c[M+8>>2]=c[z+8>>2];c[M+12>>2]=c[z+12>>2];c[M+16>>2]=c[z+16>>2];c[M+20>>2]=c[z+20>>2];c[M+24>>2]=c[z+24>>2];c[M+28>>2]=c[z+28>>2]}while(0);i=i+40|0}}while(0);m=WA(e,m)|0}n=hC(e,n)|0}if(o|0){c[f>>2]=c[M>>2];c[f+4>>2]=c[M+4>>2];c[f+8>>2]=c[M+8>>2];c[f+12>>2]=c[M+12>>2];c[f+16>>2]=c[M+16>>2];c[f+20>>2]=c[M+20>>2];c[f+24>>2]=c[M+24>>2];c[f+28>>2]=c[M+28>>2];c[f+32>>2]=i;h=L;g=h+40|0;do{c[h>>2]=c[f>>2];h=h+4|0;f=f+4|0}while((h|0)<(g|0));nM(N,e,L);c[M>>2]=c[N>>2];c[M+4>>2]=c[N+4>>2];c[M+8>>2]=c[N+8>>2];c[M+12>>2]=c[N+12>>2];c[M+16>>2]=c[N+16>>2];c[M+20>>2]=c[N+20>>2];c[M+24>>2]=c[N+24>>2];c[M+28>>2]=c[N+28>>2]}a[O+32>>0]=aP(e,DA(e,0,104279,0)|0,1)|0;c[O>>2]=c[M>>2];c[O+4>>2]=c[M+4>>2];c[O+8>>2]=c[M+8>>2];c[O+12>>2]=c[M+12>>2];c[O+16>>2]=c[M+16>>2];c[O+20>>2]=c[M+20>>2];c[O+24>>2]=c[M+24>>2];c[O+28>>2]=c[M+28>>2];fT(r,p,s,t,O)|0;if(a[195234]|0)oM(r,p,s,t,O);f=0;g=0;h=s;while(1){if((g|0)>=(t|0))break;if(a[h+36>>0]|0){O=c[h+32>>2]|0;a[O+81>>0]=1;N=O+56|0;pM(P,h);c[N>>2]=c[P>>2];c[N+4>>2]=c[P+4>>2];c[N+8>>2]=c[P+8>>2];c[N+12>>2]=c[P+12>>2];xP(e,O);f=f+1|0}g=g+1|0;h=h+40|0}if(!(a[195234]|0)){if((f|0)!=(t|0)){c[R>>2]=f;c[R+4>>2]=t;dA(0,104324,R)|0}}else{R=c[15715]|0;c[Q>>2]=f;c[Q+4>>2]=t;z4(R,104291,Q)|0}l6(r);l6(s)}}l=S;return}function eM(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0;i=l;l=l+48|0;e=i+32|0;f=i+16|0;g=i;if(+h[23324]!=0.0|+h[23325]!=0.0|(c[47335]|0)!=0){d=gC(a)|0;while(1){if(!d)break;if(c[47335]|0)oQ(d,0);b=d+16|0;j=(c[b>>2]|0)+16|0;c[e>>2]=c[j>>2];c[e+4>>2]=c[j+4>>2];c[e+8>>2]=c[j+8>>2];c[e+12>>2]=c[j+12>>2];$L(f,e);c[j>>2]=c[f>>2];c[j+4>>2]=c[f+4>>2];c[j+8>>2]=c[f+8>>2];c[j+12>>2]=c[f+12>>2];b=c[(c[b>>2]|0)+108>>2]|0;if(b|0){j=b+56|0;c[e>>2]=c[j>>2];c[e+4>>2]=c[j+4>>2];c[e+8>>2]=c[j+8>>2];c[e+12>>2]=c[j+12>>2];$L(g,e);c[j>>2]=c[g>>2];c[j+4>>2]=c[g+4>>2];c[j+8>>2]=c[g+8>>2];c[j+12>>2]=c[g+12>>2]}a:do if((c[47185]|0)==1){b=UA(a,d)|0;while(1){if(!b)break a;gM(b);b=WA(a,b)|0}}while(0);d=hC(a,d)|0}ZL(a,c[(c[a+16>>2]|0)+116>>2]&3)}l=i;return}function fM(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0,j=0;i=b+16|0;j=c[i>>2]|0;g=a[j+275>>0]|0;b=j+32|0;do if(!(g&4)){e=+h[j+16>>3];if(!(g&2)){f=(e+ +h[b>>3])*.5;break}else{f=e+ +h[d>>3]*.5;break}}else f=+h[b>>3]-+h[d>>3]*.5;while(0);e=+h[d+8>>3]*.5;if(!(g&1))e=e+ +h[j+24>>3];else e=+h[j+40>>3]-e;j=c[j+12>>2]|0;h[j+56>>3]=f;h[j+64>>3]=e;a[(c[(c[i>>2]|0)+12>>2]|0)+81>>0]=1;return}function gM(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;s=l;l=l+144|0;q=s+120|0;e=s+16|0;i=s+104|0;j=s+88|0;k=s+72|0;m=s+56|0;n=s+40|0;o=s+24|0;r=s;p=b+16|0;d=c[p>>2]|0;f=c[d+8>>2]|0;if(!f){if((a[195236]|0)==0?(a[d+112>>0]|0)!=6:0){q=HB(c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0)|0;r=HB(c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)|0;c[e>>2]=q;c[e+4>>2]=r;dA(1,104111,e)|0}}else{h=0;b=f;while(1){if((h|0)>=(c[b+4>>2]|0))break;g=c[b>>2]|0;b=c[g+(h*48|0)>>2]|0;e=c[g+(h*48|0)+4>>2]|0;f=c[g+(h*48|0)+8>>2]|0;g=c[g+(h*48|0)+12>>2]|0;d=0;while(1){if((d|0)>=(e|0))break;t=b+(d<<4)|0;c[q>>2]=c[t>>2];c[q+4>>2]=c[t+4>>2];c[q+8>>2]=c[t+8>>2];c[q+12>>2]=c[t+12>>2];$L(i,q);c[t>>2]=c[i>>2];c[t+4>>2]=c[i+4>>2];c[t+8>>2]=c[i+8>>2];c[t+12>>2]=c[i+12>>2];d=d+1|0}if(f|0){t=(c[c[(c[p>>2]|0)+8>>2]>>2]|0)+(h*48|0)+16|0;c[q>>2]=c[t>>2];c[q+4>>2]=c[t+4>>2];c[q+8>>2]=c[t+8>>2];c[q+12>>2]=c[t+12>>2];$L(j,q);c[t>>2]=c[j>>2];c[t+4>>2]=c[j+4>>2];c[t+8>>2]=c[j+8>>2];c[t+12>>2]=c[j+12>>2]}if(g|0){t=(c[c[(c[p>>2]|0)+8>>2]>>2]|0)+(h*48|0)+32|0;c[q>>2]=c[t>>2];c[q+4>>2]=c[t+4>>2];c[q+8>>2]=c[t+8>>2];c[q+12>>2]=c[t+12>>2];$L(k,q);c[t>>2]=c[k>>2];c[t+4>>2]=c[k+4>>2];c[t+8>>2]=c[k+8>>2];c[t+12>>2]=c[k+12>>2]}d=c[p>>2]|0;h=h+1|0;b=c[d+8>>2]|0}b=c[d+96>>2]|0;if(b){d=b+56|0;c[q>>2]=c[d>>2];c[q+4>>2]=c[d+4>>2];c[q+8>>2]=c[d+8>>2];c[q+12>>2]=c[d+12>>2];$L(m,q);c[d>>2]=c[m>>2];c[d+4>>2]=c[m+4>>2];c[d+8>>2]=c[m+8>>2];c[d+12>>2]=c[m+12>>2];d=c[p>>2]|0}b=c[d+108>>2]|0;if(b){d=b+56|0;c[q>>2]=c[d>>2];c[q+4>>2]=c[d+4>>2];c[q+8>>2]=c[d+8>>2];c[q+12>>2]=c[d+12>>2];$L(n,q);c[d>>2]=c[n>>2];c[d+4>>2]=c[n+4>>2];c[d+8>>2]=c[n+8>>2];c[d+12>>2]=c[n+12>>2];d=c[p>>2]|0}b=c[d+100>>2]|0;if(b){d=b+56|0;c[q>>2]=c[d>>2];c[q+4>>2]=c[d+4>>2];c[q+8>>2]=c[d+8>>2];c[q+12>>2]=c[d+12>>2];$L(o,q);c[d>>2]=c[o>>2];c[d+4>>2]=c[o+4>>2];c[d+8>>2]=c[o+8>>2];c[d+12>>2]=c[o+12>>2];d=c[p>>2]|0}d=c[d+104>>2]|0;if(d|0){t=d+56|0;c[q>>2]=c[t>>2];c[q+4>>2]=c[t+4>>2];c[q+8>>2]=c[t+8>>2];c[q+12>>2]=c[t+12>>2];$L(r,q);c[t>>2]=c[r>>2];c[t+4>>2]=c[r+4>>2];c[t+8>>2]=c[r+8>>2];c[t+12>>2]=c[r+12>>2]}}l=s;return}function hM(b){b=b|0;var d=0,e=0,f=0;f=b+16|0;if((vC(b)|0)!=(b|0)?(d=c[(c[f>>2]|0)+12>>2]|0,(d|0)!=0):0){e=1;b=(a[d+81>>0]|0)!=0&1}else{e=1;b=0}while(1){d=c[f>>2]|0;if((e|0)>(c[d+180>>2]|0))break;d=(hM(c[(c[d+184>>2]|0)+(e<<2)>>2]|0)|0)+b|0;e=e+1|0;b=d}return b|0}function iM(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0.0,k=0.0,m=0.0,n=0;g=l;l=l+32|0;i=g;n=(a[195239]|0)==0;d=c[d+16>>2]|0;m=+h[d+40>>3]*72.0;j=+h[d+32>>3]*72.0;k=n?j:m;j=n?m:j;h[e+16>>3]=k;h[e+24>>3]=j;d=d+16|0;c[e>>2]=c[d>>2];c[e+4>>2]=c[d+4>>2];c[e+8>>2]=c[d+8>>2];c[e+12>>2]=c[d+12>>2];h[e>>3]=+h[e>>3]-k*.5;d=e+8|0;h[d>>3]=+h[d>>3]-j*.5;c[i>>2]=c[f>>2];c[i+4>>2]=c[f+4>>2];c[i+8>>2]=c[f+8>>2];c[i+12>>2]=c[f+12>>2];c[i+16>>2]=c[f+16>>2];c[i+20>>2]=c[f+20>>2];c[i+24>>2]=c[f+24>>2];c[i+28>>2]=c[f+28>>2];qM(b,e,i);l=g;return}function jM(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0.0,k=0.0,m=0.0,n=0;g=l;l=l+32|0;i=g;n=(a[195239]|0)==0;j=+h[d+24>>3];m=+h[d+32>>3];k=n?j:m;j=n?m:j;h[e+16>>3]=k;h[e+24>>3]=j;d=d+56|0;c[e>>2]=c[d>>2];c[e+4>>2]=c[d+4>>2];c[e+8>>2]=c[d+8>>2];c[e+12>>2]=c[d+12>>2];h[e>>3]=+h[e>>3]-k*.5;d=e+8|0;h[d>>3]=+h[d>>3]-j*.5;c[i>>2]=c[f>>2];c[i+4>>2]=c[f+4>>2];c[i+8>>2]=c[f+8>>2];c[i+12>>2]=c[f+12>>2];c[i+16>>2]=c[f+16>>2];c[i+20>>2]=c[f+20>>2];c[i+24>>2]=c[f+24>>2];c[i+28>>2]=c[f+28>>2];qM(b,e,i);l=g;return}function kM(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;if(f|0){f=d+16|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2]}f=b+24|0;if(!(a[195239]|0)){c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2]}else{h[e>>3]=+h[b+32>>3];h[e+8>>3]=+h[f>>3]}c[e+32>>2]=b;a[e+36>>0]=0;c[d+32>>2]=e;return}function lM(a,b){a=a|0;b=b|0;b=sO(b)|0;do if(b){b=c[b>>2]|0;if(!(c[b+8>>2]|0)){b=c[b>>2]|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];break}else{b=b+16|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];break}}else{c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0}while(0);return}function mM(a,b){a=a|0;b=b|0;var d=0;b=sO(b)|0;do if(b){d=c[b>>2]|0;b=(c[b+4>>2]|0)+-1|0;if(!(c[d+(b*48|0)+12>>2]|0)){d=(c[d+(b*48|0)>>2]|0)+((c[d+(b*48|0)+4>>2]|0)+-1<<4)|0;c[a>>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];break}else{d=d+(b*48|0)+32|0;c[a>>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];break}}else{c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0}while(0);return}function nM(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+112|0;k=q+72|0;n=q+32|0;o=q;p=d+16|0;j=1;while(1){f=c[p>>2]|0;if((j|0)>(c[f+180>>2]|0))break;f=c[(c[f+184>>2]|0)+(j<<2)>>2]|0;g=k;h=e;i=g+40|0;do{c[g>>2]=c[h>>2];g=g+4|0;h=h+4|0}while((g|0)<(i|0));nM(n,f,k);g=e;h=n;i=g+40|0;do{c[g>>2]=c[h>>2];g=g+4|0;h=h+4|0}while((g|0)<(i|0));j=j+1|0}if(((vC(d)|0)!=(d|0)?(m=c[(c[p>>2]|0)+12>>2]|0,m|0):0)?a[m+81>>0]|0:0){p=e+32|0;n=c[p>>2]|0;c[k>>2]=c[e>>2];c[k+4>>2]=c[e+4>>2];c[k+8>>2]=c[e+8>>2];c[k+12>>2]=c[e+12>>2];c[k+16>>2]=c[e+16>>2];c[k+20>>2]=c[e+20>>2];c[k+24>>2]=c[e+24>>2];c[k+28>>2]=c[e+28>>2];jM(o,m,n,k);c[e>>2]=c[o>>2];c[e+4>>2]=c[o+4>>2];c[e+8>>2]=c[o+8>>2];c[e+12>>2]=c[o+12>>2];c[e+16>>2]=c[o+16>>2];c[e+20>>2]=c[o+20>>2];c[e+24>>2]=c[o+24>>2];c[e+28>>2]=c[o+28>>2];c[p>>2]=(c[p>>2]|0)+40}g=b;h=e;i=g+40|0;do{c[g>>2]=c[h>>2];g=g+4|0;h=h+4|0}while((g|0)<(i|0));l=q;return}function oM(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var i=0.0,j=0.0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+160|0;r=s+96|0;p=s+48|0;o=s;q=c[15715]|0;n=d[g+32>>0]|0;i=+h[g>>3];j=+h[g+8>>3];k=+h[g+16>>3];m=+h[g+24>>3];c[o>>2]=b;c[o+4>>2]=f;c[o+8>>2]=n;h[o+16>>3]=i;h[o+24>>3]=j;h[o+32>>3]=k;h[o+40>>3]=m;z4(q,104366,o)|0;a:do if((d[195234]|0)>=2){_3(104426,8,1,q)|0;o=0;while(1){if((o|0)>=(b|0))break;g=c[a+32>>2]|0;i=+h[a>>3];j=+h[a+8>>3];k=+h[a+16>>3];m=+h[a+24>>3];if(!g)n=195341;else n=c[c[g+32>>2]>>2]|0;c[p>>2]=o;h[p+8>>3]=i;h[p+16>>3]=j;h[p+24>>3]=k;h[p+32>>3]=m;c[p+40>>2]=g;c[p+44>>2]=n;z4(q,104435,p)|0;o=o+1|0;a=a+40|0}_3(104478,8,1,q)|0;g=0;while(1){if((g|0)>=(f|0))break a;b=d[e+36>>0]|0;i=+h[e+16>>3];j=+h[e+24>>3];k=+h[e>>3];m=+h[e+8>>3];p=c[c[e+32>>2]>>2]|0;c[r>>2]=g;c[r+4>>2]=e;c[r+8>>2]=b;h[r+16>>3]=i;h[r+24>>3]=j;h[r+32>>3]=k;h[r+40>>3]=m;c[r+48>>2]=p;z4(q,104487,r)|0;e=e+40|0;g=g+1|0}}while(0);l=s;return}function pM(a,b){a=a|0;b=b|0;var c=0.0;c=+h[b+24>>3]+ +h[b+8>>3]*.5;h[a>>3]=+h[b+16>>3]+ +h[b>>3]*.5;h[a+8>>3]=c;return}function qM(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0.0,j=0.0;e=l;l=l+16|0;f=e;j=+h[b>>3];h[d>>3]=+h[(+h[d>>3]>3];g=d+8|0;i=+h[b+8>>3];h[g>>3]=+h[(+h[g>>3]>3];j=j+ +h[b+16>>3];h[f>>3]=j;i=i+ +h[b+24>>3];h[f+8>>3]=i;g=d+16|0;h[g>>3]=+h[(+h[g>>3]>j?g:f)>>3];b=d+24|0;h[b>>3]=+h[(+h[b>>3]>i?g:f)+8>>3];c[a>>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];c[a+16>>2]=c[d+16>>2];c[a+20>>2]=c[d+20>>2];c[a+24>>2]=c[d+24>>2];c[a+28>>2]=c[d+28>>2];l=e;return}function rM(a){a=a|0;aM(a,1);return}function sM(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;e=l;l=l+16|0;d=e;b=kP(NA(a,105827)|0)|0;if(b){b=tM(b)|0;if(b|0){f=c[b+40>>2]|0;d=c[b+44>>2]|0;g=a+16|0;a=c[g>>2]|0;h[a+32>>3]=+(f|0)/72.0;h[a+40>>3]=+(d|0)/72.0;a=HK(12)|0;c[(c[g>>2]|0)+12>>2]=a;c[a>>2]=c[b+12>>2];c[a+4>>2]=((f|0)/-2|0)-(c[b+32>>2]|0);c[a+8>>2]=((d|0)/-2|0)-(c[b+36>>2]|0)}}else{c[d>>2]=HB(a)|0;dA(0,104535,d)|0}l=e;return}function tM(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;p=l;l=l+1152|0;i=p+24|0;h=p+8|0;e=p;f=p+120|0;j=p+44|0;k=p+40|0;m=p+36|0;n=p+32|0;o=p+28|0;d=c[47336]|0;if(!d){d=Sz(20860,c[4591]|0)|0;c[47336]=d}d=eb[c[d>>2]&63](d,b,512)|0;do if(!d){g=f4(b,139124)|0;if(!g){c[e>>2]=b;dA(0,104584,e)|0;d=0;break}else{d=0;e=0}while(1){if(!(o4(f,1024,g)|0)){f=11;break}c[h>>2]=k;c[h+4>>2]=m;c[h+8>>2]=n;c[h+12>>2]=o;q=(q4(f,104612,h)|0)==4;e=q?1:e;if((a[f>>0]|0)!=37){q=(C4(f,104641)|0)==0;d=q?d:1}if((e|0)!=0&(d|0)!=0){f=12;break}}if((f|0)==11)if(!e){c[i>>2]=b;dA(0,104646,i)|0;d=0}else f=12;if((f|0)==12){q=IK(64)|0;k=c[k>>2]|0;c[q+32>>2]=k;m=c[m>>2]|0;c[q+40>>2]=(c[n>>2]|0)-k;c[q+36>>2]=(c[o>>2]|0)-m;c[q+8>>2]=b;o=c[47337]|0;c[47337]=o+1;c[q+12>>2]=o;i3(V5(g)|0,j)|0;o=c[j+36>>2]|0;n=IK(o+1|0)|0;c[q+52>>2]=n;y4(g,0,0)|0;X5(n,o,1,g)|0;a[n+o>>0]=0;o=c[47336]|0;eb[c[o>>2]&63](o,q,1)|0;a[q+16>>0]=d;d=q}l4(g)|0}while(0);l=p;return d|0}function uM(a,b,d){a=a|0;b=b|0;d=d|0;l6(c[b+52>>2]|0);return}function vM(a){a=a|0;l6(c[(c[a+16>>2]|0)+12>>2]|0);return}function wM(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+16|0;m=n+8|0;k=n;j=(d|0)!=0;a:do if(j){h=0;f=0;b:while(1)while(1){if(h)break a;g=c[d+(f<<2)>>2]|0;if(!g){i=6;break a}f=f+1|0;if(!(a[g>>0]|0)){h=1;continue b}}}else i=6;while(0);c:do if((i|0)==6)while(1){f=c[e>>2]|0;if(!f)break c;mF(b,f)|0;mF(b,153748)|0;e=e+4|0;i=6}while(0);d:do if(j){h=0;while(1){f=c[d+(h<<2)>>2]|0;if(!f)break d;do if(a[f>>0]|0){e=kP(f)|0;if(!e){c[k>>2]=f;dA(0,104685,k)|0;break}g=f4(e,139124)|0;if(!g){c[m>>2]=e;dA(0,104713,m)|0;break}while(1){f=jP(g)|0;if(!f)break;mF(b,f)|0}mF(b,153748)|0;l4(g)|0}while(0);h=h+1|0}}while(0);l=n;return}function xM(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;d=c[d+52>>2]|0;a:while(1){e=a[d>>0]|0;b:do switch(e<<24>>24){case 0:break a;case 37:{if((a[d+1>>0]|0)==37){f=d+2|0;if((((N3(f,104741,3)|0)!=0?(N3(f,104745,5)|0)!=0:0)?(N3(f,104751,3)|0)!=0:0)?(N3(f,104755,7)|0)!=0:0)break b;else f=37;while(1){if((f&255)<14){e=d+1|0;if(!(7166>>>(f&255)&1))break}else e=d+1|0;d=e;f=a[e>>0]|0}switch(f<<24>>24){case 0:continue a;case 13:{if((a[e>>0]|0)==10){d=d+2|0;continue a}break}default:{}}d=e;continue a}else e=37;break}default:{}}while(0);c:while(1){switch(e<<24>>24){case 10:case 13:case 0:break c;default:{}}nF(b,e<<24>>24)|0;f=d+1|0;d=f;e=a[f>>0]|0}f=d+1|0;switch(e<<24>>24){case 13:{if((a[f>>0]|0)==10)d=d+2|0;else g=21;break}case 0:break;default:g=21}if((g|0)==21){g=0;d=f}nF(b,10)|0}return}function yM(b){b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+16|0;e=f;d=c[47336]|0;a:do if(d|0){d=eb[c[d>>2]&63](d,0,128)|0;while(1){if(!d)break a;if(!(a[d+16>>0]|0)){c[e>>2]=c[d+12>>2];sF(b,104763,e);mF(b,104781)|0;xM(b,d);mF(b,104799)|0;mF(b,104814)|0}g=c[47336]|0;d=eb[c[g>>2]&63](g,d,8)|0}}while(0);l=f;return}function zM(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=l;l=l+16|0;e=g;a:do switch(d|0){case 0:{f=b;break}case 1:{f=dQ(b)|0;break}default:{switch(AM(b)|0){case 2:break;case 1:{f=dQ(b)|0;break a}default:{f=b;break a}}if(!(c[47338]|0)){dA(0,104826,e)|0;c[47338]=1;f=b}else f=b}}while(0);if(!(c[47339]|0))hA(189356,0,0);d=c[47340]|0;if(d>>>0>=(c[47341]|0)>>>0){iA(189356,1)|0;d=c[47340]|0}c[47340]=d+1;a[d>>0]=40;e=f;b:while(1){switch(a[e>>0]|0){case 0:break b;case 92:case 41:case 40:{d=c[47340]|0;if(d>>>0>=(c[47341]|0)>>>0){iA(189356,1)|0;d=c[47340]|0}c[47340]=d+1;a[d>>0]=92;break}default:{}}d=c[47340]|0;if(d>>>0>=(c[47341]|0)>>>0){iA(189356,1)|0;d=c[47340]|0}h=a[e>>0]|0;c[47340]=d+1;a[d>>0]=h;e=e+1|0}d=c[47340]|0;if(d>>>0>=(c[47341]|0)>>>0){iA(189356,1)|0;d=c[47340]|0}c[47340]=d+1;a[d>>0]=41;if((f|0)!=(b|0))l6(f);d=c[47340]|0;if(d>>>0>=(c[47341]|0)>>>0){iA(189356,1)|0;d=c[47340]|0}a[d>>0]=0;h=c[47339]|0;c[47340]=h;l=g;return h|0}function AM(b){b=b|0;var c=0,d=0;c=0;a:while(1){while(1){d=a[b>>0]|0;if(!(d<<24>>24))break a;if((d&255)<127)b=b+1|0;else break}if((d&-4)<<24>>24==-64){c=1;b=b+2|0}else{c=2;break}}return c|0}function BM(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;n=l;l=l+96|0;i=n+80|0;j=n+72|0;m=n+64|0;g=n+32|0;k=n;h[g>>3]=+h[a>>3];h[g+8>>3]=+h[a+8>>3];h[g+16>>3]=+h[b>>3];h[g+24>>3]=+h[b+8>>3];do if((gY(d,g,j)|0)>=0){if(!f){b=d+4|0;a=c[b>>2]|0;f=c[47344]|0;if((a|0)>(c[47343]|0)){a=a<<5;if(!f)a=IK(a)|0;else a=KK(f,a)|0;c[47344]=a;g=c[b>>2]|0;c[47343]=g;f=a}else g=a;b=c[d>>2]|0;a=0;while(1){if((a|0)>=(g|0))break;o=f+(a<<5)|0;d=b+(a<<4)|0;c[o>>2]=c[d>>2];c[o+4>>2]=c[d+4>>2];c[o+8>>2]=c[d+8>>2];c[o+12>>2]=c[d+12>>2];o=f+(a<<5)+16|0;d=a+1|0;p=b+(((d|0)%(g|0)|0)<<4)|0;c[o>>2]=c[p>>2];c[o+4>>2]=c[p+4>>2];c[o+8>>2]=c[p+8>>2];c[o+12>>2]=c[p+12>>2];a=d}c[k>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;c[k+20>>2]=0;c[k+24>>2]=0;c[k+28>>2]=0;c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];if((MX(f,g,i,k,m)|0)<0){a=0;break}}else{c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];DY(i,m)}a=m+4|0;if(!(CM(c[a>>2]|0)|0)){g=c[a>>2]|0;a=c[47345]|0;f=c[m>>2]|0;b=0;while(1){if((b|0)>=(g|0))break;p=a+(b<<4)|0;o=f+(b<<4)|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];b=b+1|0}c[e>>2]=g}else a=0}else a=0;while(0);l=n;return a|0}function CM(a){a=a|0;var b=0,d=0,e=0;e=l;l=l+16|0;d=e;b=c[47346]|0;do if((b|0)<(a|0)){a=a+300-((a|0)%300|0)+b|0;b=KK(c[47345]|0,a<<4)|0;c[47345]=b;if(!b){dA(1,104916,d)|0;a=1;break}else{c[47346]=a;a=0;break}}else a=0;while(0);l=e;return a|0}function DM(){var b=0,d=0,e=0;d=l;l=l+16|0;b=d;e=c[47347]|0;c[47347]=e+1;do if((e|0)<=0){e=IK(4800)|0;c[47345]=e;if(!e){dA(1,104939,b)|0;b=1;break}c[47346]=300;c[47348]=0;c[47349]=0;if(a[195234]|0){RO();b=0}else b=0}else b=0;while(0);l=d;return b|0}function EM(){var b=0,d=0,e=0,f=0.0,g=0,i=0;d=l;l=l+16|0;b=d;e=c[47347]|0;c[47347]=e+-1;if((e|0)<=1?(l6(c[47345]|0),a[195234]|0):0){e=c[15715]|0;i=c[47348]|0;g=c[47349]|0;f=+SO();c[b>>2]=i;c[b+4>>2]=g;h[b+8>>3]=f;z4(e,104977,b)|0}l=d;return}function FM(a,b){a=a|0;b=b|0;return GM(a,b,0)|0}function GM(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0.0;P=l;l=l+176|0;K=P+168|0;O=P+128|0;B=P+120|0;z=P+112|0;j=P+104|0;w=P+88|0;s=P+72|0;g=P+64|0;x=P+160|0;M=P+152|0;C=P+144|0;y=P+32|0;A=P;N=P+136|0;c[47348]=(c[47348]|0)+1;L=c[b+80>>2]|0;c[47349]=(c[47349]|0)+L;f=b+88|0;while(1){G=c[f>>2]|0;if(!G){H=4;break}f=c[G+16>>2]|0;if(!(a[f+112>>0]|0)){H=5;break}else f=f+116|0}do if((H|0)==4){dA(1,105020,g)|0;f=0}else if((H|0)==5){F=c[b+84>>2]|0;if(!(HM(L,F,b)|0)){i=L<<3;if((i|0)>(c[47350]|0)){f=c[47351]|0;g=L<<7;if(!f)f=IK(g)|0;else f=KK(f,g)|0;c[47351]=f;c[47350]=i}a:do if((L|0)>1?+h[F+8>>3]>+h[F+40>>3]:0){f=0;while(1){if((f|0)==(L|0)){u=1;break a}D=F+(f<<5)+24|0;Q=+h[D>>3];E=F+(f<<5)+8|0;h[D>>3]=-+h[E>>3];h[E>>3]=-Q;f=f+1|0}}else u=0;while(0);v=c[G>>2]&3;D=G+48|0;f=c[((v|0)==3?G:D)+40>>2]|0;E=G+-48|0;if((f|0)==(c[((v|0)==2?G:E)+40>>2]|0)){c[j>>2]=HB(f)|0;dA(1,105127,j)|0;f=0;break}t=L+-1|0;v=c[47351]|0;j=0;f=0;b:while(1){c:while(1){if((f|0)>=(L|0)){s=t;break b}i=F+(f<<5)+8|0;if((f|0)>0)k=+h[i>>3]>+h[F+(f+-1<<5)+8>>3]?-1:1;else k=0;r=f+1|0;if((f|0)<(t|0))m=+h[F+(r<<5)+8>>3]>+h[i>>3]?1:-1;else m=0;if((k|0)!=(m|0)){H=24;break}switch(k|0){case -1:{f=r;break}case 0:{H=28;break c}default:{H=29;break b}}}do if((H|0)==24){H=0;q=j+2|0;n=F+(f<<5)|0;o=F+(f<<5)+24|0;g=v+(j+1<<4)|0;p=v+(j<<4)+8|0;j=v+(j<<4)|0;if((k|0)==1|(m|0)==-1){h[j>>3]=+h[n>>3];h[p>>3]=+h[o>>3];h[g>>3]=+h[n>>3];f=q;break}else{f=F+(f<<5)+16|0;h[j>>3]=+h[f>>3];h[p>>3]=+h[i>>3];h[g>>3]=+h[f>>3];i=o;f=q;break}}else if((H|0)==28){H=0;q=F+(f<<5)|0;h[v+(j<<4)>>3]=+h[q>>3];h[v+(j<<4)+8>>3]=+h[F+(f<<5)+24>>3];g=v+(j+1<<4)|0;h[g>>3]=+h[q>>3];f=j+2|0}while(0);h[g+8>>3]=+h[i>>3];j=f;f=r}if((H|0)==29){c[s>>2]=k;c[s+4>>2]=k;c[s+8>>2]=480;dA(1,105062,s)|0;f=0;break}d:while(1){if((s|0)<=-1)break;g=F+(s<<5)+8|0;if((s|0)<(t|0))k=+h[g>>3]>+h[F+(s+1<<5)+8>>3]?-1:1;else k=0;if((s|0)>0)m=+h[F+(s+-1<<5)+8>>3]>+h[g>>3]?1:-1;else m=0;n=F+(s<<5)|0;f=j+1|0;i=j+2|0;o=F+(s<<5)+16|0;r=F+(s<<5)+24|0;e:do if((k|0)!=(m|0)){p=v+(f<<4)|0;q=v+(j<<4)|0;j=v+(j<<4)+8|0;if((k|0)==1|(m|0)==-1){h[q>>3]=+h[n>>3];h[j>>3]=+h[r>>3];h[p>>3]=+h[n>>3];break}else{h[q>>3]=+h[o>>3];h[j>>3]=+h[g>>3];h[p>>3]=+h[o>>3];g=r;break}}else switch(k|0){case 0:{h[v+(j<<4)>>3]=+h[o>>3];h[v+(j<<4)+8>>3]=+h[g>>3];h[v+(f<<4)>>3]=+h[o>>3];g=r;break e}case -1:{h[v+(j<<4)>>3]=+h[o>>3];h[v+(j<<4)+8>>3]=+h[g>>3];h[v+(f<<4)>>3]=+h[o>>3];h[v+(f<<4)+8>>3]=+h[r>>3];h[v+(i<<4)>>3]=+h[n>>3];f=j+3|0;h[v+(i<<4)+8>>3]=+h[r>>3];h[v+(f<<4)>>3]=+h[n>>3];i=j+4|0;break e}default:{H=42;break d}}while(0);h[v+(f<<4)+8>>3]=+h[g>>3];s=s+-1|0;j=i}if((H|0)==42){c[w>>2]=k;c[w+4>>2]=k;c[w+8>>2]=513;dA(1,105062,w)|0;f=0;break}f:do if(!u)f=0;else{f=0;while(1){if((f|0)>=(L|0)){f=0;break}u=F+(f<<5)+24|0;Q=+h[u>>3];w=F+(f<<5)+8|0;h[u>>3]=-+h[w>>3];h[w>>3]=-Q;f=f+1|0}while(1){if((f|0)>=(j|0)){f=0;break f}w=v+(f<<4)+8|0;h[w>>3]=-+h[w>>3];f=f+1|0}}while(0);while(1){if((f|0)>=(L|0))break;h[F+(f<<5)>>3]=2147483647.0;h[F+(f<<5)+16>>3]=-2147483648.0;f=f+1|0}c[x>>2]=v;i=x+4|0;c[i>>2]=j;h[y>>3]=+h[b>>3];h[y+8>>3]=+h[b+8>>3];h[y+16>>3]=+h[b+40>>3];h[y+24>>3]=+h[b+48>>3];if((gY(x,y,M)|0)<0){dA(1,105166,z)|0;f=0;break}if(!e){g=c[i>>2]|0;f=c[47344]|0;if((g|0)>(c[47343]|0)){g=g<<5;if(!f)f=IK(g)|0;else f=KK(f,g)|0;c[47344]=f;g=c[i>>2]|0;c[47343]=g}j=c[47351]|0;i=0;while(1){if((i|0)>=(g|0))break;y=f+(i<<5)|0;z=j+(i<<4)|0;c[y>>2]=c[z>>2];c[y+4>>2]=c[z+4>>2];c[y+8>>2]=c[z+8>>2];c[y+12>>2]=c[z+12>>2];y=f+(i<<5)+16|0;z=i+1|0;x=j+(((z|0)%(g|0)|0)<<4)|0;c[y>>2]=c[x>>2];c[y+4>>2]=c[x+4>>2];c[y+8>>2]=c[x+8>>2];c[y+12>>2]=c[x+12>>2];i=z}if(!(a[b+29>>0]|0)){c[A>>2]=0;c[A+4>>2]=0;c[A+8>>2]=0;c[A+12>>2]=0}else{Q=+h[b+16>>3];h[A>>3]=+I(+Q);h[A+8>>3]=+J(+Q)}i=A+16|0;if(!(a[b+69>>0]|0)){c[i>>2]=0;c[i+4>>2]=0;c[i+8>>2]=0;c[i+12>>2]=0}else{Q=+h[b+56>>3];h[i>>3]=-+I(+Q);h[A+24>>3]=-+J(+Q)};c[K>>2]=c[M>>2];c[K+4>>2]=c[M+4>>2];if((MX(f,g,K,A,C)|0)<0){dA(1,105205,B)|0;f=0;break}}else{c[K>>2]=c[M>>2];c[K+4>>2]=c[M+4>>2];DY(K,C)}k=C+4|0;if(!(CM(c[k>>2]|0)|0)){f=0;while(1){if((f|0)>=(L|0))break;h[F+(f<<5)>>3]=2147483647.0;h[F+(f<<5)+16>>3]=-2147483648.0;f=f+1|0}i=c[k>>2]|0;j=c[47345]|0;g=c[C>>2]|0;f=0;while(1){if((f|0)>=(i|0)){i=1;f=10;g=0;break}C=j+(f<<4)|0;B=g+(f<<4)|0;c[C>>2]=c[B>>2];c[C+4>>2]=c[B+4>>2];c[C+8>>2]=c[B+8>>2];c[C+12>>2]=c[B+12>>2];f=f+1|0}while(1){if(!((g|0)<15&i<<24>>24!=0))break;IM(F,L,c[47345]|0,c[k>>2]|0,f);j=0;while(1){if((j|0)>=(L|0))break;if(+h[F+(j<<5)>>3]==2147483647.0){H=84;break}if(+h[F+(j<<5)+16>>3]==-2147483648.0){H=84;break}j=j+1|0}if((H|0)==84){H=0;C=f<<1;f=C;g=(C|0)>(2147483647/(L|0)|0|0)?15:g}i=(j|0)==(L|0)?0:i;g=g+1|0}if(i<<24>>24){D=HB(c[((c[G>>2]&3|0)==3?G:D)+40>>2]|0)|0;H=HB(c[((c[G>>2]&3|0)==2?G:E)+40>>2]|0)|0;c[O>>2]=D;c[O+4>>2]=H;dA(0,105243,O)|0;c[K>>2]=c[M>>2];c[K+4>>2]=c[M+4>>2];DY(K,N);IM(F,L,c[N>>2]|0,c[N+4>>2]|0,10);l6(c[N>>2]|0)}c[d>>2]=c[k>>2];f=c[47345]|0}else f=0}else f=0}while(0);l=P;return f|0}function HM(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0,N=0,O=0,P=0,Q=0.0,R=0,S=0;S=l;l=l+32|0;J=S+16|0;I=S+8|0;m=S;f=0;k=0;while(1){if((k|0)>=(b|0))break;j=d+(k<<5)|0;t=+h[d+(k<<5)+8>>3]-+h[d+(k<<5)+24>>3];if(!((t>=0.0?t:-t)<.01)?(t=+h[j>>3]-+h[d+(k<<5)+16>>3],!((t>=0.0?t:-t)<.01)):0){if((f|0)!=(k|0)){P=d+(f<<5)|0;c[P>>2]=c[j>>2];c[P+4>>2]=c[j+4>>2];c[P+8>>2]=c[j+8>>2];c[P+12>>2]=c[j+12>>2];c[P+16>>2]=c[j+16>>2];c[P+20>>2]=c[j+20>>2];c[P+24>>2]=c[j+24>>2];c[P+28>>2]=c[j+28>>2]}f=f+1|0}k=k+1|0}K=d+16|0;do if(!(+h[d>>3]>+h[K>>3])?(M=d+8|0,N=d+24|0,!(+h[M>>3]>+h[N>>3])):0){O=f+-1|0;P=c[15715]|0;x=0;while(1){if((x|0)>=(O|0))break;E=x+1|0;F=d+(E<<5)|0;g=+h[F>>3];G=d+(E<<5)+16|0;i=+h[G>>3];if(g>i){R=16;break}B=d+(E<<5)+8|0;o=+h[B>>3];C=d+(E<<5)+24|0;p=+h[C>>3];if(o>p){R=16;break}H=d+(x<<5)+16|0;w=+h[H>>3]>3]>i;b=v&1;A=d+(x<<5)+24|0;u=+h[A>>3]>3]>p;j=m&1;y=b+f+k+j|0;n=(y|0)!=0;if(!((a[195234]|0)==0|n^1)){c[J>>2]=x;c[J+4>>2]=E;z4(P,105443,J)|0;JM(e)}a:do if(n){if(!w)if(!v)if(!u){if(m){m=0;n=f;f=C;j=z;R=24}}else{m=j;k=0;n=f;f=B;j=A;R=24}else{m=j;b=0;n=f;f=G;j=D;R=24}else{m=j;n=0;f=F;j=H;R=24}if((R|0)==24){R=0;x=~~+h[j>>3];h[j>>3]=+h[f>>3];h[f>>3]=+(x|0);j=m;f=n}n=y+-1|0;m=0;while(1){if((m|0)>=(n|0))break a;do if((f|0)!=1){if((b|0)==1){t=+(~~((+h[D>>3]+ +h[G>>3])*.5+.5)|0);h[G>>3]=t;h[D>>3]=t;b=0;break}if((k|0)==1){t=+(~~((+h[A>>3]+ +h[B>>3])*.5+.5)|0);h[B>>3]=t;h[A>>3]=t;k=0;break}if((j|0)==1){t=+(~~((+h[z>>3]+ +h[C>>3])*.5+.5)|0);h[C>>3]=t;h[z>>3]=t;j=0}}else{t=+(~~((+h[H>>3]+ +h[F>>3])*.5+.5)|0);h[F>>3]=t;h[H>>3]=t;f=0}while(0);m=m+1|0}}while(0);q=+h[D>>3];r=+h[H>>3];s=+h[F>>3];t=+h[G>>3];j=KM(~~q,~~r,~~s,~~t)|0;p=+h[z>>3];o=+h[A>>3];i=+h[B>>3];g=+h[C>>3];f=KM(~~p,~~o,~~i,~~g)|0;if(!((j|0)!=0&(f|0)!=0)){x=E;continue}if((j|0)<(f|0)){C=r-q>t-s;x=r>3]=C?(x?s:t):x?r:q;x=E;continue}else{C=o-p>g-i;x=o>3]=C?(x?i:g):x?o:p;x=E;continue}}if((R|0)==16){c[I>>2]=E;dA(1,105397,I)|0;JM(e);f=1;break}i=+h[e>>3];g=+h[d>>3];f=e+8|0;if(!(((!(i+h[K>>3]):0)?(L=+h[f>>3],!(L<+h[M>>3])):0)?!(L>+h[N>>3]):0)){if(a[195234]|0){_3(105486,42,1,P)|0;JM(e);i=+h[e>>3];g=+h[d>>3]}if(i>3]=g;i=g}g=+h[K>>3];if(i>g)h[e>>3]=g;i=+h[f>>3];g=+h[M>>3];if(i>3]=g;i=g}g=+h[N>>3];if(i>g)h[f>>3]=g}k=e+40|0;i=+h[k>>3];f=d+(O<<5)|0;g=+h[f>>3];n=e+48|0;b=d+(O<<5)+8|0;m=d+(O<<5)+24|0;j=d+(O<<5)+16|0;if(((!(i+h[j>>3]):0)?(Q=+h[n>>3],!(Q<+h[b>>3])):0)?!(Q>+h[m>>3]):0){f=0;break}if(a[195234]|0){_3(105529,39,1,P)|0;JM(e);i=+h[k>>3];g=+h[f>>3]}if(i>3]=g;i=g}g=+h[j>>3];if(i>g)h[k>>3]=g;i=+h[n>>3];g=+h[b>>3];if(i>3]=g;i=g}g=+h[m>>3];if(i>g){h[n>>3]=g;f=0}else f=0}else R=12;while(0);if((R|0)==12){dA(1,105352,m)|0;JM(e);f=1}l=S;return f|0}function IM(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0;s=S(e,b)|0;t=+(s|0);e=0;a:while(1){u=e+3|0;if((u|0)>=(d|0))break;o=c+(e<<4)|0;p=c+(e<<4)+8|0;r=e+1|0;q=c+(r<<4)|0;r=c+(r<<4)+8|0;j=e+2|0;i=c+(j<<4)|0;j=c+(j<<4)+8|0;k=c+(u<<4)|0;l=c+(u<<4)+8|0;g=0;while(1){if((g|0)>(s|0)){e=u;continue a}x=+(g|0)/t;m=+h[o>>3];n=+h[p>>3];y=+h[q>>3];v=+h[r>>3];z=+h[i>>3];w=+h[j>>3];m=m+x*(y-m);n=n+x*(v-n);y=y+x*(z-y);v=v+x*(w-v);m=m+x*(y-m);n=n+x*(v-n);m=m+x*(y+x*(z+x*(+h[k>>3]-z)-y)-m);n=n+x*(v+x*(w+x*(+h[l>>3]-w)-v)-n);f=0;while(1){if((f|0)>=(b|0))break;if(n<=+h[a+(f<<5)+24>>3]+.0001?n>=+h[a+(f<<5)+8>>3]+-.0001:0){e=a+(f<<5)|0;if(+h[e>>3]>m)h[e>>3]=m;e=a+(f<<5)+16|0;if(+h[e>>3]>3]=m}f=f+1|0}g=g+1|0}}return}function JM(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0;m=l;l=l+112|0;j=m+80|0;k=m+48|0;i=m+8|0;g=m;e=c[15715]|0;f=b+80|0;c[g>>2]=c[f>>2];z4(e,105569,g)|0;g=b+84|0;d=0;while(1){if((d|0)>=(c[f>>2]|0))break;r=c[g>>2]|0;q=+h[r+(d<<5)>>3];p=+h[r+(d<<5)+8>>3];o=+h[r+(d<<5)+16>>3];n=+h[r+(d<<5)+24>>3];c[i>>2]=d;h[i+8>>3]=q;h[i+16>>3]=p;h[i+24>>3]=o;h[i+32>>3]=n;z4(e,105580,i)|0;d=d+1|0}q=+h[b+8>>3];p=+h[b+16>>3];r=a[b+29>>0]|0?105611:105623;h[k>>3]=+h[b>>3];h[k+8>>3]=q;h[k+16>>3]=p;c[k+24>>2]=r;z4(e,105639,k)|0;p=+h[b+48>>3];q=+h[b+56>>3];r=a[b+69>>0]|0?105611:105623;h[j>>3]=+h[b+40>>3];h[j+8>>3]=p;h[j+16>>3]=q;c[j+24>>2]=r;z4(e,105690,j)|0;l=m;return}function KM(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;do if((b|0)>(c|0)&(d|0)>(a|0)){if(!((c|0)>(a|0)|(d|0)<(a|0))){a=d-a|0;break}if((b|0)<(c|0)|(b|0)>(d|0)){b=b-a|0;a=d-c|0;a=(b|0)<(a|0)?b:a;break}else{a=b-c|0;break}}else a=0;while(0);return a|0}function LM(a,b){a=a|0;b=b|0;return GM(a,b,1)|0}function MM(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;j=l;l=l+80|0;g=j;i=1;f=b;while(1){h=f;f=c[(c[f+16>>2]|0)+172>>2]|0;if(!((f|0)!=0&(h|0)!=(f|0)))break;else i=i+1|0}if((i|0)>=21)g=HK(i<<2)|0;h=0;f=b;while(1){if((h|0)>=(i|0))break;c[g+(h<<2)>>2]=f;h=h+1|0;f=c[(c[f+16>>2]|0)+172>>2]|0}NM(a,g,i,d,e);if((i|0)>20)l6(g);l=j;return} +function aQ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;j=l;l=l+16|0;g=j;a[g>>0]=b;a[g+1>>0]=0;g=cQ(g)|0;h=d+4|0;i=d+8|0;e=D3(g)|0;f=g;while(1){if((e|0)<=1)break;b=c[h>>2]|0;if(b>>>0>=(c[i>>2]|0)>>>0){iA(d,1)|0;b=c[h>>2]|0}k=a[f>>0]|0;c[h>>2]=b+1;a[b>>0]=k;e=e+-1|0;f=f+1|0}k=a[f>>0]|0;l6(g);l=j;return k|0}function bQ(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+32|0;h=i;d=i+8|0;e=c[b>>2]|0;a:do if((a[e>>0]|0)!=35){c[h>>2]=d;f=0;while(1){if((f|0)>=8){d=0;break a}g=a[e+f>>0]|0;if(!(g<<24>>24)){d=0;break a}f=f+1|0;if(g<<24>>24==59)break;a[d>>0]=g;d=d+1|0}a[d>>0]=0;d=e6(h,23712,252,8,96)|0;if(!d)d=0;else{e=e+f|0;d=c[d+4>>2]|0}}else{h=a[e+1>>0]|0;d=h&255;b:do if((h|32)<<24>>24==120){h=0;g=2;while(1){if((g|0)>=8){f=h;break b}f=a[e+g>>0]|0;d=f&255;if((f+-65&255)>=6)if((f+-97&255)>=6)if((f+-48&255)<10)f=-48;else{f=h;break b}else f=-87;else f=-55;d=f+d|0;h=d+(h<<4)|0;g=g+1|0}}else{f=0;g=1;while(1){if((g|0)>=8)break b;h=a[e+g>>0]|0;d=h&255;if((h+-48&255)>=10)break b;f=(f*10|0)+-48+d|0;g=g+1|0}}while(0);d=(d|0)==59;e=d?e+(g+1)|0:e;d=d?f:0}while(0);c[b>>2]=e;l=i;return d|0}function cQ(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+1056|0;i=n;k=n+8|0;c[i>>2]=b;hA(k,1024,n+24|0);j=k+8|0;m=k+4|0;while(1){c[i>>2]=b+1;d=a[b>>0]|0;if(!(d<<24>>24))break;b=d&255;if(d<<24>>24==38){b=bQ(i)|0;if(!b){b=38;e=c[j>>2]|0;h=7}else h=6}else h=6;do if((h|0)==6){h=0;e=c[j>>2]|0;if(b>>>0<127)h=7;else{d=c[m>>2]|0;e=d>>>0>=e>>>0;f=b>>>6;g=(b&63|128)&255;if(b>>>0<2047){if(e){iA(k,1)|0;b=c[m>>2]|0}else b=d;c[m>>2]=b+1;a[b>>0]=f|192;b=c[m>>2]|0;if(b>>>0>=(c[j>>2]|0)>>>0){iA(k,1)|0;b=c[m>>2]|0}c[m>>2]=b+1;a[b>>0]=g;break}if(e){iA(k,1)|0;d=c[m>>2]|0}c[m>>2]=d+1;a[d>>0]=b>>>12|224;b=c[m>>2]|0;if(b>>>0>=(c[j>>2]|0)>>>0){iA(k,1)|0;b=c[m>>2]|0}c[m>>2]=b+1;a[b>>0]=f&63|128;b=c[m>>2]|0;if(b>>>0>=(c[j>>2]|0)>>>0){iA(k,1)|0;b=c[m>>2]|0}c[m>>2]=b+1;a[b>>0]=g}}while(0);if((h|0)==7){d=c[m>>2]|0;if(d>>>0>=e>>>0){iA(k,1)|0;d=c[m>>2]|0}c[m>>2]=d+1;a[d>>0]=b}b=c[i>>2]|0}b=c[m>>2]|0;if(b>>>0>=(c[j>>2]|0)>>>0){iA(k,1)|0;b=c[m>>2]|0}a[b>>0]=0;j=c[k>>2]|0;c[m>>2]=j;m=Y3(j)|0;lA(k);l=n;return m|0}function dQ(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+1040|0;h=j;hA(h,1024,j+16|0);i=h+4|0;g=h+8|0;while(1){d=b+1|0;e=a[b>>0]|0;f=c[g>>2]|0;if(!(e<<24>>24))break;if((e&255)<127){b=c[i>>2]|0;if(b>>>0>=f>>>0){iA(h,1)|0;b=c[i>>2]|0}c[i>>2]=b+1;a[b>>0]=e;b=d;continue}else{e=a[d>>0]&63|e<<6&255;d=c[i>>2]|0;if(d>>>0>=f>>>0){iA(h,1)|0;d=c[i>>2]|0}c[i>>2]=d+1;a[d>>0]=e;b=b+2|0;continue}}b=c[i>>2]|0;if(b>>>0>=f>>>0){iA(h,1)|0;b=c[i>>2]|0}a[b>>0]=0;g=c[h>>2]|0;c[i>>2]=g;i=Y3(g)|0;lA(h);l=j;return i|0}function eQ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+80|0;e=n+48|0;d=n+32|0;f=n+64|0;g=n+16|0;i=n;j=b+16|0;k=a+16|0;m=c[k>>2]|0;if(((+h[j>>3]>=+h[m+48>>3]?+h[m+64>>3]>=+h[b>>3]:0)?+h[b+24>>3]>=+h[m+56>>3]:0)?+h[m+72>>3]>=+h[b+8>>3]:0){m=m+16|0;c[d>>2]=c[j>>2];c[d+4>>2]=c[j+4>>2];c[d+8>>2]=c[j+8>>2];c[d+12>>2]=c[j+12>>2];c[e>>2]=c[b>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];fQ(g,d,e);c[d>>2]=c[m>>2];c[d+4>>2]=c[m+4>>2];c[d+8>>2]=c[m+8>>2];c[d+12>>2]=c[m+12>>2];c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2];c[e+12>>2]=c[g+12>>2];BP(i,d,e);c[f>>2]=a;c[f+4>>2]=0;d=c[(c[(c[(c[k>>2]|0)+8>>2]|0)+4>>2]|0)+12>>2]|0;c[e>>2]=c[i>>2];c[e+4>>2]=c[i+4>>2];c[e+8>>2]=c[i+8>>2];c[e+12>>2]=c[i+12>>2];d=vb[d&127](f,e)|0}else d=0;l=n;return d|0}function fQ(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=(+h[b+8>>3]+ +h[c+8>>3])*.5;h[a>>3]=(+h[b>>3]+ +h[c>>3])*.5;h[a+8>>3]=d;return}function gQ(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0.0,g=0,i=0.0,j=0,k=0,m=0,n=0;e=l;l=l+80|0;j=e+64|0;k=e+48|0;m=e;n=e+32|0;g=e+16|0;h[m>>3]=+h[a+24>>3]*.5;h[m+8>>3]=+h[a+32>>3]*.5;a=a+56|0;c[k>>2]=c[a>>2];c[k+4>>2]=c[a+4>>2];c[k+8>>2]=c[a+8>>2];c[k+12>>2]=c[a+12>>2];c[j>>2]=c[m>>2];c[j+4>>2]=c[m+4>>2];c[j+8>>2]=c[m+8>>2];c[j+12>>2]=c[m+12>>2];BP(n,k,j);i=+h[n>>3];f=+h[n+8>>3];c[k>>2]=c[a>>2];c[k+4>>2]=c[a+4>>2];c[k+8>>2]=c[a+8>>2];c[k+12>>2]=c[a+12>>2];c[j>>2]=c[m>>2];c[j+4>>2]=c[m+4>>2];c[j+8>>2]=c[m+8>>2];c[j+12>>2]=c[m+12>>2];CP(g,k,j);d=+h[g+8>>3];if((+h[b+16>>3]>=i?+h[g>>3]>=+h[b>>3]:0)?+h[b+24>>3]>=f:0)a=d>=+h[b+8>>3]&1;else a=0;l=e;return a|0}function hQ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+80|0;k=n+48|0;j=n;h=a+16|0;a=c[h>>2]|0;i=c[a+8>>2]|0;a:do if((i|0)!=0?(g=i+8|0,c[j>>2]=c[g>>2],c[j+4>>2]=c[g+4>>2],c[j+8>>2]=c[g+8>>2],c[j+12>>2]=c[g+12>>2],c[j+16>>2]=c[g+16>>2],c[j+20>>2]=c[g+20>>2],c[j+24>>2]=c[g+24>>2],c[j+28>>2]=c[g+28>>2],c[k>>2]=c[b>>2],c[k+4>>2]=c[b+4>>2],c[k+8>>2]=c[b+8>>2],c[k+12>>2]=c[b+12>>2],c[k+16>>2]=c[b+16>>2],c[k+20>>2]=c[b+20>>2],c[k+24>>2]=c[b+24>>2],c[k+28>>2]=c[b+28>>2],(iQ(j,k)|0)!=0):0){d=i+4|0;a=0;while(1){if((a|0)>=(c[d>>2]|0))break;e=j;f=(c[i>>2]|0)+(a*48|0)|0;g=e+48|0;do{c[e>>2]=c[f>>2];e=e+4|0;f=f+4|0}while((e|0)<(g|0));c[k>>2]=c[b>>2];c[k+4>>2]=c[b+4>>2];c[k+8>>2]=c[b+8>>2];c[k+12>>2]=c[b+12>>2];c[k+16>>2]=c[b+16>>2];c[k+20>>2]=c[b+20>>2];c[k+24>>2]=c[b+24>>2];c[k+28>>2]=c[b+28>>2];if(!((jQ(j,k)|0)<<24>>24))a=a+1|0;else{a=1;break a}}a=c[h>>2]|0;m=7}else m=7;while(0);do if((m|0)==7){a=c[a+96>>2]|0;if(a|0?(c[k>>2]=c[b>>2],c[k+4>>2]=c[b+4>>2],c[k+8>>2]=c[b+8>>2],c[k+12>>2]=c[b+12>>2],c[k+16>>2]=c[b+16>>2],c[k+20>>2]=c[b+20>>2],c[k+24>>2]=c[b+24>>2],c[k+28>>2]=c[b+28>>2],(gQ(a,k)|0)<<24>>24):0){a=1;break}a=0}while(0);l=n;return a|0}function iQ(a,b){a=a|0;b=b|0;if((+h[a+16>>3]>=+h[b>>3]?+h[b+16>>3]>=+h[a>>3]:0)?+h[a+24>>3]>=+h[b+8>>3]:0)a=+h[b+24>>3]>=+h[a+8>>3];else a=0;return a&1|0}function jQ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+96|0;k=n+64|0;j=n+48|0;i=n+32|0;f=n+16|0;g=n;m=a+4|0;d=c[m>>2]|0;if(!d)Aa(110238,107962,1637,110246);e=c[a>>2]|0;c[g>>2]=c[e>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];c[g+12>>2]=c[e+12>>2];e=1;while(1){if((e|0)>=(d|0)){h=7;break}d=(c[a>>2]|0)+(e<<4)|0;c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];c[i>>2]=c[d>>2];c[i+4>>2]=c[d+4>>2];c[i+8>>2]=c[d+8>>2];c[i+12>>2]=c[d+12>>2];c[j>>2]=c[g>>2];c[j+4>>2]=c[g+4>>2];c[j+8>>2]=c[g+8>>2];c[j+12>>2]=c[g+12>>2];c[k>>2]=c[b>>2];c[k+4>>2]=c[b+4>>2];c[k+8>>2]=c[b+8>>2];c[k+12>>2]=c[b+12>>2];c[k+16>>2]=c[b+16>>2];c[k+20>>2]=c[b+20>>2];c[k+24>>2]=c[b+24>>2];c[k+28>>2]=c[b+28>>2];if((gK(i,j,k)|0)!=-1){d=1;break};c[g>>2]=c[f>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];c[g+12>>2]=c[f+12>>2];e=e+1|0;d=c[m>>2]|0}do if((h|0)==7){d=c[a+8>>2]|0;if(d|0?(g=a+16|0,h=c[a>>2]|0,c[i>>2]=c[g>>2],c[i+4>>2]=c[g+4>>2],c[i+8>>2]=c[g+8>>2],c[i+12>>2]=c[g+12>>2],c[j>>2]=c[h>>2],c[j+4>>2]=c[h+4>>2],c[j+8>>2]=c[h+8>>2],c[j+12>>2]=c[h+12>>2],c[k>>2]=c[b>>2],c[k+4>>2]=c[b+4>>2],c[k+8>>2]=c[b+8>>2],c[k+12>>2]=c[b+12>>2],c[k+16>>2]=c[b+16>>2],c[k+20>>2]=c[b+20>>2],c[k+24>>2]=c[b+24>>2],c[k+28>>2]=c[b+28>>2],(kQ(i,j,d,k)|0)<<24>>24):0){d=1;break}d=c[a+12>>2]|0;if(d|0?(h=a+32|0,m=(c[a>>2]|0)+((c[m>>2]|0)+-1<<4)|0,c[i>>2]=c[h>>2],c[i+4>>2]=c[h+4>>2],c[i+8>>2]=c[h+8>>2],c[i+12>>2]=c[h+12>>2],c[j>>2]=c[m>>2],c[j+4>>2]=c[m+4>>2],c[j+8>>2]=c[m+8>>2],c[j+12>>2]=c[m+12>>2],c[k>>2]=c[b>>2],c[k+4>>2]=c[b+4>>2],c[k+8>>2]=c[b+8>>2],c[k+12>>2]=c[b+12>>2],c[k+16>>2]=c[b+16>>2],c[k+20>>2]=c[b+20>>2],c[k+24>>2]=c[b+24>>2],c[k+28>>2]=c[b+28>>2],(kQ(i,j,d,k)|0)<<24>>24):0){d=1;break}d=0}while(0);l=n;return d|0}function kQ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0.0;m=l;l=l+160|0;g=m+144|0;f=m+128|0;n=m+96|0;i=m+64|0;j=m+32|0;k=m;o=+h[e+16>>3];c[f>>2]=c[a>>2];c[f+4>>2]=c[a+4>>2];c[f+8>>2]=c[a+8>>2];c[f+12>>2]=c[a+12>>2];c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];WH(n,f,g,1.0,d);if(((o>=+h[n>>3]?(c[f>>2]=c[a>>2],c[f+4>>2]=c[a+4>>2],c[f+8>>2]=c[a+8>>2],c[f+12>>2]=c[a+12>>2],c[g>>2]=c[b>>2],c[g+4>>2]=c[b+4>>2],c[g+8>>2]=c[b+8>>2],c[g+12>>2]=c[b+12>>2],WH(i,f,g,1.0,d),+h[i+16>>3]>=+h[e>>3]):0)?(o=+h[e+24>>3],c[f>>2]=c[a>>2],c[f+4>>2]=c[a+4>>2],c[f+8>>2]=c[a+8>>2],c[f+12>>2]=c[a+12>>2],c[g>>2]=c[b>>2],c[g+4>>2]=c[b+4>>2],c[g+8>>2]=c[b+8>>2],c[g+12>>2]=c[b+12>>2],WH(j,f,g,1.0,d),o>=+h[j+8>>3]):0)?(c[f>>2]=c[a>>2],c[f+4>>2]=c[a+4>>2],c[f+8>>2]=c[a+8>>2],c[f+12>>2]=c[a+12>>2],c[g>>2]=c[b>>2],c[g+4>>2]=c[b+4>>2],c[g+8>>2]=c[b+8>>2],c[g+12>>2]=c[b+12>>2],WH(k,f,g,1.0,d),+h[k+24>>3]>=+h[e+8>>3]):0)f=1;else f=0;l=m;return f|0}function lQ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+16|0;g=h;a:do if((b|0)!=0?(e=a[b>>0]|0,e<<24>>24!=0):0){f=b+1|0;do switch(e<<24>>24|0){case 48:{d=2;break a}case 57:case 56:case 55:case 54:case 53:case 52:case 51:case 50:case 49:{d=10;break a}case 67:case 99:{if(!(C3(f,110261)|0)){d=4;break a}if(!(C3(f,110267)|0)){d=12;break a}break}case 70:case 102:{if(!(C3(f,110275)|0)){d=2;break a}break}case 76:case 108:{if(!(C3(f,110280)|0)){d=2;break a}break}case 78:case 110:{if(!(C3(f,110284)|0)){d=0;break a}if(!(C3(f,110288)|0)){d=2;break a}break}case 79:case 111:{if(!(C3(f,110290)|0)){d=8;break a}break}case 80:case 112:{if(!(C3(f,110295)|0)){d=6;break a}break}case 83:case 115:{if(!(C3(f,110303)|0)){d=10;break a}break}case 84:case 116:{if(!(C3(f,110309)|0)){d=10;break a}break}case 89:case 121:{if(!(C3(f,110313)|0)){d=10;break a}break}default:{}}while(0);c[g>>2]=b;dA(0,110316,g)|0}while(0);l=h;return d|0}function mQ(d,f){d=d|0;f=f|0;var g=0;g=NA(d,110357)|0;if(g)if(!(a[g>>0]|0))f=0;else f=lQ(g,f)|0;d=(c[d+16>>2]|0)+136|0;b[d>>1]=e[d>>1]|f;return}function nQ(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;var f=0.0,g=0.0,i=0.0,j=0,k=0,m=0.0,n=0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0;w=l;l=l+32|0;n=w+16|0;p=w;v=e&1;u=e&2;j=n+8|0;k=p+8|0;g=+h[a>>3];i=+h[a+8>>3];a:do if((c|0)==2){t=+h[a+16>>3]-g;q=+h[a+24>>3]-i;s=g-t;h[n>>3]=s;t=g+t;h[p>>3]=t;f=i-q;h[j>>3]=f;q=i+q;h[k>>3]=q;g=s}else{h[p>>3]=g;h[n>>3]=g;h[k>>3]=i;h[j>>3]=i;e=0;m=g;f=i;while(1){if((e|0)>=(c|0)){t=g;g=m;q=i;break a}x=a+(e<<4)|0;s=+h[x>>3];q=+h[(s>3];h[n>>3]=q;t=+h[a+(e<<4)+8>>3];r=+h[(t>3];h[j>>3]=r;s=+h[(s>g?x:p)>>3];h[p>>3]=s;t=+h[(t>i?x:p)+8>>3];h[k>>3]=t;e=e+1|0;m=q;f=r;g=s;i=t}}while(0);s=g+(t-g)*.5;r=f+(q-f)*.5;e=(u|0)!=0;o=-r;j=b+8|0;a=b+24|0;m=r-f;k=b+16|0;if(!v){i=d;g=+J(+i);i=+I(+i);f=(q-r)*g;if(e){h[j>>3]=r-f;f=r+f}else{h[j>>3]=f-r;f=o-m*g}h[a>>3]=f;d=(t-s)*i;h[b>>3]=s-d;h[k>>3]=s+d}else{d=s-g;d=+G(+(d*d+m*m));h[j>>3]=e?r:o;h[b>>3]=s;h[k>>3]=d*.25;h[a>>3]=d}l=w;return}function oQ(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0,g=0.0;f=b<<24>>24==0;b=c[a+16>>2]|0;d=+h[b+32>>3]*72.0;e=+h[b+40>>3]*72.0;g=(f?d:e)*.5;h[b+96>>3]=g;h[b+88>>3]=g;h[b+80>>3]=f?e:d;return}function pQ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;y=l;l=l+16|0;j=y+8|0;x=4;w=k6(40)|0;c[w>>2]=0;s=y;o=0;e=la(29,b|0)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){g=A6(c[f>>2]|0,w|0,x|0)|0;if(!g)Ca(f|0,p|0);D=p}else g=-1;a:do if((g|0)!=1){o=0;v=la(23,e<<3|0)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){e=A6(c[f>>2]|0,w|0,x|0)|0;if(!e)Ca(f|0,p|0);D=p}else e=-1;if((e|0)!=1){if(!(a[195236]|0))t=0;else{o=0;e=ea(3)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){g=A6(c[f>>2]|0,w|0,x|0)|0;if(!g)Ca(f|0,p|0);D=p}else g=-1;if((g|0)==1){n=0;k=0;m=0;j=0;i=0;d=v;h=v;e=D;g=0;u=74;break}t=e}o=0;e=ra(97,b|0,110365)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){g=A6(c[f>>2]|0,w|0,x|0)|0;if(!g)Ca(f|0,p|0);D=p}else g=-1;if((g|0)!=1){c[47394]=0;b:do if(e|0?(i=a[e>>0]|0,i<<24>>24):0){h=e;f=i;g=0;while(1){i=h+1|0;if(!(f<<24>>24))break b;switch(f<<24>>24|0){case 99:{e=8;u=15;break}case 105:{e=18;u=15;break}case 109:{e=1;u=15;break}case 114:{e=4;u=15;break}case 115:{e=2;u=15;break}default:e=g}if((u|0)==15){u=0;e=g|e;c[47394]=e}h=i;f=a[i>>0]|0;g=e}}while(0);if(d|0){o=0;aa(23,0,110369,j|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){n=0;k=t;m=0;j=0;i=0;d=v;h=v;e=D;g=0;u=74;break}}o=0;r=ra(98,b|0,0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)!=1){m=c[r+16>>2]|0;if(c[47394]&2|0){o=0;ha(26,c[15715]|0,m|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){n=0;k=t;m=0;j=0;i=r;d=v;h=v;e=D;g=0;u=74;break}}o=0;g=la(25,b|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)!=1){n=0;while(1){if(!g)break;o=0;e=ra(99,b|0,g|0)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){h=A6(c[f>>2]|0,w|0,x|0)|0;if(!h)Ca(f|0,p|0);D=p}else h=-1;if((h|0)==1){k=t;m=0;j=0;i=r;d=v;h=v;e=D;g=0;u=74;break a}i=n;while(1){if(!e)break;if(!((c[47180]|0)==2?(c[(c[e+16>>2]|0)+8>>2]|0)!=0:0))u=32;c:do if((u|0)==32){u=0;do if(a[195236]|0){k=c[e>>2]&3;j=(c[c[((k|0)==3?e:e+48|0)+40>>2]>>2]|0)>>>4;k=(c[c[((k|0)==2?e:e+-48|0)+40>>2]>>2]|0)>>>4;if(j>>>0>k>>>0){o=0;f=aa(37,t|0,k|0,j|0)|0;h=o;o=0;if((h|0)!=0&(p|0)!=0){d=A6(c[h>>2]|0,w|0,x|0)|0;if(!d)Ca(h|0,p|0);D=p}else d=-1;if((d|0)==1){k=t;m=0;j=0;i=r;d=v;h=v;e=D;g=0;u=74;break a}if(f|0)break c;o=0;na(64,t|0,k|0,j|0);f=o;o=0;if((f|0)!=0&(p|0)!=0){h=A6(c[f>>2]|0,w|0,x|0)|0;if(!h)Ca(f|0,p|0);D=p}else h=-1;if((h|0)==1){k=t;m=0;j=0;i=r;d=v;h=v;e=D;g=0;u=74;break a}break}else{o=0;f=aa(37,t|0,j|0,k|0)|0;h=o;o=0;if((h|0)!=0&(p|0)!=0){d=A6(c[h>>2]|0,w|0,x|0)|0;if(!d)Ca(h|0,p|0);D=p}else d=-1;if((d|0)==1){k=t;m=0;j=0;i=r;d=v;h=v;e=D;g=0;u=74;break a}if(f|0)break c;o=0;na(64,t|0,j|0,k|0);f=o;o=0;if((f|0)!=0&(p|0)!=0){h=A6(c[f>>2]|0,w|0,x|0)|0;if(!h)Ca(f|0,p|0);D=p}else h=-1;if((h|0)==1){k=t;m=0;j=0;i=r;d=v;h=v;e=D;g=0;u=74;break a}break}}while(0);c[v+(i<<3)+4>>2]=e;o=0;d=la(30,e|0)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){h=A6(c[f>>2]|0,w|0,x|0)|0;if(!h)Ca(f|0,p|0);D=p}else h=-1;if((h|0)==1){k=t;m=0;j=0;i=r;d=v;h=v;e=D;g=0;u=74;break a}c[v+(i<<3)>>2]=d;i=i+1|0}while(0);o=0;e=ra(100,b|0,e|0)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){h=A6(c[f>>2]|0,w|0,x|0)|0;if(!h)Ca(f|0,p|0);D=p}else h=-1;if((h|0)==1){k=t;m=0;j=0;i=r;d=v;h=v;e=D;g=0;u=74;break a}}o=0;g=ra(86,b|0,g|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){k=t;m=0;j=0;i=r;d=v;h=v;e=D;g=0;u=74;break a}n=i}o=0;j=la(31,n<<3|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)!=1){o=0;ta(28,v|0,n|0,8,101);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)!=1){g=c[m>>2]|0;o=0;$(110,g+2|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)!=1){i=c[m+16>>2]|0;d=i+(g*40|0)|0;i=i+((g+1|0)*40|0)|0;q=c[15715]|0;h=0;while(1){if((h|0)>=(n|0))break;if((h|0)>0?c[47394]&16|0:0){o=0;ha(26,q|0,m|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){k=t;m=j;i=r;d=v;h=v;e=D;g=q;u=74;break a}}e=c[v+(h<<3)+4>>2]|0;k=c[e>>2]&3;g=c[(c[(c[((k|0)==3?e:e+48|0)+40>>2]|0)+16>>2]|0)+112>>2]|0;e=c[(c[(c[((k|0)==2?e:e+-48|0)+40>>2]|0)+16>>2]|0)+112>>2]|0;if((g|0)==(e|0)){o=0;ta(29,m|0,g|0,i|0,d|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){k=t;m=j;i=r;d=v;h=v;e=D;g=q;u=74;break a}}else{o=0;na(65,m|0,e|0,i|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){k=t;m=j;i=r;d=v;h=v;e=D;g=q;u=74;break a}o=0;na(65,m|0,g|0,d|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){k=t;m=j;i=r;d=v;h=v;e=D;g=q;u=74;break a}}o=0;e=aa(38,m|0,i|0,d|0)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){g=A6(c[f>>2]|0,w|0,x|0)|0;if(!g)Ca(f|0,p|0);D=p}else g=-1;if((g|0)==1){k=t;m=j;i=r;d=v;h=v;e=D;g=q;u=74;break a}if(e|0){k=t;m=j;i=r;d=v;h=v;break a}e=j+(h<<3)|0;o=0;ta(30,s|0,m|0,d|0,i|0);f=o;o=0;if((f|0)!=0&(p|0)!=0){g=A6(c[f>>2]|0,w|0,x|0)|0;if(!g)Ca(f|0,p|0);D=p}else g=-1;if((g|0)==1){k=t;m=j;i=r;d=v;h=v;e=D;g=q;u=74;break a}g=s;k=c[g+4>>2]|0;c[e>>2]=c[g>>2];c[e+4>>2]=k;o=0;$(111,m|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){k=t;m=j;i=r;d=v;h=v;e=D;g=q;u=74;break a}h=h+1|0}o=0;oa(8);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)!=1){o=0;e=la(32,r|0)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){g=A6(c[f>>2]|0,w|0,x|0)|0;if(!g)Ca(f|0,p|0);D=p}else g=-1;if((g|0)!=1){c[r+20>>2]=e;o=0;e=la(33,r|0)|0;f=o;o=0;if((f|0)!=0&(p|0)!=0){g=A6(c[f>>2]|0,w|0,x|0)|0;if(!g)Ca(f|0,p|0);D=p}else g=-1;if((g|0)!=1){c[r+24>>2]=e;o=0;na(66,n|0,j|0,r|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)!=1){w=x6(189580,1,w|0,x|0)|0;x=D;o=0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)!=1){k=t;m=j;i=r;d=v;h=v;e=0;g=q;u=74}else{k=t;m=j;i=r;d=v;h=v;e=D;g=q;u=74}}else{k=t;m=j;i=r;d=v;h=v;e=D;g=q;u=74}}else{k=t;m=j;i=r;d=v;h=v;e=D;g=q;u=74}}else{k=t;m=j;i=r;d=v;h=v;e=D;g=q;u=74}}else{k=t;m=j;i=r;d=v;h=v;e=D;g=q;u=74}}else{k=t;m=j;i=r;d=v;h=v;e=D;g=0;u=74}}else{k=t;m=j;i=r;d=v;h=v;e=D;g=0;u=74}}else{k=t;m=0;i=r;d=v;h=v;e=D;g=0;u=74}}else{n=0;k=t;m=0;j=0;i=r;d=v;h=v;e=D;g=0;u=74}}else{n=0;k=t;m=0;j=0;i=r;d=v;h=v;e=D;g=0;u=74}}else{n=0;k=t;m=0;j=0;i=0;d=v;h=v;e=D;g=0;u=74}}else{n=0;k=0;m=0;j=0;i=0;d=0;h=v;e=D;g=0;u=74}}else{n=0;k=0;m=0;j=0;i=0;d=0;h=0;e=D;g=0;u=74}while(0);d:while(1){if((u|0)==74){u=0;if(e|0){q=g;continue}o=0;$(112,i|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){z=g;f=h;q=d;r=i;s=j;t=m;v=k;u=n;e=D;g=z;h=f;d=q;i=r;j=s;m=t;k=v;n=u;u=74;continue}if(c[47394]&4|0){o=0;ba(17,g|0,i|0,n|0,m|0,d|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){f=g;q=h;r=d;s=i;t=j;v=m;z=k;u=n;e=D;g=f;h=q;d=r;i=s;j=t;m=v;k=z;n=u;u=74;continue}}o=0;qa(10,b|0,i|0,n|0,m|0,d|0,0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){f=g;q=h;r=d;s=i;t=j;v=m;z=k;u=n;e=D;g=f;h=q;d=r;i=s;j=t;m=v;k=z;n=u;u=74;continue}q=g}if(!(a[195236]|0))e=0;else{o=0;$(113,k|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;g=q;u=74;continue}e=0}while(1){if((e|0)>=(n|0))break;o=0;$(105,c[m+(e<<3)+4>>2]|0);f=o;o=0;if((f|0)!=0&(p|0)!=0){g=A6(c[f>>2]|0,w|0,x|0)|0;if(!g)Ca(f|0,p|0);D=p}else g=-1;if((g|0)==1){e=D;g=q;u=74;continue d}e=e+1|0}o=0;$(105,j|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;g=q;u=74;continue}o=0;$(114,i|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;g=q;u=74;continue}o=0;$(105,h|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,x|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){e=D;g=q;u=74}else break}l6(w|0);l=y;return}function qQ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0;q=l;l=l+64|0;p=q+32|0;o=q+16|0;j=q;k=q+48|0;Z3(111236,a)|0;Z3(111247,a)|0;m=b+16|0;n=j+8|0;i=k+4|0;g=0;while(1){if((g|0)>=(c[b>>2]|0))break;d=c[m>>2]|0;e=c[d+(g*40|0)+20>>2]|0;f=c[d+(g*40|0)+24>>2]|0;if((e|0)==(f|0)){jR(j,e);d=~~+h[j>>3];e=~~+h[n>>3]}else{lR(k,(c[e>>2]&1|0)==0?e:f,d+(g*40|0)|0);d=c[k>>2]|0;e=c[i>>2]|0}c[o>>2]=g;c[o+4>>2]=d;c[o+8>>2]=e;z4(a,111267,o)|0;g=g+1|0}f=b+4|0;e=b+20|0;d=0;while(1){if((d|0)>=(c[f>>2]|0))break;o=c[e>>2]|0;b=c[o+(d*24|0)+16>>2]|0;r=+h[o+(d*24|0)>>3];c[p>>2]=c[o+(d*24|0)+12>>2];c[p+4>>2]=b;h[p+8>>3]=r;z4(a,111287,p)|0;d=d+1|0}Z3(111309,a)|0;l=q;return}function rQ(a){a=a|0;var b=0.0,d=0.0,e=0,f=0;f=c[a>>2]&3;e=c[(c[((f|0)==3?a:a+48|0)+40>>2]|0)+16>>2]|0;a=c[(c[((f|0)==2?a:a+-48|0)+40>>2]|0)+16>>2]|0;d=+h[e+16>>3]-+h[a+16>>3];b=+h[e+24>>3]-+h[a+24>>3];return ~~(d*d+b*b)|0}function sQ(a,b){a=a|0;b=b|0;return (c[a>>2]|0)-(c[b>>2]|0)|0}function tQ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+32|0;j=n;jR(n+16|0,d);k=d+32|0;m=d+36|0;g=0;while(1){if((g|0)>=(c[k>>2]|0))break;h=c[(c[m>>2]|0)+(g<<2)>>2]|0;do if(!(a[h+36>>0]|0)){i=c[h+20>>2]|0;if((i|0)==(d|0)){hR(j,h,c[h+24>>2]|0);CR(b,f,h,0.0)|0;break}else{hR(j,h,i);CR(b,e,h,0.0)|0;break}}while(0);g=g+1|0}c[b>>2]=(c[b>>2]|0)+2;l=n;return}function uQ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+32|0;h=k;jR(k+16|0,b);i=b+32|0;j=b+36|0;f=0;while(1){if((f|0)>=(c[i>>2]|0))break;g=c[(c[j>>2]|0)+(f<<2)>>2]|0;e=c[g+20>>2]|0;if((e|0)==(b|0))e=c[g+24>>2]|0;hR(h,g,e);CR(a,d,g,0.0)|0;f=f+1|0}c[a>>2]=(c[a>>2]|0)+1;c[d+24>>2]=b;c[d+20>>2]=b;l=k;return}function vQ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0.0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0.0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;K=l;l=l+128|0;F=K+64|0;n=K+48|0;G=K+32|0;H=K+16|0;I=K;g=0;i=e;while(1){if(!i)break;g=g+1|0;i=c[i+8>>2]|0}E=HK((g*56|0)+-112|0)|0;c[F+52>>2]=0;c[F+48>>2]=0;D=e+8|0;e=c[D>>2]|0;i=c[e+8>>2]|0;g=c[e+20>>2]|0;if(c[g>>2]&1)g=c[e+24>>2]|0;hR(n,e,g);j=e;o=e;q=0.0;p=+h[n>>3];C=0;m=0.0;A=+h[n+8>>3];while(1){B=i+8|0;if(!(c[B>>2]|0))break;y=iR(j,i)|0;aV(d,y,c[o+12>>2]|0);w=o+36|0;x=i+36|0;if((a[w>>0]|0)==(a[x>>0]|0))if((c[B>>2]|0)==(f|0)){hR(H,i,y);e=H;J=12}else{n=o;e=C;k=A}else{jR(G,y);e=G;J=12}if((J|0)==12){J=0;z=+h[e>>3];k=+h[e+8>>3];n=a[w>>0]|0;t=n<<24>>24!=0;e=(o|0)==(c[D>>2]|0);j=g+40|0;v=y+48|0;s=i+20|0;r=g+48|0;u=y+40|0;if(t){g=e?0:m>A?1:3;if(n<<24>>24==(a[x>>0]|0)){n=u;o=j;j=r;e=0}else{n=u;o=j;j=r;e=(c[s>>2]|0)==(y|0)?1:3}}else{g=e?0:q>p?4:2;if(!(a[x>>0]|0)){n=v;o=r;e=0}else{n=v;o=r;e=(c[s>>2]|0)==(y|0)?4:2}}kR(F,(t^1)&1,+h[j>>3],+h[o>>3],+h[n>>3],g,e);e=C+1|0;g=E+(C*56|0)|0;n=F;o=g+56|0;do{c[g>>2]=c[n>>2];g=g+4|0;n=n+4|0}while((g|0)<(o|0));if((a[w>>0]|0)!=(a[x>>0]|0)?(c[B>>2]|0)==(f|0):0){hR(I,i,y);j=(a[x>>0]|0)!=0;q=+h[(j?u:v)>>3];kR(F,(j^1)&1,+h[(j?v:u)>>3],q,q,j?(A>k?1:3):p>z?4:2,0);j=C+2|0;g=E+(e*56|0)|0;n=F;o=g+56|0;do{c[g>>2]=c[n>>2];g=g+4|0;n=n+4|0}while((g|0)<(o|0));g=y;n=i;q=p;p=z;e=j;m=A}else{g=y;n=i;q=p;p=z;m=A}}j=i;i=c[B>>2]|0;o=n;C=e;A=k}i=n6(E,C*56|0)|0;e=C+-1|0;g=0;while(1){if((g|0)>=(C|0))break;if((g|0)>0)c[i+(g*56|0)+48>>2]=i+((g+-1|0)*56|0);j=g+1|0;if((g|0)>=(e|0)){g=j;continue}c[i+(g*56|0)+52>>2]=i+(j*56|0);g=j}c[b>>2]=C;c[b+4>>2]=i;l=K;return}function wQ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0;j=Sz(25740,c[4591]|0)|0;k=a+8|0;i=0;while(1){if((i|0)>=(c[a>>2]|0))break;b=(c[k>>2]|0)+(i*72|0)|0;if(!(c[b>>2]&4)){while(1){d=c[(c[b+36>>2]|0)+8>>2]|0;if(!d)break;d=c[d+20>>2]|0;if(!d)break;if(!(c[d>>2]&1))b=d;else break}g=HK(40)|0;c[g+36>>2]=b;h[g+8>>3]=+h[b+40>>3];f=b;d=c[b>>2]|0;while(1){c[f>>2]=d|4;d=c[c[f+36>>2]>>2]|0;if(!d)break;e=c[d+24>>2]|0;if(!e)break;d=c[e>>2]|0;if(d&1|0)break;else f=e}h[g+16>>3]=+h[f+56>>3];cR(j,g,+h[b+48>>3])}i=i+1|0}return j|0}function xQ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0;j=Sz(25740,c[4591]|0)|0;k=a+8|0;i=0;while(1){if((i|0)>=(c[a>>2]|0))break;b=(c[k>>2]|0)+(i*72|0)|0;if(!(c[b>>2]&2)){while(1){d=c[(c[b+36>>2]|0)+12>>2]|0;if(!d)break;d=c[d+20>>2]|0;if(!d)break;if(!(c[d>>2]&1))b=d;else break}g=HK(40)|0;c[g+36>>2]=b;h[g+8>>3]=+h[b+48>>3];f=b;d=c[b>>2]|0;while(1){c[f>>2]=d|2;d=c[(c[f+36>>2]|0)+4>>2]|0;if(!d)break;e=c[d+24>>2]|0;if(!e)break;d=c[e>>2]|0;if(d&1|0)break;else f=e}h[g+16>>3]=+h[f+64>>3];cR(j,g,+h[b+40>>3])}i=i+1|0}return j|0}function yQ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;j=e+20|0;i=e+24|0;e=0;while(1){if((e|0)>=(b|0))break;g=c[d+(e<<3)>>2]|0;h=c[d+(e<<3)+4>>2]|0;f=0;while(1){if((f|0)>=(g|0))break;k=h+(f*56|0)|0;bR(HQ(c[((a[k>>0]|0)==0?j:i)>>2]|0,k)|0,k);f=f+1|0}e=e+1|0}return}function zQ(a){a=a|0;var b=0,d=0;d=a+20|0;JQ(c[d>>2]|0);b=a+24|0;JQ(c[b>>2]|0);KQ(c[d>>2]|0);KQ(c[b>>2]|0);LQ(c[d>>2]|0,a);LQ(c[b>>2]|0,a);MQ(c[d>>2]|0);MQ(c[b>>2]|0);return}function AQ(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0,C=0.0,D=0,E=0.0;z=l;l=l+224|0;n=z+176|0;m=z+208|0;x=z+160|0;y=z+128|0;k=z+96|0;t=z+64|0;u=z+32|0;o=z;v=u+8|0;h[v>>3]=1797693134862315708145274.0e284;h[u>>3]=1797693134862315708145274.0e284;w=u+24|0;h[w>>3]=-1797693134862315708145274.0e284;p=u+16|0;h[p>>3]=-1797693134862315708145274.0e284;Z3(110484,a)|0;c[n>>2]=10;c[n+4>>2]=10;z4(a,110890,n)|0;Z3(138568,a)|0;i=b+4|0;q=t+16|0;r=t+8|0;s=t+24|0;j=b+12|0;g=0;while(1){if((g|0)>=(c[i>>2]|0))break;D=(c[j>>2]|0)+(g*72|0)+40|0;c[t>>2]=c[D>>2];c[t+4>>2]=c[D+4>>2];c[t+8>>2]=c[D+8>>2];c[t+12>>2]=c[D+12>>2];c[t+16>>2]=c[D+16>>2];c[t+20>>2]=c[D+20>>2];c[t+24>>2]=c[D+24>>2];c[t+28>>2]=c[D+28>>2];C=+h[r>>3];B=+h[q>>3];A=+h[s>>3];h[k>>3]=+h[t>>3];h[k+8>>3]=C;h[k+16>>3]=B;h[k+24>>3]=A;z4(a,138587,k)|0;g=g+1|0}g=0;while(1){if((g|0)>=(d|0))break;D=c[f+(g<<3)+4>>2]|0;k=e+(g<<3)|0;c[m>>2]=c[k>>2];c[m+4>>2]=c[k+4>>2];c[n>>2]=c[u>>2];c[n+4>>2]=c[u+4>>2];c[n+8>>2]=c[u+8>>2];c[n+12>>2]=c[u+12>>2];c[n+16>>2]=c[u+16>>2];c[n+20>>2]=c[u+20>>2];c[n+24>>2]=c[u+24>>2];c[n+28>>2]=c[u+28>>2];IQ(o,a,D,m,b,n);c[u>>2]=c[o>>2];c[u+4>>2]=c[o+4>>2];c[u+8>>2]=c[o+8>>2];c[u+12>>2]=c[o+12>>2];c[u+16>>2]=c[o+16>>2];c[u+20>>2]=c[o+20>>2];c[u+24>>2]=c[o+24>>2];c[u+28>>2]=c[o+28>>2];g=g+1|0}Z3(110907,a)|0;i=b+8|0;g=0;while(1){if((g|0)>=(c[b>>2]|0))break;D=(c[i>>2]|0)+(g*72|0)+40|0;c[t>>2]=c[D>>2];c[t+4>>2]=c[D+4>>2];c[t+8>>2]=c[D+8>>2];c[t+12>>2]=c[D+12>>2];c[t+16>>2]=c[D+16>>2];c[t+20>>2]=c[D+20>>2];c[t+24>>2]=c[D+24>>2];c[t+28>>2]=c[D+28>>2];E=+h[t>>3];A=+h[r>>3];B=+h[q>>3];C=+h[s>>3];h[y>>3]=E;h[y+8>>3]=A;h[y+16>>3]=B;h[y+24>>3]=C;z4(a,138624,y)|0;h[u>>3]=+h[(+h[u>>3]>3];h[v>>3]=+h[(+h[v>>3]>3];h[p>>3]=+h[(+h[p>>3]>B?u:t)+16>>3];h[w>>3]=+h[(+h[w>>3]>C?u:t)+24>>3];g=g+1|0}v=~~(+h[v>>3]+10.0);y=~~(+h[p>>3]+10.0);D=~~(+h[w>>3]+10.0);c[x>>2]=~~(+h[u>>3]+10.0);c[x+4>>2]=v;c[x+8>>2]=y;c[x+12>>2]=D;z4(a,110932,x)|0;l=z;return}function BQ(b,e,f,g,i,j){b=b|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;var k=0,m=0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;Q=l;l=l+112|0;I=Q+88|0;H=Q+72|0;P=Q+32|0;L=Q+16|0;M=Q;N=Q+56|0;O=Q+40|0;J=c[15715]|0;z=(j|0)==0;A=M+8|0;B=L+8|0;y=0;k=0;m=0;p=0;j=0;while(1){if((y|0)>=(f|0))break;C=c[i+(y<<3)+4>>2]|0;D=C+48|0;x=(c[(c[((c[C>>2]&3|0)==3?C:D)+40>>2]|0)+16>>2]|0)+16|0;E=C+16|0;F=(c[E>>2]|0)+16|0;c[H>>2]=c[x>>2];c[H+4>>2]=c[x+4>>2];c[H+8>>2]=c[x+8>>2];c[H+12>>2]=c[x+12>>2];c[I>>2]=c[F>>2];c[I+4>>2]=c[F+4>>2];c[I+8>>2]=c[F+8>>2];c[I+12>>2]=c[F+12>>2];CQ(N,H,I);c[L>>2]=c[N>>2];c[L+4>>2]=c[N+4>>2];c[L+8>>2]=c[N+8>>2];c[L+12>>2]=c[N+12>>2];F=C+-48|0;x=(c[(c[((c[C>>2]&3|0)==2?C:F)+40>>2]|0)+16>>2]|0)+16|0;w=(c[E>>2]|0)+56|0;c[H>>2]=c[x>>2];c[H+4>>2]=c[x+4>>2];c[H+8>>2]=c[x+8>>2];c[H+12>>2]=c[x+12>>2];c[I>>2]=c[w>>2];c[I+4>>2]=c[w+4>>2];c[I+8>>2]=c[w+8>>2];c[I+12>>2]=c[w+12>>2];CQ(O,H,I);c[M>>2]=c[O>>2];c[M+4>>2]=c[O+4>>2];c[M+8>>2]=c[O+8>>2];c[M+12>>2]=c[O+12>>2];w=c[g+(y<<3)>>2]|0;x=c[g+(y<<3)+4>>2]|0;v=w*3|0;G=v+1|0;if((v|0)>=(m|0)){if(k|0)l6(j);p=IK(G<<4)|0;k=p;m=G;j=p}if(!(a[x>>0]|0)){o=+(EQ(x,e)|0);n=+h[L>>3]}else{n=+DQ(x,e);o=+h[B>>3]}s=k+16|0;h[k+16>>3]=n;h[k+24>>3]=o;c[p>>2]=c[s>>2];c[p+4>>2]=c[s+4>>2];c[p+8>>2]=c[s+8>>2];c[p+12>>2]=c[s+12>>2];s=1;q=x;t=2;while(1){r=t+1|0;u=k+(r<<4)|0;v=k+(t<<4)|0;if((s|0)>=(w|0))break;q=x+(s*56|0)|0;if(!(a[q>>0]|0))o=+(EQ(q,e)|0);else n=+DQ(q,e);r=k+(t+2<<4)|0;h[v>>3]=n;h[k+(t<<4)+8>>3]=o;c[u>>2]=c[v>>2];c[u+4>>2]=c[v+4>>2];c[u+8>>2]=c[v+8>>2];c[u+12>>2]=c[v+12>>2];c[r>>2]=c[v>>2];c[r+4>>2]=c[v+4>>2];c[r+8>>2]=c[v+8>>2];c[r+12>>2]=c[v+12>>2];s=s+1|0;t=t+3|0}if(!(a[q>>0]|0)){o=+(EQ(q,e)|0);n=+h[M>>3]}else{n=+DQ(q,e);o=+h[A>>3]}h[u>>3]=n;h[k+(r<<4)+8>>3]=o;c[v>>2]=c[u>>2];c[v+4>>2]=c[u+4>>2];c[v+8>>2]=c[u+8>>2];c[v+12>>2]=c[u+12>>2];if((d[195234]|0)>1){x=HB(c[((c[C>>2]&3|0)==3?C:D)+40>>2]|0)|0;D=HB(c[((c[C>>2]&3|0)==2?C:F)+40>>2]|0)|0;c[P>>2]=x;c[P+4>>2]=D;z4(J,110443,P)|0}bO(C,c[((c[C>>2]&3|0)==2?C:F)+40>>2]|0,k,G,25728);if((!z?(K=c[(c[E>>2]|0)+96>>2]|0,K|0):0)?(a[K+81>>0]|0)==0:0){c[H>>2]=c[L>>2];c[H+4>>2]=c[L+4>>2];c[H+8>>2]=c[L+8>>2];c[H+12>>2]=c[L+12>>2];c[I>>2]=c[M>>2];c[I+4>>2]=c[M+4>>2];c[I+8>>2]=c[M+8>>2];c[I+12>>2]=c[M+12>>2];wO(b,C,H,I)}y=y+1|0}l6(j);l=Q;return}function CQ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;h[b>>3]=+h[d>>3]+ +h[b>>3];e=b+8|0;h[e>>3]=+h[d+8>>3]+ +h[e>>3];c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];return}function DQ(a,b){a=a|0;b=b|0;var d=0.0,e=0;e=HQ(c[b+24>>2]|0,a)|0;b=c[e+36>>2]|0;d=+h[b+40>>3];return +(d+ +(c[a+44>>2]|0)/+((c[e+24>>2]|0)+1|0)*(+h[b+56>>3]-d))}function EQ(a,b){a=a|0;b=b|0;var d=0.0,e=0;e=HQ(c[b+20>>2]|0,a)|0;b=c[e+36>>2]|0;d=+h[b+48>>3];return ~~(d+(1.0-+(c[a+44>>2]|0)/+((c[e+24>>2]|0)+1|0))*(+h[b+64>>3]-d))|0}function FQ(a){a=a|0;return 0}function GQ(a){a=a|0;return 0}function HQ(a,b){a=a|0;b=b|0;a=eb[c[a>>2]&63](a,b+8|0,512)|0;if(!a)Aa(110456,110462,423,110470);a=c[a+16>>2]|0;a=eb[c[a>>2]&63](a,b+16|0,512)|0;if(!a)Aa(110481,110462,425,110470);else return a|0;return 0}function IQ(b,d,e,f,g,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0.0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,D=0.0;z=l;l=l+32|0;y=z+16|0;u=z+8|0;m=z;j=c[(c[(c[((c[e>>2]&3|0)==3?e:e+48|0)+40>>2]|0)+16>>2]|0)+112>>2]|0;t=c[f+4>>2]|0;if(!(a[t>>0]|0)){s=+h[j+56>>3];k=+h[j+40>>3];j=EQ(t,g)|0;k=(s+k)*.5}else{s=+h[j+64>>3];k=+h[j+48>>3];j=~~((s+k)*.5);k=+DQ(t,g)}A=~~k;p=+h[i>>3];r=+(A|0);p=p>3]=p;v=i+8|0;q=+h[v>>3];s=+(j|0);q=q>3]=q;w=i+16|0;k=+h[w>>3];r=k>r?k:r;h[w>>3]=r;x=i+24|0;k=+h[x>>3];s=k>s?k:s;h[x>>3]=s;c[m>>2]=A;c[m+4>>2]=j;z4(d,110983,m)|0;o=c[f>>2]|0;m=t;n=1;f=A;while(1){if((n|0)>=(o|0))break;m=t+(n*56|0)|0;if(!(a[m>>0]|0))j=EQ(m,g)|0;else f=~~+DQ(m,g);B=+(f|0);D=p>3]=D;k=+(j|0);C=q>3]=C;B=r>B?r:B;h[w>>3]=B;k=s>k?s:k;h[x>>3]=k;c[u>>2]=f;c[u+4>>2]=j;z4(d,111005,u)|0;n=n+1|0;p=D;q=C;r=B;s=k}j=c[(c[(c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0)+16>>2]|0)+112>>2]|0;if(!(a[m>>0]|0)){D=+h[j+56>>3];k=+h[j+40>>3];j=EQ(m,g)|0;k=(D+k)*.5}else{D=+h[j+64>>3];k=+h[j+48>>3];j=~~((D+k)*.5);k=+DQ(m,g)}A=~~k;C=+(A|0);h[i>>3]=p>3]=q>3]=r>C?r:C;h[x>>3]=s>D?s:D;c[y>>2]=A;c[y+4>>2]=j;z4(d,111019,y)|0;c[b>>2]=c[i>>2];c[b+4>>2]=c[i+4>>2];c[b+8>>2]=c[i+8>>2];c[b+12>>2]=c[i+12>>2];c[b+16>>2]=c[i+16>>2];c[b+20>>2]=c[i+20>>2];c[b+24>>2]=c[i+24>>2];c[b+28>>2]=c[i+28>>2];l=z;return}function JQ(a){a=a|0;var b=0;a=Qz(a)|0;while(1){if(!a)break;b=Qz(c[a+16>>2]|0)|0;while(1){if(!b)break;c[b+32>>2]=mR(c[b+24>>2]|0)|0;b=c[b>>2]|0}a=c[a>>2]|0}return}function KQ(a){a=a|0;var b=0;a=Qz(a)|0;while(1){if(!a)break;b=Qz(c[a+16>>2]|0)|0;while(1){if(!b)break;if(c[b+24>>2]|0)aR(b);b=c[b>>2]|0}a=c[a>>2]|0}return}function LQ(a,b){a=a|0;b=b|0;var d=0;d=Qz(a)|0;while(1){if(!d)break;a=Qz(c[d+16>>2]|0)|0;while(1){if(!a)break;QQ(a,b);a=c[a>>2]|0}d=c[d>>2]|0}return}function MQ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0;e=Qz(a)|0;while(1){if(!e)break;i=e+8|0;f=Qz(c[e+16>>2]|0)|0;while(1){if(!f)break;a=f+24|0;a:do if(c[a>>2]|0){if(c[47394]&8|0)NQ(f,~~+h[i>>3]);g=f+32|0;rR(c[g>>2]|0);b=c[a>>2]|0;d=f+28|0;a=0;while(1){if((a|0)>=(b|0))break a;c[(c[(c[d>>2]|0)+(a<<2)>>2]|0)+44>>2]=(c[(c[(c[g>>2]|0)+4>>2]|0)+(a*12|0)+4>>2]|0)+1;a=a+1|0}}while(0);f=c[f>>2]|0}e=c[e>>2]|0}return}function NQ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0.0,m=0.0;j=l;l=l+32|0;d=j;g=a+24|0;a:do if((c[g>>2]|0)>=2){i=c[15715]|0;m=+h[a+8>>3];k=+h[a+16>>3];c[d>>2]=b;h[d+8>>3]=m;h[d+16>>3]=k;z4(i,111040,d)|0;f=a+32|0;a=a+28|0;b=0;while(1){if((b|0)>=(c[g>>2]|0))break a;e=c[(c[(c[f>>2]|0)+4>>2]|0)+(b*12|0)+8>>2]|0;b:do if(Uz(e)|0){OQ(i,c[(c[a>>2]|0)+(b<<2)>>2]|0);Z3(111060,i)|0;d=eb[c[e>>2]&63](e,0,128)|0;while(1){if(!d)break b;Z3(111065,i)|0;OQ(i,c[(c[a>>2]|0)+(c[d>>2]<<2)>>2]|0);Z3(153748,i)|0;d=eb[c[e>>2]&63](e,d,8)|0}}while(0);b=b+1|0}}while(0);l=j;return}function OQ(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0.0,j=0,k=0,m=0,n=0;m=l;l=l+80|0;k=m+40|0;j=m;n=(a[d>>0]|0)==0;i=+h[d+8>>3];e=+h[d+24>>3];f=+h[d+16>>3];g=PQ(c[d+32>>2]|0)|0;d=PQ(c[d+36>>2]|0)|0;if(n){h[k>>3]=f;h[k+8>>3]=i;h[k+16>>3]=e;h[k+24>>3]=i;c[k+32>>2]=g;c[k+36>>2]=d;z4(b,111071,k)|0}else{h[j>>3]=i;h[j+8>>3]=f;h[j+16>>3]=i;h[j+24>>3]=e;c[j+32>>2]=g;c[j+36>>2]=d;z4(b,111071,j)|0}l=m;return}function PQ(a){a=a|0;switch(a|0){case 0:{a=111122;break}case 1:{a=111117;break}case 2:{a=111110;break}case 3:{a=111103;break}case 4:{a=111095;break}default:a=0}return a|0}function QQ(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=l;l=l+16|0;r=w+8|0;t=w;u=c[a+32>>2]|0;v=c[a+28>>2]|0;p=a+24|0;m=r+4|0;n=t+4|0;j=0;a=c[p>>2]|0;a:while(1){q=j+1|0;if((q|0)>=(a|0))break;o=v+(j<<2)|0;k=q;while(1){if((k|0)>=(a|0)){j=q;continue a}b:do if(((qR(u,j,k)|0)==0?(qR(u,k,j)|0)==0:0)?(s=v+(k<<2)|0,RQ(c[o>>2]|0,c[s>>2]|0)|0):0){f=c[o>>2]|0;a=c[f+48>>2]|0;i=c[s>>2]|0;d=c[i+48>>2]|0;e=(d|0)==0;if(a)if(e)a=1;else a=+h[a+8>>3]!=+h[d+8>>3];else a=e^1;g=a&1;SQ(r,f,i,0,g);a=c[r>>2]|0;i=c[m>>2]|0;f=g^1;SQ(t,c[o>>2]|0,c[s>>2]|0,1,f);d=c[t>>2]|0;e=c[n>>2]|0;switch(i|0){case -1:{TQ(c[s>>2]|0,c[o>>2]|0,g,0,a,b);TQ(c[s>>2]|0,c[o>>2]|0,f,1,d,b);if((e|0)!=1)break b;UQ(c[o>>2]|0,c[s>>2]|0,f,b);break b}case 0:switch(e|0){case -1:{TQ(c[s>>2]|0,c[o>>2]|0,g,0,a,b);TQ(c[s>>2]|0,c[o>>2]|0,f,1,d,b);break b}case 0:{TQ(c[o>>2]|0,c[s>>2]|0,0,g,a,b);TQ(c[o>>2]|0,c[s>>2]|0,1,f,d,b);break b}case 1:{TQ(c[o>>2]|0,c[s>>2]|0,0,g,a,b);TQ(c[o>>2]|0,c[s>>2]|0,1,f,d,b);break b}default:break b}case 1:{TQ(c[o>>2]|0,c[s>>2]|0,0,g,a,b);TQ(c[o>>2]|0,c[s>>2]|0,1,f,d,b);if((e|0)!=-1)break b;UQ(c[o>>2]|0,c[s>>2]|0,f,b);break b}default:break b}}while(0);k=k+1|0;a=c[p>>2]|0}}l=w;return}function RQ(a,b){a=a|0;b=b|0;if(!(+h[a+8>>3]==+h[b+8>>3]))Aa(111193,110462,843,111224);if((+h[a+16>>3]==+h[b+16>>3]?+h[a+24>>3]==+h[b+24>>3]:0)?(c[a+32>>2]|0)==(c[b+32>>2]|0):0)a=(c[a+36>>2]|0)==(c[b+36>>2]|0);else a=0;return a&1|0}function SQ(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=0;while(1){b=VQ(b,e)|0;h=g+1|0;if(!b){i=0;break}d=VQ(d,f)|0;if(!d){j=5;break}if(!(RQ(b,d)|0)){j=6;break}else g=h}if((j|0)==5)Aa(138697,110462,871,111142);else if((j|0)==6)i=XQ(b,WQ(b,d)|0,h,1-e|0)|0;c[a>>2]=g;c[a+4>>2]=i;return}function TQ(b,d,e,f,g,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=i+24|0;v=i+20|0;i=HQ(c[((a[b>>0]|0)==0?v:w)>>2]|0,b)|0;oR(c[i+32>>2]|0,c[b+40>>2]|0,c[d+40>>2]|0);s=1;while(1){if((s|0)>(g|0))break;t=VQ(b,e)|0;u=VQ(d,f)|0;j=i+32|0;k=b+40|0;l=d+40|0;m=t+8|0;n=b+36|0;o=b+32|0;p=b+16|0;q=u+40|0;r=t+40|0;do if(!(a[b>>0]|0)){i=HQ(c[w>>2]|0,t)|0;j=c[j>>2]|0;d=c[k>>2]|0;b=c[l>>2]|0;if(+h[m>>3]==+h[p>>3]){p=(c[o>>2]|0)==1;j=(qR(j,d,b)|0)!=0;k=c[i+32>>2]|0;d=c[q>>2]|0;b=c[r>>2]|0;if(p)if(j){oR(k,d,b);break}else{oR(k,b,d);break}else if(j){oR(k,b,d);break}else{oR(k,d,b);break}}else{p=(c[n>>2]|0)==1;j=(qR(j,d,b)|0)!=0;k=c[i+32>>2]|0;d=c[q>>2]|0;b=c[r>>2]|0;if(p)if(j){oR(k,b,d);break}else{oR(k,d,b);break}else if(j){oR(k,d,b);break}else{oR(k,b,d);break}}}else{i=HQ(c[v>>2]|0,t)|0;j=c[j>>2]|0;d=c[k>>2]|0;b=c[l>>2]|0;if(+h[m>>3]==+h[p>>3]){p=(c[o>>2]|0)==2;j=(qR(j,d,b)|0)!=0;k=c[i+32>>2]|0;d=c[q>>2]|0;b=c[r>>2]|0;if(p)if(j){oR(k,b,d);break}else{oR(k,d,b);break}else if(j){oR(k,d,b);break}else{oR(k,b,d);break}}else{p=(c[n>>2]|0)==2;j=(qR(j,d,b)|0)!=0;k=c[i+32>>2]|0;d=c[q>>2]|0;b=c[r>>2]|0;if(p)if(j){oR(k,d,b);break}else{oR(k,b,d);break}else if(j){oR(k,b,d);break}else{oR(k,d,b);break}}}while(0);b=t;d=u;s=s+1|0}return}function UQ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0;while(1){if(!(RQ(b,d)|0))break;g=VQ(b,1)|0;d=VQ(d,e)|0;b=g}g=c[(HQ(c[((a[b>>0]|0)==0?f+20|0:f+24|0)>>2]|0,b)|0)+32>>2]|0;pR(g,c[b+40>>2]|0,c[d+40>>2]|0);return}function VQ(a,b){a=a|0;b=b|0;if(!a)Aa(111129,110462,798,111133);else return c[((b|0)==0?a+48|0:a+52|0)>>2]|0;return 0}function WQ(b,c){b=b|0;c=c|0;var d=0,e=0,f=0;f=l;l=l+16|0;e=f;d=a[b>>0]|0;if(d<<24>>24==(a[c>>0]|0)?!(+h[b+8>>3]!=+h[c+8>>3]):0){if(!(d<<24>>24))b=YQ(b,c,3,1)|0;else b=YQ(b,c,4,2)|0;l=f;return b|0}dA(1,111155,e)|0;Ca(189580,1);return 0}function XQ(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0;m=1;while(1){if((m|0)>(e|0))break;l=VQ(b,f)|0;g=+h[l+8>>3]==+h[b+16>>3];k=0-d|0;i=b+36|0;j=b+32|0;do if(!(a[b>>0]|0))if(g){g=(c[j>>2]|0)==1;break}else{g=(c[i>>2]|0)==3;break}else if(g){g=(c[j>>2]|0)==4;break}else{g=(c[i>>2]|0)==2;break}while(0);b=l;m=m+1|0;d=g?k:d}return d|0}function YQ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0,i=0.0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0.0,q=0,r=0,s=0;p=+h[a+24>>3];i=+h[b+16>>3];do if(!(p>3],m=+h[b+24>>3],!(f>m)):0){if(i>2]|0;return ((d|0)==(c[b>>2]|0)?0:(d|0)==(e|0)?1:-1)|0}else{b=c[a>>2]|0;b=(b|0)==(c[g>>2]|0)?0:(b|0)==(e|0)?1:-1;break}q=c[b>>2]|0;r=c[a>>2]|0;if(!(p==m))if(p>2]|0)==(d|0);b=$Q(q,r,d,e)|0;b=s?b:0-b|0;break}else{s=(c[g>>2]|0)==(e|0);b=$Q(r,q,d,e)|0;b=s?b:0-b|0;break}n=c[g>>2]|0;if((r|0)==(q|0)?(c[s>>2]|0)==(n|0):0){b=0;break}o=(q|0)==(d|0);j=(r|0)!=(e|0);b=(r|0)!=(d|0);k=(q|0)==(e|0);if((q|0)==(n|0)){if(o|k){b=o?1:-1;break}if(b?(c[s>>2]|0)!=(d|0):0){b=1;break}if(j?(c[s>>2]|0)!=(e|0):0){b=-1;break}b=0;break}l=(n|0)!=(e|0);if(!(l|o^1)){if(b?(c[s>>2]|0)==(e|0):0){b=1;break}if((r|0)==(d|0)?(c[s>>2]|0)!=(e|0):0){b=-1;break}b=0;break}g=c[s>>2]|0;a=(n|0)!=(d|0);if(!(a|k^1)){if((r|0)==(e|0)&(g|0)!=(d|0)){b=1;break}return (j&(g|0)==(d|0))<<31>>31|0}b=(q|0)!=0;if(!(b|a)){b=_Q(r,g,d)|0;break}if(!(b|l)){b=0-(_Q(r,g,e)|0)|0;break}if(o&(n|0)==0){b=_Q(g,r,d)|0;break}else{b=0-(_Q(g,r,e)|0)|0;break}}else b=0;while(0);return b|0}function ZQ(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0.0,j=0.0,k=0;i=+h[a+24>>3];j=+h[b+24>>3];k=a+36|0;f=b+32|0;do if(i>2]|0;if((a|0)==(d|0)?(c[f>>2]|0)==(e|0):0){a=-1;break}if((a|0)==(e|0)?(c[f>>2]|0)==(d|0):0){a=1;break}a=0}else{f=c[f>>2]|0;g=(f|0)==(e|0);a=b+36|0;if(i==j){f=c[a>>2]|0;a=c[k>>2]|0;if(g){a=$Q(a,f,d,e)|0;break}else{a=0-($Q(f,a,d,e)|0)|0;break}}if(g?(c[a>>2]|0)==(e|0):0){a=-1;break}if((f|0)==(d|0)?(c[a>>2]|0)==(d|0):0){a=1;break}a=0}while(0);return a|0}function _Q(a,b,c){a=a|0;b=b|0;c=c|0;return ((a|0)==(c|0)?((b|0)==(c|0))<<31>>31:1)|0}function $Q(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((a|0)==(d|0)){b=(a|0)==0;if(b)return 0;else b=b&1}return ((a|0)!=0|(b|0)!=(c|0))<<31>>31|0}function aR(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;g=c[a+28>>2]|0;h=c[a+24>>2]|0;d=c[a+32>>2]|0;a=0;a:while(1){e=a+1|0;if((e|0)>=(h|0))break;f=g+(a<<2)|0;b=e;while(1){if((b|0)==(h|0)){a=e;continue a}switch(WQ(c[f>>2]|0,c[g+(b<<2)>>2]|0)|0){case 1:{oR(d,a,b);break}case -1:{oR(d,b,a);break}default:{}}b=b+1|0}}return}function bR(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=a+24|0;e=c[f>>2]|0;d=e+1|0;c[f>>2]=d;c[b+40>>2]=e;e=a+28|0;a=c[e>>2]|0;if(!a)a=IK(d<<2)|0;else a=KK(a,d<<2)|0;c[e>>2]=a;c[a+((c[f>>2]|0)+-1<<2)>>2]=b;return}function cR(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,g=0;g=l;l=l+16|0;f=g;h[f>>3]=d;e=eb[c[a>>2]&63](a,f,512)|0;if(!e){e=HK(24)|0;h[e+8>>3]=+h[f>>3];c[e+16>>2]=Sz(25776,c[4591]|0)|0;eb[c[a>>2]&63](a,e,1)|0}f=c[e+16>>2]|0;eb[c[f>>2]&63](f,b,1)|0;l=g;return}function dR(a,b,d){a=a|0;b=b|0;d=d|0;nR(c[b+32>>2]|0);l6(c[b+28>>2]|0);l6(b);return}function eR(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0;e=+h[b>>3];f=+h[c>>3];d=c+8|0;a=b+8|0;if(!(e>f))if(e>3]>=+h[d>>3])<<31>>31;else a=0;else a=!(+h[a>>3]<=+h[d>>3])&1;return a|0}function fR(a,b,d){a=a|0;b=b|0;d=d|0;Oz(c[b+16>>2]|0)|0;l6(b);return}function gR(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0;f=+h[b>>3];e=+h[c>>3];return (f>e?1:(f>31)|0}function hR(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0,j=0,k=0,l=0,m=0;m=(a[d+36>>0]|0)!=0;k=e+40|0;j=e+48|0;i=e+64|0;l=e+56|0;do if((c[d+24>>2]|0)==(e|0)){f=+h[k>>3];g=+h[j>>3];if(m){g=(g+ +h[i>>3])*.5;break}else{f=(f+ +h[l>>3])*.5;break}}else{g=+h[i>>3];f=+h[l>>3];if(m){g=(g+ +h[j>>3])*.5;break}else{f=(f+ +h[k>>3])*.5;break}}while(0);h[b>>3]=f;h[b+8>>3]=g;return}function iR(a,b){a=a|0;b=b|0;var d=0;d=c[a+20>>2]|0;if((d|0)!=(c[b+20>>2]|0)?(d|0)!=(c[b+24>>2]|0):0)d=c[a+24>>2]|0;return d|0}function jR(a,b){a=a|0;b=b|0;var c=0.0;c=(+h[b+48>>3]+ +h[b+64>>3])*.5;h[a>>3]=(+h[b+40>>3]+ +h[b+56>>3])*.5;h[a+8>>3]=c;return}function kR(b,d,e,f,g,i,j){b=b|0;d=d|0;e=+e;f=+f;g=+g;i=i|0;j=j|0;var k=0,l=0,m=0;a[b>>0]=d;h[b+8>>3]=e;d=b+16|0;k=b+32|0;l=b+36|0;m=b+24|0;if(f>3]=f;h[m>>3]=g;c[k>>2]=i;c[l>>2]=j;d=0}else{h[m>>3]=f;h[d>>3]=g;c[l>>2]=i;c[k>>2]=j;d=1}a[b+1>>0]=d;return}function lR(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0;f=c[b+36>>2]|0;i=b+64|0;g=b+56|0;e=b+40|0;do if((c[f+4>>2]|0)!=(d|0)){b=b+48|0;if((c[f+12>>2]|0)==(d|0)){e=~~((+h[e>>3]+ +h[g>>3])*.5);b=~~+h[b>>3];break}if((c[f+8>>2]|0)==(d|0)){e=~~+h[e>>3];b=~~((+h[b>>3]+ +h[i>>3])*.5);break}if((c[f>>2]|0)==(d|0)){e=~~+h[g>>3];b=~~((+h[b>>3]+ +h[i>>3])*.5)}else{e=0;b=0}}else{e=~~((+h[e>>3]+ +h[g>>3])*.5);b=~~+h[i>>3]}while(0);c[a>>2]=e;c[a+4>>2]=b;return}function mR(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;d=HK(8)|0;c[d>>2]=a;e=d+4|0;c[e>>2]=HK(a*12|0)|0;b=0;while(1){if((b|0)>=(a|0))break;g=NU()|0;f=c[e>>2]|0;c[f+(b*12|0)+8>>2]=g;c[f+(b*12|0)>>2]=0;b=b+1|0}return d|0}function nR(a){a=a|0;var b=0,d=0,e=0;d=a+4|0;b=0;while(1){e=c[d>>2]|0;if((b|0)>=(c[a>>2]|0))break;Oz(c[e+(b*12|0)+8>>2]|0)|0;b=b+1|0}l6(e);l6(a);return}function oR(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=c[(c[a+4>>2]|0)+(b*12|0)+8>>2]|0;eb[c[d>>2]&63](d,f,1)|0;l=e;return}function pR(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+16|0;f=e;c[f>>2]=d;a=a+4|0;g=c[(c[a>>2]|0)+(b*12|0)+8>>2]|0;eb[c[g>>2]&63](g,f,2)|0;c[f>>2]=b;d=c[(c[a>>2]|0)+(d*12|0)+8>>2]|0;eb[c[d>>2]&63](d,f,2)|0;l=e;return}function qR(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=c[(c[a+4>>2]|0)+(b*12|0)+8>>2]|0;d=(eb[c[d>>2]&63](d,f,512)|0)!=0&1;l=e;return d|0}function rR(a){a=a|0;var b=0,d=0,e=0,f=0;b=c[a>>2]|0;do if(b|0){f=a+4|0;if((b|0)==1){c[(c[f>>2]|0)+4>>2]=0;break}e=sR(b)|0;d=0;b=0;while(1){if((d|0)>=(c[a>>2]|0)){b=0;break}if(!(c[(c[f>>2]|0)+(d*12|0)>>2]|0))b=tR(a,d,b,e)|0;d=d+1|0}while(1){d=uR(e)|0;if((d|0)<=-1)break;c[(c[f>>2]|0)+(d*12|0)+4>>2]=b;b=b+1|0}vR(e)}while(0);return}function sR(a){a=a|0;var b=0;b=HK(8)|0;c[b+4>>2]=HK(a<<2)|0;c[b>>2]=-1;return b|0}function tR(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;i=a+4|0;g=c[i>>2]|0;j=g+(b*12|0)|0;c[j>>2]=1;g=c[g+(b*12|0)+8>>2]|0;h=g+4|0;d=d+1|0;g=Qz(g)|0;while(1){if(!g)break;f=c[(c[h>>2]|0)+8>>2]|0;if((f|0)<0)f=c[g+8>>2]|0;else f=g+(0-f)|0;f=c[f>>2]|0;if(!(c[(c[i>>2]|0)+(f*12|0)>>2]|0))d=tR(a,f,d,e)|0;g=c[g>>2]|0}c[j>>2]=2;wR(e,b);return d+1|0}function uR(a){a=a|0;var b=0,d=0;b=c[a>>2]|0;if((b|0)==-1)a=-1;else{d=c[(c[a+4>>2]|0)+(b<<2)>>2]|0;c[a>>2]=b+-1;a=d}return a|0}function vR(a){a=a|0;l6(c[a+4>>2]|0);l6(a);return}function wR(a,b){a=a|0;b=b|0;var d=0;d=(c[a>>2]|0)+1|0;c[a>>2]=d;c[(c[a+4>>2]|0)+(d<<2)>>2]=b;return}function xR(a){a=a|0;var d=0,e=0,f=0;e=c[a>>2]|0;c[a+8>>2]=e;c[a+12>>2]=c[a+4>>2];d=a+16|0;a=0;while(1){if((a|0)>=(e|0))break;f=c[d>>2]|0;b[f+(a*40|0)+18>>1]=b[f+(a*40|0)+16>>1]|0;a=a+1|0}return}function yR(a){a=a|0;var d=0,e=0,f=0;d=c[a+8>>2]|0;c[a>>2]=d;c[a+4>>2]=c[a+12>>2];e=a+16|0;a=0;while(1){if((a|0)>=(d|0))break;f=c[e>>2]|0;b[f+(a*40|0)+16>>1]=b[f+(a*40|0)+18>>1]|0;a=a+1|0}d=d+2|0;while(1){if((a|0)>=(d|0))break;b[(c[e>>2]|0)+(a*40|0)+16>>1]=0;a=a+1|0}return}function zR(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=HK(((c[a>>2]|0)*6|0)+(b<<1)<<2)|0;c[a+20>>2]=HK((((c[a>>2]|0)*3|0)+b|0)*24|0)|0;e=c[a>>2]|0;f=a+16|0;a=0;while(1){if((a|0)>=(e|0))break;c[(c[f>>2]|0)+(a*40|0)+28>>2]=d;d=d+24|0;a=a+1|0}e=e+2|0;while(1){if((a|0)>=(e|0))break;c[(c[f>>2]|0)+(a*40|0)+28>>2]=d;d=d+(b<<2)|0;a=a+1|0}return}function AR(a){a=a|0;var b=0;b=HK(24)|0;c[b>>2]=0;c[b+16>>2]=HK(a*40|0)|0;return b|0}function BR(a){a=a|0;var b=0,d=0;d=c[a+16>>2]|0;b=c[a>>2]|0;c[d+(b*40|0)+32>>2]=b;c[a>>2]=b+1;return d+(b*40|0)|0}function CR(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0,g=0;g=a+4|0;f=c[g>>2]|0;c[g>>2]=f+1;g=c[a+20>>2]|0;a=g+(f*24|0)|0;c[g+(f*24|0)+12>>2]=c[b+32>>2];c[g+(f*24|0)+16>>2]=c[d+32>>2];h[a>>3]=e;c[g+(f*24|0)+8>>2]=0;DR(b,f);DR(d,f);return a|0}function DR(a,d){a=a|0;d=d|0;var e=0,f=0;e=a+16|0;f=b[e>>1]|0;c[(c[a+28>>2]|0)+(f<<16>>16<<2)>>2]=d;b[e>>1]=f+1<<16>>16;return}function ER(a){a=a|0;var b=0;b=a+16|0;l6(c[(c[b>>2]|0)+28>>2]|0);l6(c[b>>2]|0);l6(c[a+20>>2]|0);l6(a);return}function FR(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0;g=c[a>>2]|0;i=a+16|0;f=0;while(1){if((f|0)>=(g|0))break;c[(c[i>>2]|0)+(f*40|0)>>2]=-2147483648;f=f+1|0}VU();a:do if(!(YU(d)|0)){c[d+8>>2]=0;c[d>>2]=0;d=a+20|0;b:while(1){g=_U()|0;if(!g){f=0;break a}c[g>>2]=0-(c[g>>2]|0);if((g|0)==(e|0)){f=0;break a}i=g+16|0;j=g+28|0;f=0;while(1){if((f|0)>=(b[i>>1]|0))continue b;k=(c[d>>2]|0)+((c[(c[j>>2]|0)+(f<<2)>>2]|0)*24|0)|0;l=GR(a,k,g)|0;m=c[l>>2]|0;do if((m|0)<0){n=~~-(+(c[g>>2]|0)+ +h[k>>3]);if((m|0)==-2147483648){c[l>>2]=n;if(YU(l)|0){f=1;break a}c[l+8>>2]=g;c[l+12>>2]=k;break}else{if((m|0)>=(n|0))break;$U(l,n);c[l+8>>2]=g;c[l+12>>2]=k;break}}while(0);f=f+1|0}}}else f=1;while(0);return f|0}function GR(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=c[b+12>>2]|0;if((e|0)==(c[d+32>>2]|0))e=c[b+16>>2]|0;return (c[a+16>>2]|0)+(e*40|0)|0}function HR(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=c[a>>2]|0;JF(d,3,b)|0;b=c[d+92>>2]|0;do if(b){e=c[b+16>>2]|0;h=c[e+12>>2]|0;c[a+76>>2]=h;f=c[e+16>>2]|0;c[a+84>>2]=f;g=a+80|0;c[g>>2]=c[e>>2];c[a+88>>2]=c[b+4>>2];e=a+152|0;f=c[e>>2]|c[f>>2];c[e>>2]=f;b=c[d+80>>2]|0;d=a+60|0;if(!b){c[d>>2]=0;b=999;break}else{i=c[b+16>>2]|0;c[d>>2]=c[i+12>>2];d=c[i+16>>2]|0;c[a+68>>2]=d;c[a+72>>2]=c[b+4>>2];c[e>>2]=f|c[d>>2];c[a+64>>2]=c[((h|0)==0?g:i)>>2];b=300;break}}else b=999;while(0);return b|0}function IR(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(!(iF(a)|0))if((b|0)!=0?(d=c[b>>2]|0,(d|0)!=0):0){db[d&127](a);a=0}else a=0;else a=1;return a|0}function JR(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+4>>2]|0,d|0):0)db[d&127](a);c[(c[a>>2]|0)+24>>2]=0;qF(a);return}function KR(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,g=0.0,i=0.0,j=0.0,k=0,l=0.0;j=+h[b+504>>3];g=+h[b+512>>3];l=+h[b+352>>3];k=(c[b+360>>2]|0)==0;i=+h[d>>3];f=+h[d+8>>3];e=l*+h[b+528>>3]*((k?g:j)+(k?f:i));h[a>>3]=l*+h[b+520>>3]*(k?j+i:-(g+f));h[a+8>>3]=e;return}function LR(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0,k=0.0;f=+h[a+504>>3];g=+h[a+512>>3];i=+h[a+352>>3];j=i*+h[a+520>>3];i=i*+h[a+528>>3];a:do if(!(c[a+360>>2]|0)){a=0;while(1){if((a|0)>=(e|0))break a;h[d+(a<<4)>>3]=j*(f+ +h[b+(a<<4)>>3]);h[d+(a<<4)+8>>3]=i*(g+ +h[b+(a<<4)+8>>3]);a=a+1|0}}else{a=0;while(1){if((a|0)>=(e|0))break a;k=-(j*(g+ +h[b+(a<<4)+8>>3]));h[d+(a<<4)+8>>3]=i*(f+ +h[b+(a<<4)>>3]);h[d+(a<<4)>>3]=k;a=a+1|0}}while(0);return d|0}function MR(a,b){a=a|0;b=b|0;var d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+8>>2]|0,d|0):0)db[d&127](a);return}function NR(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+12>>2]|0,d|0):0)db[d&127](a);pF(a);return}function OR(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+24>>2]|0,d|0):0)db[d&127](a);return}function PR(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+28>>2]|0,d|0):0)db[d&127](a);return}function QR(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+16>>2]|0,d|0):0){b=c[a+160>>2]|0;xb[d&31](a,c[(c[(c[a>>2]|0)+308>>2]|0)+(b<<2)>>2]|0,b,c[a+156>>2]|0)}return}function RR(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+20>>2]|0,d|0):0)db[d&127](a);return}function SR(a,b){a=a|0;b=b|0;var d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+32>>2]|0,d|0):0)db[d&127](a);return}function TR(a,b){a=a|0;b=b|0;var d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+36>>2]|0,d|0):0)db[d&127](a);return}function UR(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+40>>2]|0,d|0):0)db[d&127](a);return}function VR(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+44>>2]|0,d|0):0)db[d&127](a);return}function WR(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+48>>2]|0,d|0):0)db[d&127](a);return}function XR(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+52>>2]|0,d|0):0)db[d&127](a);return}function YR(a,b){a=a|0;b=b|0;var d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+56>>2]|0,d|0):0)db[d&127](a);return}function ZR(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+60>>2]|0,d|0):0)db[d&127](a);return}function _R(a,b){a=a|0;b=b|0;var d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+64>>2]|0,d|0):0)db[d&127](a);return}function $R(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+68>>2]|0,d|0):0)db[d&127](a);return}function aS(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=c[a+60>>2]|0;if(g|0?(h=c[g+72>>2]|0,h|0):0)fb[h&31](a,b,d,e,f);return}function bS(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+76>>2]|0,d|0):0)db[d&127](a);return}function cS(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[a+60>>2]|0;if(d|0?(e=c[d+80>>2]|0,e|0):0)lb[e&63](a,b);return}function dS(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if(b|0?(d=c[b+84>>2]|0,d|0):0)db[d&127](a);return}function eS(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;k=l;l=l+48|0;f=k+32|0;h=k;i=k+16|0;j=c[b+60>>2]|0;m=c[e>>2]|0;do if(m|0?a[m>>0]|0:0){m=c[b+16>>2]|0;if(m|0?(c[m+144>>2]|0)==0:0)break;if(!(c[b+152>>2]&8192)){c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];KR(i,b,f);c[h>>2]=c[i>>2];c[h+4>>2]=c[i+4>>2];c[h+8>>2]=c[i+8>>2];c[h+12>>2]=c[i+12>>2]}else{c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2]}if(j|0?(g=c[j+88>>2]|0,g|0):0){c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];rb[g&127](b,f,e)}}while(0);l=k;return}function fS(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;f=c[b+60>>2]|0;g=(c[b+16>>2]|0)+16|0;i=F3(d,58)|0;h=(i|0)!=0;if(h)a[i>>0]=0;if(f|0?(gS(c[b+68>>2]|0,d,g),e=c[f+92>>2]|0,e|0):0)lb[e&63](b,g);if(h)a[i>>0]=58;return}function gS(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+32|0;g=k+16|0;j=k+8|0;i=k;c[d>>2]=b;c[d+32>>2]=5;e=xT(b)|0;f=c[a+16>>2]|0;if(!((f|0)!=0?(e6(e,f,c[a+20>>2]|0,4,102)|0)!=0:0))h=3;a:do if((h|0)==3){switch(yT(b,d,c[a+24>>2]|0)|0){case 0:break a;case 1:break;default:{dA(1,111347,g)|0;break a}}a=IK((D3(b)|0)+16|0)|0;c[i>>2]=b;i2(a,111312,i)|0;if(NJ(a)|0){c[j>>2]=b;dA(0,111321,j)|0}l6(a)}while(0);l=k;return}function hS(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;f=c[b+60>>2]|0;g=(c[b+16>>2]|0)+56|0;i=F3(d,58)|0;h=(i|0)!=0;if(h)a[i>>0]=0;if(f|0?(gS(c[b+68>>2]|0,d,g),e=c[f+92>>2]|0,e|0):0)lb[e&63](b,g);if(h)a[i>>0]=58;return}function iS(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0,h=0,i=0,j=0;h=c[a+60>>2]|0;i=a+16|0;j=(c[i>>2]|0)+96|0;if(h|0?(gS(c[a+68>>2]|0,b,j),f=c[h+92>>2]|0,f|0):0)lb[f&63](a,j);j=c[i>>2]|0;c[j+136>>2]=d;g[j+140>>2]=e;return}function jS(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;k=m;j=c[b+60>>2]|0;b=c[b+16>>2]|0;c[b+160>>2]=d;a:do if((d|0)!=0&(j|0)!=0){j=b+144|0;i=b+152|0;g=b+148|0;b=d;b:while(1){f=b+4|0;b=c[b>>2]|0;if(!b)break a;c:do switch(a[b>>0]|0){case 115:{if(!(f2(b,111368)|0)){c[j>>2]=3;b=f;continue b}if(!(f2(b,111389)|0)){d=115;while(1){e=b+1|0;if(!(d<<24>>24))break;b=e;d=a[e>>0]|0}h[i>>3]=+a6(e);b=f;continue b}break}case 100:{if(!(f2(b,137628)|0)){c[j>>2]=1;b=f;continue b}if(!(f2(b,137621)|0)){c[j>>2]=2;b=f;continue b}break}case 105:{if(f2(b,134636)|0?f2(b,111374)|0:0)break c;c[j>>2]=0;b=f;continue b}case 98:{if(!(f2(b,111384)|0)){h[i>>3]=2.0;b=f;continue b}break}case 102:{if(!(f2(b,111402)|0)){c[g>>2]=1;b=f;continue b}break}case 117:{if(!(f2(b,111409)|0)){c[g>>2]=0;b=f;continue b}break}case 116:{if(!(f2(b,111418)|0)){b=f;continue b}break}default:{}}while(0);c[k>>2]=b;dA(0,111426,k)|0;b=f}}while(0);l=m;return}function kS(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0;j=l;l=l+32|0;g=j;d=c[a+60>>2]|0;if((d|0?(i=d+96|0,f=c[i>>2]|0,f|0):0)?c[(c[a+16>>2]|0)+144>>2]|0:0){d=b+16|0;h[g>>3]=(+h[b>>3]+ +h[d>>3])*.5;h[g+8>>3]=(+h[b+8>>3]+ +h[b+24>>3])*.5;b=g+16|0;c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];if(!(c[a+152>>2]&8192)){LR(a,g,g,2)|0;f=c[i>>2]|0}rb[f&127](a,g,e)}l=j;return}function lS(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+48|0;m=o;f=c[a+60>>2]|0;if((f|0?(n=f+100|0,c[n>>2]|0):0)?(k=a+16|0,g=c[k>>2]|0,c[g+144>>2]|0):0){j=g+16|0;if(!(e&4))g=0;else{i=g+56|0;e=e&-5;f=m;g=j;h=f+40|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));f=j;g=i;h=f+40|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));g=1}if(!(c[a+152>>2]&8192)){f=d+10|0;if((c[47434]|0)<(d|0)){c[47434]=f;f=KK(c[47435]|0,f<<4)|0;c[47435]=f}else f=c[47435]|0;LR(a,b,f,d)|0;xb[c[n>>2]&31](a,f,d,e)}else xb[c[n>>2]&31](a,b,d,e);if(g|0){f=(c[k>>2]|0)+16|0;g=m;h=f+40|0;do{c[f>>2]=c[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0))}}l=o;return}function mS(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+64|0;f=e;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];g=f+32|0;b=b+16|0;c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];h[f+16>>3]=+h[f>>3];h[f+24>>3]=+h[f+40>>3];h[f+48>>3]=+h[g>>3];h[f+56>>3]=+h[f+8>>3];lS(a,f,4,d);l=e;return}function nS(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;h=c[a+60>>2]|0;do if((h|0?(j=h+104|0,i=c[j>>2]|0,i|0):0)?c[(c[a+16>>2]|0)+144>>2]|0:0){h=g&255;if(c[a+152>>2]&8192|0){ub[i&15](a,b,d,e,f,h);break}g=d+10|0;if((c[47434]|0)<(d|0)){c[47434]=g;g=KK(c[47435]|0,g<<4)|0;c[47435]=g}else g=c[47435]|0;LR(a,b,g,d)|0;ub[c[j>>2]&15](a,g,d,e,f,h)}while(0);return}function oS(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=c[a+60>>2]|0;do if((e|0?(g=e+108|0,f=c[g>>2]|0,f|0):0)?c[(c[a+16>>2]|0)+144>>2]|0:0){if(c[a+152>>2]&8192|0){rb[f&127](a,b,d);break}e=d+10|0;if((c[47434]|0)<(d|0)){c[47434]=e;e=KK(c[47435]|0,e<<4)|0;c[47435]=e}else e=c[47435]|0;LR(a,b,e,d)|0;rb[c[g>>2]&127](a,e,d)}while(0);return}function pS(b,d){b=b|0;d=d|0;var e=0,f=0;e=c[b+60>>2]|0;if((d|0?!((e|0)==0|(a[d>>0]|0)==0):0)?(f=c[e+112>>2]|0,f|0):0)lb[f&63](b,d);return}function qS(b,d,e,f,g,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0.0,k=0.0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;H=l;l=l+112|0;D=H+64|0;G=H;n=H+96|0;z=H+48|0;A=H+32|0;E=c[b+60>>2]|0;if(!b)Aa(111583,111479,691,111490);if(!d)Aa(111509,111479,692,111490);if(!(a[d>>0]|0))Aa(111514,111479,693,111490);F=LF(d)|0;if(!F){if((E|0)!=0&(gN(d)|0)!=0?(m=c[E+116>>2]|0,m|0):0)fb[m&31](b,d,e,f,g&255)}else{s=b+432|0;c[D>>2]=c[s>>2];c[D+4>>2]=c[s+4>>2];c[D+8>>2]=c[s+8>>2];c[D+12>>2]=c[s+12>>2];OF(n,F,D);s=c[n>>2]|0;m=c[n+4>>2]|0;if(!((s|0)<1&(m|0)<1)){n=G+16|0;c[n>>2]=c[e>>2];c[n+4>>2]=c[e+4>>2];c[n+8>>2]=c[e+8>>2];c[n+12>>2]=c[e+12>>2];c[G>>2]=c[e>>2];c[G+4>>2]=c[e+4>>2];c[G+8>>2]=c[e+8>>2];c[G+12>>2]=c[e+12>>2];B=G+24|0;C=G+8|0;d=1;k=+h[G>>3];x=+h[C>>3];j=+h[n>>3];y=+h[B>>3];while(1){if((d|0)>=(f|0))break;I=e+(d<<4)|0;v=+h[I>>3];t=+h[(k>3];h[G>>3]=t;w=+h[e+(d<<4)+8>>3];u=+h[(x>3];h[C>>3]=u;v=+h[(j>v?n:I)>>3];h[n>>3]=v;w=+h[(y>w?n:I)+8>>3];h[B>>3]=w;d=d+1|0;k=t;x=u;j=v;y=w}v=j-k;w=y-x;o=+(m|0);p=+(s|0);t=v/p;q=w/o;u=o*q;r=p*t;a:do switch(rS(i)|0){case 1:if(t>3]=k;j=j-v;h[n>>3]=j}if(o>3]=w+x;h[B>>3]=y-w}if(!(c[b+152>>2]&8192)){c[D>>2]=c[G>>2];c[D+4>>2]=c[G+4>>2];c[D+8>>2]=c[G+8>>2];c[D+12>>2]=c[G+12>>2];KR(z,b,D);c[G>>2]=c[z>>2];c[G+4>>2]=c[z+4>>2];c[G+8>>2]=c[z+8>>2];c[G+12>>2]=c[z+12>>2];c[D>>2]=c[n>>2];c[D+4>>2]=c[n+4>>2];c[D+8>>2]=c[n+8>>2];c[D+12>>2]=c[n+12>>2];KR(A,b,D);c[n>>2]=c[A>>2];c[n+4>>2]=c[A+4>>2];c[n+8>>2]=c[A+8>>2];c[n+12>>2]=c[A+12>>2];k=+h[G>>3];j=+h[n>>3]}if(k>j){h[G>>3]=j;h[n>>3]=k}j=+h[C>>3];k=+h[B>>3];if(j>k){h[C>>3]=k;h[B>>3]=j}if(E|0){I=c[b+72>>2]|0;c[D>>2]=c[G>>2];c[D+4>>2]=c[G+4>>2];c[D+8>>2]=c[G+8>>2];c[D+12>>2]=c[G+12>>2];c[D+16>>2]=c[G+16>>2];c[D+20>>2]=c[G+20>>2];c[D+24>>2]=c[G+24>>2];c[D+28>>2]=c[G+28>>2];vS(b,F,D,g,I)}}}l=H;return}function rS(b){b=b|0;if(a[b>>0]|0)if(C3(b,141419)|0)if(C3(b,141351)|0)if(!(C3(b,111522)|0))b=4;else b=(bP(b)|0)<<24>>24!=0&1;else b=3;else b=2;else b=0;return b|0}function sS(a,b){a=a|0;b=+b;if(c[a+60>>2]|0)h[(c[a+16>>2]|0)+152>>3]=b;return}function tS(a,b){a=a|0;b=b|0;b=JF(a,1,b)|0;if(!b)b=999;else{b=c[b+16>>2]|0;c[a+184>>2]=c[b+4>>2];c[a+172>>2]=c[b+12>>2];c[a+176>>2]=c[b>>2];c[a+180>>2]=c[b+16>>2];b=300}return b|0}function uS(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;f=i;RC(b,137786,280,1)|0;g=b+16|0;c[(c[g>>2]|0)+144>>2]=a;if((vC(b)|0)!=(b|0))c[(c[(vC(b)|0)+16>>2]|0)+144>>2]=a;d=NA(b,111527)|0;e=a+172|0;if((d|0)!=0?(c[e>>2]=0,(tS(a,d)|0)==999):0){h=KF(a,1,d)|0;c[f>>2]=d;c[f+4>>2]=h;dA(1,111534,f)|0;d=-1}else{e=c[e>>2]|0;if(!e)d=-1;else{PJ(1);oK(b,c[c[a+180>>2]>>2]&1);d=c[(c[g>>2]|0)+8>>2]|0;c[(c[(vC(b)|0)+16>>2]|0)+8>>2]=d;YN();d=c[e>>2]|0;if(d|0?(db[d&127](b),h=c[e+4>>2]|0,h|0):0)c[(c[g>>2]|0)+148>>2]=h;PJ(0);d=0}}l=i;return d|0}function vS(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+176|0;k=n+8|0;j=n;h=n+40|0;if(!b)Aa(111583,111587,52,111601);if(!d)Aa(111613,111587,53,111601);i=c[d+8>>2]|0;if(!i)Aa(111616,111587,54,111601);if(!(a[i>>0]|0))Aa(111625,111587,55,111601);O3(h,c[d+28>>2]|0)|0;i=h+(D3(h)|0)|0;a[i>>0]=58;a[i+1>>0]=0;g6(h,g)|0;if((wS(b,h)|0)==999){c[j>>2]=h;dA(0,111637,j)|0}g=c[b+92>>2]|0;if(g|0?(m=c[g>>2]|0,m|0):0){c[k>>2]=c[e>>2];c[k+4>>2]=c[e+4>>2];c[k+8>>2]=c[e+8>>2];c[k+12>>2]=c[e+12>>2];c[k+16>>2]=c[e+16>>2];c[k+20>>2]=c[e+20>>2];c[k+24>>2]=c[e+24>>2];c[k+28>>2]=c[e+28>>2];xb[m&31](b,d,k,f)}l=n;return}function wS(a,b){a=a|0;b=b|0;b=JF(c[a>>2]|0,4,b)|0;if(!b)b=999;else{b=c[b+16>>2]|0;c[a+92>>2]=c[b+12>>2];c[a+96>>2]=c[b>>2];b=300}return b|0}function xS(a){a=a|0;return 1}function yS(b){b=b|0;var c=0;a[b+536>>0]=0;c=b+336|0;h[c>>3]=+h[c>>3]+10.0/+h[b+352>>3];a[b+537>>0]=1;return 0}function zS(b){b=b|0;var c=0;a[b+536>>0]=0;c=b+336|0;h[c>>3]=+h[c>>3]-10.0/+h[b+352>>3];a[b+537>>0]=1;return 0}function AS(b){b=b|0;var c=0;a[b+536>>0]=0;c=b+344|0;h[c>>3]=+h[c>>3]-10.0/+h[b+352>>3];a[b+537>>0]=1;return 0}function BS(b){b=b|0;var c=0;a[b+536>>0]=0;c=b+344|0;h[c>>3]=+h[c>>3]+10.0/+h[b+352>>3];a[b+537>>0]=1;return 0}function CS(b){b=b|0;var c=0;a[b+536>>0]=0;c=b+352|0;h[c>>3]=+h[c>>3]*1.1;a[b+537>>0]=1;return 0}function DS(b){b=b|0;var c=0;a[b+536>>0]=0;c=b+352|0;h[c>>3]=+h[c>>3]/1.1;a[b+537>>0]=1;return 0}function ES(b){b=b|0;var d=0,e=0,f=0,g=0.0,i=0.0;e=b+536|0;d=(a[e>>0]|0)==0;a[e>>0]=d&1;if(d){d=c[b+448>>2]|0;e=c[b+452>>2]|0;i=+(d>>>0);g=+(e>>>0);f=i/+(d|0)>3]=(f?i:g)/+((f?d:e)|0);e=b+336|0;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;a[b+537>>0]=1}return 0}function FS(b){b=b|0;var d=0,e=0;d=c[(c[b>>2]|0)+168>>2]|0;e=b+580|0;if(!(c[e>>2]|0)){c[e>>2]=d;e=(c[d+16>>2]|0)+112|0;a[e>>0]=a[e>>0]|2;VS(b,d)}qI(b,d);a[b+540>>0]=1;return}function GS(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=l;l=l+16|0;m=C;x=b+452|0;t=b+448|0;y=e+8|0;o=b+536|0;A=b+360|0;p=b+541|0;q=b+538|0;z=b+336|0;n=d&255;B=b+344|0;u=b+352|0;v=b+528|0;w=b+520|0;switch(d|0){case 1:{c[m>>2]=c[e>>2];c[m+4>>2]=c[e+4>>2];c[m+8>>2]=c[e+8>>2];c[m+12>>2]=c[e+12>>2];OS(b,m);US(b);a[q>>0]=1;a[p>>0]=n;r=13;break}case 2:{a[q>>0]=1;a[p>>0]=n;r=13;break}case 3:{c[m>>2]=c[e>>2];c[m+4>>2]=c[e+4>>2];c[m+8>>2]=c[e+8>>2];c[m+12>>2]=c[e+12>>2];OS(b,m);a[q>>0]=1;a[p>>0]=n;r=13;break}case 4:{a[o>>0]=0;j=+h[z>>3];k=+h[u>>3];i=+((c[t>>2]|0)>>>0)*.5;g=k*+h[w>>3];f=(+h[y>>3]-+((c[x>>2]|0)>>>0)*.5)*.10000000000000009/(k*+h[v>>3]);if(!(c[A>>2]|0))h[z>>3]=j+(+h[e>>3]-i)*.10000000000000009/g;else{h[z>>3]=j-f;f=(+h[e>>3]-i)*.10000000000000009/g}h[B>>3]=f+ +h[B>>3];h[u>>3]=k*1.1;r=13;break}case 5:{a[o>>0]=0;s=+h[u>>3]/1.1;h[u>>3]=s;k=+h[z>>3];j=+((c[t>>2]|0)>>>0)*.5;f=+h[v>>3];i=+h[w>>3];g=(+h[y>>3]-+((c[x>>2]|0)>>>0)*.5)*.10000000000000009;if(!(c[A>>2]|0))h[z>>3]=k-(+h[e>>3]-j)*.10000000000000009/(s*i);else{h[z>>3]=k+g/(s*f);g=(+h[e>>3]-j)*.10000000000000009;f=i}h[B>>3]=+h[B>>3]-g/(s*f);r=13;break}default:{}}if((r|0)==13)a[b+537>>0]=1;B=b+560|0;c[B>>2]=c[e>>2];c[B+4>>2]=c[e+4>>2];c[B+8>>2]=c[e+8>>2];c[B+12>>2]=c[e+12>>2];l=C;return}function HS(b,c,d){b=b|0;c=c|0;d=d|0;a[b+538>>0]=0;a[b+541>>0]=0;return}function IS(b,d){b=b|0;d=d|0;var e=0.0,f=0,g=0.0,i=0.0,j=0.0,k=0,m=0,n=0,o=0.0;n=l;l=l+16|0;f=n;m=b+560|0;e=(+h[d>>3]-+h[m>>3])/+h[b+520>>3];g=(+h[d+8>>3]-+h[b+568>>3])/+h[b+528>>3];if(!(+F(+e)<.0001?+F(+g)<.0001:0)){switch(a[b+541>>0]|0){case 0:{c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];OS(b,f);break}case 2:{f=b+336|0;o=+h[b+352>>3];j=+h[f>>3];i=e/o;k=b+344|0;e=g/o;g=+h[k>>3];if(!(c[b+360>>2]|0)){h[f>>3]=j-i;e=g-e}else{h[f>>3]=j-e;e=i+g}h[k>>3]=e;a[b+537>>0]=1;break}default:{}}c[m>>2]=c[d>>2];c[m+4>>2]=c[d+4>>2];c[m+8>>2]=c[d+8>>2];c[m+12>>2]=c[d+12>>2]}l=n;return}function JS(a,b,c){a=a|0;b=b|0;c=c|0;return}function KS(a){a=a|0;return}function LS(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;j=c[b>>2]|0;if(d){d=f4(d,139124)|0;if(d|0){i=hF(d,0)|0;l4(d)|0;f=5}}else{i=hF(c[15808]|0,0)|0;f=5}if((f|0)==5?i|0:0){g=j+168|0;d=c[g>>2]|0;if(d|0){f=c[j+172>>2]|0;if((f|0)!=0?(h=c[f+4>>2]|0,(h|0)!=0):0){db[h&127](d);d=c[g>>2]|0}tK(d);pB(c[g>>2]|0)|0}WC(i,0,137786,280,1);WC(i,1,137750,304,1);WC(i,2,137763,176,1);c[g>>2]=i;c[(c[i+16>>2]|0)+144>>2]=j;if((lG(j,i,e)|0)!=-1){c[b+580>>2]=0;c[b+576>>2]=0;a[b+537>>0]=1}}return}function MS(a,b){a=a|0;b=b|0;a=c[a>>2]|0;lG(a,c[a+168>>2]|0,b)|0;return}function NS(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=c[a>>2]|0;f=g+160|0;e=c[f>>2]|0;if((e|0)!=0?(c[g+164>>2]|0)==0:0){i=g+192|0;h=c[i>>2]|0;c[f>>2]=0;c[i>>2]=0;f=h}else{f=0;e=0}nG(g,c[g+168>>2]|0,b,d)|0;if(e|0){i=c[a>>2]|0;c[i+160>>2]=e;c[i+192>>2]=f}return}function OS(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0.0,j=0.0,k=0.0,m=0;f=l;l=l+80|0;e=f+48|0;g=f;m=f+32|0;c[e>>2]=c[d>>2];c[e+4>>2]=c[d+4>>2];c[e+8>>2]=c[d+8>>2];c[e+12>>2]=c[d+12>>2];PS(m,b,e);k=+h[m>>3];j=+h[m+8>>3];i=1.0/+h[b+352>>3];h[g+16>>3]=k+i;h[g+24>>3]=j+i;h[g>>3]=k-i;h[g+8>>3]=j-i;d=c[(c[b>>2]|0)+168>>2]|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2];c[e+12>>2]=c[g+12>>2];c[e+16>>2]=c[g+16>>2];c[e+20>>2]=c[g+20>>2];c[e+24>>2]=c[g+24>>2];c[e+28>>2]=c[g+28>>2];d=QS(d,e)|0;e=b+576|0;if((d|0)!=(c[e>>2]|0)){RS(b);c[e>>2]=d;SS(b);a[b+537>>0]=1}l=f;return}function PS(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,g=0.0,i=0.0;e=+h[b+352>>3];g=+h[d>>3];i=e*+h[b+520>>3];e=+h[d+8>>3]/(e*+h[b+528>>3]);if(!(c[b+360>>2]|0))f=g/i;else{f=e;e=-g/i}i=e-+h[b+512>>3];h[a>>3]=f-+h[b+504>>3];h[a+8>>3]=i;return}function QS(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=l;l=l+32|0;f=g;e=gC(a)|0;a:while(1){if(!e){e=9;break}d=UA(a,e)|0;while(1){if(!d)break;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];c[f+16>>2]=c[b+16>>2];c[f+20>>2]=c[b+20>>2];c[f+24>>2]=c[b+24>>2];c[f+28>>2]=c[b+28>>2];if((hQ(d,f)|0)<<24>>24){e=6;break a}d=WA(a,d)|0}e=hC(a,e)|0}do if((e|0)!=6)if((e|0)==9){d=iC(a)|0;while(1){if(!d)break;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];c[f+16>>2]=c[b+16>>2];c[f+20>>2]=c[b+20>>2];c[f+24>>2]=c[b+24>>2];c[f+28>>2]=c[b+28>>2];if((eQ(d,f)|0)<<24>>24){e=12;break}d=jC(a,d)|0}if((e|0)==12)break;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];c[f+16>>2]=c[b+16>>2];c[f+20>>2]=c[b+20>>2];c[f+24>>2]=c[b+24>>2];c[f+28>>2]=c[b+28>>2];d=TS(a,f)|0;if(!d){d=a;break}else break}while(0);l=g;return d|0}function RS(b){b=b|0;var d=0;d=c[b+576>>2]|0;a:do if(d|0)switch(FC(d)|0){case 0:{d=(c[d+16>>2]|0)+112|0;a[d>>0]=a[d>>0]&-2;break a}case 1:{d=(c[d+16>>2]|0)+117|0;a[d>>0]=a[d>>0]&-2;break a}case 2:{d=(c[d+16>>2]|0)+115|0;a[d>>0]=a[d>>0]&-2;break a}default:break a}while(0);c[b+584>>2]=0;return}function SS(b){b=b|0;var d=0,e=0;e=b+584|0;d=c[e>>2]|0;if(d|0){l6(d);c[e>>2]=0}d=c[b+576>>2]|0;a:do if(d|0)switch(FC(d)|0){case 0:{b=(c[d+16>>2]|0)+112|0;a[b>>0]=a[b>>0]|1;b=DA(d,0,141404,0)|0;if(!b)break a;c[e>>2]=CK(OA(d,b)|0,d)|0;break a}case 1:{b=(c[d+16>>2]|0)+117|0;a[b>>0]=a[b>>0]|1;b=DA(uC(d)|0,1,141404,0)|0;if(!b)break a;c[e>>2]=CK(OA(d,b)|0,d)|0;break a}case 2:{b=(c[d+16>>2]|0)+115|0;a[b>>0]=a[b>>0]|1;b=DA(uC(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)|0,2,141404,0)|0;if(!b)break a;c[e>>2]=CK(OA(d,b)|0,d)|0;break a}default:break a}while(0);return}function TS(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0.0,o=0.0;m=l;l=l+32|0;e=m;g=c[a+16>>2]|0;i=c[g+180>>2]|0;j=g+184|0;d=1;while(1){if((d|0)>(i|0)){k=4;break}f=c[(c[j>>2]|0)+(d<<2)>>2]|0;c[e>>2]=c[b>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];c[e+16>>2]=c[b+16>>2];c[e+20>>2]=c[b+20>>2];c[e+24>>2]=c[b+24>>2];c[e+28>>2]=c[b+28>>2];f=TS(f,e)|0;if(!f)d=d+1|0;else{a=f;break}}do if((k|0)==4){o=+h[g+24>>3];n=+h[g+40>>3];if(((+h[b+16>>3]>=+h[g+16>>3]?+h[g+32>>3]>=+h[b>>3]:0)?+h[b+24>>3]>=o:0)?n>=+h[b+8>>3]:0)break;a=0}while(0);l=m;return a|0}function US(b){b=b|0;var d=0,e=0,f=0;f=b+580|0;d=c[f>>2]|0;a:do if(d|0)switch(FC(d)|0){case 0:{e=(c[d+16>>2]|0)+112|0;a[e>>0]=a[e>>0]&-7|4;break a}case 1:{e=(c[d+16>>2]|0)+117|0;a[e>>0]=a[e>>0]&-7|4;break a}case 2:{e=(c[d+16>>2]|0)+115|0;a[e>>0]=a[e>>0]&-7|4;break a}default:break a}while(0);d=b+588|0;e=c[d>>2]|0;if(e|0){l6(e);c[d>>2]=0}d=c[b+576>>2]|0;c[f>>2]=d;b:do if(d|0)switch(FC(d)|0){case 0:{f=(c[d+16>>2]|0)+112|0;a[f>>0]=a[f>>0]|2;VS(b,d);break b}case 1:{f=(c[d+16>>2]|0)+117|0;a[f>>0]=a[f>>0]|2;WS(b,d);break b}case 2:{f=(c[d+16>>2]|0)+115|0;a[f>>0]=a[f>>0]|2;XS(b,d);break b}default:break b}while(0);return}function VS(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=a+592|0;do if((vC(b)|0)==(b|0))if(!(uB(b)|0)){EF(d,0,111795);break}else{EF(d,0,111787);break}else EF(d,0,111801);while(0);EF(d,1,HB(b)|0);c[a+596>>2]=2;f=a+604|0;d=0;e=2;while(1){d=IA(b,0,d)|0;if(!d)break;EF(f,e,c[d+8>>2]|0);EF(f,e+1|0,OA(b,d)|0);EF(f,e+2|0,0);e=e+3|0}c[a+608>>2]=e;d=DA(b,0,141358,0)|0;if(!d){d=DA(b,0,111778,0)|0;if(d|0)g=11}else g=11;if((g|0)==11)c[a+588>>2]=CK(OA(b,d)|0,b)|0;return}function WS(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;f=a+592|0;EF(f,0,111782);EF(f,1,HB(b)|0);c[a+596>>2]=2;f=a+604|0;g=vC(uC(b)|0)|0;e=2;d=0;while(1){d=IA(g,1,d)|0;if(!d)break;EF(f,e,c[d+8>>2]|0);EF(f,e|1,OA(b,d)|0);e=e+2|0}c[a+608>>2]=e;d=DA(uC(b)|0,1,141358,0)|0;if(!d){d=DA(uC(b)|0,1,111778,0)|0;if(d|0)h=6}else h=6;if((h|0)==6)c[a+588>>2]=CK(OA(b,d)|0,b)|0;return}function XS(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=a+592|0;EF(h,0,111751);k=b+48|0;EF(h,1,HB(c[((c[b>>2]&3|0)==3?b:k)+40>>2]|0)|0);k=(uB(uC(c[((c[b>>2]&3|0)==3?b:k)+40>>2]|0)|0)|0)!=0;EF(h,3,k?138041:142050);k=b+-48|0;EF(h,4,HB(c[((c[b>>2]&3|0)==2?b:k)+40>>2]|0)|0);c[a+596>>2]=7;i=a+604|0;j=vC(uC(c[((c[b>>2]&3|0)==2?b:k)+40>>2]|0)|0)|0;g=7;d=0;a:while(1){while(1){d=IA(j,2,d)|0;if(!d)break a;e=d+8|0;f=c[e>>2]|0;if(!(f2(f,111756)|0)){l=5;break}if(!(f2(f,111765)|0)){l=7;break}if(f2(f,111774)|0)break;EF(h,6,OA(b,d)|0)}if((l|0)==5){l=0;EF(h,2,OA(b,d)|0)}else if((l|0)==7){l=0;EF(h,5,OA(b,d)|0)}EF(i,g,c[e>>2]|0);EF(i,g+1|0,OA(b,d)|0);g=g+2|0}c[a+608>>2]=g;d=DA(uC(c[((c[b>>2]&3|0)==2?b:k)+40>>2]|0)|0,2,141358,0)|0;if(!d){d=DA(uC(c[((c[b>>2]&3|0)==2?b:k)+40>>2]|0)|0,2,111778,0)|0;if(d|0)l=13}else l=13;if((l|0)==13)c[a+588>>2]=CK(OA(b,d)|0,b)|0;return}function YS(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=ZS(a,b,c[d>>2]|0)|0;d=c[d+4>>2]|0;while(1){f=c[d+4>>2]|0;if(!f)break;b=0;while(1){e=c[f+(b*20|0)+4>>2]|0;if(!e)break;HF(a,c[d>>2]|0,e,c[f+(b*20|0)+8>>2]|0,g,f+(b*20|0)|0)|0;b=b+1|0}d=d+8|0}return}function ZS(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=IK(12)|0;if(!b)b=0;else b=Y3(b)|0;c[e+4>>2]=b;c[e+8>>2]=Y3(d)|0;d=a+100|0;c[e>>2]=c[d>>2];c[d>>2]=e;return e|0}function _S(b,c){b=b|0;c=c|0;$S(b);a[b+44>>0]=0;aT(b)|0;NO(b)|0;return}function $S(b){b=b|0;var d=0,e=0;d=c[b+32>>2]|0;a:do if(d|0)while(1){e=c[d>>2]|0;if(!e)break a;if((a[e>>0]|0)==103?C4(e,111810)|0:0)YS(b,0,c[d+4>>2]|0);d=d+8|0}while(0);return}function aT(a){a=a|0;var b=0;b=JF(a,2,111823)|0;if(!b)a=999;else{c[a+148>>2]=c[(c[b+16>>2]|0)+12>>2];a=300}return a|0}function bT(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;a=c[a+148>>2]|0;if((a|0)!=0?(e=c[a>>2]|0,(e|0)!=0):0)a=vb[e&127](b,d)|0;else a=0;return a|0}function cT(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;return (c[b>>2]|0)-(c[d>>2]|0)|0}function dT(a){a=a|0;var b=0.0,d=0.0;a=c[a+16>>2]|0;d=+h[a+16>>3];b=+h[a+24>>3];return (eT(~~(d>b?d:b)>>>0)|0)+1|0}function eT(a){a=a|0;var b=0,c=0;if(!a)a=-1;else{b=a>>>0>65535;c=b?a>>>16:a;a=b?16:0;b=c>>>0>255;c=b?c>>>8:c;a=b?a|8:a;b=c>>>0>15;c=b?c>>>4:c;a=b?a|4:a;b=c>>>0>3;a=((b?c>>>2:c)>>>0>1&1)+(b?a|2:a)|0}return a|0}function fT(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+32|0;q=r;p=gT(b,d,e,f,g)|0;e=hT(p)|0;if((e|0)>=0){n=q+16|0;o=q+24|0;m=q+8|0;k=g+32|0;e=0;g=0;while(1){if((g|0)>=(d|0))break;f=b+(g*40|0)+32|0;do if(c[f>>2]|0){iT(q,p,b+(g*40|0)|0);i=+h[n>>3];j=+h[o>>3];if(!(c[q>>2]|0)){a[(c[f>>2]|0)+36>>0]=1;break}if(+h[m>>3]==0.0){f=c[f>>2]|0;h[f+16>>3]=i;h[f+24>>3]=j;a[f+36>>0]=1;break}if((a[k>>0]|0)==1){f=c[f>>2]|0;h[f+16>>3]=i;h[f+24>>3]=j;a[f+36>>0]=1}else e=1}while(0);g=g+1|0}jT(p)}l=r;return e|0}function gT(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=HK(28)|0;j=Sz(25964,c[4594]|0)|0;h=g+20|0;c[h>>2]=j;do if(j){j=RV()|0;c[g+24>>2]=j;if(!j){_3(112041,14,1,c[15715]|0)|0;i=6;break}else{c[g>>2]=a;c[g+4>>2]=b;c[g+8>>2]=d;c[g+12>>2]=e;c[g+16>>2]=f;break}}else{_3(112041,14,1,c[15715]|0)|0;i=6}while(0);if((i|0)==6){a=c[h>>2]|0;if(a|0)Oz(a)|0;a=c[g+24>>2]|0;if(a|0)TV(a)|0;l6(g);g=0}return g|0}function hT(a){a=a|0;var b=0;b=sT(a)|0;if((b|0)>=0){tT(a);uT(a);b=Oz(c[a+20>>2]|0)|0}return b|0}function iT(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,i=0.0,j=0,k=0.0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0,N=0,O=0;O=l;l=l+464|0;L=O+416|0;N=O+400|0;I=O+384|0;j=O+352|0;n=O+320|0;o=O+288|0;p=O+256|0;r=O+224|0;s=O+192|0;t=O+160|0;u=O+128|0;v=O+96|0;w=O+64|0;x=O+32|0;J=O;y=c[d+32>>2]|0;e=+h[y>>3];B=d+16|0;z=(e*2.0+ +h[B>>3])*.125;C=y+8|0;K=d+24|0;i=+h[K>>3];M=(+h[C>>3]*2.0+i)*.5;if(!y)Aa(111834,111844,445,111854);f=L;g=f+36|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));A=y+16|0;h[A>>3]=+h[d>>3]-e;D=d+8|0;E=y+24|0;h[E>>3]=i+ +h[D>>3];kT(j,b,d,L);m=c[j>>2]|0;f=c[j+4>>2]|0;e=+h[j+8>>3];H=j+16|0;c[N>>2]=c[H>>2];c[N+4>>2]=c[H+4>>2];c[N+8>>2]=c[H+8>>2];c[N+12>>2]=c[H+12>>2];H=a+16|0;G=a+8|0;F=a+4|0;a:do if(!m){c[a>>2]=0;c[F>>2]=f;h[G>>3]=e;c[H>>2]=c[N>>2];c[H+4>>2]=c[N+4>>2];c[H+8>>2]=c[N+8>>2];c[H+12>>2]=c[N+12>>2]}else{h[E>>3]=+h[D>>3];kT(n,b,d,L);g=c[n>>2]|0;j=c[n+4>>2]|0;i=+h[n+8>>3];n=n+16|0;c[I>>2]=c[n>>2];c[I+4>>2]=c[n+4>>2];c[I+8>>2]=c[n+8>>2];c[I+12>>2]=c[n+12>>2];if(!g){c[a>>2]=0;c[F>>2]=j;h[G>>3]=i;c[H>>2]=c[I>>2];c[H+4>>2]=c[I+4>>2];c[H+8>>2]=c[I+8>>2];c[H+12>>2]=c[I+12>>2];break}if(i>2]=c[I>>2];c[N+4>>2]=c[I+4>>2];c[N+8>>2]=c[I+8>>2];c[N+12>>2]=c[I+12>>2];f=j;e=i}else g=m;h[E>>3]=+h[D>>3]-+h[C>>3];kT(o,b,d,L);m=c[o>>2]|0;j=c[o+4>>2]|0;i=+h[o+8>>3];o=o+16|0;c[I>>2]=c[o>>2];c[I+4>>2]=c[o+4>>2];c[I+8>>2]=c[o+8>>2];c[I+12>>2]=c[o+12>>2];if(!m){c[a>>2]=0;c[F>>2]=j;h[G>>3]=i;c[H>>2]=c[I>>2];c[H+4>>2]=c[I+4>>2];c[H+8>>2]=c[I+8>>2];c[H+12>>2]=c[I+12>>2];break}if(i>2]=c[I>>2];c[N+4>>2]=c[I+4>>2];c[N+8>>2]=c[I+8>>2];c[N+12>>2]=c[I+12>>2];f=j;e=i}else m=g;h[A>>3]=+h[d>>3];h[E>>3]=+h[D>>3]+ +h[K>>3];kT(p,b,d,L);g=c[p>>2]|0;j=c[p+4>>2]|0;i=+h[p+8>>3];p=p+16|0;c[I>>2]=c[p>>2];c[I+4>>2]=c[p+4>>2];c[I+8>>2]=c[p+8>>2];c[I+12>>2]=c[p+12>>2];if(!g){c[a>>2]=0;c[F>>2]=j;h[G>>3]=i;c[H>>2]=c[I>>2];c[H+4>>2]=c[I+4>>2];c[H+8>>2]=c[I+8>>2];c[H+12>>2]=c[I+12>>2];break}if(i>2]=c[I>>2];c[N+4>>2]=c[I+4>>2];c[N+8>>2]=c[I+8>>2];c[N+12>>2]=c[I+12>>2];m=g;f=j;e=i}h[E>>3]=+h[D>>3]-+h[C>>3];kT(r,b,d,L);g=c[r>>2]|0;j=c[r+4>>2]|0;i=+h[r+8>>3];r=r+16|0;c[I>>2]=c[r>>2];c[I+4>>2]=c[r+4>>2];c[I+8>>2]=c[r+8>>2];c[I+12>>2]=c[r+12>>2];if(!g){c[a>>2]=0;c[F>>2]=j;h[G>>3]=i;c[H>>2]=c[I>>2];c[H+4>>2]=c[I+4>>2];c[H+8>>2]=c[I+8>>2];c[H+12>>2]=c[I+12>>2];break}if(i>2]=c[I>>2];c[N+4>>2]=c[I+4>>2];c[N+8>>2]=c[I+8>>2];c[N+12>>2]=c[I+12>>2];m=g;f=j;e=i}h[A>>3]=+h[d>>3]+ +h[B>>3];h[E>>3]=+h[D>>3]+ +h[K>>3];kT(s,b,d,L);g=c[s>>2]|0;j=c[s+4>>2]|0;i=+h[s+8>>3];s=s+16|0;c[I>>2]=c[s>>2];c[I+4>>2]=c[s+4>>2];c[I+8>>2]=c[s+8>>2];c[I+12>>2]=c[s+12>>2];if(!g){c[a>>2]=0;c[F>>2]=j;h[G>>3]=i;c[H>>2]=c[I>>2];c[H+4>>2]=c[I+4>>2];c[H+8>>2]=c[I+8>>2];c[H+12>>2]=c[I+12>>2];break}if(i>2]=c[I>>2];c[N+4>>2]=c[I+4>>2];c[N+8>>2]=c[I+8>>2];c[N+12>>2]=c[I+12>>2];m=g;f=j;e=i}h[E>>3]=+h[D>>3];kT(t,b,d,L);g=c[t>>2]|0;j=c[t+4>>2]|0;i=+h[t+8>>3];t=t+16|0;c[I>>2]=c[t>>2];c[I+4>>2]=c[t+4>>2];c[I+8>>2]=c[t+8>>2];c[I+12>>2]=c[t+12>>2];if(!g){c[a>>2]=0;c[F>>2]=j;h[G>>3]=i;c[H>>2]=c[I>>2];c[H+4>>2]=c[I+4>>2];c[H+8>>2]=c[I+8>>2];c[H+12>>2]=c[I+12>>2];break}if(i>2]=c[I>>2];c[N+4>>2]=c[I+4>>2];c[N+8>>2]=c[I+8>>2];c[N+12>>2]=c[I+12>>2];m=g;f=j;e=i}h[E>>3]=+h[D>>3]-+h[C>>3];kT(u,b,d,L);g=c[u>>2]|0;j=c[u+4>>2]|0;i=+h[u+8>>3];u=u+16|0;c[I>>2]=c[u>>2];c[I+4>>2]=c[u+4>>2];c[I+8>>2]=c[u+8>>2];c[I+12>>2]=c[u+12>>2];if(!g){c[a>>2]=0;c[F>>2]=j;h[G>>3]=i;c[H>>2]=c[I>>2];c[H+4>>2]=c[I+4>>2];c[H+8>>2]=c[I+8>>2];c[H+12>>2]=c[I+12>>2];break}if(i>2]=c[I>>2];c[N+4>>2]=c[I+4>>2];c[N+8>>2]=c[I+8>>2];c[N+12>>2]=c[I+12>>2];f=j;e=i}else g=m;t=L+12|0;u=L+32|0;n=(c[L+28>>2]|0)!=0;o=(c[u>>2]|0)==0;j=c[t>>2]|0;m=c[L>>2]|0;do if(!(o&(((c[L+24>>2]|0)!=0|n)^1)&(j|0)==0&(m|0)==0)){do if(o&(n^1)){h[A>>3]=+h[d>>3]-+h[y>>3];p=v+4|0;r=v+8|0;s=v+16|0;m=E;j=D;i=+h[K>>3];b:while(1){while(1){h[m>>3]=i+ +h[j>>3];if(!(+h[A>>3]<=+h[d>>3]+ +h[B>>3])){n=42;break b}kT(v,b,d,L);n=c[v>>2]|0;o=c[p>>2]|0;k=+h[r>>3];c[I>>2]=c[s>>2];c[I+4>>2]=c[s+4>>2];c[I+8>>2]=c[s+8>>2];c[I+12>>2]=c[s+12>>2];if(!n){n=39;break b}if(k>2]=c[I>>2];c[N+4>>2]=c[I+4>>2];c[N+8>>2]=c[I+8>>2];c[N+12>>2]=c[I+12>>2];m=A;j=A;i=z;g=n;f=o;e=k}if((n|0)==39){c[a>>2]=0;c[F>>2]=o;h[G>>3]=k;c[H>>2]=c[I>>2];c[H+4>>2]=c[I+4>>2];c[H+8>>2]=c[I+8>>2];c[H+12>>2]=c[I+12>>2];break a}else if((n|0)==42){j=c[t>>2]|0;m=c[L>>2]|0;break}}while(0);if(!((j|0)==0&(m|0)==0))break;h[A>>3]=+h[d>>3]-+h[y>>3];k=+h[D>>3];n=w+4|0;o=w+8|0;p=w+16|0;i=k;k=k+ +h[K>>3];while(1){h[E>>3]=k;if(!(k>=i-+h[C>>3])){n=51;break}kT(w,b,d,L);j=c[w>>2]|0;m=c[n>>2]|0;i=+h[o>>3];c[I>>2]=c[p>>2];c[I+4>>2]=c[p+4>>2];c[I+8>>2]=c[p+8>>2];c[I+12>>2]=c[p+12>>2];if(!j){n=47;break}if(i>2]=c[I>>2];c[N+4>>2]=c[I+4>>2];c[N+8>>2]=c[I+8>>2];c[N+12>>2]=c[I+12>>2];g=j;f=m;e=i}i=+h[D>>3];k=+h[E>>3]-M}if((n|0)==47){c[a>>2]=0;c[F>>2]=m;h[G>>3]=i;c[H>>2]=c[I>>2];c[H+4>>2]=c[I+4>>2];c[H+8>>2]=c[I+8>>2];c[H+12>>2]=c[I+12>>2];break a}else if((n|0)==51){m=c[L>>2]|0;break}}else m=0;while(0);i=+h[d>>3];k=i+ +h[B>>3];h[A>>3]=k;q=+h[C>>3];h[E>>3]=+h[D>>3]-q;t=L+20|0;o=(c[L+4>>2]|0)!=0;n=(m|0)==0;m=c[t>>2]|0;j=c[u>>2]|0;c:do if(!(n&(((c[L+8>>2]|0)!=0|o)^1)&(m|0)==0&(j|0)==0)){do if(n&(o^1)){h[A>>3]=k;p=x+4|0;r=x+8|0;s=x+16|0;m=E;j=D;i=q;d:while(1){while(1){h[m>>3]=+h[j>>3]-i;i=+h[d>>3];if(!(+h[A>>3]>=i-+h[y>>3])){n=61;break d}kT(x,b,d,L);n=c[x>>2]|0;o=c[p>>2]|0;k=+h[r>>3];c[I>>2]=c[s>>2];c[I+4>>2]=c[s+4>>2];c[I+8>>2]=c[s+8>>2];c[I+12>>2]=c[s+12>>2];if(!n){n=58;break d}if(k>2]=c[I>>2];c[N+4>>2]=c[I+4>>2];c[N+8>>2]=c[I+8>>2];c[N+12>>2]=c[I+12>>2];m=A;j=A;i=z;g=n;f=o;e=k}if((n|0)==58){c[a>>2]=0;c[F>>2]=o;h[G>>3]=k;c[H>>2]=c[I>>2];c[H+4>>2]=c[I+4>>2];c[H+8>>2]=c[I+8>>2];c[H+12>>2]=c[I+12>>2];break a}else if((n|0)==61){m=c[t>>2]|0;j=c[u>>2]|0;break}}while(0);if(!((m|0)==0&(j|0)==0))break;h[A>>3]=i+ +h[B>>3];i=+h[D>>3];n=J+4|0;o=J+8|0;p=J+16|0;k=i;i=i-+h[C>>3];while(1){h[E>>3]=i;if(!(i<=k+ +h[K>>3]))break c;kT(J,b,d,L);j=c[J>>2]|0;m=c[n>>2]|0;i=+h[o>>3];c[I>>2]=c[p>>2];c[I+4>>2]=c[p+4>>2];c[I+8>>2]=c[p+8>>2];c[I+12>>2]=c[p+12>>2];if(!j)break;if(i>2]=c[I>>2];c[N+4>>2]=c[I+4>>2];c[N+8>>2]=c[I+8>>2];c[N+12>>2]=c[I+12>>2];g=j;f=m;e=i}k=+h[D>>3];i=M+ +h[E>>3]}c[a>>2]=0;c[F>>2]=m;h[G>>3]=i;c[H>>2]=c[I>>2];c[H+4>>2]=c[I+4>>2];c[H+8>>2]=c[I+8>>2];c[H+12>>2]=c[I+12>>2];break a}while(0);c[a>>2]=g;c[F>>2]=f;h[G>>3]=e;c[H>>2]=c[N>>2];c[H+4>>2]=c[N+4>>2];c[H+8>>2]=c[N+8>>2];c[H+12>>2]=c[N+12>>2]}while(0);l=O;return}function jT(a){a=a|0;TV(c[a+24>>2]|0)|0;l6(a);return}function kT(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0.0,j=0,k=0,m=0,n=0.0,o=0,p=0,q=0,r=0.0,s=0,t=0;t=l;l=l+48|0;q=t+32|0;s=t+16|0;p=t;g=c[e+32>>2]|0;if(!g)Aa(111834,111844,382,111863);o=g+16|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];o=d+4|0;m=0;g=0;while(1){if((m|0)>=(c[o>>2]|0))break;j=c[d>>2]|0;k=j+(m*40|0)|0;do if((k|0)!=(e|0)){if(+h[j+(m*40|0)+16>>3]>0.0?+h[j+(m*40|0)+24>>3]>0.0:0)break;g=((lT(e,k)|0)!=0&1)+g|0}while(0);m=m+1|0}mT(e,q);m=c[d+24>>2]|0;m=VV(m,c[m>>2]|0,q)|0;if(!m){c[b>>2]=g;h[b+8>>3]=0.0;s=b+16|0;c[s>>2]=c[p>>2];c[s+4>>2]=c[p+4>>2];c[s+8>>2]=c[p+8>>2];c[s+12>>2]=c[p+12>>2]}else{k=m;i=0.0;while(1){if(!k)break;j=c[(c[k+4>>2]|0)+16>>2]|0;if((j|0)!=(e|0)){nT(j,s);n=+oT(q,s);if(n>0.0){g=g+1|0;i=i+ +pT(e,j,q,n,f)}d=c[j+32>>2]|0;if(((d|0)!=0?(a[d+36>>0]|0)!=0:0)?(mT(j,s),r=+oT(q,s),r>0.0):0){g=g+1|0;i=i+ +qT(e,j,q,r,f)}}k=c[k>>2]|0}QV(m);c[b>>2]=g;h[b+8>>3]=i;s=b+16|0;c[s>>2]=c[p>>2];c[s+4>>2]=c[p+4>>2];c[s+8>>2]=c[p+8>>2];c[s+12>>2]=c[p+12>>2]}l=t;return}function lT(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,g=0.0;a=c[a+32>>2]|0;if(+h[b+16>>3]==0.0?+h[b+24>>3]==0.0:0){if(!a)a=0;else{g=+h[b>>3];f=+h[a+16>>3];if((g>f?g>3]:0)?(d=+h[b+8>>3],e=+h[a+24>>3],d>e):0)a=d>3];else a=0;a=a&1}return a|0}Aa(111900,111844,219,111937);return 0}function mT(a,b){a=a|0;b=b|0;var d=0.0,e=0.0;a=c[a+32>>2]|0;e=+h[a+16>>3];c[b>>2]=~~e;d=+h[a+24>>3];c[b+4>>2]=~~d;c[b+8>>2]=~~(e+ +h[a>>3]);c[b+12>>2]=~~(d+ +h[a+8>>3]);return}function nT(a,b){a=a|0;b=b|0;var d=0.0,e=0.0;e=+h[a>>3];c[b>>2]=~~e;d=+h[a+8>>3];c[b+4>>2]=~~d;c[b+8>>2]=~~(e+ +h[a+16>>3]);c[b+12>>2]=~~(d+ +h[a+24>>3]);return}function oT(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;i=c[a+8>>2]|0;j=c[b>>2]|0;if((((i|0)>=(j|0)?(k=c[a>>2]|0,l=c[b+8>>2]|0,(k|0)<=(l|0)):0)?(e=c[a+12>>2]|0,f=c[b+4>>2]|0,(e|0)>=(f|0)):0)?(g=c[a+4>>2]|0,h=c[b+12>>2]|0,(g|0)<=(h|0)):0)d=(+(c[((i|0)<(l|0)?a:b)+8>>2]|0)-+(c[((k|0)>(j|0)?a:b)>>2]|0))*(+(c[((e|0)<(h|0)?a:b)+12>>2]|0)-+(c[((g|0)>(f|0)?a:b)+4>>2]|0));else d=0.0;return +d}function pT(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=+e;f=f|0;var g=0.0,h=0.0,i=0,j=0;j=l;l=l+16|0;i=j;a=rT(a,b)|0;f=f+(((a|0)<0?5:a)<<2)|0;a=c[f>>2]|0;if(!a){c[f>>2]=b;g=e}else{nT(a,i);g=+oT(d,i);g=g>e?g:0.0;a=c[f>>2]|0;if((c[a+32>>2]|0)!=0?(mT(a,i),h=+oT(d,i),h>e):0)g=h>g?h:g;if(!(g>0.0)){c[f>>2]=b;g=e}}l=j;return +g}function qT(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=+e;f=f|0;var g=0.0,h=0.0,i=0,j=0;j=l;l=l+16|0;i=j;a=rT(a,b)|0;f=f+(((a|0)<0?5:a)<<2)|0;a=c[f>>2]|0;if(!a){c[f>>2]=b;g=e}else{nT(a,i);g=+oT(d,i);g=g>e?g:0.0;a=c[f>>2]|0;if((c[a+32>>2]|0)!=0?(mT(a,i),h=+oT(d,i),h>e):0)g=h>g?h:g;if(!(g>0.0)){c[f>>2]=b;g=e}}l=j;return +g}function rT(b,d){b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0.0,k=0.0;e=c[b+32>>2]|0;f=c[d+32>>2]|0;if((e|0)==(f|0))Aa(111879,111844,276,111889);do if((a[e+36>>0]|0)!=0?(a[f+36>>0]|0)!=0:0){k=+h[b>>3];e=b+8|0;if(k==0.0?+h[e>>3]==0.0:0){e=-1;break}i=+h[d>>3];j=+h[d+8>>3];if(!(i==0.0&j==0.0)){g=+h[e>>3];f=ik;if(jg))return (f|e^1?(f?3:-1):5)|0;if(f)e=6;else e=e?8:7}else e=-1}else e=-1;while(0);return e|0}function sT(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;k=l;l=l+32|0;d=k+24|0;e=k+16|0;f=k;g=dT(a)|0;h=a+4|0;i=e+4|0;j=a+20|0;b=0;while(1){if((b|0)>=(c[h>>2]|0)){b=0;break}m=HK(32)|0;o=(c[a>>2]|0)+(b*40|0)|0;n=m+12|0;c[m+28>>2]=o;vT(f,o);c[n>>2]=c[f>>2];c[n+4>>2]=c[f+4>>2];c[n+8>>2]=c[f+8>>2];c[n+12>>2]=c[f+12>>2];n=c[n>>2]|0;c[e>>2]=(((c[m+20>>2]|0)-n|0)/2|0)+n;n=c[m+16>>2]|0;c[i>>2]=(((c[m+24>>2]|0)-n|0)/2|0)+n;c[d>>2]=c[e>>2];c[d+4>>2]=c[e+4>>2];c[m+8>>2]=wT(d,g)|0;n=c[j>>2]|0;if(!(eb[c[n>>2]&63](n,m,1)|0)){b=-1;break}else b=b+1|0}l=k;return b|0}function tT(a){a=a|0;var b=0,d=0,e=0;d=a+20|0;e=c[d>>2]|0;b=a+24|0;a=eb[c[e>>2]&63](e,0,128)|0;while(1){if(!a)break;e=c[b>>2]|0;WV(e,a+12|0,c[a+28>>2]|0,e,0)|0;e=c[d>>2]|0;a=eb[c[e>>2]&63](e,a,8)|0}return}function uT(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;e=a+20|0;f=Uz(c[e>>2]|0)|0;d=0;while(1){if(!(Uz(c[e>>2]|0)|0))break;g=c[e>>2]|0;a=c[(c[g+8>>2]|0)+4>>2]|0;if(!a){h=8;break}b=c[(c[g+4>>2]|0)+8>>2]|0;if((b|0)<0)a=c[a+8>>2]|0;else a=a+(0-b)|0;if(!a){h=8;break}eb[c[g>>2]&63](g,a,4096)|0;l6(a);d=d+1|0}if((h|0)==8)Aa(111950,111844,616,111953);if((f|0)==(d|0))return;else Aa(111965,111844,623,111953)}function vT(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,g=0.0,i=0,j=0,k=0,l=0.0;d=c[b+32>>2]|0;if(!d){e=0.0;f=0.0}else{e=+h[d>>3];f=+h[d+8>>3]}l=+h[b>>3];k=~~+E(+(l-e));g=+h[b+8>>3];j=~~+E(+(g-f));i=~~+R(+(e+(l+ +h[b+16>>3])));if((i|0)==2147483647)Aa(111977,111844,264,112004);d=~~+R(+(f+(g+ +h[b+24>>3])));if((d|0)==2147483647)Aa(112014,111844,266,112004);else{c[a>>2]=k;c[a+4>>2]=j;c[a+8>>2]=i;c[a+12>>2]=d;return}}function wT(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;f=0;e=c[a>>2]|0;d=c[a+4>>2]|0;while(1){a=b+-1|0;if((b|0)<=0)break;i=e>>>a&1;b=d>>>a&1;g=b+-1|0;h=g&(e^d);g=g&0-i;f=i<<1|f<<2|i^b;b=a;e=h^e^g;d=h^d^g}return f|0}function xT(b){b=b|0;var d=0,e=0,f=0,g=0;d=D3(b)|0;if(d>>>0>=(c[47436]|0)>>>0){d=d+11|0;c[47436]=d;d=KK(c[47437]|0,d)|0;c[47437]=d;if(!d)d=0;else e=4}else{d=c[47437]|0;e=4}if((e|0)==4){g=d;while(1){e=a[b>>0]|0;if(!(e<<24>>24))break;f=e&255;if(S1(f)|0)e=(R1(f)|0)&255;a[g>>0]=e;g=g+1|0;b=b+1|0}a[g>>0]=0}return d|0}function yT(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,i=0.0,j=0.0,k=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0.0;N=l;l=l+144|0;s=N+96|0;q=N+80|0;v=N+124|0;t=N+72|0;w=N+64|0;x=N+56|0;K=N+48|0;L=N+40|0;M=N+32|0;G=N+24|0;H=N+16|0;I=N+8|0;J=N;k=N+120|0;n=N+116|0;o=N+112|0;p=N+108|0;c[e+32>>2]=f;while(1)if((a[b>>0]|0)==32)b=b+1|0;else break;c[p>>2]=255;g=a[b>>0]|0;y=e+12|0;z=e+8|0;A=e+4|0;B=e+24|0;C=e+16|0;D=e+1|0;E=e+2|0;F=e+3|0;a:do if(g<<24>>24==35){c[q>>2]=k;c[q+4>>2]=n;c[q+8>>2]=o;c[q+12>>2]=p;if((q4(b,112056,q)|0)<=2){g=a[b>>0]|0;r=12;break}switch(f|0){case 0:{O=+((c[k>>2]|0)>>>0)/255.0;h[K>>3]=O;i=+((c[n>>2]|0)>>>0)/255.0;h[L>>3]=i;j=+((c[o>>2]|0)>>>0)/255.0;h[M>>3]=j;m=+((c[p>>2]|0)>>>0)/255.0;zT(O,i,j,t,w,x);h[e>>3]=+h[t>>3];h[z>>3]=+h[w>>3];h[C>>3]=+h[x>>3];h[B>>3]=m;b=0;break a}case 1:{a[e>>0]=c[k>>2];a[D>>0]=c[n>>2];a[E>>0]=c[o>>2];a[F>>0]=c[p>>2];b=0;break a}case 3:{j=+((c[k>>2]|0)>>>0)/255.0;h[K>>3]=j;m=+((c[n>>2]|0)>>>0)/255.0;h[L>>3]=m;O=+((c[o>>2]|0)>>>0)/255.0;h[M>>3]=O;AT(j,m,O,G,H,I,J);a[e>>0]=~~+h[G>>3]*255;a[D>>0]=~~+h[H>>3]*255;a[E>>0]=~~+h[I>>3]*255;a[F>>0]=~~+h[J>>3]*255;b=0;break a}case 2:{c[e>>2]=(((c[k>>2]|0)*65535|0)>>>0)/255|0;c[A>>2]=(((c[n>>2]|0)*65535|0)>>>0)/255|0;c[z>>2]=(((c[o>>2]|0)*65535|0)>>>0)/255|0;c[y>>2]=(((c[p>>2]|0)*65535|0)>>>0)/255|0;b=0;break a}case 4:{h[e>>3]=+((c[k>>2]|0)>>>0)/255.0;h[z>>3]=+((c[n>>2]|0)>>>0)/255.0;h[C>>3]=+((c[o>>2]|0)>>>0)/255.0;h[B>>3]=+((c[p>>2]|0)>>>0)/255.0;b=0;break a}default:{b=0;break a}}}else r=12;while(0);b:do if((r|0)==12){if(!(g<<24>>24!=46?((g&255)+-48|0)>>>0>=10:0)){g=D3(b)|0;if(g>>>0>=(c[47438]|0)>>>0){g=g+11|0;c[47438]=g;g=KK(c[47439]|0,g)|0;c[47439]=g;if(!g){b=-1;break}}else g=c[47439]|0;n=g;k=b;c:while(1){o=k+1|0;k=a[k>>0]|0;switch(k<<24>>24){case 0:break c;case 44:{k=32;break}default:{}}a[n>>0]=k;n=n+1|0;k=o}a[n>>0]=0;c[s>>2]=t;c[s+4>>2]=w;c[s+8>>2]=x;if((q4(g,112070,s)|0)==3){m=+h[t>>3];m=m<1.0?m:1.0;m=m>0.0?m:0.0;h[t>>3]=m;j=+h[w>>3];j=j<1.0?j:1.0;j=j>0.0?j:0.0;h[w>>3]=j;i=+h[x>>3];i=i<1.0?i:1.0;i=i>0.0?i:0.0;h[x>>3]=i;switch(f|0){case 0:{h[e>>3]=m;h[z>>3]=j;h[C>>3]=i;h[B>>3]=1.0;b=0;break b}case 1:{BT(m,j,i,K,L,M);a[e>>0]=~~(+h[K>>3]*255.0);a[D>>0]=~~(+h[L>>3]*255.0);a[E>>0]=~~(+h[M>>3]*255.0);a[F>>0]=-1;b=0;break b}case 3:{BT(m,j,i,K,L,M);AT(+h[K>>3],+h[L>>3],+h[M>>3],G,H,I,J);a[e>>0]=~~+h[G>>3]*255;a[D>>0]=~~+h[H>>3]*255;a[E>>0]=~~+h[I>>3]*255;a[F>>0]=~~+h[J>>3]*255;b=0;break b}case 2:{BT(m,j,i,K,L,M);c[e>>2]=~~(+h[K>>3]*65535.0);c[A>>2]=~~(+h[L>>3]*65535.0);c[z>>2]=~~(+h[M>>3]*65535.0);c[y>>2]=65535;b=0;break b}case 4:{BT(m,j,i,K,L,M);h[e>>3]=+h[K>>3];h[z>>3]=+h[L>>3];h[C>>3]=+h[M>>3];h[B>>3]=1.0;b=0;break b}default:{b=0;break b}}}}b=CT(b)|0;c[v>>2]=b;if(!b)b=-1;else{g=c[47440]|0;if(((g|0)!=0?(u=c[g>>2]|0,(a[u>>0]|0)==(a[b>>0]|0)):0)?(f2(u,b)|0)==0:0)k=g;else{b=e6(v,26e3,2491,12,103)|0;c[47440]=b;if(!b)switch(f|0){case 0:{c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;h[B>>3]=1.0;b=1;break b}case 1:{a[E>>0]=0;a[D>>0]=0;a[e>>0]=0;a[F>>0]=-1;b=1;break b}case 3:{c[e>>2]=0;b=1;break b}case 2:{c[z>>2]=0;c[A>>2]=0;c[e>>2]=0;c[y>>2]=65535;b=1;break b}case 4:{c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[e+20>>2]=0;h[B>>3]=1.0;b=1;break b}default:{b=1;break b}}else{k=b;g=b}}b=k+7|0;switch(f|0){case 0:{h[e>>3]=+(d[k+4>>0]|0)/255.0;h[z>>3]=+(d[k+5>>0]|0)/255.0;h[C>>3]=+(d[k+6>>0]|0)/255.0;h[B>>3]=+(d[k+10>>0]|0)/255.0;b=0;break b}case 1:{a[e>>0]=a[b>>0]|0;a[D>>0]=a[g+8>>0]|0;a[E>>0]=a[g+9>>0]|0;a[F>>0]=a[g+10>>0]|0;b=0;break b}case 3:{j=+(d[b>>0]|0)/255.0;h[K>>3]=j;m=+(d[g+8>>0]|0)/255.0;h[L>>3]=m;O=+(d[g+9>>0]|0)/255.0;h[M>>3]=O;AT(j,m,O,G,H,I,J);a[e>>0]=~~+h[G>>3]*255;a[D>>0]=~~+h[H>>3]*255;a[E>>0]=~~+h[I>>3]*255;a[F>>0]=~~+h[J>>3]*255;b=0;break b}case 2:{c[e>>2]=(d[b>>0]|0)*257;c[A>>2]=(d[g+8>>0]|0)*257;c[z>>2]=(d[g+9>>0]|0)*257;c[y>>2]=(d[g+10>>0]|0)*257;b=0;break b}case 4:{h[e>>3]=+(d[b>>0]|0)/255.0;h[z>>3]=+(d[g+8>>0]|0)/255.0;h[C>>3]=+(d[g+9>>0]|0)/255.0;h[B>>3]=+(d[g+10>>0]|0)/255.0;b=0;break b}default:{b=0;break b}}}}while(0);l=N;return b|0}function zT(a,b,c,d,e,f){a=+a;b=+b;c=+c;d=d|0;e=e|0;f=f|0;var g=0.0,i=0.0,j=0.0,k=0.0,l=0.0;g=bc?b:c;l=la?a:g);k=l>0.0?g/l:0.0;if(k>0.0){i=(l-a)/g;j=(l-b)/g;g=(l-c)/g;do if(!(l==a)){if(l==b){g=i+2.0-g;break}if(l==c)g=j+4.0-i;else g=0.0}else g=g-j;while(0);g=g*60.0;if(g<0.0)g=g+360.0}else g=0.0;h[d>>3]=g/360.0;h[f>>3]=l;h[e>>3]=k;return}function AT(a,b,c,d,e,f,g){a=+a;b=+b;c=+c;d=d|0;e=e|0;f=f|0;g=g|0;h[d>>3]=1.0-a;h[e>>3]=1.0-b;h[f>>3]=1.0-c;b=+h[d>>3];c=+h[e>>3];c=b>3]=c;b=+h[f>>3];c=b>3]=c;h[d>>3]=+h[d>>3]-c;h[e>>3]=+h[e>>3]-+h[g>>3];h[f>>3]=+h[f>>3]-+h[g>>3];return}function BT(a,b,c,d,e,f){a=+a;b=+b;c=+c;d=d|0;e=e|0;f=f|0;var g=0.0,i=0.0,j=0.0,k=0,l=0;a:do if(!(b<=0.0)){i=!(a>=1.0)?a*6.0:0.0;l=~~i;i=i-+(l|0);a=(1.0-b)*c;j=(1.0-i*b)*c;b=(1.0-(1.0-i)*b)*c;switch(l|0){case 0:{g=a;i=b;a=c;k=8;break a}case 1:{g=a;i=c;a=j;k=8;break a}case 2:{g=b;i=c;k=8;break a}case 3:{g=c;i=j;k=8;break a}case 4:{g=c;i=a;a=b;k=8;break a}case 5:{g=j;i=a;a=c;k=8;break a}default:break a}}else{g=c;i=c;a=c;k=8}while(0);if((k|0)==8){h[d>>3]=a;h[e>>3]=i;h[f>>3]=g}return}function CT(b){b=b|0;var d=0,e=0;d=a[b>>0]|0;if(((d<<24>>24!=98?(e=b+1|0,!(d<<24>>24==119|(h2(e,137567,4)|0)==0)):0)?!(d<<24>>24==108|(h2(e,137572,4)|0)==0):0)?(h2(e,137577,8)|0)!=0:0){do if(d<<24>>24==47){d=F3(e,47)|0;if(d){if((a[e>>0]|0)!=47){e=(N3(137586,e,4)|0)==0;b=e?d+1|0:b;break}d=c[47441]|0;b=b+2|0;if(((d|0)!=0?(a[d>>0]|0)!=0:0)?(N3(137586,d,3)|0)!=0:0)b=ET(d,b)|0}else b=e}else{d=c[47441]|0;if(((d|0)!=0?(a[d>>0]|0)!=0:0)?(N3(137586,d,3)|0)!=0:0)b=ET(d,b)|0}while(0);b=xT(b)|0}return b|0}function DT(a,b){a=a|0;b=b|0;return C3(c[a>>2]|0,c[b>>2]|0)|0}function ET(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+16|0;e=f;g=D3(a)|0;g=(D3(b)|0)+g|0;d=g+13|0;if((g+3|0)>>>0<(c[47442]|0)>>>0)d=c[47443]|0;else{c[47442]=d;d=KK(c[47443]|0,d)|0;c[47443]=d}c[e>>2]=a;c[e+4>>2]=b;i2(d,137591,e)|0;l=f;return c[47443]|0}function FT(a){a=a|0;c[47441]=a;return}function GT(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;var f=0,g=0;f=l;l=l+208|0;g=f;HT(g,+h[a>>3],+h[a+8>>3],b,c,d,e);a=IT(g)|0;l=f;return a|0}function HT(a,b,c,d,e,f,g){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;g=+g;var i=0,j=0;h[a>>3]=b;h[a+8>>3]=c;j=a+16|0;h[j>>3]=d;i=a+24|0;h[i>>3]=e;h[a+32>>3]=0.0;c=+O(+(+J(+f)/e),+(+I(+f)/d));h[a+56>>3]=c;e=+O(+(+J(+g)/e),+(+I(+g)/d));h[a+40>>3]=1.0;h[a+48>>3]=0.0;e=e-+E(+((e-c)/6.283185307179586))*6.283185307179586;h[a+64>>3]=g-f>3.141592653589793&e-c<3.141592653589793?e+6.283185307179586:e;OT(a);PT(a);QT(a);g=+h[j>>3];g=(g-+h[i>>3])/g;h[a+168>>3]=g;h[a+176>>3]=g*(2.0-g);g=1.0-g;h[a+184>>3]=g;h[a+192>>3]=g*g;return}function IT(a){a=a|0;var b=0,c=0.0,d=0,e=0.0,f=0.0,g=0.0,i=0.0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0;q=HK(8)|0;f=+h[a+56>>3];e=+h[a+64>>3]-f;p=1;b=0;while(1){o=e/+(p|0);if(!(b<<24>>24==0&(p|0)<1024))break;a:do if(!(o<=1.5707963267948966))b=0;else{c=f;d=0;b=1;while(1){if(!(b<<24>>24!=0&(d|0)<(p|0)))break a;n=o+c;b=+JT(a,c,n)<=1.0e-05&1;c=n;d=d+1|0}}while(0);p=p<<1}c=+I(+f);u=+J(+f);d=a+16|0;s=+h[d>>3];g=c*s;j=a+24|0;r=+h[j>>3];v=u*r;r=c*r;c=+h[a>>3];k=a+40|0;t=+h[k>>3];l=a+48|0;i=+h[l>>3];e=c+g*t-v*i;m=a+8|0;n=+h[m>>3];g=v*t+(n+g*i);s=-(u*s);KT(q,c,n);LT(q,e,g);n=+K(+(o*.5));n=+J(+o)*(+G(+(n*(n*3.0)+4.0))+-1.0)/3.0;c=f;f=g;g=r*t+i*s;i=t*s-r*i;b=0;while(1){if((b|0)>=(p|0))break;r=o+c;x=+I(+r);v=+J(+r);u=+h[d>>3];t=x*u;y=+h[j>>3];z=v*y;y=x*y;x=+h[k>>3];w=+h[l>>3];s=+h[a>>3]+t*x-z*w;t=z*x+(+h[m>>3]+t*w);u=-(v*u);v=x*u-y*w;u=y*x+w*u;MT(q,n*i+e,f+n*g,s-n*v,t-n*u,s,t);c=r;e=s;f=t;g=u;i=v;b=b+1|0}NT(q);return q|0}function JT(a,b,c){a=a|0;b=+b;c=+c;var d=0.0,e=0.0,f=0.0,g=0.0,i=0.0;e=(b+c)*.5;i=+h[a+16>>3];d=+h[a+24>>3]/i;g=+I(+(e*2.0));f=+I(+(e*4.0));e=+I(+(e*6.0));a=d<.25?10440:10696;return +(i*((d*(d*.001+4.98)+.207)/(d+.0067))*+P(+((+h[a+16>>3]+d*(d*+h[a>>3]+ +h[a+8>>3]))/(d+ +h[a+24>>3])+g*((+h[a+48>>3]+d*(d*+h[a+32>>3]+ +h[a+40>>3]))/(d+ +h[a+56>>3]))+f*((+h[a+80>>3]+d*(d*+h[a+64>>3]+ +h[a+72>>3]))/(d+ +h[a+88>>3]))+e*((+h[a+112>>3]+d*(d*+h[a+96>>3]+ +h[a+104>>3]))/(d+ +h[a+120>>3]))+(c-b)*((+h[a+144>>3]+d*(d*+h[a+128>>3]+ +h[a+136>>3]))/(d+ +h[a+152>>3])+g*((+h[a+176>>3]+d*(d*+h[a+160>>3]+ +h[a+168>>3]))/(d+ +h[a+184>>3]))+f*((+h[a+208>>3]+d*(d*+h[a+192>>3]+ +h[a+200>>3]))/(d+ +h[a+216>>3]))+e*((+h[a+240>>3]+d*(d*+h[a+224>>3]+ +h[a+232>>3]))/(d+ +h[a+248>>3]))))))}function KT(a,b,d){a=a|0;b=+b;d=+d;var e=0;c[47444]=100;e=HK(1600)|0;c[a>>2]=e;h[e>>3]=b;h[e+8>>3]=d;c[a+4>>2]=1;return}function LT(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0;f=c[a>>2]|0;e=(c[a+4>>2]|0)+-1|0;MT(a,+h[f+(e<<4)>>3],+h[f+(e<<4)+8>>3],b,d,b,d);return}function MT(a,b,d,e,f,g,i){a=a|0;b=+b;d=+d;e=+e;f=+f;g=+g;i=+i;var j=0,k=0,l=0,m=0;l=a+4|0;j=c[l>>2]|0;k=c[47444]|0;if((j+3|0)<(k|0))a=c[a>>2]|0;else{c[47444]=k<<1;j=n6(c[a>>2]|0,k<<5)|0;c[a>>2]=j;a=j;j=c[l>>2]|0}h[a+(j<<4)>>3]=b;m=j+1|0;h[a+(j<<4)+8>>3]=d;h[a+(m<<4)>>3]=e;k=j+2|0;h[a+(m<<4)+8>>3]=f;h[a+(k<<4)>>3]=g;c[l>>2]=j+3;h[a+(k<<4)+8>>3]=i;return}function NT(a){a=a|0;var b=0;b=c[a>>2]|0;LT(a,+h[b>>3],+h[b+8>>3]);c[a>>2]=n6(c[a>>2]|0,c[a+4>>2]<<4)|0;c[47444]=0;return}function OT(a){a=a|0;var b=0.0,c=0.0,d=0.0,e=0.0;e=+h[a+16>>3];c=+h[a+24>>3];c=+G(+(e*e-c*c));e=c*+h[a+40>>3];c=c*+h[a+48>>3];d=+h[a>>3];h[a+104>>3]=d-e;b=+h[a+8>>3];h[a+112>>3]=b-c;h[a+120>>3]=e+d;h[a+128>>3]=c+b;return}function PT(a){a=a|0;var b=0.0,c=0.0,d=0.0,e=0.0,f=0.0,g=0.0,i=0.0,j=0.0;d=+h[a+16>>3];j=+h[a+56>>3];i=d*+I(+j);g=+h[a+24>>3];j=g*+J(+j);f=+h[a+64>>3];d=d*+I(+f);f=g*+J(+f);g=+h[a>>3];e=+h[a+40>>3];c=+h[a+48>>3];h[a+72>>3]=g+i*e-j*c;b=+h[a+8>>3];h[a+80>>3]=j*e+(i*c+b);h[a+88>>3]=g+d*e-f*c;h[a+96>>3]=f*e+(d*c+b);return}function QT(a){a=a|0;var b=0.0,c=0.0,d=0.0,e=0.0,f=0,g=0,i=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;p=+h[a+24>>3];q=+h[a+16>>3];c=p/q;r=+h[a+48>>3];k=+F(+r)<.1;o=+h[a+40>>3];do if(k){n=r/o;d=+N(+(c*n));b=-d;c=1.5707963267948966-+N(+(n/c));if(o<0.0){e=b;b=3.141592653589793-d;d=c+3.141592653589793;break}else{e=-3.141592653589793-d;d=c;c=c+-3.141592653589793;break}}else{n=o/r;b=+N(+(n/c))+1.5707963267948966;c=+N(+(c*n));if(r<0.0){e=b+-3.141592653589793;d=c+3.141592653589793;break}else{e=b;b=b+3.141592653589793;d=c;c=c+-3.141592653589793;break}}while(0);m=+h[a+56>>3];e=e-+E(+((e-m)/6.283185307179586))*6.283185307179586;l=c-+E(+((c-m)/6.283185307179586))*6.283185307179586;b=b-+E(+((b-m)/6.283185307179586))*6.283185307179586;m=d-+E(+((d-m)/6.283185307179586))*6.283185307179586;n=+h[a+64>>3];f=a+88|0;g=a+72|0;if(!(e<=n)){e=+h[g>>3];c=+h[f>>3];c=e>3]+q*+I(+e)*o-r*(p*+J(+e));h[a+136>>3]=c;i=a+96|0;j=a+80|0;k=a+8|0;if(!(l<=n)){l=+h[j>>3];d=+h[i>>3];d=l>3]+r*(q*+I(+l))+p*+J(+l)*o;h[a+144>>3]=d;if(!(b<=n)){l=+h[g>>3];b=+h[f>>3];b=l>b?l:b}else b=+h[a>>3]+q*+I(+b)*o-r*(p*+J(+b));h[a+152>>3]=b-c;if(!(m<=n)){r=+h[j>>3];b=+h[i>>3];b=r>b?r:b}else b=+h[k>>3]+r*(q*+I(+m))+p*+J(+m)*o;h[a+160>>3]=b-d;return}function RT(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0,j=0,k=0.0,m=0,n=0;n=l;l=l+80|0;m=n;ST(b);k=+h[e+56>>3];g=+h[e+64>>3];f=e+48|0;switch(a[e+80>>0]|0){case 116:{g=g+(+h[f>>3]-+TT(d))*.5;i=4;break}case 98:{g=g-(+h[f>>3]-+TT(d))*.5;i=4;break}default:{}}if((i|0)==4)g=g+-1.0;h[m>>3]=k;h[m+8>>3]=g;c[m+20>>2]=c[e+8>>2];c[m+16>>2]=c[e+4>>2];h[m+32>>3]=+h[e+16>>3];j=b+16|0;e=NA(c[(c[j>>2]|0)+8>>2]|0,137598)|0;f=m+56|0;c[f>>2]=e;i=m+60|0;c[i>>2]=c[(c[j>>2]|0)+212>>2];j=m+64|0;a[j>>0]=0;if(!((e|0)!=0?(a[e>>0]|0)!=0:0))c[f>>2]=137609;if((a[d+4>>0]|0)==1){f=c[d>>2]|0;jS(b,c[(c[b>>2]|0)+336>>2]|0);e=c[f+24>>2]|0;if(!e)fS(b,137615);else fS(b,e);VT(b,f,m);if(a[j>>0]|0)l6(c[i>>2]|0)}else UT(b,c[d>>2]|0,m);WT(b);l=n;return}function ST(a){a=a|0;var d=0,e=0;a=_H(a)|0;d=c[a>>2]|0;e=c[d+4>>2]|0;c[a+4>>2]=e;c[a+12>>2]=c[d+12>>2];if(e>>>0<4)c[a+8>>2]=c[d+8>>2];c[a+208>>2]=c[d+208>>2];c[a+228>>2]=c[d+228>>2];c[a+244>>2]=c[d+244>>2];e=a+260|0;b[e>>1]=b[e>>1]&-2|b[d+260>>1]&1;return}function TT(b){b=b|0;var d=0.0,e=0,f=0;switch(a[b+4>>0]|0){case 1:{e=c[b>>2]|0;b=e+72|0;e=e+56|0;f=5;break}case 3:{e=c[b>>2]|0;b=e+24|0;e=e+8|0;f=5;break}case 2:{e=c[b>>2]|0;b=e+32|0;e=e+16|0;f=5;break}default:d=0.0}if((f|0)==5)d=+h[b>>3]-+h[e>>3];return +d}function UT(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0;n=l;l=l+96|0;j=n+64|0;i=n+32|0;g=n+16|0;k=n;m=b[e+4>>1]|0;if(m<<16>>16>=1){r=e+8|0;p=+h[e+24>>3];o=+h[r>>3];h[k>>3]=+h[f>>3]+(p+o)*.5;h[k+8>>3]=+h[f+8>>3]+(+h[e+32>>3]+ +h[e+16>>3])*.5;q=c[e>>2]|0;s=f+16|0;f=a[e+6>>0]|0;c[g>>2]=c[k>>2];c[g+4>>2]=c[k+4>>2];c[g+8>>2]=c[k+8>>2];c[g+12>>2]=c[k+12>>2];c[i>>2]=c[s>>2];c[i+4>>2]=c[s+4>>2];c[i+8>>2]=c[s+8>>2];c[i+12>>2]=c[s+12>>2];c[i+16>>2]=c[s+16>>2];c[i+20>>2]=c[s+20>>2];c[i+24>>2]=c[s+24>>2];c[i+28>>2]=c[s+28>>2];c[j>>2]=c[r>>2];c[j+4>>2]=c[r+4>>2];c[j+8>>2]=c[r+8>>2];c[j+12>>2]=c[r+12>>2];c[j+16>>2]=c[r+16>>2];c[j+20>>2]=c[r+20>>2];c[j+24>>2]=c[r+24>>2];c[j+28>>2]=c[r+28>>2];gU(d,m<<16>>16,q,g,(p-o)*.5,i,j,f)}l=n;return}function VT(f,g,i){f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;B=l;l=l+176|0;w=B+96|0;y=B+64|0;z=B+136|0;q=B;r=B+128|0;s=g+48|0;c[y>>2]=c[s>>2];c[y+4>>2]=c[s+4>>2];c[y+8>>2]=c[s+8>>2];c[y+12>>2]=c[s+12>>2];c[y+16>>2]=c[s+16>>2];c[y+20>>2]=c[s+20>>2];c[y+24>>2]=c[s+24>>2];c[y+28>>2]=c[s+28>>2];m=+h[i>>3];n=+h[i+8>>3];s=g+84|0;j=c[s>>2]|0;if(!(c[g>>2]|0))A=(c[g+8>>2]|0)!=0;else A=1;x=g+108|0;k=c[x>>2]|0;if(k|0)XT(i,k,186712);h[y>>3]=m+ +h[y>>3];u=y+16|0;h[u>>3]=m+ +h[u>>3];u=y+8|0;h[u>>3]=n+ +h[u>>3];u=y+24|0;h[u>>3]=n+ +h[u>>3];u=f+152|0;if(A?(c[u>>2]&4|0)==0:0){c[w>>2]=c[y>>2];c[w+4>>2]=c[y+4>>2];c[w+8>>2]=c[y+8>>2];c[w+12>>2]=c[y+12>>2];c[w+16>>2]=c[y+16>>2];c[w+20>>2]=c[y+20>>2];c[w+24>>2]=c[y+24>>2];c[w+28>>2]=c[y+28>>2];t=YT(f,i,g,w,z)|0}else t=0;p=g+42|0;k=e[p>>1]|0;if(!(k&32)){o=c[g+20>>2]|0;v=g+33|0;if(o){k=ZT(f,o,c[g+28>>2]|0,k,r)|0;if(!(b[p>>1]&4)){c[w>>2]=c[y>>2];c[w+4>>2]=c[y+4>>2];c[w+8>>2]=c[y+8>>2];c[w+12>>2]=c[y+12>>2];c[w+16>>2]=c[y+16>>2];c[w+20>>2]=c[y+20>>2];c[w+24>>2]=c[y+24>>2];c[w+28>>2]=c[y+28>>2];mS(f,w,k)}else{p=d[v>>0]|0;c[w>>2]=c[y>>2];c[w+4>>2]=c[y+4>>2];c[w+8>>2]=c[y+8>>2];c[w+12>>2]=c[y+12>>2];c[w+16>>2]=c[y+16>>2];c[w+20>>2]=c[y+20>>2];c[w+24>>2]=c[y+24>>2];c[w+28>>2]=c[y+28>>2];RM(f,_T(q,w,p)|0,4,4,k)}l6(c[r>>2]|0)}while(1){k=c[j>>2]|0;if(!k)break;$T(f,k,i);j=j+4|0}j=c[s>>2]|0;sS(f,1.0);k=g+24|0;while(1){o=j+4|0;j=c[j>>2]|0;if(!j)break;if(!(a[j+100>>0]|0)){j=o;continue}aU(f,j,i,c[k>>2]|0,c[o>>2]|0);j=o}if(a[v>>0]|0){c[w>>2]=c[y>>2];c[w+4>>2]=c[y+4>>2];c[w+8>>2]=c[y+8>>2];c[w+12>>2]=c[y+12>>2];c[w+16>>2]=c[y+16>>2];c[w+20>>2]=c[y+20>>2];c[w+24>>2]=c[y+24>>2];c[w+28>>2]=c[y+28>>2];bU(f,g,w)}}if(t|0)cU(f,z);if((A?c[u>>2]&4|0:0)?(c[w>>2]=c[y>>2],c[w+4>>2]=c[y+4>>2],c[w+8>>2]=c[y+8>>2],c[w+12>>2]=c[y+12>>2],c[w+16>>2]=c[y+16>>2],c[w+20>>2]=c[y+20>>2],c[w+24>>2]=c[y+24>>2],c[w+28>>2]=c[y+28>>2],YT(f,i,g,w,z)|0):0)cU(f,z);if(c[x>>2]|0)dU(i,186712);l=B;return}function WT(a){a=a|0;var b=0;b=c[a+16>>2]|0;c[b+208>>2]=0;c[b+228>>2]=0;c[b+244>>2]=0;c[b+212>>2]=0;$H(a);return}function XT(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,i=0;i=a+16|0;f=c[i>>2]|0;if(f|0){if(!(c[b>>2]|0)){f=0;g=d}else{c[d>>2]=f;f=c[b>>2]|0;g=i}c[g>>2]=f}f=c[a+20>>2]|0;if(f|0){g=b+4|0;if(!(c[g>>2]|0)){f=0;g=d}else{c[d+4>>2]=f;f=c[g>>2]|0;g=i}c[g+4>>2]=f}e=+h[a+32>>3];if(e>=0.0){f=b+16|0;if(!(+h[f>>3]>=0.0))e=-1.0;else{h[d+16>>3]=e;e=+h[f>>3];d=i}h[d+16>>3]=e}return}function YT(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=l;l=l+224|0;n=u+8|0;k=u;t=u+40|0;j=u+184|0;i=u+56|0;m=c[d+16>>2]|0;o=m+208|0;c[h>>2]=c[o>>2];p=m+228|0;c[h+4>>2]=c[p>>2];q=m+244|0;c[h+8>>2]=c[q>>2];r=m+212|0;c[h+12>>2]=c[r>>2];s=m+260|0;a[h+16>>0]=(b[s>>1]<<15&65535)<<16>>16>>15;h=c[f+16>>2]|0;m=m+8|0;if((h|0)!=0?(a[h>>0]|0)!=0:0)i=0;else{hA(t,128,i);i=e+60|0;h=c[i>>2]|0;if(!h){h=Y3(bI(d,c[m>>2]|0,t)|0)|0;c[i>>2]=h;a[e+64>>0]=1}kA(t,h)|0;i=c[47445]|0;c[47445]=i+1;c[k>>2]=i;i2(j,137692,k)|0;kA(t,j)|0;i=t+4|0;h=c[i>>2]|0;if(h>>>0>=(c[t+8>>2]|0)>>>0){iA(t,1)|0;h=c[i>>2]|0}a[h>>0]=0;h=c[t>>2]|0;c[i>>2]=h;i=1}h=aI(d,0,c[f>>2]|0,c[f+12>>2]|0,c[f+8>>2]|0,h,c[m>>2]|0)|0;if(i)lA(t);do if(h|0){if((c[o>>2]|0)==0?(b[s>>1]&1)==0:0)break;c[n>>2]=c[g>>2];c[n+4>>2]=c[g+4>>2];c[n+8>>2]=c[g+8>>2];c[n+12>>2]=c[g+12>>2];c[n+16>>2]=c[g+16>>2];c[n+20>>2]=c[g+20>>2];c[n+24>>2]=c[g+24>>2];c[n+28>>2]=c[g+28>>2];iI(d,n);aS(d,c[o>>2]|0,c[p>>2]|0,c[q>>2]|0,c[r>>2]|0)}while(0);l=u;return h|0}function ZT(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0,j=0;j=l;l=l+16|0;i=j;if(!((HJ(b,f,i)|0)<<24>>24)){hS(a,b);b=1}else{hS(a,c[f>>2]|0);b=c[f+4>>2]|0;h=+g[i>>2];if(!b)iS(a,137615,d,h);else iS(a,b,d,h);b=e>>>1&1|2}fS(a,137680);l=j;return b|0}function _T(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,g=0.0,i=0,j=0.0,k=0;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];i=a+32|0;k=b+16|0;c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];k=a+40|0;b=a+8|0;if((d|0)>1){e=+(d|0)*.5;g=e+ +h[a>>3];h[a>>3]=g;f=e+ +h[b>>3];h[b>>3]=f;j=+h[i>>3]-e;h[i>>3]=j;e=+h[k>>3]-e;h[k>>3]=e}else{j=+h[i>>3];f=+h[b>>3];g=+h[a>>3];e=+h[k>>3]}h[a+16>>3]=j;h[a+24>>3]=f;h[a+48>>3]=g;h[a+56>>3]=e;return a|0}function $T(f,g,i){f=f|0;g=g|0;i=i|0;var j=0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;y=l;l=l+176|0;u=y+96|0;v=y+136|0;w=y+64|0;s=y;t=y+128|0;x=g+48|0;c[w>>2]=c[x>>2];c[w+4>>2]=c[x+4>>2];c[w+8>>2]=c[x+8>>2];c[w+12>>2]=c[x+12>>2];c[w+16>>2]=c[x+16>>2];c[w+20>>2]=c[x+20>>2];c[w+24>>2]=c[x+24>>2];c[w+28>>2]=c[x+28>>2];k=+h[i>>3];m=+h[i+8>>3];if(!(c[g>>2]|0))x=(c[g+8>>2]|0)!=0;else x=1;h[w>>3]=k+ +h[w>>3];r=w+16|0;h[r>>3]=k+ +h[r>>3];r=w+8|0;h[r>>3]=m+ +h[r>>3];r=w+24|0;h[r>>3]=m+ +h[r>>3];r=f+152|0;if(x?(c[r>>2]&4|0)==0:0){c[u>>2]=c[w>>2];c[u+4>>2]=c[w+4>>2];c[u+8>>2]=c[w+8>>2];c[u+12>>2]=c[w+12>>2];c[u+16>>2]=c[w+16>>2];c[u+20>>2]=c[w+20>>2];c[u+24>>2]=c[w+24>>2];c[u+28>>2]=c[w+28>>2];q=YT(f,i,g,u,v)|0}else q=0;o=g+42|0;j=e[o>>1]|0;a:do if(!(j&32)){n=c[g+20>>2]|0;p=g+33|0;if(n|0){j=ZT(f,n,c[g+28>>2]|0,j,t)|0;if(!(b[o>>1]&4)){c[u>>2]=c[w>>2];c[u+4>>2]=c[w+4>>2];c[u+8>>2]=c[w+8>>2];c[u+12>>2]=c[w+12>>2];c[u+16>>2]=c[w+16>>2];c[u+20>>2]=c[w+20>>2];c[u+24>>2]=c[w+24>>2];c[u+28>>2]=c[w+28>>2];mS(f,u,j)}else{o=d[p>>0]|0;c[u>>2]=c[w>>2];c[u+4>>2]=c[w+4>>2];c[u+8>>2]=c[w+8>>2];c[u+12>>2]=c[w+12>>2];c[u+16>>2]=c[w+16>>2];c[u+20>>2]=c[w+20>>2];c[u+24>>2]=c[w+24>>2];c[u+28>>2]=c[w+28>>2];RM(f,_T(s,u,o)|0,4,4,j)}l6(c[t>>2]|0)}if(a[p>>0]|0){c[u>>2]=c[w>>2];c[u+4>>2]=c[w+4>>2];c[u+8>>2]=c[w+8>>2];c[u+12>>2]=c[w+12>>2];c[u+16>>2]=c[w+16>>2];c[u+20>>2]=c[w+20>>2];c[u+24>>2]=c[w+24>>2];c[u+28>>2]=c[w+28>>2];bU(f,g,u)}j=g+88|0;switch(a[g+92>>0]|0){case 1:{VT(f,c[j>>2]|0,i);break a}case 3:{fU(f,c[j>>2]|0,i);break a}default:{UT(f,c[j>>2]|0,i);break a}}}while(0);if(q|0)cU(f,v);if((x?c[r>>2]&4|0:0)?(c[u>>2]=c[w>>2],c[u+4>>2]=c[w+4>>2],c[u+8>>2]=c[w+8>>2],c[u+12>>2]=c[w+12>>2],c[u+16>>2]=c[w+16>>2],c[u+20>>2]=c[w+20>>2],c[u+24>>2]=c[w+24>>2],c[u+28>>2]=c[w+28>>2],YT(f,i,g,u,v)|0):0)cU(f,v);l=y;return}function aU(f,g,i,j,k){f=f|0;g=g|0;i=i|0;j=j|0;k=k|0;var m=0.0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0.0,C=0.0,D=0.0,E=0,F=0,G=0,H=0;G=l;l=l+32|0;E=G+16|0;F=G;y=+h[i>>3];s=+h[i+8>>3];p=(j|0)==0?137615:j;hS(f,p);fS(f,p);B=y+ +h[g+48>>3];C=y+ +h[g+64>>3];D=s+ +h[g+56>>3];s=s+ +h[g+72>>3];p=g+100|0;i=a[p>>0]|0;q=g+86|0;z=F+8|0;t=g+84|0;u=g+82|0;v=g+96|0;w=g+80|0;if((i&1)!=0?(o=c[v>>2]|0,((e[w>>1]|0)+(e[t>>1]|0)|0)<(c[o+104>>2]|0)):0){j=b[q>>1]|0;g=o+33|0;n=a[o+32>>0]|0;H=(n<<24>>24)/2|0;i=H<<24>>24;r=+(H<<24>>24);if(j<<16>>16)if(((e[u>>1]|0)+(j&65535)|0)==(c[o+100>>2]|0)){i=(d[g>>0]|0)+i|0;j=i;i=i&255;m=D-r}else{j=0;m=D}else{j=(d[g>>0]|0)+i|0;m=D}h[z>>3]=m-+(i|0);h[F>>3]=C+r;c[E>>2]=c[F>>2];c[E+4>>2]=c[F+4>>2];c[E+8>>2]=c[F+8>>2];c[E+12>>2]=c[F+12>>2];eU(f,E,0.0,+(n<<24>>24)+(s+ +(j&255|0)-D));i=a[p>>0]|0}if(i&2?(A=b[q>>1]|0,x=c[v>>2]|0,((e[u>>1]|0)+(A&65535)|0)<(c[x+100>>2]|0)):0){H=b[t>>1]|0;q=(k|0)!=0;o=k+86|0;g=x+33|0;i=x+32|0;p=x+64|0;n=((e[w>>1]|0)+(H&65535)|0)==(c[x+104>>2]|0);do if(!(H<<16>>16)){i=a[i>>0]|0;H=(i<<24>>24)/2|0;g=(H<<24>>24)+(d[g>>0]|0)|0;j=g&255;g=g&255;m=+(H<<24>>24);h[F>>3]=B-+(g|0)-m;if(n){j=g<<1&255;break}if(q?(b[o>>1]|0)!=A<<16>>16:0)j=~~(+(j&255)+(y+ +h[p>>3]-(C+m)))&255}else{i=a[i>>0]|0;j=(i<<24>>24)/2|0;m=+(j<<24>>24);h[F>>3]=B-m;if(n){j=(d[g>>0]|0)+(j&255)&255;break}if(q?(b[o>>1]|0)!=A<<16>>16:0)j=~~(y+ +h[p>>3]-(C+m)+0.0)&255;else j=0}while(0);h[z>>3]=D-+(((i<<24>>24)/2|0)<<24>>24);c[E>>2]=c[F>>2];c[E+4>>2]=c[F+4>>2];c[E+8>>2]=c[F+8>>2];c[E+12>>2]=c[F+12>>2];eU(f,E,+(i<<24>>24)+(C+ +(j&255)-B),0.0)}l=G;return}function bU(e,f,g){e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0;q=l;l=l+160|0;o=q+112|0;p=q;j=q+144|0;m=c[f+24>>2]|0;fS(e,(m|0)==0?137615:m);m=f+42|0;i=b[m>>1]|0;if(!(i&384))jS(e,c[(c[e>>2]|0)+336>>2]|0);else{c[j+4>>2]=0;c[j>>2]=0;i=i&65535;if(!(i&256)){if(i&128|0){i=137621;k=4}}else{i=137628;k=4}if((k|0)==4)c[j>>2]=i;jS(e,j)}i=f+33|0;sS(e,+(d[i>>0]|0));i=a[i>>0]|0;j=i&255;a:do if(!(b[m>>1]&4)){n=b[f+36>>1]&15360;if(!(n<<16>>16)){if((i&255)>1){r=+(i&255)*.5;h[g>>3]=r+ +h[g>>3];p=g+8|0;h[p>>3]=r+ +h[p>>3];p=g+16|0;h[p>>3]=+h[p>>3]-r;p=g+24|0;h[p>>3]=+h[p>>3]-r};c[o>>2]=c[g>>2];c[o+4>>2]=c[g+4>>2];c[o+8>>2]=c[g+8>>2];c[o+12>>2]=c[g+12>>2];c[o+16>>2]=c[g+16>>2];c[o+20>>2]=c[g+20>>2];c[o+24>>2]=c[g+24>>2];c[o+28>>2]=c[g+28>>2];mS(e,o,0);break}m=p+16|0;c[o>>2]=c[g>>2];c[o+4>>2]=c[g+4>>2];c[o+8>>2]=c[g+8>>2];c[o+12>>2]=c[g+12>>2];c[o+16>>2]=c[g+16>>2];c[o+20>>2]=c[g+20>>2];c[o+24>>2]=c[g+24>>2];c[o+28>>2]=c[g+28>>2];_T(m,o,j)|0;i=p+32|0;j=p+64|0;k=p+48|0;f=p+80|0;do switch(((n&65535)+-1024|0)>>>10&4194303|0){case 7:{oS(e,m,2);break a}case 3:{oS(e,i,2);break a}case 1:{oS(e,k,2);break a}case 0:{c[p>>2]=c[j>>2];c[p+4>>2]=c[j+4>>2];c[p+8>>2]=c[j+8>>2];c[p+12>>2]=c[j+12>>2];oS(e,p,2);break a}case 11:{oS(e,m,3);break a}case 5:{oS(e,i,3);break a}case 2:{c[f>>2]=c[m>>2];c[f+4>>2]=c[m+4>>2];c[f+8>>2]=c[m+8>>2];c[f+12>>2]=c[m+12>>2];oS(e,k,3);break a}case 8:{c[p>>2]=c[j>>2];c[p+4>>2]=c[j+4>>2];c[p+8>>2]=c[j+8>>2];c[p+12>>2]=c[j+12>>2];oS(e,p,3);break a}case 13:{oS(e,m,4);break a}case 6:{c[f>>2]=c[m>>2];c[f+4>>2]=c[m+4>>2];c[f+8>>2]=c[m+8>>2];c[f+12>>2]=c[m+12>>2];oS(e,i,4);break a}case 10:{c[f>>2]=c[m>>2];c[f+4>>2]=c[m+4>>2];c[f+8>>2]=c[m+8>>2];c[f+12>>2]=c[m+12>>2];p=p+96|0;c[p>>2]=c[i>>2];c[p+4>>2]=c[i+4>>2];c[p+8>>2]=c[i+8>>2];c[p+12>>2]=c[i+12>>2];oS(e,k,4);break a}case 12:{c[p>>2]=c[j>>2];c[p+4>>2]=c[j+4>>2];c[p+8>>2]=c[j+8>>2];c[p+12>>2]=c[j+12>>2];oS(e,p,4);break a}case 9:{oS(e,m,2);oS(e,k,2);break a}case 4:{c[p>>2]=c[j>>2];c[p+4>>2]=c[j+4>>2];c[p+8>>2]=c[j+8>>2];c[p+12>>2]=c[j+12>>2];oS(e,p,2);oS(e,i,2);break a}default:break a}while(0)}else{c[o>>2]=c[g>>2];c[o+4>>2]=c[g+4>>2];c[o+8>>2]=c[g+8>>2];c[o+12>>2]=c[g+12>>2];c[o+16>>2]=c[g+16>>2];c[o+20>>2]=c[g+20>>2];c[o+24>>2]=c[g+24>>2];c[o+28>>2]=c[g+28>>2];RM(e,_T(p,o,j)|0,4,4,0)}while(0);l=q;return}function cU(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=c[d+16>>2]|0;f=h+208|0;i=h+260|0;if((c[f>>2]|0)==0?(b[i>>1]&1)==0:0)d=0;else{bS(d);d=c[f>>2]|0}if((d|0)!=(c[e>>2]|0)){l6(d);c[f>>2]=c[e>>2]}d=h+228|0;f=c[d>>2]|0;g=e+4|0;if((f|0)!=(c[g>>2]|0)){l6(f);c[d>>2]=c[g>>2]}d=h+244|0;f=c[d>>2]|0;g=e+8|0;if((f|0)!=(c[g>>2]|0)){l6(f);c[d>>2]=c[g>>2]}d=h+212|0;f=c[d>>2]|0;g=e+12|0;if((f|0)!=(c[g>>2]|0)){l6(f);c[d>>2]=c[g>>2]}b[i>>1]=b[i>>1]&-2|a[e+16>>0]&1;return}function dU(a,b){a=a|0;b=b|0;var d=0.0,e=0;e=c[b>>2]|0;if(e|0)c[a+16>>2]=e;e=c[b+4>>2]|0;if(e|0)c[a+20>>2]=e;d=+h[b+16>>3];if(d>=0.0)h[a+32>>3]=d;return}function eU(a,b,d,e){a=a|0;b=b|0;d=+d;e=+e;var f=0,g=0,i=0;f=l;l=l+64|0;g=f+32|0;i=f;c[i>>2]=c[b>>2];c[i+4>>2]=c[b+4>>2];c[i+8>>2]=c[b+8>>2];c[i+12>>2]=c[b+12>>2];h[i+16>>3]=+h[b>>3]+d;h[i+24>>3]=+h[b+8>>3]+e;c[g>>2]=c[i>>2];c[g+4>>2]=c[i+4>>2];c[g+8>>2]=c[i+8>>2];c[g+12>>2]=c[i+12>>2];c[g+16>>2]=c[i+16>>2];c[g+20>>2]=c[i+20>>2];c[g+24>>2]=c[i+24>>2];c[g+28>>2]=c[i+28>>2];mS(a,g,1);l=f;return}function fU(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0;i=l;l=l+64|0;g=i;k=+h[e>>3];n=+h[d>>3]+k;m=+h[e+8>>3];j=+h[d+8>>3]+m;k=+h[d+16>>3]+k;m=+h[d+24>>3]+m;h[g>>3]=k;h[g+8>>3]=m;h[g+32>>3]=n;h[g+40>>3]=j;h[g+16>>3]=n;h[g+24>>3]=m;h[g+48>>3]=k;h[g+56>>3]=j;f=c[d+36>>2]|0;if(!f)f=c[e+56>>2]|0;e=c[d+32>>2]|0;if(!e)Aa(137635,137643,623,137655);if(!(a[e>>0]|0))Aa(137669,137643,624,137655);else{qS(b,e,g,4,1,f);l=i;return}}function gU(d,e,f,g,i,j,k,m){d=d|0;e=e|0;f=f|0;g=g|0;i=+i;j=j|0;k=k|0;m=m|0;var n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0,K=0,L=0,M=0.0,N=0.0,O=0,P=0,Q=0;Q=l;l=l+128|0;K=Q+104|0;O=Q+48|0;P=Q+16|0;L=Q;J=L;c[J>>2]=0;c[J+4>>2]=0;M=+h[g>>3];N=M-i;I=M+i;J=L+8|0;h[J>>3]=+h[g+8>>3]+(+h[k+24>>3]-+h[k+8>>3])*.5;cS(d,1);D=P+16|0;E=P+4|0;F=P+24|0;G=O+4|0;H=O+16|0;u=(m|0)==0;v=O+24|0;w=O+8|0;x=O+32|0;y=O+40|0;z=O+48|0;A=j+16|0;B=P+8|0;C=j+4|0;t=0;while(1){if((t|0)>=(e|0))break;k=f+(t*24|0)+8|0;switch(a[f+(t*24|0)+6>>0]|0){case 108:{i=N;break}case 114:{i=I-+h[k>>3];break}default:i=M-+h[k>>3]*.5}h[g>>3]=i;r=f+(t*24|0)+16|0;h[J>>3]=+h[J>>3]-+h[r>>3];s=f+(t*24|0)+4|0;p=c[f+(t*24|0)>>2]|0;q=0;while(1){if((q|0)>=(b[s>>1]|0))break;o=p+4|0;k=c[o>>2]|0;if(!k){h[D>>3]=+h[A>>3];c[P>>2]=c[j>>2];m=c[C>>2]|0;c[E>>2]=m;k=c[F>>2]&-128}else{h[D>>3]=+h[(+h[k+16>>3]>0.0?k:j)+16>>3];c[P>>2]=c[((c[k>>2]|0)==0?j:k)>>2];m=c[((c[k+4>>2]|0)==0?j:k)+4>>2]|0;c[E>>2]=m;k=c[k+24>>2]&127|c[F>>2]&-128}c[F>>2]=k;fS(d,m);c[O>>2]=c[p>>2];c[G>>2]=P;h[H>>3]=+h[p+16>>3];if(u)n=1.0;else n=+h[p+24>>3];h[v>>3]=n;c[B>>2]=c[(c[o>>2]|0)+8>>2];c[w>>2]=c[p+8>>2];o=p+32|0;h[x>>3]=+h[o>>3];h[y>>3]=+h[r>>3];a[z>>0]=108;h[L>>3]=i;c[K>>2]=c[L>>2];c[K+4>>2]=c[L+4>>2];c[K+8>>2]=c[L+8>>2];c[K+12>>2]=c[L+12>>2];eS(d,K,O);n=i+ +h[o>>3];h[g>>3]=n;p=p+56|0;q=q+1|0;i=n}t=t+1|0}dS(d);l=Q;return}function hU(a){a=a|0;l6(c[a>>2]|0);l6(c[a+4>>2]|0);l6(c[a+8>>2]|0);l6(c[a+16>>2]|0);l6(c[a+12>>2]|0);l6(c[a+20>>2]|0);l6(c[a+24>>2]|0);return}function iU(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;if(a|0){j=a+4|0;e=0;g=c[a>>2]|0;while(1){if((e|0)>=(b[j>>1]|0))break;k=g+4|0;d=0;f=c[g>>2]|0;while(1){if((d|0)>=(b[k>>1]|0))break;l6(c[f>>2]|0);h=c[f+8>>2]|0;if(h|0?(i=c[f+12>>2]|0,i|0):0)db[i&127](h);d=d+1|0;f=f+56|0}e=e+1|0;g=g+24|0}d=c[a>>2]|0;if(d|0)l6(d);l6(a)}return}function jU(a){a=a|0;l6(c[a+32>>2]|0);l6(a);return}function kU(b,d){b=b|0;d=d|0;switch(a[b+4>>0]|0){case 1:{lU(c[b>>2]|0);break}case 3:{jU(c[b>>2]|0);break}default:iU(c[b>>2]|0)}if(d|0)l6(b);return}function lU(a){a=a|0;var b=0,d=0,e=0;e=a+84|0;if((c[a+100>>2]|0)==-1)Oz(c[e>>2]|0)|0;else{b=c[e>>2]|0;l6(c[a+92>>2]|0);l6(c[a+96>>2]|0);while(1){d=c[b>>2]|0;if(!d)break;mU(d);b=b+4|0}l6(c[e>>2]|0)}hU(a);l6(a);return}function mU(a){a=a|0;kU(a+88|0,0);hU(a);l6(a);return}function nU(b,e,f){b=b|0;e=e|0;f=f|0;var g=0;b=c[(c[(c[b+16>>2]|0)+104>>2]|0)+72>>2]|0;if((a[b+4>>0]|0)!=2?(g=oU(c[b>>2]|0,e)|0,(g|0)!=0):0){c[f>>2]=d[g+35>>0];b=g+48|0}else b=0;return b|0}function oU(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[a+4>>2]|0;if(!((d|0)!=0?(C3(d,b)|0)==0:0))e=3;a:do if((e|0)==3){d=c[a+84>>2]|0;while(1){a=c[d>>2]|0;if(!a){a=0;break a}a=pU(a,b)|0;if(!a)d=d+4|0;else break}}while(0);return a|0}function pU(b,d){b=b|0;d=d|0;var e=0;e=c[b+4>>2]|0;if(!((e|0)!=0?(C3(e,d)|0)==0:0))if((a[b+92>>0]|0)==1)b=oU(c[b+88>>2]|0,d)|0;else b=0;return b|0}function qU(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return 0}function rU(d){d=d|0;var f=0,g=0.0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;p=d+92|0;c[p>>2]=HK((c[d+100>>2]<<2)+4|0)|0;n=HK((c[d+104>>2]<<2)+4|0)|0;c[d+96>>2]=n;o=d+32|0;m=c[d+84>>2]|0;while(1){l=c[m>>2]|0;if(!l)break;d=b[l+82>>1]|0;f=d&65535;g=+h[l+72>>3];if(d<<16>>16==1)j=~~g;else{j=~~((g-+(S((a[o>>0]|0)+-1|0,f+-1|0)|0))/+(d&65535));j=(j|0)>1?j:1}d=b[l+80>>1]|0;k=d&65535;g=+h[l+64>>3];if(d<<16>>16==1)i=~~g;else{i=~~((g-+(S((a[o>>0]|0)+-1|0,k+-1|0)|0))/+(d&65535));i=(i|0)>1?i:1}d=e[l+86>>1]|0;f=d+f|0;while(1){if((d|0)>=(f|0))break;q=(c[p>>2]|0)+(d<<2)|0;r=c[q>>2]|0;c[q>>2]=(r|0)>(j|0)?r:j;d=d+1|0}d=e[l+84>>1]|0;f=d+k|0;while(1){if((d|0)>=(f|0))break;r=n+(d<<2)|0;q=c[r>>2]|0;c[r>>2]=(q|0)>(i|0)?q:i;d=d+1|0}m=m+4|0}return}function sU(a){a=a|0;var b=0,d=0;d=l;l=l+16|0;b=d;if(a>>>0<21)a=c[55892+(a<<2)>>2]|0;else{c[b>>2]=a;i2(195241,137696,b)|0;a=195241}l=d;return a|0}function tU(a,b,d){a=a|0;b=b|0;d=d|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;k=a+104|0;l=a+100|0;j=d+16|0;f=0;g=0;while(1){if((f|0)>(c[k>>2]|0))break;i=qC(d,sU(f)|0,1)|0;RC(i,137750,304,1)|0;m=i+16|0;c[(c[m>>2]|0)+176>>2]=0;o=HK((c[l>>2]<<2)+4|0)|0;n=c[m>>2]|0;c[n+172>>2]=o;c[n+184>>2]=0;n=HK((c[l>>2]<<2)+4|0)|0;c[(c[m>>2]|0)+180>>2]=n;if(!g)c[(c[j>>2]|0)+192>>2]=i;else c[(c[g+16>>2]|0)+164>>2]=i;f=f+1|0;g=i}j=b+16|0;f=0;g=0;while(1){if((f|0)>(c[l>>2]|0))break;i=qC(b,sU(f)|0,1)|0;RC(i,137750,304,1)|0;o=i+16|0;c[(c[o>>2]|0)+176>>2]=0;m=HK((c[k>>2]<<2)+4|0)|0;n=c[o>>2]|0;c[n+172>>2]=m;c[n+184>>2]=0;n=HK((c[k>>2]<<2)+4|0)|0;c[(c[o>>2]|0)+180>>2]=n;if(!g)c[(c[j>>2]|0)+192>>2]=i;else c[(c[g+16>>2]|0)+164>>2]=i;f=f+1|0;g=i}f=c[a+84>>2]|0;while(1){g=c[f>>2]|0;if(!g)break;o=g+84|0;n=qC(d,sU(e[o>>1]|0)|0,0)|0;o=qC(d,sU((e[g+80>>1]|0)+(e[o>>1]|0)|0)|0,0)|0;uU(d,n,o,~~+h[g+64>>3]);o=g+86|0;n=qC(b,sU(e[o>>1]|0)|0,0)|0;o=qC(b,sU((e[g+82>>1]|0)+(e[o>>1]|0)|0)|0,0)|0;uU(b,n,o,~~+h[g+72>>3]);f=f+4|0}vU(d);vU(b);return}function uU(a,d,f,g){a=a|0;d=d|0;f=f|0;g=g|0;var h=0,i=0;h=fB(a,d,f,0,0)|0;if(!h){i=fB(a,d,f,0,1)|0;RC(i,137763,176,1)|0;b[(c[i+16>>2]|0)+170>>1]=g;d=d+16|0;h=c[d>>2]|0;a=c[h+180>>2]|0;h=(c[h+184>>2]<<2)+8|0;if(!a)a=IK(h)|0;else a=KK(a,h)|0;g=c[d>>2]|0;c[g+180>>2]=a;g=g+184|0;h=c[g>>2]|0;c[g>>2]=h+1;c[a+(h<<2)>>2]=i;d=c[d>>2]|0;c[(c[d+180>>2]|0)+(c[d+184>>2]<<2)>>2]=0;d=f+16|0;h=c[d>>2]|0;a=c[h+172>>2]|0;h=(c[h+176>>2]<<2)+8|0;if(!a)a=IK(h)|0;else a=KK(a,h)|0;g=c[d>>2]|0;c[g+172>>2]=a;g=g+176|0;f=c[g>>2]|0;c[g>>2]=f+1;c[a+(f<<2)>>2]=i;i=c[d>>2]|0;c[(c[i+172>>2]|0)+(c[i+176>>2]<<2)>>2]=0}else{i=(c[h+16>>2]|0)+170|0;f=e[i>>1]|0;b[i>>1]=(f|0)>(g|0)?f:g}return}function vU(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=c[(c[a+16>>2]|0)+192>>2]|0;e=d;d=d+16|0;while(1){h=c[(c[d>>2]|0)+164>>2]|0;if(!h)break;d=h+16|0;if(fB(a,e,h,0,0)|0){e=h;continue}i=fB(a,e,h,0,1)|0;RC(i,137763,176,1)|0;b[(c[i+16>>2]|0)+170>>1]=0;g=e+16|0;f=c[g>>2]|0;e=c[f+180>>2]|0;f=(c[f+184>>2]<<2)+8|0;if(!e)e=IK(f)|0;else e=KK(e,f)|0;j=c[g>>2]|0;c[j+180>>2]=e;j=j+184|0;f=c[j>>2]|0;c[j>>2]=f+1;c[e+(f<<2)>>2]=i;f=c[g>>2]|0;c[(c[f+180>>2]|0)+(c[f+184>>2]<<2)>>2]=0;f=c[d>>2]|0;e=c[f+172>>2]|0;f=(c[f+176>>2]<<2)+8|0;if(!e)e=IK(f)|0;else e=KK(e,f)|0;g=c[d>>2]|0;c[g+172>>2]=e;g=g+176|0;j=c[g>>2]|0;c[g>>2]=j+1;c[e+(j<<2)>>2]=i;e=c[d>>2]|0;c[(c[e+172>>2]|0)+(c[e+176>>2]<<2)>>2]=0;e=h}return}function wU(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=a+92|0;e=0;f=0;b=c[(c[(c[b+16>>2]|0)+192>>2]|0)+16>>2]|0;while(1){b=c[b+164>>2]|0;if(!b)break;b=c[b+16>>2]|0;h=b+232|0;c[(c[g>>2]|0)+(f<<2)>>2]=(c[h>>2]|0)-e;e=c[h>>2]|0;f=f+1|0}a=a+96|0;e=0;f=0;b=c[(c[(c[d+16>>2]|0)+192>>2]|0)+16>>2]|0;while(1){b=c[b+164>>2]|0;if(!b)break;b=c[b+16>>2]|0;h=b+232|0;c[(c[a>>2]|0)+(f<<2)>>2]=(c[h>>2]|0)-e;e=c[h>>2]|0;f=f+1|0}return}function xU(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=l;l=l+16|0;f=g+4|0;b=g;c[b>>2]=c[4658];d=c[a+100>>2]|0;if((d|0)!=1?(e=a+104|0,(c[e>>2]|0)!=1):0){c[a+92>>2]=HK((d<<2)+4|0)|0;c[a+96>>2]=HK((c[e>>2]<<2)+4|0)|0;c[f>>2]=c[b>>2];e=lB(137776,f,0)|0;c[f>>2]=c[b>>2];f=lB(137781,f,0)|0;RC(e,137786,280,1)|0;RC(f,137786,280,1)|0;tU(a,e,f);sL(e,2,2147483647)|0;sL(f,2,2147483647)|0;wU(a,e,f);yU(e,f)}else rU(a);l=g;return}function yU(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[b+16>>2]|0)+192|0;while(1){d=c[d>>2]|0;if(!d)break;f=d+16|0;d=c[f>>2]|0;e=c[d+172>>2]|0;if(e){l6(e);d=c[f>>2]|0}e=c[d+180>>2]|0;if(e){l6(e);d=c[f>>2]|0}d=d+164|0}pB(a)|0;pB(b)|0;return}function zU(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0;r=l;l=l+272|0;p=r+104|0;q=r+136|0;n=r+72|0;o=r;g=r+144|0;c[o+48>>2]=b;i=o+52|0;switch(FC(b)|0){case 0:{e=c[b+60>>2]|0;f=5;break}case 1:{e=uC(b)|0;f=5;break}case 2:{e=uC(c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)|0;f=5;break}default:e=0}if((f|0)==5)c[i>>2]=e;m=c[e+60>>2]|0;h[o+32>>3]=+h[d+16>>3];c[o+16>>2]=c[d+4>>2];c[o+20>>2]=c[d+8>>2];c[o+40>>2]=0;k=JW(c[d>>2]|0,q,o)|0;if(!k){hA(p,128,g);a[d+82>>0]=0;e=Y3(AU(b,p)|0)|0;c[d>>2]=e;if((c[d+12>>2]|0)==1)e=cQ(e)|0;else e=$P(e,c[i>>2]|0)|0;l6(c[d>>2]|0);c[d>>2]=e;vK(c[(c[m+16>>2]|0)+144>>2]|0,d);lA(p);e=c[q>>2]|0}else{e=k+4|0;f=d+24|0;g=n+8|0;i=n+24|0;j=n+16|0;if((a[e>>0]|0)==1){if((c[(c[k>>2]|0)+24>>2]|0)==0?BU(b)|0:0){b=Y3(BU(b)|0)|0;c[(c[k>>2]|0)+24>>2]=b}o=CU(m,c[k>>2]|0,0,o)|0;c[q>>2]=c[q>>2]|o;o=c[k>>2]|0;t=+h[o+64>>3]*.5;s=+h[o+72>>3]*.5;DU(n,-t,-s,t,s);o=c[k>>2]|0;c[p>>2]=c[n>>2];c[p+4>>2]=c[n+4>>2];c[p+8>>2]=c[n+8>>2];c[p+12>>2]=c[n+12>>2];c[p+16>>2]=c[n+16>>2];c[p+20>>2]=c[n+20>>2];c[p+24>>2]=c[n+24>>2];c[p+28>>2]=c[n+28>>2];EU(o,p,15)}else{FU(c[(c[m+16>>2]|0)+144>>2]|0,c[k>>2]|0,o);p=c[k>>2]|0;s=+h[p+24>>3]*.5;t=+h[p+32>>3]*.5;DU(n,-s,-t,s,t);p=(c[k>>2]|0)+8|0;c[p>>2]=c[n>>2];c[p+4>>2]=c[n+4>>2];c[p+8>>2]=c[n+8>>2];c[p+12>>2]=c[n+12>>2];c[p+16>>2]=c[n+16>>2];c[p+20>>2]=c[n+20>>2];c[p+24>>2]=c[n+24>>2];c[p+28>>2]=c[n+28>>2]}h[f>>3]=+h[j>>3]-+h[n>>3];h[d+32>>3]=+h[i>>3]-+h[g>>3];c[d+72>>2]=k;if((a[e>>0]|0)==1){l6(c[d>>2]|0);c[d>>2]=Y3(141914)|0}e=c[q>>2]|0}l=r;return e|0}function AU(b,d){b=b|0;d=d|0;var e=0;a:do switch(FC(b)|0){case 0:{kA(d,HB(b)|0)|0;break}case 1:{kA(d,HB(b)|0)|0;break}case 2:{kA(d,HB(c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0)|0)|0;e=b+-48|0;kA(d,HB(c[((c[b>>2]&3|0)==2?b:e)+40>>2]|0)|0)|0;if(!(uB(uC(c[((c[b>>2]&3|0)==2?b:e)+40>>2]|0)|0)|0)){kA(d,142050)|0;break a}else{kA(d,138041)|0;break a}}default:{}}while(0);e=d+4|0;b=c[e>>2]|0;if(b>>>0>=(c[d+8>>2]|0)>>>0){iA(d,1)|0;b=c[e>>2]|0}a[b>>0]=0;d=c[d>>2]|0;c[e>>2]=d;return d|0}function BU(b){b=b|0;var c=0,d=0;c=NA(b,138032)|0;if(!((c|0)!=0?(a[c>>0]|0)!=0:0))d=3;do if((d|0)==3){c=NA(b,141126)|0;if(c|0?a[c>>0]|0:0)break;c=0}while(0);return c|0}function CU(f,g,i,j){f=f|0;g=g|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=l;l=l+16|0;u=w+8|0;t=w;v=g+108|0;k=c[v>>2]|0;if(k|0)XT(j,k,186744);c[g+80>>2]=i;k=JU(f,g,j)|0;r=g+36|0;f=e[r>>1]|0;i=g+32|0;if(!(f&128))a[i>>0]=2;m=g+33|0;if(!(f&32))a[m>>0]=1;xU(g);n=c[g+104>>2]|0;p=a[i>>0]|0;f=S(p,n+1|0)|0;o=d[m>>0]<<1;q=c[g+100>>2]|0;p=S(q+1|0,p)|0;m=g+96|0;f=o+f|0;i=0;while(1){if((i|0)>=(n|0))break;f=(c[(c[m>>2]|0)+(i<<2)>>2]|0)+f|0;i=i+1|0}n=g+92|0;i=p+o|0;m=0;while(1){if((m|0)>=(q|0))break;i=(c[(c[n>>2]|0)+(m<<2)>>2]|0)+i|0;m=m+1|0}n=g+38|0;o=g+40|0;do if(b[r>>1]&1){r=b[n>>1]|0;m=r&65535;if(r<<16>>16?(s=b[o>>1]|0,s<<16>>16):0){if(!((m|0)<(f|0)|(s&65535|0)<(i|0))){i=0;f=0;break}dA(0,137832,t)|0;k=1;i=0;f=0;break}dA(0,137866,u)|0;k=1}while(0);u=e[n>>1]|0;h[g+64>>3]=+(((f|0)>(u|0)?f:u)|0);u=e[o>>1]|0;h[g+72>>3]=+(((i|0)>(u|0)?i:u)|0);if(c[v>>2]|0)dU(j,186744);l=w;return k|0}function DU(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;h[a>>3]=b;h[a+8>>3]=c;h[a+16>>3]=d;h[a+24>>3]=e;return}function EU(f,g,i){f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0,t=0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0;J=l;l=l+64|0;H=J+32|0;I=J;w=c[f+84>>2]|0;m=c[f+80>>2]|0;if((m|0?(j=c[m+24>>2]|0,j|0):0)?(k=f+24|0,(c[k>>2]|0)==0):0)c[k>>2]=Y3(j)|0;G=f+48|0;j=g+16|0;o=+h[j>>3];n=+h[g>>3];k=~~(o-n-+(~~+h[f+64>>3]|0));if((k|0)<=-1)Aa(137799,137643,1761,137809);m=g+24|0;u=+h[m>>3];p=g+8|0;q=+h[p>>3];r=+(~~+h[f+72>>3]|0);s=~~(u-q-r);if((s|0)<=-1)Aa(137822,137643,1764,137809);t=e[f+36>>1]|0;a:do if(t&1){b:do if((k|0)>0)switch(t&6){case 4:{h[j>>3]=n+r;break b}case 2:{K=+(k|0);h[j>>3]=o+K;n=K+n;h[g>>3]=n;break b}default:{K=+(k>>>1|0);n=n+K;h[g>>3]=n;h[j>>3]=o-K;break b}}while(0);if((s|0)>0)switch(t&24){case 16:{u=q+r;h[m>>3]=u;s=0;j=0;break a}case 8:{K=+(s|0);u=K+u;h[m>>3]=u;h[p>>3]=q+K;s=0;j=0;break a}default:{K=+(s>>>1|0);h[p>>3]=q+K;u=u-K;h[m>>3]=u;s=0;j=0;break a}}else{s=0;j=0}}else j=k;while(0);o=+(d[f+33>>0]|0);E=f+32|0;F=a[E>>0]|0;v=F<<24>>24;q=+(F<<24>>24);F=f+104|0;m=c[F>>2]|0;t=(j|0)/(m|0)|0;p=j-(S(t,m)|0)|0;p=~~(+(p|0)+((p|0)>-1?.5:-.5));D=f+96|0;t=t+v|0;j=~~(n+o+q);k=0;while(1){if((k|0)>(m|0))break;C=(c[D>>2]|0)+(k<<2)|0;m=c[C>>2]|0;c[C>>2]=j;j=t+j+((k|0)<(p|0)&1)+m|0;k=k+1|0;m=c[F>>2]|0}C=f+100|0;m=c[C>>2]|0;p=(s|0)/(m|0)|0;s=s-(S(p,m)|0)|0;s=~~(+(s|0)+((s|0)>-1?.5:-.5));B=f+92|0;p=p+v|0;j=~~(u-o-q);k=0;while(1){if((k|0)>(m|0))break;A=(c[B>>2]|0)+(k<<2)|0;m=c[A>>2]|0;c[A>>2]=j;j=j-p+(((k|0)<(s|0))<<31>>31)-m|0;k=k+1|0;m=c[C>>2]|0}x=(i|0)==0;y=I+16|0;z=I+24|0;A=I+8|0;m=w;while(1){p=c[m>>2]|0;if(!p)break;j=b[p+84>>1]|0;k=b[p+86>>1]|0;s=k&65535;t=j&65535;v=(e[p+80>>1]|0)+t|0;w=(e[p+82>>1]|0)+s|0;if(x)j=0;else{j=j<<16>>16==0?8:0;j=k<<16>>16==0?j|4:j;j=(w|0)==(c[C>>2]|0)|((v|0)==(c[F>>2]|0)?j|2:j)}k=c[D>>2]|0;h[I>>3]=+(c[k+(t<<2)>>2]|0);t=a[E>>0]|0;h[y>>3]=+((c[k+(v<<2)>>2]|0)-t|0);v=c[B>>2]|0;h[z>>3]=+(c[v+(s<<2)>>2]|0);h[A>>3]=+((c[v+(w<<2)>>2]|0)+t|0);c[H>>2]=c[I>>2];c[H+4>>2]=c[I+4>>2];c[H+8>>2]=c[I+8>>2];c[H+12>>2]=c[I+12>>2];c[H+16>>2]=c[I+16>>2];c[H+20>>2]=c[I+20>>2];c[H+24>>2]=c[I+24>>2];c[H+28>>2]=c[I+28>>2];GU(p,H,j&i);m=m+4|0}a[f+35>>0]=i;c[G>>2]=c[g>>2];c[G+4>>2]=c[g+4>>2];c[G+8>>2]=c[g+8>>2];c[G+12>>2]=c[g+12>>2];c[G+16>>2]=c[g+16>>2];c[G+20>>2]=c[g+20>>2];c[G+24>>2]=c[g+24>>2];c[G+28>>2]=c[g+28>>2];l=J;return}function FU(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0.0,k=0.0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0.0,R=0.0,S=0.0;P=l;l=l+112|0;I=P+48|0;J=P+16|0;K=P;c[J>>2]=0;c[J+4>>2]=0;c[J+8>>2]=0;c[J+12>>2]=0;c[J+16>>2]=0;c[J+20>>2]=0;c[J+24>>2]=0;c[J+28>>2]=0;L=e+4|0;M=J+16|0;N=f+16|0;O=f+32|0;r=b[L>>1]|0;n=r<<16>>16;g=0;j=-1.0;m=0;while(1){if((m|0)>=(n|0)){g=1;break}i=c[e>>2]|0;if((b[i+(m*24|0)+4>>1]|0)>1){g=0;break}i=c[(c[i+(m*24|0)>>2]|0)+4>>2]|0;if(!i){k=+h[O>>3];h[M>>3]=k;i=N}else{if(c[i+24>>2]&127|0){g=0;break}k=+h[(+h[i+16>>3]>0.0?i:N)+16>>3];h[M>>3]=k;i=(c[i>>2]|0)==0?N:i}i=c[i>>2]|0;c[J>>2]=i;if(!(j==-1.0)){if(k!=j){g=0;break}}else j=k;if(g){if(f2(i,g)|0){g=0;break}}else g=i;m=m+1|0}a[e+6>>0]=g;E=f+48|0;F=J+4|0;G=J+24|0;H=f+40|0;x=f+20|0;y=d+144|0;z=I+4|0;w=K+8|0;A=I+16|0;B=I+24|0;C=I+8|0;D=I+12|0;v=(g|0)==0;j=0.0;s=0.0;t=0.0;u=0.0;f=0;g=r;while(1){if((f|0)>=(g<<16>>16|0))break;k=0.0;q=0.0;n=0;p=0.0;j=0.0;i=c[e>>2]|0;while(1){if((n|0)>=(b[i+(f*24|0)+4>>1]|0))break;c[I>>2]=CK(c[(c[i+(f*24|0)>>2]|0)+(n*56|0)>>2]|0,c[E>>2]|0)|0;i=(c[e>>2]|0)+(f*24|0)|0;g=c[(c[i>>2]|0)+(n*56|0)+4>>2]|0;m=c[G>>2]&-128;if(!g){h[M>>3]=+h[O>>3];c[J>>2]=c[N>>2];c[F>>2]=c[x>>2];c[G>>2]=c[H>>2]&127|m}else{g=c[g+24>>2]&127;if(!g)g=c[H>>2]&127;c[G>>2]=g|m;r=c[(c[i>>2]|0)+(n*56|0)+4>>2]|0;h[M>>3]=+h[(+h[r+16>>3]>0.0?r:N)+16>>3];c[J>>2]=c[((c[r>>2]|0)==0?N:r)>>2];c[F>>2]=c[((c[r+4>>2]|0)==0?N:r)+4>>2]}i=c[y>>2]|0;c[z>>2]=eb[c[i>>2]&63](i,J,1)|0;JO(K,d,I);R=+h[K>>3];o=+h[w>>3];l6(c[(c[(c[e>>2]|0)+(f*24|0)>>2]|0)+(n*56|0)>>2]|0);i=c[e>>2]|0;r=c[i+(f*24|0)>>2]|0;c[r+(n*56|0)>>2]=c[I>>2];h[r+(n*56|0)+32>>3]=R;h[r+(n*56|0)+16>>3]=+h[A>>3];h[r+(n*56|0)+24>>3]=+h[B>>3];c[r+(n*56|0)+4>>2]=c[z>>2];c[r+(n*56|0)+8>>2]=c[C>>2];c[r+(n*56|0)+12>>2]=c[D>>2];Q=+h[M>>3];S=+h[B>>3];k=S>k?S:k;q=q+R;n=n+1|0;p=Q>p?Q:p;j=o>j?o:j}h[i+(f*24|0)+8>>3]=q;g=(f|0)==0;do if(v)if(g){o=p;k=p-k;break}else{o=p;k=t+p-u-k;break}else{o=j;k=g?p:j}while(0);h[i+(f*24|0)+16>>3]=k;s=q>s?q:s;t=t+o;u=u+k;f=f+1|0;g=b[L>>1]|0}h[e+24>>3]=s;h[e+32>>3]=g<<16>>16==1?j:t;l=P;return}function GU(f,g,i){f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0;z=l;l=l+64|0;v=z+32|0;y=z;k=f+24|0;if((c[k>>2]|0)==0?(j=c[(c[f+96>>2]|0)+24>>2]|0,j|0):0)c[k>>2]=Y3(j)|0;u=f+36|0;t=e[u>>1]|0;k=g+8|0;j=g+16|0;w=t&6;s=g+24|0;x=t&24;a:do if(t&1){m=+h[f+64>>3];r=+h[f+72>>3];n=+h[j>>3];p=+h[g>>3];o=n-p-m;b:do if(o>0.0)switch(w&7){case 4:{n=m+p;h[j>>3]=n;m=p;break b}case 2:{n=n+o;h[j>>3]=n;m=o+p;h[g>>3]=m;break b}default:{q=o*.5;m=p+q;h[g>>3]=m;n=n-q;h[j>>3]=n;break b}}else m=p;while(0);q=+h[s>>3];p=+h[k>>3];o=q-p-r;if(o>0.0)switch(x&31){case 16:{o=r+p;h[s>>3]=o;break a}case 8:{r=q+o;h[s>>3]=r;p=o+p;h[k>>3]=p;o=r;break a}default:{o=o*.5;p=p+o;h[k>>3]=p;o=q-o;h[s>>3]=o;break a}}else o=q}else{m=+h[g>>3];p=+h[k>>3];n=+h[j>>3];o=+h[s>>3]}while(0);t=f+48|0;c[t>>2]=c[g>>2];c[t+4>>2]=c[g+4>>2];c[t+8>>2]=c[g+8>>2];c[t+12>>2]=c[g+12>>2];c[t+16>>2]=c[g+16>>2];c[t+20>>2]=c[g+20>>2];c[t+24>>2]=c[g+24>>2];c[t+28>>2]=c[g+28>>2];a[f+35>>0]=i;B=+(d[f+33>>0]|0);A=+(d[f+34>>0]|0);q=m+B+A;h[y>>3]=q;r=A+(B+p);t=y+8|0;h[t>>3]=r;p=n-B-A;s=y+16|0;h[s>>3]=p;o=o-B-A;g=y+24|0;h[g>>3]=o;j=a[f+92>>0]|0;k=f+88|0;do if(j<<24>>24==1){x=c[k>>2]|0;c[v>>2]=c[y>>2];c[v+4>>2]=c[y+4>>2];c[v+8>>2]=c[y+8>>2];c[v+12>>2]=c[y+12>>2];c[v+16>>2]=c[y+16>>2];c[v+20>>2]=c[y+20>>2];c[v+24>>2]=c[y+24>>2];c[v+28>>2]=c[y+28>>2];EU(x,v,i)}else{m=p-q;if(j<<24>>24==3){j=c[k>>2]|0;n=+h[j+24>>3];m=m-+h[j+16>>3];c:do if(m>0.0)switch(w&7){case 4:{h[s>>3]=p-m;break c}case 2:{h[y>>3]=q+m;break c}default:break c}while(0);m=o-r-n;d:do if(m>0.0)switch(x&31){case 16:{h[g>>3]=o-m;break d}case 8:{h[t>>3]=r+m;break d}default:break d}while(0);c[v>>2]=c[y>>2];c[v+4>>2]=c[y+4>>2];c[v+8>>2]=c[y+8>>2];c[v+12>>2]=c[y+12>>2];c[v+16>>2]=c[y+16>>2];c[v+20>>2]=c[y+20>>2];c[v+24>>2]=c[y+24>>2];c[v+28>>2]=c[y+28>>2];HU(j,v);break}j=c[k>>2]|0;n=+h[j+32>>3];m=m-+h[j+24>>3];e:do if(!((w|0)==6|!(m>0.0)))switch(w&7){case 4:{h[s>>3]=p-m;break e}case 2:{h[y>>3]=q+m;break e}default:{B=m*.5;h[y>>3]=q+B;h[s>>3]=p-B;break e}}while(0);m=o-r-n;f:do if(m>0.0)switch(x&31){case 16:{h[g>>3]=o-m;break f}case 8:{h[t>>3]=r+m;break f}default:{B=m*.5;h[t>>3]=r+B;h[g>>3]=o-B;break f}}while(0);x=j+8|0;c[x>>2]=c[y>>2];c[x+4>>2]=c[y+4>>2];c[x+8>>2]=c[y+8>>2];c[x+12>>2]=c[y+12>>2];c[x+16>>2]=c[y+16>>2];c[x+20>>2]=c[y+20>>2];c[x+24>>2]=c[y+24>>2];c[x+28>>2]=c[y+28>>2];y=b[u>>1]&768;IU(c[k>>2]|0,(y&1023)==512?108:(y&1023)==256?114:110)}while(0);l=z;return}function HU(a,b){a=a|0;b=b|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];c[a+16>>2]=c[b+16>>2];c[a+20>>2]=c[b+20>>2];c[a+24>>2]=c[b+24>>2];c[a+28>>2]=c[b+28>>2];return}function IU(d,e){d=d|0;e=e|0;var f=0,g=0,h=0;g=b[d+4>>1]|0;f=0;while(1){if((f|0)>=(g|0))break;h=(c[d>>2]|0)+(f*24|0)+6|0;if(!(a[h>>0]|0))a[h>>0]=e;f=f+1|0}return}function JU(d,f,g){d=d|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;l=f+84|0;t=c[l>>2]|0;u=IL()|0;v=NU()|0;i=0;h=0;k=Qz(t)|0;while(1){if(!k)break;j=Qz(c[k+8>>2]|0)|0;while(1){if(!j)break;j=c[j>>2]|0;i=i+1|0}h=h+1|0;if(a[k+12>>0]|0)RU(v,h);k=c[k>>2]|0}h=HK((i<<2)+4|0)|0;c[l>>2]=h;i=0;j=0;k=0;q=0;r=Qz(t)|0;while(1){if(!r)break;s=q&65535;p=0;o=Qz(c[r+8>>2]|0)|0;while(1){if(!o)break;n=c[o+8>>2]|0;c[h>>2]=n;k=KU(d,n,f,g)|0|k;l=LU(u,q,p,n)|0;b[n+86>>1]=s;b[n+84>>1]=l;l=(e[n+80>>1]|0)+l|0;m=(e[n+82>>1]|0)+q|0;if(SU(v,m)|0){p=n+100|0;a[p>>0]=a[p>>0]|2}p=l;h=h+4|0;o=c[o>>2]|0;i=(l|0)>(i|0)?l:i;j=(m|0)>(j|0)?m:j}q=q+1|0;r=c[r>>2]|0}c[f+100>>2]=j;c[f+104>>2]=i;Oz(t)|0;Oz(v)|0;LL(u);return k|0}function KU(f,g,i,j){f=f|0;g=g|0;i=i|0;j=j|0;var k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0;x=l;l=l+16|0;w=x+8|0;v=x;c[g+96>>2]=i;t=g+36|0;o=e[t>>1]|0;s=g+34|0;p=i+36|0;if(!(o&64)){if(!(b[p>>1]&64))n=2;else n=a[i+34>>0]|0;a[s>>0]=n}q=g+33|0;if(!(o&32)){n=a[i+88>>0]|0;if(n<<24>>24<=-1)if(!(b[p>>1]&32))n=1;else n=a[i+33>>0]|0;a[q>>0]=n}r=g+92|0;n=g+88|0;switch(a[r>>0]|0){case 1:{o=CU(f,c[n>>2]|0,g,j)|0;p=c[n>>2]|0;n=o;o=p+64|0;p=p+72|0;break}case 3:{o=MU(c[n>>2]|0,j)|0;p=c[n>>2]|0;n=o;o=p+16|0;p=p+24|0;break}default:{FU(c[(c[f+16>>2]|0)+144>>2]|0,c[n>>2]|0,j);p=c[n>>2]|0;n=0;o=p+24|0;p=p+32|0}}k=+((d[q>>0]|0)+(d[s>>0]|0)<<1|0);m=+h[o>>3]+k;k=+h[p>>3]+k;p=g+38|0;i=g+40|0;do if(b[t>>1]&1){o=b[p>>1]|0;if(o<<16>>16?(u=b[i>>1]|0,u<<16>>16):0){if(!(+(o&65535)>0]|0)==3){m=0.0;k=0.0;break}dA(0,137917,v)|0;n=1;m=0.0;k=0.0;break}dA(0,137950,w)|0;n=1}while(0);y=+(e[p>>1]|0);h[g+64>>3]=m>y?m:y;m=+(e[i>>1]|0);h[g+72>>3]=k>m?k:m;l=x;return n|0}function LU(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var f=0,g=0,h=0,i=0,j=0;j=d+80|0;i=(e[j>>1]|0)+-1|0;h=0;a:while(1){f=c;while(1){if(h)break a;g=i+f|0;while(1){if((g|0)<(f|0)){c=f;h=1;continue a}if(QL(a,g,b)|0)break;g=g+-1|0}f=g+1|0}}h=d+82|0;f=c;while(1){if((f|0)<((e[j>>1]|0)+c|0))g=b;else break;while(1){if((g|0)>=((e[h>>1]|0)+b|0))break;OL(a,f,g);g=g+1|0}f=f+1|0}return c|0}function MU(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;j=m;i=m+8|0;d=d+52|0;g=b+32|0;PF(i,c[d>>2]|0,c[g>>2]|0);k=c[i>>2]|0;i=c[i+4>>2]|0;if((i&k|0)==-1){c[j>>2]=c[g>>2];dA(1,138e3,j)|0;d=1;f=0.0;e=0.0}else{a[(c[(c[d>>2]|0)+16>>2]|0)+114>>0]=1;d=0;f=+(i|0);e=+(k|0)}c[b>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;h[b+16>>3]=e;h[b+24>>3]=f;l=m;return d|0}function NU(){return Sz(55976,c[4591]|0)|0}function OU(a,b,d){a=a|0;b=b|0;d=d|0;d=HK(12)|0;c[d>>2]=c[b>>2];return d|0}function PU(a,b,c){a=a|0;b=b|0;c=c|0;l6(b);return}function QU(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;b=c[b>>2]|0;e=c[d>>2]|0;return ((b|0)>(e|0)?1:((b|0)<(e|0))<<31>>31)|0}function RU(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;eb[c[a>>2]&63](a,e,1)|0;l=d;return}function SU(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;b=(eb[c[a>>2]&63](a,e,512)|0)!=0&1;l=d;return b|0}function TU(a){a=a|0;var b=0;if(!(c[47446]|0)){b=HK((a<<2)+4|0)|0;c[47446]=b;c[b>>2]=189788;c[47457]=a}c[47458]=0;return}function UU(){l6(c[47446]|0);c[47446]=0;c[47458]=0;return}function VU(){c[47458]=0;return}function WU(){var a=0,b=0,d=0;b=c[47458]|0;d=c[47446]|0;a=1;while(1){if((a|0)>(b|0)){a=5;break}if((c[(c[d+(a<<2)>>2]|0)+4>>2]|0)==(a|0))a=a+1|0;else{a=4;break}}if((a|0)==4)Aa(138697,138044,59,138050);else if((a|0)==5)return}function XU(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;f=c[47446]|0;g=c[f+(a<<2)>>2]|0;h=c[g>>2]|0;while(1){b=(a|0)/2|0;d=c[f+(b<<2)>>2]|0;e=f+(a<<2)|0;if((c[d>>2]|0)>=(h|0))break;c[e>>2]=d;c[d+4>>2]=a;a=b}c[e>>2]=g;c[g+4>>2]=a;return}function YU(a){a=a|0;var b=0,d=0;d=l;l=l+16|0;b=c[47458]|0;if((b|0)==(c[47457]|0)){dA(1,138058,d)|0;a=1}else{b=b+1|0;c[47458]=b;c[(c[47446]|0)+(b<<2)>>2]=a;XU(b);WU();a=0}l=d;return a|0}function ZU(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=c[47446]|0;g=c[f+(a<<2)>>2]|0;h=c[g>>2]|0;i=c[47458]|0;j=(i|0)/2|0;while(1){e=f+(a<<2)|0;if((a|0)>(j|0))break;d=a<<1;b=c[f+(d<<2)>>2]|0;if((d|0)<(i|0)){m=d|1;k=c[f+(m<<2)>>2]|0;l=(c[b>>2]|0)<(c[k>>2]|0);d=l?m:d;b=l?k:b}if((h|0)>=(c[b>>2]|0))break;c[e>>2]=b;c[b+4>>2]=a;a=d}c[e>>2]=g;c[g+4>>2]=a;return}function _U(){var a=0,b=0,d=0,e=0;b=c[47458]|0;if(!b)a=0;else{e=c[47446]|0;d=e+4|0;a=c[d>>2]|0;c[d>>2]=c[e+(b<<2)>>2];b=b+-1|0;c[47458]=b;if(b|0)ZU(1);WU()}return a|0}function $U(a,b){a=a|0;b=b|0;c[a>>2]=b;XU(c[a+4>>2]|0);WU();return}function aV(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;m=b+16|0;j=c[m>>2]|0;j=(a[j+((c[e+12>>2]|0)*40|0)+36>>0]|0)!=(a[j+((c[e+16>>2]|0)*40|0)+36>>0]|0);k=~~((+h[d+64>>3]-+h[d+48>>3]+-3.0)*.5);l=~~((+h[d+56>>3]-+h[d+40>>3]+-3.0)*.5);g=(k|0)<(l|0)?k:l;n=d+4|0;f=0;while(1){b=c[n>>2]|0;if((f|0)>=(b|0)){g=f;break}i=c[d+8+(f<<2)>>2]|0;o=c[m>>2]|0;if((a[o+((c[i+12>>2]|0)*40|0)+36>>0]|0)==(a[o+((c[i+16>>2]|0)*40|0)+36>>0]|0)){g=f;break}bV(i,g);f=f+1|0}while(1){if((g|0)>=(b|0))break;f=c[d+8+(g<<2)>>2]|0;if(j|(f|0)==(e|0)){bV(f,a[(c[m>>2]|0)+((c[f+12>>2]|0)*40|0)+36>>0]|0?k:l);b=c[n>>2]|0}g=g+1|0}return}function bV(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+8|0;e=c[d>>2]|0;c[d>>2]=e+1;if((e|0)>=(b|0)){c[d>>2]=0;h[a>>3]=+h[a>>3]+16384.0}return}function cV(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0,D=0,E=0.0;x=l;l=l+112|0;u=x+64|0;t=x+96|0;m=x+32|0;v=x;w=HK(28)|0;b=qB(a)|0;s=w+4|0;c[s>>2]=b;b=HK(b*72|0)|0;r=w+12|0;c[r>>2]=b;e=v+8|0;h[e>>3]=1797693134862315708145274.0e284;h[v>>3]=1797693134862315708145274.0e284;f=v+24|0;h[f>>3]=-1797693134862315708145274.0e284;g=v+16|0;h[g>>3]=-1797693134862315708145274.0e284;i=m+16|0;j=m+8|0;k=m+24|0;d=gC(a)|0;n=1797693134862315708145274.0e284;o=1797693134862315708145274.0e284;p=-1797693134862315708145274.0e284;q=-1797693134862315708145274.0e284;while(1){if(!d)break;C=d+16|0;D=c[C>>2]|0;z=(+h[D+88>>3]+ +h[D+96>>3])*.5;z=z<1.0?1.0:z;E=+h[D+80>>3]*.5;E=E<1.0?1.0:E;y=+h[D+16>>3];B=y-z;h[m>>3]=B;z=y+z;h[i>>3]=z;y=+h[D+24>>3];A=y-E;h[j>>3]=A;y=E+y;h[k>>3]=y;B=+h[(n>3];h[v>>3]=B;A=+h[(o>3];h[e>>3]=A;z=+h[(p>z?v:m)+16>>3];h[g>>3]=z;y=+h[(q>y?v:m)+24>>3];h[f>>3]=y;D=b+40|0;c[D>>2]=c[m>>2];c[D+4>>2]=c[m+4>>2];c[D+8>>2]=c[m+8>>2];c[D+12>>2]=c[m+12>>2];c[D+16>>2]=c[m+16>>2];c[D+20>>2]=c[m+20>>2];c[D+24>>2]=c[m+24>>2];c[D+28>>2]=c[m+28>>2];c[b>>2]=c[b>>2]|1;c[(c[C>>2]|0)+112>>2]=b;b=b+72|0;d=hC(a,d)|0;n=B;o=A;p=z;q=y}h[v>>3]=n+-36.0;h[e>>3]=o+-36.0;h[g>>3]=p+36.0;h[f>>3]=q+36.0;D=c[r>>2]|0;f=c[s>>2]|0;c[u>>2]=c[v>>2];c[u+4>>2]=c[v+4>>2];c[u+8>>2]=c[v+8>>2];c[u+12>>2]=c[v+12>>2];c[u+16>>2]=c[v+16>>2];c[u+20>>2]=c[v+20>>2];c[u+24>>2]=c[v+24>>2];c[u+28>>2]=c[v+28>>2];f=mV(D,f,t,u)|0;if(c[47394]&1|0){r=c[r>>2]|0;C=c[s>>2]|0;D=c[t>>2]|0;c[u>>2]=c[v>>2];c[u+4>>2]=c[v+4>>2];c[u+8>>2]=c[v+8>>2];c[u+12>>2]=c[v+12>>2];c[u+16>>2]=c[v+16>>2];c[u+20>>2]=c[v+20>>2];c[u+24>>2]=c[v+24>>2];c[u+28>>2]=c[v+28>>2];dV(r,C,u,f,D)}e=w+8|0;c[e>>2]=HK((c[t>>2]|0)*72|0)|0;c[w>>2]=c[t>>2];d=c[t>>2]|0;b=0;while(1){if((b|0)>=(d|0))break;D=(c[e>>2]|0)+(b*72|0)+40|0;C=f+(b<<5)|0;c[D>>2]=c[C>>2];c[D+4>>2]=c[C+4>>2];c[D+8>>2]=c[C+8>>2];c[D+12>>2]=c[C+12>>2];c[D+16>>2]=c[C+16>>2];c[D+20>>2]=c[C+20>>2];c[D+24>>2]=c[C+24>>2];c[D+28>>2]=c[C+28>>2];b=b+1|0}l6(f);c[u>>2]=c[v>>2];c[u+4>>2]=c[v+4>>2];c[u+8>>2]=c[v+8>>2];c[u+12>>2]=c[v+12>>2];c[u+16>>2]=c[v+16>>2];c[u+20>>2]=c[v+20>>2];c[u+24>>2]=c[v+24>>2];c[u+28>>2]=c[v+28>>2];c[w+16>>2]=eV(w,u)|0;l=x;return w|0}function dV(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0.0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0;q=l;l=l+128|0;p=q+96|0;o=q+64|0;j=q+32|0;r=q+16|0;s=q;m=+h[d+16>>3];n=+h[d>>3];k=+h[d+24>>3];g=+h[d+8>>3];i=c[15715]|0;Z3(c[14003]|0,i)|0;c[s>>2]=10;c[s+4>>2]=10;c[s+8>>2]=~~(m+10.0-n);c[s+12>>2]=~~(k+10.0-g);z4(i,138503,s)|0;h[r>>3]=10.0-n;h[r+8>>3]=10.0-g;z4(i,138551,r)|0;Z3(138568,i)|0;d=0;while(1){if((d|0)>=(b|0))break;v=+h[a+(d*72|0)+48>>3];u=+h[a+(d*72|0)+56>>3];t=+h[a+(d*72|0)+64>>3];h[j>>3]=+h[a+(d*72|0)+40>>3];h[j+8>>3]=v;h[j+16>>3]=u;h[j+24>>3]=t;z4(i,138587,j)|0;d=d+1|0}Z3(138605,i)|0;d=0;while(1){if((d|0)>=(f|0))break;t=+h[e+(d<<5)+8>>3];u=+h[e+(d<<5)+16>>3];v=+h[e+(d<<5)+24>>3];h[o>>3]=+h[e+(d<<5)>>3];h[o+8>>3]=t;h[o+16>>3]=u;h[o+24>>3]=v;z4(i,138624,o)|0;d=d+1|0}Z3(138642,i)|0;h[p>>3]=n;h[p+8>>3]=g;h[p+16>>3]=m;h[p+24>>3]=k;z4(i,138624,p)|0;Z3(c[14004]|0,i)|0;l=q;return}function eV(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;z=l;l=l+32|0;t=z+16|0;m=z;v=c[a>>2]|0;x=AR(v<<2|2)|0;y=Sz(56020,c[4591]|0)|0;u=Sz(56056,c[4591]|0)|0;v=HK(v<<7)|0;g=HK(c[a>>2]<<4)|0;w=a+8|0;i=b+16|0;j=m+8|0;k=b+24|0;n=b+8|0;e=0;while(1){if((e|0)>=(c[a>>2]|0))break;d=c[w>>2]|0;o=d+(e*72|0)|0;c[d+(e*72|0)+32>>2]=4;p=d+(e*72|0)+36|0;c[p>>2]=g+(e<<2<<2);f=+h[d+(e*72|0)+56>>3];q=d+(e*72|0)+40|0;r=d+(e*72|0)+48|0;if(f<+h[i>>3]){h[m>>3]=f;h[j>>3]=+h[r>>3];c[t>>2]=c[m>>2];c[t+4>>2]=c[m+4>>2];c[t+8>>2]=c[m+8>>2];c[t+12>>2]=c[m+12>>2];s=fV(x,y,t,v,1)|0;c[s+20>>2]=o;c[c[p>>2]>>2]=s}f=+h[d+(e*72|0)+64>>3];if(f<+h[k>>3]){h[m>>3]=+h[q>>3];h[j>>3]=f;c[t>>2]=c[m>>2];c[t+4>>2]=c[m+4>>2];c[t+8>>2]=c[m+8>>2];c[t+12>>2]=c[m+12>>2];s=fV(x,u,t,v,0)|0;c[s+20>>2]=o;c[(c[p>>2]|0)+4>>2]=s}if(+h[q>>3]>+h[b>>3]){c[t>>2]=c[q>>2];c[t+4>>2]=c[q+4>>2];c[t+8>>2]=c[q+8>>2];c[t+12>>2]=c[q+12>>2];s=fV(x,y,t,v,1)|0;c[s+24>>2]=o;c[(c[p>>2]|0)+8>>2]=s}if(+h[r>>3]>+h[n>>3]){c[t>>2]=c[q>>2];c[t+4>>2]=c[q+4>>2];c[t+8>>2]=c[q+8>>2];c[t+12>>2]=c[q+12>>2];s=fV(x,u,t,v,0)|0;c[s+24>>2]=o;c[(c[p>>2]|0)+12>>2]=s}e=e+1|0}o=HK(c[x>>2]<<2)|0;r=a+4|0;s=a+12|0;p=t+8|0;m=0;q=0;n=0;while(1){d=c[r>>2]|0;if((n|0)>=(d|0)){e=0;break}e=c[s>>2]|0;i=e+(n*72|0)|0;j=e+(n*72|0)+36|0;c[j>>2]=o+(m<<2);b=e+(n*72|0)+40|0;c[t>>2]=c[b>>2];c[t+4>>2]=c[b+4>>2];c[t+8>>2]=c[b+8>>2];c[t+12>>2]=c[b+12>>2];b=e+(n*72|0)+56|0;k=e+(n*72|0)+32|0;d=eb[c[u>>2]&63](u,t,512)|0;while(1){if(!d)break;if(!(+h[d+8>>3]<+h[b>>3]))break;B=c[d>>2]|0;A=c[j>>2]|0;g=c[k>>2]|0;c[k>>2]=g+1;c[A+(g<<2)>>2]=B;c[(c[d>>2]|0)+24>>2]=i;d=eb[c[u>>2]&63](u,d,8)|0}g=e+(n*72|0)+64|0;d=eb[c[y>>2]&63](y,t,512)|0;while(1){f=+h[g>>3];if(!d)break;if(!(+h[d+16>>3]>2]|0;A=c[j>>2]|0;B=c[k>>2]|0;c[k>>2]=B+1;c[A+(B<<2)>>2]=C;c[(c[d>>2]|0)+24>>2]=i;d=eb[c[y>>2]&63](y,d,8)|0}h[p>>3]=f;d=eb[c[u>>2]&63](u,t,512)|0;while(1){f=+h[b>>3];if(!d)break;if(!(+h[d+8>>3]>2]|0;B=c[j>>2]|0;C=c[k>>2]|0;c[k>>2]=C+1;c[B+(C<<2)>>2]=A;c[(c[d>>2]|0)+20>>2]=i;d=eb[c[u>>2]&63](u,d,8)|0}h[t>>3]=f;h[p>>3]=+h[e+(n*72|0)+48>>3];d=eb[c[y>>2]&63](y,t,512)|0;while(1){e=c[k>>2]|0;if(!d)break;if(!(+h[d+16>>3]<+h[g>>3]))break;B=c[d>>2]|0;C=c[j>>2]|0;c[k>>2]=e+1;c[C+(e<<2)>>2]=B;c[(c[d>>2]|0)+20>>2]=i;d=eb[c[y>>2]&63](y,d,8)|0}m=e+m|0;q=(e|0)>(q|0)?e:q;n=n+1|0}while(1){if((e|0)>=(d|0))break;gV((c[s>>2]|0)+(e*72|0)|0);e=e+1|0;d=c[r>>2]|0}d=c[x>>2]|0;C=c[x+16>>2]|0;c[C+(d*40|0)+32>>2]=d;d=d+1|0;c[C+(d*40|0)+32>>2]=d;zR(x,q);d=0;while(1){if((d|0)>=(c[a>>2]|0))break;hV((c[w>>2]|0)+(d*72|0)|0,x);d=d+1|0}Oz(y)|0;Oz(u)|0;l6(v);iV(x);xR(x);l=z;return x|0}function fV(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;h=eb[c[d>>2]&63](d,e,512)|0;do if(!h){b=BR(b)|0;if(!f)Aa(138486,138434,291,138493);else{h=c[b+32>>2]|0;i=f+(h<<5)|0;f=f+(h<<5)+8|0;c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[f+12>>2]=c[e+12>>2];c[i>>2]=b;a[b+36>>0]=g;eb[c[d>>2]&63](d,i,1)|0;break}}else i=h;while(0);return c[i>>2]|0}function gV(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0;j=b+32|0;k=b+36|0;a:do if((+h[b+64>>3]-+h[b+48>>3]+-3.0)*.5<2.0){i=c[j>>2]|0;g=0;while(1){if((g|0)>=(i|0))break a;d=c[(c[k>>2]|0)+(g<<2)>>2]|0;b:do if(a[d+36>>0]|0){f=c[d+20>>2]|0;if((f|0)==(b|0)){e=c[d+24>>2]|0;d=e;e=c[e>>2]|0;do{c[d>>2]=e|8;d=c[c[d+36>>2]>>2]|0;if(!d)break b;d=c[d+24>>2]|0;e=c[d>>2]|0}while(!(e&1|0))}else{e=f;d=c[f>>2]|0;do{c[e>>2]=d|8;d=c[(c[e+36>>2]|0)+8>>2]|0;if(!d)break b;e=c[d+20>>2]|0;d=c[e>>2]|0}while(!(d&1|0))}}while(0);g=g+1|0}}while(0);c:do if((+h[b+56>>3]-+h[b+40>>3]+-3.0)*.5<2.0){i=c[j>>2]|0;g=0;while(1){if((g|0)>=(i|0))break c;d=c[(c[k>>2]|0)+(g<<2)>>2]|0;d:do if(!(a[d+36>>0]|0)){f=c[d+20>>2]|0;if((f|0)==(b|0)){e=c[d+24>>2]|0;d=e;e=c[e>>2]|0;do{c[d>>2]=e|16;d=c[(c[d+36>>2]|0)+4>>2]|0;if(!d)break d;d=c[d+24>>2]|0;e=c[d>>2]|0}while(!(e&1|0))}else{e=f;d=c[f>>2]|0;do{c[e>>2]=d|16;d=c[(c[e+36>>2]|0)+12>>2]|0;if(!d)break d;e=c[d+20>>2]|0;d=c[e>>2]|0}while(!(d&1|0))}}while(0);g=g+1|0}}while(0);return}function hV(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0.0,i=0.0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0;g=+h[a+56>>3]-+h[a+40>>3];i=+h[a+64>>3]-+h[a+48>>3];f=(g+i)*.5+500.0;if((i+-3.0)*.5<2.0){l=(c[a>>2]&8|0)==0;f=l?16384.0:f;p=l?16384.0:g}else p=g;if((g+-3.0)*.5<2.0){l=(c[a>>2]&16|0)==0;i=l?16384.0:i;f=l?16384.0:f}l=a+36|0;d=c[l>>2]|0;e=c[d+8>>2]|0;if((e|0)!=0?(j=c[d+4>>2]|0,(j|0)!=0):0){j=CR(b,e,j,f)|0;e=a+4|0;d=c[e>>2]|0;c[e>>2]=d+1;c[a+8+(d<<2)>>2]=j;d=c[l>>2]|0}e=c[d+4>>2]|0;if((e|0)!=0?(k=c[d>>2]|0,(k|0)!=0):0){k=CR(b,e,k,f)|0;j=a+4|0;d=c[j>>2]|0;c[j>>2]=d+1;c[a+8+(d<<2)>>2]=k;d=c[l>>2]|0}e=c[d+8>>2]|0;if((e|0)!=0?(m=c[d+12>>2]|0,(m|0)!=0):0){m=CR(b,e,m,f)|0;k=a+4|0;d=c[k>>2]|0;c[k>>2]=d+1;c[a+8+(d<<2)>>2]=m;d=c[l>>2]|0}e=c[d+12>>2]|0;if((e|0)!=0?(n=c[d>>2]|0,(n|0)!=0):0){n=CR(b,e,n,f)|0;m=a+4|0;d=c[m>>2]|0;c[m>>2]=d+1;c[a+8+(d<<2)>>2]=n;d=c[l>>2]|0}e=c[d+4>>2]|0;if((e|0)!=0?(o=c[d+12>>2]|0,(o|0)!=0):0){o=CR(b,e,o,i)|0;n=a+4|0;d=c[n>>2]|0;c[n>>2]=d+1;c[a+8+(d<<2)>>2]=o;d=c[l>>2]|0}e=c[d+8>>2]|0;if(e|0?(q=c[d>>2]|0,q|0):0){b=CR(b,e,q,p)|0;o=a+4|0;q=c[o>>2]|0;c[o>>2]=q+1;c[a+8+(q<<2)>>2]=b}return}function iV(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;i=j+8|0;h=j;f=a+16|0;g=c[15715]|0;e=0;while(1){if((e|0)>=(c[a>>2]|0)){b=10;break}b=c[f>>2]|0;d=b+(e*40|0)+20|0;if((c[d>>2]|0)==0?(c[h>>2]=e,z4(g,138399,h)|0,(c[d>>2]|0)==0):0){b=5;break}b=b+(e*40|0)+24|0;if((c[b>>2]|0)==0?(c[i>>2]=e,z4(g,138451,i)|0,(c[b>>2]|0)==0):0){b=8;break}e=e+1|0}if((b|0)==5)Aa(138421,138434,311,138441);else if((b|0)==8)Aa(138473,138434,313,138441);else if((b|0)==10){l=j;return}}function jV(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0;e=+h[b+8>>3];f=+h[c+8>>3];if(!(e>f))if(!(e>3];e=+h[c>>3];if(f>e)a=1;else a=(f>31}else a=-1;else a=1;return a|0}function kV(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0;e=+h[b>>3];f=+h[c>>3];if(!(e>f))if(!(e>3];e=+h[c+8>>3];if(f>e)a=1;else a=(f>31}else a=-1;else a=1;return a|0}function lV(a){a=a|0;var b=0,d=0;d=a+8|0;l6(c[(c[d>>2]|0)+36>>2]|0);b=a+12|0;l6(c[(c[b>>2]|0)+36>>2]|0);l6(c[d>>2]|0);l6(c[b>>2]|0);ER(c[a+16>>2]|0);Oz(c[a+20>>2]|0)|0;Oz(c[a+24>>2]|0)|0;l6(a);return}function mV(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;p=l;l=l+32|0;h=p;i=b<<2;f=i+4|0;i=i+5|0;o=IK(i*56|0)|0;i=HK(i<<2)|0;g=f*5|1;j=IK(g*72|0)|0;m=g<<5;k=HK(m)|0;m=HK(m)|0;c[h>>2]=c[e>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];c[h+12>>2]=c[e+12>>2];c[h+16>>2]=c[e+16>>2];c[h+20>>2]=c[e+20>>2];c[h+24>>2]=c[e+24>>2];c[h+28>>2]=c[e+28>>2];nV(a,b,h,o,0);W4(173);oV(f,i);yV(f,o,i,g,j)|0;n=pV(f,o,j,0,k)|0;c[h>>2]=c[e>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];c[h+12>>2]=c[e+12>>2];c[h+16>>2]=c[e+16>>2];c[h+20>>2]=c[e+20>>2];c[h+24>>2]=c[e+24>>2];c[h+28>>2]=c[e+28>>2];nV(a,b,h,o,1);oV(f,i);yV(f,o,i,g,j)|0;f=pV(f,o,j,1,m)|0;g=HK(S(n<<5,f)|0)|0;b=0;a=0;while(1){if((b|0)>=(f|0))break;h=m+(b<<5)|0;e=0;while(1){if((e|0)>=(n|0))break;q=((qV(g+(a<<5)|0,h,k+(e<<5)|0)|0)!=0&1)+a|0;e=e+1|0;a=q}b=b+1|0}q=KK(g,a<<5)|0;l6(o);l6(i);l6(j);l6(k);l6(m);c[d>>2]=a;l=p;return q|0}function nV(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;j=l;l=l+96|0;h=j+64|0;i=j;c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];c[h+16>>2]=c[d+16>>2];c[h+20>>2]=c[d+20>>2];c[h+24>>2]=c[d+24>>2];c[h+28>>2]=c[d+28>>2];wV(h,f,1,i);d=xV(e,1,i)|0;g=0;while(1){if((g|0)>=(b|0))break;k=a+(g*72|0)+40|0;c[h>>2]=c[k>>2];c[h+4>>2]=c[k+4>>2];c[h+8>>2]=c[k+8>>2];c[h+12>>2]=c[k+12>>2];c[h+16>>2]=c[k+16>>2];c[h+20>>2]=c[k+20>>2];c[h+24>>2]=c[k+24>>2];c[h+28>>2]=c[k+28>>2];wV(h,f,0,i);d=xV(e,d,i)|0;g=g+1|0}l=j;return}function oV(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=0;while(1){if((d|0)>(a|0))break;c[b+(d<<2)>>2]=d;d=d+1|0}g=a+1|0;d=1;while(1){if((d|0)>(a|0))break;h=~~(+(d|0)+ +(g-d|0)*+S4());e=b+(d<<2)|0;f=b+(h<<2)|0;if((h|0)!=(d|0)){h=c[e>>2]|0;c[e>>2]=c[f>>2];c[f>>2]=h}d=d+1|0}return}function pV(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=a*5|0;j=g+1|0;l=HK(j<<2)|0;c[47459]=HK(j<<4)|0;c[47460]=HK((a*56|0)+56|0)|0;j=HK(a<<2)|0;c[47461]=j;k=0;while(1){if((k|0)>(g|0))break;if(rV(d+(k*72|0)|0,b)|0)break;k=k+1|0}h=c[47459]|0;i=c[47460]|0;g=1;while(1){if((g|0)>(a|0))break;c[h+(g<<4)+8>>2]=c[b+(g*56|0)+48>>2];m=b+(g*56|0)+44|0;c[h+(g<<4)+4>>2]=c[m>>2];c[h+(g<<4)>>2]=g;n=i+(g*56|0)|0;o=b+(g*56|0)|0;c[n>>2]=c[o>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];c[n+12>>2]=c[o+12>>2];c[i+(g*56|0)+16>>2]=c[m>>2];c[i+(g*56|0)+32>>2]=g;c[i+(g*56|0)+48>>2]=1;g=g+1|0}c[47462]=a;c[47463]=0;c[j>>2]=1;g=c[d+(k*72|0)+40>>2]|0;if((g|0)<=0){g=c[d+(k*72|0)+48>>2]|0;if((g|0)>0)g=sV(l,f,0,b,d,0,k,g,e,2)|0;else g=0}else g=sV(l,f,0,b,d,0,k,g,e,1)|0;l6(l);l6(c[47459]|0);l6(c[47460]|0);l6(c[47461]|0);return g|0}function qV(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,g=0.0;g=+h[(+h[b>>3]>+h[c>>3]?b:c)>>3];f=+h[(+h[b+16>>3]<+h[c+16>>3]?b:c)+16>>3];h[a+16>>3]=f;h[a>>3]=g;e=+h[(+h[b+8>>3]>+h[c+8>>3]?b:c)+8>>3];d=+h[(+h[b+24>>3]<+h[c+24>>3]?b:c)+24>>3];h[a+24>>3]=d;h[a+8>>3]=e;return !(g>=f)&!(e>=d)&1|0}function rV(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0;f=c[a+4>>2]|0;do if((c[a+68>>2]|0)!=2?!((f|0)<1|(c[a>>2]|0)<1):0){if(!((c[a+40>>2]|0)<1?(c[a+44>>2]|0)<1:0)){if((c[a+48>>2]|0)>=1){a=0;break}if((c[a+52>>2]|0)>=1){a=0;break}}d=+h[b+(f*56|0)+24>>3];e=+h[b+(f*56|0)+8>>3];if(!(d>e+1.0e-07))if(d>3]>+h[b+(f*56|0)>>3]&1;else a=1}else a=0;while(0);return a|0}function sV(a,b,d,e,f,g,i,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,G=0,H=0.0,I=0.0,J=0,K=0,L=0,M=0;E=(k|0)==0;D=g;a:while(1){if((i|0)<1)break;g=a+(i<<2)|0;if(c[g>>2]|0)break;c[g>>2]=1;r=f+(i*72|0)+16|0;n=+h[r>>3];x=f+(i*72|0)+32|0;o=+h[x>>3];v=f+(i*72|0)|0;y=f+(i*72|0)+4|0;if((n>o?(C=c[v>>2]|0,H=+h[e+(C*56|0)>>3],H==+h[e+(C*56|0)+16>>3]):0)?(C=c[y>>2]|0,I=+h[e+(C*56|0)>>3],I==+h[e+(C*56|0)+16>>3]):0){g=b+(d<<5)+16|0;m=b+(d<<5)+8|0;p=b+(d<<5)|0;if(E){h[p>>3]=H;h[m>>3]=o;h[g>>3]=I}else{h[p>>3]=o;h[m>>3]=-I;h[g>>3]=n;n=-H}h[b+(d<<5)+24>>3]=n;d=d+1|0}g=f+(i*72|0)+40|0;w=c[g>>2]|0;A=f+(i*72|0)+48|0;B=f+(i*72|0)+52|0;C=f+(i*72|0)+44|0;do if((w|0)<1?(c[C>>2]|0)<1:0){if((c[A>>2]|0)>0?(J=c[B>>2]|0,(J|0)>0):0){l=c[f+(J*72|0)>>2]|0;g=c[v>>2]|0;if((J|0)==(j|0)){j=tV(D,g,l)|0;d=sV(a,b,d,e,f,D,c[B>>2]|0,i,k,1)|0;g=A;l=1;break}else{j=tV(D,l,g)|0;d=sV(a,b,d,e,f,D,c[A>>2]|0,i,k,1)|0;g=B;l=1;break}}d=sV(a,b,d,e,f,D,w,i,k,2)|0;d=sV(a,b,d,e,f,D,c[C>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,D,c[A>>2]|0,i,k,1)|0;j=D;g=B;l=1}else M=19;while(0);do if((M|0)==19){M=0;s=c[A>>2]|0;if((s|0)<1?(c[B>>2]|0)<1:0){if((w|0)>0?(K=c[C>>2]|0,(K|0)>0):0){m=c[y>>2]|0;l=c[f+(w*72|0)+4>>2]|0;if((K|0)==(j|0)){j=tV(D,l,m)|0;d=sV(a,b,d,e,f,D,c[C>>2]|0,i,k,2)|0;l=2;break}else{j=tV(D,m,l)|0;d=sV(a,b,d,e,f,D,c[g>>2]|0,i,k,2)|0;g=C;l=2;break}}d=sV(a,b,d,e,f,D,w,i,k,2)|0;d=sV(a,b,d,e,f,D,c[C>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,D,c[A>>2]|0,i,k,1)|0;j=D;g=B;l=1;break}z=(l|0)==1;u=(l|0)==2;t=f+(i*72|0)+24|0;p=c[C>>2]|0;l=(p|0)>0;if((w|0)>0){if(l){if((s|0)>0?(L=c[B>>2]|0,(L|0)>0):0){m=c[f+(L*72|0)>>2]|0;l=c[f+(w*72|0)+4>>2]|0;if(z&(p|0)==(j|0)|u&(L|0)==(j|0)){j=tV(D,l,m)|0;d=sV(a,b,d,e,f,D,c[C>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,D,c[B>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,j,c[g>>2]|0,i,k,2)|0;g=A;l=1;break}else{j=tV(D,m,l)|0;d=sV(a,b,d,e,f,D,c[g>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,D,c[A>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,j,c[C>>2]|0,i,k,2)|0;g=B;l=1;break}}l=c[v>>2]|0;if(+F(+(+h[x>>3]-+h[e+(l*56|0)+24>>3]))<=1.0e-07?+F(+(+h[t>>3]-+h[e+(l*56|0)+16>>3]))<=1.0e-07:0){m=c[f+(w*72|0)+4>>2]|0;l=c[e+(l*56|0)+44>>2]|0;if(z&(w|0)==(j|0)){j=tV(D,l,m)|0;d=sV(a,b,d,e,f,D,c[g>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,j,c[A>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,j,c[C>>2]|0,i,k,2)|0;g=B;l=1;break}else{j=tV(D,m,l)|0;d=sV(a,b,d,e,f,D,c[C>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,D,c[A>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,D,c[B>>2]|0,i,k,1)|0;l=2;break}}m=c[y>>2]|0;l=c[f+(w*72|0)+4>>2]|0;if(z&(p|0)==(j|0)){j=tV(D,l,m)|0;d=sV(a,b,d,e,f,D,c[C>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,j,c[B>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,j,c[A>>2]|0,i,k,1)|0;l=2;break}else{j=tV(D,m,l)|0;d=sV(a,b,d,e,f,D,c[g>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,D,c[A>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,D,c[B>>2]|0,i,k,1)|0;g=C;l=2;break}}}else if(!l)break a;q=f+(i*72|0)+8|0;n=+h[r>>3];r=c[v>>2]|0;m=e+(r*56|0)|0;p=+F(+(n-+h[e+(r*56|0)+8>>3]))<=1.0e-07;if((s|0)>0?(G=c[B>>2]|0,(G|0)>0):0){if(p?+F(+(+h[q>>3]-+h[m>>3]))<=1.0e-07:0){l=c[f+(G*72|0)>>2]|0;if(u&(s|0)==(j|0)){j=tV(D,l,r)|0;d=sV(a,b,d,e,f,D,c[A>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,j,c[g>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,j,c[C>>2]|0,i,k,2)|0;g=B;l=1;break}else{j=tV(D,r,l)|0;d=sV(a,b,d,e,f,D,c[C>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,D,c[B>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,D,c[g>>2]|0,i,k,2)|0;g=A;l=1;break}}m=c[f+(G*72|0)>>2]|0;l=c[e+((c[y>>2]|0)*56|0)+44>>2]|0;if(u&(G|0)==(j|0)){j=tV(D,l,m)|0;d=sV(a,b,d,e,f,D,c[B>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,j,c[C>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,j,c[g>>2]|0,i,k,2)|0;g=A;l=1;break}else{j=tV(D,m,l)|0;d=sV(a,b,d,e,f,D,c[g>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,D,c[A>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,D,c[C>>2]|0,i,k,2)|0;g=B;l=1;break}}l=c[y>>2]|0;if(((p?+F(+(+h[q>>3]-+h[m>>3]))<=1.0e-07:0)?+F(+(+h[x>>3]-+h[e+(l*56|0)+8>>3]))<=1.0e-07:0)?+F(+(+h[t>>3]-+h[e+(l*56|0)>>3]))<=1.0e-07:0)if(z){j=tV(D,r,l)|0;d=sV(a,b,d,e,f,D,c[g>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,D,c[C>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,j,c[B>>2]|0,i,k,1)|0;g=A;l=1;break}else{j=tV(D,l,r)|0;d=sV(a,b,d,e,f,D,c[B>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,D,c[A>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,j,c[g>>2]|0,i,k,2)|0;g=C;l=2;break}if(((+F(+(n-+h[e+(l*56|0)+24>>3]))<=1.0e-07?+F(+(+h[q>>3]-+h[e+(l*56|0)+16>>3]))<=1.0e-07:0)?+F(+(+h[x>>3]-+h[e+(r*56|0)+24>>3]))<=1.0e-07:0)?+F(+(+h[t>>3]-+h[e+(r*56|0)+16>>3]))<=1.0e-07:0){j=c[e+(l*56|0)+44>>2]|0;l=c[e+(r*56|0)+44>>2]|0;if(z){j=tV(D,l,j)|0;d=sV(a,b,d,e,f,D,c[g>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,D,c[C>>2]|0,i,k,2)|0;d=sV(a,b,d,e,f,j,c[B>>2]|0,i,k,1)|0;g=A;l=1;break}else{j=tV(D,j,l)|0;d=sV(a,b,d,e,f,D,c[B>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,D,c[A>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,j,c[g>>2]|0,i,k,2)|0;g=C;l=2;break}}d=sV(a,b,d,e,f,D,w,i,k,2)|0;d=sV(a,b,d,e,f,D,c[A>>2]|0,i,k,1)|0;d=sV(a,b,d,e,f,D,c[C>>2]|0,i,k,2)|0;j=D;g=B;l=1}while(0);C=i;D=j;i=c[g>>2]|0;j=C}return d|0}function tV(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;f=l;l=l+16|0;r=f+4|0;i=f;e=(c[47463]|0)+1|0;c[47463]=e;m=c[47460]|0;uV(b,d,r,i);r=c[r>>2]|0;h=c[m+(b*56|0)+32+(r<<2)>>2]|0;i=c[m+(d*56|0)+32+(c[i>>2]<<2)>>2]|0;n=c[47462]|0;g=n+1|0;n=n+2|0;c[47462]=n;q=c[47459]|0;c[q+(g<<4)>>2]=b;c[q+(n<<4)>>2]=d;o=q+(h<<4)+4|0;p=q+(g<<4)+4|0;c[p>>2]=c[o>>2];c[q+(c[o>>2]<<4)+8>>2]=g;c[q+(g<<4)+8>>2]=n;c[q+(n<<4)+4>>2]=g;j=q+(i<<4)+8|0;c[q+(n<<4)+8>>2]=c[j>>2];c[q+(c[j>>2]<<4)+4>>2]=n;c[o>>2]=i;c[j>>2]=h;j=m+(b*56|0)+48|0;o=c[j>>2]|0;i=m+(d*56|0)+48|0;k=c[i>>2]|0;c[m+(b*56|0)+16+(r<<2)>>2]=d;c[m+(b*56|0)+32+(o<<2)>>2]=g;c[m+(b*56|0)+16+(o<<2)>>2]=c[q+(c[p>>2]<<4)>>2];c[m+(d*56|0)+32+(k<<2)>>2]=n;c[m+(d*56|0)+16+(k<<2)>>2]=b;c[j>>2]=(c[j>>2]|0)+1;c[i>>2]=(c[i>>2]|0)+1;d=c[47461]|0;c[d+(a<<2)>>2]=h;c[d+(e<<2)>>2]=g;l=f;return e|0}function uV(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,h=0,i=0,j=0.0,k=0.0,l=0,m=0,n=0;l=c[47460]|0;m=l+(b*56|0)|0;n=l+(a*56|0)|0;f=0;g=-4.0;i=0;while(1){if((i|0)==4)break;h=c[l+(a*56|0)+16+(i<<2)>>2]|0;if((h|0)>=1?(j=+vV(n,l+(h*56|0)|0,m),j>g):0){f=i;g=j}i=i+1|0}c[d>>2]=f;f=0;i=0;g=-4.0;while(1){if((i|0)==4)break;h=c[l+(b*56|0)+16+(i<<2)>>2]|0;if((h|0)>=1?(k=+vV(m,l+(h*56|0)|0,n),k>g):0){f=i;g=k}i=i+1|0}c[e>>2]=f;return}function vV(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,g=0.0,i=0.0,j=0.0,k=0.0;g=+h[a>>3];k=+h[b>>3]-g;j=+h[a+8>>3];i=+h[b+8>>3]-j;g=+h[c>>3]-g;j=+h[c+8>>3]-j;d=k*g+i*j;e=+G(+(k*k+i*i));f=+G(+(g*g+j*j));if(!(k*j-i*g>=0.0))d=-d/e/f+-2.0;else d=d/e/f;return +d}function wV(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0,k=0,l=0;c[e>>2]=c[a>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[e+12>>2]=c[a+12>>2];l=e+32|0;k=a+16|0;c[l>>2]=c[k>>2];c[l+4>>2]=c[k+4>>2];c[l+8>>2]=c[k+8>>2];c[l+12>>2]=c[k+12>>2];d=(d|0)==0;g=+h[a+8>>3];j=+h[k>>3];i=+h[a>>3];f=+h[a+24>>3];h[e+16>>3]=d?i:j;h[e+24>>3]=d?f:g;h[e+48>>3]=d?j:i;h[e+56>>3]=d?g:f;a:do if(b|0){a=0;while(1){if((a|0)==4)break a;k=e+(a<<4)+8|0;j=+h[k>>3];l=e+(a<<4)|0;h[k>>3]=+h[l>>3];h[l>>3]=-j;a=a+1|0}}while(0);return}function xV(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=b+3|0;i=b+1|0;j=b+2|0;f=0;g=b;while(1){if((g|0)>(h|0))break;k=g+1|0;e=a+(g*56|0)+44|0;do if((g|0)!=(b|0))if((g|0)==(h|0)){c[e>>2]=b;e=j;break}else{c[e>>2]=k;e=g+-1|0;break}else{c[e>>2]=i;e=h}while(0);c[a+(g*56|0)+48>>2]=e;c[a+(g*56|0)+32>>2]=0;m=a+(g*56|0)|0;l=d+(f<<4)|0;c[m>>2]=c[l>>2];c[m+4>>2]=c[l+4>>2];c[m+8>>2]=c[l+8>>2];c[m+12>>2]=c[l+12>>2];I6(a+(e*56|0)+16|0,l|0,16)|0;f=f+1|0;g=k}return b+4|0}function yV(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;c[47464]=e<<1;c[47465]=e;k=HK(e*80|0)|0;c[47466]=1;c[47467]=1;u6(f|0,0,e*72|0)|0;g=zV(c[d+4>>2]|0,b,f,k)|0;e=1;while(1){if((e|0)>(a|0))break;c[b+(e*56|0)+40>>2]=g;c[b+(e*56|0)+36>>2]=g;e=e+1|0}j=AV(a)|0;g=2;i=1;while(1){if((i|0)>(j|0))break;e=BV(a,i+-1|0)|0;h=BV(a,i)|0;while(1){if((e|0)>=(h|0)){e=1;break}CV(c[d+(g<<2)>>2]|0,b,f,k);e=e+1|0;g=g+1|0}while(1){if((e|0)>(a|0))break;DV(e,b,f,k);e=e+1|0}i=i+1|0}e=BV(a,j)|0;while(1){if((e|0)>=(a|0))break;CV(c[d+(g<<2)>>2]|0,b,f,k);g=g+1|0;e=e+1|0}l6(k);return c[47466]|0}function zV(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=IV()|0;c[e+(f*40|0)>>2]=2;s=e+(f*40|0)+8|0;k=b+(a*56|0)|0;l=b+(a*56|0)+16|0;MV(s,k,l);n=IV()|0;c[e+(f*40|0)+36>>2]=n;c[e+(n*40|0)>>2]=3;c[e+(n*40|0)+28>>2]=f;j=IV()|0;c[e+(f*40|0)+32>>2]=j;c[e+(j*40|0)>>2]=2;r=e+(j*40|0)+8|0;NV(r,k,l);c[e+(j*40|0)+28>>2]=f;l=IV()|0;c[e+(j*40|0)+32>>2]=l;c[e+(l*40|0)>>2]=3;c[e+(l*40|0)+28>>2]=j;k=IV()|0;c[e+(j*40|0)+36>>2]=k;c[e+(k*40|0)>>2]=1;c[e+(k*40|0)+4>>2]=a;c[e+(k*40|0)+28>>2]=j;j=IV()|0;c[e+(k*40|0)+32>>2]=j;c[e+(j*40|0)>>2]=3;c[e+(j*40|0)+28>>2]=k;g=IV()|0;c[e+(k*40|0)+36>>2]=g;c[e+(g*40|0)>>2]=3;c[e+(g*40|0)+28>>2]=k;k=HV(d)|0;i=HV(d)|0;m=HV(d)|0;o=HV(d)|0;p=d+(k*72|0)+8|0;q=d+(i*72|0)+8|0;t=d+(o*72|0)+24|0;c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2];I6(q|0,s|0,16)|0;c[p>>2]=c[q>>2];c[p+4>>2]=c[q+4>>2];c[p+8>>2]=c[q+8>>2];c[p+12>>2]=c[q+12>>2];p=d+(k*72|0)+24|0;q=d+(i*72|0)+24|0;s=d+(m*72|0)+8|0;c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];I6(q|0,r|0,16)|0;c[p>>2]=c[q>>2];c[p+4>>2]=c[q+4>>2];c[p+8>>2]=c[q+8>>2];c[p+12>>2]=c[q+12>>2];h[d+(o*72|0)+16>>3]=1073741824.0;h[d+(o*72|0)+8>>3]=1073741824.0;h[d+(m*72|0)+32>>3]=-1073741824.0;h[d+(m*72|0)+24>>3]=-1073741824.0;c[d+(i*72|0)>>2]=a;c[d+(k*72|0)+4>>2]=a;c[d+(i*72|0)+40>>2]=o;c[d+(k*72|0)+40>>2]=o;c[d+(i*72|0)+48>>2]=m;c[d+(k*72|0)+48>>2]=m;c[d+(m*72|0)+40>>2]=k;c[d+(o*72|0)+48>>2]=k;c[d+(m*72|0)+44>>2]=i;c[d+(o*72|0)+52>>2]=i;c[d+(k*72|0)+56>>2]=j;c[d+(i*72|0)+56>>2]=g;c[d+(m*72|0)+56>>2]=l;c[d+(o*72|0)+56>>2]=n;c[d+(i*72|0)+68>>2]=1;c[d+(k*72|0)+68>>2]=1;c[d+(o*72|0)+68>>2]=1;c[d+(m*72|0)+68>>2]=1;c[e+(n*40|0)+24>>2]=o;c[e+(l*40|0)+24>>2]=m;c[e+(j*40|0)+24>>2]=k;c[e+(g*40|0)+24>>2]=i;c[b+(a*56|0)+32>>2]=1;return f|0}function AV(a){a=a|0;var b=0.0;b=+(a|0);a=0;while(1){if(!(b>=1.0))break;b=+W3(b);a=a+1|0}return a+-1|0}function BV(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+(a|0);c=d;a=0;while(1){if((a|0)>=(b|0))break;c=+W3(c);a=a+1|0}return ~~+R(+(d/c))|0} +function pq(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0,s=0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0,B=0.0,C=0,D=0,E=0,F=0,I=0,J=0.0,K=0.0,L=0,M=0,N=0,O=0.0,P=0.0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0.0,Z=0,_=0.0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;ha=l;l=l+32|0;ba=ha+24|0;ca=ha+20|0;da=ha+16|0;fa=ha+12|0;ga=ha+8|0;X=ha;q=+h[e>>3];p=e+24|0;o=+h[p>>3];r=e+32|0;n=+h[r>>3];Y=+h[e+72>>3];Z=c[e+80>>2]|0;_=+h[e+88>>3];t=+h[e+96>>3];$=c[e+104>>2]|0;c[ba>>2]=0;c[ca>>2]=10;c[da>>2]=0;c[fa>>2]=0;c[ga>>2]=0;h[X>>3]=0.0;if(!((b|0)==0|(Z|0)<1)?(aa=c[b>>2]|0,m=c[b+4>>2]|0,!((a|0)<1|(m|0)<1)):0){if((m|0)<(c[e+52>>2]|0)){s=0;j=0;k=0}else{k=IK(a*80|0)|0;c[da>>2]=k;c[fa>>2]=IK(80)|0;c[ga>>2]=IK(80)|0;s=1;j=k}c[i>>2]=0;if((aa|0)==(m|0)){R=sw(b,1)|0;T=c[R+20>>2]|0;U=c[R+24>>2]|0;V=c[d+20>>2]|0;W=c[d+24>>2]|0;Q=c[d+28>>2]|0;a:do if(c[e+16>>2]|0){T4(c[e+108>>2]|0);k=S(aa,a)|0;j=0;while(1){if((j|0)>=(k|0))break a;h[g+(j<<3)>>3]=+Pw();j=j+1|0}}while(0);if(o<0.0){o=+aq(R,a,g);h[p>>3]=o}if(n<0.0){h[r>>3]=.2;n=.2}if(q>=0.0){h[e>>3]=-1.0;q=-1.0}O=1.0-q;P=+H(+o,+O);K=+H(+n,+((2.0-q)/3.0))/o;M=a<<3;L=IK(M)|0;M=S(aa,M)|0;N=IK(M)|0;F=(s|0)!=0;I=e+116|0;J=K*.2;C=q==-1.0;D=e+64|0;E=(f|0)!=0;j=0;A=0;B=0.0;z=t;b:while(1){A=A+1|0;B6(N|0,g|0,M|0)|0;if(F)j=ew(a,aa,10,g,(c[I>>2]|0)==0?0:f)|0;s=0;o=0.0;c:while(1){if((s|0)<(aa|0))k=0;else break;while(1){if((k|0)>=(a|0))break;h[L+(k<<3)>>3]=0.0;k=k+1|0}x=s+1|0;d=T+(x<<2)|0;y=S(s,a)|0;m=c[T+(s<<2)>>2]|0;while(1){if((m|0)>=(c[d>>2]|0))break;p=U+(m<<2)|0;k=c[p>>2]|0;d:do if((k|0)!=(s|0)){n=+Xw(g,a,s,k);k=0;while(1){if((k|0)>=(a|0))break d;t=n*(K*(+h[g+(k+y<<3)>>3]-+h[g+((S(c[p>>2]|0,a)|0)+k<<3)>>3]));w=L+(k<<3)|0;h[w>>3]=+h[w>>3]-t;k=k+1|0}}while(0);m=m+1|0}p=V+(x<<2)|0;d=c[V+(s<<2)>>2]|0;while(1){if((d|0)>=(c[p>>2]|0))break;r=W+(d<<2)|0;k=c[r>>2]|0;e:do if((k|0)!=(s|0)){n=+Ww(g,a,s,k);m=Q+(d<<3)|0;k=0;while(1){if((k|0)>=(a|0))break e;q=+h[m>>3];t=n-q;t=t*(t*(J*(+h[g+(k+y<<3)>>3]-+h[g+((S(c[r>>2]|0,a)|0)+k<<3)>>3])))/n;w=L+(k<<3)|0;h[w>>3]=+h[w>>3]+(n>2]|0)!=0){k=0;while(1){if((k|0)==(aa|0)){n=0.0;k=0;break f}g:do if((k|0)!=(s|0)){q=+Ww(g,a,s,k);d=f+(k<<3)|0;p=S(k,a)|0;t=q*q;m=0;while(1){if((m|0)>=(a|0))break g;r=L+(m<<3)|0;if(C)n=t;else n=+H(+q,+O);h[r>>3]=+h[r>>3]+P*+h[d>>3]*(+h[g+(m+y<<3)>>3]-+h[g+(m+p<<3)>>3])/n;m=m+1|0}}while(0);k=k+1|0}}else{k=0;while(1){if((k|0)==(aa|0)){n=0.0;k=0;break f}h:do if((k|0)!=(s|0)){q=+Ww(g,a,s,k);d=S(k,a)|0;t=q*q;m=0;while(1){if((m|0)>=(a|0))break h;p=L+(m<<3)|0;if(C)n=t;else n=+H(+q,+O);h[p>>3]=+h[p>>3]+P*(+h[g+(m+y<<3)>>3]-+h[g+(m+d<<3)>>3])/n;m=m+1|0}}while(0);k=k+1|0}}else{_v(j,+h[D>>3],g+(y<<3)|0,s,ba,ca,da,fa,ga,X,i);d=c[ba>>2]|0;if(c[i>>2]|0)break b;p=c[ga>>2]|0;r=c[fa>>2]|0;s=c[da>>2]|0;k=0;while(1){if((k|0)>=(d|0)){n=0.0;k=0;break f}q=+h[p+(k<<3)>>3];q=q>1.0e-15?q:1.0e-15;u=r+(k<<3)|0;v=S(k,a)|0;t=q*q;m=0;while(1){if((m|0)>=(a|0))break;w=L+(m<<3)|0;if(C)n=t;else n=+H(+q,+O);h[w>>3]=+h[w>>3]+P*+h[u>>3]*(+h[g+(m+y<<3)>>3]-+h[s+(m+v<<3)>>3])/n;m=m+1|0}k=k+1|0}}while(0);while(1){if((k|0)>=(a|0))break;t=+h[L+(k<<3)>>3];n=n+t*t;k=k+1|0}n=+G(+n);o=o+n;i:do if(n>0.0){k=0;while(1){if((k|0)>=(a|0)){k=0;break i}w=L+(k<<3)|0;h[w>>3]=+h[w>>3]/n;k=k+1|0}}else k=0;while(0);while(1){if((k|0)>=(a|0)){s=x;continue c}w=g+(k+y<<3)|0;h[w>>3]=+h[w>>3]+z*+h[L+(k<<3)>>3];k=k+1|0}}if(j|0)lw(j);z=+gq($,z,o,B,_);if(!((A|0)<(Z|0)&z>Y)){ea=75;break}else B=o}if((ea|0)==75?c[e+112>>2]|0:0)hq(a,R,g);l6(N);if((R|0)!=(b|0))nw(R);l6(L);j=c[da>>2]|0;k=j}else c[i>>2]=-100;if(k|0)l6(j);j=c[fa>>2]|0;if(j|0)l6(j);j=c[ga>>2]|0;if(j|0)l6(j)}l=ha;return}function qq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;n=c[b+20>>2]|0;o=c[b+24>>2]|0;p=IK(a<<3)|0;m=c[b>>2]|0;k=0;a:while(1){if((k|0)<(m|0))b=0;else break;while(1){if((b|0)>=(a|0))break;h[p+(b<<3)>>3]=0.0;b=b+1|0}l=k+1|0;j=c[n+(l<<2)>>2]|0;i=c[n+(k<<2)>>2]|0;b=0;while(1){if((i|0)>=(j|0))break;e=c[o+(i<<2)>>2]|0;if((e|0)!=(k|0)){g=S(e,a)|0;e=0;while(1){if((e|0)>=(a|0))break;q=p+(e<<3)|0;h[q>>3]=+h[d+(e+g<<3)>>3]+ +h[q>>3];e=e+1|0}b=b+1|0}i=i+1|0}if((b|0)<=0){k=l;continue}f=.5/+(b|0);e=S(k,a)|0;b=0;while(1){if((b|0)>=(a|0)){k=l;continue a}q=d+(b+e<<3)|0;h[q>>3]=+h[q>>3]*.5+f*+h[p+(b<<3)>>3];b=b+1|0}}l6(p);return}function rq(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0.0;i=c[a+20>>2]|0;j=c[a+24>>2]|0;h=c[a>>2]|0;k=IK((h<<2)+4|0)|0;a=0;while(1){if((a|0)>(h|0)){d=0;e=0;break}c[k+(a<<2)>>2]=0;a=a+1|0}while(1){if((e|0)>=(h|0))break;f=e+1|0;g=c[i+(f<<2)>>2]|0;a=0;b=c[i+(e<<2)>>2]|0;while(1){if((b|0)>=(g|0))break;a=((e|0)!=(c[j+(b<<2)>>2]|0)&1)+a|0;b=b+1|0}g=k+(a<<2)|0;e=(c[g>>2]|0)+1|0;c[g>>2]=e;d=(d|0)>(e|0)?d:e;e=f}l=+(c[k+4>>2]|0);if(l>+(d|0)*.8?l>+(h|0)*.3:0)a=1;else a=0;l6(k);return a|0}function sq(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0,f=0.0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0;o=l;l=l+48|0;n=o+16|0;j=o;g=S(b,b)|0;e=0;while(1){if((e|0)>=(g|0)){e=0;break}h[n+(e<<3)>>3]=0.0;e=e+1|0}while(1){if((e|0)>=(b|0)){g=0;break}h[j+(e<<3)>>3]=0.0;e=e+1|0}while(1){if((g|0)>=(a|0))break;i=S(g,b)|0;e=0;while(1){if((e|0)>=(b|0))break;m=j+(e<<3)|0;h[m>>3]=+h[c+(e+i<<3)>>3]+ +h[m>>3];e=e+1|0}g=g+1|0}d=+(a|0);e=0;while(1){if((e|0)>=(b|0)){g=0;break}m=j+(e<<3)|0;h[m>>3]=+h[m>>3]/d;e=e+1|0}while(1){if((g|0)>=(a|0)){i=0;break}i=S(g,b)|0;e=0;while(1){if((e|0)>=(b|0))break;m=c+(e+i<<3)|0;h[m>>3]=+h[m>>3]-+h[j+(e<<3)>>3];e=e+1|0}g=g+1|0}while(1){if((i|0)>=(a|0))break;j=S(i,b)|0;g=0;while(1){if((g|0)>=(b|0))break;k=c+(g+j<<3)|0;m=S(g,b)|0;e=0;while(1){if((e|0)==(b|0))break;p=n+(e+m<<3)|0;h[p>>3]=+h[p>>3]+ +h[k>>3]*+h[c+(e+j<<3)>>3];e=e+1|0}g=g+1|0}i=i+1|0}d=+h[n+8>>3];if(d==0.0)d=0.0;else{q=+h[n>>3];f=+h[n+24>>3];d=-(f-q-+G(+(f*f+(d*(d*4.0)+q*q-q*2.0*f))))/(d*2.0)}f=+G(+(d*d+1.0));d=d/f;f=1.0/f;e=0;while(1){if((e|0)>=(a|0))break;p=S(e,b)|0;n=c+(p<<3)|0;q=+h[n>>3];p=c+(p+1<<3)|0;r=+h[p>>3];h[n>>3]=d*q+f*r;h[p>>3]=d*r-f*q;e=e+1|0}l=o;return}function tq(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;uq(a,b,c,d,e,f,g,h,i,j);return}function uq(b,d,e,f,g,i,j,k,m,n){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;var o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;H=l;l=l+192|0;D=H+176|0;B=H+168|0;F=H;B6(F|0,f|0,168)|0;c[n>>2]=0;do if(d|0?(G=c[d+4>>2]|0,!((b|0)<1|(G|0)<1)):0){A=f+136|0;if((tw(d,0)|0)!=0?(c[d+16>>2]|0)==1:0){if((c[A>>2]|0)==1)p=yw(e)|0;else p=e;E=yw(d)|0}else t=5;do if((t|0)==5)if((c[A>>2]|0)==1){E=xw(d,0)|0;p=xw(e,0)|0;break}else{E=Nw(d)|0;p=e;break}while(0);C=f+160|0;r=c[C>>2]|0;q=(k|0)>0;if((r|0)==3){if(q)t=14}else if(q&(r|0)==4)t=14;if((t|0)==14){e=IK(S(b<<3,c[E>>2]|0)|0)|0;G=vq(E,k,m)|0;tq(b,G,0,f,0,0,e,0,0,n);wq(b,E,k,m,j,e);iu(b,E,j,i,c[f+124>>2]|0,+h[f+144>>3],c[C>>2]|0,k,m);nw(G);l6(e);if((E|0)==(d|0))break;nw(E);break}y=cx(c[f+44>>2]|0,c[f+48>>2]|0)|0;c[y+16>>2]=c[f+40>>2];z=qx(E,p,g,y)|0;r=tx(z)|0;if(!(c[r+32>>2]|0))s=j;else s=IK(S(b<<3,c[r+4>>2]|0)|0)|0;q=rq(E)|0;if(+h[f>>3]==-1.0001234){h[f>>3]=-1.0;o=(q|0)==0?-1.0:-1.8;q=f;t=20}while(1){if((t|0)==20){t=0;h[q>>3]=o}v=r+24|0;q=f+96|0;w=r+32|0;x=r+8|0;a:do switch(c[A>>2]|0){case 0:{u=c[f+132>>2]|0;switch(u|0){case 0:{kq(b,c[x>>2]|0,f,c[v>>2]|0,s,n);break a}case 2:break;default:t=24}do if((t|0)==24){t=c[x>>2]|0;if((u|0)==3?(c[t>>2]|0)>1e4:0){if(!(a[195234]|0))break;u=c[15715]|0;c[B>>2]=1e4;z4(u,92600,B)|0;break}lq(b,t,f,c[v>>2]|0,s,n);break a}while(0);fq(b,c[x>>2]|0,f,c[v>>2]|0,s,n);break}case 1:{h[q>>3]=1.0;t=f+104|0;c[t>>2]=1;I=(c[r+28>>2]|0)==0;o=I?.5:.05;c[f+80>>2]=I?500:100;I=(c[w>>2]|0)==0;u=r+12|0;mq(b,c[x>>2]|0,c[u>>2]|0,f,c[v>>2]|0,s,o,n);if(I){c[f+16>>2]=0;h[q>>3]=.05;c[t>>2]=0;mq(b,c[x>>2]|0,c[u>>2]|0,f,c[v>>2]|0,s,o*.5,n);mq(b,c[x>>2]|0,c[u>>2]|0,f,c[v>>2]|0,s,o*.125,n);mq(b,c[x>>2]|0,c[u>>2]|0,f,c[v>>2]|0,s,o*.03125,n)}break}default:{}}while(0);v=c[w>>2]|0;if(!v){t=38;break}if(c[n>>2]|0){t=34;break}t=c[r+16>>2]|0;r=c[r+40>>2]|0;if(!(c[v+32>>2]|0))u=j;else u=IK(S(b<<3,c[v+4>>2]|0)|0)|0;I=f+24|0;xq(b,c[v+8>>2]|0,t,c[v+20>>2]|0,s,u,r,+h[I>>3]*.001);l6(s);c[f+16>>2]=0;h[I>>3]=+h[I>>3]*.75;c[f+104>>2]=0;o=((c[(c[v+28>>2]|0)+40>>2]|0)+-9|0)>>>0<2?1.0:.1;r=v;s=u;t=20}if((t|0)==34)l6(s);else if((t|0)==38){Rx(b,E,f,g,j,n);q=f+124|0;if(a[195234]|0){I=c[15715]|0;c[D>>2]=c[q>>2];z4(I,92663,D)|0}if((b|0)==2)sq(G,2,j);o=+h[f+152>>3];if(o!=0.0)yq(G,b,j,o);iu(b,E,j,i,c[q>>2]|0,+h[f+144>>3],c[C>>2]|0,k,m)}B6(f|0,F|0,168)|0;if((E|0)!=(d|0))nw(E);if(!((p|0)==0|(p|0)==(e|0)))nw(p);dx(y);ex(z)}while(0);l=H;return}function vq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;y=l;l=l+16|0;x=y;u=c[a+20>>2]|0;v=c[a+24>>2]|0;w=IK(c[a>>2]<<2)|0;e=0;while(1){if((e|0)>=(c[a>>2]|0)){e=0;break}c[w+(e<<2)>>2]=1;e=e+1|0}while(1){if((e|0)>=(b|0)){e=0;d=0;break}c[w+(c[d+(e<<2)>>2]<<2)>>2]=-1;e=e+1|0}while(1){m=c[a>>2]|0;if((d|0)>=(m|0)){d=0;b=0;break}b=w+(d<<2)|0;if((c[b>>2]|0)>0){c[b>>2]=e;e=e+1|0}d=d+1|0}a:while(1){while(1){if((b|0)>=(m|0))break a;j=b+1|0;if((c[w+(b<<2)>>2]|0)<0)b=j;else break}k=c[u+(j<<2)>>2]|0;i=c[u+(b<<2)>>2]|0;while(1){if((i|0)>=(k|0)){b=j;continue a}f=c[v+(i<<2)>>2]|0;b:do if((c[w+(f<<2)>>2]|0)>-1)d=d+1|0;else{h=c[u+(f+1<<2)>>2]|0;g=c[u+(f<<2)>>2]|0;while(1){if((g|0)>=(h|0))break b;f=c[v+(g<<2)>>2]|0;if((f|0)!=(b|0))d=((c[w+(f<<2)>>2]|0)>>>31^1)+d|0;g=g+1|0}}while(0);i=i+1|0}}b=d<<2;if((d|0)>0){r=IK(b)|0;s=IK(b)|0;p=s;q=r}else{p=0;q=0;r=0;s=0}t=c[15715]|0;b=0;d=0;c:while(1){f=c[a>>2]|0;while(1){if((b|0)>=(f|0))break c;n=w+(b<<2)|0;o=b+1|0;if((c[n>>2]|0)<0)b=o;else break}m=u+(o<<2)|0;k=c[u+(b<<2)>>2]|0;while(1){if((k|0)>=(c[m>>2]|0)){b=o;continue c}f=v+(k<<2)|0;g=c[f>>2]|0;d:do if((c[w+(g<<2)>>2]|0)>-1){c[q+(d<<2)>>2]=c[n>>2];c[p+(d<<2)>>2]=c[w+(c[f>>2]<<2)>>2];d=d+1|0}else{j=u+(g+1<<2)|0;i=c[u+(g<<2)>>2]|0;while(1){if((i|0)>=(c[j>>2]|0))break d;g=v+(i<<2)|0;h=c[g>>2]|0;if((h|0)!=(b|0)?(c[w+(h<<2)>>2]|0)>-1:0){c[q+(d<<2)>>2]=c[n>>2];h=d+1|0;c[p+(d<<2)>>2]=c[w+(c[g>>2]<<2)>>2];f=c[n>>2]|0;d=c[w+(c[g>>2]<<2)>>2]|0;if((f|0)==68|(d|0)==68){c[x>>2]=f;c[x+4>>2]=d;z4(t,92681,x)|0;d=h}else d=h}i=i+1|0}}while(0);k=k+1|0}}x=Aw(d,e,e,q,p,0,8,8)|0;l6(r);l6(s);l6(w);l=y;return x|0}function wq(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0;p=IK(c[b>>2]<<2)|0;i=0;while(1){if((i|0)>=(c[b>>2]|0)){i=0;break}c[p+(i<<2)>>2]=1;i=i+1|0}while(1){if((i|0)>=(d|0)){i=0;l=0;break}j=c[e+(i<<2)>>2]|0;if((j|0)>-1?(j|0)<(c[b>>2]|0):0)c[p+(j<<2)>>2]=-1;i=i+1|0}while(1){n=c[b>>2]|0;if((l|0)>=(n|0)){m=0;break}j=p+(l<<2)|0;if((c[j>>2]|0)>-1){c[j>>2]=i;i=i+1|0}l=l+1|0}while(1){if((m|0)>=(n|0))break;i=c[p+(m<<2)>>2]|0;a:do if((i|0)>-1){j=S(i,a)|0;l=S(m,a)|0;i=0;while(1){if((i|0)>=(a|0))break a;h[f+(i+l<<3)>>3]=+h[g+(i+j<<3)>>3];i=i+1|0}}while(0);m=m+1|0}o=b+20|0;g=b+24|0;n=0;while(1){if((n|0)>=(d|0))break;b=c[e+(n<<2)>>2]|0;i=c[o>>2]|0;l=c[i+(b+1<<2)>>2]|0;i=c[i+(b<<2)>>2]|0;m=l-i|0;b=S(b,a)|0;j=0;while(1){if((j|0)>=(a|0))break;h[f+(j+b<<3)>>3]=0.0;j=j+1|0}while(1){if((i|0)<(l|0))j=0;else break;while(1){if((j|0)>=(a|0))break;k=+h[f+((S(c[(c[g>>2]|0)+(i<<2)>>2]|0,a)|0)+j<<3)>>3];q=f+(j+b<<3)|0;h[q>>3]=k+ +h[q>>3];j=j+1|0}i=i+1|0}k=+(m|0);i=0;while(1){if((i|0)>=(a|0))break;q=f+(i+b<<3)|0;h[q>>3]=+h[q>>3]/k;i=i+1|0}n=n+1|0}l6(p);return}function xq(a,b,d,e,f,g,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=+j;var k=0,m=0,n=0,o=0,p=0,q=0.0;o=l;l=l+16|0;n=o;c[n>>2]=g;Dw(d,0,f,0,n,0,a);a:do if((i+-1|0)>>>0<6){qq(a,b,c[n>>2]|0);k=c[e>>2]|0;m=c[e+20>>2]|0;g=c[e+24>>2]|0;b=0;b:while(1){if((b|0)>=(k|0))break a;i=b+1|0;e=m+(i<<2)|0;b=c[m+(b<<2)>>2]|0;c:while(1){b=b+1|0;if((b|0)>=(c[e>>2]|0)){b=i;continue b}f=g+(b<<2)|0;d=0;while(1){if((d|0)>=(a|0))continue c;q=(+Pw()+-.5)*j;p=(c[n>>2]|0)+((S(c[f>>2]|0,a)|0)+d<<3)|0;h[p>>3]=q+ +h[p>>3];d=d+1|0}}}}while(0);l=o;return}function yq(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;var e=0,f=0.0,g=0,i=0,j=0,k=0,m=0,n=0.0,o=0.0;k=l;l=l+16|0;j=k;e=0;while(1){if((e|0)>=(b|0)){g=0;break}h[j+(e<<3)>>3]=0.0;e=e+1|0}while(1){if((g|0)>=(a|0))break;i=S(g,b)|0;e=0;while(1){if((e|0)>=(b|0))break;m=j+(e<<3)|0;h[m>>3]=+h[c+(e+i<<3)>>3]+ +h[m>>3];e=e+1|0}g=g+1|0}f=+(a|0);e=0;while(1){if((e|0)>=(b|0)){g=0;break}m=j+(e<<3)|0;h[m>>3]=+h[m>>3]/f;e=e+1|0}while(1){if((g|0)>=(a|0))break;i=S(g,b)|0;e=0;while(1){if((e|0)>=(b|0))break;m=c+(e+i<<3)|0;h[m>>3]=+h[m>>3]-+h[j+(e<<3)>>3];e=e+1|0}g=g+1|0}d=d*-.017453277777777776;f=+I(+d);d=+J(+d);e=0;while(1){if((e|0)>=(a|0))break;m=S(e,b)|0;j=c+(m<<3)|0;n=+h[j>>3];m=c+(m+1<<3)|0;o=+h[m>>3];h[j>>3]=f*n+d*o;h[m>>3]=f*o-d*n;e=e+1|0}l=k;return}function zq(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=+g;i=i|0;var j=0,k=0,l=0,m=0;m=(tw(b,0)|0)!=0;j=(c[b+16>>2]|0)==1;do if(!(m&j))if(j){j=yw(sw(b,0)|0)|0;break}else{j=Nw(b)|0;break}else j=b;while(0);l=yw(j)|0;c[i>>2]=0;j=c[l>>2]|0;m=S(j,a)|0;if(!d){IK(S(a<<3,j)|0)|0;_a()}k=Dx(l,a,0.0,c[d>>2]|0,(e|0)==0?0:2,1)|0;if(!k)c[i>>2]=-1;else{h[k+40>>3]=.1;c[k+24>>2]=5;+Fx(k,a,c[d>>2]|0,f,g);e=k+32|0;j=0;while(1){if((j|0)>=(m|0))break;i=(c[d>>2]|0)+(j<<3)|0;h[i>>3]=+h[i>>3]/+h[e>>3];j=j+1|0}Ex(k)}if((l|0)!=(b|0))nw(l);return}function Aq(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=+g;h=h|0;zq(a,c,d,e,f,g,h);return}function Bq(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0;A=c[b>>2]|0;B=c[b+20>>2]|0;y=c[b+24>>2]|0;z=c[b+28>>2]|0;if(!(tw(b,0)|0))Aa(96096,92688,37,92705);a=IK(56)|0;p=a+20|0;c[p>>2]=0;c[a+24>>2]=2;c[a+12>>2]=0;o=IK(16)|0;c[p>>2]=o;h[o>>3]=e;h[o+8>>3]=f;c[a+16>>2]=105;h[a+40>>3]=.01;c[a+48>>2]=~~+G(+(+(c[b>>2]|0)));o=b+8|0;p=a+4|0;c[p>>2]=ow(A,A,(c[o>>2]|0)+A|0,1,1)|0;o=ow(A,A,(c[o>>2]|0)+A|0,1,1)|0;c[a+8>>2]=o;p=c[p>>2]|0;q=c[p+28>>2]|0;r=c[o+28>>2]|0;if((o|0)==0|(p|0)==0){Cx(a);a=0}else{s=c[p+20>>2]|0;t=c[p+24>>2]|0;u=c[o+20>>2]|0;v=c[o+24>>2]|0;c[u>>2]=0;c[s>>2]=0;m=0;d=0;while(1){if((m|0)>=(A|0))break;w=m+1|0;x=B+(w<<2)|0;e=0.0;f=0.0;n=c[B+(m<<2)>>2]|0;while(1){l=d+1|0;g=t+(d<<2)|0;b=q+(d<<3)|0;i=v+(d<<2)|0;j=r+(d<<3)|0;if((n|0)>=(c[x>>2]|0))break;k=c[y+(n<<2)>>2]|0;if((k|0)!=(m|0)){C=+h[z+(n<<3)>>3];C=C>=0.0?C:-C;C=C>.01?C:.01;c[g>>2]=k;c[i>>2]=k;h[b>>3]=-1.0;h[j>>3]=-C;e=e+ +h[b>>3];f=f-C;d=l}n=n+1|0}c[g>>2]=m;c[i>>2]=m;h[b>>3]=-e;h[j>>3]=-f;c[s+(w<<2)>>2]=l;c[u+(w<<2)>>2]=l;m=w;d=l}c[p+8>>2]=d;c[o+8>>2]=d}return a|0}function Cq(a){a=a|0;Cx(a);return}function Dq(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return +(+Gx(a,b,c,d,.001))}function Eq(a,b){a=a|0;b=+b;var d=0,e=0,f=0,g=0;if((c[a+16>>2]|0)==1)d=sw(a,0)|0;else d=Nw(a)|0;f=c[d+28>>2]|0;a:do if(b!=1.0){e=c[d+8>>2]|0;a=0;while(1){if((a|0)>=(e|0))break a;g=f+(a<<3)|0;h[g>>3]=+h[g>>3]*b;a=a+1|0}}while(0);return d|0}function Fq(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0.0;j=c[b>>2]|0;c[e>>2]=0;k=S(j,a)|0;e=0;while(1){if((e|0)>=(k|0)){e=1;f=1;break}h[d+(e<<3)>>3]=+Pw()*100.0;e=e+1|0}while(1){if((f|0)>=(j|0))break;i=S(f,a)|0;g=0;while(1){if((g|0)>=(a|0))break;l=+h[d+(g<<3)>>3]-+h[d+(g+i<<3)>>3];if((l>=0.0?l:-l)>1.0e-16){e=0;f=j;break}else g=g+1|0}f=f+1|0}a:do if(e|0){T4(1);e=0;while(1){if((e|0)>=(k|0))break a;h[d+(e<<3)>>3]=+Pw()*100.0;e=e+1|0}}while(0);e=Eq(b,1.0)|0;if(!(tw(e,0)|0))Aa(92731,92688,164,92767);else{k=Bq(0,e,0,101.0e5,100.0,0)|0;+Dq(k,a,d,300);Cq(k);k=Bq(0,e,0,101.0e3,100.0,0)|0;+Dq(k,a,d,300);Cq(k);k=Bq(0,e,0,1010.0,100.0,0)|0;+Dq(k,a,d,300);Cq(k);k=Bq(0,e,0,10.1,100.0,0)|0;+Dq(k,a,d,300);Cq(k);Zw(0.0,0.0,490.0,700.0,c[b>>2]|0,a,d);nw(e);return}}function Gq(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0;k=IK((qB(a)|0)<<4)|0;i=(e|0)!=0;j=b+8|0;g=gC(a)|0;f=0;while(1){if(!g)break;if(i)f=((h2(HB(g)|0,92782,11)|0)==0&1)+f|0;m=c[g+16>>2]|0;l=c[m+120>>2]<<1;h[k+(l<<3)>>3]=+h[m+32>>3]*.5+ +h[b>>3];h[k+((l|1)<<3)>>3]=+h[m+40>>3]*.5+ +h[j>>3];g=hC(a,g)|0}if(i&(f|0)!=0){b=IK(f<<2)|0;g=gC(a)|0;f=0;while(1){if(!g)break;if(!(h2(HB(g)|0,92782,11)|0)){c[b+(f<<2)>>2]=c[(c[g+16>>2]|0)+120>>2];f=f+1|0}g=hC(a,g)|0}c[e>>2]=b;c[d>>2]=f}return k|0}function Hq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;z=l;l=l+32|0;w=z+16|0;v=z+8|0;u=z;if(a){x=qB(a)|0;y=rB(a)|0;b=gC(a)|0;e=0;while(1){if(!b)break;c[(c[b+16>>2]|0)+120>>2]=e;b=hC(a,b)|0;e=e+1|0}r=y<<2;q=IK(r)|0;r=IK(r)|0;b=y<<3;s=IK(b)|0;o=DA(a,2,101842,0)|0;t=(d|0)!=0;if(t){e=DA(a,2,92794,0)|0;p=HK(b)|0;n=p}else{n=0;e=0;p=0}j=(o|0)==0;k=(e|0)==0;i=gC(a)|0;b=0;while(1){if(!i)break;m=c[(c[i+16>>2]|0)+120>>2]|0;g=UA(a,i)|0;while(1){if(!g)break;c[q+(b<<2)>>2]=m;c[r+(b<<2)>>2]=c[(c[(c[((c[g>>2]&3|0)==2?g:g+-48|0)+40>>2]|0)+16>>2]|0)+120>>2];if(!j?(A=OA(g,o)|0,c[v>>2]=u,(q4(A,101510,v)|0)==1):0)f=+h[u>>3];else{h[u>>3]=1.0;f=1.0}h[s+(b<<3)>>3]=f;if(!k){A=OA(g,e)|0;c[w>>2]=u;if((q4(A,101510,w)|0)==1)f=+h[u>>3];else{h[u>>3]=1.0;f=1.0}h[n+(b<<3)>>3]=f}g=WA(a,g)|0;b=b+1|0}i=hC(a,i)|0}b=Aw(y,x,x,q,r,s,1,8)|0;if(t)c[d>>2]=Aw(y,x,x,q,r,p,1,8)|0;l6(q);l6(r);l6(s);if(n)l6(p)}else b=0;l=z;return b|0}function Iq(a){a=a|0;var b=0,d=0,e=0.0,f=0,g=0.0,i=0.0,j=0.0,k=0,m=0,n=0,o=0.0,p=0.0;m=l;l=l+16|0;k=m;a:do if(Jq(a,k)|0){b=c[(c[(gC(a)|0)+16>>2]|0)+132>>2]|0;g=+h[b>>3];e=+h[b+8>>3];b=gC(a)|0;while(1){if(!b)break;f=c[(c[b+16>>2]|0)+132>>2]|0;h[f>>3]=+h[f>>3]-g;f=f+8|0;h[f>>3]=+h[f>>3]-e;b=hC(a,b)|0}b=(g!=0.0|e!=0.0)&1;d=gC(a)|0;while(1){if(!d)break a;f=UA(a,d)|0;if(f|0)break;d=hC(a,d)|0}n=c[f>>2]&3;d=c[(c[(c[((n|0)==2?f:f+-48|0)+40>>2]|0)+16>>2]|0)+132>>2]|0;f=c[(c[(c[((n|0)==3?f:f+48|0)+40>>2]|0)+16>>2]|0)+132>>2]|0;i=+h[f+8>>3];j=+h[f>>3];e=+O(+(+h[d+8>>3]-i),+(+h[d>>3]-j));e=+h[k>>3]-e;h[k>>3]=e;if(e!=0.0){g=+I(+e);e=+J(+e);b=gC(a)|0;while(1){if(!b){b=1;break a}k=c[(c[b+16>>2]|0)+132>>2]|0;p=+h[k>>3]-j;n=k+8|0;o=+h[n>>3]-i;h[k>>3]=j+(g*p-e*o);h[n>>3]=i+(e*p+g*o);b=hC(a,b)|0}}}else b=0;while(0);l=m;return b|0}function Jq(b,d){b=b|0;d=d|0;var e=0.0,f=0,g=0;g=l;l=l+16|0;f=g;b=NA(b,92798)|0;do if((b|0)!=0?(a[b>>0]|0)!=0:0){e=+b6(b,f);if((c[f>>2]|0)==(b|0))if(!((bP(b)|0)<<24>>24)){b=0;break}else e=0.0;while(1){if(!(e>180.0))break;e=e+-360.0}while(1){if(!(e<=-180.0))break;e=e+360.0}h[d>>3]=e/180.0*3.141592653589793;b=1}else b=0;while(0);l=g;return b|0}function Kq(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=NA(a,92808)|0;return Lq(a,(d|0)==0?(c|0?c:195341):d,b)|0}function Lq(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0.0;o=l;l=l+32|0;n=o+16|0;j=o+8|0;i=o;m=e+4|0;if((d|0)!=0?(a[d>>0]|0)!=0:0){f=17936;while(1){g=c[f+4>>2]|0;if(!g)break;if(!(N3(d,g,c[f+8>>2]|0)|0)){k=5;break}f=f+16|0}if((k|0)==5){if(!(c[f+12>>2]|0)){c[i>>2]=g;dA(0,92816,i)|0;f=17936}i=c[f>>2]|0;c[e>>2]=i;c[m>>2]=c[f+12>>2];if((i|0)==18)Mq(b,d+(c[f+8>>2]|0)|0,e)}if(!(c[f+4>>2]|0)){f=cP(d,63)|0;if(f<<24>>24==63){c[j>>2]=d;dA(0,92858,j)|0;f=0}else f=f&255;g=(f|0)==0;f=g&1;g=g?92905:136010;k=14}}else{f=0;g=136010;k=14}if((k|0)==14){c[e>>2]=f;c[m>>2]=g}if(a[195234]|0){k=c[15715]|0;j=c[e+8>>2]|0;p=+h[e+16>>3];c[n>>2]=c[m>>2];c[n+4>>2]=j;h[n+8>>3]=p;z4(k,92913,n)|0}l=o;return e|0}function Mq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+16|0;f=e;g=e+4|0;c[f>>2]=g;f=(q4(b,137696,f)|0)>0;b=c[g>>2]|0;c[d+8>>2]=f&(b|0)>-1?b:1e3;h[d+16>>3]=+YO(a,DA(a,0,92949,0)|0,-4.0,-1.0e10);l=e;return}function Nq(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;i=l;l=l+16|0;h=i+8|0;g=i;do if((qB(b)|0)>=2){e=Iq(b)|0;e=(Oq(b)|0)+e|0;f=c[d>>2]|0;if(f){if(a[195234]|0){f=c[15715]|0;k=HB(b)|0;j=c[d+4>>2]|0;c[g>>2]=k;c[g+4>>2]=j;z4(f,93278,g)|0;f=c[d>>2]|0}if(f>>>0>2){switch(f|0){case 3:{f=Pr(b,1)|0;break}case 4:{f=Pr(b,0)|0;break}case 6:case 5:{f=0;break}case 10:case 9:case 7:case 8:case 14:case 13:case 11:case 12:{zr(b,f)|0;f=0;break}case 15:{f=Pr(b,-1)|0;break}default:{c[h>>2]=c[d+4>>2];dA(0,93301,h)|0;f=0}}e=f+e|0;break}if(Pq(b)|0){Qq();l6(c[46887]|0);c[46887]=0;break}Rq(b);if((c[d>>2]|0)==2)f=Sq()|0;else f=Tq()|0;if(f|0)Uq();Qq();l6(c[46887]|0);c[46887]=0;e=f+e|0}}else e=0;while(0);l=i;return e|0}function Oq(b){b=b|0;var d=0,e=0.0,f=0,g=0,i=0.0,j=0,k=0,m=0,n=0;n=l;l=l+48|0;j=n+24|0;g=n+16|0;k=n;d=NA(b,141045)|0;a:do if(((d|0)!=0?(m=k+8|0,c[g>>2]=k,c[g+4>>2]=m,f=q4(d,105804,g)|0,(f|0)!=0):0)?(i=+h[k>>3],!(+F(+i)<1.0e-09)):0){if((f|0)!=1){e=+h[m>>3];if(+F(+e)<1.0e-09){d=0;break}}else{h[m>>3]=i;e=i}if(!(i==1.0&e==1.0)){if(a[195234]|0){g=c[15715]|0;h[j>>3]=i;h[j+8>>3]=e;z4(g,93461,j)|0}d=gC(b)|0;while(1){if(!d){d=1;break a}j=c[(c[d+16>>2]|0)+132>>2]|0;h[j>>3]=+h[k>>3]*+h[j>>3];j=j+8|0;h[j>>3]=+h[m>>3]*+h[j>>3];d=hC(b,d)|0}}else d=0}else d=0;while(0);l=n;return d|0}function Pq(b){b=b|0;var d=0,e=0.0,f=0.0,i=0,j=0,k=0,m=0,n=0,o=0;n=l;l=l+16|0;k=n;c[46896]=qB(b)|0;qs();c[46911]=IK((c[46896]|0)*96|0)|0;d=gC(b)|0;i=c[46911]|0;ir(k,b);e=+g[k>>2];f=+g[k+4>>2];if(!(a[k+8>>0]|0))k=1;else{k=2;e=e/72.0;f=f/72.0}j=0;while(1){if((j|0)>=(c[46896]|0)){d=0;break}o=c[(c[d+16>>2]|0)+132>>2]|0;h[i+8>>3]=+h[o>>3];h[i+16>>3]=+h[o+8>>3];if(kb[k&3](i+40|0,d,e,f)|0){m=6;break}c[i+24>>2]=j;c[i+28>>2]=1;c[i>>2]=d;c[i+88>>2]=0;i=i+96|0;j=j+1|0;d=hC(b,d)|0}if((m|0)==6){l6(c[46911]|0);c[46911]=0;d=1}l=n;return d|0}function Qq(){var a=0,b=0;a=c[46911]|0;b=0;while(1){if((b|0)>=(c[46896]|0))break;mu(a+40|0);a=a+96|0;b=b+1|0}lu();Ss();l6(c[46911]|0);return}function Rq(b){b=b|0;var d=0,e=0,f=0,g=0.0,i=0.0,j=0.0,k=0.0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0;o=l;l=l+32|0;m=o+16|0;n=o;p=c[46911]|0;i=+h[p+8>>3];k=+h[p+16>>3];f=c[46896]|0;d=p;e=1;g=i+ +h[p+40>>3];i=i+ +h[p+56>>3];j=k+ +h[p+48>>3];k=k+ +h[p+64>>3];while(1){if((e|0)>=(f|0))break;s=+h[d+104>>3];q=+h[d+112>>3];t=s+ +h[d+136>>3];r=q+ +h[d+144>>3];s=s+ +h[d+152>>3];q=q+ +h[d+160>>3];d=d+96|0;e=e+1|0;g=ti?s:i;j=rk?q:k}d=NA(b,93401)|0;if(d|0?a[d>>0]|0:0)h[173]=+a6(d);s=+h[173];t=(k-j)*s;s=(i-g)*s;h[m>>3]=g-s;h[m+8>>3]=j-t;h[n>>3]=i+s;h[n+8>>3]=k+t;ar(m,n);l=o;return}function Sq(){var b=0,d=0,e=0,f=0;e=l;l=l+16|0;d=e;if(Vq(0)|0){Wq();b=0;do{hr();b=b+1|0}while((Vq(b)|0)!=0);if(!(a[195234]|0))b=1;else{f=c[15715]|0;c[d>>2]=b;z4(f,93329,d)|0;b=1}}else b=0;l=e;return b|0}function Tq(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;i=j+8|0;h=j;d=Vq(0)|0;if(!d)b=0;else{Wq();Xq(0);Vu(0,1);b=0;f=0;e=0;while(1){Zq();e=e+1|0;g=Vq(e)|0;if(!g)break;d=(g|0)<(d|0)?0:f+1|0;c[46888]=1;if(d){_q();b=b+1|0}Xq(1);Vu(0,1);f=d;d=g}if(a[195234]|0){g=c[15715]|0;c[h>>2]=e;z4(g,93329,h)|0;c[i>>2]=b;z4(g,93356,i)|0}$q();b=1}l=j;return b|0}function Uq(){var a=0,b=0,d=0,e=0;d=c[46896]|0;a=c[46911]|0;b=0;while(1){if((b|0)>=(d|0))break;e=c[(c[(c[a>>2]|0)+16>>2]|0)+132>>2]|0;h[e>>3]=+h[a+8>>3];h[e+8>>3]=+h[a+16>>3];a=a+96|0;b=b+1|0}return}function Vq(a){a=a|0;var b=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+48|0;p=r+24|0;o=r+8|0;q=r;e=c[46911]|0;f=c[46896]|0;b=0;while(1){if((b|0)>=(f|0)){g=0;b=0;break}c[e+(b*96|0)+32>>2]=0;b=b+1|0}a:while(1){if((b|0)>=(f+-1|0))break;n=e+96|0;b=b+1|0;k=e+8|0;m=e+40|0;j=e+32|0;h=n;i=b;while(1){if((i|0)>=(f|0)){e=n;continue a}f=h+8|0;c[o>>2]=c[k>>2];c[o+4>>2]=c[k+4>>2];c[o+8>>2]=c[k+8>>2];c[o+12>>2]=c[k+12>>2];c[p>>2]=c[f>>2];c[p+4>>2]=c[f+4>>2];c[p+8>>2]=c[f+8>>2];c[p+12>>2]=c[f+12>>2];if(!(vu(o,m,p,h+40|0)|0))e=g;else{c[j>>2]=1;c[h+32>>2]=1;e=g+1|0}h=h+96|0;i=i+1|0;g=e;f=c[46896]|0}}if((d[195234]|0)>1){p=c[15715]|0;c[q>>2]=a;c[q+4>>2]=g;z4(p,93382,q)|0}l=r;return g|0}function Wq(){var a=0,b=0,d=0,e=0.0,f=0,g=0.0,i=0.0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0;fr();l=c[46890]|0;m=c[46911]|0;a=c[46887]|0;a:while(1){k=a;if(a>>>0>=l>>>0)break;b=a+4|0;if(b>>>0>=l>>>0){a=b;continue}f=c[b>>2]|0;d=c[a>>2]|0;j=+h[d>>3];if(+h[f>>3]!=j){a=b;continue}i=+h[d+8>>3];if(+h[f+8>>3]!=i){a=b;continue}f=a+8|0;d=2;while(1){if(f>>>0>=l>>>0)break;o=c[f>>2]|0;e=+h[o>>3];g=+h[o+8>>3];if(!(e==j&g==i)){n=10;break}f=f+4|0;d=d+1|0}if((n|0)==10){n=0;if(g==i){e=(e-j)/+(d|0);d=(((f>>>0>b>>>0?f:b)+-1+(0-k)|0)>>>2)+1|0;a=1;while(1){if((a|0)==(d|0)){a=f;continue a}o=c[b>>2]|0;h[o>>3]=e*+(a|0)+ +h[o>>3];a=a+1|0;b=b+4|0}}}while(1){if(b>>>0>=f>>>0){a=f;continue a}p=c[a>>2]|0;d=c[p+16>>2]|0;o=c[b>>2]|0;k=c[o+16>>2]|0;h[o>>3]=+h[p>>3]+(+h[m+(d*96|0)+56>>3]-+h[m+(d*96|0)+40>>3]+(+h[m+(k*96|0)+56>>3]-+h[m+(k*96|0)+40>>3]))*.5;b=b+4|0;a=a+4|0}}return}function Xq(a){a=a|0;var b=0.0,d=0.0,e=0.0,f=0.0,g=0,i=0,j=0,k=0;if(a|0)fr();i=c[46887]|0;j=c[i>>2]|0;e=+h[j>>3];h[23291]=e;f=+h[j>>3];h[23292]=f;k=c[46896]|0;g=1;while(1){if((g|0)>=(k|0))break;a=c[i+(g<<2)>>2]|0;d=+h[a>>3];if(d>3]}else{b=d;d=e}if(b>f)h[23292]=b;else b=f;g=g+1|0;e=d;f=b}d=+h[j+8>>3];h[23293]=d;b=+h[(c[i+(k+-1<<2)>>2]|0)+8>>3];h[23294]=b;h[23296]=b-d;h[23295]=f-e;return}function Yq(){var a=0;a=c[46889]|0;if(a>>>0<(c[46890]|0)>>>0){c[46889]=a+4;a=c[a>>2]|0}else a=0;return a|0}function Zq(){var a=0,b=0,d=0;a=c[46911]|0;br();d=(c[46888]|0)==0;b=0;while(1){if((b|0)>=(c[46896]|0))break;if(!(d?!(c[a+32>>2]|0):0))cr(a);a=a+96|0;b=b+1|0}return}function _q(){var a=0,b=0,c=0,d=0.0,e=0.0,f=0.0,g=0.0,i=0.0,j=0.0;a=l;l=l+32|0;c=a+16|0;b=a;j=+h[23287];i=+h[23285];g=+h[23288];e=+h[23286];d=(i-e)*.05;f=(j-g)*.05;h[b>>3]=j+f;h[b+8>>3]=i+d;h[c>>3]=g-f;h[c+8>>3]=e-d;ar(c,b);l=a;return}function $q(){Ds();Fs();Hu();js();return}function ar(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0.0;f=+h[a>>3];h[23288]=f;e=+h[b>>3];h[23287]=e;c=+h[a+8>>3];h[23286]=c;d=+h[b+8>>3];h[23285]=d;h[23277]=f;h[23279]=f;h[23281]=e;h[23283]=e;h[23284]=d;h[23280]=d;h[23282]=c;h[23278]=c;return}function br(){var a=0,b=0.0,d=0.0,e=0.0,f=0.0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0;m=c[46911]|0;g=m+8|0;f=+rs(g,186216);e=+rs(g,186232);d=+rs(g,186248);a=1;b=+rs(g,186264);g=m;i=m;j=m;k=m;while(1){l=m+96|0;if((a|0)>=(c[46896]|0))break;q=m+104|0;r=+rs(q,186216);n=r>2]|0;o=k+8|0;b=0.0;d=0.0;e=0.0;k=c[k>>2]|0;while(1){f=c[k>>2]|0;if(!f)break;s=k+8|0;r=f+8|0;c[g>>2]=c[o>>2];c[g+4>>2]=c[o+4>>2];c[g+8>>2]=c[o+8>>2];c[g+12>>2]=c[o+12>>2];c[i>>2]=c[s>>2];c[i+4>>2]=c[s+4>>2];c[i+8>>2]=c[s+8>>2];c[i+12>>2]=c[s+12>>2];c[j>>2]=c[r>>2];c[j+4>>2]=c[r+4>>2];c[j+8>>2]=c[r+8>>2];c[j+12>>2]=c[r+12>>2];q=+dr(g,i,j);c[g>>2]=c[o>>2];c[g+4>>2]=c[o+4>>2];c[g+8>>2]=c[o+8>>2];c[g+12>>2]=c[o+12>>2];c[i>>2]=c[s>>2];c[i+4>>2]=c[s+4>>2];c[i+8>>2]=c[s+8>>2];c[i+12>>2]=c[s+12>>2];c[j>>2]=c[r>>2];c[j+4>>2]=c[r+4>>2];c[j+8>>2]=c[r+8>>2];c[j+12>>2]=c[r+12>>2];er(g,i,j,m,n);b=b+q*+h[n>>3];d=d+q*+h[m>>3];e=e+q;k=f}h[a+8>>3]=d/e;h[a+16>>3]=b/e;l=p;return}function dr(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0;f=+h[b+8>>3];e=+h[c+8>>3];d=+h[a+8>>3];return +(+F(+(+h[c>>3]*(d-f)+(+h[a>>3]*(f-e)+ +h[b>>3]*(e-d))))*.5)}function er(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;h[d>>3]=(+h[a>>3]+ +h[b>>3]+ +h[c>>3])/3.0;h[e>>3]=(+h[a+8>>3]+ +h[b+8>>3]+ +h[c+8>>3])/3.0;return}function fr(){var a=0,b=0,d=0,e=0;a=c[46887]|0;if(!a){a=IK(c[46896]<<2)|0;c[46887]=a;c[46890]=a+(c[46896]<<2)}d=c[46911]|0;Ss();e=c[46896]|0;b=0;while(1){if((b|0)>=(e|0))break;c[a>>2]=d+8;c[d+88>>2]=0;c[d+28>>2]=1;d=d+96|0;a=a+4|0;b=b+1|0}k3(c[46887]|0,e,4,69);c[46889]=c[46887];return}function gr(a,b){a=a|0;b=b|0;var d=0.0,e=0.0;a=c[a>>2]|0;b=c[b>>2]|0;d=+h[a+8>>3];e=+h[b+8>>3];if(!(de)){e=+h[a>>3];d=+h[b>>3];if(ed&1}else a=1;else a=-1;return a|0}function hr(){var a=0,b=0,d=0,e=0;d=c[46896]|0;a=0;b=c[46911]|0;while(1){if((a|0)>=(d|0))break;e=b+8|0;h[e>>3]=+h[e>>3]*1.05;e=b+16|0;h[e>>3]=+h[e>>3]*1.05;a=a+1|0;b=b+96|0}return}function ir(b,e){b=b|0;e=e|0;var f=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0.0,q=0.0;o=l;l=l+48|0;n=o;j=o+24|0;f=NA(e,93413)|0;k=j+8|0;m=j+4|0;if(!((f|0)!=0?(jr(f,j,1.0,0.0)|0)!=0:0))i=3;do if((i|0)==3){e=NA(e,93417)|0;if(e|0?jr(e,j,.800000011920929,4.0)|0:0)break;g[m>>2]=4.0;g[j>>2]=4.0;a[k>>0]=1}while(0);if(a[195234]|0){i=c[15715]|0;q=+g[j>>2];p=+g[m>>2];c[n>>2]=d[k>>0];h[n+8>>3]=q;h[n+16>>3]=p;z4(i,93422,n)|0};c[b>>2]=c[j>>2];c[b+4>>2]=c[j+4>>2];c[b+8>>2]=c[j+8>>2];l=o;return}function jr(b,d,e,f){b=b|0;d=d|0;e=+e;f=+f;var h=0.0,i=0.0,j=0.0,k=0,m=0,n=0.0,o=0,p=0,q=0,r=0,s=0;r=l;l=l+16|0;o=r;p=r+12|0;q=r+8|0;while(1){k=a[b>>0]|0;m=b+1|0;if(!(X1(k<<24>>24)|0))break;else b=m}s=k<<24>>24==43;k=d+8|0;a[k>>0]=s&1;c[o>>2]=p;c[o+4>>2]=q;b=q4(s?m:b,93455,o)|0;if(!b)b=0;else{n=+g[p>>2];if((b|0)==1){g[q>>2]=n;h=n}else h=+g[q>>2];i=n/e;j=h/e;do if(a[k>>0]|0){if(e>1.0){g[d>>2]=i>f?f:i;h=j>f?f:j;break}if(e<1.0){g[d>>2]=i>2]=n;break}}else{g[d>>2]=i+1.0;h=j+1.0}while(0);g[d+4>>2]=h;b=1}l=r;return b|0}function kr(a,b){a=a|0;b=b|0;var c=0,d=0;d=l;l=l+32|0;c=d;if((qB(a)|0)<2)a=0;else{Lq(a,b,c)|0;a=Nq(a,c)|0}l=d;return a|0}function lr(a){a=a|0;return kr(a,NA(a,92808)|0)|0}function mr(b,e){b=b|0;e=e|0;var f=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0.0,q=0.0;o=l;l=l+48|0;n=o;j=o+24|0;f=NA(e,93417)|0;k=j+8|0;m=j+4|0;if(!((f|0)!=0?(jr(f,j,1.0,0.0)|0)!=0:0))i=3;do if((i|0)==3){e=NA(e,93413)|0;if(e|0?jr(e,j,1.25,3.200000047683716)|0:0)break;g[m>>2]=3.200000047683716;g[j>>2]=3.200000047683716;a[k>>0]=1}while(0);if(a[195234]|0){i=c[15715]|0;q=+g[j>>2];p=+g[m>>2];c[n>>2]=d[k>>0];h[n+8>>3]=q;h[n+16>>3]=p;z4(i,93484,n)|0};c[b>>2]=c[j>>2];c[b+4>>2]=c[j+4>>2];c[b+8>>2]=c[j+8>>2];l=o;return}function nr(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+16|0;o=p;h=0;while(1){if((h|0)>=(d|0))break;c[e+(h<<2)>>2]=-1;h=h+1|0}c[e+(a<<2)>>2]=0;or(f,a);a:do if(!(c[b+8>>2]|0)){h=2147483647;b:while(1){if(!((pr(f,o)|0)<<24>>24))break a;j=c[o>>2]|0;h=c[e+(j<<2)>>2]|0;i=b+(j*20|0)|0;j=b+(j*20|0)+4|0;k=h+1|0;a=1;while(1){if((a|0)>=(c[i>>2]|0))continue b;m=c[(c[j>>2]|0)+(a<<2)>>2]|0;n=e+(m<<2)|0;if((c[n>>2]|0)<0){c[n>>2]=k;qr(f,m)|0}a=a+1|0}}}else{h=2147483647;c:while(1){if(!((pr(f,o)|0)<<24>>24))break a;k=c[o>>2]|0;h=c[e+(k<<2)>>2]|0;i=b+(k*20|0)|0;j=b+(k*20|0)+4|0;k=b+(k*20|0)+8|0;a=1;while(1){if((a|0)>=(c[i>>2]|0))continue c;m=c[(c[j>>2]|0)+(a<<2)>>2]|0;n=e+(m<<2)|0;if((c[n>>2]|0)<0){c[n>>2]=~~+g[(c[k>>2]|0)+(a<<2)>>2]+h;qr(f,m)|0}a=a+1|0}}}while(0);a=h+10|0;h=0;while(1){if((h|0)>=(d|0))break;i=e+(h<<2)|0;if((c[i>>2]|0)<0)c[i>>2]=a;h=h+1|0}l=p;return}function or(a,b){a=a|0;b=b|0;c[c[a>>2]>>2]=b;c[a+12>>2]=0;c[a+8>>2]=1;return}function pr(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+12|0;e=c[d>>2]|0;if((e|0)<(c[a+8>>2]|0)){a=c[a>>2]|0;c[d>>2]=e+1;c[b>>2]=c[a+(e<<2)>>2];a=1}else a=0;return a|0}function qr(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+8|0;e=c[d>>2]|0;if((e|0)<(c[a+4>>2]|0)){a=c[a>>2]|0;c[d>>2]=e+1;c[a+(e<<2)>>2]=b;a=1}else a=0;return a|0}function rr(a,b){a=a|0;b=b|0;c[a>>2]=IK(b<<2)|0;c[a+4>>2]=b;c[a+8>>2]=0;c[a+12>>2]=0;return}function sr(a){a=a|0;l6(c[a>>2]|0);return}function tr(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,g=0,i=0,j=0;if(!(a[195234]|0))i=0;else{_3(93517,25,1,c[15715]|0)|0;i=0}while(1){if((i|0)>=(b|0))break;j=d+(i<<2)|0;g=0;f=0.0;while(1){if((g|0)==(b|0))break;if((i|0)!=(g|0))f=f+ +h[(c[j>>2]|0)+(g<<3)>>3];g=g+1|0}h[(c[j>>2]|0)+(i<<3)>>3]=-f;i=i+1|0}return tt(d,e,b+-1|0)|0}function ur(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0.0;j=rn(b,b,0.0)|0;k=rn(b,b,0.0)|0;e=gC(a)|0;while(1){if(!e)break;d=ZA(a,e)|0;while(1){if(!d)break;g=c[d>>2]&3;f=(c[c[((g|0)==3?d:d+48|0)+40>>2]>>2]|0)>>>4;g=(c[c[((g|0)==2?d:d+-48|0)+40>>2]>>2]|0)>>>4;if((f|0)!=(g|0)){l=-1.0/+h[(c[d+16>>2]|0)+136>>3];h[(c[j+(g<<2)>>2]|0)+(f<<3)>>3]=l;h[(c[j+(f<<2)>>2]|0)+(g<<3)>>3]=l}d=_A(a,d,e)|0}e=hC(a,e)|0}i=tr(b,j,k)|0;a:do if(i|0){f=a+16|0;e=0;while(1){if((e|0)>=(b|0))break a;g=k+(e<<2)|0;d=0;while(1){if((d|0)==(b|0))break;a=c[g>>2]|0;h[(c[(c[(c[f>>2]|0)+160>>2]|0)+(e<<2)>>2]|0)+(d<<3)>>3]=+h[a+(e<<3)>>3]+ +h[(c[k+(d<<2)>>2]|0)+(d<<3)>>3]-+h[a+(d<<3)>>3]*2.0;d=d+1|0}e=e+1|0}}while(0);sn(j);sn(k);return i|0}function vr(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=f|0;var g=0.0,h=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+16|0;j=s;n=d<<3;o=IK(n)|0;p=IK(n)|0;q=IK(n)|0;k=IK(n)|0;m=IK(n)|0;n=IK(n)|0;Lt(d,c,n);Et(d,n);Et(d,b);Gt(a,d,b,k);It(d,n,k,o);Lt(d,o,p);i=f+-1|0;c=0;g=+Mt(d,o,o);while(1){if((c|0)>=(f|0)){c=0;break}if(!(+Nt(d,o)>e)){c=0;break}Gt(a,d,p,q);h=+Mt(d,p,q);if(h==0.0){c=0;break}h=g/h;Kt(d,p,h,m);Jt(d,b,m,b);if((c|0)<(i|0)){Kt(d,q,h,q);It(d,o,q,o);h=+Mt(d,o,o);if(g==0.0){r=7;break}Kt(d,p,h/g,p);Jt(d,o,p,p);g=h}c=c+1|0}if((r|0)==7){dA(1,93543,j)|0;c=1}l6(o);l6(p);l6(q);l6(k);l6(m);l6(n);l=s;return c|0}function wr(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=f|0;g=g|0;var h=0.0,i=0.0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+16|0;j=s;o=d<<3;p=IK(o)|0;q=IK(o)|0;k=IK(o)|0;m=IK(o)|0;n=IK(o)|0;o=IK(o)|0;Lt(d,c,o);if(g<<24>>24){Et(d,o);Et(d,b)}Ht(a,d,b,m);It(d,o,m,p);Lt(d,p,q);g=f+-1|0;c=0;h=+Mt(d,p,p);while(1){if((c|0)>=(f|0)){c=0;break}if(!(+Nt(d,p)>e)){c=0;break}Ht(a,d,q,k);i=+Mt(d,q,k);if(i==0.0){c=0;break}i=h/i;Kt(d,q,i,n);Jt(d,b,n,b);if((c|0)<(g|0)){Kt(d,k,i,k);It(d,p,k,p);i=+Mt(d,p,p);if(h==0.0){r=9;break}Kt(d,q,i/h,q);Jt(d,p,q,q);h=i}c=c+1|0}if((r|0)==9){dA(1,93543,j)|0;c=1}l6(p);l6(q);l6(k);l6(m);l6(n);l6(o);l=s;return c|0}function xr(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=f|0;var g=0.0,h=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;j=q;k=d<<2;m=HK(k)|0;n=HK(k)|0;o=HK(k)|0;k=HK(k)|0;Pt(d,b);Pt(d,c);Qt(a,d,b,k);Pt(d,k);Rt(d,c,k,m);Vt(d,m,n);i=f+-1|0;c=0;g=+Wt(d,m,m);while(1){if((c|0)>=(f|0)){c=0;break}if(!(+Zt(d,m)>e)){c=0;break}Pt(d,n);Pt(d,b);Pt(d,m);Qt(a,d,n,o);Pt(d,o);h=+Wt(d,n,o);if(h==0.0){c=0;break}h=g/h;Tt(d,b,h,n);if((c|0)<(i|0)){Tt(d,m,-h,o);h=+Wt(d,m,m);if(g==0.0){p=7;break}Ut(d,n,h/g,n);St(d,m,n,n);g=h}c=c+1|0}if((p|0)==7){dA(1,93543,j)|0;c=1}l6(m);l6(n);l6(o);l6(k);l=q;return c|0}function yr(b,d,e,f,i,j,k,m,n,o){b=b|0;d=d|0;e=e|0;f=f|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=+o;var p=0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0,B=0,C=0,D=0,E=0,G=0,H=0.0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0.0;P=l;l=l+48|0;I=P+24|0;D=P+16|0;C=P+8|0;B=P;M=P+40|0;N=P+36|0;K=P+32|0;t=k&4;c[M>>2]=0;c[N>>2]=0;a:do if(c[b+16>>2]|0){q=0;p=0;while(1){if((q|0)>=(d|0))break;u=c[b+(q*20|0)>>2]|0;v=b+(q*20|0)+16|0;s=1;while(1){if((s|0)>=(u|0))break;if(!(p<<24>>24))p=+g[(c[v>>2]|0)+(s<<2)>>2]!=0.0;else p=1;s=s+1|0;p=p&1}q=q+1|0}if(p<<24>>24){A=(t|0)!=0;G=f+4|0;E=o>0.0;if(A){b:do if((j|0)>2){p=j+-1|0;if((ln(b,d,e,G,i,p,k,m,15)|0)<0){p=-1;break a}q=f+(p<<2)|0;p=0;while(1){if((p|0)>=(d|0))break b;h[(c[q>>2]|0)+(p<<3)>>3]=+h[(c[G>>2]|0)+(p<<3)>>3];p=p+1|0}}while(0);w=c[f>>2]|0;x=c[G>>2]|0;if((gu(b,d,x,d)|0)==0?(qy(b,d,.01,.1,x,M,N,K)|0)==0:0){y=c[K>>2]|0;if((y|0)<1){p=ln(b,d,e,f,i,j,k,m,n)|0;break}c:do if(E){s=c[M>>2]|0;t=c[N>>2]|0;u=y+-1|0;r=0.0;q=0;d:while(1){if((q|0)==(y|0))break c;p=c[t+(q<<2)>>2]|0;H=o-(r+ +h[x+(c[s+(p<<2)>>2]<<3)>>3]-+h[x+(c[s+(p+-1<<2)>>2]<<3)>>3]);r=r+(H<0.0?0.0:H);v=q+1|0;if((q|0)<(u|0))q=c[t+(v<<2)>>2]|0;else q=d;while(1){if((p|0)>=(q|0)){q=v;continue d}L=x+(c[s+(p<<2)>>2]<<3)|0;h[L>>3]=r+ +h[L>>3];p=p+1|0}}}while(0);if((j|0)==2?(Nu(b,d,x,w,+h[23315])|0)!=0:0){q=0;p=-1}else O=32}else{q=0;p=-1}}else{en(b,d,j,f,i)|0;if(!(qy(b,d,.01,.1,0,M,N,K)|0))O=32;else{q=0;p=-1}}e:do if((O|0)==32){if((d|0)==1){p=0;break a}L=IK(c[K>>2]<<2)|0;if(!n){p=0;break a}if(a[195234]|0)RO();switch(m|0){case 2:{if(a[195234]|0)_3(93591,24,1,c[15715]|0)|0;p=kn(b,d)|0;O=45;break}case 1:{p=fn(b,d)|0;if(!p){dA(0,93616,B)|0;dA(3,93665,C)|0;O=46}else J=p;break}case 3:{if(a[195234]|0)_3(93718,21,1,c[15715]|0)|0;p=gn(b,d)|0;O=45;break}default:O=46}if((O|0)==45)if(!p)O=46;else J=p;if((O|0)==46){if(a[195234]|0)_3(93740,26,1,c[15715]|0)|0;J=jn(b,d)|0}if(a[195234]|0){b=c[15715]|0;h[D>>3]=+SO();z4(b,93767,D)|0;_3(93779,25,1,b)|0;RO()}C=d+-1|0;t=(S(C,d)|0)/2|0;b=t+d|0;f:do if(!A){r=1.0;q=0;while(1){if((q|0)>=(j|0))break;s=f+(q<<2)|0;p=0;while(1){if((p|0)>=(d|0))break;H=+F(+(+h[(c[s>>2]|0)+(p<<3)>>3]));r=H>r?H:r;p=p+1|0}q=q+1|0}r=10.0/r;q=0;while(1){if((q|0)>=(j|0))break f;s=f+(q<<2)|0;p=0;while(1){if((p|0)>=(d|0))break;D=(c[s>>2]|0)+(p<<3)|0;h[D>>3]=r*+h[D>>3];p=p+1|0}q=q+1|0}}while(0);H=+(t|0);g:do if(E){p=0;r=0.0;t=0;h:while(1){if((t|0)>=(C|0))break;u=t+1|0;s=p;q=u;while(1){p=s+1|0;if((q|0)>=(d|0)){t=u;continue h}z=+ct(f,j,t,q);s=p;r=r+z/+g[J+(p<<2)>>2];q=q+1|0}}r=r/H;p=0;while(1){if((p|0)>=(b|0)){p=0;break g}E=J+(p<<2)|0;g[E>>2]=r*+g[E>>2];p=p+1|0}}else p=0;while(0);while(1){if((p|0)>=(j|0))break;Et(d,c[f+(p<<2)>>2]|0);p=p+1|0}q=c[G>>2]|0;r=+h[q>>3];p=0;while(1){if((p|0)>=(d|0))break;G=q+(p<<3)|0;h[G>>3]=+h[G>>3]-r;p=p+1|0}v=j<<2;B=IK(v)|0;x=d<<2;w=S(x,j)|0;s=IK(w)|0;p=0;while(1){if((p|0)>=(j|0))break;t=s+((S(p,d)|0)<<2)|0;c[B+(p<<2)>>2]=t;u=f+(p<<2)|0;q=0;while(1){if((q|0)>=(d|0))break;g[t+(q<<2)>>2]=+h[(c[u>>2]|0)+(q<<3)>>3];q=q+1|0}p=p+1|0}if(a[195234]|0){G=c[15715]|0;h[I>>3]=+SO();z4(G,93805,I)|0}_t(b,J);$t(b,J);m=IK(d<<3)|0;Xt(d,0.0,m);p=0;s=0;while(1){if((s|0)>=(C|0)){p=d;q=0;s=0;break}t=d-s|0;r=0.0;q=1;while(1){p=p+1|0;if((q|0)>=(t|0))break;z=+g[J+(p<<2)>>2];I=m+(q+s<<3)|0;h[I>>3]=+h[I>>3]-z;r=r+z;q=q+1|0}I=m+(s<<3)|0;h[I>>3]=+h[I>>3]-r;s=s+1|0}while(1){if((q|0)>=(d|0))break;g[J+(s<<2)>>2]=+h[m+(q<<3)>>3];I=p+s|0;p=p+-1|0;q=q+1|0;s=I}A=IK(v)|0;c[A>>2]=IK(w)|0;p=1;while(1){if((p|0)>=(j|0))break;c[A+(p<<2)>>2]=(c[A>>2]|0)+((S(p,d)|0)<<2);p=p+1|0}k=IK(x)|0;e=IK(x)|0;i=IK(b<<2)|0;q=Bu(J,d)|0;y=Gu(J,d,c[M>>2]|0,c[N>>2]|0,c[K>>2]|0)|0;s=0;z=1797693134862315708145274.0e284;p=0;while(1){if(!(s<<24>>24==0&(p|0)<(n|0)))break;Xt(d,0.0,m);au(b,J,i);w=0;u=0;while(1){if((w|0)>=(C|0)){s=0;t=d;u=0;break}x=d-w+-1|0;Yt(d,0.0,e);s=0;while(1){if((s|0)>=(j|0))break;K=B+(s<<2)|0;Yt(x,+g[(c[K>>2]|0)+(w<<2)>>2],k);Tt(x,k,-1.0,(c[K>>2]|0)+(w<<2)+4|0);_t(x,k);St(x,k,e,e);s=s+1|0}bu(x,e);s=0;while(1){if((s|0)>=(x|0))break;t=e+(s<<2)|0;r=+g[t>>2];if(r>=3402823466385288598117041.0e14|r<0.0)g[t>>2]=0.0;s=s+1|0}v=w+1|0;r=0.0;s=u;t=0;while(1){s=s+1|0;if((t|0)>=(x|0))break;K=i+(s<<2)|0;Q=+g[e+(t<<2)>>2]*+g[K>>2];g[K>>2]=Q;K=m+(v+t<<3)|0;h[K>>3]=+h[K>>3]-Q;r=r+Q;t=t+1|0}u=m+(w<<3)|0;h[u>>3]=+h[u>>3]-r;w=v;u=s}while(1){if((s|0)>=(d|0)){s=0;break}g[i+(u<<2)>>2]=+h[m+(s<<3)>>3];K=t+u|0;s=s+1|0;t=t+-1|0;u=K}while(1){if((s|0)>=(j|0)){r=0.0;s=0;break}Qt(i,d,c[B+(s<<2)>>2]|0,c[A+(s<<2)>>2]|0);s=s+1|0}while(1){if((s|0)>=(j|0))break;r=r+ +Wt(d,c[B+(s<<2)>>2]|0,c[A+(s<<2)>>2]|0);s=s+1|0}r=H+r*2.0;s=0;while(1){if((s|0)>=(j|0))break;K=B+(s<<2)|0;Qt(J,d,c[K>>2]|0,k);r=r-+Wt(d,c[K>>2]|0,k);s=s+1|0}Q=+F(+(r-z))/+F(+(z+1.0e-10));s=((p|0)>1&r>z|Q<+h[23315])&1;t=0;while(1){if((t|0)>=(j|0))break;u=c[A+(t<<2)>>2]|0;if((t|0)!=1){if(xr(J,c[B+(t<<2)>>2]|0,u,d,.001,d)|0){p=-1;break e}}else Cu(y,u,B,j,1,15,L,o)|0;t=t+1|0}z=r;p=p+1|0}l6(L);Fu(y);if(B|0){s=0;while(1){if((s|0)>=(j|0))break;u=B+(s<<2)|0;v=f+(s<<2)|0;t=0;while(1){if((t|0)>=(d|0))break;h[(c[v>>2]|0)+(t<<3)>>3]=+g[(c[u>>2]|0)+(t<<2)>>2];t=t+1|0}s=s+1|0}l6(c[B>>2]|0);l6(B)}if(A|0){l6(c[A>>2]|0);l6(A)}l6(k);l6(e);l6(m);l6(J);l6(i)}while(0);l6(c[M>>2]|0);l6(c[N>>2]|0);if(q){l6(c[q>>2]|0);l6(q)}}else O=10}else O=10;while(0);if((O|0)==10)p=ln(b,d,e,f,i,j,k,m,n)|0;l=P;return p|0}function zr(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0;m=l;l=l+48|0;f=m+24|0;g=m+12|0;d=m;i=qB(a)|0;k=IK(i*48|0)|0;ir(d,a);c[g>>2]=c[d>>2];c[g+4>>2]=c[d+4>>2];c[g+8>>2]=c[d+8>>2];d=gC(a)|0;e=k;while(1){if(!d)break;c[f>>2]=c[g>>2];c[f+4>>2]=c[g+4>>2];c[f+8>>2]=c[g+8>>2];Ar(d,e,f);d=hC(a,d)|0;e=e+48|0}a:do if(!(Br(k,i)|0))d=0;else{switch(b|0){case 9:{Dr(a,k,i,70,1);Fr(a,k,i,71,1);d=0;e=k;break}case 10:{Fr(a,k,i,71,1);Dr(a,k,i,70,1);d=0;e=k;break}case 7:{Dr(a,k,i,72,1);Fr(a,k,i,71,1);j=9;break}case 8:{j=9;break}case 13:{j=10;break}case 14:{Fr(a,k,i,71,0);Dr(a,k,i,70,0);d=0;e=k;break}case 12:{Fr(a,k,i,73,0);Dr(a,k,i,70,0);d=0;e=k;break}default:{Dr(a,k,i,72,0);Fr(a,k,i,71,0);d=0;e=k}}if((j|0)==9){Fr(a,k,i,73,1);Dr(a,k,i,70,1);j=10}if((j|0)==10){Dr(a,k,i,70,0);Fr(a,k,i,71,0);d=0;e=k}while(1){if((d|0)>=(i|0)){d=1;break a}g=c[e+16>>2]|0;j=c[(c[(c[e+20>>2]|0)+16>>2]|0)+132>>2]|0;h[j>>3]=+(c[e+12>>2]|0)/72.0/10.0;h[j+8>>3]=+(g|0)/72.0/10.0;d=d+1|0;e=e+48|0}}while(0);l6(k);l=m;return d|0}function Ar(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,i=0.0,j=0.0,k=0.0,l=0.0,m=0,n=0;f=c[b+16>>2]|0;n=c[f+132>>2]|0;l=+h[n>>3]*10.0*72.0;m=~~(l+(l>=0.0?.5:-.5));l=+h[n+8>>3]*10.0*72.0;n=~~(l+(l>=0.0?.5:-.5));l=+g[e+4>>2];i=+g[e>>2];j=+h[f+32>>3];k=+h[f+40>>3];if(!(a[e+8>>0]|0)){j=j*(i*5.0)*72.0;l=l*5.0*k*72.0;f=~~(j+(j>=0.0?.5:-.5));e=~~(l+(l>=0.0?.5:-.5))}else{j=j*.5*72.0;k=k*.5*72.0;f=~~((i+ +(~~(j+(j>=0.0?.5:-.5))|0))*10.0);e=~~((l+ +(~~(k+(k>=0.0?.5:-.5))|0))*10.0)}c[d+12>>2]=m;c[d+16>>2]=n;c[d+20>>2]=b;c[d+32>>2]=m-f;c[d+36>>2]=n-e;c[d+40>>2]=f+m;c[d+44>>2]=e+n;return}function Br(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=b+-1|0;d=0;a:while(1){if((d|0)>=(k|0)){a=0;break}j=a+48|0;d=d+1|0;g=a+32|0;h=a+40|0;i=a+36|0;f=a+44|0;a=j;e=d;while(1){if((e|0)>=(b|0)){a=j;continue a}if((((c[g>>2]|0)<=(c[a+40>>2]|0)?(c[a+32>>2]|0)<=(c[h>>2]|0):0)?(c[i>>2]|0)<=(c[a+44>>2]|0):0)?(c[a+36>>2]|0)<=(c[f>>2]|0):0){a=1;break a}a=a+48|0;e=e+1|0}}return a|0}function Cr(a,b){a=a|0;b=b|0;if((c[a+36>>2]|0)>(c[b+44>>2]|0))a=0;else a=(c[b+36>>2]|0)<=(c[a+44>>2]|0);return a&1|0}function Dr(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;i=Sz(18208,c[4594]|0)|0;g=b;h=0;while(1){if((h|0)>=(d|0))break;c[g+8>>2]=c[g+12>>2];eb[c[i>>2]&63](i,g,1)|0;g=g+48|0;h=h+1|0}if(!f)h=Lr(a,i,e,74)|0;else h=Kr(i,e,74)|0;sL(h,2,2147483647)|0;g=0;while(1){if((g|0)>=(d|0))break;f=b+12|0;a=c[(c[(c[b+24>>2]|0)+16>>2]|0)+232>>2]|0;e=a-(c[f>>2]|0)|0;c[f>>2]=a;f=b+32|0;c[f>>2]=(c[f>>2]|0)+e;f=b+40|0;c[f>>2]=(c[f>>2]|0)+e;b=b+48|0;g=g+1|0}Mr(h);Oz(i)|0;return}function Er(a,b){a=a|0;b=b|0;if((c[a+32>>2]|0)>(c[b+40>>2]|0))a=0;else a=(c[b+32>>2]|0)<=(c[a+40>>2]|0);return a&1|0}function Fr(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;i=Sz(18208,c[4594]|0)|0;g=b;h=0;while(1){if((h|0)>=(d|0))break;c[g+8>>2]=c[g+16>>2];eb[c[i>>2]&63](i,g,1)|0;g=g+48|0;h=h+1|0}if(!f)h=Lr(a,i,e,75)|0;else h=Kr(i,e,75)|0;sL(h,2,2147483647)|0;g=0;while(1){if((g|0)>=(d|0))break;f=b+16|0;a=c[(c[(c[b+24>>2]|0)+16>>2]|0)+232>>2]|0;e=a-(c[f>>2]|0)|0;c[f>>2]=a;f=b+36|0;c[f>>2]=(c[f>>2]|0)+e;f=b+44|0;c[f>>2]=(c[f>>2]|0)+e;b=b+48|0;g=g+1|0}Mr(h);Oz(i)|0;return}function Gr(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=a+32|0;e=b+32|0;if((c[a+36>>2]|0)<=(c[b+44>>2]|0)?(c[b+36>>2]|0)<=(c[a+44>>2]|0):0)if((c[a+40>>2]|0)<(c[e>>2]|0))a=1;else{g=Jr(d,e)|0;g=g-(c[b+12>>2]|0)+(c[a+12>>2]|0)|0;b=c[b+16>>2]|0;f=c[a+16>>2]|0;a=Ir(d,e)|0;a=(g|0)<=(((b|0)<(f|0)?b-f|0:f-b|0)+a|0)&1}else a=0;return a|0}function Hr(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=a+32|0;e=b+32|0;if((c[d>>2]|0)<=(c[b+40>>2]|0)?(c[e>>2]|0)<=(c[a+40>>2]|0):0)if((c[a+44>>2]|0)<(c[b+36>>2]|0))a=1;else{g=Ir(d,e)|0;g=g-(c[b+16>>2]|0)+(c[a+16>>2]|0)|0;b=c[b+12>>2]|0;f=c[a+12>>2]|0;a=Jr(d,e)|0;a=(g|0)<=(((b|0)<(f|0)?b-f|0:f-b|0)+a|0)&1}else a=0;return a|0}function Ir(a,b){a=a|0;b=b|0;return ((c[a+12>>2]|0)-(c[a+4>>2]|0)+(c[b+12>>2]|0)-(c[b+4>>2]|0)|0)/2|0|0}function Jr(a,b){a=a|0;b=b|0;return ((c[a+8>>2]|0)-(c[a>>2]|0)+(c[b+8>>2]|0)-(c[b>>2]|0)|0)/2|0|0}function Kr(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=l;l=l+16|0;v=x;c[v>>2]=c[4658];w=lB(93816,v,0)|0;RC(w,137786,280,1)|0;f=Qz(a)|0;g=-2147483647;u=0;while(1){if(!f)break;s=c[f+8>>2]|0;t=((g|0)!=(s|0)&1)+u|0;f=c[f>>2]|0;g=s;u=t}s=w+16|0;t=(u<<3)+-4|0;f=0;j=0;i=0;m=0;k=0;r=Qz(a)|0;h=-2147483647;while(1){n=k+16|0;if(!r)break;q=c[r+8>>2]|0;if((h|0)!=(q|0)){p=qC(w,HB(c[r+20>>2]|0)|0,1)|0;RC(p,137750,304,1)|0;o=p+16|0;g=c[o>>2]|0;c[g+112>>2]=r;if(!m){c[(c[s>>2]|0)+192>>2]=p;m=p}else c[(c[f+16>>2]|0)+164>>2]=p;c[g+176>>2]=0;i=j+1|0;h=HK(i<<2)|0;c[(c[o>>2]|0)+172>>2]=h;if(!k){j=i;i=p;k=p;f=p;g=m;h=q}else{c[(c[n>>2]|0)+184>>2]=0;h=HK((k|0)==(m|0)?t:u-j<<2)|0;c[(c[n>>2]|0)+180>>2]=h;h=fB(w,k,p,0,1)|0;RC(h,137763,176,1)|0;g=c[h+16>>2]|0;b[g+170>>1]=10;c[g+156>>2]=1;g=c[n>>2]|0;f=c[g+180>>2]|0;g=(c[g+184>>2]<<2)+8|0;if(!f)f=IK(g)|0;else f=KK(f,g)|0;k=c[n>>2]|0;c[k+180>>2]=f;k=k+184|0;g=c[k>>2]|0;c[k>>2]=g+1;c[f+(g<<2)>>2]=h;g=c[n>>2]|0;c[(c[g+180>>2]|0)+(c[g+184>>2]<<2)>>2]=0;g=c[o>>2]|0;f=c[g+172>>2]|0;g=(c[g+176>>2]<<2)+8|0;if(!f)f=IK(g)|0;else f=KK(f,g)|0;k=c[o>>2]|0;c[k+172>>2]=f;k=k+176|0;j=c[k>>2]|0;c[k>>2]=j+1;c[f+(j<<2)>>2]=h;j=c[o>>2]|0;c[(c[j+172>>2]|0)+(c[j+176>>2]<<2)>>2]=0;j=i;i=p;k=p;f=p;g=m;h=q}}else g=m;c[r+24>>2]=i;m=g;r=c[r>>2]|0}c[(c[n>>2]|0)+184>>2]=0;k=HK(4)|0;c[(c[n>>2]|0)+180>>2]=k;c[v>>2]=c[4658];k=lB(93863,v,0)|0;f=Qz(a)|0;while(1){if(!f)break;v=qC(k,HB(c[f+20>>2]|0)|0,1)|0;RC(v,137750,304,1)|0;c[f+28>>2]=v;c[(c[v+16>>2]|0)+112>>2]=f;f=c[f>>2]|0}f=0;j=Qz(a)|0;g=-2147483647;a:while(1){if(!j)break;i=c[j+8>>2]|0;b:do if((g|0)==(i|0))i=g;else{f=j;while(1){f=c[f>>2]|0;if(!f)break a;if((c[f+8>>2]|0)!=(i|0))break b}}while(0);h=j+28|0;g=f;while(1){if(!g)break;if(vb[d&127](j,g)|0)fB(k,c[h>>2]|0,c[g+28>>2]|0,0,1)|0;g=c[g>>2]|0}j=c[j>>2]|0;g=i}Nr(k,w,e);pB(k)|0;l=x;return w|0}function Lr(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;r=l;l=l+16|0;q=r;c[q>>2]=c[4658];q=lB(93816,q,0)|0;RC(q,137786,280,1)|0;j=q+16|0;g=Qz(d)|0;h=0;while(1){if(!g)break;i=qC(q,HB(c[g+20>>2]|0)|0,1)|0;RC(i,137750,304,1)|0;o=i+16|0;m=c[o>>2]|0;c[m+112>>2]=g;c[g+24>>2]=i;c[m+176>>2]=0;m=HK(4)|0;n=c[o>>2]|0;c[n+172>>2]=m;c[n+184>>2]=0;n=HK(4)|0;c[(c[o>>2]|0)+180>>2]=n;if(!h)c[(c[j>>2]|0)+192>>2]=i;else c[(c[h+16>>2]|0)+164>>2]=i;g=c[g>>2]|0;h=i}k=Qz(d)|0;a:while(1){if(!k)break;m=k+32|0;n=k+24|0;o=k+20|0;g=k;while(1){g=c[g>>2]|0;if(!g)break;if(vb[e&127](k,g)|0){h=vb[f&127](m,g+32|0)|0;i=fB(q,c[n>>2]|0,c[g+24>>2]|0,0,1)|0;RC(i,137763,176,1)|0;if((h|0)>=65536){p=13;break a}j=i+16|0;s=c[j>>2]|0;b[s+170>>1]=h;c[s+156>>2]=1;if(i|0?fB(a,c[o>>2]|0,c[g+20>>2]|0,0,0)|0:0)c[(c[j>>2]|0)+156>>2]=100}}k=c[k>>2]|0}if((p|0)==13)Aa(93819,93835,254,93848);k=Qz(d)|0;while(1){if(!k)break;j=c[k+24>>2]|0;m=j+16|0;j=UA(q,j)|0;while(1){if(!j)break;h=c[m>>2]|0;g=c[h+180>>2]|0;h=(c[h+184>>2]<<2)+8|0;if(!g)g=IK(h)|0;else g=KK(g,h)|0;h=c[m>>2]|0;c[h+180>>2]=g;h=h+184|0;i=c[h>>2]|0;c[h>>2]=i+1;c[g+(i<<2)>>2]=j;i=c[m>>2]|0;c[(c[i+180>>2]|0)+(c[i+184>>2]<<2)>>2]=0;i=j+-48|0;g=c[(c[((c[j>>2]&3|0)==2?j:i)+40>>2]|0)+16>>2]|0;h=c[g+172>>2]|0;g=(c[g+176>>2]<<2)+8|0;if(!h)g=IK(g)|0;else g=KK(h,g)|0;c[(c[(c[((c[j>>2]&3|0)==2?j:i)+40>>2]|0)+16>>2]|0)+172>>2]=g;f=c[(c[((c[j>>2]&3|0)==2?j:i)+40>>2]|0)+16>>2]|0;p=c[f+172>>2]|0;f=f+176|0;s=c[f>>2]|0;c[f>>2]=s+1;c[p+(s<<2)>>2]=j;s=c[(c[((c[j>>2]&3|0)==2?j:i)+40>>2]|0)+16>>2]|0;c[(c[s+172>>2]|0)+(c[s+176>>2]<<2)>>2]=0;j=WA(q,j)|0}k=c[k>>2]|0}l=r;return q|0}function Mr(a){a=a|0;var b=0,d=0,e=0,f=0;f=gC(a)|0;while(1){if(!f)break;d=f+16|0;b=c[d>>2]|0;e=c[b+172>>2]|0;if(e){l6(e);b=c[d>>2]|0}b=c[b+180>>2]|0;if(b|0)l6(b);f=hC(a,f)|0}pB(a)|0;return}function Nr(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;k=gC(a)|0;while(1){if(!k)break;n=c[(c[k+16>>2]|0)+112>>2]|0;m=c[n+24>>2]|0;n=n+32|0;o=m+16|0;l=UA(a,k)|0;while(1){if(!l)break;h=c[(c[(c[((c[l>>2]&3|0)==2?l:l+-48|0)+40>>2]|0)+16>>2]|0)+112>>2]|0;p=vb[e&127](n,h+32|0)|0;h=c[h+24>>2]|0;i=fB(d,m,h,0,1)|0;RC(i,137763,176,1)|0;j=i+16|0;f=c[j>>2]|0;c[f+156>>2]=1;g=b[f+170>>1]|0;if((g&65535|0)<(p|0)){if(!(g<<16>>16)){g=c[o>>2]|0;f=c[g+180>>2]|0;g=(c[g+184>>2]<<2)+8|0;if(!f)f=IK(g)|0;else f=KK(f,g)|0;q=c[o>>2]|0;c[q+180>>2]=f;q=q+184|0;g=c[q>>2]|0;c[q>>2]=g+1;c[f+(g<<2)>>2]=i;g=c[o>>2]|0;c[(c[g+180>>2]|0)+(c[g+184>>2]<<2)>>2]=0;h=h+16|0;g=c[h>>2]|0;f=c[g+172>>2]|0;g=(c[g+176>>2]<<2)+8|0;if(!f)f=IK(g)|0;else f=KK(f,g)|0;g=c[h>>2]|0;c[g+172>>2]=f;g=g+176|0;q=c[g>>2]|0;c[g>>2]=q+1;c[f+(q<<2)>>2]=i;f=c[h>>2]|0;c[(c[f+172>>2]|0)+(c[f+176>>2]<<2)>>2]=0;f=c[j>>2]|0}b[f+170>>1]=p}l=WA(a,l)|0}k=hC(a,k)|0}return}function Or(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;return (c[b>>2]|0)-(c[d>>2]|0)|0}function Pr(b,d){b=b|0;d=d|0;var e=0,f=0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0;x=l;l=l+64|0;t=x+24|0;r=x+16|0;q=x+52|0;p=x+40|0;s=x;v=qB(b)|0;w=IK(v*72|0)|0;ir(p,b);i=+g[p>>2];j=+g[p+4>>2];p=(a[p+8>>0]|0)!=0;if(p){i=i/72.0;j=j/72.0}e=w;f=gC(b)|0;while(1){if(!f)break;o=c[f+16>>2]|0;k=+h[o+40>>3];n=+h[o+32>>3];if(p){m=j+k*.5;k=i+n*.5}else{m=j*k*.5;k=i*n*.5}o=c[o+132>>2]|0;y=+h[o>>3];h[e>>3]=y;n=+h[o+8>>3];h[e+8>>3]=n;h[e+16>>3]=y-k;h[e+24>>3]=n-m;h[e+32>>3]=k+y;h[e+40>>3]=m+n;h[e+48>>3]=k;h[e+56>>3]=m;c[e+64>>2]=f;e=e+72|0;f=hC(b,f)|0}do if((d|0)<0){i=+Qr(w,v);if(i==0.0){l6(w);e=0;break}if(!(a[195234]|0)){k=i;j=i;u=21}else{u=c[15715]|0;h[r>>3]=i;z4(u,93866,r)|0;k=i;j=i;u=21}}else{f=Rr(w,v,q)|0;e=c[q>>2]|0;if(!e){l6(f);l6(w);e=0;break}if(!d){Tr(s,f,e);i=+h[s>>3];j=+h[s+8>>3]}else{j=+Sr(f,e);i=j}l6(f);if(!(a[195234]|0)){k=i;u=21}else{u=c[15715]|0;h[t>>3]=i;h[t+8>>3]=j;z4(u,93880,t)|0;k=i;u=21}}while(0);if((u|0)==21){e=0;f=w;while(1){if((e|0)>=(v|0))break;u=c[(c[(c[f+64>>2]|0)+16>>2]|0)+132>>2]|0;h[u>>3]=k*+h[f>>3];h[u+8>>3]=j*+h[f+8>>3];e=e+1|0;f=f+72|0}l6(w);e=1}l=x;return e|0}function Qr(a,b){a=a|0;b=b|0;var c=0.0,d=0,e=0.0,f=0.0,g=0.0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;c=0.0;d=0;a:while(1){if((d|0)>=(b|0))break;r=a+72|0;d=d+1|0;m=a+16|0;n=a+8|0;o=a+56|0;p=a+48|0;q=a+32|0;k=a+24|0;l=a+40|0;i=d;j=r;while(1){if((i|0)>=(b|0)){a=r;continue a}if(((+h[m>>3]<=+h[j+32>>3]?+h[j+16>>3]<=+h[q>>3]:0)?+h[k>>3]<=+h[j+40>>3]:0)?+h[j+24>>3]<=+h[l>>3]:0){c=0.0;break a}e=+h[a>>3];f=+h[j>>3];if(e==f)g=t;else g=(+h[p>>3]+ +h[j+48>>3])/+F(+(e-f));e=+h[n>>3];f=+h[j+8>>3];if(e==f)e=t;else e=(+h[o>>3]+ +h[j+56>>3])/+F(+(e-f));g=ec?g:c}}return +c}function Rr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0.0,i=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;k=IK((b<<4)+16|0)|0;m=0;e=0;n=k;o=b;i=k;a:while(1){if((e|0)>=(b|0))break;z=a+72|0;e=e+1|0;y=a+16|0;r=a+32|0;s=a+24|0;u=a+40|0;v=a+8|0;w=a+56|0;x=a+48|0;p=e;q=z;l=i;while(1){if((p|0)==(b|0)){a=z;i=l;continue a}if(((+h[y>>3]<=+h[q+32>>3]?+h[q+16>>3]<=+h[r>>3]:0)?+h[s>>3]<=+h[q+40>>3]:0)?+h[q+24>>3]<=+h[u>>3]:0){i=o+b|0;if((m|0)==(o|0)){k=KK(k,(i<<4)+16|0)|0;n=k;l=k}else i=o;f=+h[a>>3];g=+h[q>>3];if(!(f==g)){f=(+h[x>>3]+ +h[q+48>>3])/+F(+(f-g));if(f<1.0){f=1.0;A=13}}else{f=t;A=13}if((A|0)==13)A=0;g=+h[v>>3];j=+h[q+8>>3];if(!(g==j)){g=(+h[w>>3]+ +h[q+56>>3])/+F(+(g-j));if(g<1.0){g=1.0;A=16}}else{g=t;A=16}if((A|0)==16)A=0;m=m+1|0;h[n+(m<<4)>>3]=f;h[n+(m<<4)+8>>3]=g}else i=o;p=p+1|0;q=q+72|0;o=i}}A=KK(i,(m<<4)+16|0)|0;c[d>>2]=m;return A|0}function Sr(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0,f=0.0,g=0.0;d=1;e=0.0;while(1){c=a+16|0;if((d|0)>(b|0))break;g=+h[c>>3];f=+h[a+24>>3];f=ge?f:e;a=c}return +e}function Tr(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0,f=0,g=0,i=0.0;h[b>>3]=1.0;h[b+8>>3]=t;k3(b+16|0,c,16,76);g=IK((c<<4)+16|0)|0;h[g+(c<<4)>>3]=+h[b+(c<<4)>>3];f=c;d=1.0;while(1){h[g+(f<<4)+8>>3]=d;e=f+-1|0;if((f|0)<=0){d=t;e=0;f=0;break}h[g+(e<<4)>>3]=+h[b+(e<<4)>>3];i=+h[(+h[b+(f<<4)+8>>3]>d?b:g)+(f<<4)+8>>3];f=e;d=i}while(1){if((f|0)>(c|0))break;i=+h[g+(f<<4)>>3]*+h[g+(f<<4)+8>>3];b=i>3];h[a>>3]=+h[g+(e<<4)>>3];h[a+8>>3]=i;return}else Aa(93897,93835,832,93917)}function Ur(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+h[a>>3];d=+h[b>>3];if(!(cd)){d=+h[a+8>>3];c=+h[b+8>>3];if(dc&1}else a=1;else a=-1;return a|0}function Vr(a,b,d){a=a|0;b=b|0;d=d|0;d=l;l=l+16|0;b=d;c[b>>2]=93932;dA(1,93982,b)|0;l=d;return 0}function Wr(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=l;l=l+16|0;d=e;c[d>>2]=93932;dA(1,94010,d)|0;l=e;return 0}function Xr(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;a:do switch(d|0){case 2:{e=IK(16)|0;f=IK(24)|0;c[f+8>>2]=0;c[f+4>>2]=e;c[f>>2]=2;c[e>>2]=0;c[e+4>>2]=1;d=e+8|0;c[f+16>>2]=d;c[f+20>>2]=0;c[f+12>>2]=2;c[d>>2]=1;c[e+12>>2]=0;break}case 1:{e=IK(4)|0;f=IK(12)|0;c[f+8>>2]=0;c[f+4>>2]=e;c[f>>2]=1;c[e>>2]=0;break}default:{Vr(0,0,0)|0;a=(d|0)>0;if(!e){if(!a){f=0;break a}_a()}else{if(!a){f=0;break a}_a()}}}while(0);return f|0}function Yr(a){a=a|0;var b=0;if(a|0){b=c[a+4>>2]|0;if(b|0)l6(b);b=c[a+8>>2]|0;if(b|0)l6(b);l6(a)}return}function Zr(a){a=a|0;var b=0;if(a|0){b=c[a+4>>2]|0;if(b|0)l6(b);b=c[a+8>>2]|0;if(b|0)l6(b);b=c[a+16>>2]|0;if(b|0)l6(b);l6(a)}return}function _r(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;n=o+8|0;m=o;k=n6(c[46891]|0,d<<2)|0;c[46891]=k;f=0;while(1){if((f|0)>=(d|0))break;c[e+(f<<2)>>2]=2147483647;f=f+1|0}c[e+(a<<2)>>2]=0;h=b+(a*20|0)|0;i=b+(a*20|0)+8|0;j=b+(a*20|0)+4|0;f=1;while(1){if((f|0)>=(c[h>>2]|0))break;c[e+(c[(c[j>>2]|0)+(f<<2)>>2]<<2)>>2]=~~+g[(c[i>>2]|0)+(f<<2)>>2];f=f+1|0}$r(n,a,k,e,d);i=-2147483639;while(1){if(!((as(n,m,c[46891]|0,e)|0)<<24>>24)){f=0;break}f=c[m>>2]|0;a=c[e+(f<<2)>>2]|0;if((a|0)==2147483647){f=0;break}i=b+(f*20|0)|0;j=b+(f*20|0)+4|0;h=b+(f*20|0)+8|0;f=1;while(1){if((f|0)>=(c[i>>2]|0))break;bs(n,c[(c[j>>2]|0)+(f<<2)>>2]|0,~~+g[(c[h>>2]|0)+(f<<2)>>2]+a|0,c[46891]|0,e);f=f+1|0}i=a+10|0}while(1){if((f|0)>=(d|0))break;h=e+(f<<2)|0;if((c[h>>2]|0)==2147483647)c[h>>2]=i;f=f+1|0}cs(n);l=o;return}function $r(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;j=f+-1|0;if((f|0)==1)i=0;else i=IK(j<<2)|0;c[a>>2]=i;c[a+4>>2]=j;g=0;h=0;while(1){if((h|0)>=(f|0))break;if((h|0)!=(b|0)){c[i+(g<<2)>>2]=h;c[d+(h<<2)>>2]=g;g=g+1|0}h=h+1|0}g=(j|0)/2|0;while(1){if((g|0)<=-1)break;ds(a,g,d,e);g=g+-1|0}return}function as(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=a+4|0;if(!(c[f>>2]|0))a=0;else{g=c[a>>2]|0;c[b>>2]=c[g>>2];b=c[g+((c[f>>2]|0)+-1<<2)>>2]|0;c[g>>2]=b;c[d+(b<<2)>>2]=0;c[f>>2]=(c[f>>2]|0)+-1;ds(a,0,d,e);a=1}return a|0}function bs(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;g=f+(b<<2)|0;if((c[g>>2]|0)>(d|0)){k=e+(b<<2)|0;j=c[k>>2]|0;c[g>>2]=d;g=c[a>>2]|0;a=j;while(1){h=g+(a<<2)|0;if((a|0)<=0)break;i=a>>>1;j=c[g+(i<<2)>>2]|0;if((c[f+(j<<2)>>2]|0)<=(d|0))break;c[h>>2]=j;c[e+(j<<2)>>2]=a;a=i}c[h>>2]=b;c[k>>2]=a}return}function cs(a){a=a|0;a=c[a>>2]|0;if(a|0)l6(a);return}function ds(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;i=a+4|0;while(1){f=b<<1;g=f|1;h=c[i>>2]|0;if(!((f|0)<(h|0)?(j=c[a>>2]|0,(c[e+(c[j+(f<<2)>>2]<<2)>>2]|0)<(c[e+(c[j+(b<<2)>>2]<<2)>>2]|0)):0))f=b;if((g|0)<(h|0)){j=c[a>>2]|0;f=(c[e+(c[j+(g<<2)>>2]<<2)>>2]|0)<(c[e+(c[j+(f<<2)>>2]<<2)>>2]|0)?g:f}if((f|0)==(b|0))break;j=c[a>>2]|0;h=j+(f<<2)|0;g=c[h>>2]|0;j=j+(b<<2)|0;c[h>>2]=c[j>>2];c[j>>2]=g;c[d+(c[h>>2]<<2)>>2]=f;c[d+(c[j>>2]<<2)>>2]=b;b=f}return}function es(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0.0,m=0,n=0,o=0,p=0;p=l;l=l+16|0;m=p+8|0;n=p;c[n>>2]=0;o=IK(d<<2)|0;f=0;while(1){if((f|0)>=(d|0))break;g[e+(f<<2)>>2]=3402823466385288598117041.0e14;f=f+1|0}g[e+(a<<2)>>2]=0.0;h=c[b+(a*20|0)>>2]|0;i=b+(a*20|0)+8|0;j=b+(a*20|0)+4|0;f=1;while(1){if((f|0)>=(h|0))break;c[e+(c[(c[j>>2]|0)+(f<<2)>>2]<<2)>>2]=c[(c[i>>2]|0)+(f<<2)>>2];f=f+1|0}fs(m,a,o,e,d);a:while(1){if(!((gs(m,n,o,e)|0)<<24>>24))break;f=c[n>>2]|0;k=+g[e+(f<<2)>>2];if(k==3402823466385288598117041.0e14)break;i=b+(f*20|0)|0;j=b+(f*20|0)+4|0;h=b+(f*20|0)+8|0;f=1;while(1){if((f|0)>=(c[i>>2]|0))continue a;hs(m,c[(c[j>>2]|0)+(f<<2)>>2]|0,k+ +g[(c[h>>2]|0)+(f<<2)>>2],o,e);f=f+1|0}}cs(m);l6(o);l=p;return}function fs(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;i=f+-1|0;j=IK(i<<2)|0;c[a>>2]=j;c[a+4>>2]=i;g=0;h=0;while(1){if((h|0)>=(f|0))break;if((h|0)!=(b|0)){c[j+(g<<2)>>2]=h;c[d+(h<<2)>>2]=g;g=g+1|0}h=h+1|0}g=(i|0)/2|0;while(1){if((g|0)<=-1)break;is(a,g,d,e);g=g+-1|0}return}function gs(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=a+4|0;if(!(c[f>>2]|0))a=0;else{g=c[a>>2]|0;c[b>>2]=c[g>>2];b=c[g+((c[f>>2]|0)+-1<<2)>>2]|0;c[g>>2]=b;c[d+(b<<2)>>2]=0;c[f>>2]=(c[f>>2]|0)+-1;is(a,0,d,e);a=1}return a|0}function hs(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,l=0;h=f+(b<<2)|0;if(!(+g[h>>2]<=d)){l=e+(b<<2)|0;k=c[l>>2]|0;g[h>>2]=d;h=c[a>>2]|0;a=k;while(1){i=h+(a<<2)|0;if((a|0)<=0)break;j=a>>>1;k=c[h+(j<<2)>>2]|0;if(!(+g[f+(k<<2)>>2]>d))break;c[i>>2]=k;c[e+(k<<2)>>2]=a;a=j}c[i>>2]=b;c[l>>2]=a}return}function is(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0;j=a+4|0;while(1){f=b<<1;h=f|1;i=c[j>>2]|0;if(!((f|0)<(i|0)?(k=c[a>>2]|0,+g[e+(c[k+(f<<2)>>2]<<2)>>2]<+g[e+(c[k+(b<<2)>>2]<<2)>>2]):0))f=b;if((h|0)<(i|0)?(k=c[a>>2]|0,+g[e+(c[k+(h<<2)>>2]<<2)>>2]<+g[e+(c[k+(f<<2)>>2]<<2)>>2]):0)f=h;if((f|0)==(b|0))break;k=c[a>>2]|0;i=k+(f<<2)|0;h=c[i>>2]|0;k=k+(b<<2)|0;c[i>>2]=c[k>>2];c[k>>2]=h;c[d+(c[i>>2]<<2)>>2]=f;c[d+(c[k>>2]<<2)>>2]=b;b=f}return}function js(){cu(187568,48);c[46895]=0;return}function ks(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0,g=0,i=0.0;g=eu(187568)|0;c[g+32>>2]=a;c[g+36>>2]=b;Mu(a);Mu(b);c[g+24>>2]=0;c[g+28>>2]=0;i=+h[a>>3];f=+h[b>>3]-i;e=+h[a+8>>3];d=+h[b+8>>3]-e;b=g+16|0;h[b>>3]=i*f+e*d+(f*f+d*d)*.5;a=g+8|0;if((f>0.0?f:-f)>(d>0.0?d:-d)){h[g>>3]=1.0;e=d/f;d=f}else{h[a>>3]=1.0;e=f/d;a=g}h[a>>3]=e;h[b>>3]=+h[b>>3]/d;b=c[46895]|0;c[g+40>>2]=b;c[46895]=b+1;return g|0}function ls(a){a=a|0;var b=0.0,d=0.0,e=0,f=0,g=0.0,i=0.0,j=0.0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0;r=+h[a>>3];l=r==1.0;q=a+8|0;e=c[a+28>>2]|0;f=c[a+24>>2]|0;if(l?+h[q>>3]>=0.0:0)p=f;else{p=e;e=f}f=(e|0)!=0;n=(p|0)!=0;t=a+16|0;o=p+8|0;k=e+8|0;a:do if(l){do if(f){d=+h[k>>3];if(d>+h[23285])break a;g=+h[23286];if(!(d>=g)){d=g;b=+h[t>>3]-g*+h[q>>3];break}else{b=+h[e>>3];break}}else{g=+h[23286];d=g;b=+h[t>>3]-g*+h[q>>3]}while(0);do if(n){i=+h[o>>3];if(i>3]-g*+h[q>>3];break}else{g=+h[p>>3];break}}else{g=+h[23285];i=g;g=+h[t>>3]-g*+h[q>>3]}while(0);j=+h[23287];e=b>j;f=g>j;m=+h[23288];if(!(e&f|b>3]-j)/+h[q>>3];b=j}if(b>3]-m)/+h[q>>3];b=m}if(f){i=(+h[t>>3]-j)/+h[q>>3];g=j}if(g>3]-m)/+h[q>>3];g=m;s=47}else s=47}}else{do if(f){b=+h[e>>3];if(b>+h[23287])break a;i=+h[23288];if(!(b>=i)){d=+h[t>>3]-r*i;b=i;break}else{d=+h[k>>3];break}}else{i=+h[23288];d=+h[t>>3]-r*i;b=i}while(0);do if(n){g=+h[p>>3];if(g>3]-r*j;g=j;break}else{i=+h[o>>3];break}}else{g=+h[23287];i=+h[t>>3]-r*g}while(0);j=+h[23285];e=d>j;f=i>j;m=+h[23286];if(!(e&f|d>3]-j)/r}if(d>3]-m)/r}if(f){i=j;g=(+h[t>>3]-j)/r}if(i>3]-m)/r;s=47}else s=47}}while(0);if((s|0)==47)ms(a,b,d,g,i);return}function ms(a,b,d,e,f){a=a|0;b=+b;d=+d;e=+e;f=+f;var g=0;g=a+32|0;Ts(c[g>>2]|0,b,d);Ts(c[g>>2]|0,e,f);a=a+36|0;Ts(c[a>>2]|0,b,d);Ts(c[a>>2]|0,e,f);return}function ns(a,b,d){a=a|0;b=b|0;d=d|0;c[a+24+(b<<2)>>2]=d;Mu(d);if(c[a+24+(1-b<<2)>>2]|0){ls(a);Lu(c[a+32>>2]|0);Lu(c[a+36>>2]|0);fu(a,187568)}return}function os(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;p=l;l=l+16|0;o=p;m=b<<2;h=IK(S(m,d)|0)|0;g=c[e>>2]|0;m=IK(m)|0;n=c[a+8>>2]|0;if(g|0){l6(c[g>>2]|0);l6(g)}k=IK(d<<2)|0;c[e>>2]=k;g=0;while(1){if((g|0)>=(d|0))break;c[k+(g<<2)>>2]=h+((S(g,b)|0)<<2);g=g+1|0}j=(f|0)!=0;if(j)at(a,b);e=(U4()|0)%(b|0)|0;rr(o,b);g=c[k>>2]|0;if(j){_r(e,a,b,g);f=0;g=0}else{nr(e,a,b,g,o);f=0;g=0}while(1){if((g|0)>=(b|0)){i=1;break}h=c[(c[k>>2]|0)+(g<<2)>>2]|0;c[m+(g<<2)>>2]=h;i=(h|0)>(f|0);f=i?h:f;e=i?g:e;g=g+1|0}while(1){if((i|0)>=(d|0))break;h=k+(i<<2)|0;g=c[h>>2]|0;if(j){_r(e,a,b,g);g=0;f=0}else{nr(e,a,b,g,o);g=0;f=0}while(1){if((g|0)>=(b|0))break;s=m+(g<<2)|0;q=c[s>>2]|0;r=c[(c[h>>2]|0)+(g<<2)>>2]|0;r=(q|0)<(r|0)?q:r;c[s>>2]=r;s=(r|0)>(f|0);q=s?g:e;g=g+1|0;f=s?r:f;e=q}i=i+1|0}l6(m);if(j)bt(a,b,n);l=p;return}function ps(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,h=0,i=0.0,j=0,k=0;i=+(b|0);h=0;while(1){if((h|0)>=(d|0))break;j=a+(h<<2)|0;e=0.0;f=0;while(1){if((f|0)>=(b|0))break;e=e+ +(c[(c[j>>2]|0)+(f<<2)>>2]|0);f=f+1|0}g=~~(e/i);f=0;while(1){if((f|0)>=(b|0))break;k=(c[j>>2]|0)+(f<<2)|0;c[k>>2]=(c[k>>2]|0)-g;f=f+1|0}h=h+1|0}return}function qs(){c[46897]=~~+G(+(+((c[46896]|0)+4|0)));return}function rs(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+h[a>>3]-+h[b>>3];c=+h[a+8>>3]-+h[b+8>>3];return +(d*d+c*c)}function ss(a,b,c){a=a|0;b=b|0;c=c|0;h[a>>3]=+h[b>>3]-+h[c>>3];h[a+8>>3]=+h[b+8>>3]-+h[c+8>>3];return}function ts(a,b,c){a=a|0;b=b|0;c=c|0;h[a>>3]=+h[b>>3]+ +h[c>>3];h[a+8>>3]=+h[b+8>>3]+ +h[c+8>>3];return}function us(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0;e=+h[b+8>>3];d=+h[b>>3];return +((+h[a+8>>3]-e)*(+h[c>>3]-d)-(+h[c+8>>3]-e)*(+h[a>>3]-d))}function vs(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=l;l=l+48|0;f=e+32|0;g=e+16|0;h=e;c[h>>2]=c[a>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[h+12>>2]=c[a+12>>2];c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];d=+us(h,g,f)>0.0&1;l=e;return d|0}function ws(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0;o=+h[a>>3];p=+h[d+8>>3];q=+h[c+8>>3];m=o*(p-q);n=+h[b>>3];l=+h[d>>3];k=+h[b+8>>3];i=+h[a+8>>3];j=k-i;f=+h[c>>3];g=f*(i-k)+(m+n*(q-p)+l*j);if(g==0.0)d=0;else{p=(l*(q-i)+(m+f*(i-p)))/g;q=-(f*j+(o*(q-k)+n*(i-q)))/g;h[e>>3]=o+(n-o)*p;h[e+8>>3]=i+j*p;d=q<=1.0&(q>=0.0&(p>=0.0&p<=1.0))&1}return d|0}function xs(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0.0,g=0,i=0;c[a+20>>2]=b;Mu(b);i=a+24|0;h[i>>3]=+h[b+8>>3]+d;e=c[46898]|0;e=e+((ys(a)|0)*40|0)|0;while(1){g=e+32|0;e=c[g>>2]|0;if(!e){e=0;break}d=+h[i>>3];f=+h[e+24>>3];if(d>f)continue;if(!(d==f))break;if(!(+h[b>>3]>+h[c[e+20>>2]>>3]))break}c[a+32>>2]=e;c[g>>2]=a;c[46899]=(c[46899]|0)+1;return}function ys(a){a=a|0;var b=0.0,d=0,e=0.0;d=c[46900]|0;e=+(d|0);b=(+h[a+24>>3]-+h[23293])/+h[23296]*e;do if(!(b<0.0))if(!(b>=e)){a=~~b;break}else{a=d+-1|0;break}else a=0;while(0);if((a|0)<(c[46901]|0))c[46901]=a;return a|0}function zs(a){a=a|0;var b=0,d=0,e=0;d=a+20|0;if(c[d>>2]|0){b=c[46898]|0;b=b+((ys(a)|0)*40|0)|0;do{e=b+32|0;b=c[e>>2]|0}while((b|0)!=(a|0));c[e>>2]=c[a+32>>2];c[46899]=(c[46899]|0)+-1;Lu(c[d>>2]|0);c[d>>2]=0}return}function As(){return (c[46899]|0)==0|0}function Bs(a){a=a|0;var b=0,d=0,e=0,f=0.0;b=c[46898]|0;d=c[46901]|0;while(1){e=c[b+(d*40|0)+32>>2]|0;if(e|0)break;e=d+1|0;c[46901]=e;d=e}f=+h[e+24>>3];h[a>>3]=+h[c[e+20>>2]>>3];h[a+8>>3]=f;return}function Cs(){var a=0,b=0;b=(c[46898]|0)+((c[46901]|0)*40|0)+32|0;a=c[b>>2]|0;c[b>>2]=c[a+32>>2];c[46899]=(c[46899]|0)+-1;return a|0}function Ds(){l6(c[46898]|0);c[46898]=0;return}function Es(){var a=0,b=0,d=0;c[46899]=0;c[46901]=0;a=c[46897]|0;b=a<<2;c[46900]=b;d=c[46898]|0;if(!d){d=IK(a*160|0)|0;c[46898]=d;b=c[46900]|0}a=0;while(1){if((a|0)>=(b|0))break;c[d+(a*40|0)+32>>2]=0;a=a+1|0}return}function Fs(){cu(187616,40);l6(c[46907]|0);c[46907]=0;return}function Gs(){var a=0,b=0,d=0;cu(187616,40);a=c[46897]|0;b=a<<1;c[46908]=b;d=c[46907]|0;if(!d){d=IK(a<<3)|0;c[46907]=d;b=c[46908]|0}a=0;while(1){if((a|0)>=(b|0))break;c[d+(a<<2)>>2]=0;a=a+1|0}c[46902]=Hs(0,0)|0;c[46903]=Hs(0,0)|0;c[c[46902]>>2]=0;d=c[46903]|0;b=c[46902]|0;c[b+4>>2]=d;c[d>>2]=b;c[(c[46903]|0)+4>>2]=0;d=c[46907]|0;c[d>>2]=c[46902];c[d+((c[46908]|0)+-1<<2)>>2]=c[46903];return}function Hs(b,d){b=b|0;d=d|0;var e=0;e=eu(187616)|0;c[e+8>>2]=b;a[e+16>>0]=d;c[e+32>>2]=0;c[e+20>>2]=0;c[e+12>>2]=0;return e|0}function Is(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0.0,i=0,j=0.0,k=0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0;i=c[b+8>>2]|0;k=c[d+8>>2]|0;do if((!((i|0)==0|(k|0)==0)?(o=c[i+36>>2]|0,e=c[k+36>>2]|0,(o|0)!=(e|0)):0)?(j=+h[i>>3],f=+h[k+8>>3],g=+h[i+8>>3],l=+h[k>>3],m=j*f-g*l,!(m>-1.0e-10&m<1.0e-10)):0){p=+h[i+16>>3];q=+h[k+16>>3];n=(f*p-g*q)/m;j=(j*q-l*p)/m;f=+h[o+8>>3];g=+h[e+8>>3];do if(f>3]<+h[e>>3]:0){e=o;break}b=d}while(0);b=a[b+16>>0]|0;if(!(n>=+h[e>>3])){if(b<<24>>24==1){b=0;break}}else if(!(b<<24>>24)){b=0;break}b=Iu()|0;c[b+20>>2]=0;h[b>>3]=n;h[b+8>>3]=j}else b=0;while(0);return b|0}function Js(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0.0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0,p=0.0,q=0;o=c[b+8>>2]|0;i=c[o+36>>2]|0;m=+h[d>>3];p=+h[i>>3];n=m>p;e=a[b+16>>0]|0;b=n^1;q=e<<24>>24!=0;if(q|b)if(e<<24>>24==1&b)b=0;else{g=+h[o>>3];b=o+16|0;j=+h[d+8>>3];f=+h[i+8>>3];k=m-p;l=k*k;do if(g==1.0){f=j-f;g=+h[o+8>>3];e=g<0.0;if(n?g>=0.0:e){b=f>=k*g;if(b){b=b&1;break}}else{b=e^m+j*g>+h[b>>3];if(!b){b=b&1;break}}p=p-+h[c[o+32>>2]>>3];b=(l-f*f)*g>3]-m*g;m=j-p;p=p-f;b=m*m>l+p*p&1}while(0);b=b^q&1}else b=1;return b|0}function Ks(a,b){a=a|0;b=b|0;c[b>>2]=a;a=a+4|0;c[b+4>>2]=c[a>>2];c[c[a>>2]>>2]=b;c[a>>2]=b;return}function Ls(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;f=c[46908]|0;b=~~((+h[a>>3]-+h[23291])/+h[23295]*+(f|0));b=(b|0)>0?b:0;f=(b|0)<(f|0)?b:f+-1|0;b=Ms(f)|0;if(!b){d=1;while(1){b=Ms(f-d|0)|0;if(b|0)break;b=Ms(d+f|0)|0;if(b|0)break;d=d+1|0}c[46909]=(c[46909]|0)+d}c[46910]=(c[46910]|0)+1;e=c[46902]|0;d=c[46903]|0;a:do if((b|0)==(e|0))g=9;else{if((b|0)!=(d|0)?(Js(b,a)|0)!=0:0){g=9;break}while(1){b=c[b>>2]|0;if((b|0)==(e|0))break a;if(Js(b,a)|0){e=b;break}}}while(0);if((g|0)==9){while(1){b=c[b+4>>2]|0;if((b|0)==(d|0))break;if(!(Js(b,a)|0))break;else g=9}e=c[b>>2]|0}if((f|0)>0?(f|0)<((c[46908]|0)+-1|0):0){b=(c[46907]|0)+(f<<2)|0;d=c[b>>2]|0;if(d|0){g=d+12|0;c[g>>2]=(c[g>>2]|0)+-1}c[b>>2]=e;g=e+12|0;c[g>>2]=(c[g>>2]|0)+1}return e|0}function Ms(a){a=a|0;var b=0,d=0;if((a|0)>-1&(c[46908]|0)>(a|0)?(d=(c[46907]|0)+(a<<2)|0,b=c[d>>2]|0,(b|0)!=0):0){if((c[b+8>>2]|0)==(-2|0)){c[d>>2]=0;a=b+12|0;d=(c[a>>2]|0)+-1|0;c[a>>2]=d;if(!d){fu(b,187616);b=0}else b=0}}else b=0;return b|0}function Ns(a){a=a|0;var b=0,d=0;b=a+4|0;d=c[a>>2]|0;c[d+4>>2]=c[b>>2];c[c[b>>2]>>2]=d;c[a+8>>2]=-2;return}function Os(a){a=a|0;return c[a+4>>2]|0}function Ps(a){a=a|0;return c[a>>2]|0}function Qs(b){b=b|0;var d=0;d=c[b+8>>2]|0;if(!d)b=187840;else b=d+32+(((a[b+16>>0]|0)!=0&1)<<2)|0;return c[b>>2]|0}function Rs(b){b=b|0;var d=0;d=c[b+8>>2]|0;if(!d)b=187840;else b=d+32+(((a[b+16>>0]|0)==0&1)<<2)|0;return c[b>>2]|0}function Ss(){cu(187648,24);return}function Ts(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0,g=0,i=0,j=0;j=l;l=l+32|0;i=j;g=(c[46911]|0)+((c[a+16>>2]|0)*96|0)+88|0;f=c[g>>2]|0;h[i+8>>3]=b;h[i+16>>3]=d;e=Us(a,i,f)|0;do if(e|0){if((e|0)<0){i=eu(187648)|0;h[i+8>>3]=b;h[i+16>>3]=d;c[i>>2]=f;c[g>>2]=i;break}while(1){e=c[f>>2]|0;g=Us(a,i,e)|0;if((g|0)>0)f=e;else break}if(g|0){i=eu(187648)|0;h[i+8>>3]=b;h[i+16>>3]=d;c[f>>2]=i;c[i>>2]=e}}while(0);l=j;return}function Us(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0,f=0.0,g=0.0,i=0.0,j=0.0,k=0.0;do if(c){e=+h[b+8>>3];g=+h[c+8>>3];d=+h[b+16>>3];f=+h[c+16>>3];if(!(e==g&d==f)){k=+h[a>>3];j=e-k;e=+h[a+8>>3];i=d-e;g=g-k;f=f-e;d=f/g;e=i/j;b=e=0.0)){a=g>=0.0;b=a|b;b=e>d|b?(b?(a?1:-1):1):j>g?-1:1;break}if(!(g<0.0)){c=g>0.0;if(j>0.0)if(c)return (e==e&d==d&e!=d?(b?-1:1):j0.0?-1:1;break}b=i<=0.0;if(c){b=b?-1:1;break}if(i>2]|0;d=a+(d*20|0)+4|0;b=1;a=0;while(1){if((b|0)>=(f|0))break;g=((c[e+(c[(c[d>>2]|0)+(b<<2)>>2]<<2)>>2]|0)>0&1)+a|0;b=b+1|0;a=g}return a|0}function Ws(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=a+(b*20|0)|0;b=a+(b*20|0)+4|0;a=1;while(1){if((a|0)>=(c[e>>2]|0))break;c[d+(c[(c[b>>2]|0)+(a<<2)>>2]<<2)>>2]=1;a=a+1|0}return}function Xs(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=a+(b*20|0)|0;b=a+(b*20|0)+4|0;a=1;while(1){if((a|0)>=(c[e>>2]|0))break;c[d+(c[(c[b>>2]|0)+(a<<2)>>2]<<2)>>2]=0;a=a+1|0}return}function Ys(a,b){a=a|0;b=b|0;if(!(c[a+8>>2]|0))a=_s(a,b)|0;else a=Zs(a,b)|0;return a|0}function Zs(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=b<<2;e=IK(S(f,b)|0)|0;f=IK(f)|0;d=0;while(1){if((d|0)>=(b|0)){d=0;break}c[f+(d<<2)>>2]=e+((S(d,b)|0)<<2);d=d+1|0}while(1){if((d|0)>=(b|0))break;_r(d,a,b,c[f+(d<<2)>>2]|0);d=d+1|0}return f|0}function _s(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;h=l;l=l+16|0;f=h;g=b<<2;e=IK(S(g,b)|0)|0;g=IK(g)|0;d=0;while(1){if((d|0)>=(b|0))break;c[g+(d<<2)>>2]=e+((S(d,b)|0)<<2);d=d+1|0}rr(f,b);d=0;while(1){if((d|0)>=(b|0))break;nr(d,a,b,c[g+(d<<2)>>2]|0,f);d=d+1|0}sr(f);l=h;return g|0}function $s(a,b){a=a|0;b=b|0;var d=0,e=0;e=c[a+8>>2]|0;at(a,b);d=Zs(a,b)|0;bt(a,b,e);return d|0}function at(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;l=IK(b<<2)|0;d=0;e=0;while(1){if((d|0)>=(b|0))break;k=(c[a+(d*20|0)>>2]|0)+e|0;d=d+1|0;e=k}e=IK(e<<2)|0;d=0;while(1){if((d|0)>=(b|0))break;c[l+(d<<2)>>2]=0;d=d+1|0}f=0;while(1){if((f|0)>=(b|0))break;c[a+(f*20|0)+8>>2]=e;Ws(a,f,l);h=a+(f*20|0)|0;i=c[h>>2]|0;j=a+(f*20|0)+4|0;k=i+-2|0;d=1;while(1){if((d|0)>=(i|0))break;m=c[(c[j>>2]|0)+(d<<2)>>2]|0;n=c[a+(m*20|0)>>2]|0;g[e+(d<<2)>>2]=+(k+n-((Vs(a,0,m,l)|0)<<1)|0);d=d+1|0}Xs(a,f,l);e=e+(c[h>>2]<<2)|0;f=f+1|0}l6(l);return}function bt(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=a+8|0;l6(c[e>>2]|0);c[e>>2]=0;a:do if(d|0){e=0;while(1){if((e|0)>=(b|0))break a;c[a+(e*20|0)+8>>2]=d;f=d+(c[a+(e*20|0)>>2]<<2)|0;e=e+1|0;d=f}}while(0);return}function ct(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0;f=0;g=0.0;while(1){if((f|0)>=(b|0))break;j=c[a+(f<<2)>>2]|0;i=+h[j+(d<<3)>>3]-+h[j+(e<<3)>>3];f=f+1|0;g=g+i*i}return +(+G(+g))}function dt(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;if((e|0)>(d|0)){c[46915]=a;k3(b+(d<<2)|0,1-d+e|0,4,77)}return}function et(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0;f=c[46915]|0;e=+g[f+(c[a>>2]<<2)>>2];d=+g[f+(c[b>>2]<<2)>>2];return (ed&1)|0}function ft(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+16|0;f=h;if((d|0)<(e|0)){gt(a,b,d,e,f);g=c[f>>2]|0;f=g+-1|0;ft(a,b,d,f);g=g+1|0;ft(a,b,g,e);if(!(ht(a,b,d,f)|0))ft(a,b,d,f);if(!(ht(a,b,g,e)|0))ft(a,b,g,e)}l=h;return}function gt(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0.0;k=U4()|0;k=b+(((((U4()|0)<<16|k)>>>0)%((1-d+e|0)>>>0)|0)+d<<2)|0;l=c[k>>2]|0;m=b+(d<<2)|0;c[k>>2]=c[m>>2];c[m>>2]=l;n=+h[a+(l<<3)>>3];d=d+1|0;a:while(1){if((d|0)>=(e|0))break;while(1){j=d+1|0;k=b+(d<<2)|0;if((d|0)>=(e|0))break;if(!(+h[a+(c[k>>2]<<3)>>3]<=n))break;else d=j}while(1){i=b+(e<<2)|0;g=e;e=e+-1|0;if((d|0)>=(g|0)){e=g;continue a}g=c[i>>2]|0;if(!(+h[a+(g<<3)>>3]>n))break}d=c[k>>2]|0;c[k>>2]=g;c[i>>2]=d;d=j}a=((+h[a+(c[b+(d<<2)>>2]<<3)>>3]>n)<<31>>31)+d|0;c[f>>2]=a;f=b+(a<<2)|0;c[m>>2]=c[f>>2];c[f>>2]=l;return}function ht(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=1;while(1){f=d+1|0;if(!((d|0)<(e|0)&(g|0)!=0))break;g=+h[a+(c[b+(d<<2)>>2]<<3)>>3]>+h[a+(c[b+(f<<2)>>2]<<3)>>3]?0:g;d=f}return g|0}function it(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0,i=0.0,j=0.0,k=0.0,m=0,n=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0;x=l;l=l+16|0;v=4;w=k6(40)|0;c[w>>2]=0;t=x;o=0;u=la(23,b*40|0)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,w|0,v|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)!=1){d=0;r=0;while(1){if((d|0)>=(b|0))break;s=(c[(c[a+(d<<2)>>2]|0)+4>>2]|0)+r|0;d=d+1|0;r=s}o=0;s=la(23,r*24|0)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,w|0,v|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)!=1){d=0;m=0;while(1){if((m|0)>=(b|0))break;n=u+(m*40|0)|0;c[n>>2]=s+(d*24|0);q=a+(m<<2)|0;f=0;g=1797693134862315708145274.0e284;i=-1797693134862315708145274.0e284;j=-1797693134862315708145274.0e284;k=1797693134862315708145274.0e284;while(1){e=c[q>>2]|0;if((f|0)>=(c[e+4>>2]|0))break;e=c[e>>2]|0;z=+h[e+(f<<4)>>3];y=+h[e+(f<<4)+8>>3];h[s+(d*24|0)>>3]=z;h[s+(d*24|0)+8>>3]=y;c[s+(d*24|0)+16>>2]=n;c[s+(d*24|0)+20>>2]=0;f=f+1|0;d=d+1|0;g=gz?i:z;j=j>y?j:y;k=k>2]=s+((d+-1|0)*24|0);h[u+(m*40|0)+8>>3]=g;h[u+(m*40|0)+16>>3]=k;h[u+(m*40|0)+24>>3]=i;h[u+(m*40|0)+32>>3]=j;m=m+1|0}c[t>>2]=r;c[t+4>>2]=b;w=x6(187664,1,w|0,v|0)|0;v=D;o=0;d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,w|0,v|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)==1){d=D;q=s;m=s;n=u}else{d=0;q=s;m=s;n=u}}else{d=D;q=0;m=s;n=u}}else{d=D;q=0;m=0;n=0}while(1){if(d|0){o=0;$(105,u|0);d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,w|0,v|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)==1){f=n;r=m;s=q;d=D;n=f;m=r;q=s;continue}o=0;$(105,m|0);d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,w|0,v|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)==1){f=n;r=m;s=q;d=D;n=f;m=r;q=s;continue}else{e=17;break}}o=0;d=ra(78,q|0,t|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,v|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){f=n;r=m;s=q;d=D;n=f;m=r;q=s;continue}if(!d){o=0;d=aa(27,a|0,b|0,n|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,v|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){f=n;r=m;s=q;d=D;n=f;m=r;q=s;continue}}o=0;$(105,u|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,v|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){f=n;r=m;s=q;d=D;n=f;m=r;q=s;continue}o=0;$(105,m|0);e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,w|0,v|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){f=n;r=m;s=q;d=D;n=f;m=r;q=s}else{e=24;break}}if((e|0)==17)d=0;else if((e|0)==24)d=(d|0)==0&1;l6(w|0);l=x;return d|0}function jt(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=l;l=l+16|0;r=w;p=w+8|0;q=w+4|0;c[b+8>>2]=0;v=IK(c[b>>2]<<2)|0;f=c[b>>2]|0;e=0;while(1){if((e|0)>=(f|0))break;c[v+(e<<2)>>2]=a+(e*24|0);e=e+1|0}k3(v,f,4,79);n=0;g=0;f=0;h=0;a:while(1){if((n|0)>=(c[b>>2]|0)){t=0;d=g;u=h;break}o=v+(n<<2)|0;e=c[o>>2]|0;c[p>>2]=e;a=c[e+16>>2]|0;if((e|0)==(c[a>>2]|0))e=c[a+4>>2]|0;else e=e+-24|0;c[q>>2]=e;m=0;a=g;k=h;while(1){if((m|0)>=2)break;j=e+20|0;switch(lt(p,q)|0){case -1:{g=0;h=a;while(1){if((g|0)>=(k|0))break;i=mt(c[h>>2]|0,e)|0;if(i|0){t=i;d=a;u=k;break a}g=g+1|0;h=c[h+4>>2]|0}g=IK(12)|0;if(!k){f=0;a=g}else c[f+4>>2]=g;c[g+8>>2]=f;c[g>>2]=e;c[g+4>>2]=0;c[j>>2]=g;h=a;f=g;g=k+1|0;break}case 1:{g=c[j>>2]|0;if(!g){s=19;break a}do if((k|0)!=1){if((g|0)==(a|0)){a=c[a+4>>2]|0;c[a+8>>2]=0;e=f;break}if((g|0)==(f|0)){e=c[f+8>>2]|0;c[e+4>>2]=0;break}else{e=g+4|0;i=c[g+8>>2]|0;c[i+4>>2]=c[e>>2];c[(c[e>>2]|0)+8>>2]=i;e=f;break}}else{a=0;e=0}while(0);l6(g);c[j>>2]=0;h=a;f=e;g=k+-1|0;break}default:{h=a;g=k}}e=c[o>>2]|0;a=c[e+16>>2]|0;if((e|0)==(c[a+4>>2]|0))a=c[a>>2]|0;else a=e+24|0;c[q>>2]=a;m=m+1|0;a=h;k=g}n=n+1|0;g=a;h=k}if((s|0)==19){dA(1,94028,r)|0;Ca(187664,1)}e=0;while(1){if((e|0)>=(u|0))break;s=c[d+4>>2]|0;l6(d);e=e+1|0;d=s}l6(v);l=w;return t|0}function kt(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0.0,k=0.0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0.0,C=0,D=0,E=0,F=0,G=0,H=0.0;G=l;l=l+48|0;s=G+16|0;r=G+32|0;y=G;e=0;a:while(1){if((e|0)>=(b|0)){e=0;break}C=c[a+(e<<2)>>2]|0;D=c[C>>2]|0;c[y>>2]=c[D>>2];c[y+4>>2]=c[D+4>>2];c[y+8>>2]=c[D+8>>2];c[y+12>>2]=c[D+12>>2];D=e+1|0;E=d+(e*40|0)+8|0;t=d+(e*40|0)+16|0;u=d+(e*40|0)+32|0;g=d+(e*40|0)+24|0;e=D;while(1){if((e|0)>=(b|0)){e=D;continue a}i=c[a+(e<<2)>>2]|0;j=+h[E>>3];k=+h[d+(e*40|0)+24>>3];m=d+(e*40|0)+32|0;n=d+(e*40|0)+16|0;o=+h[d+(e*40|0)+8>>3];p=+h[g>>3];q=p>=o;f=!(j<=k);if(((!(f|!(j>=o))?(v=+h[t>>3],w=+h[m>>3],v<=w):0)?(x=+h[n>>3],!(!(p<=k)|!(v>=x)|q^1)):0)?(H=+h[u>>3],!(!(H<=w)|!(H>=x))):0){c[r>>2]=c[i>>2];c[r+4>>2]=c[i+4>>2];c[s>>2]=c[y>>2];c[s+4>>2]=c[y+4>>2];c[s+8>>2]=c[y+8>>2];c[s+12>>2]=c[y+12>>2];if(LX(r,s)|0){e=1;break a}}else F=10;if((((((F|0)==10?(F=0,!(!(o>=j)|q^1)):0)?(z=+h[n>>3],A=+h[u>>3],z<=A):0)?(B=+h[t>>3],!(f|(!(k<=p)|!(z>=B)))):0)?(H=+h[m>>3],!(!(H<=A)|!(H>=B))):0)?(q=c[i>>2]|0,c[r>>2]=c[C>>2],c[r+4>>2]=c[C+4>>2],c[s>>2]=c[q>>2],c[s+4>>2]=c[q+4>>2],c[s+8>>2]=c[q+8>>2],c[s+12>>2]=c[q+12>>2],LX(r,s)|0):0){e=1;break a}e=e+1|0}}l=G;return e|0}function lt(a,b){a=a|0;b=b|0;var d=0.0,e=0;e=c[a>>2]|0;a=c[b>>2]|0;d=+h[e>>3]-+h[a>>3];if(!(d!=0.0)){d=+h[e+8>>3]-+h[a+8>>3];if(d==0.0)a=0;else a=d>0.0?1:-1}else a=d>0.0?1:-1;return a|0}function mt(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0;m=l;l=l+64|0;g=m+32|0;i=m+24|0;j=m+16|0;k=m;f=m+48|0;nt(a,b,f);d=f+8|0;e=c[d>>2]|0;do if((e|0)>0)d=0;else{if((e|0)<0){nt(b,a,f);d=c[d>>2]|0;if((d|0)>0){d=0;break}if((d|0)<0)d=3;else{d=c[f>>2]|0;d=ot(b,a,(d|0)>-1?d:0-d|0)|0}if(!(pt(a,b,i,j,d)|0)){d=0;break}}else{d=c[f>>2]|0;if((d|0)==(c[f+4>>2]|0)){d=ot(a,b,0)|0;d=(ot(a,b,(d|0)<=(ot(a,b,1)|0)&1)|0)<<1}else d=ot(a,b,(d|0)>-1?d:0-d|0)|0;if(!(pt(a,b,i,j,d)|0)){d=0;break}}h[k>>3]=+h[i>>3];h[k+8>>3]=+h[j>>3];c[g>>2]=c[k>>2];c[g+4>>2]=c[k+4>>2];c[g+8>>2]=c[k+8>>2];c[g+12>>2]=c[k+12>>2];d=qt(a,b,g)|0}while(0);l=m;return d|0}function nt(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0;i=+h[a>>3];j=+h[a+8>>3];e=c[a+16>>2]|0;if((c[e+4>>2]|0)==(a|0))a=c[e>>2]|0;else a=a+24|0;g=+h[a>>3]-i;f=+h[a+8>>3]-j;a=c[b+16>>2]|0;if((c[a+4>>2]|0)==(b|0))a=c[a>>2]|0;else a=b+24|0;k=+h[a>>3]-i;l=+h[a+8>>3]-j;j=g*(+h[b+8>>3]-j)-f*(+h[b>>3]-i);b=j==0.0?0:j>0.0?1:-1;c[d>>2]=b;j=g*l-f*k;e=j==0.0?0:j>0.0?1:-1;c[d+4>>2]=e;c[d+8>>2]=S(e,b)|0;return}function ot(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0;k=+h[a>>3];l=+h[a+8>>3];f=c[a+16>>2]|0;if((c[f+4>>2]|0)==(a|0))a=c[f>>2]|0;else a=a+24|0;j=+h[a>>3];i=+h[a+8>>3];do if(d){a=c[b+16>>2]|0;if((c[a+4>>2]|0)==(b|0)){b=c[a>>2]|0;break}else{b=b+24|0;break}}while(0);g=+h[b>>3];e=+h[b+8>>3];if(k==j){if(k==g)b=(st(l,e,i)|0)!=-1;else b=0;b=b&1}else b=st(k,g,j)|0;return b|0}function pt(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0;a:do if((f|0)<1)g=0;else{q=+h[a>>3];s=+h[a+8>>3];g=c[a+16>>2]|0;if((c[g+4>>2]|0)==(a|0))g=c[g>>2]|0;else g=a+24|0;l=+h[g>>3];j=+h[g+8>>3];p=+h[b>>3];r=+h[b+8>>3];g=c[b+16>>2]|0;if((c[g+4>>2]|0)==(b|0))g=c[g>>2]|0;else g=b+24|0;k=+h[g>>3];i=+h[g+8>>3];n=s-j;o=q-l;b:do switch(f|0){case 3:{m=(r-i)/(p-k);if(q==l){h[d>>3]=q;i=i+(q-k)*m;break b}i=n/o;if(p==k){h[d>>3]=p;i=j+i*(p-l);break b}else{r=r-p*m;q=s-q*i;s=m-i;h[d>>3]=(q-r)/s;i=(q*m-i*r)/s;break b}}case 2:{if((ot(a,b,0)|0)==-1)if((ot(b,a,1)|0)==-1){f=(ot(b,a,0)|0)==-1;l=f?l:q;k=p;j=f?j:s;i=r}else{l=k;k=p;j=i;i=r}else if((ot(a,b,1)|0)!=-1)if((ot(b,a,0)|0)==-1){k=q;i=s}else{g=0;break a}else{l=p;j=r}h[d>>3]=(l+k)*.5;i=(j+i)*.5;break}case 1:if(o*(r-s)==n*(p-q)){h[d>>3]=p;i=r;break b}else{h[d>>3]=k;break b}default:{g=1;break a}}while(0);h[e>>3]=i;g=1}while(0);return g|0}function qt(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0;t=l;l=l+16|0;r=t;p=+h[a>>3];q=+h[a+8>>3];f=c[a+16>>2]|0;if((c[f+4>>2]|0)==(a|0))f=c[f>>2]|0;else f=a+24|0;n=+h[f>>3];k=+h[f+8>>3];m=+h[b>>3];o=+h[b+8>>3];f=c[b+16>>2]|0;if((c[f+4>>2]|0)==(b|0))f=c[f>>2]|0;else f=b+24|0;j=+h[f>>3];i=+h[f+8>>3];f=e+8|0;a:do if(!(p!=n&m!=j)){do if(p==n){g=+h[e>>3];if(p==g?q==+h[f>>3]:0)break;if(!(n==g)){s=18;break a}if(!(k==+h[f>>3])){s=18;break a}}while(0);if(m==j){g=+h[e>>3];if(m==g?o==+h[f>>3]:0){f=0;break}if(j==g?i==+h[f>>3]:0)f=0;else s=18}else f=0}else s=18;while(0);if((s|0)==18)if((d[195234]|0)>1){s=c[15715]|0;q=+h[f>>3];h[r>>3]=+h[e>>3];h[r+8>>3]=q;z4(s,94057,r)|0;rt(1,a);rt(2,b);f=1}else f=1;l=t;return f|0}function rt(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0.0,i=0,j=0,k=0.0,m=0.0;j=l;l=l+48|0;i=j;e=c[15715]|0;f=+h[b>>3];g=+h[b+8>>3];d=c[b+16>>2]|0;if((c[d+4>>2]|0)==(b|0))b=c[d>>2]|0;else b=b+24|0;m=+h[b>>3];k=+h[b+8>>3];c[i>>2]=a;h[i+8>>3]=f;h[i+16>>3]=g;h[i+24>>3]=m;h[i+32>>3]=k;z4(e,94085,i)|0;l=j;return}function st(a,b,c){a=+a;b=+b;c=+c;return (a==b|b==c?0:(a>3]=0.0;e=e+1|0}h[f+(a<<3)>>3]=1.0;sy(c[b+(a<<2)>>2]|0,f,d);a=a+1|0}l6(f);f=0;while(1){if((f|0)>=(d|0)){a=1;break a}e=b+(f<<2)|0;a=0;while(1){if((a|0)==(f|0))break;j=(c[e>>2]|0)+(a<<3)|0;i=+h[j>>3];g=(c[b+(a<<2)>>2]|0)+(f<<3)|0;h[j>>3]=+h[g>>3];h[g>>3]=i;a=a+1|0}f=f+1|0}}while(0);return a|0}function ut(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0.0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;q=b<<3;p=IK(q)|0;q=IK(q)|0;r=b*30|0;n=(d|0)<(b|0)?d:b;o=b+-1|0;m=(g|0)==0;d=0;i=0;a:while(1){if((i|0)>=(n|0))break;k=c[e+(i<<2)>>2]|0;do{b:do if(m)d=0;else{d=0;while(1){if((d|0)==(b|0)){d=0;break b}h[k+(d<<3)>>3]=+((U4()|0)%100|0|0);d=d+1|0}}while(0);while(1){if((d|0)==(i|0))break;g=c[e+(d<<2)>>2]|0;wt(k,0,o,-+vt(g,0,o,k),g);d=d+1|0}j=+xt(k,0,o)}while(j<1.0e-10);yt(k,0,o,1.0/j,k);d=0;do{zt(q,0,o,k);At(a,b,b,k,p);zt(k,0,o,p);g=0;while(1){if((g|0)==(i|0))break;s=c[e+(g<<2)>>2]|0;wt(k,0,o,-+vt(s,0,o,k),s);g=g+1|0}s=d;d=d+1|0;j=+xt(k,0,o);if(!((s|0)<(r|0)&!(j<1.0e-10)))break a;yt(k,0,o,1.0/j,k);l=+vt(k,0,o,q)}while(+F(+l)<.999);h[f+(i<<3)>>3]=j*l;i=i+1|0}while(1){if((i|0)>=(n|0))break;k=c[e+(i<<2)>>2]|0;g=0;while(1){if((g|0)>=(b|0)){g=0;break}h[k+(g<<3)>>3]=+((U4()|0)%100|0|0);g=g+1|0}while(1){if((g|0)>=(i|0))break;s=c[e+(g<<2)>>2]|0;wt(k,0,o,-+vt(s,0,o,k),s);g=g+1|0}yt(k,0,o,1.0/+xt(k,0,o),k);h[f+(i<<3)>>3]=0.0;i=i+1|0}m=n+-1|0;i=0;while(1){if((i|0)>=(m|0))break;a=f+(i<<3)|0;b=i+1|0;j=+h[a>>3];g=i;k=b;while(1){if((k|0)>=(n|0))break;l=+h[f+(k<<3)>>3];s=j>2]|0);s=e+(g<<2)|0;zt(c[k>>2]|0,0,o,c[s>>2]|0);zt(c[s>>2]|0,0,o,p);h[f+(g<<3)>>3]=+h[a>>3];h[a>>3]=j;i=b}l6(p);l6(q);return (d|0)<=(r|0)|0}function vt(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0.0;f=0.0;e=1-b+c|0;d=d+(b<<3)|0;c=a+(b<<3)|0;while(1){if(!e)break;f=f+ +h[c>>3]*+h[d>>3];e=e+-1|0;d=d+8|0;c=c+8|0}return +f}function wt(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;var f=0;f=1-b+c|0;e=e+(b<<3)|0;c=a+(b<<3)|0;while(1){if(!f)break;h[c>>3]=+h[c>>3]+ +h[e>>3]*d;f=f+-1|0;e=e+8|0;c=c+8|0}return}function xt(a,b,c){a=a|0;b=b|0;c=c|0;return +(+G(+(+vt(a,b,c,a))))}function yt(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;var f=0;f=1-b+c|0;e=e+(b<<3)|0;c=a+(b<<3)|0;while(1){if(!f)break;h[c>>3]=+h[e>>3]*d;f=f+-1|0;e=e+8|0;c=c+8|0}return}function zt(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=1-b+c|0;d=d+(b<<3)|0;c=a+(b<<3)|0;while(1){if(!e)break;h[c>>3]=+h[d>>3];e=e+-1|0;d=d+8|0;c=c+8|0}return}function At(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0.0,i=0,j=0,k=0;j=0;while(1){if((j|0)>=(b|0))break;k=a+(j<<2)|0;g=0.0;i=0;while(1){if((i|0)>=(d|0))break;g=g+ +h[(c[k>>2]|0)+(i<<3)>>3]*+h[e+(i<<3)>>3];i=i+1|0}h[f+(j<<3)>>3]=g;j=j+1|0}return}function Bt(a,b,d,e,f,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;i=i|0;var j=0,k=0,l=0,m=0.0,n=0,o=0,p=0.0;k=c[i>>2]|0;l=d<<2;j=S(l,f)|0;if(!k){j=k6(j)|0;o=k6(l)|0}else{j=n6(c[k>>2]|0,j)|0;o=n6(k,l)|0}c[i>>2]=o;k=0;while(1){if((k|0)>=(d|0)){l=0;break}c[o+(k<<2)>>2]=j;k=k+1|0;j=j+(f<<2)|0}while(1){if((l|0)>=(d|0))break;i=a+(l<<2)|0;n=o+(l<<2)|0;k=0;while(1){if((k|0)<(f|0)){j=0;m=0.0}else break;while(1){if((j|0)>=(e|0))break;p=m+ +h[(c[i>>2]|0)+(j<<3)>>3]*+g[(c[b+(j<<2)>>2]|0)+(k<<2)>>2];j=j+1|0;m=p}g[(c[n>>2]|0)+(k<<2)>>2]=m;k=k+1|0}l=l+1|0}return}function Ct(a,b,d,e,f,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;i=i|0;var j=0,k=0,l=0.0,m=0,n=0,o=0;k=c[i>>2]|0;j=S(d<<3,f)|0;if(!k){j=k6(j)|0;o=k6(d<<2)|0}else{j=n6(c[k>>2]|0,j)|0;o=n6(k,d<<2)|0}c[i>>2]=o;k=0;while(1){if((k|0)>=(d|0)){i=0;break}c[o+(k<<2)>>2]=j;k=k+1|0;j=j+(f<<3)|0}while(1){if((i|0)>=(d|0))break;m=a+(i<<2)|0;n=o+(i<<2)|0;k=0;while(1){if((k|0)<(f|0)){l=0.0;j=0}else break;while(1){if((j|0)>=(e|0))break;l=l+ +h[(c[m>>2]|0)+(j<<3)>>3]*+g[(c[b+(j<<2)>>2]|0)+(k<<2)>>2];j=j+1|0}h[(c[n>>2]|0)+(k<<3)>>3]=l;k=k+1|0}i=i+1|0}return}function Dt(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var i=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0;j=c[f>>2]|0;i=S(d*20|0,e)|0;if(!j){i=k6(i)|0;q=k6(d<<2)|0}else{i=n6(c[j>>2]|0,i)|0;q=n6(j,d<<2)|0}c[f>>2]=q;j=0;while(1){if((j|0)>=(d|0)){f=0;break}c[q+(j<<2)>>2]=i;j=j+1|0;i=i+(e<<2)|0}while(1){if((f|0)>=(d|0))break;l=c[a+(f*20|0)+4>>2]|0;m=c[a+(f*20|0)+8>>2]|0;n=c[a+(f*20|0)>>2]|0;o=q+(f<<2)|0;i=0;while(1){if((i|0)>=(e|0))break;p=b+(i<<2)|0;k=0.0;j=0;while(1){if((j|0)>=(n|0))break;k=k+ +g[m+(j<<2)>>2]*+h[(c[p>>2]|0)+(c[l+(j<<2)>>2]<<3)>>3];j=j+1|0}g[(c[o>>2]|0)+(i<<2)>>2]=k;i=i+1|0}f=f+1|0}return}function Et(a,b){a=a|0;b=b|0;var c=0.0,d=0,e=0;c=0.0;d=b;e=a;while(1){if(!e)break;c=c+ +h[d>>3];d=d+8|0;e=e+-1|0}c=c/+(a|0);while(1){if(!a)break;h[b>>3]=+h[b>>3]-c;b=b+8|0;a=a+-1|0}return}function Ft(a,b){a=a|0;b=b|0;var c=0;c=0;while(1){if((c|0)>=(a|0))break;h[b+(c<<3)>>3]=+((U4()|0)%500|0|0);c=c+1|0}Et(a,b);return}function Gt(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,i=0,j=0,k=0,l=0,m=0;j=0;while(1){if((j|0)>=(b|0))break;k=c[a+(j*20|0)>>2]|0;l=a+(j*20|0)+8|0;m=a+(j*20|0)+4|0;f=0.0;i=0;while(1){if((i|0)>=(k|0))break;f=f+ +g[(c[l>>2]|0)+(i<<2)>>2]*+h[d+(c[(c[m>>2]|0)+(i<<2)>>2]<<3)>>3];i=i+1|0}h[e+(j<<3)>>3]=f;j=j+1|0}return}function Ht(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,i=0,j=0,k=0;j=0;while(1){if((j|0)>=(b|0))break;k=a+(j<<2)|0;f=0.0;i=0;while(1){if((i|0)==(b|0))break;f=f+ +g[(c[k>>2]|0)+(i<<2)>>2]*+h[d+(i<<3)>>3];i=i+1|0}h[e+(j<<3)>>3]=f;j=j+1|0}return}function It(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=0;while(1){if((e|0)>=(a|0))break;h[d+(e<<3)>>3]=+h[b+(e<<3)>>3]-+h[c+(e<<3)>>3];e=e+1|0}return}function Jt(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=0;while(1){if((e|0)>=(a|0))break;h[d+(e<<3)>>3]=+h[b+(e<<3)>>3]+ +h[c+(e<<3)>>3];e=e+1|0}return}function Kt(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;var e=0;e=0;while(1){if((e|0)>=(a|0))break;h[d+(e<<3)>>3]=+h[b+(e<<3)>>3]*c;e=e+1|0}return}function Lt(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=0;while(1){if((d|0)>=(a|0))break;h[c+(d<<3)>>3]=+h[b+(d<<3)>>3];d=d+1|0}return}function Mt(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0;d=0.0;e=0;while(1){if((e|0)>=(a|0))break;d=d+ +h[b+(e<<3)>>3]*+h[c+(e<<3)>>3];e=e+1|0}return +d}function Nt(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0.0;c=0;d=-1.e+50;while(1){if((c|0)>=(a|0))break;e=+F(+(+h[b+(c<<3)>>3]));c=c+1|0;d=e>d?e:d}return +d}function Ot(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0.0,i=0,j=0;j=0;while(1){if((j|0)<(b|0)){g=0.0;i=0}else break;while(1){if((i|0)>=(d|0))break;g=g+ +h[(c[a+(i<<2)>>2]|0)+(j<<3)>>3]*+h[e+(i<<3)>>3];i=i+1|0}h[f+(j<<3)>>3]=g;j=j+1|0}return}function Pt(a,b){a=a|0;b=b|0;var c=0.0,d=0,e=0;c=0.0;d=b;e=a;while(1){if(!e)break;c=c+ +g[d>>2];d=d+4|0;e=e+-1|0}c=c/+(a|0);while(1){if(!a)break;g[b>>2]=+g[b>>2]-c;b=b+4|0;a=a+-1|0}return}function Qt(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0.0,h=0,i=0,j=0,k=0,l=0.0,m=0,n=0.0,o=0,p=0.0;e=0;while(1){if((e|0)>=(b|0)){h=0;j=0;m=b;break}g[d+(e<<2)>>2]=0.0;e=e+1|0}while(1){if((j|0)>=(b|0))break;l=+g[c+(j<<2)>>2];k=j+1|0;f=l*+g[a+(h<<2)>>2]+0.0;i=k;e=h;while(1){e=e+1|0;if((i|0)==(b|0))break;p=+g[a+(e<<2)>>2];n=f+p*+g[c+(i<<2)>>2];o=d+(i<<2)|0;g[o>>2]=l*p+ +g[o>>2];f=n;i=i+1|0}o=d+(j<<2)|0;g[o>>2]=f+ +g[o>>2];h=h+m|0;j=k;m=m+-1|0}return}function Rt(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=0;while(1){if((e|0)>=(a|0))break;g[d+(e<<2)>>2]=+g[b+(e<<2)>>2]-+g[c+(e<<2)>>2];e=e+1|0}return}function St(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=0;while(1){if((e|0)>=(a|0))break;g[d+(e<<2)>>2]=+g[b+(e<<2)>>2]+ +g[c+(e<<2)>>2];e=e+1|0}return}function Tt(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;var e=0,f=0;e=0;while(1){if((e|0)>=(a|0))break;f=b+(e<<2)|0;g[f>>2]=+g[f>>2]+ +g[d+(e<<2)>>2]*c;e=e+1|0}return}function Ut(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;var e=0;e=0;while(1){if((e|0)>=(a|0))break;g[d+(e<<2)>>2]=+g[b+(e<<2)>>2]*c;e=e+1|0}return}function Vt(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=0;while(1){if((e|0)>=(a|0))break;c[d+(e<<2)>>2]=c[b+(e<<2)>>2];e=e+1|0}return}function Wt(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0;d=0.0;e=0;while(1){if((e|0)>=(a|0))break;d=d+ +g[b+(e<<2)>>2]*+g[c+(e<<2)>>2];e=e+1|0}return +d}function Xt(a,b,c){a=a|0;b=+b;c=c|0;var d=0;d=0;while(1){if((d|0)>=(a|0))break;h[c+(d<<3)>>3]=b;d=d+1|0}return}function Yt(a,b,c){a=a|0;b=+b;c=c|0;var d=0;d=0;while(1){if((d|0)>=(a|0))break;g[c+(d<<2)>>2]=b;d=d+1|0}return}function Zt(a,b){a=a|0;b=b|0;var c=0.0,d=0,e=0.0;c=-1000000015047466219876688.0e6;d=0;while(1){if((d|0)>=(a|0))break;e=+F(+(+g[b+(d<<2)>>2]));c=e>c?e:c;d=d+1|0}return +c}function _t(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0;c=0;while(1){if((c|0)>=(a|0))break;d=b+(c<<2)|0;e=+g[d>>2];g[d>>2]=e*e;c=c+1|0}return}function $t(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0;c=0;while(1){if((c|0)>=(a|0))break;d=b+(c<<2)|0;e=+g[d>>2];if(e!=0.0)g[d>>2]=1.0/e;c=c+1|0}return}function au(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0.0;d=0;while(1){if((d|0)>=(a|0))break;e=+g[b+(d<<2)>>2];if(e>=0.0)g[c+(d<<2)>>2]=+G(+e);d=d+1|0}return}function bu(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0;c=0;while(1){if((c|0)>=(a|0))break;d=b+(c<<2)|0;e=+g[d>>2];if(e>0.0)g[d>>2]=1.0/+G(+e);c=c+1|0}return}function cu(a,b){a=a|0;b=b|0;var d=0;c[a>>2]=0;if(b&3)if(!(4%(b>>>0)|0))b=4;else b=S(4/((du(b)|0)>>>0)|0,b)|0;c[a+8>>2]=b;a=a+4|0;b=c[a>>2]|0;a:do if(b|0)while(1){if(!b)break a;d=c[b>>2]|0;l6(c[b+4>>2]|0);l6(b);b=d}while(0);c[a>>2]=0;return}function du(a){a=a|0;var b=0,c=0;c=4;a:while(1){b=c;while(1){if((b|0)==(a|0))break a;if((b|0)<=(a|0))break;b=b-a|0}c=b;a=a-b|0}return a|0}function eu(a){a=a|0;var b=0,d=0,e=0,f=0;b=c[a>>2]|0;if(!b){d=c[a+8>>2]|0;e=IK(8)|0;f=IK(S(c[46897]|0,d)|0)|0;c[e+4>>2]=f;b=0;while(1){if((b|0)>=(c[46897]|0))break;fu(f+(S(b,d)|0)|0,a);b=b+1|0}b=a+4|0;c[e>>2]=c[b>>2];c[b>>2]=e;b=c[a>>2]|0}c[a>>2]=c[b>>2];return b|0}function fu(a,b){a=a|0;b=b|0;c[a>>2]=c[b>>2];c[b>>2]=a;return}function gu(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,l=0,m=0;m=HK(b<<3)|0;l=a+8|0;f=c[l>>2]|0;hu(a,b,m);Ft(b,d);h=0;i=0;while(1){if((i|0)>=(b|0))break;h=(c[a+(i*20|0)>>2]|0)+h|0;i=i+1|0}h=IK(h<<2)|0;j=0;while(1){if((j|0)>=(b|0))break;c[a+(j*20|0)+8>>2]=h;k=c[a+(j*20|0)>>2]|0;g[h>>2]=+(1-k|0);i=1;while(1){if((i|0)>=(k|0))break;g[h+(i<<2)>>2]=1.0;i=i+1|0}h=h+(k<<2)|0;j=j+1|0}i=vr(a,d,m,b,.001,e)|0;l6(c[l>>2]|0);h=0;while(1){if((h|0)>=(b|0))break;c[a+(h*20|0)+8>>2]=f;f=f+(c[a+(h*20|0)>>2]<<2)|0;h=h+1|0}l6(m);return i>>>31|0}function hu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,i=0,j=0,k=0,l=0,m=0;k=a+16|0;i=0;while(1){if((i|0)>=(b|0))break;if(c[k>>2]|0){l=c[a+(i*20|0)>>2]|0;m=a+(i*20|0)+8|0;j=a+(i*20|0)+16|0;e=0.0;f=1;while(1){if((f|0)>=(l|0))break;e=e+ +g[(c[m>>2]|0)+(f<<2)>>2]*+g[(c[j>>2]|0)+(f<<2)>>2];f=f+1|0}h[d+(i<<3)>>3]=e}i=i+1|0}return}function iu(a,b,d,e,f,g,h,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=+h;i=i|0;j=j|0;a=l;l=l+16|0;if(!(c[46955]|0)){c[46955]=1;dA(1,94121,a)|0}l=a;return}function ju(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0;r=IK(f<<2)|0;i=b<<3;g=0;while(1){if((g|0)>=(f|0))break;c[r+(g<<2)>>2]=IK(i)|0;g=g+1|0}p=IK(f<<3)|0;q=IK(b<<2)|0;g=IK(S(i,b)|0)|0;i=0;while(1){if((i|0)>=(b|0))break;c[q+(i<<2)>>2]=g;g=g+(b<<3)|0;i=i+1|0}k=0;o=1;while(1){if((k|0)>=(b|0))break;l=a+(k<<2)|0;m=q+(k<<2)|0;i=0;while(1){if((i|0)==(o|0))break;n=a+(i<<2)|0;g=0;j=0.0;while(1){if((g|0)>=(d|0))break;s=j+ +(S(c[(c[n>>2]|0)+(g<<2)>>2]|0,c[(c[l>>2]|0)+(g<<2)>>2]|0)|0);g=g+1|0;j=s}h[(c[q+(i<<2)>>2]|0)+(k<<3)>>3]=j;h[(c[m>>2]|0)+(i<<3)>>3]=j;i=i+1|0}k=k+1|0;o=o+1|0}ut(q,b,f,r,p,1)|0;i=0;while(1){if((i|0)>=(f|0)){g=0;break}l=r+(i<<2)|0;m=e+(i<<2)|0;k=0;while(1){if((k|0)<(d|0)){g=0;j=0.0}else break;while(1){if((g|0)>=(b|0))break;s=j+ +(c[(c[a+(g<<2)>>2]|0)+(k<<2)>>2]|0)*+h[(c[l>>2]|0)+(g<<3)>>3];g=g+1|0;j=s}h[(c[m>>2]|0)+(k<<3)>>3]=j;k=k+1|0}i=i+1|0}while(1){if((g|0)>=(f|0))break;l6(c[r+(g<<2)>>2]|0);g=g+1|0}l6(r);l6(p);l6(c[q>>2]|0);l6(q);return}function ku(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=l;l=l+32|0;g=f+16|0;j=f+20|0;i=f+12|0;h=f+8|0;c[g>>2]=e;c[i>>2]=0;c[h>>2]=0;fy(c[a>>2]|0,d,d<<2,j);Dt(c[j>>2]|0,a,d,b,i);Ct(a,c[i>>2]|0,b,d,b,h);l6(c[c[i>>2]>>2]|0);l6(c[i>>2]|0);e=(ut(c[h>>2]|0,b,1,g,f,1)|0)&255;l=f;return e|0}function lu(){c[46956]=0;l6(c[46957]|0);l6(c[46958]|0);l6(c[46959]|0);c[46957]=0;c[46958]=0;c[46959]=0;return}function mu(a){a=a|0;l6(c[a+36>>2]|0);return}function nu(b,d,e,f){b=b|0;d=d|0;e=+e;f=+f;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0,u=0,v=0.0,w=0.0;u=l;l=l+80|0;o=u+64|0;t=u+68|0;i=u+48|0;j=u+32|0;k=u+16|0;m=u;n=d+16|0;g=c[n>>2]|0;p=b+40|0;r=f;s=e;a:do if(!(c[g+212>>2]|0))switch(UM(d)|0){case 1:{g=c[n>>2]|0;i=c[g+12>>2]|0;j=c[i+8>>2]|0;c[t>>2]=j;g=c[c[g+8>>2]>>2]|0;k=i+44|0;switch(a[g>>0]|0){case 98:{if(!(f2(g,108537)|0))q=11;else q=8;break}case 112:{if((f2(g,106022)|0)==0?(ou(c[k>>2]|0,j)|0)!=0:0)q=11;else q=8;break}default:q=8}do if((q|0)==8)if((j|0)<3){c[p>>2]=(c[i>>2]|0)==0?0:2;q=16;break}else{c[p>>2]=0;break}else if((q|0)==11?(c[p>>2]=1,(j|0)<=2):0)q=16;while(0);if((q|0)==16){i=pu(d,t,e,f)|0;q=20;break a}i=IK(j<<4)|0;if((c[p>>2]|0)==1){q=c[k>>2]|0;h[i>>3]=s+ +h[q>>3]/72.0;h[i+8>>3]=r+ +h[q+8>>3]/72.0;h[i+16>>3]=+h[q+16>>3]/72.0-s;h[i+24>>3]=r+ +h[q+24>>3]/72.0;h[i+32>>3]=+h[q+32>>3]/72.0-s;h[i+40>>3]=+h[q+40>>3]/72.0-r;h[i+48>>3]=s+ +h[q+48>>3]/72.0;h[i+56>>3]=+h[q+56>>3]/72.0-r;q=20;break a}else g=0;while(1){if((g|0)>=(j|0)){q=20;break a}q=c[k>>2]|0;v=+h[q+(g<<4)>>3];e=+h[q+(g<<4)+8>>3];f=+G(+(v*v+e*e));h[i+(g<<4)>>3]=v*(s/f+1.0)/72.0;h[i+(g<<4)+8>>3]=e*(r/f+1.0)/72.0;g=g+1|0}}case 2:{c[t>>2]=4;q=IK(64)|0;d=c[(c[n>>2]|0)+12>>2]|0;w=+h[d+32>>3];s=+h[d+40>>3];o=~~+h[d+16>>3];d=~~+h[d+24>>3];v=-e;r=-f;qu(i,o,d,v,r);c[q>>2]=c[i>>2];c[q+4>>2]=c[i+4>>2];c[q+8>>2]=c[i+8>>2];c[q+12>>2]=c[i+12>>2];i=q+16|0;n=~~w;qu(j,n,d,e,r);c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];i=q+32|0;d=~~s;qu(k,n,d,e,f);c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];i=q+48|0;qu(m,o,d,v,f);c[i>>2]=c[m>>2];c[i+4>>2]=c[m+4>>2];c[i+8>>2]=c[m+8>>2];c[i+12>>2]=c[m+12>>2];c[p>>2]=1;i=q;q=20;break a}case 3:{c[p>>2]=2;i=pu(d,t,e,f)|0;q=20;break a}default:{c[o>>2]=c[c[(c[n>>2]|0)+8>>2]>>2];dA(1,94184,o)|0;g=1;break a}}else{c[t>>2]=4;v=s+ +h[g+32>>3]*.5;w=r+ +h[g+40>>3]*.5;c[p>>2]=1;i=IK(64)|0;h[i>>3]=v;h[i+8>>3]=w;s=-v;h[i+16>>3]=s;h[i+24>>3]=w;h[i+32>>3]=s;w=-w;h[i+40>>3]=w;h[i+48>>3]=v;h[i+56>>3]=w;q=20}while(0);if((q|0)==20){c[b+36>>2]=i;g=c[t>>2]|0;c[b+32>>2]=g;ru(i,g,b,b+16|0);if((g|0)>(c[46956]|0)){c[46956]=g;g=0}else g=0}l=u;return g|0}function ou(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0,f=0.0,g=0,i=0;do if((b|0)==4){e=+h[a+8>>3];f=+h[a+24>>3];g=a+56|0;i=a+48|0;b=a+16|0;c=a+32|0;d=a+40|0;if(e==f){if(!(+h[d>>3]==+h[g>>3])){b=0;break}if(!(+h[a>>3]==+h[i>>3])){b=0;break}b=+h[b>>3]==+h[c>>3];break}if((+h[a>>3]==+h[b>>3]?+h[c>>3]==+h[i>>3]:0)?e==+h[g>>3]:0)b=f==+h[d>>3];else b=0}else b=0;while(0);return b&1|0}function pu(a,b,d,e){a=a|0;b=b|0;d=+d;e=+e;var f=0,g=0.0,i=0,j=0,k=0,l=0.0;f=NA(a,103006)|0;if(!f)f=0;else f=d6(f)|0;i=(f|0)<3?20:f;j=IK(i<<4)|0;a=a+16|0;g=+(i|0);f=0;while(1){if((f|0)>=(i|0))break;k=c[a>>2]|0;l=+(f|0)/g*3.141592653589793*2.0;h[j+(f<<4)>>3]=+I(+l)*(d+ +h[k+32>>3]*.5);h[j+(f<<4)+8>>3]=+J(+l)*(e+ +h[k+40>>3]*.5);f=f+1|0}c[b>>2]=i;return j|0}function qu(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=+d;e=+e;h[a>>3]=+(b|0)/72.0+d;h[a+8>>3]=+(c|0)/72.0+e;return}function ru(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0.0,g=0.0,i=0.0,j=0.0,k=0,l=0.0,m=0.0;j=+h[a>>3];i=+h[a+8>>3];e=1;f=i;g=j;while(1){if((e|0)>=(b|0))break;k=a+16|0;l=+h[k>>3];m=+h[a+24>>3];e=e+1|0;f=m>f?m:f;g=l>g?l:g;i=m>3]=j;h[c+8>>3]=i;h[d>>3]=g;h[d+8>>3]=f;return}function su(b,d,e,f){b=b|0;d=d|0;e=+e;f=+f;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0;s=l;l=l+80|0;n=s+64|0;q=s+68|0;i=s+48|0;j=s+32|0;k=s+16|0;m=s;o=d+16|0;g=c[o>>2]|0;p=b+40|0;a:do if(!(c[g+212>>2]|0))switch(UM(d)|0){case 1:{m=c[(c[o>>2]|0)+12>>2]|0;n=m+8|0;k=c[n>>2]|0;c[q>>2]=k;b:do if((k|0)>2){i=IK(k<<4)|0;j=m+44|0;g=0;while(1){if((g|0)>=(k|0))break b;d=c[j>>2]|0;h[i+(g<<4)>>3]=+h[d+(g<<4)>>3]/72.0;h[i+(g<<4)+8>>3]=+h[d+(g<<4)+8>>3]/72.0;g=g+1|0}}else i=pu(d,q,0.0,0.0)|0;while(0);g=c[c[(c[o>>2]|0)+8>>2]>>2]|0;switch(a[g>>0]|0){case 98:{if(!(f2(g,108537)|0))g=1;else r=13;break}case 112:{if((f2(g,106022)|0)==0?(ou(i,c[q>>2]|0)|0)!=0:0)g=1;else r=13;break}default:r=13}do if((r|0)==13){if((c[n>>2]|0)<3?c[m>>2]|0:0){g=2;break}g=0}while(0);c[p>>2]=g;r=20;break a}case 2:{c[q>>2]=4;r=IK(64)|0;o=c[(c[o>>2]|0)+12>>2]|0;u=+h[o+16>>3];w=+h[o+24>>3];v=+h[o+32>>3];t=+h[o+40>>3];tu(i,u,w);c[r>>2]=c[i>>2];c[r+4>>2]=c[i+4>>2];c[r+8>>2]=c[i+8>>2];c[r+12>>2]=c[i+12>>2];i=r+16|0;tu(j,v,w);c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];i=r+32|0;tu(k,v,t);c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];i=r+48|0;tu(m,u,t);c[i>>2]=c[m>>2];c[i+4>>2]=c[m+4>>2];c[i+8>>2]=c[m+8>>2];c[i+12>>2]=c[m+12>>2];c[p>>2]=1;i=r;r=20;break a}case 3:{c[p>>2]=2;i=pu(d,q,0.0,0.0)|0;r=20;break a}default:{c[n>>2]=c[c[(c[o>>2]|0)+8>>2]>>2];dA(1,94220,n)|0;g=1;break a}}else{c[q>>2]=4;v=+h[g+32>>3]*.5;w=+h[g+40>>3]*.5;c[p>>2]=1;i=IK(64)|0;h[i>>3]=v;h[i+8>>3]=w;u=-v;h[i+16>>3]=u;h[i+24>>3]=w;h[i+32>>3]=u;w=-w;h[i+40>>3]=w;h[i+48>>3]=v;h[i+56>>3]=w;r=20}while(0);if((r|0)==20){g=c[q>>2]|0;if(e!=1.0|f!=1.0)uu(i,g,e,f);c[b+36>>2]=i;c[b+32>>2]=g;ru(i,g,b,b+16|0);if((g|0)>(c[46956]|0)){c[46956]=g;g=0}else g=0}l=s;return g|0}function tu(a,b,c){a=a|0;b=+b;c=+c;h[a>>3]=b/72.0;h[a+8>>3]=c/72.0;return}function uu(a,b,c,d){a=a|0;b=b|0;c=+c;d=+d;var e=0,f=0;e=0;while(1){if((e|0)>=(b|0))break;h[a>>3]=c*+h[a>>3];f=a+8|0;h[f>>3]=d*+h[f>>3];a=a+16|0;e=e+1|0}return}function vu(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0;s=l;l=l+128|0;p=s+112|0;o=s+96|0;n=s+80|0;g=s+64|0;q=s+48|0;r=s+32|0;k=s+16|0;m=s;c[o>>2]=c[a>>2];c[o+4>>2]=c[a+4>>2];c[o+8>>2]=c[a+8>>2];c[o+12>>2]=c[a+12>>2];c[p>>2]=c[b>>2];c[p+4>>2]=c[b+4>>2];c[p+8>>2]=c[b+8>>2];c[p+12>>2]=c[b+12>>2];ts(q,o,p);i=b+16|0;c[o>>2]=c[a>>2];c[o+4>>2]=c[a+4>>2];c[o+8>>2]=c[a+8>>2];c[o+12>>2]=c[a+12>>2];c[p>>2]=c[i>>2];c[p+4>>2]=c[i+4>>2];c[p+8>>2]=c[i+8>>2];c[p+12>>2]=c[i+12>>2];ts(r,o,p);c[o>>2]=c[d>>2];c[o+4>>2]=c[d+4>>2];c[o+8>>2]=c[d+8>>2];c[o+12>>2]=c[d+12>>2];c[p>>2]=c[e>>2];c[p+4>>2]=c[e+4>>2];c[p+8>>2]=c[e+8>>2];c[p+12>>2]=c[e+12>>2];ts(k,o,p);j=e+16|0;c[o>>2]=c[d>>2];c[o+4>>2]=c[d+4>>2];c[o+8>>2]=c[d+8>>2];c[o+12>>2]=c[d+12>>2];c[p>>2]=c[j>>2];c[p+4>>2]=c[j+4>>2];c[p+8>>2]=c[j+8>>2];c[p+12>>2]=c[j+12>>2];ts(m,o,p);c[g>>2]=c[q>>2];c[g+4>>2]=c[q+4>>2];c[g+8>>2]=c[q+8>>2];c[g+12>>2]=c[q+12>>2];c[n>>2]=c[r>>2];c[n+4>>2]=c[r+4>>2];c[n+8>>2]=c[r+8>>2];c[n+12>>2]=c[r+12>>2];c[o>>2]=c[k>>2];c[o+4>>2]=c[k+4>>2];c[o+8>>2]=c[k+8>>2];c[o+12>>2]=c[k+12>>2];c[p>>2]=c[m>>2];c[p+4>>2]=c[m+4>>2];c[p+8>>2]=c[m+8>>2];c[p+12>>2]=c[m+12>>2];do if(wu(g,n,o,p)|0){f=c[b+40>>2]|0;g=e+40|0;if(f&1|0?c[g>>2]&1|0:0){f=1;break}if(f&2|0?c[g>>2]&2|0:0){t=+h[i>>3]-+h[b>>3]+ +h[j>>3]-+h[e>>3];v=+h[a>>3]-+h[d>>3];u=+h[a+8>>3]-+h[d+8>>3];f=!(v*v+u*u>t*t*.25);break}f=c[46957]|0;if(!f){c[46957]=IK(c[46956]<<4)|0;i=IK(c[46956]<<4)|0;c[46958]=i;f=c[46957]|0}else i=c[46958]|0;w=c[b+36>>2]|0;j=b+32|0;g=c[j>>2]|0;c[p>>2]=c[a>>2];c[p+4>>2]=c[a+4>>2];c[p+8>>2]=c[a+8>>2];c[p+12>>2]=c[a+12>>2];xu(w,g,p,f);a=c[e+36>>2]|0;g=e+32|0;e=c[g>>2]|0;c[p>>2]=c[d>>2];c[p+4>>2]=c[d+4>>2];c[p+8>>2]=c[d+8>>2];c[p+12>>2]=c[d+12>>2];xu(a,e,p,i);if(!(yu(c[46957]|0,i,c[j>>2]|0,c[g>>2]|0)|0)){f=c[46957]|0;c[n>>2]=c[f>>2];c[n+4>>2]=c[f+4>>2];c[n+8>>2]=c[f+8>>2];c[n+12>>2]=c[f+12>>2];c[o>>2]=c[k>>2];c[o+4>>2]=c[k+4>>2];c[o+8>>2]=c[k+8>>2];c[o+12>>2]=c[k+12>>2];c[p>>2]=c[m>>2];c[p+4>>2]=c[m+4>>2];c[p+8>>2]=c[m+8>>2];c[p+12>>2]=c[m+12>>2];if(zu(n,o,p)|0?(m=c[46958]|0,w=c[g>>2]|0,c[p>>2]=c[f>>2],c[p+4>>2]=c[f+4>>2],c[p+8>>2]=c[f+8>>2],c[p+12>>2]=c[f+12>>2],Au(m,w,p)|0):0){f=1;break}f=c[46958]|0;c[n>>2]=c[f>>2];c[n+4>>2]=c[f+4>>2];c[n+8>>2]=c[f+8>>2];c[n+12>>2]=c[f+12>>2];c[o>>2]=c[q>>2];c[o+4>>2]=c[q+4>>2];c[o+8>>2]=c[q+8>>2];c[o+12>>2]=c[q+12>>2];c[p>>2]=c[r>>2];c[p+4>>2]=c[r+4>>2];c[p+8>>2]=c[r+8>>2];c[p+12>>2]=c[r+12>>2];if(!(zu(n,o,p)|0))f=0;else{r=c[46957]|0;w=c[j>>2]|0;c[p>>2]=c[f>>2];c[p+4>>2]=c[f+4>>2];c[p+8>>2]=c[f+8>>2];c[p+12>>2]=c[f+12>>2];f=(Au(r,w,p)|0)!=0}}else f=1}else f=0;while(0);l=s;return f&1|0}function wu(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((+h[a>>3]<=+h[d>>3]?+h[c>>3]<=+h[b>>3]:0)?+h[a+8>>3]<=+h[d+8>>3]:0)a=+h[c+8>>3]<=+h[b+8>>3];else a=0;return a&1|0}function xu(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=c+8|0;e=0;while(1){if((e|0)>=(b|0))break;h[d>>3]=+h[a>>3]+ +h[c>>3];h[d+8>>3]=+h[a+8>>3]+ +h[f>>3];e=e+1|0;a=a+16|0;d=d+16|0}return}function yu(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=l;l=l+112|0;w=E+96|0;v=E+80|0;u=E+64|0;t=E+48|0;y=E+32|0;z=E+16|0;A=E;B=d+-1|0;C=e+-1|0;D=d<<1;x=e<<1;i=0;h=0;g=0;f=0;while(1){q=a+(i<<4)|0;p=a+(((B+i|0)%(d|0)|0)<<4)|0;c[v>>2]=c[q>>2];c[v+4>>2]=c[q+4>>2];c[v+8>>2]=c[q+8>>2];c[v+12>>2]=c[q+12>>2];c[w>>2]=c[p>>2];c[w+4>>2]=c[p+4>>2];c[w+8>>2]=c[p+8>>2];c[w+12>>2]=c[p+12>>2];ss(y,v,w);s=b+(h<<4)|0;r=b+(((C+h|0)%(e|0)|0)<<4)|0;c[v>>2]=c[s>>2];c[v+4>>2]=c[s+4>>2];c[v+8>>2]=c[s+8>>2];c[v+12>>2]=c[s+12>>2];c[w>>2]=c[r>>2];c[w+4>>2]=c[r+4>>2];c[w+8>>2]=c[r+8>>2];c[w+12>>2]=c[r+12>>2];ss(z,v,w);c[u>>2]=c[46578];c[u+4>>2]=c[46579];c[u+8>>2]=c[46580];c[u+12>>2]=c[46581];c[v>>2]=c[y>>2];c[v+4>>2]=c[y+4>>2];c[v+8>>2]=c[y+8>>2];c[v+12>>2]=c[y+12>>2];c[w>>2]=c[z>>2];c[w+4>>2]=c[z+4>>2];c[w+8>>2]=c[z+8>>2];c[w+12>>2]=c[z+12>>2];j=+us(u,v,w);c[u>>2]=c[p>>2];c[u+4>>2]=c[p+4>>2];c[u+8>>2]=c[p+8>>2];c[u+12>>2]=c[p+12>>2];c[v>>2]=c[q>>2];c[v+4>>2]=c[q+4>>2];c[v+8>>2]=c[q+8>>2];c[v+12>>2]=c[q+12>>2];c[w>>2]=c[s>>2];c[w+4>>2]=c[s+4>>2];c[w+8>>2]=c[s+8>>2];c[w+12>>2]=c[s+12>>2];k=vs(u,v,w)|0;c[u>>2]=c[r>>2];c[u+4>>2]=c[r+4>>2];c[u+8>>2]=c[r+8>>2];c[u+12>>2]=c[r+12>>2];c[v>>2]=c[s>>2];c[v+4>>2]=c[s+4>>2];c[v+8>>2]=c[s+8>>2];c[v+12>>2]=c[s+12>>2];c[w>>2]=c[q>>2];c[w+4>>2]=c[q+4>>2];c[w+8>>2]=c[q+8>>2];c[w+12>>2]=c[q+12>>2];m=vs(u,v,w)|0;c[t>>2]=c[p>>2];c[t+4>>2]=c[p+4>>2];c[t+8>>2]=c[p+8>>2];c[t+12>>2]=c[p+12>>2];c[u>>2]=c[q>>2];c[u+4>>2]=c[q+4>>2];c[u+8>>2]=c[q+8>>2];c[u+12>>2]=c[q+12>>2];c[v>>2]=c[r>>2];c[v+4>>2]=c[r+4>>2];c[v+8>>2]=c[r+8>>2];c[v+12>>2]=c[r+12>>2];c[w>>2]=c[s>>2];c[w+4>>2]=c[s+4>>2];c[w+8>>2]=c[s+8>>2];c[w+12>>2]=c[s+12>>2];if(ws(t,u,v,w,A)|0){f=1;break}q=(k|0)==0;r=(m|0)==0;n=(i+1|0)%(d|0)|0;s=f+1|0;o=(h+1|0)%(e|0)|0;p=g+1|0;do if(j!=0.0|(m|k|0)!=0)if(!(j>=0.0)){i=r?n:i;h=r?h:o;g=r?p:g;f=r?f:s;break}else{i=q?i:n;h=q?o:h;g=q?g:p;f=q?s:f;break}else{i=n;g=p}while(0);if(!((f|0)<(x|0)&((g|0)<(D|0)&((f|0)<(e|0)|(g|0)<(d|0))))){f=0;break}}l=E;return f|0}function zu(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0.0;e=+h[a>>3];if((e<=+h[c>>3]?e>=+h[b>>3]:0)?(d=+h[a+8>>3],d<=+h[c+8>>3]):0)a=d>=+h[b+8>>3];else a=0;return a&1|0}function Au(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0,i=0,j=0.0,k=0.0,l=0,m=0,n=0;e=c[46959]|0;if(!e){e=IK(c[46956]<<4)|0;c[46959]=e}i=d+8|0;g=0;while(1){if((g|0)>=(b|0))break;h[e+(g<<4)>>3]=+h[a+(g<<4)>>3]-+h[d>>3];h[e+(g<<4)+8>>3]=+h[a+(g<<4)+8>>3]-+h[i>>3];g=g+1|0}m=b+-1|0;f=0.0;l=0;a:while(1){if((l|0)>=(b|0)){n=18;break}d=(m+l|0)%(b|0)|0;j=+h[e+(l<<4)+8>>3];a=j==0.0;g=e+(l<<4)|0;i=e+(d<<4)|0;k=+h[e+(d<<4)+8>>3];d=k==0.0;do if(a&d){if(+h[g>>3]*+h[i>>3]<0.0){e=1;break a}}else{if(!(j>=0.0)|!(k<=0.0)?!(j<=0.0)|!(k>=0.0):0)break;j=(k*+h[g>>3]-j*+h[i>>3])/(k-j);if(j==0.0){e=1;break a}if(j>0.0)if(a|d){f=f+.5;break}else{f=f+1.0;break}}while(0);l=l+1|0}if((n|0)==18)e=((~~f|0)%2|0|0)==1&1;return e|0}function Bu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;j=IK(b<<2)|0;i=S(b,b)|0;d=IK(i<<2)|0;c[j>>2]=d;Yt(i,0.0,d);d=1;while(1){if((d|0)>=(b|0)){d=0;g=0;i=b;break}c[j+(d<<2)>>2]=(c[j>>2]|0)+((S(d,b)|0)<<2);d=d+1|0}while(1){if((g|0)>=(b|0))break;h=j+(g<<2)|0;e=g;f=d;while(1){if((e|0)==(b|0))break;k=c[a+(f<<2)>>2]|0;c[(c[h>>2]|0)+(e<<2)>>2]=k;c[(c[j+(e<<2)>>2]|0)+(g<<2)>>2]=k;e=e+1|0;f=f+1|0}d=d+i|0;g=g+1|0;i=i+-1|0}return j|0}function Cu(a,b,d,e,f,h,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;i=i|0;j=+j;var k=0.0,l=0.0,m=0.0,n=0,o=0.0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0,B=0,C=0,D=0,E=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;N=c[d+(f<<2)>>2]|0;C=c[a+4>>2]|0;D=c[a>>2]|0;E=c[a+48>>2]|0;G=c[a+52>>2]|0;H=c[a+56>>2]|0;a:do if((h|0)<1)d=0;else{Eu(N,C,E,G,H,j);I=c[a+28>>2]|0;J=c[a+32>>2]|0;K=c[a+36>>2]|0;L=c[a+12>>2]|0;M=c[a+16>>2]|0;f=0;e=0;d=-1;while(1){if((f|0)>=(C|0))break;if((f|0)>=(e|0)){d=d+1|0;if((d|0)==(H|0)){e=C;d=H}else e=c[G+(d<<2)>>2]|0}c[M+(c[E+(f<<2)>>2]<<2)>>2]=d;f=f+1|0}A=c[a+40>>2]|0;B=J+(C+-1<<2)|0;d=0;e=0;while(1){if(e<<24>>24==0&(d|0)<(h|0)){k=-1.0e9;f=0;e=1}else break a;b:while(1){y=f;while(1){if((y|0)>=(C|0))break b;f=c[E+(y<<2)>>2]|0;z=+g[N+(f<<2)>>2];o=z;x=y;l=0.0;while(1){g[A+(f<<2)>>2]=l;f=x+1|0;w=E+(f<<2)|0;if((f|0)>=(C|0)){v=0;break}l=(c[M+(f<<2)>>2]|0)>(c[M+(x<<2)>>2]|0)?o+j:o;a=c[w>>2]|0;m=+g[N+(a<<2)>>2];if(+F(+(m-l))>1.0e-09){v=1;break}o=l;x=f;l=m-z;f=a}n=y;while(1){if((n|0)>(x|0)){a=0;p=y;break}p=c[E+(n<<2)>>2]|0;q=c[D+(p<<2)>>2]|0;a=0;l=-+g[b+(p<<2)>>2];while(1){if((a|0)>=(C|0))break;if((a|0)!=(p|0))l=l+ +g[q+(a<<2)>>2]*+g[N+(a<<2)>>2];a=a+1|0}g[I+(p<<2)>>2]=l/-+g[q+(p<<2)>>2]-+g[A+(p<<2)>>2];n=n+1|0}c:while(1){if((p|0)>(x|0)){m=0.0;o=0.0;r=0;break}n=c[M+(c[E+(p<<2)>>2]<<2)>>2]|0;if((n|0)==(H|0))r=f;else{r=c[G+(n<<2)>>2]|0;r=(f|0)<(r|0)?f:r}q=p;while(1){if((q|0)>=(r|0)){q=p;break}n=c[E+(q<<2)>>2]|0;if(+g[I+(n<<2)>>2]>2]=n;a=a+1|0}q=q+1|0}while(1){if((q|0)>=(r|0))break;n=c[E+(q<<2)>>2]|0;if(+g[I+(n<<2)>>2]==z){c[L+(a<<2)>>2]=n;a=a+1|0}q=q+1|0}while(1){if((p|0)>=(r|0)){p=r;continue c}n=c[E+(p<<2)>>2]|0;if(+g[I+(n<<2)>>2]>z){c[L+(a<<2)>>2]=n;a=a+1|0}p=p+1|0}}while(1){if((r|0)>=(a|0))break;p=c[L+(r<<2)>>2]|0;q=c[D+(p<<2)>>2]|0;l=0.0;n=0;while(1){if((n|0)==(r|0))break;l=l-+g[q+(c[L+(n<<2)>>2]<<2)>>2];n=n+1|0}l=l*2.0;u=q+(p<<2)|0;s=+g[u>>2];s=(z*l+(o*m-s*+g[I+(p<<2)>>2]))/(l+(m-s));g[J+(r<<2)>>2]=s;m=m+(l-+g[u>>2]);o=s;r=r+1|0}q=(a|0)==(C|0);if(q)g[B>>2]=z;u=a+-1|0;m=0.0;o=0.0;p=u;while(1){if((p|0)<=-1)break;r=c[L+(p<<2)>>2]|0;t=c[D+(r<<2)>>2]|0;l=0.0;n=p;while(1){n=n+1|0;if((n|0)>=(a|0))break;l=l-+g[t+(c[L+(n<<2)>>2]<<2)>>2]}l=l*2.0;t=t+(r<<2)|0;s=+g[t>>2];s=(z*l+(o*m-s*+g[I+(r<<2)>>2]))/(l+(m-s));g[K+(p<<2)>>2]=s;m=m+(l-+g[t>>2]);o=s;p=p+-1|0}if(q){g[K>>2]=z;s=0.0;n=-1;q=0}else{s=0.0;n=-1;q=0}while(1){if((a|0)<=(q|0))break;o=+g[K+(q<<2)>>2];if((q|0)>0)l=+g[J+(q+-1<<2)>>2];else l=o;do if(oz;if(os;s=t?o:s;n=t?q:n;q=q+1|0}r=E+(x<<2)|0;p=c[L+(u<<2)>>2]|0;q=N+(p<<2)|0;if((n|0)>-1)break;k=+g[q>>2];if(!v){y=f;continue}k=(c[M+(c[w>>2]<<2)>>2]|0)>(c[M+(c[r>>2]<<2)>>2]|0)?k+j:k;y=f}o=+g[K+(n<<2)>>2];if(!n)s=o;else s=+g[J+(n+-1<<2)>>2];do if(v){u=c[w>>2]|0;m=+g[N+(u<<2)>>2];l=+g[A+(p<<2)>>2];if((c[M+(u<<2)>>2]|0)>(c[M+(c[r>>2]<<2)>>2]|0)){l=m-j-l;break}else{l=m-l;break}}else l=1.0e9;while(0);l=ok?s:k;do if(lz;if(l=(n|0))break;u=c[L+(p<<2)>>2]|0;g[N+(u<<2)>>2]=l+ +g[A+(u<<2)>>2];p=p+1|0}while(1){if((n|0)>=(a|0))break;u=c[L+(n<<2)>>2]|0;g[N+(u<<2)>>2]=m+ +g[A+(u<<2)>>2];n=n+1|0}k=+g[q>>2];if(v)k=(c[M+(c[w>>2]<<2)>>2]|0)>(c[M+(c[r>>2]<<2)>>2]|0)?k+j:k;a=y;while(1){if((a|0)>(x|0))break;c[E+(a<<2)>>2]=c[L+(a-y<<2)>>2];a=a+1|0}if(e<<24>>24!=0?+F(+(l-z))<.01:0)e=+F(+(m-z))<.01;else e=0;e=e&1}Pt(C,N);Du(N,E,G,H,i);d=d+1|0}}while(0);return d|0}function Du(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=0;while(1){if((g|0)>=(e|0))break;c[f+(g<<2)>>2]=c[a+(c[b+((c[d+(g<<2)>>2]|0)+-1<<2)>>2]<<2)>>2];g=g+1|0}return}function Eu(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;h=+h;var i=0.0,j=0,k=0,l=0,m=0;i=-1.0e9;k=0;j=-1;m=0;while(1){if((m|0)>=(b|0))break;if((m|0)<(k|0))l=k;else{j=j+1|0;if((j|0)==(f|0))k=b;else k=c[e+(j<<2)>>2]|0;if((m|0)>0)i=+g[a+(c[d+(m+-1<<2)>>2]<<2)>>2]+h;else i=-1.0e9;dt(a,d,m,k+-1|0);l=k}k=a+(c[d+(m<<2)>>2]<<2)|0;if(+g[k>>2]>2]=i;k=l;m=m+1|0}return}function Fu(a){a=a|0;l6(c[c[a>>2]>>2]|0);l6(c[a>>2]|0);l6(c[a+8>>2]|0);l6(c[a+28>>2]|0);l6(c[a+32>>2]|0);l6(c[a+36>>2]|0);l6(c[a+40>>2]|0);l6(c[a+12>>2]|0);l6(c[a+16>>2]|0);l6(c[a+20>>2]|0);l6(c[a+24>>2]|0);l6(a);return}function Gu(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;k=IK(60)|0;c[k>>2]=0;l=k+4|0;c[l>>2]=b;c[k+48>>2]=d;c[k+52>>2]=e;c[k+56>>2]=f;c[k>>2]=Bu(a,b)|0;i=b<<2;j=IK(i)|0;c[k+8>>2]=j;h=0;b=0;a=-1;while(1){if((h|0)>=(c[l>>2]|0))break;g=a+1|0;if((h|0)>=(b|0)){b=c[((g|0)==(f|0)?l:e+(g<<2)|0)>>2]|0;a=g}c[j+(c[d+(h<<2)>>2]<<2)>>2]=a;h=h+1|0}c[k+28>>2]=IK(i)|0;c[k+32>>2]=IK(i)|0;c[k+36>>2]=IK(i)|0;c[k+40>>2]=IK(i)|0;c[k+12>>2]=IK(i)|0;c[k+16>>2]=IK(i)|0;c[k+20>>2]=IK(i)|0;c[k+24>>2]=IK(i)|0;return k|0}function Hu(){cu(187844,24);c[46964]=0;return}function Iu(){return eu(187844)|0}function Ju(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+h[a>>3]-+h[b>>3];c=+h[a+8>>3]-+h[b+8>>3];return +(+G(+(d*d+c*c)))}function Ku(a){a=a|0;var b=0;b=c[46964]|0;c[a+16>>2]=b;c[46964]=b+1;return}function Lu(a){a=a|0;var b=0,d=0;d=a+20|0;b=(c[d>>2]|0)+-1|0;c[d>>2]=b;if(!b)fu(a,187844);return}function Mu(a){a=a|0;a=a+20|0;c[a>>2]=(c[a>>2]|0)+1;return}function Nu(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;var i=0,j=0,k=0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;x=l;l=l+16|0;o=x;c[o>>2]=e;q=b<<2;u=IK(q)|0;k=b<<3;v=IK(k)|0;t=Ys(a,b)|0;a=0;while(1){if((a|0)>=(b|0))break;j=t+(a<<2)|0;i=0;while(1){if((i|0)==(b|0))break;s=(c[j>>2]|0)+(i<<2)|0;c[s>>2]=c[s>>2]<<8;i=i+1|0}a=a+1|0}if(!d)Aa(94253,94261,283,94275);s=IK(k)|0;a=0;while(1){if((a|0)>=(b|0))break;h[s+(a<<3)>>3]=+h[d+(a<<3)>>3];a=a+1|0}Ou(s,b);m=0.0;n=0.0;k=1;while(1){if((k|0)>=(b|0))break;i=t+(k<<2)|0;j=d+(k<<3)|0;a=0;while(1){if((a|0)==(k|0))break;y=c[(c[i>>2]|0)+(a<<2)>>2]|0;r=+F(+(+h[j>>3]-+h[d+(a<<3)>>3]));m=m+r*(1.0/+(S(y,y)|0)*r);n=n+1.0/+(y|0)*r;a=a+1|0}k=k+1|0}r=n/m;a=0;while(1){if((a|0)>=(b|0))break;y=d+(a<<3)|0;h[y>>3]=r*+h[y>>3];a=a+1|0}Pu(b,o,f,d,t);j=IK(S(q,b)|0)|0;i=0;while(1){if((i|0)>=(b|0)){o=1;break}k=j+((S(i,b)|0)<<2)|0;c[u+(i<<2)>>2]=k;o=t+(i<<2)|0;m=0.0;a=0;while(1){if((a|0)==(b|0))break;if((a|0)!=(i|0)){p=+(c[(c[o>>2]|0)+(a<<2)>>2]|0);p=-1.0/(p*p);g[k+(a<<2)>>2]=p;m=m-p}a=a+1|0}g[k+(i<<2)>>2]=m;i=i+1|0}while(1){if((o|0)>=(b|0)){i=0;break}n=+h[d+(o<<3)>>3];j=t+(o<<2)|0;i=0;while(1){if((i|0)==(o|0))break;k=(c[j>>2]|0)+(i<<2)|0;p=+(c[k>>2]|0);m=n-+h[d+(i<<3)>>3];m=p*p-m*m;if(m>0.0)a=~~+G(+m);else a=0;c[(c[t+(i<<2)>>2]|0)+(o<<2)>>2]=a;c[k>>2]=a;i=i+1|0}o=o+1|0}while(1){if((i|0)>=(b|0)){q=0;a=0;break}n=+h[e+(i<<3)>>3];k=v+(i<<3)|0;h[k>>3]=0.0;o=t+(i<<2)|0;j=u+(i<<2)|0;a=0;m=0.0;while(1){if((a|0)==(b|0))break;if((a|0)!=(i|0)){p=+(c[(c[o>>2]|0)+(a<<2)>>2]|0)*+g[(c[j>>2]|0)+(a<<2)>>2];m=m+(n>=+h[e+(a<<3)>>3]?-p:p);h[k>>3]=m}a=a+1|0}i=i+1|0}while(1){if(!(a<<24>>24==0&(q|0)<200)){a=0;w=58;break}if((wr(u,e,v,b,f,b,1)|0)<0){a=1;break}else{a=1;o=0}while(1){if((o|0)>=(b|0))break;p=+h[e+(o<<3)>>3];j=t+(o<<2)|0;k=u+(o<<2)|0;m=0.0;i=0;while(1){if((i|0)==(b|0))break;do if((i|0)!=(o|0)){n=+(c[(c[j>>2]|0)+(i<<2)>>2]|0)*+g[(c[k>>2]|0)+(i<<2)>>2];if(!(p>=+h[e+(i<<3)>>3])){m=m+n;break}else{m=m+-n;break}}while(0);i=i+1|0}i=v+(o<<3)|0;p=+h[i>>3];if(m!=p?+F(+(1.0-m/p))>1.0e-05:0){h[i>>3]=m;a=0}o=o+1|0}q=q+1|0}a:do if((w|0)==58)while(1){if((a|0)>=(b|0)){a=0;break a}w=d+(a<<3)|0;h[w>>3]=+h[w>>3]/r;w=e+(a<<3)|0;h[w>>3]=+h[w>>3]/r;a=a+1|0;w=58}while(0);l6(c[t>>2]|0);l6(t);l6(c[u>>2]|0);l6(u);l6(s);l6(v);l=x;return a|0}function Ou(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0.0,f=0;c=0;d=0.0;while(1){if((c|0)>=(b|0))break;e=d+ +h[a+(c<<3)>>3];c=c+1|0;d=e}d=d/+(b|0);c=0;while(1){if((c|0)>=(b|0))break;f=a+(c<<3)|0;h[f>>3]=+h[f>>3]-d;c=c+1|0}f=b+-1|0;yt(a,0,f,1.0/+xt(a,0,f),a);return}function Pu(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0;k=Qu(f,a)|0;l=IK(8)|0;if(!e){f=0;j=0}else{g=IK(a<<3)|0;f=0;while(1){if((f|0)>=(a|0))break;h[g+(f<<3)>>3]=+h[e+(f<<3)>>3];f=f+1|0}Ou(g,a);f=g;j=g}Ru(k,a,b,l,f,d);e=0;while(1){if((e|0)==1)break;g=l+(e<<3)|0;i=b+(e<<2)|0;f=0;while(1){if((f|0)>=(a|0))break;d=+G(+(+F(+(+h[g>>3]))));m=(c[i>>2]|0)+(f<<3)|0;h[m>>3]=d*+h[m>>3];f=f+1|0}e=e+1|0}l6(c[k>>2]|0);l6(k);l6(l);l6(j);return}function Qu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0.0;o=l;l=l+16|0;f=o;n=b<<2;e=IK(S(n,b)|0)|0;n=IK(n)|0;d=0;while(1){if((d|0)>=(b|0))break;c[n+(d<<2)>>2]=e+((S(d,b)|0)<<2);d=d+1|0}m=Tu(a,b,f)|0;h=+g[f>>2];e=0;k=1;while(1){if((e|0)>=(b|0))break;f=a+(e<<2)|0;i=m+(e<<2)|0;j=n+(e<<2)|0;d=0;while(1){if((d|0)==(k|0))break;p=+(c[(c[f>>2]|0)+(d<<2)>>2]|0);p=+g[m+(d<<2)>>2]+(+g[i>>2]-p*p)-h;g[(c[j>>2]|0)+(d<<2)>>2]=p;g[(c[n+(d<<2)>>2]|0)+(e<<2)>>2]=p;d=d+1|0}e=e+1|0;k=k+1|0}l6(m);l=o;return n|0}function Ru(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=+g;var i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0;r=b<<3;q=IK(r)|0;r=IK(r)|0;n=1.0-g;o=(b|0)<1?b:1;p=b+-1|0;k=(f|0)==0;j=0;a:while(1){if((j|0)>=(o|0))break;l=c[d+(j<<2)>>2]|0;do{i=0;while(1){if((i|0)==(b|0))break;h[l+(i<<3)>>3]=+((U4()|0)%100|0|0);i=i+1|0}if(k)i=0;else{wt(l,0,p,-+vt(f,0,p,l),f);i=0}while(1){if((i|0)==(j|0))break;s=d+(i<<2)|0;m=-+vt(c[s>>2]|0,0,p,l);wt(l,0,p,m,c[s>>2]|0);i=i+1|0}g=+xt(l,0,p)}while(g<1.0e-10);yt(l,0,p,1.0/g,l);do{zt(r,0,p,l);Su(a,b,b,l,q,f);zt(l,0,p,q);i=0;while(1){if((i|0)==(j|0))break;s=d+(i<<2)|0;m=-+vt(c[s>>2]|0,0,p,l);wt(l,0,p,m,c[s>>2]|0);i=i+1|0}g=+xt(l,0,p);if(g<1.0e-10)break a;yt(l,0,p,1.0/g,l);m=+vt(l,0,p,r)}while(+F(+m)>3]=g*m;j=j+1|0}while(1){if((j|0)>=(o|0))break;k=c[d+(j<<2)>>2]|0;i=0;while(1){if((i|0)>=(b|0)){i=0;break}h[k+(i<<3)>>3]=+((U4()|0)%100|0|0);i=i+1|0}while(1){if((i|0)>=(j|0))break;s=d+(i<<2)|0;n=-+vt(c[s>>2]|0,0,p,k);wt(k,0,p,n,c[s>>2]|0);i=i+1|0}yt(k,0,p,1.0/+xt(k,0,p),k);h[e+(j<<3)>>3]=0.0;j=j+1|0}l=o+-1|0;j=0;while(1){if((j|0)>=(l|0))break;a=e+(j<<3)|0;f=j+1|0;g=+h[a>>3];i=j;k=f;while(1){if((k|0)>=(o|0))break;n=+h[e+(k<<3)>>3];s=g>2]|0);s=d+(i<<2)|0;zt(c[b>>2]|0,0,p,c[s>>2]|0);zt(c[s>>2]|0,0,p,q);h[e+(i<<3)>>3]=+h[a>>3];h[a>>3]=g;j=f}l6(q);l6(r);return}function Su(a,b,d,e,f,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;i=i|0;var j=0,k=0.0,l=0,m=0;j=0;while(1){if((j|0)>=(b|0))break;m=a+(j<<2)|0;k=0.0;l=0;while(1){if((l|0)>=(d|0))break;k=k+ +g[(c[m>>2]|0)+(l<<2)>>2]*+h[e+(l<<3)>>3];l=l+1|0}h[f+(j<<3)>>3]=k;j=j+1|0}j=b+-1|0;if(i|0)wt(f,0,j,-+vt(f,0,j,i),i);return}function Tu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,h=0,i=0,j=0,k=0.0,l=0,m=0.0;j=IK(b<<2)|0;k=+(b|0);e=0.0;i=0;while(1){if((i|0)>=(b|0))break;l=a+(i<<2)|0;f=0.0;h=0;while(1){if((h|0)==(b|0))break;m=+(c[(c[l>>2]|0)+(h<<2)>>2]|0);m=m*m;f=f+m;h=h+1|0;e=e+m}g[j+(i<<2)>>2]=f/k;i=i+1|0}g[d>>2]=e/+(S(b,b)|0);return j|0}function Uu(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0.0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0;q=S(d,d)|0;r=IK(q<<3)|0;s=IK(d<<3)|0;e=0;while(1){if((e|0)>=(d|0))break;h[s+(e<<3)>>3]=+h[c+(e<<3)>>3];e=e+1|0}e=0;while(1){if((e|0)>=(q|0))break;h[r+(e<<3)>>3]=+h[a+(e<<3)>>3];e=e+1|0}p=d+-1|0;g=0;o=0;a:while(1){if((o|0)<(p|0)){f=0.0;e=o}else{l=21;break}while(1){if((e|0)>=(d|0))break;t=+F(+(+h[a+((S(e,d)|0)+o<<3)>>3]));m=t=(d|0))break;l=a+(e+i<<3)|0;t=+h[l>>3];m=a+(e+n<<3)|0;h[l>>3]=+h[m>>3];h[m>>3]=t;e=e+1|0}m=c+(g<<3)|0;t=+h[m>>3];j=c+(o<<3)|0;h[m>>3]=+h[j>>3];h[j>>3]=t;m=o+1|0;k=a+(n+o<<3)|0;e=m;while(1){if((e|0)>=(d|0)){o=m;continue a}l=S(e,d)|0;f=+h[a+(l+o<<3)>>3]/+h[k>>3];i=c+(e<<3)|0;h[i>>3]=+h[i>>3]-f*+h[j>>3];i=0;while(1){if((i|0)>=(d|0))break;u=a+(i+l<<3)|0;h[u>>3]=+h[u>>3]-f*+h[a+(i+n<<3)>>3];i=i+1|0}e=e+1|0}}if((l|0)==21){f=+h[a+(q+-1<<3)>>3];if(+F(+f)<1.0e-10)l=33;else{h[b+(p<<3)>>3]=+h[c+(p<<3)>>3]/f;e=0;while(1){if((e|0)>=(p|0)){e=0;break}g=d-e|0;i=g+-2|0;f=+h[c+(i<<3)>>3];j=b+(i<<3)|0;h[j>>3]=f;k=S(i,d)|0;g=g+-1|0;while(1){if((g|0)>=(d|0))break;t=f-+h[a+(g+k<<3)>>3]*+h[b+(g<<3)>>3];h[j>>3]=t;g=g+1|0;f=t}h[j>>3]=f/+h[a+(k+i<<3)>>3];e=e+1|0}while(1){if((e|0)>=(d|0)){e=0;break}h[c+(e<<3)>>3]=+h[s+(e<<3)>>3];e=e+1|0}while(1){if((e|0)>=(q|0))break;h[a+(e<<3)>>3]=+h[r+(e<<3)>>3];e=e+1|0}l6(r);l6(s)}}if((l|0)==33){Z5(94290)|0;l6(r);l6(s)}return}function Vu(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,g=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;s=l;l=l+16|0;r=s;js();Hu();Es();c[46960]=ib[d&3]()|0;Gs();q=r+8|0;p=ib[d&3]()|0;e=0.0;f=0.0;a:while(1){n=(p|0)==0;o=p+8|0;while(1){if(!(As()|0)){Bs(r);e=+h[r>>3];f=+h[q>>3]}if(!n){if(As()|0)break;g=+h[o>>3];if(g>3]>2]|0;Ku(j);ns(c[t+8>>2]|0,a[t+16>>0]|0,j);ns(c[v+8>>2]|0,a[v+16>>0]|0,j);Ns(t);zs(v);Ns(v);v=+h[m+8>>3]>+h[u+8>>3];t=v&1;k=v?u:m;u=ks(k,v?m:u)|0;m=Hs(u,t)|0;Ks(b,m);ns(u,(t^1)&255,j);Lu(j);j=Is(b,m)|0;if(j|0){zs(b);xs(b,j,+Ju(j,k))}b=Is(m,i)|0;if(!b)continue;xs(m,b,+Ju(b,k))}b=Ls(p)|0;k=Os(b)|0;i=ks(Rs(b)|0,p)|0;m=Hs(i,0)|0;Ks(b,m);j=Is(b,m)|0;if(j|0){zs(b);xs(b,j,+Ju(j,p))}i=Hs(i,1)|0;Ks(m,i);b=Is(i,k)|0;if(b|0)xs(i,b,+Ju(b,p));p=ib[d&3]()|0}b=c[46902]|0;while(1){b=Os(b)|0;if((b|0)==(c[46903]|0))break;ls(c[b+8>>2]|0)}l=s;return}function Wu(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=l;l=l+16|0;g=h+8|0;f=h;do if((qB(b)|0)!=1){Xu(b);if(!d)d=Yu(b)|0;e=Zu(b,d)|0;if(a[195234]|0){i=c[15715]|0;c[f>>2]=HB(d)|0;c[f+4>>2]=e;z4(i,94306,f)|0}if((e|0)<0){dA(1,94340,g)|0;break}else{_u(b);$u(b,d);av(b,d);bv(b,e);break}}else{i=c[(c[(gC(b)|0)+16>>2]|0)+132>>2]|0;c[i>>2]=0;c[i+4>>2]=0;c[i+8>>2]=0;c[i+12>>2]=0}while(0);l=h;return d|0}function Xu(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;d=qB(a)|0;d=S(d,d)|0;b=gC(a)|0;while(1){if(!b)break;e=b+16|0;f=c[(c[e>>2]|0)+112>>2]|0;g=f+24|0;c[g>>2]=d;c[g+4>>2]=0;h[f+48>>3]=10.0;f=(jv(a,b)|0)==0;e=c[(c[e>>2]|0)+112>>2]|0;c[e>>2]=f?d:0;c[e+4>>2]=f?0:0;b=hC(a,b)|0}return}function Yu(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;e=(qB(a)|0)<3;b=gC(a)|0;a:do if(!e){while(1){if(!b)break;e=c[(c[b+16>>2]|0)+112>>2]|0;if((c[e>>2]|0)==0&(c[e+4>>2]|0)==0)iv(a,b,0);b=hC(a,b)|0}d=0;b=0;e=gC(a)|0;while(1){if(!e)break a;h=c[(c[e+16>>2]|0)+112>>2]|0;g=c[h>>2]|0;h=c[h+4>>2]|0;f=((d|0)<0)<<31>>31;f=h>>>0>f>>>0|(h|0)==(f|0)&g>>>0>d>>>0;d=f?g:d;b=f?e:b;e=hC(a,e)|0}}while(0);return b|0}function Zu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=c[(c[b+16>>2]|0)+112>>2]|0;f=d+24|0;e=c[f>>2]|0;c[f>>2]=0;c[f+4>>2]=0;c[d+32>>2]=0;fv(a,b);d=gC(a)|0;e=y6(0,e|0,32)|0;f=D;b=0;while(1){if(!d)break;h=(c[(c[d+16>>2]|0)+112>>2]|0)+24|0;g=c[h>>2]|0;h=c[h+4>>2]|0;if((g|0)==(e|0)&(h|0)==(f|0)){b=-1;break}i=((b|0)<0)<<31>>31;b=h>>>0>i>>>0|(h|0)==(i|0)&g>>>0>b>>>0?g:b;d=hC(a,d)|0}return b|0}function _u(a){a=a|0;var b=0,d=0,e=0,f=0;d=gC(a)|0;while(1){if(!d)break;b=c[(c[d+16>>2]|0)+112>>2]|0;e=b+16|0;a:do if((c[e>>2]|0)==0&(c[e+4>>2]|0)==0)while(1){e=b+8|0;f=e;f=w6(c[f>>2]|0,c[f+4>>2]|0,1,0)|0;c[e>>2]=f;c[e+4>>2]=D;b=c[b+32>>2]|0;if(!b)break a;b=c[(c[b+16>>2]|0)+112>>2]|0}while(0);d=hC(a,d)|0}return}function $u(a,b){a=a|0;b=b|0;h[(c[(c[b+16>>2]|0)+112>>2]|0)+40>>3]=6.283185307179586;ev(a,b);return}function av(a,b){a=a|0;b=b|0;h[(c[(c[b+16>>2]|0)+112>>2]|0)+48>>3]=0.0;dv(a,b);return}function bv(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0.0,m=0.0;j=l;l=l+16|0;g=j;i=cv(b,d)|0;if(a[195234]|0){f=c[15715]|0;Z3(94396,f)|0;e=0;while(1){if((e|0)>(d|0))break;h[g>>3]=+h[i+(e<<3)>>3];z4(f,94415,g)|0;e=e+1|0}Z3(153748,f)|0}e=gC(b)|0;while(1){if(!e)break;g=c[e+16>>2]|0;f=c[g+112>>2]|0;k=+h[i+(c[f+24>>2]<<3)>>3];f=f+48|0;m=k*+I(+(+h[f>>3]));g=c[g+132>>2]|0;h[g>>3]=m;h[g+8>>3]=k*+J(+(+h[f>>3]));e=hC(b,e)|0}l6(i);l=j;return}function cv(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0.0,j=0,k=0,m=0,n=0;n=l;l=l+16|0;k=n;m=HK((d<<3)+8|0)|0;b=_O(b,DA(c[b+60>>2]|0,0,101589,0)|0,0)|0;a:do if(!b){f=1.0;e=0.0;b=1}else{i=0.0;e=0.0;g=1;b:while(1){if((g|0)>(d|0)){f=i;b=g;break a}f=+b6(b,k);if(!(f>0.0)){f=i;b=g;break a}i=f>.02?f:.02;e=e+i;j=g+1|0;h[m+(g<<3)>>3]=e;b=c[k>>2]|0;while(1){g=a[b>>0]|0;if(!(g<<24>>24)){g=j;continue b}if(!(g<<24>>24==58|(X1(g<<24>>24)|0)!=0)){g=j;continue b}b=b+1|0}}}while(0);while(1){if((b|0)>(d|0))break;i=f+e;h[m+(b<<3)>>3]=i;b=b+1|0;e=i}l=n;return m|0}function dv(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0,g=0,i=0,j=0.0;d=c[(c[b+16>>2]|0)+112>>2]|0;if(!(c[d+32>>2]|0))e=0.0;else e=+h[d+48>>3]-+h[d+40>>3]*.5;g=ZA(a,b)|0;while(1){if(!g)break;d=c[g>>2]&3;f=c[((d|0)==3?g:g+48|0)+40>>2]|0;if((f|0)==(b|0))f=c[((d|0)==2?g:g+-48|0)+40>>2]|0;d=c[(c[f+16>>2]|0)+112>>2]|0;if((c[d+32>>2]|0)==(b|0)?(i=d+48|0,!(+h[i>>3]!=10.0)):0){j=+h[d+40>>3];h[i>>3]=e+j*.5;e=e+j;d=d+16|0;if(!((c[d>>2]|0)==0&(c[d+4>>2]|0)==0))dv(a,f)}g=_A(a,g,b)|0}return}function ev(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0,i=0,j=0;e=c[(c[b+16>>2]|0)+112>>2]|0;f=e+8|0;g=+h[e+40>>3]/(+((c[f>>2]|0)>>>0)+4294967296.0*+((c[f+4>>2]|0)>>>0));f=ZA(a,b)|0;while(1){if(!f)break;e=c[f>>2]&3;d=c[((e|0)==3?f:f+48|0)+40>>2]|0;if((d|0)==(b|0))d=c[((e|0)==2?f:f+-48|0)+40>>2]|0;e=c[(c[d+16>>2]|0)+112>>2]|0;if(((c[e+32>>2]|0)==(b|0)?(i=e+40|0,!(+h[i>>3]!=0.0)):0)?(j=e+8|0,h[i>>3]=g*(+((c[j>>2]|0)>>>0)+4294967296.0*+((c[j+4>>2]|0)>>>0)),e=e+16|0,!((c[e>>2]|0)==0&(c[e+4>>2]|0)==0)):0)ev(a,d);f=_A(a,f,b)|0}return}function fv(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;p=l;l=l+16|0;n=p;o=DA(b,2,101842,0)|0;c[n+4>>2]=0;c[n>>2]=0;gv(n,d);j=(o|0)==0;a:while(1){k=hv(n)|0;if(!k)break;m=k+16|0;h=c[(c[(c[m>>2]|0)+112>>2]|0)+24>>2]|0;g=ZA(b,k)|0;h=w6(0,h|0,0,1)|0;h=y6(h|0,D|0,32)|0;i=D;while(1){if(!g)continue a;if(!((!j?(a[(OA(g,o)|0)>>0]|0)==48:0)?!(f2(OA(g,o)|0,138697)|0):0)){d=c[g>>2]&3;e=c[((d|0)==3?g:g+48|0)+40>>2]|0;if((e|0)==(k|0))e=c[((d|0)==2?g:g+-48|0)+40>>2]|0;d=c[(c[e+16>>2]|0)+112>>2]|0;f=d+24|0;q=f;r=c[q+4>>2]|0;if(i>>>0>>0|((i|0)==(r|0)?h>>>0<(c[q>>2]|0)>>>0:0)){r=f;c[r>>2]=h;c[r+4>>2]=i;c[d+32>>2]=k;r=(c[(c[m>>2]|0)+112>>2]|0)+16|0;q=r;q=w6(c[q>>2]|0,c[q+4>>2]|0,1,0)|0;c[r>>2]=q;c[r+4>>2]=D;gv(n,e)}}g=_A(b,g,k)|0}}l=p;return}function gv(a,b){a=a|0;b=b|0;var d=0,e=0;d=HK(8)|0;c[d>>2]=b;b=a+4|0;e=c[b>>2]|0;c[((e|0)==0?a:e+4|0)>>2]=d;c[b>>2]=d;return}function hv(a){a=a|0;var b=0,d=0;d=c[a>>2]|0;if(d){b=c[d>>2]|0;c[a>>2]=c[d+4>>2];l6(d);if(!(c[a>>2]|0))c[a+4>>2]=0}else b=0;return b|0}function iv(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=c[c[(c[b+16>>2]|0)+112>>2]>>2]|0;g=ZA(a,b)|0;h=w6(0,h|0,0,1)|0;h=y6(h|0,D|0,32)|0;i=D;while(1){if(!g)break;f=c[g>>2]&3;e=c[((f|0)==3?g:g+48|0)+40>>2]|0;if((e|0)==(b|0))e=c[((f|0)==2?g:g+-48|0)+40>>2]|0;if((e|0)!=(d|0)?(j=c[(c[e+16>>2]|0)+112>>2]|0,f=j,k=c[f+4>>2]|0,i>>>0>>0|((i|0)==(k|0)?h>>>0<(c[f>>2]|0)>>>0:0)):0){k=j;c[k>>2]=h;c[k+4>>2]=i;iv(a,e,b)}g=_A(a,g,b)|0}return}function jv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=0;g=ZA(a,b)|0;while(1){if(!g){d=1;break}e=c[g>>2]&3;d=c[((e|0)==3?g:g+48|0)+40>>2]|0;if((d|0)==(b|0))d=c[((e|0)==2?g:g+-48|0)+40>>2]|0;if((d|0)!=(b|0)){if(f)if((f|0)==(d|0))d=f;else{d=0;break}}else d=f;f=d;g=_A(a,g,b)|0}return d|0}function kv(a){a=a|0;var b=0,d=0,e=0,f=0.0,g=0;b=l;l=l+32|0;e=b;d=DA(a,1,94423,0)|0;g=DA(a,0,94423,0)|0;a=lv(a,g,d,DA(a,0,94428,0)|0)|0;d=a+16|0;f=+G(+(+h[a>>3]+.1));wv(e,0.0,0.0,f,f);c[d>>2]=c[e>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[d+12>>2]=c[e+12>>2];c[d+16>>2]=c[e+16>>2];c[d+20>>2]=c[e+20>>2];c[d+24>>2]=c[e+24>>2];c[d+28>>2]=c[e+28>>2];mv(a);nv(a);ov(a);l=b;return}function lv(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=HK(72)|0;c[o+60>>2]=0;c[o+56>>2]=a;k=a+16|0;f=0.0;l=0;i=1;j=0;m=0;while(1){g=c[k>>2]|0;if((i|0)>(c[g+180>>2]|0))break;g=lv(c[(c[g+184>>2]|0)+(i<<2)>>2]|0,b,d,e)|0;f=f+ +h[g>>3];if(j|0)c[j+52>>2]=g;l=l+1|0;i=i+1|0;j=g;m=(m|0)==0?g:m}n=gC(a)|0;g=m;while(1){if(!n)break;i=n+16|0;if(!(c[c[(c[i>>2]|0)+112>>2]>>2]|0)){k=rv(n,d)|0;f=f+ +h[k>>3];if(j|0)c[j+52>>2]=k;c[c[(c[i>>2]|0)+112>>2]>>2]=a;i=l+1|0;j=k;g=(g|0)==0?k:g}else i=l;n=hC(a,n)|0;l=i}c[o+64>>2]=l;if(!l)f=+tv(a,b);else{h[o+8>>3]=f;f=+sv(o,e)}h[o>>3]=f;c[o+48>>2]=g;return o|0}function mv(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0;s=l;l=l+176|0;i=s+144|0;q=s+64|0;o=s+32|0;m=s;r=c[b+64>>2]|0;a:do if(r|0){p=HK(r<<2)|0;d=b+48|0;f=0;e=d;while(1){e=c[e>>2]|0;if((f|0)>=(r|0))break;c[p+(f<<2)>>2]=e;f=f+1|0;e=e+52|0}k3(p,r,4,80);n=HK(r<<3)|0;e=0;while(1){if((e|0)>=(r|0))break;h[n+(e<<3)>>3]=+h[c[p+(e<<2)>>2]>>3];e=e+1|0}j=+h[b+8>>3];e=b+16|0;f=b+32|0;g=b+40|0;k=b+24|0;if(+h[b>>3]==j){c[i>>2]=c[e>>2];c[i+4>>2]=c[e+4>>2];c[i+8>>2]=c[e+8>>2];c[i+12>>2]=c[e+12>>2];c[i+16>>2]=c[e+16>>2];c[i+20>>2]=c[e+20>>2];c[i+24>>2]=c[e+24>>2];c[i+28>>2]=c[e+28>>2];i=uv(r,n,i)|0}else{t=+h[g>>3];u=+h[f>>3];h[m>>3]=+h[e>>3];h[m+8>>3]=+h[k>>3];v=t-u;j=(t+u-+G(+(j*4.0+v*v)))*.5;h[m+16>>3]=u-j;h[m+24>>3]=t-j;c[i>>2]=c[m>>2];c[i+4>>2]=c[m+4>>2];c[i+8>>2]=c[m+8>>2];c[i+12>>2]=c[m+12>>2];c[i+16>>2]=c[m+16>>2];c[i+20>>2]=c[m+20>>2];c[i+24>>2]=c[m+24>>2];c[i+28>>2]=c[m+28>>2];i=uv(r,n,i)|0}if(a[195234]|0){m=c[15715]|0;t=+h[k>>3];u=+h[f>>3];v=+h[g>>3];h[o>>3]=+h[e>>3];h[o+8>>3]=t;h[o+16>>3]=u;h[o+24>>3]=v;z4(m,94475,o)|0}f=c[15715]|0;e=0;while(1){if((e|0)>=(r|0))break;o=(c[p+(e<<2)>>2]|0)+16|0;g=i+(e<<5)|0;c[o>>2]=c[g>>2];c[o+4>>2]=c[g+4>>2];c[o+8>>2]=c[g+8>>2];c[o+12>>2]=c[g+12>>2];c[o+16>>2]=c[g+16>>2];c[o+20>>2]=c[g+20>>2];c[o+24>>2]=c[g+24>>2];c[o+28>>2]=c[g+28>>2];if(a[195234]|0){j=+h[g>>3];u=+h[i+(e<<5)+16>>3];x=u*.5;t=+h[i+(e<<5)+8>>3];v=+h[i+(e<<5)+24>>3];w=v*.5;h[q>>3]=+h[n+(e<<3)>>3];h[q+8>>3]=j-x;h[q+16>>3]=t-w;h[q+24>>3]=j+x;h[q+32>>3]=t+w;h[q+40>>3]=u*v;h[q+48>>3]=j;h[q+56>>3]=t;h[q+64>>3]=u;h[q+72>>3]=v;z4(f,94492,q)|0}e=e+1|0}l6(p);l6(n);l6(i);e=0;while(1){d=c[d>>2]|0;if((e|0)>=(r|0))break a;if(!(c[d+60>>2]|0))mv(d);d=d+52|0;e=e+1|0}}while(0);l=s;return}function nv(b){b=b|0;var d=0,e=0,f=0,g=0,i=0.0,j=0.0,k=0,m=0.0,n=0.0;g=l;l=l+48|0;f=g;e=b+56|0;if(c[b+60>>2]|0){m=+h[b+24>>3];j=+h[b+32>>3];i=+h[b+40>>3];d=c[e>>2]|0;e=d+16|0;k=c[e>>2]|0;h[k+16>>3]=+h[b+16>>3];h[k+24>>3]=m;b=c[e>>2]|0;h[b+32>>3]=j/72.0;h[b+40>>3]=i/72.0;oQ(d,c[(c[(uC(d)|0)+16>>2]|0)+116>>2]&1);pv(d);if(a[195234]|0){k=c[15715]|0;b=HB(d)|0;e=c[e>>2]|0;n=+h[e+16>>3];i=+h[e+24>>3];j=+h[e+80>>3];m=+h[e+88>>3]+ +h[e+96>>3];c[f>>2]=b;h[f+8>>3]=n;h[f+16>>3]=i;h[f+24>>3]=j;h[f+32>>3]=m;z4(k,94434,f)|0}}else{d=b+48|0;while(1){d=c[d>>2]|0;if(!d)break;nv(d);d=d+52|0}i=+h[b+32>>3];m=+h[b+40>>3];j=+h[b+16>>3]-i*.5;n=+h[b+24>>3]-m*.5;k=c[(c[e>>2]|0)+16>>2]|0;h[k+16>>3]=j;h[k+24>>3]=n;h[k+32>>3]=i+j;h[k+40>>3]=m+n}l=g;return}function ov(a){a=a|0;var b=0,d=0,e=0;e=c[a+64>>2]|0;b=a+48|0;d=0;while(1){b=c[b>>2]|0;if((d|0)>=(e|0))break;ov(b);b=b+52|0;d=d+1|0}l6(a);return}function pv(b){b=b|0;var d=0,e=0,f=0,g=0;g=l;l=l+48|0;f=g;d=g+8|0;e=c[47212]|0;if(e|0?(a[(OA(b,e)|0)>>0]|0)==0:0){h[f>>3]=+h[(c[b+16>>2]|0)+80>>3]*.7;i2(d,94469,f)|0;HA(b,c[47212]|0,d)|0}qP(b);l=g;return}function qv(a,b){a=a|0;b=b|0;var d=0.0;d=+h[c[a>>2]>>3]-+h[c[b>>2]>>3];return (d<0.0?1:(d>0.0)<<31>>31)|0}function rv(a,b){a=a|0;b=b|0;var d=0;d=HK(72)|0;h[d>>3]=+tv(a,b);c[d+60>>2]=1;c[d+56>>2]=a;return d|0}function sv(a,b){a=a|0;b=b|0;var d=0.0,e=0.0;e=+YO(c[a+56>>2]|0,b,0.0,0.0);d=+h[a+8>>3];if(!(e==0.0)){d=e*2.0+ +G(+d);d=d*d}return +d}function tv(a,b){a=a|0;b=b|0;var c=0.0;c=+YO(a,b,1.0,0.0);return +(c==0.0?1.0e3:c*1.0e3)}function uv(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0,i=0,j=0.0;i=l;l=l+32|0;g=i;e=0;f=0.0;while(1){if((e|0)>=(a|0))break;j=f+ +h[b+(e<<3)>>3];e=e+1|0;f=j}if(f>+h[d+16>>3]*+h[d+24>>3]+.001)e=0;else{e=HK(a<<5)|0;c[g>>2]=c[d>>2];c[g+4>>2]=c[d+4>>2];c[g+8>>2]=c[d+8>>2];c[g+12>>2]=c[d+12>>2];c[g+16>>2]=c[d+16>>2];c[g+20>>2]=c[d+20>>2];c[g+24>>2]=c[d+24>>2];c[g+28>>2]=c[d+28>>2];vv(a,b,e,0,0.0,1.0,0.0,1.0,g)}l=i;return e|0}function vv(b,d,e,f,g,i,j,k,m){b=b|0;d=d|0;e=e|0;f=f|0;g=+g;i=+i;j=+j;k=+k;m=m|0;var n=0,o=0.0,p=0.0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,v=0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0;B=l;l=l+112|0;A=B+72|0;v=B+40|0;r=B+32|0;n=B;z=m+16|0;o=+h[z>>3];x=m+24|0;p=+h[x>>3];w=+h[m+16+((!(o>3];do if((b|0)>=1){y=m+8|0;if(a[195234]|0){C=c[15715]|0;D=+h[y>>3];h[n>>3]=+h[m>>3];h[n+8>>3]=o;h[n+16>>3]=D;h[n+24>>3]=p;z4(C,94529,n)|0;c[r>>2]=f;z4(C,94575,r)|0}if(!f){j=+h[d>>3];D=w*w;w=j/D;D=D/j;c[A>>2]=c[m>>2];c[A+4>>2]=c[m+4>>2];c[A+8>>2]=c[m+8>>2];c[A+12>>2]=c[m+12>>2];c[A+16>>2]=c[m+16>>2];c[A+20>>2]=c[m+20>>2];c[A+24>>2]=c[m+24>>2];c[A+28>>2]=c[m+28>>2];vv(b,d,e,1,j,j,j,w>D?w:D,A);break}r=d+(f<<3)|0;if((b|0)>(f|0)?(u=+h[r>>3],q=ui?i:u,u=u+j,s=u/w,D=s/(t/s),s=q/s/s,s=D>s?D:s,s<=k):0){c[A>>2]=c[m>>2];c[A+4>>2]=c[m+4>>2];c[A+8>>2]=c[m+8>>2];c[A+12>>2]=c[m+12>>2];c[A+16>>2]=c[m+16>>2];c[A+20>>2]=c[m+20>>2];c[A+24>>2]=c[m+24>>2];c[A+28>>2]=c[m+28>>2];vv(b,d,e,f+1|0,q,t,u,s,A);break}q=j/w;if(a[195234]|0){C=c[15715]|0;c[v>>2]=f;h[v+8>>3]=j;h[v+16>>3]=w;h[v+24>>3]=q;z4(C,94600,v)|0}o=+h[z>>3];p=q*.5;if(w==o){o=+h[m>>3]-o*.5;n=0;while(1){if((n|0)>=(f|0))break;h[e+(n<<5)+24>>3]=q;D=+h[d+(n<<3)>>3]/q;h[e+(n<<5)+16>>3]=D;h[e+(n<<5)+8>>3]=+h[y>>3]+ +h[x>>3]*.5-p;h[e+(n<<5)>>3]=o+D*.5;o=o+D;n=n+1|0}h[y>>3]=+h[y>>3]-p;n=1}else{o=+h[y>>3]+ +h[x>>3]*.5;n=0;while(1){if((n|0)>=(f|0))break;h[e+(n<<5)+16>>3]=q;D=+h[d+(n<<3)>>3]/q;h[e+(n<<5)+24>>3]=D;h[e+(n<<5)>>3]=p+(+h[m>>3]-+h[z>>3]*.5);h[e+(n<<5)+8>>3]=o-D*.5;o=o-D;n=n+1|0}h[m>>3]=p+ +h[m>>3];n=0}C=m+16+(n<<3)|0;h[C>>3]=+h[C>>3]-q;c[A>>2]=c[m>>2];c[A+4>>2]=c[m+4>>2];c[A+8>>2]=c[m+8>>2];c[A+12>>2]=c[m+12>>2];c[A+16>>2]=c[m+16>>2];c[A+20>>2]=c[m+20>>2];c[A+24>>2]=c[m+24>>2];c[A+28>>2]=c[m+28>>2];vv(b-f|0,r,e+(f<<5)|0,0,0.0,0.0,0.0,1.0,A)}while(0);l=B;return}function wv(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;h[a>>3]=b;h[a+8>>3]=c;h[a+16>>3]=d;h[a+24>>3]=e;return}function xv(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,i=0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;E=l;l=l+96|0;D=E+48|0;C=E+24|0;B=E+16|0;A=E+8|0;v=E+80|0;w=E;x=d+4|0;y=v+4|0;z=a+16|0;t=gC(a)|0;e=0;f=0;i=0;j=0;while(1){if(!t)break;u=UA(a,t)|0;r=e;s=j;while(1){if(!u)break;e=(b[(c[u+16>>2]|0)+168>>1]|0)==0;do if((t|0)!=(c[((c[u>>2]&3|0)==2?u:u+-48|0)+40>>2]|0)|e)if(!e){i=yv(u,d)|0;j=i+8|0;if(it(c[j>>2]|0,c[i>>2]|0)|0){k=HX(c[j>>2]|0,c[i>>2]|0)|0;if(!k){dA(0,94653,A)|0;j=1;e=s;break}else e=u;while(1){if(!e)break;F=e+16|0;G=(c[F>>2]|0)+144|0;Nm(w,e,k,0,c[j>>2]|0,c[i>>2]|0);I=w;H=c[I+4>>2]|0;c[G>>2]=c[I>>2];c[G+4>>2]=H;Pm(a,e,c[j>>2]|0,c[i>>2]|0,0);e=c[(c[F>>2]|0)+172>>2]|0}zv(i);j=r;e=s;break}if(!r){ir(v,a);e=jH(a,8,8)|0;dA(0,94737,B)|0;n=+(e|0);o=+g[d>>2];p=+g[x>>2];q=p;if(!(n<=o)&!(n<=p)){m=+g[v>>2];n=+g[y>>2];if(!(!(m<=o)&!(n<=p))){h[D>>3]=m;h[D+8>>3]=n;h[D+16>>3]=o;h[D+24>>3]=q;dA(3,94853,D)|0}}else{c[C>>2]=e;h[C+8>>3]=o;h[C+16>>3]=q;dA(3,94803,C)|0}j=1;e=s}else{j=r;e=s}}else{j=r;e=s}else{if(!f){e=HK(96)|0;c[e+84>>2]=HK(((qB(a)|0)<<5)+11520|0)|0;f=e}else e=s;Hm(f,u,c[(c[z>>2]|0)+248>>2]|0);j=r}while(0);u=WA(a,u)|0;r=j;s=e}t=hC(a,t)|0;e=r;j=s}Av(i);if(f|0){l6(c[f+84>>2]|0);l6(j)}l=E;return e|0}function yv(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;p=l;l=l+16|0;m=p+4|0;n=p;e=c[b>>2]&3;f=c[((e|0)==2?b:b+-48|0)+40>>2]|0;e=c[((e|0)==3?b:b+48|0)+40>>2]|0;q=f+16|0;h=c[(c[q>>2]|0)+212>>2]|0;c[m>>2]=h;i=e+16|0;g=c[(c[i>>2]|0)+212>>2]|0;c[n>>2]=g;k=HK(12)|0;b=h;j=g;if(a[(c[q>>2]|0)+118>>0]|0){b=c[(c[(c[b+16>>2]|0)+140>>2]|0)+48>>2]|0;c[m>>2]=b;f=h;h=b}if(!(a[(c[i>>2]|0)+118>>0]|0))i=j;else{i=c[(c[(c[j+16>>2]|0)+140>>2]|0)+48>>2]|0;c[n>>2]=i;e=g;g=i}h=c[(c[(c[h+16>>2]|0)+140>>2]|0)+44>>2]|0;g=c[(c[(c[g+16>>2]|0)+140>>2]|0)+44>>2]|0;if((h|0)<=(g|0))if((g|0)>(h|0)){Bv(k,g,e,h,n,d);b=c[n>>2]|0;g=b;e=n;o=11}else h=i;else{Bv(k,h,f,g,m,d);b=c[m>>2]|0;f=b;g=e;e=m;o=11}while(1){if((o|0)==11){c[e>>2]=c[(c[(c[b+16>>2]|0)+140>>2]|0)+48>>2];e=g;b=c[m>>2]|0;h=c[n>>2]|0}if((b|0)==(h|0))break;Cv(k,b,0,f,d);Cv(k,h,e,0,d);c[m>>2]=c[(c[(c[b+16>>2]|0)+140>>2]|0)+48>>2];f=b;g=h;e=n;b=h;o=11}Cv(k,h,e,f,d);l=p;return k|0}function zv(a){a=a|0;c[a>>2]=0;return}function Av(a){a=a|0;if(a|0){l6(c[a+8>>2]|0);l6(a)}return}function Bv(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;i=f;while(1){h=c[i>>2]|0;if((b|0)<=(e|0))break;Cv(a,h,d,0,g);b=b+-1|0;i=(c[(c[h+16>>2]|0)+140>>2]|0)+48|0;d=h}c[f>>2]=d;return}function Cv(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;h=gC(d)|0;while(1){if(!h)break;i=c[h+16>>2]|0;if(!((h|0)==(f|0)|((h|0)==(e|0)?1:(c[i+212>>2]|0)!=(d|0)))?(a[i+118>>0]|0)==0:0)Dv(b,Km(h,g,0)|0);h=hC(d,h)|0}i=d+16|0;d=1;while(1){h=c[i>>2]|0;if((d|0)>(c[h+180>>2]|0))break;h=c[(c[h+184>>2]|0)+(d<<2)>>2]|0;if(!((h|0)==(e|0)|(h|0)==(f|0)))Dv(b,Ev(h,g)|0);d=d+1|0}return}function Dv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;e=a+4|0;f=c[e>>2]|0;g=a+8|0;d=c[g>>2]|0;do if((f|0)==(c[a>>2]|0))if(!d){d=IK(400)|0;c[g>>2]=d;c[e>>2]=100;break}else{c[e>>2]=f<<1;d=KK(d,f<<3)|0;c[g>>2]=d;break}while(0);g=c[a>>2]|0;c[a>>2]=g+1;c[d+(g<<2)>>2]=b;return}function Ev(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0.0,p=0.0;n=HK(8)|0;b=c[b+16>>2]|0;e=+h[b+16>>3];l=+h[b+24>>3];f=+h[b+32>>3];k=+h[b+40>>3];c[n+4>>2]=4;b=HK(64)|0;c[n>>2]=b;i=+g[d>>2];m=+g[d+4>>2];if(!(a[d+8>>0]|0)){p=(e+f)*.5*(i+-1.0);o=(l+k)*.5*(m+-1.0);j=e*i-p;i=f*i-p;f=k*m-o;e=l*m-o}else{j=e-i;i=f+i;f=k+m;e=l-m}h[b>>3]=j;h[b+8>>3]=e;h[b+16>>3]=j;h[b+24>>3]=f;h[b+32>>3]=i;h[b+40>>3]=f;h[b+48>>3]=i;h[b+56>>3]=e;return n|0}function Fv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;p=l;l=l+160|0;o=p+16|0;k=p+8|0;g=p;m=p+24|0;n=HK(qB(b)|0)|0;h=b+16|0;f=c[c[(c[h>>2]|0)+140>>2]>>2]|0;a:do if(!f){g=0;f=0}else{j=HB(b)|0;i=c[46965]|0;c[g>>2]=j;c[g+4>>2]=i;i2(m,94913,g)|0;i=LD(b,m,1)|0;RC(i,137786,280,1)|0;j=HK(56)|0;c[(c[i+16>>2]|0)+140>>2]=j;c[j>>2]=f;c[j+4>>2]=c[(c[(c[h>>2]|0)+140>>2]|0)+4>>2];while(1){g=c[f+4>>2]|0;if(!g){g=i;f=1;break a}if(!(a[n+(c[(c[g+16>>2]|0)+120>>2]|0)>>0]|0))Gv(b,g,i,n);f=f+16|0}}while(0);i=0;j=gC(b)|0;while(1){h=(g|0)!=0;if(!j)break;q=c[j+16>>2]|0;if((a[n+(c[q+120>>2]|0)>>0]|0)==0?(a[q+119>>0]|0)==3:0){if(!h){q=HB(b)|0;g=(c[46965]|0)+f|0;c[k>>2]=q;c[k+4>>2]=g;i2(m,94913,k)|0;g=LD(b,m,1)|0;RC(g,137786,280,1)|0;q=HK(56)|0;c[(c[g+16>>2]|0)+140>>2]=q;f=f+1|0}Gv(b,j,g,n);h=1}else h=i;i=h;j=hC(b,j)|0}if(h)IG(g)|0;g=gC(b)|0;while(1){if(!g)break;if(!(a[n+(c[(c[g+16>>2]|0)+120>>2]|0)>>0]|0)){k=HB(b)|0;q=(c[46965]|0)+f|0;c[o>>2]=k;c[o+4>>2]=q;i2(m,94921,o)|0;q=LD(b,m,1)|0;RC(q,137786,280,1)|0;k=HK(56)|0;c[(c[q+16>>2]|0)+140>>2]=k;Gv(b,g,q,n);IG(q)|0;f=f+1|0}g=hC(b,g)|0}l6(n);c[46965]=(c[46965]|0)+f;if(d|0)c[d>>2]=f;if(e|0)c[e>>2]=i;i=HK((f<<2)+4|0)|0;h=i;g=MD(b)|0;while(1){if(!g)break;c[h>>2]=g;h=h+4|0;g=ND(g)|0;f=f+-1|0}if(!f){c[h>>2]=0;l=p;return i|0}else Aa(94929,94940,134,94947);return 0}function Gv(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;a[f+(c[(c[d+16>>2]|0)+120>>2]|0)>>0]=1;lC(e,d,1)|0;i=ZA(b,d)|0;while(1){if(!i)break;h=c[i>>2]&3;g=c[((h|0)==3?i:i+48|0)+40>>2]|0;if((g|0)==(d|0))g=c[((h|0)==2?i:i+-48|0)+40>>2]|0;if(!(a[f+(c[(c[g+16>>2]|0)+120>>2]|0)>>0]|0))Gv(b,g,e,f);i=_A(b,i,d)|0}return}function Hv(a){a=a|0;var b=0;b=IK(24)|0;c[46966]=b;c[b>>2]=Sz(18244,c[4591]|0)|0;c[b+16>>2]=0;c[b+12>>2]=0;c[b+4>>2]=Iv(a)|0;return b|0}function Iv(a){a=a|0;var b=0,d=0;b=IK(16)|0;c[b+12>>2]=0;d=IK(a*20|0)|0;c[b>>2]=d;c[b+8>>2]=d+(a*20|0);c[b+4>>2]=d;return b|0}function Jv(a,b,d){a=a|0;b=b|0;d=d|0;d=Lv(c[46966]|0)|0;c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=0;return d|0}function Kv(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=(c[b>>2]|0)-(c[d>>2]|0)|0;if(!a)a=(c[b+4>>2]|0)-(c[d+4>>2]|0)|0;return a|0}function Lv(a){a=a|0;var b=0,d=0,e=0,f=0;f=a+8|0;a=c[f>>2]|0;b=c[a+4>>2]|0;if((b|0)==(c[a+8>>2]|0)){d=a+12|0;e=c[d>>2]|0;if(!e){a=Iv(((b-(c[a>>2]|0)|0)/20|0)<<1)|0;c[d>>2]=a}else a=e;c[f>>2]=a;b=c[a>>2]|0;c[a+4>>2]=b}c[a+4>>2]=b+20;return b|0}function Mv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=a+12|0;d=c[f>>2]|0;if((d|0)<(b|0)){e=d<<1;e=(e|0)<(b|0)?b:e;b=a+16|0;d=c[b>>2]|0;if(d|0)l6(d);c[b>>2]=IK(e<<3)|0;c[f>>2]=e}return}function Nv(a){a=a|0;var b=0;b=c[a>>2]|0;eb[c[b>>2]&63](b,0,64)|0;c[a+20>>2]=c[a+16>>2];b=c[a+4>>2]|0;c[a+8>>2]=b;c[b+4>>2]=c[b>>2];return}function Ov(a){a=a|0;Oz(c[a>>2]|0)|0;Pv(c[a+4>>2]|0);l6(c[a+16>>2]|0);l6(a);return}function Pv(a){a=a|0;var b=0;while(1){if(!a)break;b=c[a+12>>2]|0;l6(c[a>>2]|0);l6(a);a=b}return}function Qv(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;h=l;l=l+32|0;g=h;i=h+12|0;c[i>>2]=b;c[i+4>>2]=e;j=c[a>>2]|0;i=(eb[c[j>>2]&63](j,i,1)|0)+8|0;c[i>>2]=Rv(a,f,c[i>>2]|0)|0;if((d[195234]|0)>2){j=c[15715]|0;i=HB(f)|0;c[g>>2]=b;c[g+4>>2]=e;c[g+8>>2]=i;z4(j,94957,g)|0}l=h;return}function Rv(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=a+20|0;a=c[e>>2]|0;c[e>>2]=a+8;c[a>>2]=b;c[a+4>>2]=d;return a|0}function Sv(a,b){a=a|0;b=b|0;Zz(c[a>>2]|0,b,a)|0;return}function Tv(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+32|0;f=e;c[f>>2]=b;c[f+4>>2]=d;d=c[a>>2]|0;d=eb[c[d>>2]&63](d,f,4)|0;l=e;return d|0}function Uv(a){a=a|0;l6(c[a+8>>2]|0);l6(a);return}function Vv(a){a=a|0;return +(+h[a>>3])}function Wv(a){a=a|0;return c[a+8>>2]|0}function Xv(a){a=a|0;return ~~+h[a+16>>3]|0}function Yv(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;b=c[b>>2]|0;if((b|0)>=(c[d>>2]|0)){b=b+10|0;c[d>>2]=b;c[e>>2]=KK(c[e>>2]|0,S(a<<3,b)|0)|0;c[f>>2]=KK(c[f>>2]|0,c[d>>2]<<3)|0;c[g>>2]=KK(c[g>>2]|0,c[d>>2]<<3)|0}return}function Zv(a,b,d,e,f,g,i,j,k,l,m){a=a|0;b=+b;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0.0;h[l>>3]=+h[l>>3]+1.0;a:do if(a|0){q=c[a+16>>2]|0;n=c[a+40>>2]|0;if(n|0)do{Yv(q,f,g,i,j,k);if((Xv(wy(n)|0)|0)!=(e|0)){p=Wv(wy(n)|0)|0;o=0;while(1){if((o|0)>=(q|0))break;h[(c[i>>2]|0)+((S(c[f>>2]|0,q)|0)+o<<3)>>3]=+h[p+(o<<3)>>3];o=o+1|0}r=+Vv(wy(n)|0);h[(c[j>>2]|0)+(c[f>>2]<<3)>>3]=r;r=+Yw(d,p,q);p=c[f>>2]|0;h[(c[k>>2]|0)+(p<<3)>>3]=r;c[f>>2]=p+1}n=xy(n)|0}while((n|0)!=0);p=a+36|0;if(c[p>>2]|0){r=+Yw(c[a+20>>2]|0,d,q);if(!(+h[a+24>>3]=(o|0))break a;Zv(c[(c[p>>2]|0)+(n<<2)>>2]|0,b,d,e,f,g,i,j,k,l,m);n=n+1|0}}Yv(q,f,g,i,j,k);o=c[a+32>>2]|0;p=c[f>>2]|0;m=S(p,q)|0;n=0;while(1){if((n|0)>=(q|0))break;h[(c[i>>2]|0)+(m+n<<3)>>3]=+h[o+(n<<3)>>3];n=n+1|0}h[(c[j>>2]|0)+(p<<3)>>3]=+h[a+8>>3];r=+Yw(o,d,q);j=c[f>>2]|0;h[(c[k>>2]|0)+(j<<3)>>3]=r;c[f>>2]=j+1}}while(0);return}function _v(a,b,d,e,f,g,i,j,k,l,m){a=a|0;b=+b;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0;n=c[a+16>>2]|0;h[l>>3]=0.0;c[f>>2]=0;c[m>>2]=0;c[g>>2]=10;if(!(c[i>>2]|0))c[i>>2]=IK(n*80|0)|0;if(!(c[j>>2]|0))c[j>>2]=IK(c[g>>2]<<3)|0;if(!(c[k>>2]|0))c[k>>2]=IK(c[g>>2]<<3)|0;Zv(a,b,d,e,f,g,i,j,k,l,m);return}function $v(a,b,d,e,f,g,i,j){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=+g;i=i|0;j=j|0;var k=0,l=0,m=0;m=c[a>>2]|0;l=c[a+16>>2]|0;k=0;while(1){if((k|0)==4)break;h[i+(k<<3)>>3]=0.0;k=k+1|0}c[j>>2]=0;l=S(l,m)|0;k=0;while(1){if((k|0)>=(l|0))break;h[b+(k<<3)>>3]=0.0;k=k+1|0}aw(a,a,d,b,e,f,g,i);bw(a,b,i);e=+(m|0);k=0;while(1){if((k|0)==4)break;m=i+(k<<3)|0;h[m>>3]=+h[m>>3]/e;k=k+1|0}return}function aw(a,b,d,e,f,g,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;g=+g;i=+i;j=j|0;var k=0,l=0,m=0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0;a:do if((a|0)!=0&(b|0)!=0){if((c[a>>2]|0)>0?(c[b>>2]|0)>0:0){v=c[a+16>>2]|0;p=c[a+40>>2]|0;u=b+40|0;l=c[u>>2]|0;k=a+32|0;m=b+32|0;r=+Yw(c[k>>2]|0,c[m>>2]|0,v);n=+h[a+24>>3];o=+h[b+24>>3];w=g==-1.0;x=1.0-g;if(n+o>3]=+h[j>>3]+1.0;q=c[k>>2]|0;o=+h[a+8>>3];p=cw(a,v)|0;m=c[m>>2]|0;n=+h[b+8>>3];l=cw(b,v)|0;if(!(r>0.0))Aa(95099,94982,191,95065);o=o*n*i;f=r*r;k=0;while(1){if((k|0)>=(v|0))break a;if(w)n=f;else n=+H(+r,+x);i=o*(+h[q+(k<<3)>>3]-+h[m+(k<<3)>>3])/n;e=p+(k<<3)|0;h[e>>3]=+h[e>>3]+i;e=l+(k<<3)|0;h[e>>3]=+h[e>>3]-i;k=k+1|0}}m=(p|0)!=0;k=(l|0)!=0;t=(a|0)==(b|0);if(m&k){b=j+8|0;l=p;while(1){if(!l)break a;p=Wv(wy(l)|0)|0;g=+Vv(wy(l)|0);q=Xv(wy(l)|0)|0;s=dw(e,q,l,v)|0;m=c[u>>2]|0;while(1){if(!m)break;a=Wv(wy(m)|0)|0;n=+Vv(wy(m)|0);k=Xv(wy(m)|0)|0;j=dw(e,k,m,v)|0;b:do if(!((q|0)==(k|0)|t&(k|0)<(q|0))){h[b>>3]=+h[b>>3]+1.0;r=+Ww(d,v,q,k);o=g*n*i;f=r*r;k=0;while(1){if((k|0)>=(v|0))break b;if(w)n=f;else n=+H(+r,+x);n=o*(+h[p+(k<<3)>>3]-+h[a+(k<<3)>>3])/n;y=s+(k<<3)|0;h[y>>3]=+h[y>>3]+n;y=j+(k<<3)|0;h[y>>3]=+h[y>>3]-n;k=k+1|0}}while(0);m=xy(m)|0}l=xy(l)|0}}q=1<=(q|0))break a;m=c[(c[p>>2]|0)+(l<<2)>>2]|0;k=l;while(1){if((k|0)==(q|0))break;aw(m,c[(c[p>>2]|0)+(k<<2)>>2]|0,d,e,f,g,i,j);k=k+1|0}l=l+1|0}}if(!(m|!(n>o))){k=0;while(1){if((k|0)>=(q|0))break a;aw(c[(c[p>>2]|0)+(k<<2)>>2]|0,b,d,e,f,g,i,j);k=k+1|0}}l=b+36|0;if(!(k|!(o>n))){k=0;while(1){if((k|0)>=(q|0))break a;aw(c[(c[l>>2]|0)+(k<<2)>>2]|0,a,d,e,f,g,i,j);k=k+1|0}}if(!m){k=0;while(1){if((k|0)>=(q|0))break a;aw(c[(c[p>>2]|0)+(k<<2)>>2]|0,b,d,e,f,g,i,j);k=k+1|0}}if(k)Aa(138697,94982,273,95065);else s=0;while(1){if((s|0)>=(q|0))break a;aw(c[(c[l>>2]|0)+(s<<2)>>2]|0,a,d,e,f,g,i,j);s=s+1|0}}Aa(95040,94982,175,95065)}while(0);return}function bw(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0,j=0,k=0,l=0,m=0.0,n=0,o=0;e=c[a+40>>2]|0;l=c[a+16>>2]|0;m=+h[a+8>>3];n=cw(a,l)|0;if(!(m>0.0))Aa(94974,94982,289,94993);k=d+16|0;h[k>>3]=+h[k>>3]+1.0;a:do if(!e){k=1<=(k|0))break a;i=c[(c[f>>2]|0)+(e<<2)>>2]|0;if(i|0){if((c[i>>2]|0)<=0)break;j=cw(i,l)|0;g=+h[i+8>>3]/m;a=0;while(1){if((a|0)>=(l|0))break;o=j+(a<<3)|0;h[o>>3]=+h[o>>3]+g*+h[n+(a<<3)>>3];a=a+1|0}bw(i,b,d)}e=e+1|0}Aa(95029,94982,307,94993)}else while(1){if(!e)break a;f=dw(b,Xv(wy(e)|0)|0,e,l)|0;g=+Vv(wy(e)|0)/m;a=0;while(1){if((a|0)>=(l|0))break;o=f+(a<<3)|0;h[o>>3]=+h[o>>3]+g*+h[n+(a<<3)>>3];a=a+1|0}e=xy(e)|0}while(0);return}function cw(a,b){a=a|0;b=b|0;var d=0;d=a+48|0;a=c[d>>2]|0;a:do if(!a){a=IK(b<<3)|0;c[d>>2]=a;d=0;while(1){if((d|0)>=(b|0))break a;h[a+(d<<3)>>3]=0.0;d=d+1|0}}while(0);return a|0}function dw(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[(wy(d)|0)+24>>2]|0;if(!f){f=a+((S(e,b)|0)<<3)|0;c[(wy(d)|0)+24>>2]=f;f=c[(wy(d)|0)+24>>2]|0}return f|0}function ew(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,i=0.0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0;m=a<<3;k=IK(m)|0;l=IK(m)|0;m=IK(m)|0;if((k|0)!=0&(l|0)!=0&(m|0)!=0){f=0;while(1){if((f|0)>=(a|0)){f=0;break}h[k+(f<<3)>>3]=+h[d+(f<<3)>>3];f=f+1|0}while(1){if((f|0)>=(a|0)){g=1;break}h[l+(f<<3)>>3]=+h[d+(f<<3)>>3];f=f+1|0}while(1){if((g|0)>=(b|0))break;j=S(g,a)|0;f=0;while(1){if((f|0)>=(a|0))break;n=k+(f<<3)|0;i=+h[n>>3];p=d+(f+j<<3)|0;o=+h[p>>3];h[n>>3]=i>3];i=+h[p>>3];h[n>>3]=o>i?o:i;f=f+1|0}g=g+1|0}i=+h[l>>3]-+h[k>>3];f=0;while(1){if((f|0)>=(a|0))break;p=k+(f<<3)|0;n=l+(f<<3)|0;h[m+(f<<3)>>3]=(+h[p>>3]+ +h[n>>3])*.5;o=+h[n>>3]-+h[p>>3];i=i>o?i:o;f=f+1|0}f=fw(a,m,i==0.0?5.2e-06:i*.52,c)|0;a:do if(!e){g=0;while(1){if((g|0)>=(b|0))break a;f=gw(f,d+((S(g,a)|0)<<3)|0,1.0,g)|0;g=g+1|0}}else{g=0;while(1){if((g|0)>=(b|0))break a;p=d+((S(g,a)|0)<<3)|0;f=gw(f,p,+h[e+(g<<3)>>3],g)|0;g=g+1|0}}while(0);l6(k);l6(l);l6(m)}else{l6(k);l6(l);l6(m);f=0}return f|0}function fw(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;var f=0,g=0,i=0;g=IK(56)|0;c[g+16>>2]=a;c[g>>2]=0;i=IK(a<<3)|0;c[g+20>>2]=i;f=0;while(1){if((f|0)>=(a|0))break;h[i+(f<<3)>>3]=+h[b+(f<<3)>>3];f=f+1|0}if(d>0.0){h[g+24>>3]=d;h[g+8>>3]=0.0;c[g+32>>2]=0;c[g+36>>2]=0;c[g+40>>2]=0;c[g+44>>2]=e;c[g+48>>2]=0;return g|0}else Aa(95197,94982,410,95207);return 0}function gw(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;if(!a)a=0;else hw(a,b,c,d,0)|0;return a|0}function hw(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;var g=0,i=0,j=0,k=0.0,l=0.0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;w=a+16|0;s=c[w>>2]|0;u=c[a+44>>2]|0;r=a+20|0;t=a+24|0;j=c[a>>2]|0;m=a+8|0;x=a+40|0;do if(!j){c[a>>2]=1;h[m>>3]=d;j=IK(s<<3)|0;c[a+32>>2]=j;i=c[w>>2]|0;g=0;while(1){if((g|0)>=(i|0))break;h[j+(g<<3)>>3]=+h[b+(g<<3)>>3];g=g+1|0}g=iw(i,d,b,e)|0;if(!(c[x>>2]|0)){c[x>>2]=ty(g)|0;break}else Aa(95108,94982,502,95116)}else{v=a+36|0;p=a+32|0;o=+h[m>>3]+d;n=j+1|0;if((u|0)<=(f|0)){if(c[v>>2]|0)Aa(95182,94982,541,95116);c[a>>2]=n;h[m>>3]=o;k=+(n|0);l=+(j+2|0);g=0;while(1){if((g|0)>=(s|0))break;q=(c[p>>2]|0)+(g<<3)|0;h[q>>3]=(+h[b+(g<<3)>>3]+ +h[q>>3]*k)/l;g=g+1|0}g=iw(s,d,b,e)|0;i=c[x>>2]|0;if(!i)Aa(95192,94982,547,95116);else{c[x>>2]=vy(i,g)|0;break}}h[m>>3]=o;l=+(j|0);k=+(n|0);g=0;while(1){if((g|0)>=(s|0))break;q=(c[p>>2]|0)+(g<<3)|0;h[q>>3]=(l*+h[q>>3]+ +h[b+(g<<3)>>3])/k;g=g+1|0}q=1<>2]|0)){c[v>>2]=IK(q<<2)|0;g=0;while(1){if((g|0)>=(q|0))break a;c[(c[v>>2]|0)+(g<<2)>>2]=0;g=g+1|0}}while(0);g=c[r>>2]|0;j=jw(s,g,b)|0;if(!((j|0)<(q|0)&(j|0)>-1))Aa(95138,94982,515,95116);i=c[(c[v>>2]|0)+(j<<2)>>2]|0;if(!i){i=kw(c[w>>2]|0,g,+h[t>>3]*.5,u,j)|0;c[(c[v>>2]|0)+(j<<2)>>2]=i;i=c[(c[v>>2]|0)+(j<<2)>>2]|0}p=f+1|0;e=hw(i,b,d,e,p)|0;c[(c[v>>2]|0)+(j<<2)>>2]=e;if(!(c[(c[v>>2]|0)+(j<<2)>>2]|0))Aa(95161,94982,519,95116);g=c[x>>2]|0;do if(g|0){m=Xv(wy(g)|0)|0;if((c[a>>2]|0)!=1)Aa(95172,94982,523,95116);n=Wv(wy(c[x>>2]|0)|0)|0;k=+Vv(wy(c[x>>2]|0)|0);i=c[r>>2]|0;j=jw(s,i,n)|0;if(!((j|0)<(q|0)&(j|0)>-1))Aa(95138,94982,527,95116);g=c[(c[v>>2]|0)+(j<<2)>>2]|0;if(!g){g=kw(c[w>>2]|0,i,+h[t>>3]*.5,u,j)|0;c[(c[v>>2]|0)+(j<<2)>>2]=g;g=c[(c[v>>2]|0)+(j<<2)>>2]|0}w=hw(g,n,k,m,p)|0;c[(c[v>>2]|0)+(j<<2)>>2]=w;if(!(c[(c[v>>2]|0)+(j<<2)>>2]|0))Aa(95161,94982,532,95116);else{uy(c[x>>2]|0,106);c[x>>2]=0;break}}while(0);c[a>>2]=(c[a>>2]|0)+1}while(0);return a|0}function iw(a,b,d,e){a=a|0;b=+b;d=d|0;e=e|0;var f=0,g=0;g=IK(32)|0;h[g>>3]=b;f=IK(a<<3)|0;c[g+8>>2]=f;h[g+16>>3]=+(e|0);e=0;while(1){if((e|0)>=(a|0))break;h[f+(e<<3)>>3]=+h[d+(e<<3)>>3];e=e+1|0}c[g+24>>2]=0;return g|0}function jw(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=0;while(1){d=a+-1|0;if((a|0)<=0)break;a=d;e=!(+h[c+(d<<3)>>3]-+h[b+(d<<3)>>3]<0.0)&1|e<<1}return e|0}function kw(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;var g=0,i=0,j=0.0;g=fw(a,b,d,e)|0;i=c[g+20>>2]|0;j=-d;e=0;b=f;while(1){if((e|0)>=(a|0))break;f=i+(e<<3)|0;h[f>>3]=((b&1|0)==0?j:d)+ +h[f>>3];e=e+1|0;b=(b|0)/2|0}return g|0}function lw(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;if(a|0){b=c[a+16>>2]|0;l6(c[a+20>>2]|0);l6(c[a+32>>2]|0);l6(c[a+48>>2]|0);g=a+36|0;e=c[g>>2]|0;if(e|0){f=1<=(f|0))break;lw(c[b+(d<<2)>>2]|0);d=d+1|0;b=c[g>>2]|0}l6(b)}uy(c[a+40>>2]|0,106);l6(a)}return}function mw(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0;a:do if(!a)b=0;else{l=c[a+20>>2]|0;m=c[a+24>>2]|0;d=c[a+8>>2]|0;n=c[a>>2]|0;e=c[a+4>>2]|0;i=a+16|0;if((c[a+32>>2]|0)!=1)Aa(95220,95244,76,95259);b=ow(e,n,d,c[i>>2]|0,1)|0;c[b+8>>2]=d;o=c[b+20>>2]|0;k=c[b+24>>2]|0;d=0;while(1){if((d|0)>(e|0)){d=0;break}c[o+(d<<2)>>2]=0;d=d+1|0}b:while(1){if((d|0)>=(n|0)){d=0;break}f=d+1|0;g=l+(f<<2)|0;d=c[l+(d<<2)>>2]|0;while(1){if((d|0)>=(c[g>>2]|0)){d=f;continue b}j=o+((c[m+(d<<2)>>2]|0)+1<<2)|0;c[j>>2]=(c[j>>2]|0)+1;d=d+1|0}}while(1){if((d|0)>=(e|0))break;j=d+1|0;g=o+(j<<2)|0;c[g>>2]=(c[g>>2]|0)+(c[o+(d<<2)>>2]|0);d=j}d=a+28|0;f=b+28|0;c:do switch(c[i>>2]|0){case 1:{j=c[d>>2]|0;g=c[f>>2]|0;f=0;d:while(1){if((f|0)>=(n|0))break c;a=f+1|0;i=l+(a<<2)|0;d=c[l+(f<<2)>>2]|0;while(1){if((d|0)>=(c[i>>2]|0)){f=a;continue d}r=m+(d<<2)|0;c[k+(c[o+(c[r>>2]<<2)>>2]<<2)>>2]=f;q=+h[j+(d<<3)>>3];r=o+(c[r>>2]<<2)|0;p=c[r>>2]|0;c[r>>2]=p+1;h[g+(p<<3)>>3]=q;d=d+1|0}}}case 2:{j=c[d>>2]|0;g=c[f>>2]|0;f=0;e:while(1){if((f|0)>=(n|0))break c;a=f+1|0;i=l+(a<<2)|0;d=c[l+(f<<2)>>2]|0;while(1){if((d|0)>=(c[i>>2]|0)){f=a;continue e}r=m+(d<<2)|0;c[k+(c[o+(c[r>>2]<<2)>>2]<<2)>>2]=f;t=d<<1;r=o+(c[r>>2]<<2)|0;p=c[r>>2]|0;s=p<<1;h[g+(s<<3)>>3]=+h[j+(t<<3)>>3];h[g+((s|1)<<3)>>3]=+h[j+((t|1)<<3)>>3];c[r>>2]=p+1;d=d+1|0}}}case 4:{j=c[d>>2]|0;g=c[f>>2]|0;f=0;f:while(1){if((f|0)>=(n|0))break c;a=f+1|0;i=l+(a<<2)|0;d=c[l+(f<<2)>>2]|0;while(1){if((d|0)>=(c[i>>2]|0)){f=a;continue f}r=m+(d<<2)|0;c[k+(c[o+(c[r>>2]<<2)>>2]<<2)>>2]=f;s=c[j+(d<<2)>>2]|0;r=o+(c[r>>2]<<2)|0;t=c[r>>2]|0;c[r>>2]=t+1;c[g+(t<<2)>>2]=s;d=d+1|0}}}case 8:{f=0;g:while(1){if((f|0)>=(n|0))break c;g=f+1|0;a=l+(g<<2)|0;d=c[l+(f<<2)>>2]|0;while(1){if((d|0)>=(c[a>>2]|0)){f=g;continue g}s=o+(c[m+(d<<2)>>2]<<2)|0;t=c[s>>2]|0;c[s>>2]=t+1;c[k+(t<<2)>>2]=f;d=d+1|0}}}case 16:{nw(b);b=0;break a}default:{nw(b);b=0;break a}}while(0);while(1){d=e+-1|0;if((e|0)<=0)break;c[o+(e<<2)>>2]=c[o+(d<<2)>>2];e=d}c[o>>2]=0}while(0);return b|0}function nw(a){a=a|0;var b=0;if(a|0){b=c[a+20>>2]|0;if(b|0)l6(b);b=c[a+24>>2]|0;if(b|0)l6(b);l6(c[a+28>>2]|0);l6(a)}return}function ow(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;a=qw(a,b,d,pw(d)|0,e)|0;if((c|0)>0)rw(a,c)|0;return a|0}function pw(a){a=a|0;switch(a|0){case 1:{a=8;break}case 2:{a=16;break}case 4:{a=4;break}case 8:{a=0;break}case 16:{a=0;break}default:a=0}return a|0}function qw(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=IK(44)|0;c[g>>2]=a;c[g+4>>2]=b;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=d;c[g+40>>2]=e;if((f|0)==2)a=0;else a=IK((a<<2)+4|0)|0;c[g+20>>2]=a;c[g+24>>2]=0;c[g+28>>2]=0;c[g+32>>2]=f;c[g+36>>2]=0;return g|0}function rw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;h=c[a+32>>2]|0;f=a+28|0;c[f>>2]=0;d=b<<2;e=IK(d)|0;if((h|0)!=2){c[a+24>>2]=e;d=c[a+40>>2]|0;if((b|0)!=0&(d|0)>0)g=4}else{c[a+20>>2]=e;c[a+24>>2]=IK(d)|0;d=c[a+40>>2]|0;g=4}if((g|0)==4)c[f>>2]=IK(S(d,b)|0)|0;c[a+12>>2]=b;return a|0}function sw(a,b){a=a|0;b=b|0;if(!(tw(a,b)|0)){b=mw(a)|0;if(!b)b=0;else{a=vw(a,b)|0;nw(b);b=a+36|0;c[b>>2]=c[b>>2]|3;b=a}}else b=uw(a)|0;return b|0} +function NM(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0.0,O=0,P=0;K=l;l=l+304|0;A=K+272|0;z=K+208|0;F=K+96|0;H=K+32|0;I=K+16|0;J=K;r=K+192|0;y=K+176|0;i=K+160|0;B=K+296|0;C=K+288|0;j=c[d>>2]|0;w=c[j>>2]&3;k=j+-48|0;D=c[((w|0)==2?j:k)+40>>2]|0;t=F+16|0;w=(c[(c[((w|0)==3?j:j+48|0)+40>>2]|0)+16>>2]|0)+16|0;x=j+16|0;E=(c[x>>2]|0)+16|0;c[z>>2]=c[w>>2];c[z+4>>2]=c[w+4>>2];c[z+8>>2]=c[w+8>>2];c[z+12>>2]=c[w+12>>2];c[A>>2]=c[E>>2];c[A+4>>2]=c[E+4>>2];c[A+8>>2]=c[E+8>>2];c[A+12>>2]=c[E+12>>2];OM(r,z,A);c[F>>2]=c[r>>2];c[F+4>>2]=c[r+4>>2];c[F+8>>2]=c[r+8>>2];c[F+12>>2]=c[r+12>>2];c[t>>2]=c[r>>2];c[t+4>>2]=c[r+4>>2];c[t+8>>2]=c[r+8>>2];c[t+12>>2]=c[r+12>>2];c[I>>2]=c[r>>2];c[I+4>>2]=c[r+4>>2];c[I+8>>2]=c[r+8>>2];c[I+12>>2]=c[r+12>>2];r=F+32|0;E=F+48|0;w=(c[D+16>>2]|0)+16|0;x=(c[x>>2]|0)+56|0;c[z>>2]=c[w>>2];c[z+4>>2]=c[w+4>>2];c[z+8>>2]=c[w+8>>2];c[z+12>>2]=c[w+12>>2];c[A>>2]=c[x>>2];c[A+4>>2]=c[x+4>>2];c[A+8>>2]=c[x+8>>2];c[A+12>>2]=c[x+12>>2];OM(y,z,A);c[E>>2]=c[y>>2];c[E+4>>2]=c[y+4>>2];c[E+8>>2]=c[y+8>>2];c[E+12>>2]=c[y+12>>2];c[r>>2]=c[y>>2];c[r+4>>2]=c[y+4>>2];c[r+8>>2]=c[y+8>>2];c[r+12>>2]=c[y+12>>2];c[J>>2]=c[y>>2];c[J+4>>2]=c[y+4>>2];c[J+8>>2]=c[y+8>>2];c[J+12>>2]=c[y+12>>2];a:do if((e|0)!=1&(a[195236]|0)==0){m=+h[F>>3];n=+h[E>>3];L=m-n;o=+h[F+8>>3];p=+h[F+56>>3];s=o-p;q=s*s;if(L*L+q<1.0e-06){c[t>>2]=c[F>>2];c[t+4>>2]=c[F+4>>2];c[t+8>>2]=c[F+8>>2];c[t+12>>2]=c[F+12>>2];c[r>>2]=c[E>>2];c[r+4>>2]=c[E+4>>2];c[r+8>>2]=c[E+8>>2];c[r+12>>2]=c[E+12>>2];y=F+24|0;x=F+40|0;n=0.0;m=0.0}else{M=n-m;L=+G(+(M*M+q));w=c[(c[(c[b+60>>2]|0)+16>>2]|0)+248>>2]|0;N=+((S(w,e+-1|0)|0)/2|0|0);q=s*N/L;h[t>>3]=m+q;m=M*N/L;y=F+24|0;h[y>>3]=o+m;h[r>>3]=n+q;x=F+40|0;h[x>>3]=p+m;m=+(0-w|0);n=M*m/L;m=s*m/L}f=(f|0)==6;u=C+4|0;v=B+4|0;j=0;while(1){if((j|0)>=(e|0))break a;w=c[d+(j<<2)>>2]|0;k=w+-48|0;b:do if((c[((c[w>>2]&3|0)==2?w:k)+40>>2]|0)==(D|0)){c[I>>2]=c[F>>2];c[I+4>>2]=c[F+4>>2];c[I+8>>2]=c[F+8>>2];c[I+12>>2]=c[F+12>>2];c[J>>2]=c[E>>2];c[J+4>>2]=c[E+4>>2];c[J+8>>2]=c[E+8>>2];c[J+12>>2]=c[E+12>>2];i=0;while(1){if((i|0)==4)break b;O=H+(i<<4)|0;P=F+(i<<4)|0;c[O>>2]=c[P>>2];c[O+4>>2]=c[P+4>>2];c[O+8>>2]=c[P+8>>2];c[O+12>>2]=c[P+12>>2];i=i+1|0}}else{c[I>>2]=c[E>>2];c[I+4>>2]=c[E+4>>2];c[I+8>>2]=c[E+8>>2];c[I+12>>2]=c[E+12>>2];c[J>>2]=c[F>>2];c[J+4>>2]=c[F+4>>2];c[J+8>>2]=c[F+8>>2];c[J+12>>2]=c[F+12>>2];i=0;while(1){if((i|0)==4)break b;P=H+(3-i<<4)|0;O=F+(i<<4)|0;c[P>>2]=c[O>>2];c[P+4>>2]=c[O+4>>2];c[P+8>>2]=c[O+8>>2];c[P+12>>2]=c[O+12>>2];i=i+1|0}}while(0);if(f){c[u>>2]=4;c[C>>2]=z;i=0;while(1){if((i|0)==4)break;P=z+(i<<4)|0;O=H+(i<<4)|0;c[P>>2]=c[O>>2];c[P+4>>2]=c[O+4>>2];c[P+8>>2]=c[O+8>>2];c[P+12>>2]=c[O+12>>2];i=i+1|0}c[A>>2]=c[C>>2];c[A+4>>2]=c[C+4>>2];DY(A,B);bO(w,c[((c[w>>2]&3|0)==2?w:k)+40>>2]|0,c[B>>2]|0,c[v>>2]|0,g)}else bO(w,c[((c[w>>2]&3|0)==2?w:k)+40>>2]|0,H,4,g);c[z>>2]=c[I>>2];c[z+4>>2]=c[I+4>>2];c[z+8>>2]=c[I+8>>2];c[z+12>>2]=c[I+12>>2];c[A>>2]=c[J>>2];c[A+4>>2]=c[J+4>>2];c[A+8>>2]=c[J+8>>2];c[A+12>>2]=c[J+12>>2];wO(b,w,z,A);h[t>>3]=m+ +h[t>>3];h[y>>3]=n+ +h[y>>3];h[r>>3]=m+ +h[r>>3];h[x>>3]=n+ +h[x>>3];j=j+1|0}}else{if((f|0)==4){PM(i,b);c[A>>2]=c[i>>2];c[A+4>>2]=c[i+4>>2];c[A+8>>2]=c[i+8>>2];c[A+12>>2]=c[i+12>>2];QM(F,A)}bO(j,c[((c[j>>2]&3|0)==2?j:k)+40>>2]|0,F,4,g);c[z>>2]=c[I>>2];c[z+4>>2]=c[I+4>>2];c[z+8>>2]=c[I+8>>2];c[z+12>>2]=c[I+12>>2];c[A>>2]=c[J>>2];c[A+4>>2]=c[J+4>>2];c[A+8>>2]=c[J+8>>2];c[A+12>>2]=c[J+12>>2];wO(b,j,z,A)}while(0);l=K;return}function OM(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=+h[b+8>>3]+ +h[c+8>>3];h[a>>3]=+h[b>>3]+ +h[c>>3];h[a+8>>3]=d;return}function PM(a,b){a=a|0;b=b|0;b=c[b+16>>2]|0;h[23326]=(+h[b+16>>3]+ +h[b+32>>3])*.5;h[23327]=(+h[b+24>>3]+ +h[b+40>>3])*.5;c[a>>2]=c[46652];c[a+4>>2]=c[46653];c[a+8>>2]=c[46654];c[a+12>>2]=c[46655];return}function QM(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0.0,g=0.0,i=0.0;g=+h[a>>3];d=+h[a+48>>3];i=(g+d)*.5;f=+h[a+8>>3];c=+h[a+56>>3];e=(f+c)*.5;g=d-g;f=c-f;f=+G(+(g*g+f*f))/5.0;g=+h[b>>3]-i;c=+h[b+8>>3]-e;d=+G(+(g*g+c*c));if(!(d==0.0)){g=i-f*(g/d);i=e-f*(c/d);h[a+32>>3]=g;h[a+16>>3]=g;h[a+40>>3]=i;h[a+24>>3]=i}return}function RM(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0,C=0,D=0,E=0,F=0,H=0,I=0,J=0.0,K=0.0,L=0.0;I=l;l=l+208|0;t=I+192|0;s=I+176|0;F=I+48|0;w=I+16|0;x=I;B=I+160|0;C=I+144|0;u=I+128|0;v=I+32|0;i=e&2130706432;D=(e&8|0)==0?((i|0)==0?4:i):8;if((D|0)==436207616)SM(a,b,d,f);else{H=HK((d<<6)+64|0)|0;E=d+-1|0;q=w+8|0;r=x+8|0;A=12.0;e=0;while(1){if((e|0)>=(d|0))break;g=b+(e<<4)|0;c[w>>2]=c[g>>2];c[w+4>>2]=c[g+4>>2];c[w+8>>2]=c[g+8>>2];c[w+12>>2]=c[g+12>>2];g=e+1|0;if((e|0)<(E|0)){p=b+(g<<4)|0;c[x>>2]=c[p>>2];c[x+4>>2]=c[p+4>>2];c[x+8>>2]=c[p+8>>2];c[x+12>>2]=c[p+12>>2]}else{c[x>>2]=c[b>>2];c[x+4>>2]=c[b+4>>2];c[x+8>>2]=c[b+8>>2];c[x+12>>2]=c[b+12>>2]}y=+h[x>>3]-+h[w>>3];z=+h[r>>3]-+h[q>>3];z=+G(+(y*y+z*z))/3.0;A=A=(d|0))break;m=b+(e<<4)|0;c[w>>2]=c[m>>2];c[w+4>>2]=c[m+4>>2];c[w+8>>2]=c[m+8>>2];c[w+12>>2]=c[m+12>>2];m=e+1|0;if((e|0)<(E|0)){e=b+(m<<4)|0;c[x>>2]=c[e>>2];c[x+4>>2]=c[e+4>>2];c[x+8>>2]=c[e+8>>2];c[x+12>>2]=c[e+12>>2]}else{c[x>>2]=c[b>>2];c[x+4>>2]=c[b+4>>2];c[x+8>>2]=c[b+8>>2];c[x+12>>2]=c[b+12>>2]}z=+h[x>>3]-+h[w>>3];y=+h[r>>3]-+h[q>>3];y=A/+G(+(z*z+y*y));y=n?y/3.0:j?y*.5:y;z=y*.5;if(o){c[s>>2]=c[w>>2];c[s+4>>2]=c[w+4>>2];c[s+8>>2]=c[w+8>>2];c[s+12>>2]=c[w+12>>2];c[t>>2]=c[x>>2];c[t+4>>2]=c[x+4>>2];c[t+8>>2]=c[x+8>>2];c[t+12>>2]=c[x+12>>2];TM(B,z,s,t);c[g>>2]=c[B>>2];c[g+4>>2]=c[B+4>>2];c[g+8>>2]=c[B+8>>2];c[g+12>>2]=c[B+12>>2]}else{c[g>>2]=c[w>>2];c[g+4>>2]=c[w+4>>2];c[g+8>>2]=c[w+8>>2];c[g+12>>2]=c[w+12>>2]};c[s>>2]=c[w>>2];c[s+4>>2]=c[w+4>>2];c[s+8>>2]=c[w+8>>2];c[s+12>>2]=c[w+12>>2];c[t>>2]=c[x>>2];c[t+4>>2]=c[x+4>>2];c[t+8>>2]=c[x+8>>2];c[t+12>>2]=c[x+12>>2];TM(C,y,s,t);c[k>>2]=c[C>>2];c[k+4>>2]=c[C+4>>2];c[k+8>>2]=c[C+8>>2];c[k+12>>2]=c[C+12>>2];e=i+3|0;c[s>>2]=c[w>>2];c[s+4>>2]=c[w+4>>2];c[s+8>>2]=c[w+8>>2];c[s+12>>2]=c[w+12>>2];c[t>>2]=c[x>>2];c[t+4>>2]=c[x+4>>2];c[t+8>>2]=c[x+8>>2];c[t+12>>2]=c[x+12>>2];TM(u,1.0-y,s,t);c[p>>2]=c[u>>2];c[p+4>>2]=c[u+4>>2];c[p+8>>2]=c[u+8>>2];c[p+12>>2]=c[u+12>>2];if(!o){i=e;e=m;continue}e=H+(e<<4)|0;c[s>>2]=c[w>>2];c[s+4>>2]=c[w+4>>2];c[s+8>>2]=c[w+8>>2];c[s+12>>2]=c[w+12>>2];c[t>>2]=c[x>>2];c[t+4>>2]=c[x+4>>2];c[t+8>>2]=c[x+8>>2];c[t+12>>2]=c[x+12>>2];TM(v,1.0-z,s,t);c[e>>2]=c[v>>2];c[e+4>>2]=c[v+4>>2];c[e+8>>2]=c[v+8>>2];c[e+12>>2]=c[v+12>>2];i=i+4|0;e=m}c[g>>2]=c[H>>2];c[g+4>>2]=c[H+4>>2];c[g+8>>2]=c[H+8>>2];c[g+12>>2]=c[H+12>>2];v=H+16|0;c[k>>2]=c[v>>2];c[k+4>>2]=c[v+4>>2];c[k+8>>2]=c[v+8>>2];c[k+12>>2]=c[v+12>>2];x=H+32|0;c[p>>2]=c[x>>2];c[p+4>>2]=c[x+4>>2];c[p+8>>2]=c[x+8>>2];c[p+12>>2]=c[x+12>>2];g=d+4|0;t=d+3|0;i=d<<4;u=d+1|0;j=g<<4;k=(d|0)==4;w=d+2|0;m=d+12|0;n=w<<4;o=d+5|0;p=u<<4;q=t<<4;r=m<<4;s=o<<4;e=D&2147483647;a:do if((e|0)<201326592){if((e|0)>=83886080){if((e|0)<134217728){if((e|0)<100663296){switch(e|0){case 83886080:break;default:break a}if(k){d=HK(192)|0;c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];p=d+16|0;t=b+16|0;c[p>>2]=c[t>>2];c[p+4>>2]=c[t+4>>2];c[p+8>>2]=c[t+8>>2];c[p+12>>2]=c[t+12>>2];p=H+48|0;L=+h[p>>3];t=H+64|0;L=L+(+h[t>>3]-L);o=d+32|0;h[o>>3]=L;q=H+56|0;z=+h[q>>3];r=H+72|0;z=z+(+h[r>>3]-z);C=d+40|0;h[C>>3]=z;A=L+(+h[p>>3]-+h[x>>3]);u=d+48|0;h[u>>3]=A;K=z+(+h[q>>3]-+h[H+40>>3]);x=d+56|0;h[x>>3]=K;y=A+(+h[t>>3]-+h[p>>3]);p=d+64|0;h[p>>3]=y;J=K+(+h[r>>3]-+h[q>>3]);q=d+72|0;h[q>>3]=J;r=d+80|0;h[r>>3]=y+(L-A);h[d+88>>3]=J+(z-K);t=H+96|0;K=+h[t>>3];v=H+80|0;K=K+(+h[v>>3]-K);E=d+144|0;h[E>>3]=K;w=H+104|0;z=+h[w>>3];s=H+88|0;z=z+(+h[s>>3]-z);h[d+152>>3]=z;J=K+(+h[t>>3]-+h[H+112>>3]);B=d+128|0;h[B>>3]=J;A=z+(+h[w>>3]-+h[H+120>>3]);D=d+136|0;h[D>>3]=A;L=J+(+h[v>>3]-+h[t>>3]);t=d+112|0;h[t>>3]=L;y=A+(+h[s>>3]-+h[w>>3]);w=d+120|0;h[w>>3]=y;s=d+96|0;h[s>>3]=L+(K-J);v=d+104|0;h[v>>3]=y+(z-A);n=d+160|0;m=b+32|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];n=d+176|0;b=b+48|0;c[n>>2]=c[b>>2];c[n+4>>2]=c[b+4>>2];c[n+8>>2]=c[b+8>>2];c[n+12>>2]=c[b+12>>2];lS(a,d,12,f);c[F>>2]=c[o>>2];c[F+4>>2]=c[o+4>>2];c[F+8>>2]=c[o+8>>2];c[F+12>>2]=c[o+12>>2];A=+h[o>>3];z=+h[u>>3];A=A-(z-A);u=F+16|0;h[u>>3]=A;y=+h[C>>3];J=+h[x>>3];y=y-(J-y);x=F+24|0;h[x>>3]=y;C=F+32|0;h[C>>3]=A+(+h[p>>3]-z);b=F+40|0;h[b>>3]=y+(+h[q>>3]-J);f=F+48|0;c[f>>2]=c[r>>2];c[f+4>>2]=c[r+4>>2];c[f+8>>2]=c[r+8>>2];c[f+12>>2]=c[r+12>>2];oS(a,F,4);c[F>>2]=c[s>>2];c[F+4>>2]=c[s+4>>2];c[F+8>>2]=c[s+8>>2];c[F+12>>2]=c[s+12>>2];J=+h[s>>3];y=+h[t>>3];J=J-(y-J);h[u>>3]=J;z=+h[v>>3];A=+h[w>>3];z=z-(A-z);h[x>>3]=z;h[C>>3]=J+(+h[B>>3]-y);h[b>>3]=z+(+h[D>>3]-A);c[f>>2]=c[E>>2];c[f+4>>2]=c[E+4>>2];c[f+8>>2]=c[E+8>>2];c[f+12>>2]=c[E+12>>2];oS(a,F,4);l6(d);break}else Aa(105739,105750,737,105759)}if((e|0)<117440512){switch(e|0){case 100663296:break;default:break a}d=HK(s)|0;C=b+16|0;L=+h[C>>3];J=+h[b>>3]-L;J=J*.125+(L+J*.5);h[d>>3]=J;D=b+40|0;L=+h[D>>3];E=b+24|0;v=H+48|0;w=H+56|0;B=H+72|0;L=L+(+h[E>>3]-L)*.5+(+h[w>>3]-+h[B>>3])*3.0*.5;h[d+8>>3]=L;A=+h[C>>3];K=+h[b>>3]-A;K=A+K*.5-K*.25;h[d+16>>3]=K;h[d+24>>3]=L;h[d+32>>3]=K;A=+h[D>>3];h[d+40>>3]=A+(+h[E>>3]-A)*.5;K=K+(+h[x>>3]-+h[v>>3])*.5;h[d+48>>3]=K;A=+h[D>>3];h[d+56>>3]=A+(+h[E>>3]-A)*.5;h[d+64>>3]=K;K=+h[D>>3];K=K+(+h[E>>3]-K)*.5+(+h[w>>3]-+h[B>>3]);h[d+72>>3]=K;h[d+80>>3]=J;h[d+88>>3]=K;h[d+96>>3]=J;K=K-(+h[w>>3]-+h[B>>3])*.25;h[d+104>>3]=K;h[d+112>>3]=J+(+h[x>>3]-+h[v>>3]);h[d+120>>3]=K+(+h[w>>3]-+h[B>>3])*.5;h[d+128>>3]=+h[d>>3];h[d+136>>3]=L+(+h[w>>3]-+h[B>>3])*.25;lS(a,d,o,f);h[F>>3]=+h[C>>3];L=+h[D>>3];h[F+8>>3]=L+(+h[E>>3]-L)*.5;h[F+16>>3]=+h[b>>3];h[F+24>>3]=L+(+h[b+8>>3]-+h[b+56>>3])*.5;oS(a,F,2);l6(d);break}else{switch(e|0){case 117440512:break;default:break a}d=HK(p)|0;h[d>>3]=+h[v>>3];E=H+56|0;F=H+72|0;h[d+8>>3]=+h[H+24>>3]-(+h[E>>3]-+h[F>>3])*.5;h[d+16>>3]=+h[H+48>>3];L=+h[E>>3];h[d+24>>3]=L-(L-+h[F>>3])*.5;h[d+32>>3]=+h[b+32>>3];D=b+40|0;h[d+40>>3]=+h[D>>3]+(+h[E>>3]-+h[F>>3])*.5;h[d+48>>3]=+h[v>>3];h[d+56>>3]=+h[D>>3]+(+h[E>>3]-+h[F>>3])*.5;L=+h[b+8>>3];h[d+72>>3]=L-(L-+h[b+56>>3])*.5;h[d+64>>3]=+h[b>>3];lS(a,d,u,f);l6(d);break}}if((e|0)<167772160)if((e|0)<150994944){switch(e|0){case 134217728:break;default:break a}d=HK(j)|0;C=b+16|0;A=+h[C>>3];B=H+48|0;A=A+(+h[b>>3]-A)*.5+(+h[x>>3]-+h[B>>3])*.25;h[d>>3]=A;D=b+40|0;L=+h[D>>3];E=b+24|0;L=L+(+h[E>>3]-L)*.5;h[d+8>>3]=L;h[d+16>>3]=A;v=H+56|0;w=H+72|0;J=L+(+h[v>>3]-+h[w>>3])*.5;h[d+24>>3]=J;A=A+(+h[x>>3]-+h[B>>3])*.5;h[d+32>>3]=A;h[d+40>>3]=J;h[d+48>>3]=A;A=J+(+h[v>>3]-+h[w>>3])*.5;h[d+56>>3]=A;K=+h[C>>3];K=K+(+h[b>>3]-K)*.5-(+h[x>>3]-+h[B>>3])*3.0*.25;h[d+64>>3]=K;h[d+72>>3]=A;h[d+80>>3]=K;h[d+88>>3]=J;K=+h[C>>3];K=K+(+h[b>>3]-K)*.5-(+h[x>>3]-+h[B>>3])*.25;h[d+96>>3]=K;h[d+104>>3]=J;h[d+112>>3]=K;h[d+120>>3]=L;lS(a,d,g,f);h[F>>3]=+h[C>>3];L=+h[D>>3];h[F+8>>3]=L+(+h[E>>3]-L)*.5;h[F+16>>3]=+h[b>>3];h[F+24>>3]=L+(+h[b+8>>3]-+h[b+56>>3])*.5;oS(a,F,2);l6(d);break}else{switch(e|0){case 150994944:break;default:break a}d=HK(n)|0;C=b+16|0;J=+h[C>>3];B=H+48|0;J=J+(+h[b>>3]-J)*.5+(+h[x>>3]-+h[B>>3])*3.0*.25;h[d>>3]=J;D=b+40|0;L=+h[D>>3];E=b+24|0;L=L+(+h[E>>3]-L)*.5;h[d+8>>3]=L;h[d+16>>3]=J;u=H+56|0;v=H+72|0;J=L+(+h[u>>3]-+h[v>>3])*.25;h[d+24>>3]=J;K=+h[C>>3];h[d+32>>3]=K+(+h[b>>3]-K)*.5+(+h[x>>3]-+h[B>>3])*.25;K=J+(+h[u>>3]-+h[v>>3])*.5;h[d+40>>3]=K;A=+h[C>>3];h[d+48>>3]=A+(+h[b>>3]-A)*.5-(+h[x>>3]-+h[B>>3])*.25;h[d+56>>3]=K;K=+h[C>>3];K=K+(+h[b>>3]-K)*.5-(+h[x>>3]-+h[B>>3])*3.0*.25;h[d+64>>3]=K;h[d+72>>3]=J;h[d+80>>3]=K;h[d+88>>3]=L;lS(a,d,w,f);h[F>>3]=+h[C>>3];L=+h[D>>3];h[F+8>>3]=L+(+h[E>>3]-L)*.5;h[F+16>>3]=+h[b>>3];h[F+24>>3]=L+(+h[b+8>>3]-+h[b+56>>3])*.5;oS(a,F,2);l6(d);break}else if((e|0)<184549376){switch(e|0){case 167772160:break;default:break a}d=HK(p)|0;C=b+16|0;J=+h[C>>3];v=H+48|0;J=J+(+h[b>>3]-J)*.5+(+h[x>>3]-+h[v>>3]);h[d>>3]=J;D=b+40|0;L=+h[D>>3];E=b+24|0;w=H+56|0;B=H+72|0;L=L+(+h[E>>3]-L)*.5+(+h[w>>3]-+h[B>>3])*.25;h[d+8>>3]=L;J=J-(+h[x>>3]-+h[v>>3]);h[d+16>>3]=J;h[d+24>>3]=L+(+h[w>>3]-+h[B>>3]);h[d+32>>3]=J;J=L+(+h[w>>3]-+h[B>>3])*.5;h[d+40>>3]=J;A=+h[C>>3];K=+h[b>>3]-A;K=A+K*.5-K*.25;h[d+48>>3]=K;h[d+56>>3]=J;h[d+64>>3]=K;h[d+72>>3]=L;lS(a,d,u,f);h[F>>3]=+h[C>>3];L=+h[D>>3];h[F+8>>3]=L+(+h[E>>3]-L)*.5;h[F+16>>3]=+h[b>>3];h[F+24>>3]=L+(+h[b+8>>3]-+h[b+56>>3])*.5;oS(a,F,2);l6(d);break}else{switch(e|0){case 184549376:break;default:break a}d=HK(j)|0;B=b+16|0;J=+h[B>>3];K=+h[b>>3]-J;u=H+48|0;K=K*.125+(J+K*.5)+(+h[x>>3]-+h[u>>3])*.5;h[d>>3]=K;v=b+40|0;J=+h[v>>3];w=b+24|0;E=H+56|0;C=H+72|0;J=J+(+h[w>>3]-J)*.5+(+h[E>>3]-+h[C>>3])*.25;h[d+8>>3]=J;A=+h[B>>3];L=+h[b>>3]-A;L=A+L*.5-L*.125;h[d+16>>3]=L;h[d+24>>3]=J;h[d+32>>3]=L;J=J+(+h[E>>3]-+h[C>>3])*.5;h[d+40>>3]=J;L=L-(+h[x>>3]-+h[u>>3])*.5;h[d+48>>3]=L;h[d+56>>3]=J;D=d+64|0;h[D>>3]=L;L=+h[v>>3];L=L+(+h[w>>3]-L)*.5-(+h[E>>3]-+h[C>>3])*.25;h[d+72>>3]=L;J=K-(+h[x>>3]-+h[u>>3])*.5;h[d+80>>3]=J;h[d+88>>3]=L;h[d+96>>3]=J;L=L-(+h[E>>3]-+h[C>>3])*.5;h[d+104>>3]=L;x=d+112|0;h[x>>3]=K;h[d+120>>3]=L;lS(a,d,g,f);h[F>>3]=+h[B>>3];L=+h[v>>3];B=F+8|0;h[B>>3]=L+(+h[w>>3]-L)*.5;C=F+16|0;h[C>>3]=+h[D>>3];D=b+8|0;E=b+56|0;f=F+24|0;h[f>>3]=L+(+h[D>>3]-+h[E>>3])*.5;oS(a,F,2);h[F>>3]=+h[x>>3];L=+h[v>>3];h[B>>3]=L+(+h[w>>3]-L)*.5;h[C>>3]=+h[b>>3];h[f>>3]=L+(+h[D>>3]-+h[E>>3])*.5;oS(a,F,2);l6(d);break}}if((e|0)<33554432){if((e|0)<8){switch(e|0){case 4:break;default:break a}i=IK((d*96|0)+32|0)|0;e=0;g=0;while(1){j=g|1;k=i+(g<<4)|0;m=i+(j<<4)|0;if((e|0)>=(d|0))break;b=e<<2;E=H+(b<<4)|0;c[k>>2]=c[E>>2];c[k+4>>2]=c[E+4>>2];c[k+8>>2]=c[E+8>>2];c[k+12>>2]=c[E+12>>2];E=H+((b|1)<<4)|0;c[m>>2]=c[E>>2];c[m+4>>2]=c[E+4>>2];c[m+8>>2]=c[E+8>>2];c[m+12>>2]=c[E+12>>2];F=i+(g+2<<4)|0;c[F>>2]=c[E>>2];c[F+4>>2]=c[E+4>>2];c[F+8>>2]=c[E+8>>2];c[F+12>>2]=c[E+12>>2];F=i+(g+3<<4)|0;E=H+((b|2)<<4)|0;c[F>>2]=c[E>>2];c[F+4>>2]=c[E+4>>2];c[F+8>>2]=c[E+8>>2];c[F+12>>2]=c[E+12>>2];F=i+(g+4<<4)|0;c[F>>2]=c[E>>2];c[F+4>>2]=c[E+4>>2];c[F+8>>2]=c[E+8>>2];c[F+12>>2]=c[E+12>>2];F=i+(g+5<<4)|0;b=H+((b|3)<<4)|0;c[F>>2]=c[b>>2];c[F+4>>2]=c[b+4>>2];c[F+8>>2]=c[b+8>>2];c[F+12>>2]=c[b+12>>2];e=e+1|0;g=g+6|0}c[k>>2]=c[i>>2];c[k+4>>2]=c[i+4>>2];c[k+8>>2]=c[i+8>>2];c[k+12>>2]=c[i+12>>2];d=i+16|0;c[m>>2]=c[d>>2];c[m+4>>2]=c[d+4>>2];c[m+8>>2]=c[d+8>>2];c[m+12>>2]=c[d+12>>2];nS(a,d,j,0,0,f&255);l6(i);break}if((e|0)<16777216){switch(e|0){case 8:break;default:break a}lS(a,b,d,f);g=F+16|0;e=0;while(1){if((e|0)>=(d|0))break a;f=e*3|0;b=H+(f+2<<4)|0;c[F>>2]=c[b>>2];c[F+4>>2]=c[b+4>>2];c[F+8>>2]=c[b+8>>2];c[F+12>>2]=c[b+12>>2];f=H+(f+4<<4)|0;c[g>>2]=c[f>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];c[g+12>>2]=c[f+12>>2];oS(a,F,2);e=e+1|0}}switch(e|0){case 16777216:break;default:break a}g=HK(p)|0;e=1;while(1){if((e|0)>=(d|0))break;D=g+(e<<4)|0;C=b+(e<<4)|0;c[D>>2]=c[C>>2];c[D+4>>2]=c[C+4>>2];c[D+8>>2]=c[C+8>>2];c[D+12>>2]=c[C+12>>2];e=e+1|0}b=E*3|0;E=H+(b+4<<4)|0;c[g>>2]=c[E>>2];c[g+4>>2]=c[E+4>>2];c[g+8>>2]=c[E+8>>2];c[g+12>>2]=c[E+12>>2];D=g+(d<<4)|0;d=H+(b+2<<4)|0;c[D>>2]=c[d>>2];c[D+4>>2]=c[d+4>>2];c[D+8>>2]=c[d+8>>2];c[D+12>>2]=c[d+12>>2];lS(a,g,u,f);l6(g);c[F>>2]=c[d>>2];c[F+4>>2]=c[d+4>>2];c[F+8>>2]=c[d+8>>2];c[F+12>>2]=c[d+12>>2];f=F+16|0;c[f>>2]=c[E>>2];c[f+4>>2]=c[E+4>>2];c[f+8>>2]=c[E+8>>2];c[f+12>>2]=c[E+12>>2];b=b+3|0;d=F+32|0;h[d>>3]=+h[f>>3]+(+h[F>>3]-+h[H+(b<<4)>>3]);h[F+40>>3]=+h[F+24>>3]+(+h[F+8>>3]-+h[H+(b<<4)+8>>3]);oS(a,f,2);c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];oS(a,F,2);break}else{if((e|0)<50331648){switch(e|0){case 33554432:break;default:break a}g=HK(n)|0;c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];i=g+16|0;c[i>>2]=c[x>>2];c[i+4>>2]=c[x+4>>2];c[i+8>>2]=c[x+8>>2];c[i+12>>2]=c[x+12>>2];i=H+48|0;E=H+64|0;h[g+32>>3]=+h[x>>3]+(+h[i>>3]-+h[E>>3])/3.0;d=H+56|0;e=H+72|0;h[g+40>>3]=+h[H+40>>3]+(+h[d>>3]-+h[e>>3])/3.0;L=+h[i>>3];h[g+48>>3]=L+(L-+h[E>>3])/3.0;L=+h[d>>3];h[g+56>>3]=L+(L-+h[e>>3])/3.0;e=4;while(1){if((e|0)>=(w|0))break;d=g+(e<<4)|0;E=b+(e+-2<<4)|0;c[d>>2]=c[E>>2];c[d+4>>2]=c[E+4>>2];c[d+8>>2]=c[E+8>>2];c[d+12>>2]=c[E+12>>2];e=e+1|0}lS(a,g,w,f);l6(g);c[F>>2]=c[i>>2];c[F+4>>2]=c[i+4>>2];c[F+8>>2]=c[i+8>>2];c[F+12>>2]=c[i+12>>2];f=F+16|0;c[f>>2]=c[x>>2];c[f+4>>2]=c[x+4>>2];c[f+8>>2]=c[x+8>>2];c[f+12>>2]=c[x+12>>2];oS(a,F,2);break}if((e|0)>=67108864){switch(e|0){case 67108864:break;default:break a}if(k){D=HK(n)|0;c[D>>2]=c[b>>2];c[D+4>>2]=c[b+4>>2];c[D+8>>2]=c[b+8>>2];c[D+12>>2]=c[b+12>>2];d=D+16|0;c[d>>2]=c[x>>2];c[d+4>>2]=c[x+4>>2];c[d+8>>2]=c[x+8>>2];c[d+12>>2]=c[x+12>>2];d=D+32|0;E=H+64|0;c[d>>2]=c[E>>2];c[d+4>>2]=c[E+4>>2];c[d+8>>2]=c[E+8>>2];c[d+12>>2]=c[E+12>>2];d=D+48|0;b=b+32|0;c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];b=D+64|0;d=H+128|0;c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];b=D+80|0;C=H+160|0;c[b>>2]=c[C>>2];c[b+4>>2]=c[C+4>>2];c[b+8>>2]=c[C+8>>2];c[b+12>>2]=c[C+12>>2];lS(a,D,w,f);l6(D);h[F>>3]=+h[v>>3]+(+h[H+176>>3]-+h[H>>3]);h[F+8>>3]=+h[H+24>>3]+(+h[H+184>>3]-+h[H+8>>3]);f=F+16|0;c[f>>2]=c[E>>2];c[f+4>>2]=c[E+4>>2];c[f+8>>2]=c[E+8>>2];c[f+12>>2]=c[E+12>>2];oS(a,F,2);c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];oS(a,F,2);c[f>>2]=c[H>>2];c[f+4>>2]=c[H+4>>2];c[f+8>>2]=c[H+8>>2];c[f+12>>2]=c[H+12>>2];oS(a,F,2);break}else Aa(105739,105750,714,105759)}switch(e|0){case 50331648:break;default:break a}g=HK(q)|0;c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];L=+h[b>>3];h[g+16>>3]=L-(L-+h[v>>3])*.25;e=H+56|0;L=+h[b+8>>3]+(+h[e>>3]-+h[H+72>>3])/3.0;h[g+24>>3]=L;K=+h[b>>3];h[g+32>>3]=K-(K-+h[v>>3])*2.0;h[g+40>>3]=L;L=+h[b>>3];h[g+48>>3]=L-(L-+h[v>>3])*2.25;h[g+56>>3]=+h[e>>3];h[g+64>>3]=+h[H+48>>3];h[g+72>>3]=+h[e>>3];e=4;while(1){if((e|0)>=(t|0))break;d=g+(e<<4)|0;F=b+(e+-3<<4)|0;c[d>>2]=c[F>>2];c[d+4>>2]=c[F+4>>2];c[d+8>>2]=c[F+8>>2];c[d+12>>2]=c[F+12>>2];e=e+1|0}lS(a,g,t,f);l6(g);break}}else if((e|0)<318767104){if((e|0)<251658240){if((e|0)<218103808){switch(e|0){case 201326592:break;default:break a}E=HK(i)|0;u=b+16|0;L=+h[u>>3];h[E>>3]=L;C=b+40|0;K=+h[C>>3];D=b+24|0;B=H+48|0;v=H+56|0;w=H+72|0;K=K+(+h[D>>3]-K)*.5+(+h[v>>3]-+h[w>>3])*.125;h[E+8>>3]=K;J=L+(+h[x>>3]-+h[B>>3])*2.0;h[E+16>>3]=J;h[E+24>>3]=K;h[E+32>>3]=J;K=K+(+h[v>>3]-+h[w>>3])*.5;h[E+40>>3]=K;h[E+48>>3]=L;h[E+56>>3]=K;lS(a,E,d,f);l6(E);E=HK(i)|0;K=+h[u>>3]+(+h[x>>3]-+h[B>>3]);h[E>>3]=K;L=+h[C>>3];L=L+(+h[D>>3]-L)*.5-(+h[v>>3]-+h[w>>3])*5.0*.125;h[E+8>>3]=L;J=K+(+h[x>>3]-+h[B>>3]);B=E+16|0;h[B>>3]=J;h[E+24>>3]=L;h[E+32>>3]=J;L=L+(+h[v>>3]-+h[w>>3])*.5;h[E+40>>3]=L;h[E+48>>3]=K;h[E+56>>3]=L;lS(a,E,d,f);h[F>>3]=+h[B>>3];L=+h[C>>3];h[F+8>>3]=L+(+h[D>>3]-L)*.5;h[F+16>>3]=+h[b>>3];h[F+24>>3]=L+(+h[b+8>>3]-+h[b+56>>3])*.5;oS(a,F,2);l6(E);break}if((e|0)<234881024){switch(e|0){case 218103808:break;default:break a}E=HK(i)|0;L=+h[b>>3];h[E>>3]=L;B=b+40|0;K=+h[B>>3];C=b+24|0;w=H+56|0;D=H+72|0;K=K+(+h[C>>3]-K)*.5+(+h[w>>3]-+h[D>>3])*.125;h[E+8>>3]=K;h[E+16>>3]=L;J=K+(+h[w>>3]-+h[D>>3])*.5;h[E+24>>3]=J;L=L-(+h[w>>3]-+h[D>>3])*2.0;h[E+32>>3]=L;h[E+40>>3]=J;h[E+48>>3]=L;h[E+56>>3]=K;lS(a,E,d,f);l6(E);E=HK(i)|0;K=+h[b>>3]-(+h[x>>3]-+h[H+48>>3]);h[E>>3]=K;L=+h[B>>3];L=L+(+h[C>>3]-L)*.5-(+h[w>>3]-+h[D>>3])*5.0*.125;h[E+8>>3]=L;h[E+16>>3]=K;J=L+(+h[w>>3]-+h[D>>3])*.5;h[E+24>>3]=J;K=K-(+h[w>>3]-+h[D>>3]);h[E+32>>3]=K;h[E+40>>3]=J;D=E+48|0;h[D>>3]=K;h[E+56>>3]=L;lS(a,E,d,f);h[F>>3]=+h[b+16>>3];L=+h[B>>3];h[F+8>>3]=L+(+h[C>>3]-L)*.5;h[F+16>>3]=+h[D>>3];h[F+24>>3]=L+(+h[b+8>>3]-+h[b+56>>3])*.5;oS(a,F,2);l6(E);break}else{switch(e|0){case 234881024:break;default:break a}E=HK(i)|0;t=b+16|0;K=+h[t>>3];u=H+48|0;K=K+(+h[b>>3]-K)*.5-(+h[x>>3]-+h[u>>3])*9.0*.125;h[E>>3]=K;v=b+40|0;L=+h[v>>3];w=b+24|0;D=H+56|0;C=H+72|0;L=L+(+h[w>>3]-L)*.5+(+h[D>>3]-+h[C>>3])*.125;h[E+8>>3]=L;J=K+(+h[x>>3]-+h[u>>3]);h[E+16>>3]=J;h[E+24>>3]=L;h[E+32>>3]=J;L=L+(+h[D>>3]-+h[C>>3])*.5;h[E+40>>3]=L;h[E+48>>3]=K;h[E+56>>3]=L;lS(a,E,d,f);l6(E);E=HK(i)|0;L=+h[t>>3];L=L+(+h[b>>3]-L)*.5-(+h[x>>3]-+h[u>>3])*9.0*.125;h[E>>3]=L;K=+h[v>>3];K=K+(+h[w>>3]-K)*.5-(+h[D>>3]-+h[C>>3])*5.0*.125;h[E+8>>3]=K;J=L+(+h[x>>3]-+h[u>>3]);h[E+16>>3]=J;h[E+24>>3]=K;h[E+32>>3]=J;K=K+(+h[D>>3]-+h[C>>3])*.5;h[E+40>>3]=K;h[E+48>>3]=L;h[E+56>>3]=K;lS(a,E,d,f);l6(E);E=HK(i)|0;K=+h[t>>3];K=K+(+h[b>>3]-K)*.5+(+h[x>>3]-+h[u>>3])*.125;h[E>>3]=K;L=+h[v>>3];L=L+(+h[w>>3]-L)*.5-(+h[D>>3]-+h[C>>3])*5.0*.125;h[E+8>>3]=L;J=K+(+h[x>>3]-+h[u>>3]);h[E+16>>3]=J;h[E+24>>3]=L;h[E+32>>3]=J;L=L+(+h[D>>3]-+h[C>>3])*.5;h[E+40>>3]=L;h[E+48>>3]=K;h[E+56>>3]=L;lS(a,E,d,f);l6(E);E=HK(i)|0;L=+h[t>>3];L=L+(+h[b>>3]-L)*.5+(+h[x>>3]-+h[u>>3])*.125;h[E>>3]=L;K=+h[v>>3];K=K+(+h[w>>3]-K)*.5+(+h[D>>3]-+h[C>>3])*.125;h[E+8>>3]=K;J=L+(+h[x>>3]-+h[u>>3]);B=E+16|0;h[B>>3]=J;h[E+24>>3]=K;h[E+32>>3]=J;K=K+(+h[D>>3]-+h[C>>3])*.5;h[E+40>>3]=K;h[E+48>>3]=L;h[E+56>>3]=K;lS(a,E,d,f);h[F>>3]=+h[B>>3];K=+h[v>>3];B=F+8|0;h[B>>3]=K+(+h[w>>3]-K)*.5;C=F+16|0;h[C>>3]=+h[b>>3];D=b+8|0;d=b+56|0;f=F+24|0;h[f>>3]=K+(+h[D>>3]-+h[d>>3])*.5;oS(a,F,2);K=+h[t>>3];h[F>>3]=K+(+h[b>>3]-K)*.5-(+h[x>>3]-+h[u>>3])*9.0*.125;L=+h[v>>3];h[B>>3]=L+(+h[w>>3]-L)*.5;h[C>>3]=K;h[f>>3]=L+(+h[D>>3]-+h[d>>3])*.5;oS(a,F,2);l6(E);break}}if((e|0)<285212672)if((e|0)<268435456){switch(e|0){case 251658240:break;default:break a}E=HK(i)|0;u=b+16|0;L=+h[u>>3];B=H+48|0;L=L+(+h[b>>3]-L)*.5-(+h[x>>3]-+h[B>>3]);h[E>>3]=L;v=b+40|0;K=+h[v>>3];w=b+24|0;D=H+56|0;C=H+72|0;K=K+(+h[w>>3]-K)*.5+(+h[D>>3]-+h[C>>3])*.125;h[E+8>>3]=K;J=L+(+h[x>>3]-+h[B>>3])*2.0;h[E+16>>3]=J;h[E+24>>3]=K;h[E+32>>3]=J;K=K+(+h[D>>3]-+h[C>>3])*.5;h[E+40>>3]=K;h[E+48>>3]=L;h[E+56>>3]=K;lS(a,E,d,f);l6(E);E=HK(i)|0;K=+h[u>>3];K=K+(+h[b>>3]-K)*.5-(+h[x>>3]-+h[B>>3]);h[E>>3]=K;L=+h[v>>3];L=L+(+h[w>>3]-L)*.5-(+h[D>>3]-+h[C>>3])*5.0*.125;h[E+8>>3]=L;J=K+(+h[x>>3]-+h[B>>3])*2.0;B=E+16|0;h[B>>3]=J;h[E+24>>3]=L;h[E+32>>3]=J;L=L+(+h[D>>3]-+h[C>>3])*.5;h[E+40>>3]=L;h[E+48>>3]=K;h[E+56>>3]=L;lS(a,E,d,f);h[F>>3]=+h[B>>3];L=+h[v>>3];B=F+8|0;h[B>>3]=L+(+h[w>>3]-L)*.5;C=F+16|0;h[C>>3]=+h[b>>3];D=b+8|0;d=b+56|0;f=F+24|0;h[f>>3]=L+(+h[D>>3]-+h[d>>3])*.5;oS(a,F,2);h[F>>3]=+h[u>>3];L=+h[v>>3];h[B>>3]=L+(+h[w>>3]-L)*.5;h[C>>3]=+h[E>>3];h[f>>3]=L+(+h[D>>3]-+h[d>>3])*.5;oS(a,F,2);l6(E);break}else{switch(e|0){case 268435456:break;default:break a}E=HK(i)|0;h[E>>3]=+h[b>>3];u=H+48|0;B=H+56|0;C=H+72|0;h[E+8>>3]=+h[H+24>>3]-(+h[B>>3]-+h[C>>3])*.5;h[E+16>>3]=+h[u>>3];L=+h[B>>3];h[E+24>>3]=L-(L-+h[C>>3])*.5;h[E+32>>3]=+h[b+32>>3];w=b+40|0;h[E+40>>3]=+h[w>>3]+(+h[B>>3]-+h[C>>3])*.5;h[E+48>>3]=+h[b>>3];h[E+56>>3]=+h[w>>3]+(+h[B>>3]-+h[C>>3])*.5;lS(a,E,d,f);v=b+16|0;L=(+h[x>>3]-+h[u>>3])*.25;K=+h[v>>3]+L;h[F>>3]=K;A=+h[w>>3];t=b+24|0;J=+h[B>>3]-+h[C>>3];A=A+(+h[t>>3]-A)*.5+J*.125;D=F+8|0;h[D>>3]=A;d=F+16|0;h[d>>3]=K+L;f=F+24|0;h[f>>3]=A-J*.25;oS(a,F,2);J=(+h[x>>3]-+h[u>>3])*.25;A=+h[v>>3]+J;h[F>>3]=A;L=+h[w>>3];K=+h[B>>3]-+h[C>>3];L=L+(+h[t>>3]-L)*.5-K*.125;h[D>>3]=L;h[d>>3]=A+J;h[f>>3]=L+K*.25;oS(a,F,2);K=(+h[x>>3]-+h[u>>3])*.25;h[F>>3]=+h[v>>3]+K;L=+h[w>>3]+(+h[B>>3]-+h[C>>3])*3.0*.25;h[D>>3]=L;h[d>>3]=+h[b>>3]-K;h[f>>3]=L;oS(a,F,2);l6(E);break}else if((e|0)<301989888){switch(e|0){case 285212672:break;default:break a}B=HK(i)|0;u=b+16|0;z=+h[u>>3];C=H+48|0;z=z+(+h[b>>3]-z)*.5+(+h[x>>3]-+h[C>>3])*.5;h[B>>3]=z;v=b+40|0;A=+h[v>>3];w=b+24|0;A=A+(+h[w>>3]-A)*.5+(+h[x>>3]-+h[C>>3])*.5;h[B+8>>3]=A;h[B+16>>3]=z;z=+h[v>>3];L=(+h[x>>3]-+h[C>>3])*.5;z=z+(+h[w>>3]-z)*.5-L;h[B+24>>3]=z;J=+h[u>>3];L=J+(+h[b>>3]-J)*.5-L;h[B+32>>3]=L;h[B+40>>3]=z;h[B+48>>3]=L;h[B+56>>3]=A;lS(a,B,d,f);l6(B);A=+h[u>>3];A=A+(+h[b>>3]-A)*.5;L=(+h[x>>3]-+h[C>>3])*3.0*.25;z=A+L;h[F>>3]=z;J=+h[v>>3];J=J+(+h[w>>3]-J)*.5;K=J+L;B=F+8|0;h[B>>3]=K;D=F+16|0;h[D>>3]=z;J=J-L;f=F+24|0;h[f>>3]=J;L=A-L;h[F+32>>3]=L;h[F+40>>3]=J;h[F+48>>3]=L;h[F+56>>3]=K;E=F+64|0;c[E>>2]=c[F>>2];c[E+4>>2]=c[F+4>>2];c[E+8>>2]=c[F+8>>2];c[E+12>>2]=c[F+12>>2];oS(a,F,5);K=+h[u>>3];L=+h[b>>3];h[F>>3]=K+(L-K)*.5+(+h[x>>3]-+h[C>>3])*3.0*.25;K=+h[v>>3];h[B>>3]=K+(+h[w>>3]-K)*.5;h[D>>3]=L;E=b+8|0;d=b+56|0;h[f>>3]=K+(+h[E>>3]-+h[d>>3])*.5;oS(a,F,2);K=+h[u>>3];h[F>>3]=K;L=+h[v>>3];h[B>>3]=L+(+h[w>>3]-L)*.5;h[D>>3]=K+(+h[b>>3]-K)*.5-(+h[x>>3]-+h[C>>3])*3.0*.25;h[f>>3]=L+(+h[E>>3]-+h[d>>3])*.5;oS(a,F,2);break}else{switch(e|0){case 301989888:break;default:break a}d=HK(r)|0;w=b+16|0;y=+h[w>>3];s=H+48|0;y=y+(+h[b>>3]-y)*.5+(+h[x>>3]-+h[s>>3])*.25;h[d>>3]=y;B=b+40|0;A=+h[B>>3];C=b+24|0;u=H+56|0;v=H+72|0;A=A+(+h[C>>3]-A)*.5+(+h[u>>3]-+h[v>>3])*.5;t=d+8|0;h[t>>3]=A;h[d+16>>3]=y;A=A+(+h[u>>3]-+h[v>>3])*.125;E=d+24|0;h[E>>3]=A;J=y-(+h[x>>3]-+h[s>>3])*.125;D=d+32|0;h[D>>3]=J;z=A+(+h[u>>3]-+h[v>>3])*.125;h[d+40>>3]=z;h[d+48>>3]=y;L=z+(+h[u>>3]-+h[v>>3])*.125;h[d+56>>3]=L;h[d+64>>3]=y;y=L+(+h[u>>3]-+h[v>>3])*.125;h[d+72>>3]=y;h[d+80>>3]=J;h[d+88>>3]=y;J=+h[w>>3];J=J+(+h[b>>3]-J)*.5;h[d+96>>3]=J;h[d+104>>3]=L;K=J-(+h[x>>3]-+h[s>>3])*.125;h[d+112>>3]=K;h[d+120>>3]=y;K=K-(+h[x>>3]-+h[s>>3])*.125;h[d+128>>3]=K;h[d+136>>3]=y;h[d+144>>3]=K;h[d+152>>3]=L;L=K+(+h[x>>3]-+h[s>>3])*.125;h[d+160>>3]=L;h[d+168>>3]=z;h[d+176>>3]=K;h[d+184>>3]=A;h[d+192>>3]=K;K=+h[t>>3];h[d+200>>3]=K;h[d+208>>3]=L;h[d+216>>3]=K;x=d+224|0;h[x>>3]=J;h[d+232>>3]=+h[E>>3];h[d+240>>3]=+h[D>>3];h[d+248>>3]=K;lS(a,d,m,f);K=+h[x>>3];h[F>>3]=K;J=+h[B>>3];J=J+(+h[C>>3]-J)*.5;D=F+8|0;h[D>>3]=J;E=F+16|0;h[E>>3]=K;f=F+24|0;h[f>>3]=J+(+h[u>>3]-+h[v>>3])*.125;oS(a,F,2);J=+h[x>>3];h[F>>3]=J;K=+h[B>>3];L=+h[u>>3]-+h[v>>3];K=K+(+h[C>>3]-K)*.5+L*.25;h[D>>3]=K;h[E>>3]=J;h[f>>3]=K+L*.125;oS(a,F,2);h[F>>3]=+h[w>>3];L=+h[B>>3];h[D>>3]=L+(+h[C>>3]-L)*.5;h[E>>3]=+h[b>>3];h[f>>3]=L+(+h[b+8>>3]-+h[b+56>>3])*.5;oS(a,F,2);l6(d);break}}else{if((e|0)<369098752){if((e|0)<335544320){switch(e|0){case 318767104:break;default:break a}d=HK(j)|0;w=b+16|0;J=+h[w>>3];D=H+48|0;J=J+(+h[b>>3]-J)*.5+(+h[x>>3]-+h[D>>3])*.125;h[d>>3]=J;B=b+40|0;K=+h[B>>3];C=b+24|0;u=H+56|0;v=H+72|0;K=K+(+h[C>>3]-K)*.5+(+h[u>>3]-+h[v>>3])*.5;h[d+8>>3]=K;z=J+(+h[x>>3]-+h[D>>3])*.125;h[d+16>>3]=z;L=K+(+h[u>>3]-+h[v>>3])*.125;h[d+24>>3]=L;h[d+32>>3]=z;z=L+(+h[u>>3]-+h[v>>3])*.25;h[d+40>>3]=z;h[d+48>>3]=J;A=z+(+h[u>>3]-+h[v>>3])*.125;h[d+56>>3]=A;J=J-(+h[x>>3]-+h[D>>3])*.25;h[d+64>>3]=J;h[d+72>>3]=A;A=J-(+h[x>>3]-+h[D>>3])*.125;h[d+80>>3]=A;h[d+88>>3]=z;h[d+96>>3]=A;h[d+104>>3]=L;h[d+112>>3]=J;h[d+120>>3]=K;lS(a,d,g,f);K=+h[w>>3];K=K+(+h[b>>3]-K)*.5;h[F>>3]=K;J=+h[B>>3];J=J+(+h[C>>3]-J)*.5;D=F+8|0;h[D>>3]=J;E=F+16|0;h[E>>3]=K;f=F+24|0;h[f>>3]=J+(+h[u>>3]-+h[v>>3])*.125;oS(a,F,2);J=+h[w>>3];J=J+(+h[b>>3]-J)*.5;h[F>>3]=J;K=+h[B>>3];L=+h[u>>3]-+h[v>>3];K=K+(+h[C>>3]-K)*.5+L*.25;h[D>>3]=K;h[E>>3]=J;h[f>>3]=K+L*.125;oS(a,F,2);h[F>>3]=+h[w>>3];L=+h[B>>3];h[D>>3]=L+(+h[C>>3]-L)*.5;h[E>>3]=+h[b>>3];h[f>>3]=L+(+h[b+8>>3]-+h[b+56>>3])*.5;oS(a,F,2);l6(d);break}if((e|0)<352321536){switch(e|0){case 335544320:break;default:break a}d=HK(r)|0;B=b+16|0;y=+h[B>>3];u=H+48|0;y=y+(+h[b>>3]-y)*.5+(+h[x>>3]-+h[u>>3])*.25;h[d>>3]=y;C=b+40|0;A=+h[C>>3];D=b+24|0;s=H+56|0;t=H+72|0;A=A+(+h[D>>3]-A)*.5+(+h[s>>3]-+h[t>>3])*.5;E=d+8|0;h[E>>3]=A;h[d+16>>3]=y;A=A+(+h[s>>3]-+h[t>>3])*.125;v=d+24|0;h[v>>3]=A;K=y-(+h[x>>3]-+h[u>>3])*.125;w=d+32|0;h[w>>3]=K;z=A+(+h[s>>3]-+h[t>>3])*.125;h[d+40>>3]=z;h[d+48>>3]=y;J=z+(+h[s>>3]-+h[t>>3])*.125;h[d+56>>3]=J;h[d+64>>3]=y;y=J+(+h[s>>3]-+h[t>>3])*.125;h[d+72>>3]=y;h[d+80>>3]=K;h[d+88>>3]=y;K=+h[B>>3];K=K+(+h[b>>3]-K)*.5;h[d+96>>3]=K;h[d+104>>3]=J;L=K-(+h[x>>3]-+h[u>>3])*.125;h[d+112>>3]=L;h[d+120>>3]=y;L=L-(+h[x>>3]-+h[u>>3])*.125;h[d+128>>3]=L;h[d+136>>3]=y;h[d+144>>3]=L;h[d+152>>3]=J;J=L+(+h[x>>3]-+h[u>>3])*.125;h[d+160>>3]=J;h[d+168>>3]=z;h[d+176>>3]=L;h[d+184>>3]=A;h[d+192>>3]=L;L=+h[E>>3];h[d+200>>3]=L;h[d+208>>3]=J;h[d+216>>3]=L;E=d+224|0;h[E>>3]=K;h[d+232>>3]=+h[v>>3];h[d+240>>3]=+h[w>>3];h[d+248>>3]=L;lS(a,d,m,f);c[F>>2]=c[E>>2];c[F+4>>2]=c[E+4>>2];c[F+8>>2]=c[E+8>>2];c[F+12>>2]=c[E+12>>2];E=F+16|0;h[E>>3]=+h[F>>3];L=+h[C>>3];f=F+24|0;h[f>>3]=L+(+h[D>>3]-L)*.5;oS(a,F,2);h[F>>3]=+h[B>>3];L=+h[C>>3];h[F+8>>3]=L+(+h[D>>3]-L)*.5;h[E>>3]=+h[b>>3];h[f>>3]=L+(+h[b+8>>3]-+h[b+56>>3])*.5;oS(a,F,2);l6(d);break}else{switch(e|0){case 352321536:break;default:break a}d=HK(j)|0;w=b+16|0;K=+h[w>>3];D=H+48|0;K=K+(+h[b>>3]-K)*.5+(+h[x>>3]-+h[D>>3])*.125;h[d>>3]=K;B=b+40|0;L=+h[B>>3];C=b+24|0;u=H+56|0;v=H+72|0;L=L+(+h[C>>3]-L)*.5+(+h[u>>3]-+h[v>>3])*.5;E=d+8|0;h[E>>3]=L;z=K+(+h[x>>3]-+h[D>>3])*.125;h[d+16>>3]=z;J=L+(+h[u>>3]-+h[v>>3])*.125;h[d+24>>3]=J;h[d+32>>3]=z;z=J+(+h[u>>3]-+h[v>>3])*.25;h[d+40>>3]=z;h[d+48>>3]=K;A=z+(+h[u>>3]-+h[v>>3])*.125;h[d+56>>3]=A;K=K-(+h[x>>3]-+h[D>>3])*.25;h[d+64>>3]=K;h[d+72>>3]=A;A=K-(+h[x>>3]-+h[D>>3])*.125;h[d+80>>3]=A;h[d+88>>3]=z;h[d+96>>3]=A;h[d+104>>3]=J;h[d+112>>3]=K;h[d+120>>3]=L;lS(a,d,g,f);L=+h[w>>3];L=L+(+h[b>>3]-L)*.5;h[F>>3]=L;D=F+8|0;h[D>>3]=+h[E>>3];E=F+16|0;h[E>>3]=L;L=+h[B>>3];f=F+24|0;h[f>>3]=L+(+h[C>>3]-L)*.5;oS(a,F,2);h[F>>3]=+h[w>>3];L=+h[B>>3];h[D>>3]=L+(+h[C>>3]-L)*.5;h[E>>3]=+h[b>>3];h[f>>3]=L+(+h[b+8>>3]-+h[b+56>>3])*.5;oS(a,F,2);l6(d);break}}if((e|0)<402653184)if((e|0)<385875968){switch(e|0){case 369098752:break;default:break a}d=HK(s)|0;F=H+48|0;h[d>>3]=+h[v>>3]-(+h[x>>3]-+h[F>>3])*.5;E=H+56|0;D=H+72|0;h[d+8>>3]=+h[H+24>>3]-(+h[E>>3]-+h[D>>3])*.5;h[d+16>>3]=+h[F>>3];L=+h[E>>3];h[d+24>>3]=L-(L-+h[D>>3])*.5;h[d+32>>3]=+h[b+32>>3];C=b+40|0;h[d+40>>3]=+h[C>>3];L=+h[x>>3];h[d+48>>3]=L+(L-+h[F>>3])*.5;h[d+56>>3]=+h[C>>3];L=+h[x>>3];h[d+64>>3]=L+(L-+h[F>>3])*.5;h[d+72>>3]=+h[C>>3]+(+h[E>>3]-+h[D>>3])*.5;h[d+80>>3]=+h[v>>3]-(+h[x>>3]-+h[F>>3])*.5;h[d+88>>3]=+h[C>>3]+(+h[E>>3]-+h[D>>3])*.5;h[d+96>>3]=+h[v>>3]-(+h[x>>3]-+h[F>>3])*.5;D=b+56|0;h[d+104>>3]=+h[D>>3];E=b+8|0;L=+h[E>>3];h[d+120>>3]=L-(L-+h[D>>3])*.5;h[d+112>>3]=+h[b>>3];h[d+136>>3]=+h[E>>3];h[d+128>>3]=+h[v>>3]-(+h[x>>3]-+h[F>>3])*.5;lS(a,d,o,f);l6(d);break}else{switch(e|0){case 385875968:break;default:break a}d=HK(q)|0;F=H+48|0;h[d>>3]=+h[v>>3]-(+h[x>>3]-+h[F>>3])*.5;E=H+56|0;D=H+72|0;h[d+8>>3]=+h[H+24>>3]-(+h[E>>3]-+h[D>>3])*.5;h[d+16>>3]=+h[F>>3];L=+h[E>>3];h[d+24>>3]=L-(L-+h[D>>3])*.5;h[d+32>>3]=+h[b+32>>3];C=b+40|0;h[d+40>>3]=+h[C>>3]+(+h[E>>3]-+h[D>>3])*.5;h[d+48>>3]=+h[v>>3]-(+h[x>>3]-+h[F>>3])*.5;h[d+56>>3]=+h[C>>3]+(+h[E>>3]-+h[D>>3])*.5;h[d+64>>3]=+h[v>>3]-(+h[x>>3]-+h[F>>3])*.5;D=b+56|0;h[d+72>>3]=+h[D>>3];E=b+8|0;L=+h[E>>3];h[d+88>>3]=L-(L-+h[D>>3])*.5;h[d+80>>3]=+h[b>>3];h[d+104>>3]=+h[E>>3];h[d+96>>3]=+h[v>>3]-(+h[x>>3]-+h[F>>3])*.5;lS(a,d,t,f);l6(d);break}else if((e|0)<419430400){switch(e|0){case 402653184:break;default:break a}d=HK(q)|0;h[d>>3]=+h[b>>3];C=b+8|0;D=H+48|0;E=H+56|0;F=H+72|0;h[d+8>>3]=+h[C>>3]-(+h[E>>3]-+h[F>>3])*.5;L=+h[x>>3];h[d+16>>3]=L+(L-+h[D>>3])*.5;h[d+24>>3]=+h[C>>3]-(+h[E>>3]-+h[F>>3])*.5;L=+h[x>>3];h[d+32>>3]=L+(L-+h[D>>3])*.5;h[d+40>>3]=+h[H+40>>3];h[d+48>>3]=+h[b+16>>3];L=+h[b+24>>3];C=b+40|0;h[d+56>>3]=L-(L-+h[C>>3])*.5;L=+h[x>>3];h[d+64>>3]=L+(L-+h[D>>3])*.5;h[d+72>>3]=+h[C>>3];h[d+88>>3]=+h[C>>3]+(+h[E>>3]-+h[F>>3])*.5;L=+h[x>>3];h[d+80>>3]=L+(L-+h[D>>3])*.5;h[d+104>>3]=+h[b+56>>3]+(+h[E>>3]-+h[F>>3])*.5;h[d+96>>3]=+h[b>>3];lS(a,d,t,f);l6(d);break}else{switch(e|0){case 419430400:break;default:break a}d=HK(s)|0;h[d>>3]=+h[b>>3];F=b+8|0;E=H+48|0;C=H+56|0;D=H+72|0;h[d+8>>3]=+h[F>>3]-(+h[C>>3]-+h[D>>3])*.5;L=+h[x>>3];h[d+16>>3]=L+(L-+h[E>>3])*.5;h[d+24>>3]=+h[F>>3]-(+h[C>>3]-+h[D>>3])*.5;L=+h[x>>3];h[d+32>>3]=L+(L-+h[E>>3])*.5;h[d+40>>3]=+h[H+40>>3];h[d+48>>3]=+h[b+16>>3];L=+h[b+24>>3];F=b+40|0;h[d+56>>3]=L-(L-+h[F>>3])*.5;L=+h[x>>3];h[d+64>>3]=L+(L-+h[E>>3])*.5;h[d+72>>3]=+h[F>>3];h[d+88>>3]=+h[F>>3]+(+h[C>>3]-+h[D>>3])*.5;L=+h[x>>3];h[d+80>>3]=L+(L-+h[E>>3])*.5;F=b+56|0;h[d+104>>3]=+h[F>>3]+(+h[C>>3]-+h[D>>3])*.5;h[d+96>>3]=+h[v>>3]-(+h[x>>3]-+h[E>>3])*.5;h[d+112>>3]=+h[v>>3]-(+h[x>>3]-+h[E>>3])*.5;h[d+120>>3]=+h[F>>3];h[d+128>>3]=+h[b+48>>3];h[d+136>>3]=+h[F>>3];lS(a,d,o,f);l6(d);break}}while(0);l6(H)}l=I;return}function SM(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0.0;f=l;l=l+112|0;g=f;k=+h[b+8>>3];k=k+k;c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];h[g+16>>3]=+h[b+16>>3];h[g+24>>3]=k-+h[b+24>>3];h[g+32>>3]=+h[b+32>>3];h[g+40>>3]=k-+h[b+40>>3];h[g+48>>3]=+h[b+48>>3];h[g+56>>3]=k-+h[b+56>>3];h[g+64>>3]=+h[b+64>>3];h[g+72>>3]=k-+h[b+72>>3];h[g+80>>3]=+h[b+80>>3];h[g+88>>3]=k-+h[b+88>>3];i=g+96|0;j=b+96|0;c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];nS(a,b,d,0,0,e&255);nS(a,g,7,0,0,0);l=f;return}function TM(a,b,c,d){a=a|0;b=+b;c=c|0;d=d|0;var e=0.0,f=0.0;f=+h[c>>3];e=+h[c+8>>3];e=e+(+h[d+8>>3]-e)*b;h[a>>3]=f+(+h[d>>3]-f)*b;h[a+8>>3]=e;return}function UM(a){a=a|0;a=c[(c[a+16>>2]|0)+8>>2]|0;if(a){a=c[c[a+4>>2]>>2]|0;if((a|0)!=91)if((a|0)==94)a=2;else return ((a|0)==93?3:(a|0)==96?4:0)|0;else a=1}else a=0;return a|0}function VM(b){b=b|0;var d=0.0,e=0,f=0.0,g=0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0.0,z=0.0,A=0,B=0,C=0,D=0,E=0,H=0,K=0,L=0,M=0,N=0,P=0,Q=0.0,R=0.0,T=0,U=0,V=0.0,W=0.0,X=0.0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0.0;ca=l;l=l+144|0;K=ca+112|0;N=ca+104|0;D=ca+96|0;E=ca+88|0;j=ca+80|0;$=ca+64|0;aa=ca+48|0;T=ca+40|0;U=ca+32|0;o=ca+24|0;x=ca+16|0;B=ca+136|0;A=ca+128|0;L=ca;ba=HK(48)|0;Z=b+16|0;P=c[(c[(c[Z>>2]|0)+8>>2]|0)+8>>2]|0;i=(P|0)==1664;_=c[P>>2]|0;e=c[P+4>>2]|0;g=c[P+8>>2]|0;f=+h[P+16>>3];k=+h[P+32>>3];m=+h[P+24>>3];_=(bP(NA(b,105812)|0)|0)&255|_;P=(_|0)!=0;do if(!i){if(!P){Y=c[Z>>2]|0;d=+h[Y+32>>3]*72.0;r=+h[Y+40>>3]*72.0;r=+(~~(r+(r>=0.0?.5:-.5))|0);d=+(~~(d+(d>=0.0?.5:-.5))|0);break}d=+dN(b);if(d>0.0)r=d;else{Y=c[Z>>2]|0;r=+h[Y+32>>3];d=+h[Y+40>>3];d=(r=0.0?.5:-.5))|0);r=d}}else{r=0.0;d=0.0}while(0);Y=XO(b,c[47222]|0,e,0)|0;X=f+ +YO(b,c[47224]|0,0.0,-360.0);if(!g){W=+YO(b,c[47225]|0,0.0,-100.0);H=XO(b,c[47221]|0,4,0)|0;V=+YO(b,c[47226]|0,0.0,-100.0)}else{H=g;W=k;V=m}e=c[(c[Z>>2]|0)+104>>2]|0;C=e+24|0;c[$>>2]=c[C>>2];c[$+4>>2]=c[C+4>>2];c[$+8>>2]=c[C+8>>2];c[$+12>>2]=c[C+12>>2];n=+h[$>>3];C=$+8|0;if(n>0.0)if(i)k=n;else M=11;else if(i|!(+h[C>>3]>0.0))k=n;else M=11;if((M|0)==11){e=NA(b,105797)|0;f=n+16.0;do if(e){h[x>>3]=0.0;h[o>>3]=0.0;c[j>>2]=o;c[j+4>>2]=x;e=q4(e,105804,j)|0;k=+h[o>>3];if(k<0.0){h[o>>3]=0.0;k=0.0}m=+h[x>>3];if(m<0.0){h[x>>3]=0.0;m=0.0}if((e|0)<=0){h[$>>3]=f;k=8.0;break}k=k*72.0;k=+(~~(k+(k>=0.0?.5:-.5))<<1|0);f=n+k;h[$>>3]=f;if((e|0)!=1){k=m*72.0;k=+(~~(k+(k>=0.0?.5:-.5))<<1|0)}}else{h[$>>3]=f;k=8.0}while(0);h[C>>3]=k+ +h[C>>3];e=c[(c[Z>>2]|0)+104>>2]|0;k=f}q=k-+h[e+24>>3];f=+h[c[(c[(uC(b)|0)+16>>2]|0)+8>>2]>>3];if(f>0.0){Q=f*72.0;Q=+(~~(Q+(Q>=0.0?.5:-.5))|0);R=+eN(k,Q);h[$>>3]=R;h[C>>3]=+eN(+h[C>>3],Q)}else R=k;e=c[(c[Z>>2]|0)+8>>2]|0;do if(!(a[e+12>>0]|0)){g=NA(b,109326)|0;if((g|0)!=0?(a[g>>0]|0)!=0:0){PF(A,uC(b)|0,g);e=c[A>>2]|0;i=c[A+4>>2]|0;if((i&e|0)==-1){e=HB(b)|0;c[D>>2]=g;c[D+4>>2]=e;dA(0,105888,D)|0;g=0;e=0;break}else{a[(c[(uC(b)|0)+16>>2]|0)+114>>0]=1;g=e+2|0;e=i+2|0;break}}else{g=0;e=0}}else{e=c[e>>2]|0;if((a[e>>0]|0)==99?(f2(e,105820)|0)==0:0){g=NA(b,105827)|0;PF(B,uC(b)|0,g);e=c[B>>2]|0;i=c[B+4>>2]|0;if((i&e|0)==-1){e=HB(b)|0;c[E>>2]=g|0?g:105837;c[E+4>>2]=e;dA(0,105843,E)|0;g=0;e=0;break}else{a[(c[(uC(b)|0)+16>>2]|0)+114>>0]=1;g=e+2|0;e=i+2|0;break}}else{g=0;e=0}}while(0);Q=+(g|0);h[aa>>3]=R>Q?R:Q;Q=+h[C>>3];p=+(e|0);A=aa+8|0;h[A>>3]=Q>p?Q:p;e=(H|0)<3&(V!=0.0|W!=0.0)?120:H;g=NA(b,105929)|0;if(!g)i=99;else{i=a[g>>0]|0;i=i<<24>>24==116?116:i<<24>>24==98?98:99}g=c[Z>>2]|0;a[(c[g+104>>2]|0)+80>>0]=i;if((e|0)==4)if((V==0.0?((~~(X+(X>=0.0?.5:-.5))|0)%90|0|0)==0:0)&W==0.0){n=4.0;o=1}else{n=4.0;M=40}else{n=+(e|0);M=40}do if((M|0)==40){g=c[(c[(c[g+8>>2]|0)+8>>2]|0)+44>>2]|0;if(g|0){o=c[g>>2]|0;c[K>>2]=c[aa>>2];c[K+4>>2]=c[aa+4>>2];c[K+8>>2]=c[aa+8>>2];c[K+12>>2]=c[aa+12>>2];lb[o&63](L,K);c[aa>>2]=c[L>>2];c[aa+4>>2]=c[L+4>>2];c[aa+8>>2]=c[L+8>>2];c[aa+12>>2]=c[L+12>>2];o=0;break}f=+h[A>>3];k=f*1.4142135623730951;if(r>k&i<<24>>24==99){m=f/r;m=+G(+(1.0/(1.0-m*m)));m=m*+h[aa>>3];h[aa>>3]=m}else{m=+h[aa>>3]*1.4142135623730951;h[aa>>3]=m;h[A>>3]=k;f=k}if((e|0)>2){z=+I(+(3.141592653589793/n));h[aa>>3]=m/z;h[A>>3]=f/z;o=0}else o=0}while(0);k=+h[A>>3];g=_O(b,c[47227]|0,137609)|0;x=ba+40|0;if((a[g>>0]|0)==115?(f2(g,108531)|0)==0:0){h[aa>>3]=d;h[A>>3]=r;c[x>>2]=c[x>>2]|2048;f=r}else{if(!((bP(g)|0)<<24>>24)){f=+h[aa>>3];d=d>f?d:f;h[aa>>3]=d;f=+h[A>>3];f=r>f?r:f}else{M=c[(c[Z>>2]|0)+104>>2]|0;if(!(!(d<+h[M+24>>3])?!(r<+h[M+32>>3]):0)){L=HB(b)|0;M=HB(uC(b)|0)|0;c[N>>2]=L;c[N+4>>2]=M;dA(0,105938,N)|0}h[aa>>3]=d;f=r}h[A>>3]=f}if(P){y=d>f?d:f;h[A>>3]=y;h[aa>>3]=y;z=y}else{z=f;y=d}d=R-q;do if(!((bP(_O(b,c[47218]|0,137609)|0)|0)<<24>>24)){if(o){d=+h[(R>+h[aa>>3]?$:aa)>>3]-q;break}f=+h[A>>3];if(Q>3]*+G(+(1.0-Q*Q/(f*f)));d=(R>d?R:d)-q}}while(0);g=c[(c[Z>>2]|0)+104>>2]|0;h[g+40>>3]=d;if(!(c[x>>2]&2048)){w=+h[A>>3]-k;h[g+48>>3]=Q+(Q1;g=j?Y:1;a:do if((e|0)<3){g=HK(g<<5)|0;f=+h[aa>>3]*.5;d=+h[A>>3]*.5;h[g>>3]=-f;h[g+8>>3]=-d;h[g+16>>3]=f;h[g+24>>3]=d;if(j){e=1;i=2;while(1){if((e|0)==(Y|0))break;y=f+4.0;z=d+4.0;h[g+(i<<4)>>3]=-y;h[g+(i<<4)+8>>3]=-z;U=i|1;h[g+(U<<4)>>3]=y;h[g+(U<<4)+8>>3]=z;e=e+1|0;i=i+2|0;f=y;d=z}h[aa>>3]=f*2.0;h[A>>3]=d*2.0;e=2}else e=2}else{g=HK(S(g<<4,e)|0)|0;i=c[(c[(c[(c[Z>>2]|0)+8>>2]|0)+8>>2]|0)+44>>2]|0;b:do if(!i){p=6.283185307179586/n;s=p*.5;q=+J(+s);r=+c2(+F(+V)+ +F(+W),1.0);s=V*1.4142135623730951/+I(+s);t=W*.5;k=(p+-3.141592653589793)*.5;X3(k,T,U);u=X/180.0*3.141592653589793;f=0.0;d=0.0;k=k+(3.141592653589793-p)*.5;i=0;m=+h[U>>3]*.5;n=+h[T>>3]*.5;while(1){if((i|0)>=(e|0))break b;k=p+k;X3(k,T,U);m=m+q*+h[U>>3];n=n+q*+h[T>>3];w=t*n+m*(r+s*n);X3(u+ +O(+n,+w),T,U);w=+c2(w,n);v=w*+h[U>>3]*+h[aa>>3];w=w*+h[T>>3]*+h[A>>3];da=+F(+v);d=da>d?da:d;da=+F(+w);f=da>f?da:f;h[g+(i<<4)>>3]=v;h[g+(i<<4)+8>>3]=w;if(o)break;else i=i+1|0}da=-v;h[g+16>>3]=da;h[g+24>>3]=w;h[g+32>>3]=da;da=-w;h[g+40>>3]=da;h[g+48>>3]=v;h[g+56>>3]=da}else{lb[c[i+4>>2]&63](g,aa);f=+h[A>>3]*.5;d=+h[aa>>3]*.5}while(0);d=d*2.0;f=f*2.0;y=y>d?y:d;h[aa>>3]=y;da=z>f?z:f;h[A>>3]=da;d=y/d;f=da/f;i=0;while(1){if((i|0)>=(e|0))break;P=g+(i<<4)|0;b=g+(i<<4)+8|0;da=f*+h[b>>3];h[P>>3]=d*+h[P>>3];h[b>>3]=da;i=i+1|0}if(j){j=e+-1|0;f=+h[g>>3];k=+h[g+8>>3];d=+O(+(k-+h[g+(j<<4)+8>>3]),+(f-+h[g+(j<<4)>>3]));j=0;c:while(1){if((j|0)>=(e|0))break;o=j+1|0;i=(o|0)%(e|0)|0;m=+h[g+(i<<4)>>3];n=+h[g+(i<<4)+8>>3];p=+O(+(n-k),+(m-f));z=(d+3.141592653589793-p)*.5;da=4.0/+J(+z);X3(d-z,T,U);h[T>>3]=da*+h[T>>3];h[U>>3]=da*+h[U>>3];i=1;d=k;while(1){if((i|0)==(Y|0)){d=p;j=o;f=m;k=n;continue c}z=f+ +h[U>>3];da=d+ +h[T>>3];b=(S(i,e)|0)+j|0;h[g+(b<<4)>>3]=z;h[g+(b<<4)+8>>3]=da;i=i+1|0;f=z;d=da}}j=S(e,Y+-1|0)|0;i=0;while(1){if((i|0)>=(e|0))break a;U=i+j|0;z=+h[g+(U<<4)+8>>3];y=+F(+(+h[g+(U<<4)>>3]))*2.0;da=+h[aa>>3];h[aa>>3]=y>da?y:da;z=+F(+z)*2.0;da=+h[A>>3];h[A>>3]=z>da?z:da;i=i+1|0}}}while(0);c[ba>>2]=_;c[ba+4>>2]=Y;c[ba+8>>2]=e;h[ba+16>>3]=X;h[ba+32>>3]=W;h[ba+24>>3]=V;c[ba+44>>2]=g;g=c[Z>>2]|0;f=+h[aa>>3];d=+h[A>>3];e=g+32|0;if(!(c[x>>2]&2048))h[e>>3]=f/72.0;else{h[e>>3]=+h[(R>f?$:aa)>>3]/72.0;d=+h[(Q>d?$:aa)+8>>3]}h[g+40>>3]=d/72.0;c[g+12>>2]=ba;l=ca;return}function WM(a){a=a|0;var b=0,d=0,e=0,f=0,g=0.0,i=0.0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+64|0;j=o+40|0;e=o+32|0;k=o+16|0;n=o;d=(c[(c[(uC(a)|0)+16>>2]|0)+116>>2]|0)>>>2&1^1;m=a+16|0;f=c[c[(c[m>>2]|0)+104>>2]>>2]|0;c[47352]=f;f=D3(f)|0;f=HK(((f|0)>1?f:1)+1|0)|0;b=YM(a,d,1,f)|0;if(!b){c[e>>2]=c[c[(c[m>>2]|0)+104>>2]>>2];dA(1,105773,e)|0;c[47352]=105794;b=YM(a,d,1,f)|0}l6(f);ZM(j,a,b);d=c[m>>2]|0;i=+h[d+32>>3]*72.0;i=+(~~(i+(i>=0.0?.5:-.5))|0);h[n>>3]=i;g=+h[d+40>>3]*72.0;g=+(~~(g+(g>=0.0?.5:-.5))|0);d=n+8|0;h[d>>3]=g;if(!((bP(_O(a,c[47227]|0,137609)|0)|0)<<24>>24)){i=+h[(+h[b>>3]>i?b:n)>>3];h[n>>3]=i;e=b+8|0;g=+h[(+h[e>>3]>g?b:n)+8>>3];h[d>>3]=g;d=e;e=b}else{d=b+8|0;e=b}a=(bP(_O(a,c[47218]|0,137609)|0)|0)&255;c[j>>2]=c[n>>2];c[j+4>>2]=c[n+4>>2];c[j+8>>2]=c[n+8>>2];c[j+12>>2]=c[n+12>>2];_M(b,j,a);$M(k,i*-.5,g*.5);c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];aN(b,j,15);n=c[m>>2]|0;h[n+32>>3]=+h[e>>3]/72.0;h[n+40>>3]=(+h[d>>3]+1.0)/72.0;c[n+12>>2]=b;l=o;return}function XM(a){a=a|0;var b=0.0,d=0,e=0.0,f=0.0,g=0,i=0,j=0,k=0,l=0.0,m=0;j=HK(48)|0;k=a+16|0;g=c[(c[(c[(c[k>>2]|0)+8>>2]|0)+8>>2]|0)+4>>2]|0;b=+YO(a,c[47200]|0,1797693134862315708145274.0e284,0.0);f=+YO(a,c[47199]|0,1797693134862315708145274.0e284,0.0);b=b>2]|0;b=f==1797693134862315708145274.0e284&b==1797693134862315708145274.0e284?.05:b>0.0?(b>.0003?b:.0003):b;h[i+40>>3]=b;h[i+32>>3]=b;b=b*72.0;g=XO(a,c[47222]|0,g,0)|0;i=HK((g|0)<1?32:g<<5)|0;f=b*.5;e=-f;h[i>>3]=e;h[i+8>>3]=e;h[i+16>>3]=f;h[i+24>>3]=f;if((g|0)>1){a=1;d=2;e=f;b=f;while(1){if((a|0)==(g|0))break;l=e+4.0;f=b+4.0;h[i+(d<<4)>>3]=-l;h[i+(d<<4)+8>>3]=-f;m=d|1;h[i+(m<<4)>>3]=l;h[i+(m<<4)+8>>3]=f;a=a+1|0;d=d+2|0;e=l;b=f}b=e*2.0}c[j>>2]=1;c[j+4>>2]=g;c[j+8>>2]=2;m=j+16|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;c[m+20>>2]=0;c[j+44>>2]=i;l=b/72.0;m=c[k>>2]|0;h[m+32>>3]=l;h[m+40>>3]=l;c[m+12>>2]=j;return}function YM(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;g=HK(72)|0;n=c[(c[b+16>>2]|0)+104>>2]|0;m=0;i=1;j=c[47352]|0;a:while(1){k=a[j>>0]|0;switch(k<<24>>24){case 0:break a;case 92:{j=j+1|0;k=a[j>>0]|0;switch(k<<24>>24){case 124:case 125:case 123:case 92:{l=m;break}default:E=4}break}default:E=4}if((E|0)==4){E=0;switch(k<<24>>24){case 123:{l=m+1|0;break}case 125:{l=m+-1|0;break}default:{l=m;i=((m|0)==0&k<<24>>24==124&1)+i|0}}if((l|0)<0)break}m=l;j=j+1|0}C=g+56|0;c[C>>2]=HK(i<<2)|0;a[g+64>>0]=d;z=(d|0)==0&1;A=f+1|0;B=n+82|0;y=(e|0)==0;w=n+16|0;x=n+4|0;v=n+8|0;l=0;m=0;d=0;u=0;k=0;e=0;n=f;i=0;j=0;b:while(1){p=l;l=0;c:while(1){r=n;d:while(1){t=e;e:while(1){s=i;f:while(1){q=m;o=k;g:while(1){while(1){if(u){E=79;break b}i=c[47352]|0;k=a[i>>0]|0;e=i+1|0;if((k+-1&255)>=31)break;c[47352]=e}switch(k<<24>>24|0){case 92:{E=52;break d}case 0:case 124:case 125:break e;case 60:break f;case 62:break g;case 123:break;default:{E=56;break d}}c[47352]=e;if(o|0){E=32;break b}if(!(a[e>>0]|0)){E=32;break b}o=YM(b,z,0,f)|0;c[(c[C>>2]|0)+(q<<2)>>2]=o;if(!o){E=34;break b}else{q=q+1|0;o=4}}n=s+-1|0;if(a[B>>0]|0){k=o;break d}if(!(o&16)){E=26;break b}if(s>>>0<=A>>>0|(n|0)==(t|0))i=s;else i=(a[n>>0]|0)==32?n:s;a[i>>0]=0;l=Y3(f)|0;c[47352]=(c[47352]|0)+1;m=q;k=o&-17;s=i}if(o&6|0){E=21;break b}if(a[B>>0]|0){E=57;break d}c[47352]=e;m=q;k=o|18;t=f;i=f}if((o&16|0)!=0|y&k<<24>>24==0){E=36;break b}if(!(o&4)){e=HK(72)|0;c[(c[C>>2]|0)+(q<<2)>>2]=e;m=q+1|0}else{e=p;m=q}if(l|0)c[e+60>>2]=l;if(!(o&5)){a[f+j>>0]=32;o=o|1;j=j+1|0}i=f+j|0;if(!(o&1))n=r;else{if((j|0)>1?(D=i+-1|0,(D|0)!=(r|0)):0)i=(a[D>>0]|0)==32?D:i;a[i>>0]=0;n=Y3(f)|0;c[e+52>>2]=xK(b,n,a[B>>0]|0?2:0,+h[w>>3],c[x>>2]|0,c[v>>2]|0)|0;a[e+64>>0]=1;n=f;j=0}i=c[47352]|0;k=a[i>>0]|0;if(!(k<<24>>24)){l=e;u=1;k=o;e=t;i=s;continue b}c[47352]=i+1;if(k<<24>>24==125){E=51;break b}else{p=e;k=0;l=0;e=t;r=n;i=s}}h:do if((E|0)==52){E=0;k=f+j|0;n=s+-1|0;m=j+1|0;switch(a[e>>0]|0){case 0:{k=o;break h}case 62:case 60:case 124:case 125:case 123:{i=d;k=o;break}case 32:{if(!(a[B>>0]|0)){i=1;k=o}else E=54;break}default:E=54}if((E|0)==54){E=0;a[k>>0]=92;i=d;k=o|9;j=m}c[47352]=e;d=i;i=e}else if((E|0)==56){E=0;k=o;n=s+-1|0}else if((E|0)==57){E=0;k=o;n=s+-1|0}while(0);e=f+j|0;if(k&4|0?(a[i>>0]|0)!=32:0){E=60;break b}if(!(k&24))k=(a[i>>0]|0)==32?k:k|9;o=(d|0)!=0;if(!(k&8))if(!(k&16)){e=t;n=r;o=s}else{m=a[i>>0]|0;if(!(o|m<<24>>24!=32))if((s|0)!=(f|0))if((a[n>>0]|0)==32)m=s;else E=74;else m=f;else E=74;if((E|0)==74){E=0;a[s>>0]=m;m=s+1|0;i=c[47352]|0}e=o?m+-1|0:t;n=r;o=m}else{m=a[i>>0]|0;if(!((!(o|m<<24>>24!=32)?(a[e+-1>>0]|0)==32:0)?(a[B>>0]|0)==0:0)){a[e>>0]=m;j=j+1|0}if(o){e=t;n=f+j+-1|0;o=s}else{e=t;n=r;o=s}}i=i+1|0;c[47352]=i;while(1){if((a[i>>0]|0)>=0){m=q;i=o;continue c}t=i+1|0;c[47352]=t;a[f+j>>0]=a[i>>0]|0;j=j+1|0;i=t}}}if((E|0)==21){bN(g,l);g=0}else if((E|0)==26){bN(g,l);g=0}else if((E|0)==32){bN(g,l);g=0}else if((E|0)==34){bN(g,l);g=0}else if((E|0)==36){bN(g,l);g=0}else if((E|0)==51)c[g+48>>2]=m;else if((E|0)==60){bN(g,l);g=0}else if((E|0)==79)c[g+48>>2]=q;return g|0}function ZM(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0,k=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+64|0;n=v+48|0;k=v+40|0;p=v+32|0;u=v+16|0;s=v;j=c[e+52>>2]|0;t=u+8|0;a:do if(!j){o=e+48|0;p=e+56|0;q=e+64|0;r=s+8|0;c[u>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;c[u+12>>2]=0;n=0;while(1){if((n|0)>=(c[o>>2]|0))break a;ZM(s,d,c[(c[p>>2]|0)+(n<<2)>>2]|0);f=+h[t>>3];g=+h[u>>3];i=+h[s>>3];m=+h[r>>3];if(!(a[q>>0]|0)){h[t>>3]=f+m;j=g>i?u:s;k=u}else{h[u>>3]=g+i;j=(f>m?u:s)+8|0;k=t}h[k>>3]=+h[j>>3];n=n+1|0}}else{g=+h[j+24>>3];f=+h[j+32>>3];if(g>0.0|f>0.0){j=NA(d,105797)|0;m=g+16.0;if((j|0)!=0?(c[n>>2]=k,c[n+4>>2]=p,o=q4(j,105804,n)|0,(o|0)>0):0){i=+h[k>>3]*72.0;i=+(~~(i+(i>=0.0?.5:-.5))<<1|0);g=g+i;if((o|0)!=1){i=+h[p>>3]*72.0;i=+(~~(i+(i>=0.0?.5:-.5))<<1|0)}}else{i=8.0;g=m}f=f+i}h[u>>3]=g;h[t>>3]=f}while(0);c[e>>2]=c[u>>2];c[e+4>>2]=c[u+4>>2];c[e+8>>2]=c[u+8>>2];c[e+12>>2]=c[u+12>>2];c[b>>2]=c[u>>2];c[b+4>>2]=c[u+4>>2];c[b+8>>2]=c[u+8>>2];c[b+12>>2]=c[u+12>>2];l=v;return}function _M(b,d,e){b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0;r=l;l=l+32|0;n=r+16|0;o=r;p=+h[d>>3];g=p-+h[b>>3];q=+h[d+8>>3];f=q-+h[b+8>>3];c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];d=c[b+52>>2]|0;if(!((e|0)!=0|(d|0)==0)){m=d+40|0;h[m>>3]=g+ +h[m>>3];m=d+48|0;h[m>>3]=f+ +h[m>>3]}k=b+48|0;d=c[k>>2]|0;a:do if(d|0){m=b+64|0;g=((a[m>>0]|0)==0?f:g)/+(d|0);j=b+56|0;i=0;while(1){if((i|0)>=(d|0))break a;d=c[(c[j>>2]|0)+(i<<2)>>2]|0;b=i+1|0;f=+(~~(g*+(b|0))-~~(g*+(i|0))|0);if(!(a[m>>0]|0))$M(o,p,f+ +h[d+8>>3]);else $M(o,f+ +h[d>>3],q);c[n>>2]=c[o>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];c[n+12>>2]=c[o+12>>2];_M(d,n,e);i=b;d=c[k>>2]|0}}while(0);l=r;return}function $M(a,b,c){a=a|0;b=+b;c=+c;h[a>>3]=b;h[a+8>>3]=c;return}function aN(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0;q=l;l=l+48|0;j=q+32|0;n=q+16|0;m=q;a[b+65>>0]=e;k=b+16|0;s=+h[d>>3];p=d+8|0;r=+h[p>>3];$M(n,s,r-+h[b+8>>3]);c[k>>2]=c[n>>2];c[k+4>>2]=c[n+4>>2];c[k+8>>2]=c[n+8>>2];c[k+12>>2]=c[n+12>>2];k=b+32|0;$M(m,s+ +h[b>>3],r);c[k>>2]=c[m>>2];c[k+4>>2]=c[m+4>>2];c[k+8>>2]=c[m+8>>2];c[k+12>>2]=c[m+12>>2];k=c[b+48>>2]|0;m=k+-1|0;n=(e|0)==0;o=b+64|0;i=b+56|0;g=0;while(1){if((g|0)>=(k|0))break;do if(!n){b=(g|0)==0;f=(g|0)==(m|0);if(!(a[o>>0]|0))if(b){b=f?15:14;break}else{b=f?11:10;break}else if(b){b=f?15:13;break}else{b=f?7:5;break}}else b=0;while(0);f=c[(c[i>>2]|0)+(g<<2)>>2]|0;c[j>>2]=c[d>>2];c[j+4>>2]=c[d+4>>2];c[j+8>>2]=c[d+8>>2];c[j+12>>2]=c[d+12>>2];aN(f,j,b&e);b=c[(c[i>>2]|0)+(g<<2)>>2]|0;if(!(a[o>>0]|0))h[p>>3]=+h[p>>3]-+h[b+8>>3];else h[d>>3]=+h[d>>3]+ +h[b>>3];g=g+1|0}l=q;return}function bN(a,b){a=a|0;b=b|0;cN(a);l6(b);return}function cN(a){a=a|0;var b=0,d=0,e=0;d=a+48|0;e=a+56|0;b=0;while(1){if((b|0)>=(c[d>>2]|0))break;cN(c[(c[e>>2]|0)+(b<<2)>>2]|0);b=b+1|0}l6(c[a+60>>2]|0);AK(c[a+52>>2]|0);l6(c[e>>2]|0);l6(a);return}function dN(a){a=a|0;var b=0.0,d=0.0;d=+YO(a,c[47200]|0,0.0,.01);b=+YO(a,c[47199]|0,0.0,.02);b=(d>b?d:b)*72.0;return +(+(~~(b+(b>=0.0?.5:-.5))|0))}function eN(a,b){a=+a;b=+b;var c=0;c=~~(a/b);return +(+((+(c|0)*b+1.0e-05>2]|0)+8>>2]|0;if(!a)a=0;else a=(c[c[a+4>>2]>>2]|0)==91&1;return a|0}function gN(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;f=c[47353]|0;a:do if(!f)d=0;else{g=c[47354]|0;e=0;while(1){if((e|0)>=(g|0)){d=0;break a}d=c[f+(e<<2)>>2]|0;h=c[d>>2]|0;if((a[h>>0]|0)==(a[b>>0]|0)?(f2(h,b)|0)==0:0)break a;e=e+1|0}}while(0);return d|0}function hN(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;do if(!(kP(NA(d,105827)|0)|0))d=b;else{if((a[b>>0]|0)==101?(f2(b,105986)|0)==0:0){d=b;break}d=105820}while(0);f=a[d>>0]|0;if(f<<24>>24==99?(f2(d,105820)|0)==0:0)g=11;else{b=20896;g=7}a:do if((g|0)==7)while(1){g=0;e=c[b>>2]|0;if(!e){g=11;break a}if((a[e>>0]|0)==f<<24>>24?(f2(e,d)|0)==0:0)break a;b=b+16|0;g=7}while(0);if((g|0)==11)b=iN(d)|0;return b|0}function iN(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;h=l;l=l+16|0;g=h;d=gN(b)|0;if(!d){f=c[47354]|0;e=f+1|0;c[47354]=e;d=c[47353]|0;e=e<<2;if(!d)d=IK(e)|0;else d=KK(d,e)|0;c[47353]=d;d=HK(16)|0;c[(c[47353]|0)+(f<<2)>>2]=d;c[d>>2]=c[5224];c[d+4>>2]=c[5225];c[d+8>>2]=c[5226];c[d+12>>2]=c[5227];e=Y3(b)|0;c[d>>2]=e;do if(!(c[47176]|0)){if((a[b>>0]|0)==99?(f2(b,105820)|0)==0:0){e=1;break}c[g>>2]=c[5224];c[g+4>>2]=e;dA(0,105991,g)|0;e=0}else e=1;while(0);a[d+12>>0]=e}l=h;return d|0}function jN(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+h[b>>3]/1.902113032590307;c=+h[b+8>>3]/1.1180339887498947;c=(d>c?d:c)*.9510565162951535*.8090169943749475/.29389262614623657;h[a>>3]=c*2.0*.9510565162951535;h[a+8>>3]=c*1.8090169943749475;return}function kN(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0,g=0.0,i=0.0,j=0.0,k=0,l=0.0,m=0;d=+h[b>>3];k=b+8|0;e=+h[k>>3];c=e/d;if(!(c>.9510565162951536))if(c<.9510565162951536){j=d;e=d*.9510565162951536}else j=d;else j=e/.9510565162951536;i=j/1.902113032590307;d=i*.9510565162951535*.30901699437494745/.7694208842938134;g=i*.19098300562505266*.5;c=.3141592653589793;f=0;while(1){if((f|0)>=10)break;h[a+(f<<4)>>3]=i*+I(+c);h[a+(f<<4)+8>>3]=i*+J(+c)-g;l=c+.6283185307179586;m=f|1;h[a+(m<<4)>>3]=d*+I(+l);h[a+(m<<4)+8>>3]=d*+J(+l)-g;c=l+.6283185307179586;f=f+2|0}h[b>>3]=j;h[k>>3]=e;return}function lN(a){a=a|0;a=c[(c[a+16>>2]|0)+12>>2]|0;if(a|0){l6(c[a+44>>2]|0);l6(a)}return}function mN(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+80|0;k=o+40|0;g=o;n=o+64|0;h=o+56|0;if(!(a[e>>0]|0)){g=4256;h=b+40|0;do{c[b>>2]=c[g>>2];b=b+4|0;g=g+4|0}while((b|0)<(h|0))}else{i=(f|0)==0?106657:f;c[n>>2]=15;j=d+16|0;f=c[j>>2]|0;do if(a[(c[f+104>>2]|0)+82>>0]|0){f=nU(d,e,n)|0;if(!f){f=c[j>>2]|0;m=8;break}if(AN(d,f,g,i,c[n>>2]|0,0)|0){c[k>>2]=HB(d)|0;c[k+4>>2]=e;c[k+8>>2]=i;dA(0,106659,k)|0}}else m=8;while(0);if((m|0)==8){if((c[(c[f+8>>2]|0)+8>>2]|0)==1712)h=0;else{c[h>>2]=d;c[h+4>>2]=0}if(AN(d,0,g,e,c[n>>2]|0,h)|0)BN(d,e)}c[g+36>>2]=0;h=b+40|0;do{c[b>>2]=c[g>>2];b=b+4|0;g=g+4|0}while((b|0)<(h|0))}l=o;return}function nN(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0,g=0,i=0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0;r=l;l=l+112|0;n=r+96|0;m=r+80|0;p=r+64|0;k=r+48|0;q=r+32|0;o=r+16|0;f=r;if(!a){c[47357]=0;a=0}else{g=c[a+4>>2]|0;a=c[a>>2]|0;i=(c[(c[(uC(a)|0)+16>>2]|0)+116>>2]&3)*90|0;c[n>>2]=c[b>>2];c[n+4>>2]=c[b+4>>2];c[n+8>>2]=c[b+8>>2];c[n+12>>2]=c[b+12>>2];kK(f,n,i);c[q>>2]=c[f>>2];c[q+4>>2]=c[f+4>>2];c[q+8>>2]=c[f+8>>2];c[q+12>>2]=c[f+12>>2];a:do if(g){d=+h[g+8>>3];e=+h[g+24>>3];s=+h[q>>3];if((+h[g>>3]<=s?s<=+h[g+16>>3]:0)?(j=+h[q+8>>3],d<=j):0)a=j<=e&1;else a=0}else{if((a|0)==(c[47357]|0)){f=c[47358]|0;g=c[47360]|0;i=c[47359]|0}else{g=c[(c[a+16>>2]|0)+12>>2]|0;c[47361]=g;i=c[g+44>>2]|0;c[47359]=i;f=c[g+8>>2]|0;c[47358]=f;g=S((c[g+4>>2]|0)+-1|0,f)|0;g=(g|0)>0?g:0;c[47360]=g;c[47357]=a}a=0;b=0;while(1){if((a|0)>=(f|0)){a=1;break a}t=i+(g+a<<4)|0;c[o>>2]=c[t>>2];c[o+4>>2]=c[t+4>>2];c[o+8>>2]=c[t+8>>2];c[o+12>>2]=c[t+12>>2];t=i+(((a+4|0)%(f|0)|0)+g<<4)|0;c[k>>2]=c[q>>2];c[k+4>>2]=c[q+4>>2];c[k+8>>2]=c[q+8>>2];c[k+12>>2]=c[q+12>>2];c[p>>2]=c[46656];c[p+4>>2]=c[46657];c[p+8>>2]=c[46658];c[p+12>>2]=c[46659];c[m>>2]=c[o>>2];c[m+4>>2]=c[o+4>>2];c[m+8>>2]=c[o+8>>2];c[m+12>>2]=c[o+12>>2];c[n>>2]=c[t>>2];c[n+4>>2]=c[t+4>>2];c[n+8>>2]=c[t+8>>2];c[n+12>>2]=c[t+12>>2];b=((zN(k,p,m,n)|0)==0&1)+b|0;if((b|0)==2){a=0;break}else a=a+2|0}}while(0)}l=r;return a|0}function oN(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;e=c[b+16>>2]|0;if((a[(c[e+104>>2]|0)+82>>0]|0)!=0?(a[e+145>>0]|0)!=0:0)b=qU(b,d,0,f,g)|0;else b=0;return b|0}function pN(e,f){e=e|0;f=f|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0.0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0;V=l;l=l+48|0;R=V+24|0;Q=V+16|0;N=V+8|0;M=V;T=V+32|0;q=V+28|0;n=c[e+16>>2]|0;U=n+208|0;o=c[U>>2]|0;if(!o){i=e+152|0;j=n+228|0;k=n+212|0;m=n+244|0;if(!(b[n+260>>1]&1)){O=i;J=0}else P=4}else{i=e+152|0;j=n+228|0;m=n+244|0;k=n+212|0;P=4}if((P|0)==4)if(!(c[i>>2]&4)){aS(e,o,c[j>>2]|0,c[m>>2]|0,c[k>>2]|0);O=i;J=1}else{O=i;J=1}K=f+16|0;i=c[K>>2]|0;y=c[i+12>>2]|0;I=c[y+44>>2]|0;L=c[y+8>>2]|0;y=c[y+4>>2]|0;if((c[47355]|0)<(L|0)){n=L+5|0;c[47355]=n;i=c[47356]|0;n=n<<4;if(!i)i=IK(n)|0;else i=KK(i,n)|0;c[47356]=i;i=c[K>>2]|0}H=(c[i+104>>2]|0)+56|0;i=i+16|0;c[H>>2]=c[i>>2];c[H+4>>2]=c[i+4>>2];c[H+8>>2]=c[i+8>>2];c[H+12>>2]=c[i+12>>2];H=c[K>>2]|0;F=+h[H+32>>3]*72.0;F=(+h[H+88>>3]+ +h[H+96>>3])/+(~~(F+(F>=0.0?.5:-.5))|0);G=+h[H+40>>3]*72.0;G=+h[H+80>>3]/+(~~(G+(G>=0.0?.5:-.5))|0);H=qN(e,f)|0;c[T>>2]=0;i=d[(c[K>>2]|0)+117>>0]|0;do if(!(i&1)){if(i&2|0){B=$O(f,c[47206]|0,106557)|0;fS(e,B);hS(e,$O(f,c[47207]|0,106565)|0);n=0;i=1;break}if(i&8|0){B=$O(f,c[47210]|0,106573)|0;fS(e,B);hS(e,$O(f,c[47211]|0,106581)|0);n=0;i=1;break}if(i&4|0){B=$O(f,c[47208]|0,106589)|0;fS(e,B);hS(e,$O(f,c[47209]|0,106597)|0);n=0;i=1;break}if(!(H&1))if(!(H&576)){n=0;i=0}else{n=rN(f)|0;i=1}else{n=rN(f)|0;if(!((HJ(n,T,q)|0)<<24>>24)){hS(e,n);i=1}else{hS(e,c[T>>2]|0);i=c[T+4>>2]|0;o=XO(f,c[47235]|0,0,0)|0;p=+g[q>>2];if(!i)iS(e,137615,o,p);else iS(e,i,o,p);i=(H&2)>>>1|2}}B=sN(e,f)|0}else{B=$O(f,c[47204]|0,106541)|0;fS(e,B);hS(e,$O(f,c[47205]|0,106549)|0);n=0;i=1}while(0);o=c[(c[K>>2]|0)+8>>2]|0;if(a[o+12>>0]|0){o=c[o>>2]|0;if((a[o>>0]|0)==99){o=(f2(o,105820)|0)==0;P=33}else o=1}else{o=1;P=33}if((P|0)==33){o=o^1;if(!((y|0)!=0|i<<24>>24==0|o)){fS(e,137680);y=1;o=0}}C=(L|0)<3;D=(H&64|0)!=0;v=(H&512|0)!=0;E=(H&8|0)==0;w=(H&1024|0)==0;x=(H&2130706444|0)==0;u=0;while(1){r=(u|0)==0;z=i&255;A=v&r;if((u|0)>=(y|0))break;s=S(u,L)|0;t=c[47356]|0;q=0;while(1){if((q|0)>=(L|0))break;X=q+s|0;p=+h[I+(X<<4)+8>>3];W=c[K>>2]|0;h[t+(q<<4)>>3]=F*+h[I+(X<<4)>>3]+ +h[W+16>>3];h[t+(q<<4)+8>>3]=G*p+ +h[W+24>>3];q=q+1|0}do if(C){if(A?(F3(n,58)|0)!=0:0)if((dI(e,t,n)|0)>1){c[M>>2]=HB(f)|0;dA(3,106605,M)|0;i=0}else i=0;kS(e,c[47356]|0,L,i&255);if(!E)tN(e,f)}else{if(D){if(r?(hI(e,t,n,1)|0)>1:0){c[N>>2]=HB(f)|0;dA(3,106605,N)|0}lS(e,c[47356]|0,L,0);break}if(!w){fS(e,137680);lS(e,c[47356]|0,L,z);fS(e,B);oS(e,(c[47356]|0)+32|0,2);break}if(x){lS(e,t,L,z);break}else{RM(e,t,L,H,z);break}}while(0);u=u+1|0;i=0}q=c[(c[K>>2]|0)+8>>2]|0;if(!(a[q+12>>0]|0)){q=NA(f,109326)|0;if(q|0?a[q>>0]|0:0)P=65}else{q=c[q>>2]|0;if((a[q>>0]|0)==99?(f2(q,105820)|0)==0:0){q=NA(f,105827)|0;if(q|0?a[q>>0]|0:0)P=65}else P=65}if((P|0)==65){s=c[47356]|0;r=0;while(1){if((r|0)>=(L|0))break;p=+h[I+(r<<4)+8>>3];X=c[K>>2]|0;h[s+(r<<4)>>3]=F*+h[I+(r<<4)>>3]+ +h[X+16>>3];h[s+(r<<4)+8>>3]=G*p+ +h[X+24>>3];r=r+1|0}do if(!(o|i<<24>>24==0)){if(C){if(A?(F3(n,58)|0)!=0:0)if((dI(e,s,n)|0)>1){c[Q>>2]=HB(f)|0;dA(3,106605,Q)|0;i=0}else i=0;kS(e,c[47356]|0,L,i&255);if(E)break;tN(e,f);break}if(!D)if(!(H&12)){lS(e,s,L,z);break}else{RM(e,s,L,H,z);break}else{if((hI(e,s,n,1)|0)>1){c[R>>2]=HB(f)|0;dA(3,106605,R)|0}lS(e,c[47356]|0,L,0);break}}while(0);X=c[47356]|0;qS(e,q,X,L,i,_O(f,c[47228]|0,137609)|0)}l6(c[T>>2]|0);BK(e,10,c[(c[K>>2]|0)+104>>2]|0);if(J){if(c[O>>2]&4|0)aS(e,c[U>>2]|0,c[j>>2]|0,c[m>>2]|0,c[k>>2]|0);bS(e)}l=V;return}function qN(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+16|0;f=h;e=wN(d,f)|0;if(e|0)jS(b,e);e=c[47234]|0;if((e|0?(g=OA(d,e)|0,g|0):0)?a[g>>0]|0:0)sS(b,+YO(d,c[47234]|0,1.0,0.0));l=h;return c[f>>2]|0}function rN(a){a=a|0;return vN(a,135101)|0}function sN(b,d){b=b|0;d=d|0;d=$O(d,c[47202]|0,195341)|0;d=a[d>>0]|0?d:137615;fS(b,d);return d|0}function tN(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0,i=0.0,j=0,k=0,m=0;d=l;l=l+96|0;j=d+80|0;k=d+64|0;e=d+32|0;m=d+16|0;g=d;b=c[b+16>>2]|0;f=+h[b+80>>3]*.75*.5;h[m+8>>3]=f;i=+h[b+96>>3]*.6614;h[m>>3]=i;b=b+16|0;c[k>>2]=c[m>>2];c[k+4>>2]=c[m+4>>2];c[k+8>>2]=c[m+8>>2];c[k+12>>2]=c[m+12>>2];c[j>>2]=c[b>>2];c[j+4>>2]=c[b+4>>2];c[j+8>>2]=c[b+8>>2];c[j+12>>2]=c[b+12>>2];uN(g,k,j);c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2];c[e+12>>2]=c[g+12>>2];g=e+8|0;b=e+24|0;h[b>>3]=+h[g>>3];h[e+16>>3]=+h[e>>3]-i*2.0;oS(a,e,2);f=+h[g>>3]-f*2.0;h[g>>3]=f;h[b>>3]=f;oS(a,e,2);l=d;return}function uN(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=+h[b+8>>3]+ +h[c+8>>3];h[a>>3]=+h[b>>3]+ +h[c>>3];h[a+8>>3]=d;return}function vN(b,d){b=b|0;d=d|0;var e=0;e=$O(b,c[47203]|0,195341)|0;if(!(a[e>>0]|0)){e=$O(b,c[47202]|0,195341)|0;return ((a[e>>0]|0)==0?d:e)|0}else return e|0;return 0}function wN(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=$O(b,c[47219]|0,195341)|0;a:do if(!(a[e>>0]|0)){g=0;e=0}else{g=NI(e)|0;i=g;e=0;b:while(1){f=c[i>>2]|0;if(!f)break a;h=i+4|0;switch(a[f>>0]|0){case 102:{i=h;e=e|(f2(f,111402)|0)==0;continue b}case 114:{if(!(f2(f,106617)|0)){f=i;do{j=f;f=f+4|0;h=c[f>>2]|0;c[j>>2]=h}while((h|0)!=0);j=i;e=e|4;i=j;continue b}if(!(f2(f,106635)|0))f=i;else{j=e;i=h;e=j;continue b}do{h=f;f=f+4|0;j=c[f>>2]|0;c[h>>2]=j}while((j|0)!=0);j=i;e=e|3;i=j;continue b}case 100:{if(!(f2(f,106625)|0))f=i;else{j=e;i=h;e=j;continue b}do{h=f;f=f+4|0;j=c[f>>2]|0;c[h>>2]=j}while((j|0)!=0);j=i;e=e|8;i=j;continue b}case 105:{j=(f2(f,134636)|0)==0;i=h;e=j?e|32:e;continue b}case 115:{if(f2(f,106642)|0){j=e;i=h;e=j;continue b}if(!(xN(b)|0)){j=e;i=h;e=j;continue b}else f=i;do{h=f;f=f+4|0;j=c[f>>2]|0;c[h>>2]=j}while((j|0)!=0);j=i;e=e|64;i=j;continue b}case 119:{if(f2(f,106650)|0){j=e;i=h;e=j;continue b}if(!(yN(b)|0)){j=e;i=h;e=j;continue b}else f=i;do{h=f;f=f+4|0;j=c[f>>2]|0;c[h>>2]=j}while((j|0)!=0);j=i;e=e|512;i=j;continue b}default:{j=e;i=h;e=j;continue b}}}}while(0);f=c[(c[(c[b+16>>2]|0)+8>>2]|0)+8>>2]|0;if(f)e=c[f+40>>2]|e;c[d>>2]=e;return g|0}function xN(a){a=a|0;var b=0.0;a=c[(c[(c[a+16>>2]|0)+8>>2]|0)+8>>2]|0;if(!a)a=0;else{if(((c[a+8>>2]|0)==4?(b=+h[a+16>>3],((~~(b+(b>=0.0?.5:-.5))|0)%90|0|0)==0):0)?+h[a+24>>3]==0.0:0)a=+h[a+32>>3]==0.0;else a=0;a=a&1}return a|0}function yN(a){a=a|0;a=c[(c[(c[a+16>>2]|0)+8>>2]|0)+8>>2]|0;if(!a)a=0;else a=(c[a+8>>2]|0)<3&1;return a|0}function zN(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,g=0.0,i=0.0;e=+h[c+8>>3];g=-(+h[d+8>>3]-e);i=+h[c>>3];f=+h[d>>3]-i;e=i*g+e*f;return (+h[a>>3]*g+f*+h[a+8>>3]-e>=0.0^+h[b>>3]*g+f*+h[b+8>>3]-e>=0.0^1)&1|0}function AN(b,d,e,f,g,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0.0,k=0.0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;H=l;l=l+192|0;D=H+176|0;F=H+160|0;m=H+144|0;B=H+128|0;C=H+112|0;o=H+96|0;p=H+80|0;w=H+64|0;x=H+48|0;y=H+32|0;z=H+16|0;E=H;G=F+8|0;if(!d){c[F>>2]=0;c[F+4>>2]=0;c[F+8>>2]=0;c[F+12>>2]=0;n=(c[(c[(uC(b)|0)+16>>2]|0)+116>>2]&1|0)==0;m=c[b+16>>2]|0;t=+h[m+80>>3]*.5;v=-t;s=+h[m+88>>3];u=-s;m=0;k=0.0;q=n?u:v;r=n?s:t;s=n?t:s;t=0.0;u=n?v:u}else{q=+h[d>>3];u=+h[d+8>>3];r=+h[d+16>>3];s=+h[d+24>>3];$M(m,(q+r)*.5,(u+s)*.5);c[F>>2]=c[m>>2];c[F+4>>2]=c[m+4>>2];c[F+8>>2]=c[m+8>>2];c[F+12>>2]=c[m+12>>2];m=1;k=+h[F>>3];t=+h[G>>3]}v=(r>s?r:s)*4.0;a:do if((f|0)!=0?(A=a[f>>0]|0,A<<24>>24!=0):0){f=f+1|0;n=(i|0)!=0;j=-v;switch(A<<24>>24|0){case 99:{p=1;g=0;f=0;n=0;j=0.0;o=0;break a}case 101:{if(a[f>>0]|0){p=1;g=0;f=0;n=0;j=0.0;o=1;break a}if(n){CN(B,i,t,v);c[F>>2]=c[B>>2];c[F+4>>2]=c[B+4>>2];c[F+8>>2]=c[B+8>>2];c[F+12>>2]=c[B+12>>2]}else h[F>>3]=r;p=0;g=g&2;f=0;n=1;j=0.0;o=0;m=1;break a}case 115:{h[G>>3]=u;switch(a[f>>0]|0){case 0:{if(n){CN(C,i,j,k);c[F>>2]=c[C>>2];c[F+4>>2]=c[C+4>>2];c[F+8>>2]=c[C+8>>2];c[F+12>>2]=c[C+12>>2]}else h[F>>3]=k;p=0;g=g&1;f=0;n=1;j=-1.5707963267948966;o=0;m=1;break a}case 101:{if(n){CN(o,i,j,v);c[F>>2]=c[o>>2];c[F+4>>2]=c[o+4>>2];c[F+8>>2]=c[o+8>>2];c[F+12>>2]=c[o+12>>2]}else h[F>>3]=r;p=0;g=g&3;f=0;n=1;j=-.7853981633974483;o=0;m=1;break a}case 119:{if(n){CN(p,i,j,j);c[F>>2]=c[p>>2];c[F+4>>2]=c[p+4>>2];c[F+8>>2]=c[p+8>>2];c[F+12>>2]=c[p+12>>2]}else h[F>>3]=q;p=0;g=g&9;f=0;n=1;j=-2.356194490192345;o=0;m=1;break a}default:{h[G>>3]=t;p=1;g=0;f=0;n=0;j=0.0;o=1;break a}}}case 119:{if(a[f>>0]|0){p=1;g=0;f=0;n=0;j=0.0;o=1;break a}if(n){CN(w,i,t,j);c[F>>2]=c[w>>2];c[F+4>>2]=c[w+4>>2];c[F+8>>2]=c[w+8>>2];c[F+12>>2]=c[w+12>>2]}else h[F>>3]=q;p=0;g=g&8;f=0;n=1;j=3.141592653589793;o=0;m=1;break a}case 110:{h[G>>3]=s;switch(a[f>>0]|0){case 0:{if(n){CN(x,i,v,k);c[F>>2]=c[x>>2];c[F+4>>2]=c[x+4>>2];c[F+8>>2]=c[x+8>>2];c[F+12>>2]=c[x+12>>2]}else h[F>>3]=k;p=0;g=g&4;f=0;n=1;j=1.5707963267948966;o=0;m=1;break a}case 101:{if(n){CN(y,i,v,v);c[F>>2]=c[y>>2];c[F+4>>2]=c[y+4>>2];c[F+8>>2]=c[y+8>>2];c[F+12>>2]=c[y+12>>2]}else h[F>>3]=r;p=0;g=g&6;f=0;n=1;j=.7853981633974483;o=0;m=1;break a}case 119:{if(n){CN(z,i,v,j);c[F>>2]=c[z>>2];c[F+4>>2]=c[z+4>>2];c[F+8>>2]=c[z+8>>2];c[F+12>>2]=c[z+12>>2]}else h[F>>3]=q;p=0;g=g&12;f=0;n=1;j=2.356194490192345;o=0;m=1;break a}default:{h[G>>3]=t;p=1;g=0;f=0;n=0;j=0.0;o=1;break a}}}case 95:{p=1;f=1;n=0;j=0.0;o=0;break a}default:{p=1;g=0;f=0;n=0;j=0.0;o=1;break a}}}else{p=1;g=0;f=0;n=0;j=0.0;o=0}while(0);C=(c[(c[(uC(b)|0)+16>>2]|0)+116>>2]&3)*90|0;c[D>>2]=c[F>>2];c[D+4>>2]=c[F+4>>2];c[D+8>>2]=c[F+8>>2];c[D+12>>2]=c[F+12>>2];jK(E,D,C);c[F>>2]=c[E>>2];c[F+4>>2]=c[E+4>>2];c[F+8>>2]=c[E+8>>2];c[F+12>>2]=c[E+12>>2];if(!(f<<24>>24))g=DN(g,c[(c[(uC(b)|0)+16>>2]|0)+116>>2]&3)|0;a[e+33>>0]=g;c[e+24>>2]=d;k=+h[F>>3];h[e>>3]=+(~~(k+(k>=0.0?.5:-.5))|0);k=+h[G>>3];h[e+8>>3]=+(~~(k+(k>=0.0?.5:-.5))|0);h[e+16>>3]=+EN(j,c[(c[(uC(b)|0)+16>>2]|0)+116>>2]&3);k=+h[F>>3];j=+h[G>>3];if(k==0.0&j==0.0)g=-128;else{v=+O(+j,+k)+4.71238898038469;g=~~((!(v>=6.283185307179586)?v:v+-6.283185307179586)*256.0/6.283185307179586)&255}a[e+32>>0]=g;a[e+29>>0]=n;a[e+28>>0]=m;a[e+30>>0]=p;a[e+31>>0]=f;l=H;return o|0}function BN(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=HB(a)|0;c[e+4>>2]=b;dA(0,106720,e)|0;l=d;return}function CN(a,b,d,e){a=a|0;b=b|0;d=+d;e=+e;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;p=l;l=l+128|0;i=p+112|0;j=p+48|0;k=p+16|0;m=p+32|0;n=p;o=c[b>>2]|0;g=c[(c[(uC(o)|0)+16>>2]|0)+116>>2]&3;h[k>>3]=e;h[k+8>>3]=d;f=(g|0)!=0;g=g*90|0;if(f){c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];jK(m,i,g);c[k>>2]=c[m>>2];c[k+4>>2]=c[m+4>>2];c[k+8>>2]=c[m+8>>2];c[k+12>>2]=c[m+12>>2]}m=j+48|0;q=j+32|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[j+16>>2]=0;c[j+20>>2]=0;c[j+24>>2]=0;c[j+28>>2]=0;c[q>>2]=c[k>>2];c[q+4>>2]=c[k+4>>2];c[q+8>>2]=c[k+8>>2];c[q+12>>2]=c[k+12>>2];c[m>>2]=c[k>>2];c[m+4>>2]=c[k+4>>2];c[m+8>>2]=c[k+8>>2];c[m+12>>2]=c[k+12>>2];ZN(b,c[(c[(c[(c[o+16>>2]|0)+8>>2]|0)+4>>2]|0)+12>>2]|0,j,1);if(f){c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];kK(n,i,g);c[j>>2]=c[n>>2];c[j+4>>2]=c[n+4>>2];c[j+8>>2]=c[n+8>>2];c[j+12>>2]=c[n+12>>2]};c[a>>2]=c[j>>2];c[a+4>>2]=c[j+4>>2];c[a+8>>2]=c[j+8>>2];c[a+12>>2]=c[j+12>>2];l=p;return}function DN(a,b){a=a|0;b=b|0;a:do switch(b|0){case 3:switch(a|0){case 4:{a=2;break a}case 1:{a=8;break a}case 8:{a=1;break a}case 2:{a=4;break a}default:break a}case 2:switch(a|0){case 4:{a=1;break a}case 1:{a=4;break a}default:break a}case 1:switch(a|0){case 4:{a=2;break a}case 1:{a=8;break a}case 8:{a=4;break a}case 2:{a=1;break a}default:break a}default:{}}while(0);return a|0}function EN(a,b){a=+a;b=b|0;switch(b|0){case 3:{if(!(a==3.141592653589793))if(!(a==2.356194490192345))if(!(a==1.5707963267948966))if(!(a==0.0))if(!(a==-.7853981633974483)){if(a==-1.5707963267948966)a=3.141592653589793}else a=2.356194490192345;else a=1.5707963267948966;else a=0.0;else a=-.7853981633974483;else a=-1.5707963267948966;break}case 2:{a=-a;break}case 1:{a=a+-1.5707963267948966;break}default:{}}return +a}function FN(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0.0,g=0.0,i=0,j=0,k=0;e=l;l=l+32|0;k=e+16|0;i=e;a=c[a>>2]|0;j=(c[(c[(uC(a)|0)+16>>2]|0)+116>>2]&3)*90|0;c[k>>2]=c[b>>2];c[k+4>>2]=c[b+4>>2];c[k+8>>2]=c[b+8>>2];c[k+12>>2]=c[b+12>>2];kK(i,k,j);d=+h[i>>3];g=+h[i+8>>3];a=c[a+16>>2]|0;f=+h[a+80>>3]*.5;if(!(!(g>=-f)|!(g<=f))?d>=-+h[a+88>>3]:0)a=d<=+h[a+96>>3]&1;else a=0;l=e;return a|0}function GN(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0;q=l;l=l+32|0;p=q;e=c[a+16>>2]|0;n=e+208|0;m=c[n>>2]|0;if(!m)o=(b[e+260>>1]&1)!=0;else o=1;g=d+16|0;d=c[g>>2]|0;i=c[d+12>>2]|0;if(i|0){j=e+212|0;k=e+244|0;e=e+228|0;f=a+152|0;if(o?(c[f>>2]&4|0)==0:0){aS(a,m,c[e>>2]|0,c[k>>2]|0,c[j>>2]|0);d=c[g>>2]|0}m=c[a+36>>2]|0;s=+h[d+24>>3]+ +(c[i+8>>2]|0);r=c[i>>2]|0;h[p>>3]=+h[d+16>>3]+ +(c[i+4>>2]|0);h[p+8>>3]=s;c[p+16>>2]=r;z4(m,106751,p)|0;m=c[g>>2]|0;p=(c[m+104>>2]|0)+56|0;m=m+16|0;c[p>>2]=c[m>>2];c[p+4>>2]=c[m+4>>2];c[p+8>>2]=c[m+8>>2];c[p+12>>2]=c[m+12>>2];BK(a,10,c[(c[g>>2]|0)+104>>2]|0);if(o){if(c[f>>2]&4|0)aS(a,c[n>>2]|0,c[e>>2]|0,c[k>>2]|0,c[j>>2]|0);bS(a)}}l=q;return}function HN(a){a=a|0;cN(c[(c[a+16>>2]|0)+12>>2]|0);return}function IN(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0;m=l;l=l+64|0;k=m+40|0;h=m;if(!(a[f>>0]|0)){h=4256;g=b+40|0;do{c[b>>2]=c[h>>2];b=b+4|0;h=h+4|0}while((b|0)<(g|0))}else{g=(g|0)==0?106657:g;i=c[(c[e+16>>2]|0)+12>>2]|0;j=ON(i,f)|0;if(!j){if(AN(e,i+16|0,h,f,15,0)|0)BN(e,f)}else if(AN(e,j+16|0,h,g,d[j+65>>0]|0,0)|0){c[k>>2]=HB(e)|0;c[k+4>>2]=f;c[k+8>>2]=g;dA(0,106659,k)|0}g=b+40|0;do{c[b>>2]=c[h>>2];b=b+4|0;h=h+4|0}while((b|0)<(g|0))}l=m;return}function JN(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0,g=0,i=0,j=0.0,k=0,m=0,n=0.0;k=l;l=l+32|0;m=k+16|0;i=k;f=c[a+4>>2]|0;a=c[a>>2]|0;g=(c[(c[(uC(a)|0)+16>>2]|0)+116>>2]&3)*90|0;c[m>>2]=c[b>>2];c[m+4>>2]=c[b+4>>2];c[m+8>>2]=c[b+8>>2];c[m+12>>2]=c[b+12>>2];kK(i,m,g);c[b>>2]=c[i>>2];c[b+4>>2]=c[i+4>>2];c[b+8>>2]=c[i+8>>2];c[b+12>>2]=c[i+12>>2];if(!f){f=c[(c[a+16>>2]|0)+12>>2]|0;g=f+16|0;a=f+24|0;i=f+32|0;f=f+40|0}else{g=f;a=f+8|0;i=f+16|0;f=f+24|0}e=+h[a>>3];d=+h[f>>3];n=+h[b>>3];if((+h[g>>3]<=n?n<=+h[i>>3]:0)?(j=+h[b+8>>3],e<=j):0)a=j<=d&1;else a=0;l=k;return a|0}function KN(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0.0;u=l;l=l+80|0;r=u+64|0;q=u+32|0;t=u;a:do if(!(a[d+28>>0]|0))e=0;else{i=+h[d>>3];p=b+16|0;m=c[(c[p>>2]|0)+12>>2]|0;k=m+48|0;m=m+56|0;d=0;while(1){if((d|0)>=(c[k>>2]|0))break a;n=(c[(c[(uC(b)|0)+16>>2]|0)+116>>2]&1|0)==0;o=c[(c[m>>2]|0)+(d<<2)>>2]|0;j=+(~~+h[(n?o+16|0:o+24|0)>>3]|0);if(j<=i?(s=+(~~+h[(n?o+32|0:o+40|0)>>3]|0),i<=s):0)break;d=d+1|0}if(!(c[(c[(uC(b)|0)+16>>2]|0)+116>>2]&1)){t=c[p>>2]|0;v=+h[t+16>>3];h[f>>3]=j+v;j=+h[t+24>>3];i=+h[t+80>>3];h[f+8>>3]=j-i*.5;h[f+16>>3]=s+v}else{o=(c[(c[m>>2]|0)+(d<<2)>>2]|0)+16|0;b=(c[p>>2]|0)+16|0;c[q>>2]=c[o>>2];c[q+4>>2]=c[o+4>>2];c[q+8>>2]=c[o+8>>2];c[q+12>>2]=c[o+12>>2];c[q+16>>2]=c[o+16>>2];c[q+20>>2]=c[o+20>>2];c[q+24>>2]=c[o+24>>2];c[q+28>>2]=c[o+28>>2];c[r>>2]=c[b>>2];c[r+4>>2]=c[b+4>>2];c[r+8>>2]=c[b+8>>2];c[r+12>>2]=c[b+12>>2];lK(t,q,r);c[f>>2]=c[t>>2];c[f+4>>2]=c[t+4>>2];c[f+8>>2]=c[t+8>>2];c[f+12>>2]=c[t+12>>2];c[f+16>>2]=c[t+16>>2];c[f+20>>2]=c[t+20>>2];c[f+24>>2]=c[t+24>>2];c[f+28>>2]=c[t+28>>2];t=c[p>>2]|0;i=+h[t+80>>3];j=+h[t+24>>3]}h[f+24>>3]=j+i*.5;c[g>>2]=1}while(0);l=u;return e|0}function LN(d,e){d=d|0;e=e|0;var f=0,i=0,j=0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0;z=l;l=l+144|0;p=z+96|0;r=z+64|0;t=z;w=z+128|0;f=c[d+16>>2]|0;x=f+208|0;i=c[x>>2]|0;if(!i)y=(b[f+260>>1]&1)!=0;else y=1;m=e+16|0;s=c[m>>2]|0;q=c[s+12>>2]|0;u=q+16|0;c[r>>2]=c[u>>2];c[r+4>>2]=c[u+4>>2];c[r+8>>2]=c[u+8>>2];c[r+12>>2]=c[u+12>>2];c[r+16>>2]=c[u+16>>2];c[r+20>>2]=c[u+20>>2];c[r+24>>2]=c[u+24>>2];c[r+28>>2]=c[u+28>>2];A=+h[s+16>>3];h[r>>3]=A+ +h[r>>3];k=+h[s+24>>3];s=r+8|0;h[s>>3]=k+ +h[s>>3];s=r+16|0;h[s>>3]=A+ +h[s>>3];u=r+24|0;h[u>>3]=k+ +h[u>>3];u=f+228|0;v=f+212|0;n=f+244|0;o=d+152|0;if(y?(c[o>>2]&4|0)==0:0)aS(d,i,c[u>>2]|0,c[n>>2]|0,c[v>>2]|0);f=qN(d,e)|0;sN(d,e)|0;c[w>>2]=0;if(!(f&1))i=0;else{i=rN(e)|0;if(!((HJ(i,w,p)|0)<<24>>24)){hS(d,i);i=1}else{hS(d,c[w>>2]|0);i=c[w+4>>2]|0;j=XO(e,c[47235]|0,0,0)|0;k=+g[p>>2];if(!i)iS(d,137615,j,k);else iS(d,i,j,k);i=f>>>1&1|2}}j=c[c[(c[m>>2]|0)+8>>2]>>2]|0;if((a[j>>0]|0)==77){m=(f2(j,106528)|0)==0;f=m?f|4:f}if(!(f&2130706444)){c[p>>2]=c[r>>2];c[p+4>>2]=c[r+4>>2];c[p+8>>2]=c[r+8>>2];c[p+12>>2]=c[r+12>>2];c[p+16>>2]=c[r+16>>2];c[p+20>>2]=c[r+20>>2];c[p+24>>2]=c[r+24>>2];c[p+28>>2]=c[r+28>>2];mS(d,p,i)}else{c[t>>2]=c[r>>2];c[t+4>>2]=c[r+4>>2];c[t+8>>2]=c[r+8>>2];c[t+12>>2]=c[r+12>>2];r=t+32|0;c[r>>2]=c[s>>2];c[r+4>>2]=c[s+4>>2];c[r+8>>2]=c[s+8>>2];c[r+12>>2]=c[s+12>>2];h[t+16>>3]=+h[r>>3];h[t+24>>3]=+h[t+8>>3];h[t+48>>3]=+h[t>>3];h[t+56>>3]=+h[t+40>>3];RM(d,t,4,f,i)}MN(d,e,q);l6(c[w>>2]|0);if(y){if(c[o>>2]&4|0)aS(d,c[x>>2]|0,c[u>>2]|0,c[n>>2]|0,c[v>>2]|0);bS(d)}l=z;return}function MN(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=l;l=l+144|0;p=u+128|0;o=u+112|0;q=u+16|0;r=u;i=u+96|0;j=u+80|0;s=u+64|0;t=u+48|0;k=e+52|0;g=c[k>>2]|0;f=d+16|0;if(g){n=g+56|0;g=e+16|0;m=e+32|0;c[o>>2]=c[g>>2];c[o+4>>2]=c[g+4>>2];c[o+8>>2]=c[g+8>>2];c[o+12>>2]=c[g+12>>2];c[p>>2]=c[m>>2];c[p+4>>2]=c[m+4>>2];c[p+8>>2]=c[m+8>>2];c[p+12>>2]=c[m+12>>2];NN(i,o,p);m=(c[f>>2]|0)+16|0;c[o>>2]=c[i>>2];c[o+4>>2]=c[i+4>>2];c[o+8>>2]=c[i+8>>2];c[o+12>>2]=c[i+12>>2];c[p>>2]=c[m>>2];c[p+4>>2]=c[m+4>>2];c[p+8>>2]=c[m+8>>2];c[p+12>>2]=c[m+12>>2];uN(j,o,p);c[n>>2]=c[j>>2];c[n+4>>2]=c[j+4>>2];c[n+8>>2]=c[j+8>>2];c[n+12>>2]=c[j+12>>2];BK(b,10,c[k>>2]|0);sN(b,d)|0}m=(c[f>>2]|0)+16|0;c[r>>2]=c[m>>2];c[r+4>>2]=c[m+4>>2];c[r+8>>2]=c[m+8>>2];c[r+12>>2]=c[m+12>>2];m=e+48|0;n=e+56|0;j=e+64|0;k=q+16|0;i=0;while(1){if((i|0)>=(c[m>>2]|0))break;if((i|0)>0){f=(c[n>>2]|0)+(i<<2)|0;g=c[f>>2]|0;if(!(a[j>>0]|0)){g=g+32|0;c[k>>2]=c[g>>2];c[k+4>>2]=c[g+4>>2];c[k+8>>2]=c[g+8>>2];c[k+12>>2]=c[g+12>>2];h[q>>3]=+h[(c[f>>2]|0)+16>>3];f=k;g=0}else{g=g+16|0;c[q>>2]=c[g>>2];c[q+4>>2]=c[g+4>>2];c[q+8>>2]=c[g+8>>2];c[q+12>>2]=c[g+12>>2];h[k>>3]=+h[q>>3];f=(c[f>>2]|0)+32|0;g=1}h[q+(g<<4)+8>>3]=+h[f+8>>3];c[o>>2]=c[q>>2];c[o+4>>2]=c[q+4>>2];c[o+8>>2]=c[q+8>>2];c[o+12>>2]=c[q+12>>2];c[p>>2]=c[r>>2];c[p+4>>2]=c[r+4>>2];c[p+8>>2]=c[r+8>>2];c[p+12>>2]=c[r+12>>2];uN(s,o,p);c[q>>2]=c[s>>2];c[q+4>>2]=c[s+4>>2];c[q+8>>2]=c[s+8>>2];c[q+12>>2]=c[s+12>>2];c[o>>2]=c[k>>2];c[o+4>>2]=c[k+4>>2];c[o+8>>2]=c[k+8>>2];c[o+12>>2]=c[k+12>>2];c[p>>2]=c[r>>2];c[p+4>>2]=c[r+4>>2];c[p+8>>2]=c[r+8>>2];c[p+12>>2]=c[r+12>>2];uN(t,o,p);c[k>>2]=c[t>>2];c[k+4>>2]=c[t+4>>2];c[k+8>>2]=c[t+8>>2];c[k+12>>2]=c[t+12>>2];oS(b,q,2)}MN(b,d,c[(c[n>>2]|0)+(i<<2)>>2]|0);i=i+1|0}l=u;return}function NN(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=(+h[b+8>>3]+ +h[c+8>>3])*.5;h[a>>3]=(+h[b>>3]+ +h[c>>3])*.5;h[a+8>>3]=d;return}function ON(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=c[b+60>>2]|0;if(!(((e|0)!=0?(a[e>>0]|0)==(a[d>>0]|0):0)?(f2(e,d)|0)==0:0))f=4;a:do if((f|0)==4){g=b+56|0;f=c[b+48>>2]|0;e=0;while(1){if((e|0)>=(f|0)){b=0;break a}b=ON(c[(c[g>>2]|0)+(e<<2)>>2]|0,d)|0;if(!b)e=e+1|0;else break}}while(0);return b|0}function PN(a,b){a=a|0;b=b|0;var d=0;d=b+8|0;h[d>>3]=+h[d>>3]*1.375;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];return}function QN(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0;f=+h[b>>3]*.5;m=+h[b+8>>3];i=m*.5;m=m/11.0;h[a>>3]=f;e=i-m;h[a+8>>3]=e;h[a+16>>3]=f;g=i-m*.44821599999999995;h[a+24>>3]=g;j=f*.551784;h[a+32>>3]=j;h[a+40>>3]=i;h[a+48>>3]=0.0;h[a+56>>3]=i;k=f*-.551784;h[a+64>>3]=k;h[a+72>>3]=i;l=-f;h[a+80>>3]=l;h[a+88>>3]=g;d=a+96|0;h[d>>3]=l;h[a+104>>3]=e;b=a+112|0;c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];b=a+128|0;h[b>>3]=l;h[a+136>>3]=m-i;d=a+144|0;c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];h[a+160>>3]=l;g=-g;h[a+168>>3]=g;h[a+176>>3]=k;i=-i;h[a+184>>3]=i;h[a+192>>3]=0.0;h[a+200>>3]=i;h[a+208>>3]=j;h[a+216>>3]=i;h[a+224>>3]=f;h[a+232>>3]=g;d=a+240|0;h[d>>3]=f;h[a+248>>3]=-e;b=a+256|0;c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];b=a+288|0;d=a+272|0;c[d>>2]=c[a>>2];c[d+4>>2]=c[a+4>>2];c[d+8>>2]=c[a+8>>2];c[d+12>>2]=c[a+12>>2];c[b>>2]=c[a>>2];c[b+4>>2]=c[a+4>>2];c[b+8>>2]=c[a+8>>2];c[b+12>>2]=c[a+12>>2];return}function RN(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0,g=0.0,i=0.0,j=0,k=0,m=0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=l;l=l+144|0;u=x+112|0;t=x+96|0;w=x+80|0;s=x+64|0;v=x+32|0;q=x+16|0;r=x;f=x+48|0;do if(a){j=c[a+4>>2]|0;k=c[a>>2]|0;o=(c[(c[(uC(k)|0)+16>>2]|0)+116>>2]&3)*90|0;c[u>>2]=c[b>>2];c[u+4>>2]=c[b+4>>2];c[u+8>>2]=c[b+8>>2];c[u+12>>2]=c[b+12>>2];kK(f,u,o);c[v>>2]=c[f>>2];c[v+4>>2]=c[f+4>>2];c[v+8>>2]=c[f+8>>2];c[v+12>>2]=c[f+12>>2];f=v+8|0;if(j|0){d=+h[v>>3];if(!(+h[j>>3]<=d)){a=0;break}if(!(d<=+h[j+16>>3])){a=0;break}d=+h[f>>3];if(!(+h[j+8>>3]<=d)){a=0;break}a=d<=+h[j+24>>3];break}if((k|0)==(c[47362]|0)){d=+h[23330];e=+h[23331];i=+h[23332]}else{a=k+16|0;b=c[(c[a>>2]|0)+12>>2]|0;c[47363]=b;c[47364]=c[b+44>>2];c[47365]=c[b+8>>2];if(!(c[b+40>>2]&2048)){n=(c[(c[(uC(k)|0)+16>>2]|0)+116>>2]&1|0)==0;o=c[a>>2]|0;h[(n?186664:186672)>>3]=+h[o+88>>3]+ +h[o+96>>3];h[(n?186672:186664)>>3]=+h[o+80>>3];i=+h[o+32>>3]*72.0;g=+h[o+40>>3]*72.0;g=+(~~(g+(g>=0.0?.5:-.5))|0);i=+(~~(i+(i>=0.0?.5:-.5))|0)}else{wP(u,b);i=+h[u+16>>3]-+h[u>>3];g=+h[u+24>>3]-+h[u+8>>3];o=(c[(c[(uC(k)|0)+16>>2]|0)+116>>2]&1|0)==0;h[(o?186664:186672)>>3]=i;h[(o?186672:186664)>>3]=g}d=+h[23333];if(d==0.0){h[23333]=1.0;d=1.0}e=+h[23334];if(e==0.0){h[23334]=1.0;e=1.0}d=i/d;h[23330]=d;e=g/e;h[23331]=e;i=i*.5;h[23332]=i;h[23335]=g*.5;o=S((c[(c[47363]|0)+4>>2]|0)+-1|0,c[47365]|0)|0;c[47366]=(o|0)>0?o:0;c[47362]=k}g=d*+h[v>>3];h[v>>3]=g;d=e*+h[f>>3];h[f>>3]=d;if(!(+F(+g)>i)?(e=+F(+d),p=+h[23335],!(e>p)):0){o=c[47365]|0;if((o|0)<3){a=+c2(g/i,d/p)<1.0;break}b=(c[47367]|0)%(o|0)|0;a=(b+1|0)%(o|0)|0;k=c[47364]|0;m=c[47366]|0;n=k+(m+b<<4)|0;c[q>>2]=c[n>>2];c[q+4>>2]=c[n+4>>2];c[q+8>>2]=c[n+8>>2];c[q+12>>2]=c[n+12>>2];n=k+(m+a<<4)|0;c[r>>2]=c[n>>2];c[r+4>>2]=c[n+4>>2];c[r+8>>2]=c[n+8>>2];c[r+12>>2]=c[n+12>>2];c[s>>2]=c[v>>2];c[s+4>>2]=c[v+4>>2];c[s+8>>2]=c[v+8>>2];c[s+12>>2]=c[v+12>>2];c[w>>2]=c[46672];c[w+4>>2]=c[46673];c[w+8>>2]=c[46674];c[w+12>>2]=c[46675];c[t>>2]=c[q>>2];c[t+4>>2]=c[q+4>>2];c[t+8>>2]=c[q+8>>2];c[t+12>>2]=c[q+12>>2];c[u>>2]=c[n>>2];c[u+4>>2]=c[n+4>>2];c[u+8>>2]=c[n+8>>2];c[u+12>>2]=c[n+12>>2];if(zN(s,w,t,u)|0){c[s>>2]=c[v>>2];c[s+4>>2]=c[v+4>>2];c[s+8>>2]=c[v+8>>2];c[s+12>>2]=c[v+12>>2];c[w>>2]=c[q>>2];c[w+4>>2]=c[q+4>>2];c[w+8>>2]=c[q+8>>2];c[w+12>>2]=c[q+12>>2];c[t>>2]=c[r>>2];c[t+4>>2]=c[r+4>>2];c[t+8>>2]=c[r+8>>2];c[t+12>>2]=c[r+12>>2];c[u>>2]=c[46672];c[u+4>>2]=c[46673];c[u+8>>2]=c[46674];c[u+12>>2]=c[46675];n=(zN(s,w,t,u)|0)!=0;if(n?(c[s>>2]=c[v>>2],c[s+4>>2]=c[v+4>>2],c[s+8>>2]=c[v+8>>2],c[s+12>>2]=c[v+12>>2],c[w>>2]=c[r>>2],c[w+4>>2]=c[r+4>>2],c[w+8>>2]=c[r+8>>2],c[w+12>>2]=c[r+12>>2],c[t>>2]=c[46672],c[t+4>>2]=c[46673],c[t+8>>2]=c[46674],c[t+12>>2]=c[46675],c[u>>2]=c[q>>2],c[u+4>>2]=c[q+4>>2],c[u+8>>2]=c[q+8>>2],c[u+12>>2]=c[q+12>>2],(zN(s,w,t,u)|0)!=0):0){a=1;break}else{j=b;b=1}while(1){if((b|0)>=(o|0)){b=31;break}if(n){f=a;a=(a+1|0)%(o|0)|0}else{f=(j+-1+o|0)%(o|0)|0;a=j}q=k+(m+f<<4)|0;r=k+(m+a<<4)|0;c[s>>2]=c[v>>2];c[s+4>>2]=c[v+4>>2];c[s+8>>2]=c[v+8>>2];c[s+12>>2]=c[v+12>>2];c[w>>2]=c[46672];c[w+4>>2]=c[46673];c[w+8>>2]=c[46674];c[w+12>>2]=c[46675];c[t>>2]=c[q>>2];c[t+4>>2]=c[q+4>>2];c[t+8>>2]=c[q+8>>2];c[t+12>>2]=c[q+12>>2];c[u>>2]=c[r>>2];c[u+4>>2]=c[r+4>>2];c[u+8>>2]=c[r+8>>2];c[u+12>>2]=c[r+12>>2];if(!(zN(s,w,t,u)|0)){b=30;break}else{j=f;b=b+1|0}}if((b|0)==30){c[47367]=f;a=0;break}else if((b|0)==31){c[47367]=j;a=1;break}}else a=0}else a=0}else{c[47362]=0;a=0}while(0);l=x;return a&1|0}function SN(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0,g=0.0,i=0,j=0,k=0;j=l;l=l+32|0;f=j+16|0;i=j;if(a){a=c[a>>2]|0;k=(c[(c[(uC(a)|0)+16>>2]|0)+116>>2]&3)*90|0;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];kK(i,f,k);g=+h[i>>3];e=+h[i+8>>3];if((a|0)==(c[47370]|0))d=+h[23338];else{i=c[(c[a+16>>2]|0)+12>>2]|0;k=(c[i+4>>2]<<1)+-2|0;d=+h[(c[i+44>>2]|0)+((((k|0)>0?k:0)|1)<<4)>>3];h[23338]=d;c[47370]=a}if(!(+F(+g)>d)?!(+F(+e)>d):0)a=+c2(g,e)<=d&1;else a=0}else{c[47370]=0;a=0}l=j;return a|0}function TN(e,f){e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0;w=l;l=l+16|0;p=w;m=c[e+16>>2]|0;v=m+208|0;n=c[v>>2]|0;if(!n){i=m+228|0;j=m+212|0;k=m+244|0;g=e+152|0;if(!(b[m+260>>1]&1)){u=i;t=0}else o=4}else{g=e+152|0;i=m+228|0;k=m+244|0;j=m+212|0;o=4}if((o|0)==4)if(!(c[g>>2]&4)){aS(e,n,c[i>>2]|0,c[k>>2]|0,c[j>>2]|0);u=i;t=1}else{u=i;t=1}q=f+16|0;n=c[(c[q>>2]|0)+12>>2]|0;r=c[n+44>>2]|0;s=c[n+8>>2]|0;n=c[n+4>>2]|0;if((c[47368]|0)<(s|0)){m=s+2|0;c[47368]=m;i=c[47369]|0;m=m<<4;if(!i)i=IK(m)|0;else i=KK(i,m)|0;c[47369]=i}wN(f,p)|0;if(!(c[p>>2]&32))jS(e,22068);else jS(e,22064);i=c[47234]|0;if(i|0)sS(e,+YO(f,i,1.0,0.0));i=d[(c[q>>2]|0)+117>>0]|0;do if(!(i&1)){if(i&2|0){fS(e,$O(f,c[47206]|0,106557)|0);i=$O(f,c[47207]|0,106565)|0;hS(e,i);break}if(i&8|0){fS(e,$O(f,c[47210]|0,106573)|0);i=$O(f,c[47211]|0,106581)|0;hS(e,i);break}if(!(i&4)){i=vN(f,137615)|0;hS(e,i);sN(e,f)|0;break}else{fS(e,$O(f,c[47208]|0,106589)|0);i=$O(f,c[47209]|0,106597)|0;hS(e,i);break}}else{fS(e,$O(f,c[47204]|0,106541)|0);i=$O(f,c[47205]|0,106549)|0;hS(e,i)}while(0);if(!n)if(!(a[i>>0]|0))m=1;else{fS(e,i);m=1}else m=n;n=1;o=0;while(1){if((o|0)>=(m|0))break;p=c[47369]|0;f=S(o,s)|0;i=0;while(1){if((i|0)>=(s|0))break;z=i+f|0;y=+h[r+(z<<4)+8>>3];x=c[q>>2]|0;h[p+(i<<4)>>3]=+h[r+(z<<4)>>3]+ +h[x+16>>3];h[p+(i<<4)+8>>3]=y+ +h[x+24>>3];i=i+1|0}kS(e,p,s,n);n=0;o=o+1|0}if(t){if(c[g>>2]&4|0)aS(e,c[v>>2]|0,c[u>>2]|0,c[k>>2]|0,c[j>>2]|0);bS(e)}l=w;return}function UN(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0;g=l;l=l+48|0;h=g;e=VN(b,e,f)|0;c[h+36>>2]=c[f+36>>2];AN(b,c[f+24>>2]|0,h,e,d[f+33>>0]|0,0)|0;b=h;e=a+40|0;do{c[a>>2]=c[b>>2];a=a+4|0;b=b+4|0}while((a|0)<(e|0));l=g;return}function VN(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0,k=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0,C=0;z=l;l=l+32|0;y=z;j=z+24|0;n=z+16|0;x=c[(c[(c[(uC(b)|0)+60>>2]|0)+16>>2]|0)+116>>2]&3;f=b+16|0;w=(c[f>>2]|0)+16|0;c[y>>2]=c[w>>2];c[y+4>>2]=c[w+4>>2];c[y+8>>2]=c[w+8>>2];c[y+12>>2]=c[w+12>>2];WN(j,y,x);w=(c[d+16>>2]|0)+16|0;c[y>>2]=c[w>>2];c[y+4>>2]=c[w+4>>2];c[y+8>>2]=c[w+8>>2];c[y+12>>2]=c[w+12>>2];WN(n,y,x);x=a[e+33>>0]|0;y=x&255;a:do switch(x<<24>>24){case 0:case 15:{d=0;break}default:{d=c[e+24>>2]|0;if(!d){x=(c[(c[(uC(b)|0)+16>>2]|0)+116>>2]&1|0)==0;w=c[f>>2]|0;B=+h[w+80>>3]*.5;A=-B;k=+h[w+88>>3];g=-k;m=x?g:A;i=x?k:B;k=x?B:k;g=x?A:g}else{m=+h[d>>3];i=+h[d+16>>3];k=+h[d+24>>3];g=+h[d+8>>3]}v=~~((g+k)*.5);w=~~((m+i)*.5);x=c[j>>2]|0;t=c[j+4>>2]|0;u=c[n>>2]|0;s=c[n+4>>2]|0;r=~~g;q=~~i;p=~~k;o=~~m;j=0;n=0;d=0;e=0;b=0;while(1){if((n|0)==4)break a;if(1<>2]|0;else f=j}else f=j;j=f;n=n+1|0}}}while(0);l=z;return d|0}function WN(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,g=0;g=b+8|0;switch(d|0){case 0:{f=+h[b>>3];e=+h[g>>3];break}case 2:{f=+h[b>>3];e=-+h[g>>3];break}case 1:{f=-+h[g>>3];e=+h[b>>3];break}case 3:{f=+h[g>>3];e=+h[b>>3];break}default:{f=0.0;e=0.0}}c[a>>2]=~~(f+(f>=0.0?.5:-.5));c[a+4>>2]=~~(e+(e>=0.0?.5:-.5));return}function XN(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+80|0;f=k+40|0;i=k;g=b+16|0;e=c[g>>2]|0;d=e+16|0;j=b+-48|0;h=b+48|0;if(a[e+47>>0]|0){e=c[b>>2]&3;UN(f,c[((e|0)==3?b:h)+40>>2]|0,c[((e|0)==2?b:j)+40>>2]|0,d);e=f;f=d+40|0;do{c[d>>2]=c[e>>2];d=d+4|0;e=e+4|0}while((d|0)<(f|0));e=c[g>>2]|0}d=e+56|0;if(a[e+87>>0]|0){e=c[b>>2]&3;UN(i,c[((e|0)==2?b:j)+40>>2]|0,c[((e|0)==3?b:h)+40>>2]|0,d);e=i;f=d+40|0;do{c[d>>2]=c[e>>2];d=d+4|0;e=e+4|0}while((d|0)<(f|0))}l=k;return}function YN(){var a=0,b=0,d=0;a=l;l=l+32|0;b=a+16|0;d=a;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];RN(0,b)|0;c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];SN(0,b)|0;c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];nN(0,b)|0;l=a;return}function ZN(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0,k=0,m=0,n=0,o=0,p=0.0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;z=l;l=l+192|0;s=z+176|0;x=z+112|0;y=z+48|0;t=z+32|0;u=z+24|0;v=z+16|0;w=z;if(!(e<<24>>24)){k=d+48|0;c[t>>2]=c[k>>2];c[t+4>>2]=c[k+4>>2];c[t+8>>2]=c[k+8>>2];c[t+12>>2]=c[k+12>>2];k=u;m=v;n=x;o=0}else{c[t>>2]=c[d>>2];c[t+4>>2]=c[d+4>>2];c[t+8>>2]=c[d+8>>2];c[t+12>>2]=c[d+12>>2];k=v;m=u;n=0;o=x}h[u>>3]=0.0;h[v>>3]=1.0;q=t+8|0;f=0.0;g=1.0;j=0;p=+h[t>>3];while(1){r=+h[q>>3];f=(g+f)*.5;iP(w,d,3,f,n,o);c[t>>2]=c[w>>2];c[t+4>>2]=c[w+4>>2];c[t+8>>2]=c[w+8>>2];c[t+12>>2]=c[w+12>>2];c[s>>2]=c[w>>2];c[s+4>>2]=c[w+4>>2];c[s+8>>2]=c[w+8>>2];c[s+12>>2]=c[w+12>>2];a:do if(!((vb[b&127](a,s)|0)<<24>>24)){e=0;while(1){if((e|0)==4){e=k;j=1;break a}j=y+(e<<4)|0;A=x+(e<<4)|0;c[j>>2]=c[A>>2];c[j+4>>2]=c[A+4>>2];c[j+8>>2]=c[A+8>>2];c[j+12>>2]=c[A+12>>2];e=e+1|0}}else e=m;while(0);h[e>>3]=f;i=+h[t>>3];p=p-i;if(!((p>=0.0?p:-p)>.5)?(r=r-+h[q>>3],!((r>=0.0?r:-r)>.5)):0)break;f=+h[u>>3];g=+h[v>>3];p=i}b:do if(!(j<<24>>24)){e=0;while(1){if((e|0)==4)break b;A=d+(e<<4)|0;y=x+(e<<4)|0;c[A>>2]=c[y>>2];c[A+4>>2]=c[y+4>>2];c[A+8>>2]=c[y+8>>2];c[A+12>>2]=c[y+12>>2];e=e+1|0}}else{e=0;while(1){if((e|0)==4)break b;A=d+(e<<4)|0;x=y+(e<<4)|0;c[A>>2]=c[x>>2];c[A+4>>2]=c[x+4>>2];c[A+8>>2]=c[x+8>>2];c[A+12>>2]=c[x+12>>2];e=e+1|0}}while(0);l=z;return}function _N(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0.0;m=l;l=l+48|0;d=m+16|0;f=m;g=m+32|0;i=a+16|0;j=c[i>>2]|0;k=c[j+8>>2]|0;if(k|0?(e=c[(c[k+4>>2]|0)+12>>2]|0,e|0):0){c[g>>2]=a;c[g+4>>2]=0;n=+h[j+96>>3];h[f>>3]=+h[b>>3]-+h[j+16>>3];h[f+8>>3]=+h[b+8>>3]-+h[j+24>>3];c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];k=vb[e&127](g,d)|0;h[(c[i>>2]|0)+96>>3]=n;$N(g,a,b,k)}l=m;return}function $N(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0.0,m=0,n=0;n=l;l=l+64|0;m=n;g=b+16|0;i=c[g>>2]|0;k=+h[i+96>>3];j=i+16|0;f=i+24|0;b=0;while(1){if((b|0)==4)break;h[m+(b<<4)>>3]=+h[d+(b<<4)>>3]-+h[j>>3];h[m+(b<<4)+8>>3]=+h[d+(b<<4)+8>>3]-+h[f>>3];b=b+1|0}ZN(a,c[(c[(c[i+8>>2]|0)+4>>2]|0)+12>>2]|0,m,e);f=c[g>>2]|0;g=f+16|0;i=f+24|0;b=0;while(1){if((b|0)==4)break;h[d+(b<<4)>>3]=+h[m+(b<<4)>>3]+ +h[g>>3];h[d+(b<<4)+8>>3]=+h[m+(b<<4)+8>>3]+ +h[i>>3];b=b+1|0}h[f+96>>3]=k;l=n;return}function aO(b,d){b=b|0;d=d|0;var e=0,f=0;while(1){f=b+16|0;b=c[f>>2]|0;if(!(a[b+112>>0]|0))break;b=c[b+116>>2]|0}b=c[b+8>>2]|0;if(!b){b=HK(40)|0;c[(c[f>>2]|0)+8>>2]=b}e=c[b>>2]|0;b=((c[b+4>>2]|0)*48|0)+48|0;if(!e)b=IK(b)|0;else b=KK(e,b)|0;f=c[(c[f>>2]|0)+8>>2]|0;c[f>>2]=b;f=f+4|0;e=c[f>>2]|0;c[f>>2]=e+1;f=b+(e*48|0)|0;c[f>>2]=HK(d<<4)|0;c[b+(e*48|0)+4>>2]=d;b=b+(e*48|0)+8|0;e=b+40|0;do{c[b>>2]=0;b=b+4|0}while((b|0)<(e|0));return f|0}function bO(b,e,f,g,i){b=b|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0.0;D=l;l=l+96|0;A=D+16|0;t=D;x=D+92|0;y=D+88|0;u=D+80|0;m=c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0;z=uC(m)|0;B=aO(b,g)|0;n=b;while(1){o=c[n+16>>2]|0;if(!(a[o+112>>0]|0))break;n=c[o+116>>2]|0}if((a[i+8>>0]|0)==0?(j=c[m+16>>2]|0,k=c[e+16>>2]|0,(c[j+232>>2]|0)==(c[k+232>>2]|0)):0){p=(c[j+236>>2]|0)>(c[k+236>>2]|0);w=p?m:e;m=p?e:m}else w=e;F=(m|0)==(c[((c[n>>2]&3|0)==3?n:n+48|0)+40>>2]|0);p=c[o+40>>2]|0;e=c[o+80>>2]|0;k=d[o+86>>0]|0;E=d[o+46>>0]|0;n=F?k:E;j=F?p:e;o=F?e:p;p=g+-4|0;g=t+8|0;e=u+4|0;if((((F?E:k)|0)!=0?(r=m+16|0,q=c[(c[r>>2]|0)+8>>2]|0,(q|0)!=0):0)?(c[(c[q+4>>2]|0)+12>>2]|0)!=0:0){c[u>>2]=m;c[e>>2]=j;k=0;while(1){if((k|0)>=(p|0))break;j=k+3|0;F=c[r>>2]|0;h[t>>3]=+h[f+(j<<4)>>3]-+h[F+16>>3];h[g>>3]=+h[f+(j<<4)+8>>3]-+h[F+24>>3];F=c[(c[(c[F+8>>2]|0)+4>>2]|0)+12>>2]|0;c[A>>2]=c[t>>2];c[A+4>>2]=c[t+4>>2];c[A+8>>2]=c[t+8>>2];c[A+12>>2]=c[t+12>>2];if(!((vb[F&127](u,A)|0)<<24>>24))break;else k=j}c[x>>2]=k;$N(u,m,f+(k<<4)|0,1)}else{c[x>>2]=0;k=0}if(((n|0)!=0?(v=w+16|0,s=c[(c[v>>2]|0)+8>>2]|0,(s|0)!=0):0)?(c[(c[s+4>>2]|0)+12>>2]|0)!=0:0){c[u>>2]=w;c[e>>2]=o;j=p;while(1){if((j|0)<=0)break;F=c[v>>2]|0;h[t>>3]=+h[f+(j<<4)>>3]-+h[F+16>>3];h[g>>3]=+h[f+(j<<4)+8>>3]-+h[F+24>>3];F=c[(c[(c[F+8>>2]|0)+4>>2]|0)+12>>2]|0;c[A>>2]=c[t>>2];c[A+4>>2]=c[t+4>>2];c[A+8>>2]=c[t+8>>2];c[A+12>>2]=c[t+12>>2];if(!((vb[F&127](u,A)|0)<<24>>24))break;j=j+-3|0}c[y>>2]=j;$N(u,w,f+(j<<4)|0,0)}else{c[y>>2]=p;j=p}while(1){if((k|0)>=(p|0))break;e=k+3|0;H=+h[f+(k<<4)>>3]-+h[f+(e<<4)>>3];G=+h[f+(k<<4)+8>>3]-+h[f+(e<<4)+8>>3];if(H*H+G*G<1.0e-06)k=e;else break}c[x>>2]=k;while(1){if((j|0)<=0)break;F=j+3|0;G=+h[f+(j<<4)>>3]-+h[f+(F<<4)>>3];H=+h[f+(j<<4)+8>>3]-+h[f+(F<<4)+8>>3];if(!(G*G+H*H<1.0e-06))break;j=j+-3|0}c[y>>2]=j;cO(b,w,f,x,y,B,i);p=c[x>>2]|0;m=(c[y>>2]|0)+4|0;n=A+16|0;o=A+32|0;g=A+48|0;k=z+16|0;j=p;while(1){if((j|0)>=(m|0))break;F=(c[B>>2]|0)+(j-p<<4)|0;e=f+(j<<4)|0;c[F>>2]=c[e>>2];c[F+4>>2]=c[e+4>>2];c[F+8>>2]=c[e+8>>2];c[F+12>>2]=c[e+12>>2];c[A>>2]=c[e>>2];c[A+4>>2]=c[e+4>>2];c[A+8>>2]=c[e+8>>2];c[A+12>>2]=c[e+12>>2];e=j+1|0;if((e|0)>=(m|0)){C=35;break}E=(c[B>>2]|0)+(e-p<<4)|0;F=f+(e<<4)|0;c[E>>2]=c[F>>2];c[E+4>>2]=c[F+4>>2];c[E+8>>2]=c[F+8>>2];c[E+12>>2]=c[F+12>>2];c[n>>2]=c[F>>2];c[n+4>>2]=c[F+4>>2];c[n+8>>2]=c[F+8>>2];c[n+12>>2]=c[F+12>>2];F=j+2|0;E=(c[B>>2]|0)+(F-p<<4)|0;F=f+(F<<4)|0;c[E>>2]=c[F>>2];c[E+4>>2]=c[F+4>>2];c[E+8>>2]=c[F+8>>2];c[E+12>>2]=c[F+12>>2];c[o>>2]=c[F>>2];c[o+4>>2]=c[F+4>>2];c[o+8>>2]=c[F+8>>2];c[o+12>>2]=c[F+12>>2];F=j+3|0;E=f+(F<<4)|0;c[g>>2]=c[E>>2];c[g+4>>2]=c[E+4>>2];c[g+8>>2]=c[E+8>>2];c[g+12>>2]=c[E+12>>2];jI((c[k>>2]|0)+16|0,A);j=F}c[B+4>>2]=m-p;l=D;return}function cO(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+16|0;m=p+4|0;n=p;o=b;while(1){j=c[(c[o+16>>2]|0)+116>>2]|0;if(!j)break;else o=j}if(!(a[i+8>>0]|0))k=(pb[c[i>>2]&63](o)|0)&255;else k=0;FH(o,m,n);j=i+4|0;if((pb[c[j>>2]&63](d)|0)<<24>>24)c[n>>2]=0;if(!((pb[c[j>>2]&63](c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0)|0)<<24>>24))b=c[m>>2]|0;else{c[m>>2]=0;b=0}if(k){d=c[n>>2]|0;c[m>>2]=d;c[n>>2]=b;b=d}if(!(a[i+9>>0]|0)){if(b|0)c[f>>2]=UH(o,e,c[f>>2]|0,c[g>>2]|0,h,b)|0;j=c[n>>2]|0;if(j|0)c[g>>2]=SH(o,e,c[f>>2]|0,c[g>>2]|0,h,j)|0}else{j=c[n>>2]|0;if(j|b|0)VH(o,e,c[f>>2]|0,c[g>>2]|0,h,b,j)}l=p;return}function dO(a,b){a=a|0;b=b|0;var d=0,e=0;if(+h[b>>3]<+h[b+16>>3]?+h[b+8>>3]<+h[b+24>>3]:0){d=c[a+84>>2]|0;e=a+80|0;a=c[e>>2]|0;c[e>>2]=a+1;a=d+(a<<5)|0;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];c[a+16>>2]=c[b+16>>2];c[a+20>>2]=c[b+20>>2];c[a+24>>2]=c[b+24>>2];c[a+28>>2]=c[b+28>>2]}return}function eO(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0.0,k=0.0,m=0.0,n=0,o=0.0,p=0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0;D=l;l=l+112|0;A=D+72|0;r=D+56|0;p=D+16|0;s=D;n=c[d>>2]&3;t=d+48|0;B=c[((n|0)==3?d:t)+40>>2]|0;u=d+16|0;z=c[u>>2]|0;i=z+16|0;if(a[z+47>>0]|0){UN(p,B,c[((n|0)==2?d:d+-48|0)+40>>2]|0,i);n=p;p=i+40|0;do{c[i>>2]=c[n>>2];i=i+4|0;n=n+4|0}while((i|0)<(p|0))}w=B+16|0;n=c[w>>2]|0;i=c[n+8>>2]|0;if(!i)p=0;else p=c[(c[i+4>>2]|0)+16>>2]|0;z=n+16|0;n=(c[u>>2]|0)+16|0;c[r>>2]=c[z>>2];c[r+4>>2]=c[z+4>>2];c[r+8>>2]=c[z+8>>2];c[r+12>>2]=c[z+12>>2];c[A>>2]=c[n>>2];c[A+4>>2]=c[n+4>>2];c[A+8>>2]=c[n+8>>2];c[A+12>>2]=c[n+12>>2];fO(s,r,A);c[b>>2]=c[s>>2];c[b+4>>2]=c[s+4>>2];c[b+8>>2]=c[s+8>>2];c[b+12>>2]=c[s+12>>2];n=b+16|0;if(!(g<<24>>24)){i=c[u>>2]|0;if(!(a[i+45>>0]|0))i=0;else{j=+h[i+32>>3];C=9}}else{j=+gO(c[((c[d>>2]&3|0)==3?d:t)+40>>2]|0);C=9}if((C|0)==9){h[n>>3]=j;i=1}a[b+29>>0]=i;c[b+80>>2]=0;c[b+88>>2]=d;y=f+32|0;c[y>>2]=c[b>>2];c[y+4>>2]=c[b+4>>2];c[y+8>>2]=c[b+8>>2];c[y+12>>2]=c[b+12>>2];y=f+48|0;z=f+52|0;t=b+8|0;g=f+56|0;switch(e|0){case 1:{i=c[w>>2]|0;if((a[i+156>>0]|0)==0?(s=a[(c[u>>2]|0)+49>>0]|0,x=s&255,s<<24>>24!=0):0){c[A>>2]=c[f>>2];c[A+4>>2]=c[f+4>>2];c[A+8>>2]=c[f+8>>2];c[A+12>>2]=c[f+12>>2];c[A+16>>2]=c[f+16>>2];c[A+20>>2]=c[f+20>>2];c[A+24>>2]=c[f+24>>2];c[A+28>>2]=c[f+28>>2];s=A+16|0;r=i+80|0;o=+h[t>>3];p=i+24|0;do if(!(x&4)){i=A+24|0;if(x&1|0){c[y>>2]=1;h[i>>3]=+h[(+h[i>>3]>o?s:b)+8>>3];c[g>>2]=c[A>>2];c[g+4>>2]=c[A+4>>2];c[g+8>>2]=c[A+8>>2];c[g+12>>2]=c[A+12>>2];c[g+16>>2]=c[A+16>>2];c[g+20>>2]=c[A+20>>2];c[g+24>>2]=c[A+24>>2];c[g+28>>2]=c[A+28>>2];i=1;break}n=A+8|0;k=+h[b>>3];j=+h[p>>3]-+h[r>>3]*.5;if(!(x&8)){c[y>>2]=2;h[A>>3]=k;h[n>>3]=j;h[i>>3]=o;c[g>>2]=c[A>>2];c[g+4>>2]=c[A+4>>2];c[g+8>>2]=c[A+8>>2];c[g+12>>2]=c[A+12>>2];c[g+16>>2]=c[A+16>>2];c[g+20>>2]=c[A+20>>2];c[g+24>>2]=c[A+24>>2];c[g+28>>2]=c[A+28>>2];i=1;break}else{c[y>>2]=8;h[s>>3]=k;h[n>>3]=j;h[i>>3]=o;c[g>>2]=c[A>>2];c[g+4>>2]=c[A+4>>2];c[g+8>>2]=c[A+8>>2];c[g+12>>2]=c[A+12>>2];c[g+16>>2]=c[A+16>>2];c[g+20>>2]=c[A+20>>2];c[g+24>>2]=c[A+24>>2];c[g+28>>2]=c[A+28>>2];i=1;break}}else{c[y>>2]=4;m=+h[A>>3];j=+h[p>>3]+ +h[r>>3]*.5;k=+h[s>>3];if(+h[b>>3]<+h[i+16>>3]){m=m+-1.0;q=j+ +((c[(c[(uC(B)|0)+16>>2]|0)+252>>2]|0)/2|0|0);i=c[w>>2]|0;h[s>>3]=+h[i+16>>3]-+h[i+88>>3];h[A+24>>3]=o;h[A+8>>3]=+h[i+24>>3]-+h[i+80>>3]*.5;h[A>>3]=m;h[f+56>>3]=m;h[f+64>>3]=o;h[f+72>>3]=k;h[f+80>>3]=q;i=f+88|0;c[i>>2]=c[A>>2];c[i+4>>2]=c[A+4>>2];c[i+8>>2]=c[A+8>>2];c[i+12>>2]=c[A+12>>2];c[i+16>>2]=c[A+16>>2];c[i+20>>2]=c[A+20>>2];c[i+24>>2]=c[A+24>>2];c[i+28>>2]=c[A+28>>2];i=2;break}else{k=k+1.0;q=j+ +((c[(c[(uC(B)|0)+16>>2]|0)+252>>2]|0)/2|0|0);i=c[w>>2]|0;h[A>>3]=+h[i+16>>3]+ +h[i+96>>3]+0.0;h[A+24>>3]=o;h[A+8>>3]=+h[i+24>>3]-+h[i+80>>3]*.5;h[s>>3]=k;h[f+56>>3]=m;h[f+64>>3]=o;h[f+72>>3]=k;h[f+80>>3]=q;i=f+88|0;c[i>>2]=c[A>>2];c[i+4>>2]=c[A+4>>2];c[i+8>>2]=c[A+8>>2];c[i+12>>2]=c[A+12>>2];c[i+16>>2]=c[A+16>>2];c[i+20>>2]=c[A+20>>2];c[i+24>>2]=c[A+24>>2];c[i+28>>2]=c[A+28>>2];i=2;break}}while(0);c[z>>2]=i;while(1){i=c[d+16>>2]|0;if(!(a[i+112>>0]|0))break;d=c[i+116>>2]|0}a[((B|0)==(c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0)?i+16|0:i+56|0)+30>>0]=0}else{d=1;C=47}break}case 2:{x=a[(c[u>>2]|0)+49>>0]|0;s=x&255;if(!(x<<24>>24))C=46;else{c[A>>2]=c[f>>2];c[A+4>>2]=c[f+4>>2];c[A+8>>2]=c[f+8>>2];c[A+12>>2]=c[f+12>>2];c[A+16>>2]=c[f+16>>2];c[A+20>>2]=c[f+20>>2];c[A+24>>2]=c[f+24>>2];c[A+28>>2]=c[f+28>>2];n=A+8|0;do if(!(s&4)){i=A+16|0;p=A+24|0;r=(c[y>>2]|0)==4;if(s&1|0)if(r){x=c[w>>2]|0;q=+h[x+24>>3]-+h[x+80>>3]*.5;o=+h[i>>3]+1.0;k=+h[b>>3];m=q-+((c[(c[(uC(B)|0)+16>>2]|0)+252>>2]|0)/2|0|0);b=c[w>>2]|0;h[A>>3]=+h[b+16>>3]+ +h[b+96>>3]+0.0;h[n>>3]=q;h[p>>3]=+h[b+24>>3]+ +h[b+80>>3]*.5;h[i>>3]=o;h[f+56>>3]=k;h[f+64>>3]=m;h[f+72>>3]=o;h[f+80>>3]=q;i=f+88|0;c[i>>2]=c[A>>2];c[i+4>>2]=c[A+4>>2];c[i+8>>2]=c[A+8>>2];c[i+12>>2]=c[A+12>>2];c[i+16>>2]=c[A+16>>2];c[i+20>>2]=c[A+20>>2];c[i+24>>2]=c[A+24>>2];c[i+28>>2]=c[A+28>>2];i=2;break}else{h[p>>3]=+h[(+h[p>>3]>+h[t>>3]?i:b)+8>>3];c[g>>2]=c[A>>2];c[g+4>>2]=c[A+4>>2];c[g+8>>2]=c[A+8>>2];c[g+12>>2]=c[A+12>>2];c[g+16>>2]=c[A+16>>2];c[g+20>>2]=c[A+20>>2];c[g+24>>2]=c[A+24>>2];c[g+28>>2]=c[A+28>>2];i=1;break}q=+h[b>>3];b=c[w>>2]|0;k=+h[t>>3];o=+h[b+80>>3]*.5;j=k+1.0;E=+h[b+24>>3];m=E-o;o=E+o;if(!(s&8)){h[A>>3]=q;if(r){h[p>>3]=o;j=k;i=A}else h[n>>3]=m;h[i+8>>3]=j;c[g>>2]=c[A>>2];c[g+4>>2]=c[A+4>>2];c[g+8>>2]=c[A+8>>2];c[g+12>>2]=c[A+12>>2];c[g+16>>2]=c[A+16>>2];c[g+20>>2]=c[A+20>>2];c[g+24>>2]=c[A+24>>2];c[g+28>>2]=c[A+28>>2];i=1;break}else{h[i>>3]=q+1.0;if(r){h[p>>3]=o;j=k+-1.0;i=A}else h[n>>3]=m;h[i+8>>3]=j;c[g>>2]=c[A>>2];c[g+4>>2]=c[A+4>>2];c[g+8>>2]=c[A+8>>2];c[g+12>>2]=c[A+12>>2];c[g+16>>2]=c[A+16>>2];c[g+20>>2]=c[A+20>>2];c[g+24>>2]=c[A+24>>2];c[g+28>>2]=c[A+28>>2];i=1;break}}else{h[n>>3]=+h[(+h[n>>3]<+h[t>>3]?A:b)+8>>3];c[g>>2]=c[A>>2];c[g+4>>2]=c[A+4>>2];c[g+8>>2]=c[A+8>>2];c[g+12>>2]=c[A+12>>2];c[g+16>>2]=c[A+16>>2];c[g+20>>2]=c[A+20>>2];c[g+24>>2]=c[A+24>>2];c[g+28>>2]=c[A+28>>2];i=1}while(0);c[z>>2]=i;while(1){i=c[d+16>>2]|0;if(!(a[i+112>>0]|0))break;d=c[i+116>>2]|0}a[((B|0)==(c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0)?i+16|0:i+56|0)+30>>0]=0;c[y>>2]=s}break}default:C=46}if((C|0)==46){d=c[y>>2]|0;C=47}a:do if((C|0)==47){if(p|0?(v=wb[p&63](B,(c[u>>2]|0)+16|0,d,g,z)|0,v|0):0){c[y>>2]=v;break};c[g>>2]=c[f>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];c[g+12>>2]=c[f+12>>2];c[g+16>>2]=c[f+16>>2];c[g+20>>2]=c[f+20>>2];c[g+24>>2]=c[f+24>>2];c[g+28>>2]=c[f+28>>2];c[z>>2]=1;switch(e|0){case 8:{Aa(138697,106815,569,106825);break}case 2:{h[((c[y>>2]|0)==4?g:f+72|0)+8>>3]=+h[t>>3];break a}case 1:{h[f+80>>3]=+h[t>>3];c[y>>2]=1;break a}default:break a}}while(0);l=D;return}function fO(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=+h[b+8>>3]+ +h[c+8>>3];h[a>>3]=+h[b>>3]+ +h[c>>3];h[a+8>>3]=d;return}function gO(a){a=a|0;var b=0.0,d=0,e=0,f=0.0,g=0,i=0,j=0,k=0.0,l=0.0;i=c[a+16>>2]|0;j=c[i+172>>2]|0;f=0.0;g=0;while(1){a=c[j+(g<<2)>>2]|0;if(!a)break;f=f+ +h[(c[(c[((c[a>>2]&3|0)==3?a:a+48|0)+40>>2]|0)+16>>2]|0)+16>>3];g=g+1|0}e=c[i+180>>2]|0;b=0.0;a=0;while(1){d=c[e+(a<<2)>>2]|0;if(!d)break;b=b+ +h[(c[(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)+16>>2]|0)+16>>3];a=a+1|0}k=+h[i+16>>3];l=+h[i+24>>3];j=c[j>>2]|0;f=+O(+(l-+h[(c[(c[((c[j>>2]&3|0)==3?j:j+48|0)+40>>2]|0)+16>>2]|0)+24>>3]),+(k-f/+(g|0)));j=c[e>>2]|0;return +((f+ +O(+(+h[(c[(c[((c[j>>2]&3|0)==2?j:j+-48|0)+40>>2]|0)+16>>2]|0)+24>>3]-l),+(b/+(a|0)-k)))*.5)}function hO(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0.0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;F=l;l=l+112|0;C=F+72|0;r=F+56|0;p=F+16|0;t=F;o=c[d>>2]&3;v=d+-48|0;D=c[((o|0)==2?d:v)+40>>2]|0;x=d+16|0;B=c[x>>2]|0;i=B+56|0;if(a[B+87>>0]|0){UN(p,D,c[((o|0)==3?d:d+48|0)+40>>2]|0,i);o=p;p=i+40|0;do{c[i>>2]=c[o>>2];i=i+4|0;o=o+4|0}while((i|0)<(p|0))}z=D+16|0;o=c[z>>2]|0;i=c[o+8>>2]|0;if(!i)p=0;else p=c[(c[i+4>>2]|0)+16>>2]|0;w=b+40|0;B=o+16|0;o=(c[x>>2]|0)+56|0;c[r>>2]=c[B>>2];c[r+4>>2]=c[B+4>>2];c[r+8>>2]=c[B+8>>2];c[r+12>>2]=c[B+12>>2];c[C>>2]=c[o>>2];c[C+4>>2]=c[o+4>>2];c[C+8>>2]=c[o+8>>2];c[C+12>>2]=c[o+12>>2];fO(t,r,C);c[w>>2]=c[t>>2];c[w+4>>2]=c[t+4>>2];c[w+8>>2]=c[t+8>>2];c[w+12>>2]=c[t+12>>2];o=b+56|0;if(!(g<<24>>24)){i=c[x>>2]|0;if(!(a[i+85>>0]|0))u=0;else{h[o>>3]=+h[i+72>>3];u=1}}else{s=+gO(c[((c[d>>2]&3|0)==2?d:v)+40>>2]|0)+3.141592653589793;h[o>>3]=s;if(s<6.283185307179586)u=1;else Aa(106835,106815,606,106859)}a[b+69>>0]=u;B=f+32|0;c[B>>2]=c[w>>2];c[B+4>>2]=c[w+4>>2];c[B+8>>2]=c[w+8>>2];c[B+12>>2]=c[w+12>>2];B=f+48|0;g=f+52|0;v=f+56|0;t=b+48|0;switch(e|0){case 1:{i=c[z>>2]|0;if((a[i+156>>0]|0)==0?(b=a[(c[x>>2]|0)+89>>0]|0,A=b&255,b<<24>>24!=0):0){c[C>>2]=c[f>>2];c[C+4>>2]=c[f+4>>2];c[C+8>>2]=c[f+8>>2];c[C+12>>2]=c[f+12>>2];c[C+16>>2]=c[f+16>>2];c[C+20>>2]=c[f+20>>2];c[C+24>>2]=c[f+24>>2];c[C+28>>2]=c[f+28>>2];p=C+8|0;s=+h[t>>3];do if(!(A&4)){o=C+16|0;q=+h[w>>3];j=+h[i+80>>3]*.5;n=+h[i+24>>3];if(!(A&1)){i=C+24|0;j=n+j;if(!(A&8)){c[B>>2]=2;h[C>>3]=q;h[i>>3]=j;h[p>>3]=s;c[v>>2]=c[C>>2];c[v+4>>2]=c[C+4>>2];c[v+8>>2]=c[C+8>>2];c[v+12>>2]=c[C+12>>2];c[v+16>>2]=c[C+16>>2];c[v+20>>2]=c[C+20>>2];c[v+24>>2]=c[C+24>>2];c[v+28>>2]=c[C+28>>2];i=1;break}else{c[B>>2]=8;h[o>>3]=q;h[i>>3]=j;h[p>>3]=s;c[v>>2]=c[C>>2];c[v+4>>2]=c[C+4>>2];c[v+8>>2]=c[C+8>>2];c[v+12>>2]=c[C+12>>2];c[v+16>>2]=c[C+16>>2];c[v+20>>2]=c[C+20>>2];c[v+24>>2]=c[C+24>>2];c[v+28>>2]=c[C+28>>2];i=1;break}}else{c[B>>2]=1;k=+h[C>>3];m=+h[o>>3];j=n-j;if(q<+h[i+16>>3]){n=k+-1.0;q=j-+((c[(c[(uC(D)|0)+16>>2]|0)+252>>2]|0)/2|0|0);i=c[z>>2]|0;h[o>>3]=+h[i+16>>3]-+h[i+88>>3];h[p>>3]=s;h[C+24>>3]=+h[i+24>>3]+ +h[i+80>>3]*.5;h[C>>3]=n;h[f+56>>3]=n;h[f+64>>3]=q;h[f+72>>3]=m;h[f+80>>3]=s;i=f+88|0;c[i>>2]=c[C>>2];c[i+4>>2]=c[C+4>>2];c[i+8>>2]=c[C+8>>2];c[i+12>>2]=c[C+12>>2];c[i+16>>2]=c[C+16>>2];c[i+20>>2]=c[C+20>>2];c[i+24>>2]=c[C+24>>2];c[i+28>>2]=c[C+28>>2];i=2;break}else{q=m+1.0;n=j-+((c[(c[(uC(D)|0)+16>>2]|0)+252>>2]|0)/2|0|0);i=c[z>>2]|0;h[C>>3]=+h[i+16>>3]+ +h[i+96>>3]+0.0;h[p>>3]=s;h[C+24>>3]=+h[i+24>>3]+ +h[i+80>>3]*.5;h[o>>3]=q;h[f+56>>3]=k;h[f+64>>3]=n;h[f+72>>3]=q;h[f+80>>3]=s;i=f+88|0;c[i>>2]=c[C>>2];c[i+4>>2]=c[C+4>>2];c[i+8>>2]=c[C+8>>2];c[i+12>>2]=c[C+12>>2];c[i+16>>2]=c[C+16>>2];c[i+20>>2]=c[C+20>>2];c[i+24>>2]=c[C+24>>2];c[i+28>>2]=c[C+28>>2];i=2;break}}}else{c[B>>2]=4;h[p>>3]=+h[(+h[p>>3]>3];c[v>>2]=c[C>>2];c[v+4>>2]=c[C+4>>2];c[v+8>>2]=c[C+8>>2];c[v+12>>2]=c[C+12>>2];c[v+16>>2]=c[C+16>>2];c[v+20>>2]=c[C+20>>2];c[v+24>>2]=c[C+24>>2];c[v+28>>2]=c[C+28>>2];i=1}while(0);c[g>>2]=i;while(1){i=c[d+16>>2]|0;if(!(a[i+112>>0]|0))break;d=c[i+116>>2]|0}a[((D|0)==(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)?i+56|0:i+16|0)+30>>0]=0;c[B>>2]=A}else{d=4;E=47}break}case 2:{A=a[(c[x>>2]|0)+89>>0]|0;u=A&255;if(!(A<<24>>24))E=46;else{c[C>>2]=c[f>>2];c[C+4>>2]=c[f+4>>2];c[C+8>>2]=c[f+8>>2];c[C+12>>2]=c[f+12>>2];c[C+16>>2]=c[f+16>>2];c[C+20>>2]=c[f+20>>2];c[C+24>>2]=c[f+24>>2];c[C+28>>2]=c[f+28>>2];o=C+8|0;do if(!(u&4)){i=C+16|0;p=C+24|0;r=(c[B>>2]|0)==4;if(u&1|0)if(r){m=+h[C>>3]+-1.0;i=c[z>>2]|0;s=+h[i+24>>3]-+h[i+80>>3]*.5;q=+h[w>>3];n=s-+((c[(c[(uC(D)|0)+16>>2]|0)+252>>2]|0)/2|0|0);i=c[z>>2]|0;h[C+16>>3]=+h[i+16>>3]-+h[i+88>>3]+-2.0;h[o>>3]=s;h[p>>3]=+h[i+24>>3]+ +h[i+80>>3]*.5;h[C>>3]=m;h[f+56>>3]=m;h[f+64>>3]=n;h[f+72>>3]=q;h[f+80>>3]=s;i=f+88|0;c[i>>2]=c[C>>2];c[i+4>>2]=c[C+4>>2];c[i+8>>2]=c[C+8>>2];c[i+12>>2]=c[C+12>>2];c[i+16>>2]=c[C+16>>2];c[i+20>>2]=c[C+20>>2];c[i+24>>2]=c[C+24>>2];c[i+28>>2]=c[C+28>>2];i=2;break}else{h[p>>3]=+h[(+h[p>>3]>+h[b+8>>3]?i:b)+8>>3];c[v>>2]=c[C>>2];c[v+4>>2]=c[C+4>>2];c[v+8>>2]=c[C+8>>2];c[v+12>>2]=c[C+12>>2];c[v+16>>2]=c[C+16>>2];c[v+20>>2]=c[C+20>>2];c[v+24>>2]=c[C+24>>2];c[v+28>>2]=c[C+28>>2];i=1;break}q=+h[w>>3];f=c[z>>2]|0;k=+h[t>>3];j=k+-1.0;s=+h[f+24>>3];n=+h[f+80>>3]*.5;m=s-n;n=s+n;if(!(u&8)){h[C>>3]=q+-1.0;if(r){h[p>>3]=n;i=C}else{h[o>>3]=m;j=k}h[i+8>>3]=j;c[v>>2]=c[C>>2];c[v+4>>2]=c[C+4>>2];c[v+8>>2]=c[C+8>>2];c[v+12>>2]=c[C+12>>2];c[v+16>>2]=c[C+16>>2];c[v+20>>2]=c[C+20>>2];c[v+24>>2]=c[C+24>>2];c[v+28>>2]=c[C+28>>2];i=1;break}else{h[i>>3]=q+1.0;if(r){h[p>>3]=n;i=C}else{h[o>>3]=m;j=k+1.0}h[i+8>>3]=j;c[v>>2]=c[C>>2];c[v+4>>2]=c[C+4>>2];c[v+8>>2]=c[C+8>>2];c[v+12>>2]=c[C+12>>2];c[v+16>>2]=c[C+16>>2];c[v+20>>2]=c[C+20>>2];c[v+24>>2]=c[C+24>>2];c[v+28>>2]=c[C+28>>2];i=1;break}}else{h[o>>3]=+h[(+h[o>>3]<+h[t>>3]?C:w)+8>>3];c[v>>2]=c[C>>2];c[v+4>>2]=c[C+4>>2];c[v+8>>2]=c[C+8>>2];c[v+12>>2]=c[C+12>>2];c[v+16>>2]=c[C+16>>2];c[v+20>>2]=c[C+20>>2];c[v+24>>2]=c[C+24>>2];c[v+28>>2]=c[C+28>>2];i=1}while(0);c[g>>2]=i;while(1){i=c[d+16>>2]|0;if(!(a[i+112>>0]|0))break;d=c[i+116>>2]|0}a[((D|0)==(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)?i+56|0:i+16|0)+30>>0]=0;c[B>>2]=u}break}default:E=46}if((E|0)==46){d=c[B>>2]|0;E=47}a:do if((E|0)==47){if(p|0?(y=wb[p&63](D,(c[x>>2]|0)+56|0,d,v,g)|0,y|0):0){c[B>>2]=y;break};c[v>>2]=c[f>>2];c[v+4>>2]=c[f+4>>2];c[v+8>>2]=c[f+8>>2];c[v+12>>2]=c[f+12>>2];c[v+16>>2]=c[f+16>>2];c[v+20>>2]=c[f+20>>2];c[v+24>>2]=c[f+24>>2];c[v+28>>2]=c[f+28>>2];c[g>>2]=1;switch(e|0){case 8:{Aa(138697,106815,765,106859);break}case 2:{h[((c[B>>2]|0)==4?v:f+72|0)+8>>3]=+h[t>>3];break a}case 1:{h[f+64>>3]=+h[t>>3];c[B>>2]=4;break a}default:break a}}while(0);l=F;return}function iO(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0;g=c[b+16>>2]|0;i=c[g+96>>2]|0;if((a[g+44>>0]|0)==0?(a[g+84>>0]|0)==0:0)j=6;else{d=a[g+49>>0]|0;e=d&255;if(((e&8|0)==0?(f=a[g+89>>0]|0,(f&8)==0):0)?((e&5|0)==0?1:d<<24>>24!=f<<24>>24):0)j=6;else b=0}if((j|0)==6)if(!i)b=18;else{b=(c[(c[(uC(c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)|0)+16>>2]|0)+116>>2]&1|0)!=0;b=~~(+h[(b?i+32|0:i+24|0)>>3]+18.0)}return b|0}function jO(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=+g;h=+h;i=i|0;var j=0,k=0,l=0,m=0;b=c[(c[d+(e<<2)>>2]|0)+16>>2]|0;if((a[b+44>>0]|0)==0?(a[b+84>>0]|0)==0:0)l=6;else l=3;do if((l|0)==3){j=a[b+49>>0]|0;k=j&255;b=b+89|0;if((k&8|0)==0?(m=a[b>>0]|0,(m&8)==0):0){if((k&5|0)==0?1:j<<24>>24!=m<<24>>24){l=6;break}if(k&4|0){lO(d,e,f,g,h,i);break}if(!(k&1))Aa(138697,106815,1231,106867);else{nO(d,e,f,g,h,i);break}}if((k&2|0)==0?(a[b>>0]&2)==0:0){mO(d,e,f,g,h,i);break}lO(d,e,f,g,h,i)}while(0);if((l|0)==6)kO(d,e,f,g,h,i);return}function kO(b,e,f,g,i,j){b=b|0;e=e|0;f=f|0;g=+g;i=+i;j=j|0;var k=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0.0,C=0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0.0,Q=0.0,R=0;O=l;l=l+16080|0;K=O+80|0;L=O+64|0;M=O+48|0;N=O+32|0;I=O+16|0;J=O;A=c[b+(e<<2)>>2]|0;i=i*.5/+(f|0);i=i>2.0?i:2.0;C=(c[((c[A>>2]&3|0)==3?A:A+48|0)+40>>2]|0)+16|0;z=c[C>>2]|0;B=+h[z+16>>3];G=+h[z+24>>3];A=c[A+16>>2]|0;D=B+ +h[A+16>>3];E=G+ +h[A+24>>3];F=B+ +h[A+56>>3];G=G+ +h[A+64>>3];k=!(E>=G)?-1:1;m=+h[z+96>>3];switch(oO(d[A+49>>0]|0,d[A+89>>0]|0)|0){case 65:case 32:{if(E==G)k=0-k|0;break}default:{}}P=B+m;o=(P-D)*3.0;P=(P-F)*3.0;u=i*+(k|0);t=K+8|0;v=K+16|0;w=K+32|0;x=K+48|0;y=(E+G)*.5;z=K+64|0;A=K+80|0;r=K+96|0;s=K+104|0;q=0;n=0.0;i=m;o=m=(f|0))break;p=e+1|0;e=c[b+(e<<2)>>2]|0;i=i+g;o=o+g;m=m+g;n=u+n;h[K>>3]=D;h[t>>3]=E;P=E+n;pO(L,D+o/3.0,P);c[v>>2]=c[L>>2];c[v+4>>2]=c[L+4>>2];c[v+8>>2]=c[L+8>>2];c[v+12>>2]=c[L+12>>2];Q=B+i;pO(M,Q,P);c[w>>2]=c[M>>2];c[w+4>>2]=c[M+4>>2];c[w+8>>2]=c[M+8>>2];c[w+12>>2]=c[M+12>>2];pO(N,Q,y);c[x>>2]=c[N>>2];c[x+4>>2]=c[N+4>>2];c[x+8>>2]=c[N+8>>2];c[x+12>>2]=c[N+12>>2];P=G-n;pO(I,Q,P);c[z>>2]=c[I>>2];c[z+4>>2]=c[I+4>>2];c[z+8>>2]=c[I+8>>2];c[z+12>>2]=c[I+12>>2];pO(J,F+m/3.0,P);c[A>>2]=c[J>>2];c[A+4>>2]=c[J+4>>2];c[A+8>>2]=c[J+8>>2];c[A+12>>2]=c[J+12>>2];h[r>>3]=F;h[s>>3]=G;k=e+16|0;if((c[(c[k>>2]|0)+96>>2]|0)!=0?(R=(c[(c[(uC(c[((c[e>>2]&3|0)==3?e:e+48|0)+40>>2]|0)|0)+16>>2]|0)+116>>2]&1|0)==0,k=c[(c[k>>2]|0)+96>>2]|0,H=+h[(R?k+24|0:k+32|0)>>3],R=c[C>>2]|0,h[k+56>>3]=H*.5+(i+ +h[R+16>>3]),h[k+64>>3]=+h[R+24>>3],a[k+81>>0]=1,H>g):0)i=i+(H-g);bO(e,c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0,K,7,j);e=p;q=q+1|0}l=O;return}function lO(b,e,f,g,i,j){b=b|0;e=e|0;f=f|0;g=+g;i=+i;j=j|0;var k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0.0,R=0;P=l;l=l+16080|0;L=P+80|0;M=P+64|0;N=P+48|0;O=P+32|0;J=P+16|0;K=P;B=c[b+(e<<2)>>2]|0;q=g*.5/+(f|0);q=q>2.0?q:2.0;D=(c[((c[B>>2]&3|0)==3?B:B+48|0)+40>>2]|0)+16|0;k=c[D>>2]|0;g=+h[k+16>>3];C=+h[k+24>>3];B=c[B+16>>2]|0;E=g+ +h[B+16>>3];F=C+ +h[B+24>>3];G=g+ +h[B+56>>3];H=C+ +h[B+64>>3];p=!(E>=G)?-1.0:1.0;s=+h[k+80>>3]*.5;m=E-g;n=G-g;o=g-E;switch(oO(d[B+49>>0]|0,d[B+89>>0]|0)|0){case 15:{m=p*(q+(+h[k+96>>3]-n));break}case 38:{m=p*(q+(+h[k+88>>3]-(g-G)));break}case 41:{m=p*(q+(+h[k+96>>3]-m));break}case 48:{m=p*(q+(+h[k+96>>3]-m));break}case 58:case 57:case 51:case 47:case 37:case 14:{m=p*((+h[k+88>>3]-o+(+h[k+96>>3]-n))/3.0);break}case 73:{m=p*(q+(+h[k+88>>3]-o));break}case 83:{m=p*(+h[k+88>>3]-o);break}case 84:{m=p*(q+(+h[k+88>>3]-o+(+h[k+96>>3]-n))*.5);break}case 85:case 75:case 74:{m=p*(q*2.0+(+h[k+88>>3]-o+(+h[k+96>>3]-n))*.5);break}default:m=0.0}n=C+s;o=(n-F)*3.0;n=(n-H)*3.0;p=q*p;w=L+8|0;x=L+16|0;y=L+32|0;z=L+48|0;q=(E+G)*.5;A=L+64|0;B=L+80|0;u=L+96|0;v=L+104|0;t=0;g=s;o=s=(f|0))break;r=e+1|0;e=c[b+(e<<2)>>2]|0;g=g+i;o=o+i;n=n+i;m=p+m;h[L>>3]=E;h[w>>3]=F;s=E+m;pO(M,s,F+o/3.0);c[x>>2]=c[M>>2];c[x+4>>2]=c[M+4>>2];c[x+8>>2]=c[M+8>>2];c[x+12>>2]=c[M+12>>2];Q=C+g;pO(N,s,Q);c[y>>2]=c[N>>2];c[y+4>>2]=c[N+4>>2];c[y+8>>2]=c[N+8>>2];c[y+12>>2]=c[N+12>>2];pO(O,q,Q);c[z>>2]=c[O>>2];c[z+4>>2]=c[O+4>>2];c[z+8>>2]=c[O+8>>2];c[z+12>>2]=c[O+12>>2];s=G-m;pO(J,s,Q);c[A>>2]=c[J>>2];c[A+4>>2]=c[J+4>>2];c[A+8>>2]=c[J+8>>2];c[A+12>>2]=c[J+12>>2];pO(K,s,H+n/3.0);c[B>>2]=c[K>>2];c[B+4>>2]=c[K+4>>2];c[B+8>>2]=c[K+8>>2];c[B+12>>2]=c[K+12>>2];h[u>>3]=G;h[v>>3]=H;k=e+16|0;if((c[(c[k>>2]|0)+96>>2]|0)!=0?(R=(c[(c[(uC(c[((c[e>>2]&3|0)==3?e:e+48|0)+40>>2]|0)|0)+16>>2]|0)+116>>2]&1|0)==0,k=c[(c[k>>2]|0)+96>>2]|0,I=+h[(R?k+32|0:k+24|0)>>3],R=c[D>>2]|0,h[k+64>>3]=I*.5+(g+ +h[R+24>>3]),h[k+56>>3]=+h[R+16>>3],a[k+81>>0]=1,I>i):0)g=g+(I-i);bO(e,c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0,L,7,j);e=r;t=t+1|0}l=P;return}function mO(b,e,f,g,i,j){b=b|0;e=e|0;f=f|0;g=+g;i=+i;j=j|0;var k=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0.0,C=0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0.0,Q=0.0,R=0;O=l;l=l+16080|0;K=O+80|0;L=O+64|0;M=O+48|0;N=O+32|0;I=O+16|0;J=O;A=c[b+(e<<2)>>2]|0;i=i*.5/+(f|0);i=i>2.0?i:2.0;C=(c[((c[A>>2]&3|0)==3?A:A+48|0)+40>>2]|0)+16|0;z=c[C>>2]|0;B=+h[z+16>>3];G=+h[z+24>>3];A=c[A+16>>2]|0;D=B+ +h[A+16>>3];E=G+ +h[A+24>>3];F=B+ +h[A+56>>3];G=G+ +h[A+64>>3];k=!(E>=G)?-1:1;m=+h[z+88>>3];switch(oO(d[A+49>>0]|0,d[A+89>>0]|0)|0){case 67:case 12:{if(E==G)k=0-k|0;break}default:{}}o=(D+m-B)*3.0;P=(F+m-B)*3.0;u=i*+(k|0);t=K+8|0;v=K+16|0;w=K+32|0;x=K+48|0;y=(E+G)*.5;z=K+64|0;A=K+80|0;r=K+96|0;s=K+104|0;q=0;n=0.0;i=m;o=m=(f|0))break;p=e+1|0;e=c[b+(e<<2)>>2]|0;i=i+g;o=o+g;m=m+g;n=u+n;h[K>>3]=D;h[t>>3]=E;P=E+n;pO(L,D-o/3.0,P);c[v>>2]=c[L>>2];c[v+4>>2]=c[L+4>>2];c[v+8>>2]=c[L+8>>2];c[v+12>>2]=c[L+12>>2];Q=B-i;pO(M,Q,P);c[w>>2]=c[M>>2];c[w+4>>2]=c[M+4>>2];c[w+8>>2]=c[M+8>>2];c[w+12>>2]=c[M+12>>2];pO(N,Q,y);c[x>>2]=c[N>>2];c[x+4>>2]=c[N+4>>2];c[x+8>>2]=c[N+8>>2];c[x+12>>2]=c[N+12>>2];P=G-n;pO(I,Q,P);c[z>>2]=c[I>>2];c[z+4>>2]=c[I+4>>2];c[z+8>>2]=c[I+8>>2];c[z+12>>2]=c[I+12>>2];pO(J,F-m/3.0,P);c[A>>2]=c[J>>2];c[A+4>>2]=c[J+4>>2];c[A+8>>2]=c[J+8>>2];c[A+12>>2]=c[J+12>>2];h[r>>3]=F;h[s>>3]=G;k=e+16|0;if((c[(c[k>>2]|0)+96>>2]|0)!=0?(R=(c[(c[(uC(c[((c[e>>2]&3|0)==3?e:e+48|0)+40>>2]|0)|0)+16>>2]|0)+116>>2]&1|0)==0,k=c[(c[k>>2]|0)+96>>2]|0,H=+h[(R?k+24|0:k+32|0)>>3],R=c[C>>2]|0,h[k+56>>3]=+h[R+16>>3]-i-H*.5,h[k+64>>3]=+h[R+24>>3],a[k+81>>0]=1,H>g):0)i=i+(H-g);bO(e,c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0,K,7,j);e=p;q=q+1|0}l=O;return}function nO(b,e,f,g,i,j){b=b|0;e=e|0;f=f|0;g=+g;i=+i;j=j|0;var k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0,D=0,E=0.0,F=0,G=0,H=0.0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0.0,Q=0.0,R=0;O=l;l=l+16080|0;K=O+80|0;L=O+64|0;M=O+48|0;N=O+32|0;I=O+16|0;J=O;B=c[b+(e<<2)>>2]|0;A=g*.5/+(f|0);v=(c[((c[B>>2]&3|0)==3?B:B+48|0)+40>>2]|0)+16|0;C=c[v>>2]|0;y=+h[C+16>>3];u=+h[C+24>>3];B=c[B+16>>2]|0;w=y+ +h[B+16>>3];x=u+ +h[B+24>>3];y=y+ +h[B+56>>3];z=u+ +h[B+64>>3];t=!(w>=y)?-1:1;P=+h[C+80>>3]*.5;B=(oO(d[B+49>>0]|0,d[B+89>>0]|0)|0)==67;m=(x+P-u)*3.0;n=(z+P-u)*3.0;A=(A>2.0?A:2.0)*+((B?0-t|0:t)|0);t=K+8|0;B=K+16|0;C=K+32|0;D=K+48|0;E=(w+y)*.5;F=K+64|0;G=K+80|0;r=K+96|0;s=K+104|0;g=P;k=0.0;m=P=(f|0))break;q=e+1|0;o=c[b+(e<<2)>>2]|0;g=g+i;m=m+i;n=n+i;k=A+k;h[K>>3]=w;h[t>>3]=x;P=w+k;pO(L,P,x-m/3.0);c[B>>2]=c[L>>2];c[B+4>>2]=c[L+4>>2];c[B+8>>2]=c[L+8>>2];c[B+12>>2]=c[L+12>>2];Q=u-g;pO(M,P,Q);c[C>>2]=c[M>>2];c[C+4>>2]=c[M+4>>2];c[C+8>>2]=c[M+8>>2];c[C+12>>2]=c[M+12>>2];pO(N,E,Q);c[D>>2]=c[N>>2];c[D+4>>2]=c[N+4>>2];c[D+8>>2]=c[N+8>>2];c[D+12>>2]=c[N+12>>2];P=y-k;pO(I,P,Q);c[F>>2]=c[I>>2];c[F+4>>2]=c[I+4>>2];c[F+8>>2]=c[I+8>>2];c[F+12>>2]=c[I+12>>2];pO(J,P,z-n/3.0);c[G>>2]=c[J>>2];c[G+4>>2]=c[J+4>>2];c[G+8>>2]=c[J+8>>2];c[G+12>>2]=c[J+12>>2];h[r>>3]=y;h[s>>3]=z;e=o+16|0;if((c[(c[e>>2]|0)+96>>2]|0)!=0?(R=(c[(c[(uC(c[((c[o>>2]&3|0)==3?o:o+48|0)+40>>2]|0)|0)+16>>2]|0)+116>>2]&1|0)==0,e=c[(c[e>>2]|0)+96>>2]|0,H=+h[(R?e+32|0:e+24|0)>>3],R=c[v>>2]|0,h[e+64>>3]=+h[R+24>>3]-g-H*.5,h[e+56>>3]=+h[R+16>>3],a[e+81>>0]=1,H>i):0)g=g+(H-i);bO(o,c[((c[o>>2]&3|0)==2?o:o+-48|0)+40>>2]|0,K,7,j);e=q;p=p+1|0}l=O;return}function oO(a,b){a=a|0;b=b|0;var d=0;d=0;while(1){if((d|0)>=8){b=-1;break}if((c[22092+(d<<2)>>2]|0)==(b|0)){b=d;break}d=d+1|0}d=0;while(1){if((d|0)>=8){d=-1;break}if((c[22092+(d<<2)>>2]|0)==(a|0))break;d=d+1|0}if((d|b|0)<0)d=0;else d=c[22124+(d<<5)+(b<<2)>>2]|0;return d|0}function pO(a,b,c){a=a|0;b=+b;c=+c;h[a>>3]=b;h[a+8>>3]=c;return}function qO(b){b=b|0;var d=0,e=0,f=0;if((c[47272]|0)!=0|(c[47271]|0)!=0){e=b+16|0;f=c[(c[e>>2]|0)+100>>2]|0;d=b+48|0;if((f|0?(a[f+81>>0]|0)==0:0)?rO(b,1)|0:0){f=uC(c[((c[b>>2]&3|0)==3?b:d)+40>>2]|0)|0;xP(f,c[(c[e>>2]|0)+100>>2]|0)}f=c[(c[e>>2]|0)+104>>2]|0;if((f|0?(a[f+81>>0]|0)==0:0)?rO(b,0)|0:0){f=uC(c[((c[b>>2]&3|0)==3?b:d)+40>>2]|0)|0;xP(f,c[(c[e>>2]|0)+104>>2]|0)}}return}function rO(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0.0,i=0,j=0.0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;r=l;l=l+96|0;p=r+32|0;m=r+16|0;o=r;i=b+16|0;do if((a[(c[i>>2]|0)+112>>0]|0)!=6){e=c[47272]|0;if(!((e|0)!=0?(a[(OA(b,e)|0)>>0]|0)!=0:0)){e=c[47271]|0;if(!e){e=0;break}if(!(a[(OA(b,e)|0)>>0]|0)){e=0;break}}d=d<<24>>24==0;q=c[i>>2]|0;q=c[(d?q+104|0:q+100|0)>>2]|0;e=sO(b)|0;if(e){n=c[e>>2]|0;do if(d){o=c[n>>2]|0;g=+h[o>>3];f=+h[o+8>>3];if(!(c[n+8>>2]|0))e=0;else{k=g;g=+h[n+16>>3];j=f;f=+h[n+24>>3];break}while(1){if((e|0)==4)break;o=p+(e<<4)|0;i=(c[n>>2]|0)+(e<<4)|0;c[o>>2]=c[i>>2];c[o+4>>2]=c[i+4>>2];c[o+8>>2]=c[i+8>>2];c[o+12>>2]=c[i+12>>2];e=e+1|0}iP(m,p,3,.1,0,0);k=+h[m>>3];j=+h[m+8>>3]}else{e=(c[e+4>>2]|0)+-1|0;d=n+(e*48|0)+4|0;i=n+(e*48|0)|0;s=c[i>>2]|0;m=(c[d>>2]|0)+-1|0;f=+h[s+(m<<4)+8>>3];g=+h[s+(m<<4)>>3];if(!(c[n+(e*48|0)+12>>2]|0))e=0;else{k=g;g=+h[n+(e*48|0)+32>>3];j=f;f=+h[n+(e*48|0)+40>>3];break}while(1){if((e|0)==4)break;s=p+(e<<4)|0;n=(c[i>>2]|0)+(e+-4+(c[d>>2]|0)<<4)|0;c[s>>2]=c[n>>2];c[s+4>>2]=c[n+4>>2];c[s+8>>2]=c[n+8>>2];c[s+12>>2]=c[n+12>>2];e=e+1|0}iP(o,p,3,.9,0,0);k=+h[o>>3];j=+h[o+8>>3]}while(0);k=+O(+(j-f),+(k-g));k=k+ +YO(b,c[47272]|0,-25.0,-180.0)/180.0*3.141592653589793;j=+YO(b,c[47271]|0,1.0,0.0)*10.0;h[q+56>>3]=g+j*+I(+k);h[q+64>>3]=f+j*+J(+k);a[q+81>>0]=1;e=1}else e=0}else e=0;while(0);l=r;return e|0}function sO(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;h=l;l=l+16|0;f=h;d=b;while(1){e=c[d+16>>2]|0;d=c[e+8>>2]|0;if(d|0)break;if(!(a[e+112>>0]|0)){g=5;break}d=c[e+116>>2]|0}if((g|0)==5){g=HB(c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0)|0;d=HB(c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)|0;c[f>>2]=g;c[f+4>>2]=d;dA(1,106880,f)|0;d=0}l=h;return d|0}function tO(a,d,e){a=a|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0;s=l;l=l+96|0;m=s+80|0;n=s+64|0;o=s+48|0;p=s+32|0;q=s+16|0;r=s;k=b[(c[d+16>>2]|0)+136>>1]|0;d=e+16|0;uO(c[(c[d>>2]|0)+8>>2]|0,p,q);f=+h[p>>3];g=+h[q>>3];u=f-g;i=+h[p+8>>3];j=+h[q+8>>3];t=i-j;a:do if(u*u+t*t<1.0e-06){c[o>>2]=c[p>>2];c[o+4>>2]=c[p+4>>2];c[o+8>>2]=c[p+8>>2];c[o+12>>2]=c[p+12>>2]}else{d=c[(c[d>>2]|0)+8>>2]|0;switch(k&14){case 4:case 10:{h[n>>3]=(f+g)*.5;h[n+8>>3]=(i+j)*.5;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];oP(r,d,m);c[o>>2]=c[r>>2];c[o+4>>2]=c[r+4>>2];c[o+8>>2]=c[r+8>>2];c[o+12>>2]=c[r+12>>2];break a}default:{vO(o,d,p,q);break a}}}while(0);c[a>>2]=c[o>>2];c[a+4>>2]=c[o+4>>2];c[a+8>>2]=c[o+8>>2];c[a+12>>2]=c[o+12>>2];l=s;return}function uO(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=l;l=l+32|0;g=h+16|0;f=h;j=c[a>>2]|0;e=c[j>>2]|0;i=c[j+8>>2]|0;k=j+16|0;c[g>>2]=c[k>>2];c[g+4>>2]=c[k+4>>2];c[g+8>>2]=c[k+8>>2];c[g+12>>2]=c[k+12>>2];j=j+32|0;c[f>>2]=c[j>>2];c[f+4>>2]=c[j+4>>2];c[f+8>>2]=c[j+8>>2];c[f+12>>2]=c[j+12>>2];if(!i){c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2]}else{c[b>>2]=c[g>>2];c[b+4>>2]=c[g+4>>2];c[b+8>>2]=c[g+8>>2];c[b+12>>2]=c[g+12>>2]}i=c[a>>2]|0;j=(c[a+4>>2]|0)+-1|0;e=c[i+(j*48|0)>>2]|0;a=c[i+(j*48|0)+4>>2]|0;k=c[i+(j*48|0)+12>>2]|0;b=i+(j*48|0)+16|0;c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];j=i+(j*48|0)+32|0;c[f>>2]=c[j>>2];c[f+4>>2]=c[j+4>>2];c[f+8>>2]=c[j+8>>2];c[f+12>>2]=c[j+12>>2];if(!k){k=e+(a+-1<<4)|0;c[d>>2]=c[k>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2]}else{c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2]}l=h;return}function vO(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0.0;r=c[b+4>>2]|0;g=0.0;f=0;while(1){if((f|0)>=(r|0))break;l=c[b>>2]|0;k=c[l+(f*48|0)>>2]|0;l=c[l+(f*48|0)+4>>2]|0;i=3;j=0;while(1){if((i|0)>=(l|0))break;p=+h[k+(j<<4)>>3]-+h[k+(i<<4)>>3];q=+h[k+(j<<4)+8>>3]-+h[k+(i<<4)+8>>3];i=i+3|0;j=j+3|0;g=g+ +G(+(p*p+q*q))}f=f+1|0}l=0;g=g*.5;a:while(1){if((l|0)>=(r|0)){f=15;break}k=c[b>>2]|0;j=c[k+(l*48|0)>>2]|0;k=c[k+(l*48|0)+4>>2]|0;f=3;i=0;while(1){if((f|0)>=(k|0))break;m=+h[j+(i<<4)>>3];p=+h[j+(i<<4)+8>>3];n=+h[j+(f<<4)>>3];o=+h[j+(f<<4)+8>>3];s=m-n;q=p-o;q=+G(+(s*s+q*q));if(q>=g){f=12;break a}f=f+3|0;i=i+3|0;g=g-q}l=l+1|0}if((f|0)==12){h[d>>3]=m;h[d+8>>3]=p;h[e>>3]=n;h[e+8>>3]=o;s=q-g;h[a>>3]=(g*n+m*s)/q;h[a+8>>3]=(g*o+p*s)/q;return}else if((f|0)==15)Aa(139015,106815,1316,106942)}function wO(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;qO(b);return}function xO(b,d,e,f,g){b=b|0;d=d|0;e=+e;f=f|0;g=g|0;var i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0,G=0,H=0,K=0,L=0,M=0,N=0;L=yO(b)|0;K=c[L+4>>2]|0;M=c[L>>2]|0;H=K+-1|0;D=+h[M+(H<<6)+16>>3];E=+(K|0);F=(g|0)==2;G=(f|0)!=0;n=0;j=0.0;i=0.0;l=0.0;m=0.0;while(1){if((n|0)>=(K|0))break;b=~~+zO(+(n+-1|0),E);C=n+1|0;N=~~+zO(+(C|0),E);o=M+(n<<6)|0;m=+h[o>>3];B=M+(n<<6)+8|0;l=+h[B>>3];u=M+(n<<6)+16|0;v=+h[u>>3];w=M+(n<<6)+24|0;x=M+(n<<6)+32|0;y=M+(n<<6)+40|0;z=M+(n<<6)+48|0;A=M+(n<<6)+56|0;k=+AO(+h[M+(N<<6)+8>>3]-l,+h[M+(N<<6)>>3]-m);p=+AO(+h[M+(b<<6)+8>>3]-l,+h[M+(b<<6)>>3]-m);t=+qb[d&7](v,D,e);b=(n|0)==0;q=k+1.5707963267948966;r=p+-1.5707963267948966;do if(b|(n|0)==(H|0))if(b){if(!F){b=0;s=q;j=t;i=q;break}b=0;s=q;j=t;i=q;l=l-t*+J(+k);m=m-t*+I(+k);break}else{if(!F){b=0;s=r;j=t;i=r;break}b=0;s=r;j=t;i=r;l=l-t*+J(+p);m=m-t*+I(+p);break}else{i=k-p;i=1.5707963267948966-(i<0.0?i+6.283185307179586:i)*.5;j=+I(+i);j=j==0.0?0.0:t/j;i=q+i;if(G|j>t*10.0){i=+zO(r,6.283185307179586);b=1;s=+zO(q,6.283185307179586);j=t}else{b=0;s=i}}while(0);h[o>>3]=m;h[B>>3]=l;h[u>>3]=v;a[w>>0]=108;h[x>>3]=i;h[y>>3]=j;c[z>>2]=b;h[A>>3]=s;n=C}o=HK(12)|0;b=0;while(1){if((b|0)>=(K|0))break;m=+h[M+(b<<6)>>3];l=+h[M+(b<<6)+8>>3];i=+h[M+(b<<6)+32>>3];j=+h[M+(b<<6)+40>>3];N=c[M+(b<<6)+48>>2]|0;k=+h[M+(b<<6)+56>>3];BO(o,m+j*+I(+i),l+j*+J(+i));if(N|0)CO(m,l,j,1,i,k,f,o);b=b+1|0}n=(g|0)==1;k=i+3.141592653589793;if(n)DO(o,m,l,j,i,k);else{BO(o,m+j*+I(+k),l+j*+J(+k));i=k}b=K+-2|0;k=m;while(1){if((b|0)<=-1)break;m=+h[M+(b<<6)>>3];l=+h[M+(b<<6)+8>>3];j=+h[M+(b<<6)+40>>3];N=c[M+(b<<6)+48>>2]|0;i=+h[M+(b<<6)+32>>3]+3.141592653589793;k=+h[M+(b<<6)+56>>3]+3.141592653589793;BO(o,m+j*+I(+k),l+j*+J(+k));if(N|0)CO(m,l,j,0,i,k,f,o);b=b+-1|0;k=m}if(n)DO(o,k,l,j,i,i+3.141592653589793);EO(L);return o|0}function yO(a){a=a|0;var b=0.0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0;q=l;l=l+144|0;i=q+128|0;h=q+112|0;j=q+96|0;k=q+64|0;m=q;n=q+80|0;o=FO()|0;p=c[a+4>>2]|0;f=c[a>>2]|0;c[i>>2]=c[f>>2];c[i+4>>2]=c[f+4>>2];c[i+8>>2]=c[f+8>>2];c[i+12>>2]=c[f+12>>2];GO(o,i,0.0);g=m+48|0;c[g>>2]=c[f>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];c[g+12>>2]=c[f+12>>2];d=0;b=0.0;a:while(1){e=d+3|0;if((e|0)>=(p|0))break;c[m>>2]=c[g>>2];c[m+4>>2]=c[g+4>>2];c[m+8>>2]=c[g+8>>2];c[m+12>>2]=c[g+12>>2];a=1;while(1){if((a|0)==4)break;r=m+(a<<4)|0;s=f+(a+d<<4)|0;c[r>>2]=c[s>>2];c[r+4>>2]=c[s+4>>2];c[r+8>>2]=c[s+8>>2];c[r+12>>2]=c[s+12>>2];a=a+1|0}c[j>>2]=c[m>>2];c[j+4>>2]=c[m+4>>2];c[j+8>>2]=c[m+8>>2];c[j+12>>2]=c[m+12>>2];a=1;while(1){if((a|0)==21){d=e;continue a}iP(n,m,3,+(a|0)/20.0,0,0);c[k>>2]=c[n>>2];c[k+4>>2]=c[n+4>>2];c[k+8>>2]=c[n+8>>2];c[k+12>>2]=c[n+12>>2];c[h>>2]=c[j>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[h+12>>2]=c[j+12>>2];c[i>>2]=c[n>>2];c[i+4>>2]=c[n+4>>2];c[i+8>>2]=c[n+8>>2];c[i+12>>2]=c[n+12>>2];t=b+ +HO(h,i);c[i>>2]=c[k>>2];c[i+4>>2]=c[k+4>>2];c[i+8>>2]=c[k+8>>2];c[i+12>>2]=c[k+12>>2];GO(o,i,t);c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];a=a+1|0;b=t}}IO(o);l=q;return o|0}function zO(a,b){a=+a;b=+b;if(!(!(a<0.0)&!(a>=b)))a=a-+E(+(a/b))*b;return +a}function AO(a,b){a=+a;b=+b;if(!(a==0.0&b==0.0)){a=+O(+a,+b);if(!(a>=0.0))a=a+6.283185307179586}else a=0.0;return +a}function BO(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0,g=0;f=c[a>>2]|0;e=a+4|0;g=a+8|0;if((f|0)<(c[e>>2]|0))e=c[g>>2]|0;else{c[e>>2]=2e3;e=KK(c[g>>2]|0,32e3)|0;c[g>>2]=e;f=c[a>>2]|0}c[a>>2]=f+1;h[e+(f<<4)>>3]=b;h[e+(f<<4)+8>>3]=d;return}function CO(a,b,c,d,e,f,g,h){a=+a;b=+b;c=+c;d=d|0;e=+e;f=+f;g=g|0;h=h|0;var i=0.0,j=0.0,k=0.0;d=(d|0)==0;i=d?e:f;j=+I(+i)*c+a;k=+J(+i)*c+a;do if((g|0)==1){e=(d?f:e)-i;e=!(e<=1.7453292519943296e-03)?e:e+6.283185307179586;if(e<3.141592653589793){DO(h,a,b,c,i+e,i);break}else{BO(h,j,k);break}}else BO(h,j,k);while(0);return}function DO(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;var g=0,h=0.0;BO(a,+I(+e)*d+b,+J(+e)*d+c);a:do if(!(d==0.0)){while(1){if(!(f>e))break;f=f+-6.283185307179586}f=e-f;while(1){if(!(f>6.283185307179586))break;f=f+-6.283185307179586}f=f/19.0;g=1;while(1){if((g|0)==20)break a;h=e-f*+(g|0);BO(a,+I(+h)*d+b,+J(+h)*d+c);g=g+1|0}}while(0);return}function EO(a){a=a|0;l6(c[a>>2]|0);l6(a);return}function FO(){var a=0;a=HK(12)|0;c[a+4>>2]=0;c[a+8>>2]=2e3;c[a>>2]=HK(128e3)|0;return a|0}function GO(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,g=0,i=0;i=a+4|0;e=c[i>>2]|0;f=a+8|0;g=c[f>>2]|0;if((e|0)<(g|0))a=c[a>>2]|0;else{c[f>>2]=g<<1;e=KK(c[a>>2]|0,g<<7)|0;c[a>>2]=e;a=e;e=c[i>>2]|0}h[a+(e<<6)>>3]=+h[b>>3];h[a+(e<<6)+8>>3]=+h[b+8>>3];c[i>>2]=e+1;h[a+(e<<6)+16>>3]=d;return}function HO(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+h[a>>3]-+h[b>>3];c=+h[a+8>>3]-+h[b+8>>3];return +(+G(+(d*d+c*c)))}function IO(a){a=a|0;var b=0;b=c[a+4>>2]|0;if((c[a+8>>2]|0)>(b|0))c[a>>2]=KK(c[a>>2]|0,b<<6)|0;return}function JO(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;k=m+8|0;j=m;h=m+12|0;c[h>>2]=0;i=c[e+4>>2]|0;if(!i)Aa(106959,106970,203,106981);f=c[i>>2]|0;if(!f)Aa(106995,106970,206,106981);g=i+8|0;if(!(c[g>>2]|0))c[g>>2]=KO(f)|0;if(!(a[195234]|0))f=0;else{f=(NJ(c[i>>2]|0)|0)==0;f=f?0:h}if(!((bT(d,e,f)|0)<<24>>24))LO(e,f);do if(f|0){g=c[h>>2]|0;d=c[15715]|0;f=c[i>>2]|0;if(!g){c[k>>2]=f;z4(d,107038,k)|0;break}else{c[j>>2]=f;c[j+4>>2]=g;z4(d,107006,j)|0;break}}while(0);k=e+32|0;c[b>>2]=c[k>>2];c[b+4>>2]=c[k+4>>2];c[b+8>>2]=c[k+8>>2];c[b+12>>2]=c[k+12>>2];l=m;return}function KO(a){a=a|0;var b=0;b=c[47371]|0;if((b|0)!=0?(C3(b,a)|0)==0:0)a=c[47380]|0;else{l6(b);c[47371]=Y3(a)|0;a=e6(189484,22380,35,36,95)|0;c[47380]=a}return a|0}function LO(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0,i=0.0,j=0,k=0.0;j=c[b+4>>2]|0;e=c[j>>2]|0;i=+h[j+16>>3];j=b+32|0;h[j>>3]=0.0;h[b+40>>3]=i*1.2;h[b+16>>3]=0.0;h[b+24>>3]=i*.1;c[b+8>>2]=0;c[b+12>>2]=0;if(N3(e,107072,4)|0)if((N3(e,107077,5)|0)!=0?(N3(e,107083,9)|0)!=0:0){g=4296;e=107093}else{g=8392;e=107129}else{g=6344;e=107110}if(d|0)c[d>>2]=e;e=c[b>>2]|0;if(e|0){f=0.0;while(1){b=a[e>>0]|0;if(!(b<<24>>24))break;k=f+ +h[g+((b&255)<<3)>>3];h[j>>3]=k;e=e+1|0;f=k}h[j>>3]=i*f}return}function MO(a,b){a=a|0;b=b|0;return C3(c[a>>2]|0,c[b>>2]|0)|0}function NO(a){a=a|0;var b=0;b=a+108|0;c[b>>2]=0;c[a+112>>2]=32;c[a+116>>2]=-1;c[a+120>>2]=36;c[a+124>>2]=63;c[a+128>>2]=55;c[a+132>>2]=0;c[a+136>>2]=0;c[a+140>>2]=0;b=Sz(b,c[4591]|0)|0;c[a+144>>2]=b;return b|0}function OO(a,b,d){a=a|0;b=b|0;d=d|0;d=m6(1,32)|0;a=c[b>>2]|0;if(a|0)c[d>>2]=Y3(a)|0;a=c[b+4>>2]|0;if(a|0)c[d+4>>2]=Y3(a)|0;c[d+24>>2]=c[b+24>>2]&127;h[d+16>>3]=+h[b+16>>3];c[d+8>>2]=c[b+8>>2];return d|0}function PO(a,b,d){a=a|0;b=b|0;d=d|0;l6(c[b>>2]|0);l6(c[b+4>>2]|0);l6(b);return}function QO(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0,j=0;a=c[b>>2]|0;e=c[d>>2]|0;i=(e|0)==0;if(!a)if(i)j=5;else a=-1;else if(!i){a=f2(a,e)|0;if(!a)j=5}else a=1;do if((j|0)==5){a=c[b+4>>2]|0;e=c[d+4>>2]|0;i=(e|0)==0;if(!a){if(!i){a=-1;break}}else{if(i){a=1;break}a=f2(a,e)|0;if(a|0)break}a=(c[b+24>>2]&127)-(c[d+24>>2]&127)|0;if(!a){g=+h[b+16>>3];f=+h[d+16>>3];if(gf&1}}while(0);return a|0}function RO(){Ea(189524)|0;return}function SO(){var a=0,b=0;b=l;l=l+16|0;a=b;Ea(a|0)|0;l=b;return +(+((c[a+4>>2]|0)+(c[a>>2]|0)-(c[47381]|0)-(c[47382]|0)|0)/60.0)}function TO(a){a=a|0;var b=0,d=0;b=HK(16)|0;a=(a|0)>2?a:2;d=HK(a<<2)|0;c[b>>2]=d;c[b+12>>2]=d;c[b+8>>2]=d;c[b+4>>2]=d+(a<<2);return b|0}function UO(a){a=a|0;l6(c[a>>2]|0);l6(a);return}function VO(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+12|0;e=c[d>>2]|0;c[d>>2]=e+4;c[e>>2]=b;if((c[d>>2]|0)>>>0>=(c[a+4>>2]|0)>>>0)c[d>>2]=c[a>>2];return}function WO(a){a=a|0;var b=0,d=0,e=0;d=a+8|0;b=c[d>>2]|0;if((b|0)!=(c[a+12>>2]|0)){e=b+4|0;c[d>>2]=e;b=c[b>>2]|0;if(e>>>0>=(c[a+4>>2]|0)>>>0)c[d>>2]=c[a>>2]}else b=0;return b|0}function XO(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;i=l;l=l+16|0;g=i;if(((d|0)!=0?(h=OA(b,d)|0,(h|0)!=0):0)?(a[h>>0]|0)!=0:0){d=$1(h,g,10)|0;e=(h|0)==(c[g>>2]|0)?e:(d|0)<(f|0)?f:d}l=i;return e|0}function YO(b,d,e,f){b=b|0;d=d|0;e=+e;f=+f;var g=0,h=0,i=0,j=0.0;i=l;l=l+16|0;g=i;if(((b|0)!=0&(d|0)!=0?(h=OA(b,d)|0,(h|0)!=0):0)?(a[h>>0]|0)!=0:0){j=+b6(h,g);e=(h|0)==(c[g>>2]|0)?e:j0.0)){b=+YO(a,DA(a,0,107939,0)|0,-1.0,0.0);b=b==0.0?72.0:b}return +b}function _O(a,b,c){a=a|0;b=b|0;c=c|0;if((a|0)!=0&(b|0)!=0)c=OA(a,b)|0;return c|0}function $O(b,c,d){b=b|0;c=c|0;d=d|0;b=_O(b,c,d)|0;if((b|0)!=0?(a[b>>0]|0)!=0:0)d=b;return d|0}function aP(a,b,c){a=a|0;b=b|0;c=c|0;if(!b)a=c&255;else a=bP(OA(a,b)|0)|0;return a|0}function bP(a){a=a|0;return cP(a,0)|0}function cP(b,c){b=b|0;c=c|0;var d=0;if((b|0)!=0?(d=a[b>>0]|0,d<<24>>24!=0):0)if((C3(b,137609)|0)!=0?(C3(b,107950)|0)!=0:0)if((C3(b,107953)|0)!=0?(C3(b,107958)|0)!=0:0){if(((d<<24>>24)+-48|0)>>>0<10)c=(d6(b)|0)&255}else c=1;else c=0;return c|0}function dP(a){a=a|0;var b=0,d=0;while(1){b=(c[a+16>>2]|0)+220|0;d=c[b>>2]|0;if(!((d|0)!=(a|0)&(d|0)!=0))break;a=c[(c[d+16>>2]|0)+220>>2]|0;if(!a){a=d;continue}c[b>>2]=a}return a|0}function eP(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;if((a|0)!=(b|0)){d=c[a+16>>2]|0;e=d+220|0;if(!(c[e>>2]|0)){c[e>>2]=a;c[d+216>>2]=1}else a=dP(a)|0;e=c[b+16>>2]|0;d=e+220|0;if(!(c[d>>2]|0)){c[d>>2]=b;c[e+216>>2]=1;d=e;e=1}else{b=dP(b)|0;e=c[b+16>>2]|0;d=e;e=c[e+216>>2]|0}h=c[a+16>>2]|0;g=(c[h+120>>2]|0)>(c[d+120>>2]|0);f=h+216|0;e=e+(c[f>>2]|0)|0;a=g?b:a;c[(g?h:d)+220>>2]=a;c[(g?d+216|0:f)>>2]=e}return a|0}function fP(b){b=b|0;b=c[b+16>>2]|0;c[b+216>>2]=1;c[b+220>>2]=0;a[b+159>>0]=0;return}function gP(a,b){a=a|0;b=b|0;if((dP(a)|0)==(a|0)){a=c[a+16>>2]|0;c[a+220>>2]=b;b=(c[b+16>>2]|0)+216|0;c[b>>2]=(c[b>>2]|0)+(c[a+216>>2]|0);return}else Aa(107970,107962,194,107986)}function hP(a,b){a=a|0;b=b|0;var d=0.0;b=c[(c[b+16>>2]|0)+132>>2]|0;d=+h[b+8>>3]*72.0;h[a>>3]=+h[b>>3]*72.0;h[a+8>>3]=d;return}function iP(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=f|0;g=g|0;var i=0,j=0,k=0,m=0.0,n=0,o=0,p=0;o=l;l=l+576|0;n=o;i=0;while(1){if((i|0)>(d|0))break;k=n+(i<<4)|0;j=b+(i<<4)|0;c[k>>2]=c[j>>2];c[k+4>>2]=c[j+4>>2];c[k+8>>2]=c[j+8>>2];c[k+12>>2]=c[j+12>>2];i=i+1|0}m=1.0-e;i=1;while(1){if((i|0)>(d|0))break;j=d-i|0;k=i+-1|0;b=0;while(1){if((b|0)>(j|0))break;p=b+1|0;h[n+(i*96|0)+(b<<4)>>3]=m*+h[n+(k*96|0)+(b<<4)>>3]+ +h[n+(k*96|0)+(p<<4)>>3]*e;h[n+(i*96|0)+(b<<4)+8>>3]=m*+h[n+(k*96|0)+(b<<4)+8>>3]+ +h[n+(k*96|0)+(p<<4)+8>>3]*e;b=p}i=i+1|0}a:do if(f|0){i=0;while(1){if((i|0)>(d|0))break a;p=f+(i<<4)|0;k=n+(i*96|0)|0;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];c[p+8>>2]=c[k+8>>2];c[p+12>>2]=c[k+12>>2];i=i+1|0}}while(0);b:do if(g|0){i=0;while(1){if((i|0)>(d|0))break b;p=g+(i<<4)|0;f=n+((d-i|0)*96|0)+(i<<4)|0;c[p>>2]=c[f>>2];c[p+4>>2]=c[f+4>>2];c[p+8>>2]=c[f+8>>2];c[p+12>>2]=c[f+12>>2];i=i+1|0}}while(0);p=n+(d*96|0)|0;c[a>>2]=c[p>>2];c[a+4>>2]=c[p+4>>2];c[a+8>>2]=c[p+8>>2];c[a+12>>2]=c[p+12>>2];l=o;return}function jP(b){b=b|0;var d=0,e=0,f=0,g=0;e=0;do{d=c[47385]|0;f=d+1024|0;if((d-e|0)<1024){c[47385]=f;f=KK(c[47386]|0,f)|0;c[47386]=f;d=c[47385]|0}else f=c[47386]|0;d=o4(f+e|0,d-e|0,b)|0;if(!d){g=6;break}e=(D3(d)|0)+e|0;d=c[47386]|0}while((a[d+(e+-1)>>0]|0)!=10);if((g|0)==6)d=c[47386]|0;return ((e|0)>0?d:0)|0}function kP(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;h=l;l=l+16|0;g=h+8|0;f=h;do if((b|0)!=0?(a[b>>0]|0)!=0:0){d=c[47179]|0;if(!d){d=c[47178]|0;e=c[47388]|0;if((c[47387]|0)==(d|0))d=e;else{if(e){l6(c[e>>2]|0);l6(c[47388]|0);c[47388]=0;d=c[47178]|0}c[47387]=d;if(!d)break;if(!(a[d>>0]|0))break;d=lP(d)|0;c[47388]=d}if(!((a[b>>0]|0)!=47&(d|0)!=0))break;b=mP(d,c[47389]|0,b)|0;break}e=c[47177]|0;if(e|0?a[e>>0]|0:0){if(!(c[47387]|0)){c[47388]=lP(e)|0;e=c[47177]|0;c[47387]=e}d=I4(b,47)|0;d=(d|0)==0?b:d+1|0;f=I4(d,92)|0;f=(f|0)==0?d:f+1|0;d=I4(f,58)|0;d=(d|0)==0?f:d+1|0;if(!((a[107997]|0)==0|(d|0)==(b|0))){c[g>>2]=b;c[g+4>>2]=e;dA(0,108123,g)|0;a[107997]=0}b=mP(c[47388]|0,c[47389]|0,d)|0;break}if(a[107997]|0){c[f>>2]=d;dA(0,107998,f)|0;a[107997]=0;b=0}else b=0}else b=0;while(0);l=h;return b|0}function lP(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;e=0;f=0;g=0;b=Y3(a)|0;d=0;while(1){b=i6(b,108285)|0;if(!b)break;a=(g<<2)+8|0;if(!f)a=IK(a)|0;else a=KK(d,a)|0;c[a+(g<<2)>>2]=b;f=D3(b)|0;e=e>>>0>f>>>0?e:f;f=a;g=g+1|0;b=0;d=a}c[f+(g<<2)>>2]=0;c[47389]=e;return f|0}function mP(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=l;l=l+16|0;e=g;h=c[47390]|0;c[47390]=n6(h,b+2+(D3(d)|0)|0)|0;while(1){b=c[a>>2]|0;if(!b){a=0;break}h=c[47390]|0;c[e>>2]=b;c[e+4>>2]=108283;c[e+8>>2]=d;i2(h,108276,e)|0;if(!(H4(c[47390]|0,4)|0)){f=4;break}else a=a+4|0}if((f|0)==4)a=c[47390]|0;l=g;return a|0}function nP(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=(b|0)==0;f=0;while(1){h=c[d+(f<<2)>>2]|0;if(!h)break;if((!g?(a[b>>0]|0)==(a[h>>0]|0):0)?(f2(b,h)|0)==0:0)break;f=f+1|0}return c[e+(f<<2)>>2]|0}function oP(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;z=l;l=l+80|0;x=z+16|0;y=z;u=c[b+4>>2]|0;v=c[b>>2]|0;w=d+8|0;f=0;e=-1;g=1.e+38;b=-1;while(1){if((f|0)>=(u|0))break;s=c[v+(f*48|0)>>2]|0;t=c[v+(f*48|0)+4>>2]|0;r=0;while(1){if((r|0)>=(t|0))break;p=+h[s+(r<<4)>>3]-+h[d>>3];q=+h[s+(r<<4)+8>>3]-+h[w>>3];q=p*p+q*q;A=(e|0)==-1|q>2]|0;e=(((e|0)==((c[v+(b*48|0)+4>>2]|0)+-1|0))<<31>>31)+e|0;e=e-((e|0)%3|0)|0;b=0;while(1){if((b|0)==4)break;B=b+e|0;h[x+(b<<4)>>3]=+h[f+(B<<4)>>3];h[x+(b<<4)+8>>3]=+h[f+(B<<4)+8>>3];b=b+1|0}q=+h[d>>3];p=+h[x>>3]-q;o=+h[w>>3];k=+h[x+8>>3]-o;n=+h[x+48>>3]-q;j=+h[x+56>>3]-o;b=y+8|0;g=1.0;i=0.0;j=n*n+j*j;k=p*p+k*k;while(1){p=(i+g)*.5;iP(y,x,3,p,0,0);m=+h[y>>3];n=+h[b>>3];if(+F(+(k-j))<1.0)break;if(+F(+(g-i))<1.0e-05)break;B=k>3]=m;h[a+8>>3]=n;l=z;return}function pP(){return c[47391]|0}function qP(b){b=b|0;var d=0.0,e=0,f=0,g=0,i=0,j=0,k=0,l=0;d=+YO(b,c[47200]|0,.75,.01);g=b+16|0;h[(c[g>>2]|0)+32>>3]=d;d=+YO(b,c[47199]|0,.5,.02);h[(c[g>>2]|0)+40>>3]=d;l=hN($O(b,c[47201]|0,108287)|0,b)|0;c[(c[g>>2]|0)+8>>2]=l;l=OA(b,c[47216]|0)|0;d=+YO(b,c[47212]|0,14.0,1.0);e=$O(b,c[47213]|0,108295)|0;f=$O(b,c[47214]|0,137615)|0;i=(gD(l)|0)!=0;k=(UM(b)|0)==2;i=xK(b,l,(k?4:0)|(i?2:0),d,e,f)|0;c[(c[g>>2]|0)+104>>2]=i;i=c[47217]|0;if((i|0?(j=OA(b,i)|0,j|0):0)?a[j>>0]|0:0){l=(gD(j)|0)!=0;l=xK(b,j,l?2:0,d,e,f)|0;c[(c[g>>2]|0)+108>>2]=l;l=(c[(uC(b)|0)+16>>2]|0)+113|0;a[l>>0]=a[l>>0]|16}k=(XO(b,c[47220]|0,0,0)|0)&255;l=c[g>>2]|0;a[l+144>>0]=k;db[c[c[(c[l+8>>2]|0)+4>>2]>>2]&127](b);return}function rP(b){b=b|0;var d=0,e=0,f=0,g=0,i=0.0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+112|0;m=v+96|0;n=v+80|0;s=v+40|0;u=v;r=b+48|0;p=uC(c[((c[b>>2]&3|0)==3?b:r)+40>>2]|0)|0;g=m+8|0;c[g>>2]=0;o=n+8|0;c[o>>2]=0;d=c[47251]|0;if(((d|0)!=0?(e=OA(b,d)|0,(e|0)!=0):0)?(a[e>>0]|0)!=0:0){sP(b,m);t=(gD(e)|0)!=0;i=+h[m>>3];f=c[g>>2]|0;d=c[m+12>>2]|0;e=xK(b,e,t?2:0,i,f,d)|0;t=b+16|0;c[(c[t>>2]|0)+96>>2]=e;e=(c[p+16>>2]|0)+113|0;a[e>>0]=a[e>>0]|1;e=bP(_O(b,c[47261]|0,137609)|0)|0;a[(c[t>>2]|0)+114>>0]=e;t=1;e=f}else{t=0;d=0;i=0.0;e=0}f=c[47252]|0;if((f|0?(j=OA(b,f)|0,j|0):0)?a[j>>0]|0:0){if(!e){sP(b,m);i=+h[m>>3];e=c[g>>2]|0;d=c[m+12>>2]|0}g=(gD(j)|0)!=0;j=xK(b,j,g?2:0,i,e,d)|0;c[(c[b+16>>2]|0)+108>>2]=j;j=(c[p+16>>2]|0)+113|0;a[j>>0]=a[j>>0]|32}d=c[47266]|0;if(((d|0)!=0?(k=OA(b,d)|0,(k|0)!=0):0)?(a[k>>0]|0)!=0:0){tP(b,m,n);j=(gD(k)|0)!=0;i=+h[n>>3];d=c[o>>2]|0;e=c[n+12>>2]|0;k=xK(b,k,j?2:0,i,d,e)|0;c[(c[b+16>>2]|0)+100>>2]=k;k=(c[p+16>>2]|0)+113|0;a[k>>0]=a[k>>0]|2}else{e=0;i=0.0;d=0}f=c[47267]|0;if((f|0?(q=OA(b,f)|0,q|0):0)?a[q>>0]|0:0){if(!d){tP(b,m,n);e=c[n+12>>2]|0;i=+h[n>>3];d=c[o>>2]|0}o=(gD(q)|0)!=0;q=xK(b,q,o?2:0,i,d,e)|0;c[(c[b+16>>2]|0)+104>>2]=q;q=(c[p+16>>2]|0)+113|0;a[q>>0]=a[q>>0]|4}d=NA(b,111756)|0;d=d|0?d:195341;if(a[d>>0]|0)a[(c[(c[((c[b>>2]&3|0)==3?b:r)+40>>2]|0)+16>>2]|0)+145>>0]=1;g=b+16|0;f=(c[g>>2]|0)+16|0;e=c[((c[b>>2]&3|0)==3?b:r)+40>>2]|0;uP(s,c[(c[(c[(c[e+16>>2]|0)+8>>2]|0)+4>>2]|0)+8>>2]|0,e,d);d=s;e=f+40|0;do{c[f>>2]=c[d>>2];f=f+4|0;d=d+4|0}while((f|0)<(e|0));if((vP(b,c[47273]|0)|0)<<24>>24)a[(c[g>>2]|0)+46>>0]=0;d=NA(b,111765)|0;d=d|0?d:195341;e=b+-48|0;if(a[d>>0]|0)a[(c[(c[((c[b>>2]&3|0)==2?b:e)+40>>2]|0)+16>>2]|0)+145>>0]=1;f=(c[g>>2]|0)+56|0;e=c[((c[b>>2]&3|0)==2?b:e)+40>>2]|0;uP(u,c[(c[(c[(c[e+16>>2]|0)+8>>2]|0)+4>>2]|0)+8>>2]|0,e,d);d=u;e=f+40|0;do{c[f>>2]=c[d>>2];f=f+4|0;d=d+4|0}while((f|0)<(e|0));if((vP(b,c[47274]|0)|0)<<24>>24)a[(c[g>>2]|0)+86>>0]=0;l=v;return t|0}function sP(a,b){a=a|0;b=b|0;h[b>>3]=+YO(a,c[47248]|0,14.0,1.0);c[b+8>>2]=$O(a,c[47249]|0,108295)|0;c[b+12>>2]=$O(a,c[47250]|0,137615)|0;return}function tP(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=b+8|0;if(!(c[e>>2]|0))sP(a,b);h[d>>3]=+YO(a,c[47268]|0,+h[b>>3],1.0);c[d+8>>2]=$O(a,c[47269]|0,c[e>>2]|0)|0;c[d+12>>2]=$O(a,c[47270]|0,c[b+12>>2]|0)|0;return}function uP(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+128|0;k=m+80|0;h=m+40|0;g=m;if((f|0)!=0?(j=F3(f,58)|0,(j|0)!=0):0){a[j>>0]=0;i=j+1|0;xb[d&31](h,e,f,i);e=k;g=h;d=e+36|0;do{c[e>>2]=c[g>>2];e=e+4|0;g=g+4|0}while((e|0)<(d|0));a[j>>0]=58;f=i}else{xb[d&31](g,e,f,0);e=k;d=e+36|0;do{c[e>>2]=c[g>>2];e=e+4|0;g=g+4|0}while((e|0)<(d|0))}e=b;g=k;d=e+36|0;do{c[e>>2]=c[g>>2];e=e+4|0;g=g+4|0}while((e|0)<(d|0));c[b+36>>2]=f;l=m;return}function vP(b,c){b=b|0;c=c|0;var d=0;if(((c|0)!=0?(d=OA(b,c)|0,(d|0)!=0):0)?(a[d>>0]|0)!=0:0)b=(bP(d)|0)<<24>>24==0&1;else b=0;return b|0}function wP(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0.0,o=0.0;k=l;l=l+32|0;i=k;j=c[b+8>>2]|0;d=c[b+4>>2]|0;d=(c[b+44>>2]|0)+((S((d|0)>1?d+-1|0:0,j)|0)<<4)|0;e=i+16|0;c[e>>2]=c[d>>2];c[e+4>>2]=c[d+4>>2];c[e+8>>2]=c[d+8>>2];c[e+12>>2]=c[d+12>>2];c[i>>2]=c[d>>2];c[i+4>>2]=c[d+4>>2];c[i+8>>2]=c[d+8>>2];c[i+12>>2]=c[d+12>>2];f=i+8|0;g=i+24|0;b=1;while(1){if((b|0)>=(j|0))break;m=d+(b<<4)|0;o=+h[m>>3];h[i>>3]=+h[(+h[i>>3]>3];n=+h[m+8>>3];h[f>>3]=+h[(+h[f>>3]>3];h[e>>3]=+h[(+h[e>>3]>o?e:m)>>3];h[g>>3]=+h[(+h[g>>3]>n?e:m)+8>>3];b=b+1|0}c[a>>2]=c[i>>2];c[a+4>>2]=c[i+4>>2];c[a+8>>2]=c[i+8>>2];c[a+12>>2]=c[i+12>>2];c[a+16>>2]=c[i+16>>2];c[a+20>>2]=c[i+20>>2];c[a+24>>2]=c[i+24>>2];c[a+28>>2]=c[i+28>>2];l=k;return}function xP(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=l;l=l+64|0;g=d+32|0;e=d;f=c[a+16>>2]|0;a=f+16|0;f=c[f+116>>2]&1;c[g>>2]=c[a>>2];c[g+4>>2]=c[a+4>>2];c[g+8>>2]=c[a+8>>2];c[g+12>>2]=c[a+12>>2];c[g+16>>2]=c[a+16>>2];c[g+20>>2]=c[a+20>>2];c[g+24>>2]=c[a+24>>2];c[g+28>>2]=c[a+28>>2];yP(e,g,b,f);c[a>>2]=c[e>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];c[a+16>>2]=c[e+16>>2];c[a+20>>2]=c[e+20>>2];c[a+24>>2]=c[e+24>>2];c[a+28>>2]=c[e+28>>2];l=d;return}function yP(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0,k=0.0,l=0.0,m=0.0;m=+h[d+56>>3];l=+h[d+64>>3];j=e<<24>>24==0;k=+h[d+24>>3];i=+h[d+32>>3];g=(j?k:i)*.5;f=m-g;g=m+g;if(f<+h[b>>3])h[b>>3]=f;e=b+16|0;if(g>+h[e>>3])h[e>>3]=g;g=(j?i:k)*.5;f=l-g;g=l+g;e=b+8|0;if(f<+h[e>>3])h[e>>3]=f;e=b+24|0;if(g>+h[e>>3])h[e>>3]=g;c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];c[a+16>>2]=c[b+16>>2];c[a+20>>2]=c[b+20>>2];c[a+24>>2]=c[b+24>>2];c[a+28>>2]=c[b+28>>2];return}function zP(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0.0,P=0,Q=0.0,R=0.0;M=l;l=l+432|0;I=M+400|0;u=M+384|0;v=M+288|0;L=M+224|0;H=M+192|0;B=M+144|0;C=M+64|0;d=M+368|0;e=M+352|0;f=M+336|0;D=M+320|0;w=M+256|0;x=M+160|0;y=M+112|0;z=M+80|0;A=M+32|0;J=M;G=L+16|0;K=b+16|0;if((qB(b)|0)==0?(c[(c[K>>2]|0)+180>>2]|0)==0:0){AP(L,0.0,0.0);AP(d,0.0,0.0);c[G>>2]=c[d>>2];c[G+4>>2]=c[d+4>>2];c[G+8>>2]=c[d+8>>2];c[G+12>>2]=c[d+12>>2]}else{AP(e,2147483647.0,2147483647.0);c[L>>2]=c[e>>2];c[L+4>>2]=c[e+4>>2];c[L+8>>2]=c[e+8>>2];c[L+12>>2]=c[e+12>>2];AP(f,-2147483647.0,-2147483647.0);c[G>>2]=c[f>>2];c[G+4>>2]=c[f+4>>2];c[G+8>>2]=c[f+8>>2];c[G+12>>2]=c[f+12>>2];E=L+24|0;F=L+8|0;p=C+8|0;q=v+16|0;r=v+8|0;s=v+24|0;t=B+8|0;o=gC(b)|0;while(1){if(!o)break;hP(B,o);d=o+16|0;n=c[d>>2]|0;h[C>>3]=(+h[n+88>>3]+ +h[n+96>>3])*.5;h[p>>3]=+h[n+80>>3]*.5;c[u>>2]=c[B>>2];c[u+4>>2]=c[B+4>>2];c[u+8>>2]=c[B+8>>2];c[u+12>>2]=c[B+12>>2];c[I>>2]=c[C>>2];c[I+4>>2]=c[C+4>>2];c[I+8>>2]=c[C+8>>2];c[I+12>>2]=c[C+12>>2];BP(v,u,I);c[u>>2]=c[B>>2];c[u+4>>2]=c[B+4>>2];c[u+8>>2]=c[B+8>>2];c[u+12>>2]=c[B+12>>2];c[I>>2]=c[C>>2];c[I+4>>2]=c[C+4>>2];c[I+8>>2]=c[C+8>>2];c[I+12>>2]=c[C+12>>2];CP(D,u,I);c[q>>2]=c[D>>2];c[q+4>>2]=c[D+4>>2];c[q+8>>2]=c[D+8>>2];c[q+12>>2]=c[D+12>>2];h[L>>3]=+h[(+h[L>>3]<+h[v>>3]?L:v)>>3];h[F>>3]=+h[(+h[F>>3]<+h[r>>3]?L:v)+8>>3];h[G>>3]=+h[(+h[G>>3]>+h[q>>3]?L:v)+16>>3];h[E>>3]=+h[(+h[E>>3]>+h[s>>3]?L:v)+24>>3];d=c[(c[d>>2]|0)+108>>2]|0;if(d|0?a[d+81>>0]|0:0){n=c[(c[K>>2]|0)+116>>2]&1;c[I>>2]=c[L>>2];c[I+4>>2]=c[L+4>>2];c[I+8>>2]=c[L+8>>2];c[I+12>>2]=c[L+12>>2];c[I+16>>2]=c[L+16>>2];c[I+20>>2]=c[L+20>>2];c[I+24>>2]=c[L+24>>2];c[I+28>>2]=c[L+28>>2];yP(w,I,d,n);c[L>>2]=c[w>>2];c[L+4>>2]=c[w+4>>2];c[L+8>>2]=c[w+8>>2];c[L+12>>2]=c[w+12>>2];c[L+16>>2]=c[w+16>>2];c[L+20>>2]=c[w+20>>2];c[L+24>>2]=c[w+24>>2];c[L+28>>2]=c[w+28>>2]}n=UA(b,o)|0;while(1){if(!n)break;m=n+16|0;d=c[m>>2]|0;g=c[d+8>>2]|0;if(g|0){i=c[g+4>>2]|0;f=0;while(1){if((f|0)>=(i|0))break;k=c[g>>2]|0;j=c[k+(f*48|0)+4>>2]|0;k=k+(f*48|0)|0;e=0;while(1){if((e|0)>=(j|0))break;P=(c[k>>2]|0)+(e<<4)|0;c[B>>2]=c[P>>2];c[B+4>>2]=c[P+4>>2];c[B+8>>2]=c[P+8>>2];c[B+12>>2]=c[P+12>>2];O=+h[B>>3];h[L>>3]=+h[(+h[L>>3]>3];N=+h[t>>3];h[F>>3]=+h[(+h[F>>3]>3];h[G>>3]=+h[(+h[G>>3]>O?G:B)>>3];h[E>>3]=+h[(+h[E>>3]>N?G:B)+8>>3];e=e+1|0}f=f+1|0}e=c[d+96>>2]|0;if((e|0)!=0?(a[e+81>>0]|0)!=0:0){d=c[(c[K>>2]|0)+116>>2]&1;c[I>>2]=c[L>>2];c[I+4>>2]=c[L+4>>2];c[I+8>>2]=c[L+8>>2];c[I+12>>2]=c[L+12>>2];c[I+16>>2]=c[L+16>>2];c[I+20>>2]=c[L+20>>2];c[I+24>>2]=c[L+24>>2];c[I+28>>2]=c[L+28>>2];yP(x,I,e,d);c[L>>2]=c[x>>2];c[L+4>>2]=c[x+4>>2];c[L+8>>2]=c[x+8>>2];c[L+12>>2]=c[x+12>>2];c[L+16>>2]=c[x+16>>2];c[L+20>>2]=c[x+20>>2];c[L+24>>2]=c[x+24>>2];c[L+28>>2]=c[x+28>>2];d=c[m>>2]|0}e=c[d+100>>2]|0;if((e|0)!=0?(a[e+81>>0]|0)!=0:0){d=c[(c[K>>2]|0)+116>>2]&1;c[I>>2]=c[L>>2];c[I+4>>2]=c[L+4>>2];c[I+8>>2]=c[L+8>>2];c[I+12>>2]=c[L+12>>2];c[I+16>>2]=c[L+16>>2];c[I+20>>2]=c[L+20>>2];c[I+24>>2]=c[L+24>>2];c[I+28>>2]=c[L+28>>2];yP(y,I,e,d);c[L>>2]=c[y>>2];c[L+4>>2]=c[y+4>>2];c[L+8>>2]=c[y+8>>2];c[L+12>>2]=c[y+12>>2];c[L+16>>2]=c[y+16>>2];c[L+20>>2]=c[y+20>>2];c[L+24>>2]=c[y+24>>2];c[L+28>>2]=c[y+28>>2];d=c[m>>2]|0}e=c[d+104>>2]|0;if((e|0)!=0?(a[e+81>>0]|0)!=0:0){d=c[(c[K>>2]|0)+116>>2]&1;c[I>>2]=c[L>>2];c[I+4>>2]=c[L+4>>2];c[I+8>>2]=c[L+8>>2];c[I+12>>2]=c[L+12>>2];c[I+16>>2]=c[L+16>>2];c[I+20>>2]=c[L+20>>2];c[I+24>>2]=c[L+24>>2];c[I+28>>2]=c[L+28>>2];yP(z,I,e,d);c[L>>2]=c[z>>2];c[L+4>>2]=c[z+4>>2];c[L+8>>2]=c[z+8>>2];c[L+12>>2]=c[z+12>>2];c[L+16>>2]=c[z+16>>2];c[L+20>>2]=c[z+20>>2];c[L+24>>2]=c[z+24>>2];c[L+28>>2]=c[z+28>>2];d=c[m>>2]|0}d=c[d+108>>2]|0;if(d|0?a[d+81>>0]|0:0){P=c[(c[K>>2]|0)+116>>2]&1;c[I>>2]=c[L>>2];c[I+4>>2]=c[L+4>>2];c[I+8>>2]=c[L+8>>2];c[I+12>>2]=c[L+12>>2];c[I+16>>2]=c[L+16>>2];c[I+20>>2]=c[L+20>>2];c[I+24>>2]=c[L+24>>2];c[I+28>>2]=c[L+28>>2];yP(A,I,d,P);c[L>>2]=c[A>>2];c[L+4>>2]=c[A+4>>2];c[L+8>>2]=c[A+8>>2];c[L+12>>2]=c[A+12>>2];c[L+16>>2]=c[A+16>>2];c[L+20>>2]=c[A+20>>2];c[L+24>>2]=c[A+24>>2];c[L+28>>2]=c[A+28>>2]}}n=WA(b,n)|0}o=hC(b,o)|0}d=c[K>>2]|0;f=c[d+180>>2]|0;g=d+184|0;i=H+8|0;j=H+16|0;k=H+24|0;e=1;while(1){if((e|0)>(f|0))break;P=c[(c[(c[g>>2]|0)+(e<<2)>>2]|0)+16>>2]|0;R=+h[P+16>>3];h[H>>3]=R;Q=+h[P+24>>3];h[i>>3]=Q;N=+h[P+32>>3];h[j>>3]=N;O=+h[P+40>>3];h[k>>3]=O;h[L>>3]=+h[(+h[L>>3]>3];h[F>>3]=+h[(+h[F>>3]>3];h[G>>3]=+h[(+h[G>>3]>N?L:H)+16>>3];h[E>>3]=+h[(+h[E>>3]>O?L:H)+24>>3];e=e+1|0}e=c[d+12>>2]|0;if((e|0)!=0?(a[e+81>>0]|0)!=0:0){d=c[d+116>>2]&1;c[I>>2]=c[L>>2];c[I+4>>2]=c[L+4>>2];c[I+8>>2]=c[L+8>>2];c[I+12>>2]=c[L+12>>2];c[I+16>>2]=c[L+16>>2];c[I+20>>2]=c[L+20>>2];c[I+24>>2]=c[L+24>>2];c[I+28>>2]=c[L+28>>2];yP(J,I,e,d);c[L>>2]=c[J>>2];c[L+4>>2]=c[J+4>>2];c[L+8>>2]=c[J+8>>2];c[L+12>>2]=c[J+12>>2];c[L+16>>2]=c[J+16>>2];c[L+20>>2]=c[J+20>>2];c[L+24>>2]=c[J+24>>2];c[L+28>>2]=c[J+28>>2];d=c[K>>2]|0}P=d+16|0;c[P>>2]=c[L>>2];c[P+4>>2]=c[L+4>>2];c[P+8>>2]=c[L+8>>2];c[P+12>>2]=c[L+12>>2];c[P+16>>2]=c[L+16>>2];c[P+20>>2]=c[L+20>>2];c[P+24>>2]=c[L+24>>2];c[P+28>>2]=c[L+28>>2]}l=M;return}function AP(a,b,c){a=a|0;b=+b;c=+c;h[a>>3]=b;h[a+8>>3]=c;return}function BP(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=+h[b+8>>3]-+h[c+8>>3];h[a>>3]=+h[b>>3]-+h[c>>3];h[a+8>>3]=d;return}function CP(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=+h[b+8>>3]+ +h[c+8>>3];h[a>>3]=+h[b>>3]+ +h[c>>3];h[a+8>>3]=d;return}function DP(a){a=a|0;if((c[a+60>>2]|0)==(a|0))a=1;else a=(N3(HB(a)|0,108307,7)|0)==0;return a&1|0}function EP(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;a:do if(!e)switch(FC(b)|0){case 0:{e=DA(a,0,c,195341)|0;break a}case 1:{e=DA(a,1,c,195341)|0;break a}case 2:{e=DA(a,2,c,195341)|0;break a}default:{e=0;break a}}while(0);HA(b,e,d)|0;return e|0}function FP(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+144|0;g=k;i=GP(d)|0;h=Sz(23640,c[4591]|0)|0;j=LD(d,108315,1)|0;RC(j,137786,280,1)|0;hA(g,128,k+16|0);e=gC(d)|0;while(1){if(!e)break;a:do if(!(a[(c[e+16>>2]|0)+118>>0]|0)){f=UA(d,e)|0;while(1){if(!f)break a;HP(f,j,g,h,i);f=WA(d,f)|0}}while(0);e=hC(d,e)|0}lA(g);Oz(h)|0;f=qB(j)|0;e=gC(j)|0;while(1){if(!e)break;h=hC(j,e)|0;tC(d,e)|0;e=h}pB(j)|0;if(f|0){j=(c[d+16>>2]|0)+136|0;b[j>>1]=b[j>>1]|1}Oz(i)|0;l=k;return f|0}function GP(a){a=a|0;var b=0;b=Sz(23676,c[4591]|0)|0;QP(a,b);return b|0}function HP(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=l;l=l+48|0;q=t+32|0;p=t+24|0;s=t+16|0;r=t+8|0;k=t;n=c[b>>2]&3;m=c[((n|0)==3?b:b+48|0)+40>>2]|0;n=c[((n|0)==2?b:b+-48|0)+40>>2]|0;do if(!(a[(c[n+16>>2]|0)+118>>0]|0)){if(!(h2(HB(m)|0,108307,7)|0))o=IP(g,HB(m)|0)|0;else o=0;if(!(h2(HB(n)|0,108307,7)|0))j=IP(g,HB(n)|0)|0;else j=0;h=(o|0)!=0;i=(j|0)!=0;if(h|i){if((o|0)==(j|0)){r=HB(m)|0;s=HB(m)|0;c[k>>2]=r;c[k+4>>2]=s;dA(0,108330,k)|0;break}g=JP(f,b)|0;if(g|0){KP(b,c[g+16>>2]|0,c[g+20>>2]|0)|0;break}if(!i)if(!(EC(o,n)|0)){MP(f,m,n,KP(b,LP(m,o,e,d)|0,n)|0);break}else{r=HB(n)|0;s=HB(o)|0;c[q>>2]=r;c[q+4>>2]=s;dA(0,108485,q)|0;break}if(!h)if(!(EC(j,m)|0)){MP(f,m,n,KP(b,m,LP(n,j,e,d)|0)|0);break}else{r=HB(m)|0;s=HB(j)|0;c[p>>2]=r;c[p+4>>2]=s;dA(0,108448,p)|0;break}if(EC(j,o)|0){q=HB(o)|0;s=HB(j)|0;c[r>>2]=q;c[r+4>>2]=s;dA(0,108368,r)|0;break}if(!(EC(o,j)|0)){s=LP(m,o,e,d)|0;MP(f,m,n,KP(b,s,LP(n,j,e,d)|0)|0);break}else{q=HB(j)|0;r=HB(o)|0;c[s>>2]=q;c[s+4>>2]=r;dA(0,108408,s)|0;break}}}while(0);l=t;return}function IP(a,b){a=a|0;b=b|0;a=eb[c[a>>2]&63](a,b,512)|0;if(!a)a=0;else a=c[a+12>>2]|0;return a|0}function JP(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d;f=c[b>>2]&3;c[e>>2]=c[((f|0)==3?b:b+48|0)+40>>2];c[e+4>>2]=c[((f|0)==2?b:b+-48|0)+40>>2];b=eb[c[a>>2]&63](a,e,512)|0;l=d;return b|0}function KP(a,b,c){a=a|0;b=b|0;c=c|0;c=fB(uC(b)|0,b,c,0,1)|0;RC(c,137763,176,1)|0;RA(a,c)|0;return c|0}function LP(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;k=l;l=l+112|0;g=k;j=k+4|0;kA(e,108522)|0;i=c[47392]|0;c[47392]=i+1;c[g>>2]=i;i2(j,137696,g)|0;kA(e,j)|0;j=e+4|0;g=c[j>>2]|0;i=e+8|0;if(g>>>0>=(c[i>>2]|0)>>>0){iA(e,1)|0;g=c[j>>2]|0}c[j>>2]=g+1;a[g>>0]=58;kA(e,HB(d)|0)|0;h=vC(d)|0;g=c[j>>2]|0;if(g>>>0>=(c[i>>2]|0)>>>0){iA(e,1)|0;g=c[j>>2]|0}a[g>>0]=0;e=c[e>>2]|0;c[j>>2]=e;j=qC(h,e,1)|0;RC(j,137750,304,1)|0;a[(c[j+16>>2]|0)+118>>0]=1;lC(d,j,1)|0;lC(f,b,1)|0;f=uC(j)|0;c[47216]=EP(f,j,108525,195341,c[47216]|0)|0;f=uC(j)|0;c[47219]=EP(f,j,141385,134636,c[47219]|0)|0;f=uC(j)|0;c[47201]=EP(f,j,108531,108537,c[47201]|0)|0;l=k;return j|0}function MP(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;f=l;l=l+32|0;g=f;n=g+8|0;c[n>>2]=b;m=g+12|0;c[m>>2]=d;o=c[e>>2]&3;i=e+48|0;j=g+16|0;c[j>>2]=c[((o|0)==3?e:i)+40>>2];k=e+-48|0;h=g+20|0;c[h>>2]=c[((o|0)==2?e:k)+40>>2];eb[c[a>>2]&63](a,g,1)|0;c[n>>2]=d;c[m>>2]=b;d=c[e>>2]&3;c[j>>2]=c[((d|0)==2?e:k)+40>>2];c[h>>2]=c[((d|0)==3?e:i)+40>>2];eb[c[a>>2]&63](a,g,1)|0;l=f;return}function NP(a,b,d){a=a|0;b=b|0;d=d|0;d=HK(24)|0;c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];c[d+16>>2]=c[b+16>>2];c[d+20>>2]=c[b+20>>2];return d|0}function OP(a,b,c){a=a|0;b=b|0;c=c|0;l6(b);return}function PP(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=c[b>>2]|0;e=c[d>>2]|0;if(a>>>0>=e>>>0)if(a>>>0>e>>>0)a=1;else{b=c[b+4>>2]|0;d=c[d+4>>2]|0;return (b>>>0>>0?-1:b>>>0>d>>>0&1)|0}else a=-1;return a|0}function QP(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=l;l=l+16|0;g=h;f=a+16|0;e=1;while(1){a=c[f>>2]|0;if((e|0)>(c[a+180>>2]|0))break;a=c[(c[a+184>>2]|0)+(e<<2)>>2]|0;d=HB(a)|0;if(!(eb[c[b>>2]&63](b,d,512)|0)){i=HK(16)|0;c[i+8>>2]=d;c[i+12>>2]=a;eb[c[b>>2]&63](b,i,1)|0}else{c[g>>2]=d;dA(0,108541,g)|0}QP(a,b);e=e+1|0}l=h;return}function RP(a,b,c){a=a|0;b=b|0;c=c|0;l6(b);return}function SP(a){a=a|0;var b=0,c=0,d=0;d=LD(a,108315,1)|0;RC(d,137786,280,1)|0;b=gC(a)|0;while(1){if(!b)break;c=UA(a,b)|0;while(1){if(!c)break;TP(c,d);c=WA(a,c)|0}b=hC(a,b)|0}b=gC(d)|0;while(1){if(!b)break;c=hC(d,b)|0;UP(b);tC(a,b)|0;b=c}pB(d)|0;return}function TP(b,d){b=b|0;d=d|0;var e=0,f=0;e=c[b>>2]&3;f=c[((e|0)==3?b:b+48|0)+40>>2]|0;e=c[((e|0)==2?b:b+-48|0)+40>>2]|0;if(!((a[(c[f+16>>2]|0)+118>>0]|0)==0?!(a[(c[e+16>>2]|0)+118>>0]|0):0)){f=VP(f,d)|0;e=KP(b,f,VP(e,d)|0)|0;f=c[b+16>>2]|0;d=f+8|0;e=c[e+16>>2]|0;c[e+8>>2]=c[d>>2];c[d>>2]=0;d=f+96|0;c[e+96>>2]=c[d>>2];c[d>>2]=0;d=f+108|0;c[e+108>>2]=c[d>>2];c[d>>2]=0;d=f+100|0;c[e+100>>2]=c[d>>2];c[d>>2]=0;f=f+104|0;c[e+104>>2]=c[f>>2];c[f>>2]=0;WP(b)}return}function UP(a){a=a|0;var b=0,d=0,e=0;e=a+16|0;b=c[e>>2]|0;d=c[b+132>>2]|0;if(d){l6(d);b=c[e>>2]|0}d=c[b+8>>2]|0;if(d){db[c[(c[d+4>>2]|0)+4>>2]&127](a);b=c[e>>2]|0}AK(c[b+104>>2]|0);AK(c[(c[e>>2]|0)+108>>2]|0);TC(a,137750)|0;return}function VP(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;f=uC(b)|0;a:do if(a[(c[b+16>>2]|0)+118>>0]|0){lC(d,b,1)|0;b=F3(HB(b)|0,58)|0;if(!b)Aa(111509,107962,1225,108593);d=b+1|0;b=qC(f,d,0)|0;if(!b){b=qC(f,d,1)|0;RC(b,137750,304,1)|0;d=IA(f,1,0)|0;while(1){if(!d)break a;g=OA(b,d)|0;e=c[d+12>>2]|0;if((g|0)!=(e|0))HA(b,d,e)|0;d=IA(f,1,d)|0}}}while(0);return b|0}function WP(a){a=a|0;var b=0;b=a+16|0;l6(c[(c[b>>2]|0)+144>>2]|0);XP(a);AK(c[(c[b>>2]|0)+96>>2]|0);AK(c[(c[b>>2]|0)+108>>2]|0);AK(c[(c[b>>2]|0)+100>>2]|0);AK(c[(c[b>>2]|0)+104>>2]|0);TC(a,137763)|0;return}function XP(a){a=a|0;var b=0,d=0,e=0;e=a+16|0;a=c[e>>2]|0;b=c[a+8>>2]|0;if(b){d=0;while(1){a=c[b>>2]|0;if((d|0)>=(c[b+4>>2]|0))break;l6(c[a+(d*48|0)>>2]|0);d=d+1|0;b=c[(c[e>>2]|0)+8>>2]|0}l6(a);l6(c[(c[e>>2]|0)+8>>2]|0);a=c[e>>2]|0}c[a+8>>2]=0;return}function YP(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=DA(a,b,c,0)|0;if(!e)e=DA(a,b,c,d)|0;return e|0}function ZP(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+32|0;i=o;h=o+8|0;j=o+16|0;m=F3(b,59)|0;n=d+4|0;e=c[n>>2]|0;k=d+8|0;if(e>>>0>=(c[k>>2]|0)>>>0){iA(d,1)|0;e=c[n>>2]|0}c[n>>2]=e+1;a[e>>0]=38;if(((m|0)!=0?(f=m-b|0,(f+-2|0)>>>0<=6):0)?(N4(j,b,f)|0,a[j+f>>0]=0,c[h>>2]=j,g=e6(h,23712,252,8,96)|0,(g|0)!=0):0){c[i>>2]=c[g+4>>2];i2(j,137696,i)|0;b=c[n>>2]|0;if(b>>>0>=(c[k>>2]|0)>>>0){iA(d,1)|0;b=c[n>>2]|0}c[n>>2]=b+1;a[b>>0]=35;kA(d,j)|0;b=c[n>>2]|0;if(b>>>0>=(c[k>>2]|0)>>>0){iA(d,1)|0;b=c[n>>2]|0}c[n>>2]=b+1;a[b>>0]=59;b=m+1|0}l=o;return b|0}function _P(a,b){a=a|0;b=b|0;return f2(c[a>>2]|0,c[b>>2]|0)|0}function $P(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+1072|0;k=q+8|0;j=q;i=q+16|0;o=q+24|0;c[i>>2]=b;if((c[47393]|0)!=(d|0)){c[47393]=d;a[195240]=0}hA(o,1024,q+40|0);n=o+8|0;p=o+4|0;while(1){f=b+1|0;c[i>>2]=f;e=a[b>>0]|0;if(!(e<<24>>24))break;do if((e&255)<192)if(e<<24>>24==38){g=bQ(i)|0;if(!g)e=38;else{if(g>>>0<127){e=g&255;break}b=c[p>>2]|0;f=b>>>0>=(c[n>>2]|0)>>>0;h=g>>>6;e=(g&63|128)&255;if(g>>>0<2047){if(f){iA(o,1)|0;b=c[p>>2]|0}c[p>>2]=b+1;a[b>>0]=h|192;break}if(f){iA(o,1)|0;b=c[p>>2]|0}c[p>>2]=b+1;a[b>>0]=g>>>12|224;b=c[p>>2]|0;if(b>>>0>=(c[n>>2]|0)>>>0){iA(o,1)|0;b=c[p>>2]|0}c[p>>2]=b+1;a[b>>0]=h&63|128}}else{h=0;m=9}else if((e&255)>=224)if((e&255)>=240)if((e&255)<248){h=3;m=9}else{if(!(a[195240]|0)){c[j>>2]=HB(d)|0;dA(0,110008,j)|0;a[195240]=1}h=-1;e=aQ(e,o)|0;m=9}else{h=2;m=9}else{h=1;m=9}while(0);do if((m|0)==9){m=0;g=0;while(1){if((g|0)>=(h|0)){m=34;break}if((a[f>>0]&-64)<<24>>24!=-128)break;b=c[p>>2]|0;if(b>>>0>=(c[n>>2]|0)>>>0){iA(o,1)|0;b=c[p>>2]|0}c[p>>2]=b+1;a[b>>0]=e;g=g+1|0;e=a[f>>0]|0;f=f+1|0}if((m|0)==34){m=0;c[i>>2]=f;break}c[i>>2]=f;if(!(a[195240]|0)){g=HB(d)|0;c[k>>2]=h+1;c[k+4>>2]=g;dA(0,110129,k)|0;a[195240]=1}e=aQ(e,o)|0}while(0);b=c[p>>2]|0;if(b>>>0>=(c[n>>2]|0)>>>0){iA(o,1)|0;b=c[p>>2]|0}c[p>>2]=b+1;a[b>>0]=e;b=c[i>>2]|0}b=c[p>>2]|0;if(b>>>0>=(c[n>>2]|0)>>>0){iA(o,1)|0;b=c[p>>2]|0}a[b>>0]=0;n=c[o>>2]|0;c[p>>2]=n;p=Y3(n)|0;lA(o);l=q;return p|0} +function tw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0;if(a){if((c[a+32>>2]|0)!=1)Aa(95220,95244,187,95375);s=a+36|0;d=c[s>>2]|0;if((d&2|0)==0?(p=(b|0)!=0,(d&1|0)==0|p^1):0)if((c[a>>2]|0)==(c[a+4>>2]|0)?(t=mw(a)|0,(t|0)!=0):0){k=c[a+20>>2]|0;l=c[a+24>>2]|0;m=c[t+20>>2]|0;n=c[t+24>>2]|0;o=c[a>>2]|0;q=IK(o<<2)|0;b=0;while(1){if((b|0)>=(o|0))break;c[q+(b<<2)>>2]=-1;b=b+1|0}b=a+28|0;d=t+28|0;a:do switch((p?8:c[a+16>>2]|0)|0){case 1:{i=c[b>>2]|0;g=c[d>>2]|0;b=0;while(1){if((b|0)>(o|0)){d=0;break}if((c[k+(b<<2)>>2]|0)==(c[m+(b<<2)>>2]|0))b=b+1|0;else{b=0;break a}}b:while(1){if((d|0)>=(o|0)){r=54;break a}e=k+(d<<2)|0;f=d+1|0;a=k+(f<<2)|0;b=c[e>>2]|0;while(1){if((b|0)>=(c[a>>2]|0))break;c[q+(c[l+(b<<2)>>2]<<2)>>2]=b;b=b+1|0}b=c[m+(d<<2)>>2]|0;a=c[m+(f<<2)>>2]|0;d=b;while(1){if((d|0)>=(a|0))break;if((c[q+(c[n+(d<<2)>>2]<<2)>>2]|0)<(c[e>>2]|0)){b=0;break a}else d=d+1|0}while(1){if((b|0)>=(a|0)){d=f;continue b}u=+h[g+(b<<3)>>3]-+h[i+(c[q+(c[n+(b<<2)>>2]<<2)>>2]<<3)>>3];if((u>=0.0?u:-u)>1.0e-07){b=0;break a}else b=b+1|0}}}case 2:{j=c[b>>2]|0;i=c[d>>2]|0;b=0;while(1){if((b|0)>(o|0)){d=0;break}if((c[k+(b<<2)>>2]|0)==(c[m+(b<<2)>>2]|0))b=b+1|0;else{b=0;break a}}c:while(1){if((d|0)>=(o|0)){r=54;break a}f=k+(d<<2)|0;g=d+1|0;a=k+(g<<2)|0;b=c[f>>2]|0;while(1){if((b|0)>=(c[a>>2]|0))break;c[q+(c[l+(b<<2)>>2]<<2)>>2]=b;b=b+1|0}d=c[m+(d<<2)>>2]|0;e=c[m+(g<<2)>>2]|0;b=d;while(1){if((b|0)>=(e|0)){b=d;break}if((c[q+(c[n+(b<<2)>>2]<<2)>>2]|0)<(c[f>>2]|0)){b=0;break a}else b=b+1|0}while(1){if((b|0)>=(e|0)){d=g;continue c}d=b<<1;a=c[q+(c[n+(b<<2)>>2]<<2)>>2]<<1;u=+h[i+(d<<3)>>3]-+h[j+(a<<3)>>3];if((u>=0.0?u:-u)>1.0e-07){b=0;break a}u=+h[i+((d|1)<<3)>>3]-+h[j+((a|1)<<3)>>3];if((u>=0.0?u:-u)>1.0e-07){b=0;break a}else b=b+1|0}}}case 4:{i=c[b>>2]|0;f=c[d>>2]|0;b=0;d:while(1){if((b|0)>=(o|0)){r=54;break a}e=k+(b<<2)|0;g=b+1|0;a=k+(g<<2)|0;d=c[e>>2]|0;while(1){if((d|0)>=(c[a>>2]|0))break;c[q+(c[l+(d<<2)>>2]<<2)>>2]=d;d=d+1|0}b=c[m+(b<<2)>>2]|0;a=c[m+(g<<2)>>2]|0;d=b;while(1){if((d|0)>=(a|0))break;if((c[q+(c[n+(d<<2)>>2]<<2)>>2]|0)<(c[e>>2]|0)){b=0;break a}else d=d+1|0}while(1){if((b|0)>=(a|0)){b=g;continue d}if((c[f+(b<<2)>>2]|0)==(c[i+(c[q+(c[n+(b<<2)>>2]<<2)>>2]<<2)>>2]|0))b=b+1|0;else{b=0;break a}}}}case 8:{a=0;e:while(1){if((a|0)>=(o|0)){r=54;break a}e=k+(a<<2)|0;f=a+1|0;d=k+(f<<2)|0;b=c[e>>2]|0;while(1){if((b|0)>=(c[d>>2]|0))break;c[q+(c[l+(b<<2)>>2]<<2)>>2]=b;b=b+1|0}d=c[m+(f<<2)>>2]|0;b=c[m+(a<<2)>>2]|0;while(1){if((b|0)>=(d|0)){a=f;continue e}if((c[q+(c[n+(b<<2)>>2]<<2)>>2]|0)<(c[e>>2]|0)){b=0;break a}else b=b+1|0}}}default:b=0}while(0);if((r|0)==54){d=c[s>>2]|0;if(p)b=1;else{c[s>>2]=d|2;b=3}c[s>>2]=b|d;b=1}l6(q);nw(t)}else b=0;else b=1}else b=0;return b|0}function uw(a){a=a|0;var b=0,d=0,e=0,f=0;if(!a)b=0;else{e=a+8|0;f=a+40|0;b=ww(c[a>>2]|0,c[a+4>>2]|0,c[e>>2]|0,c[a+16>>2]|0,c[f>>2]|0,c[a+32>>2]|0)|0;d=a+20|0;B6(c[b+20>>2]|0,c[d>>2]|0,(c[a>>2]<<2)+4|0)|0;B6(c[b+24>>2]|0,c[a+24>>2]|0,c[(c[d>>2]|0)+(c[a>>2]<<2)>>2]<<2|0)|0;d=c[a+28>>2]|0;if(d|0)B6(c[b+28>>2]|0,d|0,S(c[e>>2]|0,c[f>>2]|0)|0)|0;c[b+36>>2]=c[a+36>>2];c[b+8>>2]=c[e>>2]}return b|0}function vw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0.0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;r=c[a+20>>2]|0;t=c[a+24>>2]|0;u=c[b+20>>2]|0;v=c[b+24>>2]|0;if(!((a|0)!=0&(b|0)!=0))Aa(95282,95244,973,95289);s=c[a+32>>2]|0;if(!((s|0)==1?(s|0)==(c[b+32>>2]|0):0))Aa(95306,95244,974,95289);f=a+16|0;d=c[f>>2]|0;if((d|0)!=(c[b+16>>2]|0))Aa(95356,95244,975,95289);q=c[a>>2]|0;e=c[a+4>>2]|0;if(((q|0)==(c[b>>2]|0)?(e|0)==(c[b+4>>2]|0):0)?(w=ow(q,e,(c[b+8>>2]|0)+(c[a+8>>2]|0)|0,d,1)|0,w|0):0){o=c[w+20>>2]|0;p=c[w+24>>2]|0;s=IK(e<<2)|0;d=0;while(1){if((d|0)>=(e|0))break;c[s+(d<<2)>>2]=-1;d=d+1|0}c[o>>2]=0;d=a+28|0;a=b+28|0;e=w+28|0;a:do switch(c[f>>2]|0){case 1:{m=c[d>>2]|0;l=c[a>>2]|0;j=c[e>>2]|0;d=0;b=0;while(1){if((b|0)>=(q|0))break a;k=b+1|0;e=r+(k<<2)|0;a=c[r+(b<<2)>>2]|0;while(1){if((a|0)>=(c[e>>2]|0))break;n=t+(a<<2)|0;c[s+(c[n>>2]<<2)>>2]=d;c[p+(d<<2)>>2]=c[n>>2];h[j+(d<<3)>>3]=+h[m+(a<<3)>>3];a=a+1|0;d=d+1|0}f=u+(k<<2)|0;g=o+(b<<2)|0;b=c[u+(b<<2)>>2]|0;while(1){if((b|0)>=(c[f>>2]|0))break;a=c[v+(b<<2)>>2]|0;e=c[s+(a<<2)>>2]|0;i=+h[l+(b<<3)>>3];if((e|0)<(c[g>>2]|0)){c[p+(d<<2)>>2]=a;h[j+(d<<3)>>3]=i;d=d+1|0}else{n=j+(e<<3)|0;h[n>>3]=i+ +h[n>>3]}b=b+1|0}c[o+(k<<2)>>2]=d;b=k}}case 2:{n=c[d>>2]|0;m=c[a>>2]|0;k=c[e>>2]|0;b=0;d=0;while(1){if((b|0)>=(q|0))break a;l=b+1|0;e=r+(l<<2)|0;a=c[r+(b<<2)>>2]|0;while(1){if((a|0)>=(c[e>>2]|0))break;g=t+(a<<2)|0;c[s+(c[g>>2]<<2)>>2]=d;c[p+(d<<2)>>2]=c[g>>2];g=a<<1;j=d<<1;h[k+(j<<3)>>3]=+h[n+(g<<3)>>3];h[k+((j|1)<<3)>>3]=+h[n+((g|1)<<3)>>3];a=a+1|0;d=d+1|0}g=u+(l<<2)|0;j=o+(b<<2)|0;f=c[u+(b<<2)>>2]|0;while(1){if((f|0)>=(c[g>>2]|0))break;a=c[v+(f<<2)>>2]|0;e=c[s+(a<<2)>>2]|0;x=f<<1;b=m+((x|1)<<3)|0;i=+h[m+(x<<3)>>3];if((e|0)<(c[j>>2]|0)){c[p+(d<<2)>>2]=a;x=d<<1;h[k+(x<<3)>>3]=i;h[k+((x|1)<<3)>>3]=+h[b>>3];d=d+1|0}else{x=e<<1;e=k+(x<<3)|0;h[e>>3]=i+ +h[e>>3];x=k+((x|1)<<3)|0;h[x>>3]=+h[b>>3]+ +h[x>>3]}f=f+1|0}c[o+(l<<2)>>2]=d;b=l}}case 4:{n=c[d>>2]|0;m=c[a>>2]|0;k=c[e>>2]|0;b=0;d=0;while(1){if((b|0)>=(q|0))break a;l=b+1|0;e=r+(l<<2)|0;a=c[r+(b<<2)>>2]|0;while(1){if((a|0)>=(c[e>>2]|0))break;x=t+(a<<2)|0;c[s+(c[x>>2]<<2)>>2]=d;c[p+(d<<2)>>2]=c[x>>2];c[k+(d<<2)>>2]=c[n+(a<<2)>>2];a=a+1|0;d=d+1|0}g=u+(l<<2)|0;j=o+(b<<2)|0;f=c[u+(b<<2)>>2]|0;while(1){if((f|0)>=(c[g>>2]|0))break;a=c[v+(f<<2)>>2]|0;e=c[s+(a<<2)>>2]|0;b=m+(f<<2)|0;if((e|0)<(c[j>>2]|0)){c[p+(d<<2)>>2]=a;c[k+(d<<2)>>2]=c[b>>2];d=d+1|0}else{x=k+(e<<2)|0;c[x>>2]=(c[x>>2]|0)+(c[b>>2]|0)}f=f+1|0}c[o+(l<<2)>>2]=d;b=l}}case 8:{d=0;b=0;while(1){if((b|0)>=(q|0))break a;j=b+1|0;e=r+(j<<2)|0;a=c[r+(b<<2)>>2]|0;while(1){if((a|0)>=(c[e>>2]|0))break;x=t+(a<<2)|0;c[s+(c[x>>2]<<2)>>2]=d;c[p+(d<<2)>>2]=c[x>>2];d=d+1|0;a=a+1|0}f=u+(j<<2)|0;g=o+(b<<2)|0;e=c[u+(b<<2)>>2]|0;while(1){if((e|0)>=(c[f>>2]|0))break;a=c[v+(e<<2)>>2]|0;if((c[s+(a<<2)>>2]|0)<(c[g>>2]|0)){c[p+(d<<2)>>2]=a;d=d+1|0}e=e+1|0}c[o+(j<<2)>>2]=d;b=j}}default:d=0}while(0);c[w+8>>2]=d;l6(s);return w|0}return 0}function ww(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;a=qw(a,b,d,e,f)|0;if((c|0)>0)rw(a,c)|0;return a|0}function xw(a,b){a=a|0;b=b|0;var d=0;if(!(tw(a,b)|0)){b=mw(a)|0;if(!b)b=0;else{d=vw(a,b)|0;nw(b);b=d+36|0;c[b>>2]=c[b>>2]|3;b=d;d=5}}else{b=uw(a)|0;d=5}if((d|0)==5)b=yw(b)|0;return b|0}function yw(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0;a:do if(!a)a=0;else{k=c[a+20>>2]|0;l=c[a+24>>2]|0;d=c[k>>2]|0;m=a+8|0;b=a+28|0;b:do switch(c[a+16>>2]|0){case 1:{j=c[b>>2]|0;i=0;b=0;while(1){if((i|0)>=(c[a>>2]|0))break b;f=i+1|0;g=k+(f<<2)|0;while(1){e=c[g>>2]|0;if((d|0)>=(e|0))break;e=c[l+(d<<2)>>2]|0;if((e|0)!=(i|0)){c[l+(b<<2)>>2]=e;h[j+(b<<3)>>3]=+h[j+(d<<3)>>3];b=b+1|0}d=d+1|0}c[g>>2]=b;i=f;d=e}}case 2:{j=c[b>>2]|0;i=0;b=0;while(1){if((i|0)>=(c[a>>2]|0))break b;f=i+1|0;g=k+(f<<2)|0;while(1){e=c[g>>2]|0;if((d|0)>=(e|0))break;e=c[l+(d<<2)>>2]|0;if((e|0)!=(i|0)){c[l+(b<<2)>>2]=e;n=d<<1;e=b<<1;h[j+(e<<3)>>3]=+h[j+(n<<3)>>3];h[j+((e|1)<<3)>>3]=+h[j+((n|1)<<3)>>3];b=b+1|0}d=d+1|0}c[g>>2]=b;i=f;d=e}}case 4:{j=c[b>>2]|0;i=0;b=0;while(1){if((i|0)>=(c[a>>2]|0))break b;f=i+1|0;g=k+(f<<2)|0;while(1){e=c[g>>2]|0;if((d|0)>=(e|0))break;e=c[l+(d<<2)>>2]|0;if((e|0)!=(i|0)){c[l+(b<<2)>>2]=e;c[j+(b<<2)>>2]=c[j+(d<<2)>>2];b=b+1|0}d=d+1|0}c[g>>2]=b;i=f;d=e}}case 8:{i=0;b=0;while(1){if((i|0)>=(c[a>>2]|0))break b;f=i+1|0;g=k+(f<<2)|0;while(1){e=c[g>>2]|0;if((d|0)>=(e|0))break;e=c[l+(d<<2)>>2]|0;if((e|0)!=(i|0)){c[l+(b<<2)>>2]=e;b=b+1|0}d=d+1|0}c[g>>2]=b;i=f;d=e}}default:{a=0;break a}}while(0);c[m>>2]=b}while(0);return a|0}function zw(a){a=a|0;if((c[a+32>>2]|0)==2)return Aw(c[a+8>>2]|0,c[a>>2]|0,c[a+4>>2]|0,c[a+20>>2]|0,c[a+24>>2]|0,c[a+28>>2]|0,c[a+16>>2]|0,c[a+40>>2]|0)|0;else Aa(95401,95244,803,95427);return 0}function Aw(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;return Bw(a,b,c,d,e,f,g,h,1)|0}function Bw(a,b,d,e,f,g,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;if(!((a|0)>-1&((b|0)>0&(d|0)>0)))Aa(95463,95244,843,95489);j=ww(b,d,a,i,j,1)|0;if(!j)Aa(95534,95244,847,95489);v=c[j+20>>2]|0;u=c[j+24>>2]|0;m=b+1|0;l=0;while(1){if((l|0)==(m|0))break;c[v+(l<<2)>>2]=0;l=l+1|0}n=j+28|0;a:do switch(i|0){case 1:{n=c[n>>2]|0;l=0;while(1){if((l|0)>=(a|0)){r=0;break}m=c[e+(l<<2)>>2]|0;if(!((m|0)>-1&(m|0)<(b|0))){t=13;break}s=c[f+(l<<2)>>2]|0;if(!((s|0)>-1&(s|0)<(d|0))){t=13;break}s=v+(m+1<<2)|0;c[s>>2]=(c[s>>2]|0)+1;l=l+1|0}if((t|0)==13)Aa(138697,95244,862,95489);while(1){if((r|0)==(b|0)){l=0;break}t=r+1|0;d=v+(t<<2)|0;c[d>>2]=(c[d>>2]|0)+(c[v+(r<<2)>>2]|0);r=t}while(1){if((l|0)==(a|0))break;s=v+(c[e+(l<<2)>>2]<<2)|0;t=c[s>>2]|0;h[n+(t<<3)>>3]=+h[g+(l<<3)>>3];d=c[f+(l<<2)>>2]|0;c[s>>2]=t+1;c[u+(t<<2)>>2]=d;l=l+1|0}while(1){if((b|0)<=0)break a;f=b+-1|0;c[v+(b<<2)>>2]=c[v+(f<<2)>>2];b=f}}case 2:{n=c[n>>2]|0;l=0;while(1){if((l|0)>=(a|0)){s=0;break}m=c[e+(l<<2)>>2]|0;if(!((m|0)>-1&(m|0)<(b|0))){t=25;break}r=c[f+(l<<2)>>2]|0;if(!((r|0)>-1&(r|0)<(d|0))){t=25;break}r=v+(m+1<<2)|0;c[r>>2]=(c[r>>2]|0)+1;l=l+1|0}if((t|0)==25)Aa(138697,95244,880,95489);while(1){if((s|0)==(b|0)){l=0;break}t=s+1|0;d=v+(t<<2)|0;c[d>>2]=(c[d>>2]|0)+(c[v+(s<<2)>>2]|0);s=t}while(1){if((l|0)==(a|0))break;s=v+(c[e+(l<<2)>>2]<<2)|0;t=c[s>>2]|0;d=t<<1;h[n+(d<<3)>>3]=+h[g>>3];h[n+((d|1)<<3)>>3]=+h[g+8>>3];d=c[f+(l<<2)>>2]|0;c[s>>2]=t+1;c[u+(t<<2)>>2]=d;g=g+16|0;l=l+1|0}while(1){if((b|0)<=0)break a;f=b+-1|0;c[v+(b<<2)>>2]=c[v+(f<<2)>>2];b=f}}case 4:{n=c[n>>2]|0;l=0;while(1){if((l|0)>=(a|0)){q=0;break}m=c[e+(l<<2)>>2]|0;if(!((m|0)>-1&(m|0)<(b|0))){t=37;break}s=c[f+(l<<2)>>2]|0;if(!((s|0)>-1&(s|0)<(d|0))){t=37;break}s=v+(m+1<<2)|0;c[s>>2]=(c[s>>2]|0)+1;l=l+1|0}if((t|0)==37)Aa(138697,95244,899,95489);while(1){if((q|0)==(b|0)){l=0;break}t=q+1|0;d=v+(t<<2)|0;c[d>>2]=(c[d>>2]|0)+(c[v+(q<<2)>>2]|0);q=t}while(1){if((l|0)==(a|0))break;s=e+(l<<2)|0;c[n+(c[v+(c[s>>2]<<2)>>2]<<2)>>2]=c[g+(l<<2)>>2];d=c[f+(l<<2)>>2]|0;s=v+(c[s>>2]<<2)|0;t=c[s>>2]|0;c[s>>2]=t+1;c[u+(t<<2)>>2]=d;l=l+1|0}while(1){if((b|0)<=0)break a;f=b+-1|0;c[v+(b<<2)>>2]=c[v+(f<<2)>>2];b=f}}case 8:{g=0;while(1){if((g|0)>=(a|0)){o=0;break}l=c[e+(g<<2)>>2]|0;if(!((l|0)>-1&(l|0)<(b|0))){t=48;break}s=c[f+(g<<2)>>2]|0;if(!((s|0)>-1&(s|0)<(d|0))){t=48;break}s=v+(l+1<<2)|0;c[s>>2]=(c[s>>2]|0)+1;g=g+1|0}if((t|0)==48)Aa(138697,95244,915,95489);while(1){if((o|0)==(b|0)){g=0;break}t=o+1|0;d=v+(t<<2)|0;c[d>>2]=(c[d>>2]|0)+(c[v+(o<<2)>>2]|0);o=t}while(1){if((g|0)==(a|0))break;d=c[f+(g<<2)>>2]|0;s=v+(c[e+(g<<2)>>2]<<2)|0;t=c[s>>2]|0;c[s>>2]=t+1;c[u+(t<<2)>>2]=d;g=g+1|0}while(1){if((b|0)<=0)break a;f=b+-1|0;c[v+(b<<2)>>2]=c[v+(f<<2)>>2];b=f}}case 16:{l=0;while(1){if((l|0)>=(a|0)){p=0;break}m=c[e+(l<<2)>>2]|0;if(!((m|0)>-1&(m|0)<(b|0))){t=59;break}s=c[f+(l<<2)>>2]|0;if(!((s|0)>-1&(s|0)<(d|0))){t=59;break}s=v+(m+1<<2)|0;c[s>>2]=(c[s>>2]|0)+1;l=l+1|0}if((t|0)==59)Aa(138697,95244,930,95489);while(1){if((p|0)==(b|0))break;t=p+1|0;d=v+(t<<2)|0;c[d>>2]=(c[d>>2]|0)+(c[v+(p<<2)>>2]|0);p=t}B6(c[n>>2]|0,g|0,S(c[j+40>>2]|0,a)|0)|0;g=0;while(1){if((g|0)==(a|0))break;d=c[f+(g<<2)>>2]|0;s=v+(c[e+(g<<2)>>2]<<2)|0;t=c[s>>2]|0;c[s>>2]=t+1;c[u+(t<<2)>>2]=d;g=g+1|0}while(1){if((b|0)<=0)break a;f=b+-1|0;c[v+(b<<2)>>2]=c[v+(f<<2)>>2];b=f}}default:Aa(138697,95244,944,95489)}while(0);c[v>>2]=0;c[j+8>>2]=a;if(k)j=Cw(j,k)|0;return j|0}function Cw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;v=c[a+20>>2]|0;w=c[a+24>>2]|0;e=c[a+16>>2]|0;s=c[a+4>>2]|0;a:do if(b){r=s<<2;u=IK(r)|0;d=0;while(1){if((d|0)>=(s|0))break;c[u+(d<<2)>>2]=-1;d=d+1|0}d=a+28|0;b:do switch(e|0){case 1:{k=c[d>>2]|0;f=0;e=c[v>>2]|0;d=0;c:while(1){if((d|0)>=(c[a>>2]|0)){x=f;y=u;break b}m=d+1|0;n=v+(m<<2)|0;j=v+(d<<2)|0;d=f;while(1){b=c[n>>2]|0;if((e|0)>=(b|0))break;b=w+(e<<2)|0;f=c[b>>2]|0;g=c[u+(f<<2)>>2]|0;i=k+(e<<3)|0;if((g|0)<(c[j>>2]|0)){c[w+(d<<2)>>2]=f;h[k+(d<<3)>>3]=+h[i>>3];c[u+(c[b>>2]<<2)>>2]=d;d=d+1|0}else{if((c[w+(g<<2)>>2]|0)!=(f|0))break c;t=k+(g<<3)|0;h[t>>3]=+h[i>>3]+ +h[t>>3]}e=e+1|0}c[n>>2]=d;f=d;e=b;d=m}Aa(95536,95244,1792,95561);break}case 2:{t=c[d>>2]|0;switch(b|0){case 1:{b=c[v>>2]|0;e=0;d=0;d:while(1){if((e|0)>=(c[a>>2]|0)){x=d;y=u;break b}m=e+1|0;n=v+(m<<2)|0;k=v+(e<<2)|0;while(1){e=c[n>>2]|0;if((b|0)>=(e|0))break;e=w+(b<<2)|0;f=c[e>>2]|0;g=c[u+(f<<2)>>2]|0;j=b<<1;i=t+(j<<3)|0;j=t+((j|1)<<3)|0;if((g|0)<(c[k>>2]|0)){c[w+(d<<2)>>2]=f;s=d<<1;h[t+(s<<3)>>3]=+h[i>>3];h[t+((s|1)<<3)>>3]=+h[j>>3];c[u+(c[e>>2]<<2)>>2]=d;d=d+1|0}else{if((c[w+(g<<2)>>2]|0)!=(f|0))break d;s=g<<1;r=t+(s<<3)|0;h[r>>3]=+h[i>>3]+ +h[r>>3];s=t+((s|1)<<3)|0;h[s>>3]=+h[j>>3]+ +h[s>>3]}b=b+1|0}c[n>>2]=d;b=e;e=m}Aa(95536,95244,1815,95561);break}case 4:{b=c[v>>2]|0;e=0;d=0;e:while(1){if((e|0)>=(c[a>>2]|0)){x=d;y=u;break b}m=e+1|0;n=v+(m<<2)|0;k=v+(e<<2)|0;while(1){e=c[n>>2]|0;if((b|0)>=(e|0))break;i=w+(b<<2)|0;j=c[i>>2]|0;e=c[u+(j<<2)>>2]|0;g=b<<1;f=t+(g<<3)|0;g=t+((g|1)<<3)|0;if((e|0)<(c[k>>2]|0)){c[w+(d<<2)>>2]=j;s=d<<1;h[t+(s<<3)>>3]=+h[f>>3];h[t+((s|1)<<3)>>3]=+h[g>>3];c[u+(c[i>>2]<<2)>>2]=d;d=d+1|0}else{if((c[w+(e<<2)>>2]|0)!=(j|0))break e;s=e<<1;r=t+(s<<3)|0;h[r>>3]=+h[f>>3]+ +h[r>>3];h[t+((s|1)<<3)>>3]=+h[g>>3]}b=b+1|0}c[n>>2]=d;b=e;e=m}Aa(95536,95244,1835,95561);break}default:{p=t+8|0;switch(b|0){case 2:break;case 3:{f=~~+h[p>>3];i=c[a>>2]|0;d=f;e=0;g=0;f:while(1){if((g|0)>=(i|0))break;j=g+1|0;k=c[v+(j<<2)>>2]|0;b=d;d=c[v+(g<<2)>>2]|0;while(1){if((d|0)>=(k|0)){d=b;g=j;continue f}q=~~+h[t+(e<<1<<3)>>3];b=(b|0)>(q|0)?b:q;f=(f|0)>(q|0)?f:q;e=e+1|0;d=d+1|0}}l6(u);e=d-f+1|0;o=IK(S(e,r)|0)|0;e=S(e,s)|0;d=0;while(1){if((d|0)>=(e|0))break;c[o+(d<<2)>>2]=-1;d=d+1|0}d=0;b=c[v>>2]|0;e=0;g:while(1){if((e|0)>=(c[a>>2]|0)){x=d;y=o;break b}m=e+1|0;n=v+(m<<2)|0;k=v+(e<<2)|0;while(1){e=c[n>>2]|0;if((b|0)>=(e|0))break;e=c[w+(b<<2)>>2]|0;j=b<<1;l=+h[t+(j<<3)>>3];g=o+((S(~~l-f|0,s)|0)+e<<2)|0;i=c[g>>2]|0;j=t+((j|1)<<3)|0;if((i|0)<(c[k>>2]|0)){c[w+(d<<2)>>2]=e;q=d<<1;h[t+(q<<3)>>3]=l;h[t+((q|1)<<3)>>3]=+h[j>>3];c[g>>2]=d;d=d+1|0}else{if((c[w+(i<<2)>>2]|0)!=(e|0))break g;q=i<<1;h[t+(q<<3)>>3]=l;q=t+((q|1)<<3)|0;h[q>>3]=+h[j>>3]+ +h[q>>3]}b=b+1|0}c[n>>2]=d;b=e;e=m}Aa(95614,95244,1905,95561);break}default:{x=0;y=u;break b}}q=~~+h[p>>3];i=c[a>>2]|0;e=q;g=0;d=0;h:while(1){if((g|0)>=(i|0))break;j=g+1|0;k=c[v+(j<<2)>>2]|0;f=d;b=q;d=c[v+(g<<2)>>2]|0;while(1){if((d|0)>=(k|0)){q=b;g=j;d=f;continue h}q=~~+h[t+((f<<1|1)<<3)>>3];f=f+1|0;e=(e|0)>(q|0)?e:q;b=(b|0)<(q|0)?b:q;d=d+1|0}}l6(u);p=e-q+1|0;o=IK(S(p,r)|0)|0;p=S(p,s)|0;d=0;while(1){if((d|0)>=(p|0))break;c[o+(d<<2)>>2]=-1;d=d+1|0}d=0;b=c[v>>2]|0;e=0;i:while(1){if((e|0)>=(c[a>>2]|0)){x=d;y=o;break b}m=e+1|0;n=v+(m<<2)|0;k=v+(e<<2)|0;while(1){e=c[n>>2]|0;if((b|0)>=(e|0))break;e=c[w+(b<<2)>>2]|0;j=b<<1;l=+h[t+((j|1)<<3)>>3];f=(S(~~l-q|0,s)|0)+e|0;g=o+(f<<2)|0;i=c[g>>2]|0;j=t+(j<<3)|0;if((i|0)<(c[k>>2]|0)){c[w+(d<<2)>>2]=e;u=d<<1;h[t+(u<<3)>>3]=+h[j>>3];h[t+((u|1)<<3)>>3]=l;c[g>>2]=d;d=d+1|0}else{if((f|0)>=(p|0)){d=56;break i}if((c[w+(i<<2)>>2]|0)!=(e|0)){d=58;break i}u=i<<1;r=t+(u<<3)|0;h[r>>3]=+h[j>>3]+ +h[r>>3];h[t+((u|1)<<3)>>3]=l}b=b+1|0}c[n>>2]=d;b=e;e=m}if((d|0)==56)Aa(95593,95244,1869,95561);else if((d|0)==58)Aa(95614,95244,1870,95561)}}break}case 4:{k=c[d>>2]|0;e=0;d=0;b=c[v>>2]|0;j:while(1){if((e|0)>=(c[a>>2]|0)){x=d;y=u;break b}m=e+1|0;n=v+(m<<2)|0;j=v+(e<<2)|0;while(1){f=c[n>>2]|0;if((b|0)>=(f|0))break;e=w+(b<<2)|0;f=c[e>>2]|0;g=c[u+(f<<2)>>2]|0;i=k+(b<<2)|0;if((g|0)<(c[j>>2]|0)){c[w+(d<<2)>>2]=f;c[k+(d<<2)>>2]=c[i>>2];c[u+(c[e>>2]<<2)>>2]=d;d=d+1|0}else{if((c[w+(g<<2)>>2]|0)!=(f|0))break j;t=k+(g<<2)|0;c[t>>2]=(c[t>>2]|0)+(c[i>>2]|0)}b=b+1|0}c[n>>2]=d;e=m;b=f}Aa(95536,95244,1929,95561);break}case 8:{e=0;d=0;b=c[v>>2]|0;k:while(1){if((e|0)>=(c[a>>2]|0)){x=d;y=u;break b}j=e+1|0;k=v+(j<<2)|0;i=v+(e<<2)|0;while(1){f=c[k>>2]|0;if((b|0)>=(f|0))break;e=w+(b<<2)|0;f=c[e>>2]|0;g=c[u+(f<<2)>>2]|0;if((g|0)>=(c[i>>2]|0)){if((c[w+(g<<2)>>2]|0)!=(f|0))break k}else{c[w+(d<<2)>>2]=f;c[u+(c[e>>2]<<2)>>2]=d;d=d+1|0}b=b+1|0}c[k>>2]=d;e=j;b=f}Aa(95536,95244,1948,95561);break}default:{a=0;break a}}while(0);c[a+8>>2]=x;l6(y)}while(0);return a|0}function Dw(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;if(!d)Ew(a,c,e,g,b,f);else Fw(a,c,e,g,b,f);return}function Ew(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0;if((c[a+32>>2]|0)!=1)Aa(95220,95244,1121,95784);if((c[a+16>>2]|0)!=1)Aa(95665,95244,1122,95784);p=c[a+28>>2]|0;q=c[a+20>>2]|0;r=c[a+24>>2]|0;s=c[a>>2]|0;n=c[a+4>>2]|0;a=c[d>>2]|0;i=(a|0)!=0;o=(g|0)!=0;if(!f){if(!i)a=IK(S(e<<3,s)|0)|0;g=0;a:while(1){if((g|0)>=(s|0))break;m=S(g,e)|0;i=0;while(1){if((i|0)>=(e|0))break;h[a+(i+m<<3)>>3]=0.0;i=i+1|0}k=g+1|0;l=c[q+(k<<2)>>2]|0;i=c[q+(g<<2)>>2]|0;while(1){if((i|0)>=(l|0)){g=k;continue a}f=p+(i<<3)|0;j=r+(i<<2)|0;g=0;while(1){if((g|0)>=(e|0))break;t=+h[f>>3]*+h[b+((S(c[j>>2]|0,e)|0)+g<<3)>>3];n=a+(g+m<<3)|0;h[n>>3]=+h[n>>3]+t;g=g+1|0}i=i+1|0}}if(o)Hw(a,s,e)}else{if(!i)a=IK(S(e<<3,n)|0)|0;g=S(n,e)|0;i=0;while(1){if((i|0)>=(g|0)){i=0;break}h[a+(i<<3)>>3]=0.0;i=i+1|0}b:while(1){if((i|0)>=(s|0))break;k=i+1|0;l=c[q+(k<<2)>>2]|0;m=S(i,e)|0;i=c[q+(i<<2)>>2]|0;while(1){if((i|0)>=(l|0)){i=k;continue b}f=p+(i<<3)|0;j=r+(i<<2)|0;g=0;while(1){if((g|0)>=(e|0))break;u=a+((S(c[j>>2]|0,e)|0)+g<<3)|0;h[u>>3]=+h[f>>3]*+h[b+(g+m<<3)>>3]+ +h[u>>3];g=g+1|0}i=i+1|0}}if(o)Hw(a,n,e)}c[d>>2]=a;return}function Fw(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;n=o;if((c[a+32>>2]|0)!=1)Aa(95220,95244,1163,95636);if((c[a+16>>2]|0)!=1)Aa(95665,95244,1164,95636);h=c[d>>2]|0;k=c[a>>2]|0;m=c[a+4>>2]|0;i=(h|0)!=0;j=(g|0)!=0;if(!f){if(!i)h=IK(S(e<<3,k)|0)|0;g=0;while(1){if((g|0)>=(e|0))break;c[n>>2]=h+((S(g,k)|0)<<3);Gw(a,b+((S(g,m)|0)<<3)|0,n,0);g=g+1|0}if(!j)Hw(h,e,k)}else{if(!i)h=IK(S(e<<3,m)|0)|0;g=0;while(1){if((g|0)>=(e|0))break;c[n>>2]=h+((S(g,m)|0)<<3);Gw(a,b+((S(g,k)|0)<<3)|0,n,f);g=g+1|0}if(!j)Hw(h,e,m)}c[d>>2]=h;l=o;return}function Gw(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0;if((c[a+32>>2]|0)!=1)Aa(95220,95244,1222,95693);n=c[a+16>>2]|0;switch(n|0){case 4:case 1:break;default:Aa(95722,95244,1223,95693)}r=c[a+20>>2]|0;p=c[a+24>>2]|0;s=c[a>>2]|0;o=c[a+4>>2]|0;i=c[d>>2]|0;l=s<<3;m=(i|0)!=0;e=(e|0)!=0;j=(b|0)!=0;k=o<<3;q=c[a+28>>2]|0;a:do switch(n|0){case 1:if(j){if(!e){if(m)g=i;else g=IK(l)|0;e=0;b:while(1){if((e|0)>=(s|0))break a;a=g+(e<<3)|0;h[a>>3]=0.0;i=e+1|0;j=c[r+(i<<2)>>2]|0;e=c[r+(e<<2)>>2]|0;f=0.0;while(1){if((e|0)>=(j|0)){e=i;continue b}t=f+ +h[q+(e<<3)>>3]*+h[b+(c[p+(e<<2)>>2]<<3)>>3];h[a>>3]=t;e=e+1|0;f=t}}}if(m)g=i;else g=IK(k)|0;e=0;while(1){if((e|0)>=(o|0)){e=0;break}h[g+(e<<3)>>3]=0.0;e=e+1|0}c:while(1){if((e|0)>=(s|0))break a;a=e+1|0;i=c[r+(a<<2)>>2]|0;j=b+(e<<3)|0;e=c[r+(e<<2)>>2]|0;while(1){if((e|0)>=(i|0)){e=a;continue c}o=g+(c[p+(e<<2)>>2]<<3)|0;h[o>>3]=+h[q+(e<<3)>>3]*+h[j>>3]+ +h[o>>3];e=e+1|0}}}else{if(!e){if(m)g=i;else g=IK(l)|0;e=0;d:while(1){if((e|0)>=(s|0))break a;a=g+(e<<3)|0;h[a>>3]=0.0;i=e+1|0;j=c[r+(i<<2)>>2]|0;e=c[r+(e<<2)>>2]|0;f=0.0;while(1){if((e|0)>=(j|0)){e=i;continue d}t=+h[q+(e<<3)>>3]+f;h[a>>3]=t;e=e+1|0;f=t}}}if(!m)i=IK(k)|0;e=0;while(1){if((e|0)>=(o|0)){e=0;break}h[i+(e<<3)>>3]=0.0;e=e+1|0}e:while(1){if((e|0)>=(s|0)){g=i;break a}g=e+1|0;a=c[r+(g<<2)>>2]|0;e=c[r+(e<<2)>>2]|0;while(1){if((e|0)>=(a|0)){e=g;continue e}b=i+(c[p+(e<<2)>>2]<<3)|0;h[b>>3]=+h[q+(e<<3)>>3]+ +h[b>>3];e=e+1|0}}}case 4:if(j){if(!e){if(m)g=i;else g=IK(l)|0;e=0;f:while(1){if((e|0)>=(s|0))break a;a=g+(e<<3)|0;h[a>>3]=0.0;i=e+1|0;j=c[r+(i<<2)>>2]|0;e=c[r+(e<<2)>>2]|0;f=0.0;while(1){if((e|0)>=(j|0)){e=i;continue f}t=f+ +(c[q+(e<<2)>>2]|0)*+h[b+(c[p+(e<<2)>>2]<<3)>>3];h[a>>3]=t;e=e+1|0;f=t}}}if(m)g=i;else g=IK(k)|0;e=0;while(1){if((e|0)>=(o|0)){e=0;break}h[g+(e<<3)>>3]=0.0;e=e+1|0}g:while(1){if((e|0)>=(s|0))break a;a=e+1|0;i=c[r+(a<<2)>>2]|0;j=b+(e<<3)|0;e=c[r+(e<<2)>>2]|0;while(1){if((e|0)>=(i|0)){e=a;continue g}o=g+(c[p+(e<<2)>>2]<<3)|0;h[o>>3]=+(c[q+(e<<2)>>2]|0)*+h[j>>3]+ +h[o>>3];e=e+1|0}}}else{if(!e){if(m)g=i;else g=IK(l)|0;e=0;h:while(1){if((e|0)>=(s|0))break a;a=g+(e<<3)|0;h[a>>3]=0.0;i=e+1|0;j=c[r+(i<<2)>>2]|0;e=c[r+(e<<2)>>2]|0;f=0.0;while(1){if((e|0)>=(j|0)){e=i;continue h}t=f+ +(c[q+(e<<2)>>2]|0);h[a>>3]=t;e=e+1|0;f=t}}}if(!m)i=IK(k)|0;e=0;while(1){if((e|0)>=(o|0)){e=0;break}h[i+(e<<3)>>3]=0.0;e=e+1|0}i:while(1){if((e|0)>=(s|0)){g=i;break a}g=e+1|0;a=c[r+(g<<2)>>2]|0;e=c[r+(e<<2)>>2]|0;while(1){if((e|0)>=(a|0)){e=g;continue i}b=i+(c[p+(e<<2)>>2]<<3)|0;h[b>>3]=+(c[q+(e<<2)>>2]|0)+ +h[b>>3];e=e+1|0}}}default:Aa(138697,95244,1315,95693)}while(0);c[d>>2]=g;return}function Hw(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=S(b<<3,c)|0;f=IK(d)|0;B6(f|0,a|0,d|0)|0;d=0;while(1){if((d|0)>=(b|0))break;g=S(d,c)|0;e=0;while(1){if((e|0)>=(c|0))break;h[a+((S(e,b)|0)+d<<3)>>3]=+h[f+(e+g<<3)>>3];e=e+1|0}d=d+1|0}l6(f);return}function Iw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;z=c[a+20>>2]|0;A=c[a+24>>2]|0;B=c[b+20>>2]|0;C=c[b+24>>2]|0;y=c[a+32>>2]|0;if(!((y|0)==1?(y|0)==(c[b+32>>2]|0):0))Aa(95306,95244,1408,95813);y=c[a>>2]|0;if(((c[a+4>>2]|0)==(c[b>>2]|0)?(n=c[a+16>>2]|0,(n|0)==(c[b+16>>2]|0)):0)?(m=b+4|0,D=IK(c[m>>2]<<2)|0,(D|0)!=0):0){d=0;while(1){if((d|0)>=(c[m>>2]|0)){e=0;d=0;break}c[D+(d<<2)>>2]=-1;d=d+1|0}a:while(1){if((d|0)>=(y|0))break;j=d+1|0;k=z+(j<<2)|0;l=-2-d|0;i=c[z+(d<<2)>>2]|0;while(1){if((i|0)>=(c[k>>2]|0)){d=j;continue a}f=c[A+(i<<2)>>2]|0;g=B+(f+1<<2)|0;f=c[B+(f<<2)>>2]|0;while(1){if((f|0)>=(c[g>>2]|0))break;d=D+(c[C+(f<<2)>>2]<<2)|0;if((c[d>>2]|0)!=(l|0)){c[d>>2]=l;e=e+1|0}f=f+1|0}i=i+1|0}}d=ow(y,c[m>>2]|0,e,n,1)|0;b:do if(!d)d=0;else{v=c[d+20>>2]|0;w=c[d+24>>2]|0;f=b+28|0;g=d+28|0;e=a+28|0;c:do switch(n|0){case 1:{s=c[e>>2]|0;r=c[f>>2]|0;n=c[g>>2]|0;c[v>>2]=0;e=0;f=0;d:while(1){if((e|0)>=(y|0)){x=f;break c}o=e+1|0;p=z+(o<<2)|0;q=v+(e<<2)|0;a=c[z+(e<<2)>>2]|0;while(1){if((a|0)>=(c[p>>2]|0))break;l=c[A+(a<<2)>>2]|0;m=B+(l+1<<2)|0;b=s+(a<<3)|0;l=c[B+(l<<2)>>2]|0;while(1){if((l|0)>=(c[m>>2]|0))break;e=C+(l<<2)|0;g=c[e>>2]|0;i=D+(g<<2)|0;j=c[i>>2]|0;k=r+(l<<3)|0;if((j|0)<(c[q>>2]|0)){c[i>>2]=f;c[w+(f<<2)>>2]=c[e>>2];h[n+(f<<3)>>3]=+h[b>>3]*+h[k>>3];f=f+1|0}else{if((c[w+(j<<2)>>2]|0)!=(g|0))break d;u=n+(j<<3)|0;h[u>>3]=+h[u>>3]+ +h[b>>3]*+h[k>>3]}l=l+1|0}a=a+1|0}c[v+(o<<2)>>2]=f;e=o}Aa(95835,95244,1468,95813);break}case 2:{u=c[e>>2]|0;t=c[f>>2]|0;p=c[g>>2]|0;c[v>>2]=0;e=0;f=0;e:while(1){if((e|0)>=(y|0)){x=f;break c}q=e+1|0;r=z+(q<<2)|0;s=v+(e<<2)|0;o=c[z+(e<<2)>>2]|0;while(1){if((o|0)>=(c[r>>2]|0))break;m=c[A+(o<<2)>>2]|0;b=B+(m+1<<2)|0;n=o<<1;a=u+(n<<3)|0;n=u+((n|1)<<3)|0;m=c[B+(m<<2)>>2]|0;while(1){if((m|0)>=(c[b>>2]|0))break;e=C+(m<<2)|0;g=c[e>>2]|0;i=D+(g<<2)|0;j=c[i>>2]|0;l=m<<1;k=t+(l<<3)|0;l=t+((l|1)<<3)|0;if((j|0)<(c[s>>2]|0)){c[i>>2]=f;c[w+(f<<2)>>2]=c[e>>2];j=f<<1;h[p+(j<<3)>>3]=+h[a>>3]*+h[k>>3]-+h[n>>3]*+h[l>>3];h[p+((j|1)<<3)>>3]=+h[a>>3]*+h[l>>3]+ +h[n>>3]*+h[k>>3];f=f+1|0}else{if((c[w+(j<<2)>>2]|0)!=(g|0))break e;j=j<<1;i=p+(j<<3)|0;h[i>>3]=+h[i>>3]+(+h[a>>3]*+h[k>>3]-+h[n>>3]*+h[l>>3]);j=p+((j|1)<<3)|0;h[j>>3]=+h[a>>3]*+h[l>>3]+ +h[n>>3]*+h[k>>3]+ +h[j>>3]}m=m+1|0}o=o+1|0}c[v+(q<<2)>>2]=f;e=q}Aa(95835,95244,1497,95813);break}case 4:{s=c[e>>2]|0;r=c[f>>2]|0;n=c[g>>2]|0;c[v>>2]=0;e=0;f=0;f:while(1){if((f|0)>=(y|0)){x=e;break c}o=f+1|0;p=z+(o<<2)|0;q=v+(f<<2)|0;m=c[z+(f<<2)>>2]|0;while(1){if((m|0)>=(c[p>>2]|0))break;l=c[A+(m<<2)>>2]|0;b=B+(l+1<<2)|0;a=s+(m<<2)|0;l=c[B+(l<<2)>>2]|0;while(1){if((l|0)>=(c[b>>2]|0))break;f=C+(l<<2)|0;g=c[f>>2]|0;i=D+(g<<2)|0;j=c[i>>2]|0;k=r+(l<<2)|0;if((j|0)<(c[q>>2]|0)){c[i>>2]=e;c[w+(e<<2)>>2]=c[f>>2];c[n+(e<<2)>>2]=S(c[k>>2]|0,c[a>>2]|0)|0;e=e+1|0}else{if((c[w+(j<<2)>>2]|0)!=(g|0))break f;t=S(c[k>>2]|0,c[a>>2]|0)|0;u=n+(j<<2)|0;c[u>>2]=(c[u>>2]|0)+t}l=l+1|0}m=m+1|0}c[v+(o<<2)>>2]=e;f=o}Aa(95835,95244,1523,95813);break}case 8:{c[v>>2]=0;e=0;f=0;g:while(1){if((f|0)>=(y|0)){x=e;break c}b=f+1|0;a=z+(b<<2)|0;n=v+(f<<2)|0;l=c[z+(f<<2)>>2]|0;while(1){if((l|0)>=(c[a>>2]|0))break;k=c[A+(l<<2)>>2]|0;m=B+(k+1<<2)|0;k=c[B+(k<<2)>>2]|0;while(1){if((k|0)>=(c[m>>2]|0))break;f=C+(k<<2)|0;g=c[f>>2]|0;i=D+(g<<2)|0;j=c[i>>2]|0;if((j|0)>=(c[n>>2]|0)){if((c[w+(j<<2)>>2]|0)!=(g|0))break g}else{c[i>>2]=e;c[w+(e<<2)>>2]=c[f>>2];e=e+1|0}k=k+1|0}l=l+1|0}c[v+(b<<2)>>2]=e;f=b}Aa(95835,95244,1543,95813);break}default:{nw(d);d=0;break b}}while(0);c[d+8>>2]=x}while(0);l6(D)}else d=0;return d|0}function Jw(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0.0,O=0.0;H=c[a+20>>2]|0;I=c[a+24>>2]|0;J=c[b+20>>2]|0;D=c[b+24>>2]|0;E=c[d+20>>2]|0;F=c[d+24>>2]|0;G=c[a+32>>2]|0;if(!((G|0)==1?(G|0)==(c[b+32>>2]|0):0))Aa(95306,95244,1574,95860);G=c[a>>2]|0;if(((((c[a+4>>2]|0)==(c[b>>2]|0)?(c[b+4>>2]|0)==(c[d>>2]|0):0)?(q=c[a+16>>2]|0,(q|0)==(c[b+16>>2]|0)):0)?(q|0)==(c[d+16>>2]|0):0)?(p=d+4|0,K=IK(c[p>>2]<<2)|0,(K|0)!=0):0){e=0;while(1){if((e|0)>=(c[p>>2]|0)){f=0;e=0;break}c[K+(e<<2)>>2]=-1;e=e+1|0}a:while(1){if((e|0)>=(G|0))break;m=e+1|0;n=H+(m<<2)|0;o=-2-e|0;l=c[H+(e<<2)>>2]|0;while(1){if((l|0)>=(c[n>>2]|0)){e=m;continue a}j=c[I+(l<<2)>>2]|0;k=J+(j+1<<2)|0;j=c[J+(j<<2)>>2]|0;while(1){if((j|0)>=(c[k>>2]|0))break;g=c[D+(j<<2)>>2]|0;i=E+(g+1<<2)|0;g=c[E+(g<<2)>>2]|0;while(1){if((g|0)>=(c[i>>2]|0))break;e=K+(c[F+(g<<2)>>2]<<2)|0;if((c[e>>2]|0)!=(o|0)){c[e>>2]=o;f=f+1|0}g=g+1|0}j=j+1|0}l=l+1|0}}e=ow(G,c[p>>2]|0,f,q,1)|0;b:do if(!e)e=0;else{A=c[e+20>>2]|0;B=c[e+24>>2]|0;g=b+28|0;f=a+28|0;j=e+28|0;i=d+28|0;c:do switch(q|0){case 1:{w=c[f>>2]|0;v=c[g>>2]|0;u=c[i>>2]|0;r=c[j>>2]|0;c[A>>2]=0;f=0;g=0;d:while(1){if((f|0)>=(G|0)){C=g;break c}s=f+1|0;t=H+(s<<2)|0;q=A+(f<<2)|0;d=c[H+(f<<2)>>2]|0;while(1){if((d|0)>=(c[t>>2]|0))break;p=c[I+(d<<2)>>2]|0;b=J+(p+1<<2)|0;a=w+(d<<3)|0;p=c[J+(p<<2)>>2]|0;while(1){if((p|0)>=(c[b>>2]|0))break;m=c[D+(p<<2)>>2]|0;n=E+(m+1<<2)|0;o=v+(p<<3)|0;m=c[E+(m<<2)>>2]|0;while(1){if((m|0)>=(c[n>>2]|0))break;f=F+(m<<2)|0;i=c[f>>2]|0;j=K+(i<<2)|0;k=c[j>>2]|0;l=u+(m<<3)|0;if((k|0)<(c[q>>2]|0)){c[j>>2]=g;c[B+(g<<2)>>2]=c[f>>2];h[r+(g<<3)>>3]=+h[a>>3]*+h[o>>3]*+h[l>>3];g=g+1|0}else{if((c[B+(k<<2)>>2]|0)!=(i|0))break d;z=r+(k<<3)|0;h[z>>3]=+h[z>>3]+ +h[a>>3]*+h[o>>3]*+h[l>>3]}m=m+1|0}p=p+1|0}d=d+1|0}c[A+(s<<2)>>2]=g;f=s}Aa(95883,95244,1642,95860);break}case 2:{z=c[f>>2]|0;y=c[g>>2]|0;x=c[i>>2]|0;t=c[j>>2]|0;c[A>>2]=0;f=0;g=0;e:while(1){if((g|0)>=(G|0)){C=f;break c}u=g+1|0;v=H+(u<<2)|0;w=A+(g<<2)|0;d=c[H+(g<<2)>>2]|0;while(1){if((d|0)>=(c[v>>2]|0))break;o=c[I+(d<<2)>>2]|0;q=J+(o+1<<2)|0;s=d<<1;r=z+(s<<3)|0;s=z+((s|1)<<3)|0;o=c[J+(o<<2)>>2]|0;while(1){if((o|0)>=(c[q>>2]|0))break;n=c[D+(o<<2)>>2]|0;p=E+(n+1<<2)|0;a=o<<1;b=y+(a<<3)|0;a=y+((a|1)<<3)|0;n=c[E+(n<<2)>>2]|0;while(1){if((n|0)>=(c[p>>2]|0))break;g=F+(n<<2)|0;i=c[g>>2]|0;j=K+(i<<2)|0;k=c[j>>2]|0;m=n<<1;l=x+(m<<3)|0;m=x+((m|1)<<3)|0;if((k|0)<(c[w>>2]|0)){c[j>>2]=f;c[B+(f<<2)>>2]=c[g>>2];M=+h[r>>3];N=+h[b>>3];L=+h[s>>3];O=+h[a>>3];k=f<<1;h[t+(k<<3)>>3]=+h[l>>3]*(M*N-L*O)-(N*L+M*O)*+h[m>>3];O=+h[r>>3];M=+h[a>>3];L=+h[s>>3];N=+h[b>>3];h[t+((k|1)<<3)>>3]=+h[l>>3]*(O*M+L*N)+(O*N-M*L)*+h[m>>3];f=f+1|0}else{if((c[B+(k<<2)>>2]|0)!=(i|0))break e;N=+h[r>>3];M=+h[b>>3];O=+h[s>>3];L=+h[a>>3];k=k<<1;j=t+(k<<3)|0;h[j>>3]=+h[j>>3]+(+h[l>>3]*(N*M-O*L)-(M*O+N*L)*+h[m>>3]);L=+h[r>>3];N=+h[a>>3];O=+h[s>>3];M=+h[b>>3];k=t+((k|1)<<3)|0;h[k>>3]=+h[l>>3]*(L*N+O*M)+(L*M-N*O)*+h[m>>3]+ +h[k>>3]}n=n+1|0}o=o+1|0}d=d+1|0}c[A+(u<<2)>>2]=f;g=u}Aa(95883,95244,1674,95860);break}case 4:{w=c[f>>2]|0;v=c[g>>2]|0;u=c[i>>2]|0;q=c[j>>2]|0;c[A>>2]=0;f=0;g=0;f:while(1){if((g|0)>=(G|0)){C=f;break c}r=g+1|0;s=H+(r<<2)|0;t=A+(g<<2)|0;b=c[H+(g<<2)>>2]|0;while(1){if((b|0)>=(c[s>>2]|0))break;n=c[I+(b<<2)>>2]|0;a=J+(n+1<<2)|0;d=w+(b<<2)|0;n=c[J+(n<<2)>>2]|0;while(1){if((n|0)>=(c[a>>2]|0))break;m=c[D+(n<<2)>>2]|0;o=E+(m+1<<2)|0;p=v+(n<<2)|0;m=c[E+(m<<2)>>2]|0;while(1){if((m|0)>=(c[o>>2]|0))break;g=F+(m<<2)|0;i=c[g>>2]|0;j=K+(i<<2)|0;k=c[j>>2]|0;l=u+(m<<2)|0;if((k|0)<(c[t>>2]|0)){c[j>>2]=f;c[B+(f<<2)>>2]=c[g>>2];y=S(c[p>>2]|0,c[d>>2]|0)|0;y=S(y,c[l>>2]|0)|0;z=q+(f<<2)|0;c[z>>2]=(c[z>>2]|0)+y;f=f+1|0}else{if((c[B+(k<<2)>>2]|0)!=(i|0))break f;y=S(c[p>>2]|0,c[d>>2]|0)|0;y=S(y,c[l>>2]|0)|0;z=q+(k<<2)|0;c[z>>2]=(c[z>>2]|0)+y}m=m+1|0}n=n+1|0}b=b+1|0}c[A+(r<<2)>>2]=f;g=r}Aa(95883,95244,1706,95860);break}case 8:{c[A>>2]=0;f=0;g=0;g:while(1){if((g|0)>=(G|0)){C=f;break c}b=g+1|0;a=H+(b<<2)|0;d=A+(g<<2)|0;o=c[H+(g<<2)>>2]|0;while(1){if((o|0)>=(c[a>>2]|0))break;m=c[I+(o<<2)>>2]|0;p=J+(m+1<<2)|0;m=c[J+(m<<2)>>2]|0;while(1){if((m|0)>=(c[p>>2]|0))break;l=c[D+(m<<2)>>2]|0;n=E+(l+1<<2)|0;l=c[E+(l<<2)>>2]|0;while(1){if((l|0)>=(c[n>>2]|0))break;g=F+(l<<2)|0;i=c[g>>2]|0;j=K+(i<<2)|0;k=c[j>>2]|0;if((k|0)>=(c[d>>2]|0)){if((c[B+(k<<2)>>2]|0)!=(i|0))break g}else{c[j>>2]=f;c[B+(f<<2)>>2]=c[g>>2];f=f+1|0}l=l+1|0}m=m+1|0}o=o+1|0}c[A+(b<<2)>>2]=f;g=b}Aa(95883,95244,1729,95860);break}default:{nw(e);e=0;break b}}while(0);c[e+8>>2]=C}while(0);l6(K)}else e=0;return e|0}function Kw(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;if((c[a+32>>2]|0)!=2)Aa(95401,95244,1971,95908);if((b|0)>=1){h=c[a+8>>2]|0;g=h+b|0;if((g|0)>=(c[a+12>>2]|0))Lw(a,g+10|0)|0;i=h<<2;g=b<<2;B6((c[a+20>>2]|0)+i|0,d|0,g|0)|0;B6((c[a+24>>2]|0)+i|0,e|0,g|0)|0;g=c[a+40>>2]|0;if(g|0){i=S(g,b)|0;h=S(g,h)|0;B6((c[a+28>>2]|0)+h|0,f|0,i|0)|0}f=a+4|0;h=0;while(1){if((h|0)>=(b|0))break;g=c[d+(h<<2)>>2]|0;if((g|0)>=(c[a>>2]|0))c[a>>2]=g+1;g=c[e+(h<<2)>>2]|0;if((g|0)>=(c[f>>2]|0))c[f>>2]=g+1;h=h+1|0}i=a+8|0;c[i>>2]=(c[i>>2]|0)+b}return a|0}function Lw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=b<<2;f=a+28|0;if((c[a+32>>2]|0)==2){e=a+20|0;c[e>>2]=KK(c[e>>2]|0,d)|0;e=a+24|0;c[e>>2]=KK(c[e>>2]|0,d)|0;d=c[a+40>>2]|0;if((d|0)>0){e=c[f>>2]|0;d=S(d,b)|0;if(!e)d=IK(d)|0;else d=KK(e,d)|0;c[f>>2]=d}}else{e=a+24|0;c[e>>2]=KK(c[e>>2]|0,d)|0;d=c[a+40>>2]|0;if((d|0)>0){e=c[f>>2]|0;d=S(d,b)|0;if(!e)d=IK(d)|0;else d=KK(e,d)|0;c[f>>2]=d}}c[a+12>>2]=b;return a|0}function Mw(a){a=a|0;var b=0,d=0.0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0;a:do if(!a)a=0;else{l=c[a+20>>2]|0;k=c[a+24>>2]|0;b=a+28|0;b:do switch(c[a+16>>2]|0){case 1:{i=c[b>>2]|0;e=c[a>>2]|0;b=0;c:while(1){if((b|0)>=(e|0))break b;f=b+1|0;g=c[l+(f<<2)>>2]|0;b=c[l+(b<<2)>>2]|0;d=+(g-b|0);while(1){if((b|0)>=(g|0)){b=f;continue c}k=i+(b<<3)|0;h[k>>3]=+h[k>>3]/d;b=b+1|0}}}case 2:{f=c[b>>2]|0;g=c[a>>2]|0;b=0;d:while(1){if((b|0)>=(g|0))break b;i=b+1|0;j=c[l+(i<<2)>>2]|0;e=c[l+(b<<2)>>2]|0;d=+(j-e|0);while(1){if((e|0)>=(j|0)){b=i;continue d}if((c[k+(e<<2)>>2]|0)!=(b|0)){m=e<<1;n=f+(m<<3)|0;h[n>>3]=+h[n>>3]/d;m=f+((m|1)<<3)|0;h[m>>3]=+h[m>>3]/d}e=e+1|0}}}case 4:{Aa(138697,95244,2192,95949);break}case 8:break;default:{a=0;break a}}while(0)}while(0);return a|0}function Nw(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;if((a|0)!=0?(b=a+8|0,d=c[b>>2]|0,e=c[a+4>>2]|0,(e|0)==(c[a>>2]|0)):0){g=c[a+24>>2]|0;a=c[a+20>>2]|0;f=ow(e,e,d,8,1)|0;B6(c[f+20>>2]|0,a|0,(e<<2)+4|0)|0;B6(c[f+24>>2]|0,g|0,d<<2|0)|0;c[f+8>>2]=c[b>>2];a=sw(f,1)|0;nw(f);a=yw(a)|0;e=a+8|0;d=IK(c[e>>2]<<3)|0;c[a+28>>2]=d;e=c[e>>2]|0;b=0;while(1){if((b|0)>=(e|0))break;h[d+(b<<3)>>3]=1.0;b=b+1|0}c[a+16>>2]=1;c[a+40>>2]=8}else a=0;return a|0}function Ow(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;q=c[a+20>>2]|0;r=c[a+24>>2]|0;w=c[a+4>>2]|0;o=c[a>>2]|0;s=w<<2;t=IK(s)|0;u=IK(s+4|0)|0;v=IK(s)|0;s=IK(s)|0;p=u+4|0;a=0;while(1){if((a|0)>=(w|0))break;c[t+(a<<2)>>2]=0;a=a+1|0}c[p>>2]=w;a=0;while(1){if((a|0)>=(w|0)){h=1;l=0;break}c[v+(a<<2)>>2]=-1;a=a+1|0}a:while(1){if((l|0)>=(o|0))break;g=q+(l<<2)|0;m=l+1|0;n=q+(m<<2)|0;a=c[g>>2]|0;while(1){f=c[n>>2]|0;if((a|0)>=(f|0))break;k=p+(c[t+(c[r+(a<<2)>>2]<<2)>>2]<<2)|0;c[k>>2]=(c[k>>2]|0)+-1;a=a+1|0}a=h;k=c[g>>2]|0;while(1){if((k|0)>=(f|0)){h=a;l=m;continue a}j=r+(k<<2)|0;g=t+(c[j>>2]<<2)|0;i=c[g>>2]|0;h=v+(i<<2)|0;f=s+(i<<2)|0;if((c[h>>2]|0)<(l|0)){c[h>>2]=l;g=p+(i<<2)|0;if(!(c[g>>2]|0)){c[g>>2]=1;g=a;a=i}else{c[f>>2]=a;c[p+(a<<2)>>2]=1;g=a+1|0;f=t+(c[j>>2]<<2)|0}c[f>>2]=a;a=g}else{c[g>>2]=c[f>>2];j=p+(c[f>>2]<<2)|0;c[j>>2]=(c[j>>2]|0)+1}k=k+1|0;f=c[n>>2]|0}}c[u>>2]=0;a=0;f=0;while(1){if((a|0)>=(h|0))break;q=a+1|0;p=u+(q<<2)|0;r=(c[p>>2]|0)+f|0;c[p>>2]=r;a=q;f=r}c[d>>2]=s;a=0;while(1){if((a|0)>=(w|0)){a=h;break}r=u+(c[t+(a<<2)>>2]<<2)|0;d=c[r>>2]|0;c[r>>2]=d+1;c[s+(d<<2)>>2]=a;a=a+1|0}while(1){if((a|0)<=0)break;w=a+-1|0;c[u+(a<<2)>>2]=c[u+(w<<2)>>2];a=w}c[u>>2]=0;c[e>>2]=u;c[b>>2]=h;l6(v);l6(t);return}function Pw(){return +(+(U4()|0)/2147483647.0)}function Qw(a){a=a|0;if((a|0)>1)return (U4()|0)%(a|0)|0|0;else Aa(95983,95989,58,95999);return 0}function Rw(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;a:do if((a|0)<1)b=0;else{b=IK(a<<2)|0;d=0;while(1){if((d|0)==(a|0))break;c[b+(d<<2)>>2]=d;d=d+1|0}while(1){if((a|0)<=1)break a;e=Qw(a)|0;d=a+-1|0;g=b+(d<<2)|0;f=c[g>>2]|0;e=b+(e<<2)|0;c[g>>2]=c[e>>2];c[e>>2]=f;a=d}}while(0);return b|0}function Sw(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=0;while(1){if((d|0)>=(a|0))break;e=c+(d<<3)|0;h[e>>3]=+h[b+(d<<3)>>3]-+h[e>>3];d=d+1|0}return c|0}function Tw(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0.0,f=0.0;d=0;e=0.0;while(1){if((d|0)>=(a|0))break;f=e+ +h[b+(d<<3)>>3]*+h[c+(d<<3)>>3];d=d+1|0;e=f}return +e}function Uw(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;var e=0,f=0;e=0;while(1){if((e|0)>=(a|0))break;f=c+(e<<3)|0;h[f>>3]=+h[b+(e<<3)>>3]+ +h[f>>3]*d;e=e+1|0}return c|0}function Vw(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;var e=0,f=0;e=0;while(1){if((e|0)>=(a|0))break;f=b+(e<<3)|0;h[f>>3]=+h[f>>3]+ +h[c+(e<<3)>>3]*d;e=e+1|0}return b|0}function Ww(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0,g=0.0;f=S(c,b)|0;d=S(d,b)|0;e=0.0;c=0;while(1){if((c|0)>=(b|0))break;g=+h[a+(c+f<<3)>>3]-+h[a+(c+d<<3)>>3];e=e+g*g;c=c+1|0}g=+G(+e);return +(g>1.0e-15?g:1.0e-15)}function Xw(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0,g=0.0;f=S(c,b)|0;d=S(d,b)|0;e=0.0;c=0;while(1){if((c|0)>=(b|0))break;g=+h[a+(c+f<<3)>>3]-+h[a+(c+d<<3)>>3];e=e+g*g;c=c+1|0}return +(+G(+e))}function Yw(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,e=0,f=0.0;d=0.0;e=0;while(1){if((e|0)>=(c|0))break;f=+h[a+(e<<3)>>3]-+h[b+(e<<3)>>3];d=d+f*f;e=e+1|0}return +(+G(+d))}function Zw(a,b,c,d,e,f,g){a=+a;b=+b;c=+c;d=+d;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0.0;p=l;l=l+80|0;n=p+48|0;m=p+24|0;o=p;i=0;while(1){if((i|0)>=(f|0)){j=0;break}q=+h[g+(i<<3)>>3];h[n+(i<<3)>>3]=q;h[m+(i<<3)>>3]=q;i=i+1|0}while(1){if((j|0)>=(e|0))break;k=S(j,f)|0;i=0;while(1){if((i|0)>=(f|0))break;s=+h[g+(i+k<<3)>>3];r=n+(i<<3)|0;q=+h[r>>3];h[r>>3]=s>3];h[r>>3]=s>q?s:q;i=i+1|0}j=j+1|0}q=+h[m>>3]-+h[n>>3];c=q!=0.0?(c-a)/q:1.0;q=+h[m+8>>3]-+h[n+8>>3];s=(d-b)/q;c=q!=0.0?(c>3]=a;h[o+8>>3]=b;h[o+16>>3]=0.0;j=0;while(1){if((j|0)>=(e|0))break;k=S(j,f)|0;i=0;while(1){if((i|0)>=(f|0))break;r=g+(i+k<<3)|0;h[r>>3]=+h[o+(i<<3)>>3]+c*(+h[r>>3]-+h[n+(i<<3)>>3]);i=i+1|0}j=j+1|0}l=p;return}function _w(a,b){a=a|0;b=b|0;if((qB(a)|0)==1){a=c[(c[(gC(a)|0)+16>>2]|0)+132>>2]|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0}else{$w(a);if(!((bP(NA(b,96005)|0)|0)<<24>>24))b=Jy(a,186376)|0;else b=ax(a)|0;Sy(a,b,186376);bx(b)}return}function $w(a){a=a|0;var b=0;b=uC(c[c[(c[(gC(a)|0)+16>>2]|0)+112>>2]>>2]|0)|0;a=c[46967]|0;if((b|0)!=(a|0)){c[46597]=0;c[46967]=b;c[46968]=DA(b,0,96014,0)|0;c[46969]=DA(c[46967]|0,1,96022,0)|0;c[46970]=DA(c[46967]|0,1,96039,0)|0;a=c[46967]|0}c[46971]=NA(a,96039)|0;Dy(186376);c[46596]=1;h[23301]=+YO(c[46967]|0,c[46968]|0,1.0,0.0);c[46598]=c[46969];c[46599]=c[46970];c[46600]=c[46971];return}function ax(a){a=a|0;var b=0,d=0,e=0,f=0;f=l;l=l+144|0;e=f;d=f+8|0;b=c[46597]|0;c[46597]=b+1;c[e>>2]=b;i2(d,96535,e)|0;d=Ey(LD(a,d,1)|0)|0;e=d+8|0;b=gC(a)|0;while(1){if(!b)break;lC(c[e>>2]|0,b,1)|0;c[(c[(c[b+16>>2]|0)+112>>2]|0)+12>>2]=d;b=hC(a,b)|0}l=f;return d|0}function bx(a){a=a|0;Ry(a);return}function cx(a,b){a=a|0;b=b|0;var d=0;d=IK(32)|0;c[d>>2]=4;h[d+8>>3]=.75;c[d+16>>2]=1073741824;c[d+20>>2]=1;c[d+24>>2]=a;c[d+28>>2]=b;return d|0}function dx(a){a=a|0;l6(a);return}function ex(a){a=a|0;var b=0,d=0;if(!a)return;d=c[a+8>>2]|0;do if(d|0){if(c[a>>2]|0){nw(d);b=c[a+12>>2]|0;if(!b)break;nw(b);break}if(c[a+36>>2]|0?(nw(d),b=c[a+12>>2]|0,b|0):0)nw(b)}while(0);nw(c[a+16>>2]|0);nw(c[a+20>>2]|0);b=c[a+24>>2]|0;if(b|0?(c[a>>2]|0)>0:0)l6(b);ex(c[a+28>>2]|0);l6(a);return}function fx(a,b,d,e,f,g,i,j,k,m){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0;v=l;l=l+32|0;n=v+16|0;o=v+12|0;p=v+8|0;q=v+4|0;r=v;c[n>>2]=a;c[o>>2]=0;c[p>>2]=0;c[q>>2]=0;c[r>>2]=0;c[i>>2]=0;c[j>>2]=0;c[b>>2]=0;c[g>>2]=0;c[e>>2]=0;s=k+28|0;t=k+8|0;u=+(c[a+4>>2]|0);f=d;do{gx(a,n,f,o,0,r,p,q,k,m);f=c[n>>2]|0;if(!f)break;d=c[f+4>>2]|0;f=c[i>>2]|0;a=c[p>>2]|0;if(!f){c[i>>2]=a;c[j>>2]=c[q>>2]}else{a=Iw(f,a)|0;nw(c[i>>2]|0);nw(c[p>>2]|0);c[i>>2]=a;a=Iw(c[q>>2]|0,c[j>>2]|0)|0;nw(c[j>>2]|0);nw(c[q>>2]|0);c[j>>2]=a}f=c[b>>2]|0;if(f|0)nw(f);c[b>>2]=c[n>>2];f=c[e>>2]|0;if(f|0)nw(f);f=c[o>>2]|0;c[e>>2]=f;a=c[g>>2]|0;if(a){l6(a);f=c[o>>2]|0}c[g>>2]=c[r>>2];a=c[n>>2]|0;c[r>>2]=0;if(!(+(d|0)>u*+h[t>>3]))break}while((c[s>>2]|0)==1);l=v;return}function gx(a,b,d,e,f,g,i,j,k,m){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;I=l;l=l+32|0;E=I+28|0;p=I+24|0;C=I+20|0;F=I+16|0;s=I+12|0;G=I+8|0;H=I+4|0;n=I;c[E>>2]=0;c[p>>2]=0;c[F>>2]=0;c[G>>2]=0;c[H>>2]=0;c[b>>2]=0;c[e>>2]=0;c[i>>2]=0;c[j>>2]=0;D=c[a>>2]|0;o=k+24|0;c[m>>2]=c[o>>2];q=c[o>>2]|0;v=k+8|0;t=D<<2;x=k+28|0;r=k+20|0;w=+(D|0);a:do switch(q|0){case 12:{c[o>>2]=3;c[m>>2]=3;gx(a,b,d,e,f,g,i,j,k,m);if((((c[b>>2]|0)==0?(c[o>>2]=4,c[m>>2]=4,gx(a,b,d,e,f,g,i,j,k,m),(c[b>>2]|0)==0):0)?(c[o>>2]=6,c[m>>2]=6,gx(a,b,d,e,f,g,i,j,k,m),(c[b>>2]|0)==0):0)?(c[o>>2]=9,c[m>>2]=9,gx(a,b,d,e,f,g,i,j,k,m),(c[b>>2]|0)==0):0){c[o>>2]=2;c[m>>2]=2;gx(a,b,d,e,f,g,i,j,k,m)}c[o>>2]=12;p=0;q=0;r=0;o=0;n=0;m=0;break}case 3:case 6:case 4:{d=c[r>>2]|0;switch(q|0){case 3:{hx(a,d,G,H,n);break}case 4:{ix(a,d,G,H,n);break}default:jx(a,G,H,n)}u=c[n>>2]|0;if(!(c[x>>2]|0)){if((u|0)==(D|0)?1:+(u|0)>w*+h[v>>3]){p=0;q=0;r=0;o=0;n=0;m=0;break a}}else if((u|0)==(D|0)){p=0;q=0;r=0;o=0;n=0;m=0;break a}if((u|0)>=(c[k>>2]|0)){s=IK(t)|0;t=IK(t)|0;v=IK(D<<3)|0;c[C>>2]=0;o=c[H>>2]|0;p=c[G>>2]|0;n=0;d=0;b:while(1){if((n|0)>=(u|0))break;q=n+1|0;r=o+(q<<2)|0;m=c[o+(n<<2)>>2]|0;while(1){if((m|0)>=(c[r>>2]|0)){n=q;continue b}c[s+(d<<2)>>2]=c[p+(m<<2)>>2];c[t+(c[C>>2]<<2)>>2]=n;z=c[C>>2]|0;A=z+1|0;c[C>>2]=A;h[v+(z<<3)>>3]=1.0;m=m+1|0;d=A}}D=Aw(d,D,u,s,t,v,1,8)|0;c[i>>2]=D;c[j>>2]=mw(D)|0;c[e>>2]=0;i=Jw(c[j>>2]|0,a,c[i>>2]|0)|0;c[b>>2]=i;if(!i){p=v;q=t;r=s;o=s;n=t;m=v}else{Gw(c[j>>2]|0,f,g,0);c[j>>2]=Mw(c[j>>2]|0)|0;p=c[b>>2]|0;q=p+36|0;c[q>>2]=c[q>>2]|3;c[b>>2]=yw(p)|0;p=v;q=t;r=s;o=s;n=t;m=v}}else{p=0;q=0;r=0;o=0;n=0;m=0}break}case 1:{kx(a,c[r>>2]|0,E,p);d=c[o>>2]|0;if((d|0)==2)B=24;else B=25;break}case 2:{B=24;break}case 5:{B=26;break}case 10:case 9:{d=c[r>>2]|0;if((q|0)==9)nx(a,d,F,s,C);else ox(a,d,F,s,C);z=c[a+20>>2]|0;A=c[a+24>>2]|0;y=c[s>>2]|0;if(!(c[x>>2]|0)){if((y|0)==(D|0)?1:+(y|0)>w*+h[v>>3]){p=0;q=0;r=0;o=0;n=0;m=0;break a}}else if((y|0)==(D|0)){p=0;q=0;r=0;o=0;n=0;m=0;break a}if((y|0)>=(c[k>>2]|0)){x=c[C>>2]|0;v=x<<2;u=IK(v)|0;v=IK(v)|0;x=IK(x<<3)|0;c[C>>2]=0;s=c[F>>2]|0;r=0;o=0;c:while(1){if((r|0)>=(D|0))break;d=s+(r<<2)|0;t=r+1|0;if((c[d>>2]|0)!=-1){c[u+(o<<2)>>2]=r;c[v+(c[C>>2]<<2)>>2]=c[d>>2];q=c[C>>2]|0;k=q+1|0;c[C>>2]=k;h[x+(q<<3)>>3]=1.0;r=t;o=k;continue}n=c[z+(r<<2)>>2]|0;q=z+(t<<2)|0;p=c[q>>2]|0;d=0;m=n;while(1){if((m|0)>=(p|0))break;d=((c[s+(c[A+(m<<2)>>2]<<2)>>2]|0)>>>31^1)+d|0;m=m+1|0}w=1.0/+(d|0);d=p;while(1){if((n|0)>=(d|0)){r=t;continue c}m=A+(n<<2)|0;if((c[s+(c[m>>2]<<2)>>2]|0)>-1){c[u+(o<<2)>>2]=r;c[v+(c[C>>2]<<2)>>2]=c[s+(c[m>>2]<<2)>>2];d=c[C>>2]|0;m=d+1|0;c[C>>2]=m;h[x+(d<<3)>>3]=w;d=c[q>>2]|0}else m=o;n=n+1|0;o=m}}D=Aw(o,D,y,u,v,x,1,8)|0;c[i>>2]=D;D=mw(D)|0;c[j>>2]=D;i=Jw(D,a,c[i>>2]|0)|0;c[b>>2]=i;if(!i){p=x;q=v;r=u;o=u;n=v;m=x}else{Gw(c[j>>2]|0,f,g,0);p=c[b>>2]|0;q=p+36|0;c[q>>2]=c[q>>2]|3;c[b>>2]=yw(p)|0;c[e>>2]=0;p=x;q=v;r=u;o=u;n=v;m=x}}else{p=0;q=0;r=0;o=0;n=0;m=0}break}default:{p=0;q=0;r=0;o=0;n=0;m=0}}while(0);if((B|0)==24){lx(a,c[r>>2]|0,E,p);d=c[o>>2]|0;B=25}if((B|0)==25)if((d|0)==5)B=26;else B=27;if((B|0)==26){mx(a,c[r>>2]|0,E,p);B=27}do if((B|0)==27){d=c[p>>2]|0;if(!(c[x>>2]|0)){if((d|0)==(D|0)?1:+(d|0)>w*+h[v>>3]){p=0;q=0;r=0;o=0;n=0;m=0;break}}else if((d|0)==(D|0)){p=0;q=0;r=0;o=0;n=0;m=0;break}if((d|0)>=(c[k>>2]|0)){s=IK(t)|0;t=IK(t)|0;u=IK(D<<3)|0;c[C>>2]=0;q=c[E>>2]|0;d=0;p=0;while(1){if((p|0)>=(D|0))break;m=q+(p<<2)|0;n=c[m>>2]|0;if((n|0)>-1){c[s+(c[C>>2]<<2)>>2]=p;c[t+(c[C>>2]<<2)>>2]=d;B=c[C>>2]|0;o=B+1|0;c[C>>2]=o;h[u+(B<<3)>>3]=1.0;if((n|0)!=(p|0)){c[s+(o<<2)>>2]=c[m>>2];c[t+(c[C>>2]<<2)>>2]=d;B=c[C>>2]|0;c[C>>2]=B+1;h[u+(B<<3)>>3]=1.0;c[q+(c[m>>2]<<2)>>2]=-1}c[m>>2]=-1;d=d+1|0}p=p+1|0}D=Aw(c[C>>2]|0,D,d,s,t,u,1,8)|0;c[i>>2]=D;D=mw(D)|0;c[j>>2]=D;i=Jw(D,a,c[i>>2]|0)|0;c[b>>2]=i;if(!i){p=u;q=t;r=s;o=s;n=t;m=u}else{Gw(c[j>>2]|0,f,g,0);c[j>>2]=Mw(c[j>>2]|0)|0;p=c[b>>2]|0;q=p+36|0;c[q>>2]=c[q>>2]|3;c[b>>2]=yw(p)|0;c[e>>2]=0;p=u;q=t;r=s;o=s;n=t;m=u}}else{p=0;q=0;r=0;o=0;n=0;m=0}}while(0);d=c[E>>2]|0;if(d|0)l6(d);d=c[F>>2]|0;if(d|0)l6(d);if(r|0)l6(o);if(q|0)l6(n);if(p|0)l6(m);d=c[G>>2]|0;if(d|0)l6(d);d=c[H>>2]|0;if(d|0)l6(d);l=I;return}function hx(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0.0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;t=c[a+20>>2]|0;u=c[a+24>>2]|0;w=c[a>>2]|0;v=w<<2;c[d>>2]=IK(v)|0;c[e>>2]=IK(v+4|0)|0;v=IK(v)|0;g=0;while(1){if((g|0)>=(w|0))break;c[v+(g<<2)>>2]=g;g=g+1|0}c[f>>2]=0;r=c[e>>2]|0;c[r>>2]=0;s=c[a+28>>2]|0;a:do if(!b){g=0;a=0;b:while(1){while(1){if((a|0)>=(w|0)){b=0;j=0.0;a=0;break b}b=a;a=a+1|0;if((c[v+(b<<2)>>2]|0)==-1)continue;b=c[t+(b<<2)>>2]|0;if(((c[t+(a<<2)>>2]|0)-b|0)==1)break}l=c[u+(b<<2)>>2]|0;c[v+(l<<2)>>2]=-1;m=c[d>>2]|0;c[m+(g<<2)>>2]=l;n=t+(l+1<<2)|0;k=c[t+(l<<2)>>2]|0;g=g+1|0;while(1){if((k|0)>=(c[n>>2]|0))break;b=u+(k<<2)|0;i=c[b>>2]|0;if((l|0)!=(i|0)?((c[t+(i+1<<2)>>2]|0)-(c[t+(i<<2)>>2]|0)|0)==1:0){c[v+(i<<2)>>2]=-1;c[m+(g<<2)>>2]=c[b>>2];g=g+1|0}k=k+1|0}i=c[f>>2]|0;b=c[r+(i<<2)>>2]|0;i=i+1|0;c[f>>2]=i;i=r+(i<<2)|0;if((g-b|0)<5){c[i>>2]=g;continue}e=b+1|0;c[i>>2]=e;b=e;i=e;while(1){if(!((i|0)<(g|0)&(b|0)<(g|0)))continue b;e=i+3|0;e=(g|0)<(e|0)?g:e;q=(c[f>>2]|0)+1|0;c[f>>2]=q;c[r+(q<<2)>>2]=e;b=b+1|0;i=e}}c:while(1){while(1){while(1){if((a|0)>=(w|0)){a=0;break c}n=v+(a<<2)|0;q=a+1|0;if((c[n>>2]|0)==-1)a=q;else break}p=c[t+(q<<2)>>2]|0;l=1;m=c[t+(a<<2)>>2]|0;while(1){i=(l|0)!=0;if((m|0)>=(p|0))break;k=c[u+(m<<2)>>2]|0;if((a|0)!=(k|0)?(c[v+(k<<2)>>2]|0)!=-1:0){o=+h[s+(m<<3)>>3];if(!i?!(o>j):0)i=0;else{i=0;b=k;j=o}}else i=l;l=i;m=m+1|0}if(i)a=q;else break}c[v+(b<<2)>>2]=-1;c[n>>2]=-1;p=c[d>>2]|0;c[p+(g<<2)>>2]=a;e=g+2|0;c[p+(g+1<<2)>>2]=b;a=(c[f>>2]|0)+1|0;c[f>>2]=a;c[r+(a<<2)>>2]=e;a=q;g=e}while(1){if((a|0)>=(w|0))break a;if((c[v+(a<<2)>>2]|0)==(a|0)){u=g+1|0;c[(c[d>>2]|0)+(g<<2)>>2]=a;g=(c[f>>2]|0)+1|0;c[f>>2]=g;c[r+(g<<2)>>2]=u;g=u}a=a+1|0}}else{r=Rw(w)|0;n=0;g=0;while(1){if((n|0)>=(w|0)){q=0;a=0;j=0.0;break}a=c[r+(n<<2)>>2]|0;d:do if((c[v+(a<<2)>>2]|0)!=-1?(p=c[t+(a<<2)>>2]|0,((c[t+(a+1<<2)>>2]|0)-p|0)==1):0){k=c[u+(p<<2)>>2]|0;c[v+(k<<2)>>2]=-1;l=c[d>>2]|0;c[l+(g<<2)>>2]=k;m=t+(k+1<<2)|0;i=c[t+(k<<2)>>2]|0;g=g+1|0;while(1){if((i|0)>=(c[m>>2]|0))break;a=u+(i<<2)|0;b=c[a>>2]|0;if((k|0)!=(b|0)?((c[t+(b+1<<2)>>2]|0)-(c[t+(b<<2)>>2]|0)|0)==1:0){c[v+(b<<2)>>2]=-1;c[l+(g<<2)>>2]=c[a>>2];g=g+1|0}i=i+1|0}i=c[e>>2]|0;q=c[f>>2]|0;a=c[i+(q<<2)>>2]|0;q=q+1|0;b=i+(q<<2)|0;c[f>>2]=q;if((g-a|0)<5){c[b>>2]=g;break}q=a+1|0;c[b>>2]=q;a=q;b=q;while(1){if(!((b|0)<(g|0)&(a|0)<(g|0)))break d;q=b+3|0;q=(g|0)<(q|0)?g:q;m=(c[f>>2]|0)+1|0;c[f>>2]=m;c[i+(m<<2)>>2]=q;a=a+1|0;b=q}}while(0);n=n+1|0}while(1){if((q|0)>=(w|0)){a=0;break}m=c[r+(q<<2)>>2]|0;n=v+(m<<2)|0;if((c[n>>2]|0)!=-1){p=c[t+(m+1<<2)>>2]|0;k=1;l=c[t+(m<<2)>>2]|0;while(1){b=(k|0)!=0;if((l|0)>=(p|0))break;i=c[u+(l<<2)>>2]|0;if((m|0)!=(i|0)?(c[v+(i<<2)>>2]|0)!=-1:0){o=+h[s+(l<<3)>>3];if(!b?!(o>j):0)b=0;else{b=0;a=i;j=o}}else b=k;k=b;l=l+1|0}if(!b){c[v+(a<<2)>>2]=-1;c[n>>2]=-1;n=c[d>>2]|0;c[n+(g<<2)>>2]=m;p=g+2|0;c[n+(g+1<<2)>>2]=a;n=c[e>>2]|0;g=(c[f>>2]|0)+1|0;c[f>>2]=g;c[n+(g<<2)>>2]=p;g=p}}q=q+1|0}while(1){if((a|0)>=(w|0))break;if((c[v+(a<<2)>>2]|0)==(a|0)){u=g+1|0;c[(c[d>>2]|0)+(g<<2)>>2]=a;t=c[e>>2]|0;g=(c[f>>2]|0)+1|0;c[f>>2]=g;c[t+(g<<2)>>2]=u;g=u}a=a+1|0}l6(r)}while(0);l6(v);return}function ix(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0.0,k=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;A=l;l=l+16|0;q=A+8|0;y=A+4|0;z=A;c[y>>2]=0;c[z>>2]=0;v=c[a+20>>2]|0;u=c[a+24>>2]|0;w=c[a>>2]|0;x=w<<2;c[d>>2]=IK(x)|0;c[e>>2]=IK(x+4|0)|0;x=IK(x)|0;g=0;while(1){if((g|0)>=(w|0))break;c[x+(g<<2)>>2]=g;g=g+1|0}Ow(a,q,y,z);c[f>>2]=0;s=c[e>>2]|0;c[s>>2]=0;t=c[a+28>>2]|0;g=0;a=0;a:while(1){k=c[q>>2]|0;m=c[z>>2]|0;do{if((a|0)>=(k|0))break a;n=a;a=a+1|0;p=m+(a<<2)|0;i=c[p>>2]|0;n=c[m+(n<<2)>>2]|0}while((i-n|0)<2);m=c[y>>2]|0;k=c[s+(c[f>>2]<<2)>>2]|0;while(1){if((n|0)>=(i|0))break;r=m+(n<<2)|0;c[x+(c[r>>2]<<2)>>2]=-1;i=g+1|0;c[(c[d>>2]|0)+(g<<2)>>2]=c[r>>2];if((i-k|0)>3){g=(c[f>>2]|0)+1|0;c[f>>2]=g;c[s+(g<<2)>>2]=i;g=i}else g=k;k=g;n=n+1|0;g=i;i=c[p>>2]|0}if((g|0)<=(k|0))continue;r=(c[f>>2]|0)+1|0;c[f>>2]=r;c[s+(r<<2)>>2]=g}b:do if(!b){i=0;j=0.0;a=0;c:while(1){while(1){while(1){if((a|0)>=(w|0)){a=0;break c}b=x+(a<<2)|0;r=a+1|0;if((c[b>>2]|0)==-1)a=r;else break}q=c[v+(r<<2)>>2]|0;n=1;p=c[v+(a<<2)>>2]|0;while(1){k=(n|0)!=0;if((p|0)>=(q|0))break;m=c[u+(p<<2)>>2]|0;if((a|0)!=(m|0)?(c[x+(m<<2)>>2]|0)!=-1:0){o=+h[t+(p<<3)>>3];if(!k?!(o>j):0)k=0;else{k=0;i=m;j=o}}else k=n;n=k;p=p+1|0}if(k)a=r;else break}c[x+(i<<2)>>2]=-1;c[b>>2]=-1;q=c[d>>2]|0;c[q+(g<<2)>>2]=a;e=g+2|0;c[q+(g+1<<2)>>2]=i;a=(c[f>>2]|0)+1|0;c[f>>2]=a;c[s+(a<<2)>>2]=e;a=r;g=e}while(1){if((a|0)>=(w|0))break b;if((c[x+(a<<2)>>2]|0)==(a|0)){v=g+1|0;c[(c[d>>2]|0)+(g<<2)>>2]=a;g=(c[f>>2]|0)+1|0;c[f>>2]=g;c[s+(g<<2)>>2]=v;g=v}a=a+1|0}}else{s=Rw(w)|0;r=0;a=0;j=0.0;while(1){if((r|0)>=(w|0)){a=0;break}p=c[s+(r<<2)>>2]|0;b=x+(p<<2)|0;if((c[b>>2]|0)!=-1){q=c[v+(p+1<<2)>>2]|0;m=1;n=c[v+(p<<2)>>2]|0;while(1){i=(m|0)!=0;if((n|0)>=(q|0))break;k=c[u+(n<<2)>>2]|0;if((p|0)!=(k|0)?(c[x+(k<<2)>>2]|0)!=-1:0){o=+h[t+(n<<3)>>3];if(!i?!(o>j):0)i=0;else{i=0;a=k;j=o}}else i=m;m=i;n=n+1|0}if(!i){c[x+(a<<2)>>2]=-1;c[b>>2]=-1;b=c[d>>2]|0;c[b+(g<<2)>>2]=p;q=g+2|0;c[b+(g+1<<2)>>2]=a;b=c[e>>2]|0;g=(c[f>>2]|0)+1|0;c[f>>2]=g;c[b+(g<<2)>>2]=q;g=q}}r=r+1|0}while(1){if((a|0)>=(w|0))break;if((c[x+(a<<2)>>2]|0)==(a|0)){v=g+1|0;c[(c[d>>2]|0)+(g<<2)>>2]=a;u=c[e>>2]|0;g=(c[f>>2]|0)+1|0;c[f>>2]=g;c[u+(g<<2)>>2]=v;g=v}a=a+1|0}l6(s)}while(0);l6(c[y>>2]|0);l6(c[z>>2]|0);l6(x);l=A;return}function jx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;r=c[a+20>>2]|0;s=c[a+24>>2]|0;v=c[a>>2]|0;u=v<<2;c[b>>2]=IK(u)|0;c[d>>2]=IK(u+4|0)|0;u=IK(u)|0;q=IK(v<<4)|0;f=0;while(1){if((f|0)>=(v|0))break;c[u+(f<<2)>>2]=f;f=f+1|0}c[e>>2]=0;c[c[d>>2]>>2]=0;o=c[a+28>>2]|0;t=Rw(v)|0;f=0;m=0;while(1){if((m|0)>=(v|0)){m=0;break}a=c[t+(m<<2)>>2]|0;a:do if((c[u+(a<<2)>>2]|0)!=-1?(n=c[r+(a<<2)>>2]|0,((c[r+(a+1<<2)>>2]|0)-n|0)==1):0){j=c[s+(n<<2)>>2]|0;c[u+(j<<2)>>2]=-1;k=c[b>>2]|0;c[k+(f<<2)>>2]=j;l=r+(j+1<<2)|0;i=c[r+(j<<2)>>2]|0;f=f+1|0;while(1){if((i|0)>=(c[l>>2]|0))break;a=s+(i<<2)|0;g=c[a>>2]|0;if((j|0)!=(g|0)?((c[r+(g+1<<2)>>2]|0)-(c[r+(g<<2)>>2]|0)|0)==1:0){c[u+(g<<2)>>2]=-1;c[k+(f<<2)>>2]=c[a>>2];f=f+1|0}i=i+1|0}i=c[d>>2]|0;l=c[e>>2]|0;a=c[i+(l<<2)>>2]|0;l=l+1|0;g=i+(l<<2)|0;c[e>>2]=l;if((f-a|0)<5){c[g>>2]=f;break}l=a+1|0;c[g>>2]=l;a=l;g=l;while(1){if(!((g|0)<(f|0)&(a|0)<(f|0)))break a;l=g+3|0;l=(f|0)<(l|0)?f:l;k=(c[e>>2]|0)+1|0;c[e>>2]=k;c[i+(k<<2)>>2]=l;a=a+1|0;g=l}}while(0);m=m+1|0}while(1){if((m|0)>=(v|0)){a=0;break}k=c[t+(m<<2)>>2]|0;l=u+(k<<2)|0;if((c[l>>2]|0)!=-1){j=c[r+(k+1<<2)>>2]|0;a=0;i=c[r+(k<<2)>>2]|0;while(1){if((i|0)>=(j|0))break;g=c[s+(i<<2)>>2]|0;if((k|0)!=(g|0)?(p=a<<1,(c[u+(g<<2)>>2]|0)!=-1):0){h[q+(p<<3)>>3]=+(g|0);h[q+((p|1)<<3)>>3]=+h[o+(i<<3)>>3];a=a+1|0}i=i+1|0}if((a|0)>0){k3(q,a,16,81);i=(a|0)<3?a:3;j=c[b>>2]|0;g=0;while(1){a=f+1|0;f=j+(f<<2)|0;if((g|0)>=(i|0))break;n=~~+h[q+(g<<1<<3)>>3];c[u+(n<<2)>>2]=-1;c[f>>2]=n;g=g+1|0;f=a}c[l>>2]=-1;c[f>>2]=k;n=c[d>>2]|0;f=(c[e>>2]|0)+1|0;c[e>>2]=f;c[n+(f<<2)>>2]=a;f=a}}m=m+1|0}while(1){if((a|0)>=(v|0))break;if((c[u+(a<<2)>>2]|0)==(a|0)){s=f+1|0;c[(c[b>>2]|0)+(f<<2)>>2]=a;r=c[d>>2]|0;f=(c[e>>2]|0)+1|0;c[e>>2]=f;c[r+(f<<2)>>2]=s;f=s}a=a+1|0}l6(t);l6(u);return}function kx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;p=c[a+20>>2]|0;q=c[a+24>>2]|0;r=c[a>>2]|0;f=c[a+4>>2]|0;k=IK(r<<2)|0;c[d>>2]=k;a=0;while(1){if((a|0)>=(r|0))break;c[k+(a<<2)>>2]=a;a=a+1|0}c[e>>2]=f;a:do if(!b){f=0;b:while(1){if((f|0)>=(r|0))break a;b=f+1|0;g=p+(b<<2)|0;h=k+(f<<2)|0;a=c[p+(f<<2)>>2]|0;while(1){if((a|0)>=(c[g>>2]|0)){f=b;continue b}i=q+(a<<2)|0;j=c[i>>2]|0;if(((f|0)!=(j|0)?(l=k+(j<<2)|0,(c[l>>2]|0)==(j|0)):0)?(c[h>>2]|0)==(f|0):0){c[l>>2]=f;c[h>>2]=c[i>>2];c[e>>2]=(c[e>>2]|0)+-1}a=a+1|0}}}else{b=Rw(r)|0;a=0;while(1){if((a|0)>=(r|0))break;g=c[b+(a<<2)>>2]|0;h=p+(g+1<<2)|0;f=c[p+(g<<2)>>2]|0;while(1){if((f|0)>=(c[h>>2]|0))break;i=q+(f<<2)|0;j=c[i>>2]|0;if(((g|0)!=(j|0)?(m=c[d>>2]|0,n=m+(j<<2)|0,(c[n>>2]|0)==(j|0)):0)?(o=m+(g<<2)|0,(c[o>>2]|0)==(g|0)):0){c[n>>2]=g;c[o>>2]=c[i>>2];c[e>>2]=(c[e>>2]|0)+-1}f=f+1|0}a=a+1|0}l6(b)}while(0);return}function lx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0.0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;s=c[a+20>>2]|0;t=c[a+24>>2]|0;u=c[a>>2]|0;g=c[a+4>>2]|0;p=IK(u<<2)|0;c[d>>2]=p;f=0;while(1){if((f|0)>=(u|0))break;c[p+(f<<2)>>2]=f;f=f+1|0}c[e>>2]=g;r=c[a+28>>2]|0;a:do if(!b){f=0;i=0.0;l=0;while(1){if((l|0)>=(u|0))break a;m=l+1|0;n=c[s+(m<<2)>>2]|0;o=p+(l<<2)|0;b=1;k=c[s+(l<<2)>>2]|0;while(1){a=(b|0)!=0;if((k|0)>=(n|0))break;g=c[t+(k<<2)>>2]|0;if(((l|0)!=(g|0)?(c[p+(g<<2)>>2]|0)==(g|0):0)?(c[o>>2]|0)==(l|0):0){j=+h[r+(k<<3)>>3];if(!a?!(j>i):0)a=0;else{a=0;f=g;i=j}}else a=b;b=a;k=k+1|0}if(a){l=m;continue}c[p+(f<<2)>>2]=l;c[p+(l<<2)>>2]=f;c[e>>2]=(c[e>>2]|0)+-1;l=m}}else{q=Rw(u)|0;p=0;f=0;i=0.0;while(1){if((p|0)>=(u|0))break;l=c[q+(p<<2)>>2]|0;m=c[d>>2]|0;n=m+(l<<2)|0;if((c[n>>2]|0)==(l|0)){o=c[s+(l+1<<2)>>2]|0;k=c[s+(l<<2)>>2]|0;b=1;while(1){a=(b|0)!=0;if((k|0)>=(o|0))break;g=c[t+(k<<2)>>2]|0;if((l|0)!=(g|0)?(c[m+(g<<2)>>2]|0)==(g|0):0){j=+h[r+(k<<3)>>3];if(!a?!(j>i):0)a=0;else{a=0;f=g;i=j}}else a=b;k=k+1|0;b=a}if(!a){c[m+(f<<2)>>2]=l;c[n>>2]=f;c[e>>2]=(c[e>>2]|0)+-1}}p=p+1|0}l6(q)}while(0);return}function mx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0.0,j=0.0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;t=c[a+20>>2]|0;u=c[a+24>>2]|0;v=c[a>>2]|0;g=c[a+4>>2]|0;q=IK(v<<2)|0;c[d>>2]=q;f=0;while(1){if((f|0)>=(v|0))break;c[q+(f<<2)>>2]=f;f=f+1|0}c[e>>2]=g;s=c[a+28>>2]|0;a:do if(!b){f=0;i=0.0;l=0;while(1){if((l|0)>=(v|0))break a;k=c[t+(l<<2)>>2]|0;m=l+1|0;n=c[t+(m<<2)>>2]|0;o=+(n-k|0);p=q+(l<<2)|0;b=1;while(1){a=(b|0)!=0;if((k|0)>=(n|0))break;g=c[u+(k<<2)>>2]|0;if(((l|0)!=(g|0)?(c[q+(g<<2)>>2]|0)==(g|0):0)?(c[p>>2]|0)==(l|0):0){j=+h[s+(k<<3)>>3]/o/+((c[t+(g+1<<2)>>2]|0)-(c[t+(g<<2)>>2]|0)|0);if(!a?!(j>i):0)a=0;else{a=0;f=g;i=j}}else a=b;b=a;k=k+1|0}if(a){l=m;continue}c[q+(f<<2)>>2]=l;c[q+(l<<2)>>2]=f;c[e>>2]=(c[e>>2]|0)+-1;l=m}}else{r=Rw(v)|0;q=0;f=0;i=0.0;while(1){if((q|0)>=(v|0))break;l=c[r+(q<<2)>>2]|0;m=c[d>>2]|0;n=m+(l<<2)|0;if((c[n>>2]|0)==(l|0)){k=c[t+(l<<2)>>2]|0;p=c[t+(l+1<<2)>>2]|0;o=+(p-k|0);b=1;while(1){a=(b|0)!=0;if((k|0)>=(p|0))break;g=c[u+(k<<2)>>2]|0;if((l|0)!=(g|0)?(c[m+(g<<2)>>2]|0)==(g|0):0){j=+h[s+(k<<3)>>3]/o/+((c[t+(g+1<<2)>>2]|0)-(c[t+(g<<2)>>2]|0)|0);if(!a?!(j>i):0)a=0;else{a=0;f=g;i=j}}else a=b;k=k+1|0;b=a}if(!a){c[m+(f<<2)>>2]=l;c[n>>2]=f;c[e>>2]=(c[e>>2]|0)+-1}}q=q+1|0}l6(r)}while(0);return}function nx(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;m=c[a+20>>2]|0;n=c[a+24>>2]|0;l=c[a>>2]|0;j=IK(l<<2)|0;c[d>>2]=j;a=0;while(1){if((a|0)>=(l|0))break;c[j+(a<<2)>>2]=-100;a=a+1|0}c[e>>2]=0;c[f>>2]=0;a:do if(!b){h=0;b:while(1){if((h|0)>=(l|0))break a;a=j+(h<<2)|0;i=h+1|0;if((c[a>>2]|0)!=-100){h=i;continue}b=c[e>>2]|0;c[e>>2]=b+1;c[a>>2]=b;b=m+(i<<2)|0;a=c[m+(h<<2)>>2]|0;while(1){if((a|0)>=(c[b>>2]|0)){h=i;continue b}g=c[n+(a<<2)>>2]|0;if((h|0)!=(g|0)){c[j+(g<<2)>>2]=-1;c[f>>2]=(c[f>>2]|0)+1}a=a+1|0}}}else{i=Rw(l)|0;h=0;while(1){if((h|0)>=(l|0))break;j=c[i+(h<<2)>>2]|0;k=c[d>>2]|0;a=k+(j<<2)|0;c:do if((c[a>>2]|0)==-100){b=c[e>>2]|0;c[e>>2]=b+1;c[a>>2]=b;b=m+(j+1<<2)|0;a=c[m+(j<<2)>>2]|0;while(1){if((a|0)>=(c[b>>2]|0))break c;g=c[n+(a<<2)>>2]|0;if((j|0)!=(g|0)){c[k+(g<<2)>>2]=-1;c[f>>2]=(c[f>>2]|0)+1}a=a+1|0}}while(0);h=h+1|0}l6(i)}while(0);c[f>>2]=(c[f>>2]|0)+(c[e>>2]|0);return}function ox(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;n=q+4|0;o=q;p=c[a+20>>2]|0;m=c[a+24>>2]|0;h=c[a>>2]|0;a=IK(h<<2)|0;c[d>>2]=a;g=0;while(1){c[n>>2]=g;if((g|0)>=(h|0))break;c[a+(g<<2)>>2]=-100;g=(c[n>>2]|0)+1|0}c[e>>2]=0;c[f>>2]=0;k=ux(h,(h<<1)+-2|0)|0;a:do if(!b){a=0;while(1){c[n>>2]=a;if((a|0)>=(h|0))break a;j=a+1|0;wx(k,a,(c[p+(j<<2)>>2]|0)-(c[p+(a<<2)>>2]|0)|0)|0;a=j}}else{g=Rw(h)|0;a=0;while(1){if((a|0)>=(h|0))break;j=c[g+(a<<2)>>2]|0;c[n>>2]=j;wx(k,j,(c[p+(j+1<<2)>>2]|0)-(c[p+(j<<2)>>2]|0)|0)|0;a=a+1|0}l6(g)}while(0);b:while(1){j=(xx(k,n,o)|0)==0;a=c[e>>2]|0;if(j)break;c[e>>2]=a+1;c[(c[d>>2]|0)+(c[n>>2]<<2)>>2]=a;a=c[n>>2]|0;j=c[p+(a<<2)>>2]|0;while(1){if((j|0)>=(c[p+(a+1<<2)>>2]|0))continue b;i=c[m+(j<<2)>>2]|0;if((a|0)!=(i|0)){c:do if((c[(c[d>>2]|0)+(i<<2)>>2]|0)==-100){zx(k,i)|0;c[(c[d>>2]|0)+(i<<2)>>2]=-1;g=p+(i+1<<2)|0;a=c[p+(i<<2)>>2]|0;while(1){if((a|0)>=(c[g>>2]|0))break c;b=m+(a<<2)|0;h=c[b>>2]|0;if((i|0)!=(h|0)?(c[(c[d>>2]|0)+(h<<2)>>2]|0)==-100:0){h=yx(k,h)|0;c[o>>2]=h;wx(k,c[b>>2]|0,h+1|0)|0}a=a+1|0}}while(0);c[f>>2]=(c[f>>2]|0)+1;a=c[n>>2]|0}j=j+1|0}}c[f>>2]=(c[f>>2]|0)+a;vx(k);l=q;return}function px(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+h[a+8>>3];c=+h[b+8>>3];return (d>c?-1:d>2]|0)==1:0)f=a;else f=Nw(a)|0;do if(!b)b=0;else{if(tw(b,0)|0?(c[b+16>>2]|0)==1:0)break;b=xw(b,0)|0}while(0);d=rx(f,b,d)|0;b=sx(d,e)|0;if((f|0)!=(a|0))c[d+36>>2]=1;return b|0}function rx(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if(!a)a=0;else{e=IK(44)|0;c[e>>2]=0;c[e+4>>2]=c[a+4>>2];c[e+8>>2]=a;c[e+12>>2]=b;c[e+16>>2]=0;c[e+20>>2]=0;c[e+24>>2]=d;c[e+28>>2]=0;c[e+32>>2]=0;c[e+36>>2]=0;a=e}return a|0}function sx(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+32|0;e=k+20|0;f=k+16|0;g=k+12|0;h=k+8|0;i=k+4|0;j=k;c[f>>2]=0;if((c[a>>2]|0)<((c[b+16>>2]|0)+-1|0)?(fx(c[a+8>>2]|0,i,c[a+12>>2]|0,j,0,f,g,h,b,e),d=c[i>>2]|0,d|0):0){i=c[j>>2]|0;j=rx(d,i,c[f>>2]|0)|0;c[a+28>>2]=j;c[j+40>>2]=c[e>>2];c[j>>2]=(c[a>>2]|0)+1;c[j+4>>2]=c[d>>2];c[j+8>>2]=d;c[j+12>>2]=i;c[j+16>>2]=c[g>>2];c[a+20>>2]=c[h>>2];c[j+32>>2]=a;sx(j,b)|0}l=k;return a|0}function tx(a){a=a|0;var b=0;while(1){b=c[a+28>>2]|0;if(!b)break;else a=b}return a|0}function ux(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=IK(28)|0;c[f>>2]=0;c[f+4>>2]=a;c[f+8>>2]=b;c[f+12>>2]=-1;e=f+16|0;c[e>>2]=IK((b<<2)+4|0)|0;d=0;while(1){if((d|0)>(b|0))break;c[(c[e>>2]|0)+(d<<2)>>2]=0;d=d+1|0}b=(a<<2)+4|0;e=f+20|0;c[e>>2]=IK(b)|0;d=0;while(1){if((d|0)>(a|0))break;c[(c[e>>2]|0)+(d<<2)>>2]=0;d=d+1|0}b=IK(b)|0;c[f+24>>2]=b;d=0;while(1){if((d|0)>(a|0))break;c[b+(d<<2)>>2]=-999;d=d+1|0}return f|0}function vx(a){a=a|0;var b=0,d=0,e=0,f=0;if(a|0){e=a+16|0;b=c[e>>2]|0;if(b|0){f=a+8|0;d=0;while(1){if((d|0)>(c[f>>2]|0))break;zy(c[b+(d<<2)>>2]|0,105);d=d+1|0;b=c[e>>2]|0}l6(b)}b=c[a+20>>2]|0;if(b|0)l6(b);l6(c[a+24>>2]|0);l6(a)}return}function wx(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=a+8|0;l=a+20|0;i=a+24|0;m=a+16|0;if(!a)Aa(139256,96044,69,96060);while(1){if((c[h>>2]|0)<(d|0)){j=4;break}e=(c[l>>2]|0)+(b<<2)|0;f=c[e>>2]|0;g=c[a>>2]|0;k=(c[i>>2]|0)+(b<<2)|0;if(!f)break;n=c[k>>2]|0;c[e>>2]=0;c[a>>2]=g+-1;Cy(f,105,(c[m>>2]|0)+(n<<2)|0)}if((j|0)==4)Aa(96079,96044,70,96060);c[a>>2]=g+1;e=a+12|0;if((c[e>>2]|0)<(d|0))c[e>>2]=d;c[k>>2]=d;e=IK(4)|0;c[e>>2]=b;f=c[(c[m>>2]|0)+(d<<2)>>2]|0;if(!f)e=yy(e)|0;else e=Ay(f,e)|0;c[(c[l>>2]|0)+(b<<2)>>2]=e;c[(c[m>>2]|0)+(d<<2)>>2]=e;return a|0}function xx(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;if((a|0)!=0?(c[a>>2]|0)>=1:0){f=a+12|0;e=c[f>>2]|0;c[d>>2]=e;c[a>>2]=(c[a>>2]|0)+-1;d=a+16|0;g=c[(c[d>>2]|0)+(e<<2)>>2]|0;c[b>>2]=c[(By(g)|0)>>2];Cy(g,105,(c[d>>2]|0)+(e<<2)|0);d=c[d>>2]|0;if(!(c[d+(e<<2)>>2]|0)){while(1){if((e|0)<=-1)break;if(c[d+(e<<2)>>2]|0)break;e=e+-1|0}c[f>>2]=e}e=c[b>>2]|0;c[(c[a+20>>2]|0)+(e<<2)>>2]=0;c[(c[a+24>>2]|0)+(e<<2)>>2]=-999;e=1}else e=0;return e|0}function yx(a,b){a=a|0;b=b|0;return c[(c[a+24>>2]|0)+(b<<2)>>2]|0}function zx(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;if((a|0)!=0?(e=c[a>>2]|0,(e|0)>=1):0){h=a+24|0;d=c[(c[h>>2]|0)+(b<<2)>>2]|0;c[a>>2]=e+-1;f=a+20|0;e=a+16|0;Cy(c[(c[f>>2]|0)+(b<<2)>>2]|0,105,(c[e>>2]|0)+(d<<2)|0);a=a+12|0;if((d|0)==(c[a>>2]|0)?(g=c[e>>2]|0,(c[g+(d<<2)>>2]|0)==0):0){while(1){if((d|0)<=-1)break;if(c[g+(d<<2)>>2]|0)break;d=d+-1|0}c[a>>2]=d}c[(c[f>>2]|0)+(b<<2)>>2]=0;c[(c[h>>2]|0)+(b<<2)>>2]=-999;d=1}else d=0;return d|0}function Ax(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0,j=0,k=0.0,l=0.0,m=0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;if(!(tw(a,0)|0))Aa(96096,96132,260,96147);w=uw(a)|0;x=c[w+20>>2]|0;y=c[w+24>>2]|0;a=w+16|0;e=w+28|0;if((c[a>>2]|0)==1)v=c[e>>2]|0;else{l6(c[e>>2]|0);c[a>>2]=1;v=IK(c[w+8>>2]<<3)|0;c[e>>2]=v}r=IK(c[w>>2]<<2)|0;a=0;while(1){e=c[w>>2]|0;if((a|0)>=(e|0)){q=0;a=e;break}c[r+(a<<2)>>2]=-1;a=a+1|0}a:while(1){if((q|0)>=(a|0)){g=0.0;k=0.0;f=0;u=0;t=a;break}p=q+1|0;i=x+(p<<2)|0;m=x+(q<<2)|0;j=(c[i>>2]|0)-(c[m>>2]|0)|0;c[r+(q<<2)>>2]=q;e=c[m>>2]|0;while(1){o=c[i>>2]|0;if((e|0)>=(o|0))break;a=c[y+(e<<2)>>2]|0;if((q|0)!=(a|0))c[r+(a<<2)>>2]=q;e=e+1|0}n=+(j|0);e=c[m>>2]|0;while(1){if((e|0)>=(o|0))break;a=c[y+(e<<2)>>2]|0;if((q|0)!=(a|0)){i=c[x+(a+1<<2)>>2]|0;a=c[x+(a<<2)>>2]|0;l=n+ +(i-a|0);while(1){if((a|0)>=(i|0))break;l=(c[r+(c[y+(a<<2)>>2]<<2)>>2]|0)==(q|0)?l+-1.0:l;a=a+1|0}h[v+(e<<3)>>3]=l;if(!(l>0.0)){s=23;break a}}e=e+1|0}q=p;a=c[w>>2]|0}if((s|0)==23)Aa(96169,96132,290,96147);while(1){if((u|0)>=(t|0))break;i=u+1|0;j=x+(i<<2)|0;e=c[x+(u<<2)>>2]|0;while(1){if((e|0)>=(c[j>>2]|0))break;a=c[y+(e<<2)>>2]|0;if((u|0)==(a|0))a=f;else{k=k+ +Xw(d,b,u,a);g=g+ +h[v+(e<<3)>>3];a=f+1|0}f=a;e=e+1|0}u=i;t=c[w>>2]|0}n=+(f|0);g=k/n/(g/n);a=0;b:while(1){if((a|0)>=(t|0))break;i=a+1|0;j=c[x+(i<<2)>>2]|0;e=c[x+(a<<2)>>2]|0;while(1){if((e|0)>=(j|0)){a=i;continue b}f=v+(e<<3)|0;if((a|0)!=(c[y+(e<<2)>>2]|0))h[f>>3]=g*+h[f>>3];e=e+1|0}}return w|0}function Bx(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0.0,U=0.0;N=c[a>>2]|0;O=c[a+20>>2]|0;P=c[a+24>>2]|0;if(!(tw(a,0)|0))Aa(96096,96132,333,96177);Q=Ax(a,b,e)|0;R=IK(56)|0;S=R+32|0;h[S>>3]=1.0;c[R+20>>2]=0;c[R+24>>2]=0;h[R+40>>3]=.01;c[R+48>>2]=~~+G(+(+(c[a>>2]|0)));g=N<<3;K=IK(g)|0;c[R+12>>2]=K;a=0;while(1){if((a|0)>=(N|0))break;h[K+(a<<3)>>3]=d;a=a+1|0}L=IK(N<<2)|0;J=IK(g)|0;j=0;while(1){if((j|0)>=(N|0)){n=0;break}k=J+(j<<3)|0;h[k>>3]=0.0;l=j+1|0;m=O+(l<<2)|0;i=c[O+(j<<2)>>2]|0;a=0;d=0.0;while(1){if((i|0)>=(c[m>>2]|0))break;g=c[P+(i<<2)>>2]|0;if((j|0)!=(g|0)){d=+Xw(e,b,j,g);d=d+ +h[k>>3];h[k>>3]=d;a=a+1|0}i=i+1|0}if((a|0)<=0){o=14;break}h[k>>3]=d/+(a|0);j=l}if((o|0)==14)Aa(96209,96132,358,96177);while(1){if((n|0)>=(N|0)){a=0;l=0;break}c[L+(n<<2)>>2]=-1;n=n+1|0}a:while(1){if((l|0)>=(N|0))break;c[L+(l<<2)>>2]=l;j=O+(l<<2)|0;m=l+1|0;n=O+(m<<2)|0;i=c[j>>2]|0;while(1){g=c[n>>2]|0;if((i|0)>=(g|0))break;g=L+(c[P+(i<<2)>>2]<<2)|0;if((c[g>>2]|0)!=(l|0)){c[g>>2]=l;a=a+1|0}i=i+1|0}k=c[j>>2]|0;while(1){if((k|0)>=(g|0)){l=m;continue a}i=c[P+(k<<2)>>2]|0;j=O+(i+1<<2)|0;i=c[O+(i<<2)>>2]|0;while(1){if((i|0)>=(c[j>>2]|0))break;g=L+(c[P+(i<<2)>>2]<<2)|0;if((c[g>>2]|0)!=(l|0)){c[g>>2]=l;a=a+1|0}i=i+1|0}k=k+1|0;g=c[n>>2]|0}}g=a+N|0;F=R+4|0;c[F>>2]=ow(N,N,g,1,1)|0;g=ow(N,N,g,1,1)|0;I=R+8|0;c[I>>2]=g;a=c[F>>2]|0;do if(!((g|0)==0|(a|0)==0)){D=c[a+20>>2]|0;C=c[a+24>>2]|0;A=c[a+28>>2]|0;E=c[g+28>>2]|0;B=c[g+20>>2]|0;x=c[g+24>>2]|0;c[B>>2]=0;c[D>>2]=0;y=(f|0)==0;z=(f|0)==2;f=(f|0)==1;d=0.0;p=0.0;o=0;i=0;b:while(1){if((o|0)>=(N|0)){o=62;break}t=o+N|0;c[L+(o<<2)>>2]=t;k=O+(o<<2)|0;u=o+1|0;v=O+(u<<2)|0;w=J+(o<<3)|0;q=0.0;r=0.0;j=c[k>>2]|0;while(1){a=c[v>>2]|0;if((j|0)>=(a|0))break;g=c[P+(j<<2)>>2]|0;a=L+(g<<2)|0;if((c[a>>2]|0)!=(t|0)){c[a>>2]=t;c[C+(i<<2)>>2]=g;do if(y)s=1.0;else{if(f){s=(+h[w>>3]+ +h[J+(g<<3)>>3])*.5;break}if(!z){o=44;break b}s=+H(+(+Ww(e,b,o,g)),.4)}while(0);U=-1.0/(s*s);h[A+(i<<3)>>3]=U;c[x+(i<<2)>>2]=g;T=s*U;n=E+(i<<3)|0;h[n>>3]=T;p=p+T*+Xw(e,b,o,g);T=+h[n>>3];i=i+1|0;q=q+U;r=r+T;d=d+s*T}j=j+1|0}n=c[k>>2]|0;while(1){if((n|0)>=(a|0))break;k=c[P+(n<<2)>>2]|0;l=O+(k+1<<2)|0;m=J+(k<<3)|0;j=c[O+(k<<2)>>2]|0;while(1){if((j|0)>=(c[l>>2]|0))break;g=P+(j<<2)|0;a=L+(c[g>>2]<<2)|0;if((c[a>>2]|0)!=(t|0)){c[a>>2]=t;do if(y)s=2.0;else{if(f){s=(+h[w>>3]+ +h[m>>3]*2.0+ +h[J+(c[g>>2]<<3)>>3])*.5;break}if(!z){o=57;break b}s=+H(+(+Ww(e,b,o,c[g>>2]|0)),.4)}while(0);c[C+(i<<2)>>2]=c[g>>2];T=-1.0/(s*s);h[A+(i<<3)>>3]=T;c[x+(i<<2)>>2]=c[g>>2];U=s*T;a=E+(i<<3)|0;h[a>>3]=U;p=p+U*+Xw(e,b,c[g>>2]|0,k);U=+h[a>>3];i=i+1|0;q=q+T;r=r+U;d=d+s*U}j=j+1|0}n=n+1|0;a=c[v>>2]|0}c[C+(i<<2)>>2]=o;w=K+(o<<3)|0;U=-(q*+h[w>>3]);h[w>>3]=U;h[A+(i<<3)>>3]=U-q;c[x+(i<<2)>>2]=o;h[E+(i<<3)>>3]=-r;i=i+1|0;c[D+(u<<2)>>2]=i;c[B+(u<<2)>>2]=i;o=u}if((o|0)==44){_3(96216,29,1,c[15715]|0)|0;Aa(138697,96132,418,96177)}else if((o|0)==57){_3(96216,29,1,c[15715]|0)|0;Aa(138697,96132,460,96177)}else if((o|0)==62){d=p/d;a=0;while(1){if((a|0)>=(i|0))break;P=E+(a<<3)|0;h[P>>3]=d*+h[P>>3];a=a+1|0}h[S>>3]=d;c[(c[F>>2]|0)+8>>2]=i;c[(c[I>>2]|0)+8>>2]=i;l6(L);l6(J);nw(Q);M=R;break}}else{Cx(R);M=0}while(0);return M|0}function Cx(a){a=a|0;var b=0;if(a|0){b=c[a+4>>2]|0;if(b|0)nw(b);b=c[a+8>>2]|0;if(b|0)nw(b);b=c[a+12>>2]|0;if(b|0)l6(b);b=c[a+20>>2]|0;if(b|0)db[c[a+16>>2]&127](b);l6(a)}return}function Dx(a,b,d,e,f,g){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;g=g|0;var i=0,j=0.0,k=0,l=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0.0;O=c[a>>2]|0;if(tw(a,0)|0?(c[a+16>>2]|0)==1:0){k=S(O,b)|0;j=0.0;i=0;while(1){if((i|0)>=(k|0))break;u=+h[e+(i<<3)>>3];j=j+u*u;i=i+1|0}a:do if(j==0.0){i=0;while(1){if((i|0)>=(k|0))break a;h[e+(i<<3)>>3]=+Pw()*72.0;i=i+1|0}}while(0);J=c[a+20>>2]|0;K=c[a+24>>2]|0;L=c[a+28>>2]|0;i=IK(56)|0;N=i+32|0;h[N>>3]=1.0;c[i+20>>2]=0;c[i+24>>2]=0;c[i>>2]=a;h[i+40>>3]=.01;c[i+48>>2]=~~+G(+(+(c[a>>2]|0)));M=IK(O<<3)|0;c[i+12>>2]=M;k=0;while(1){if((k|0)>=(O|0))break;h[M+(k<<3)>>3]=d;k=k+1|0}a=(c[a+8>>2]|0)+O|0;H=i+4|0;c[H>>2]=ow(O,O,a,1,1)|0;a=ow(O,O,a,1,1)|0;I=i+8|0;c[I>>2]=a;k=c[H>>2]|0;if(!((a|0)==0|(k|0)==0)){B=c[k+20>>2]|0;C=c[k+24>>2]|0;D=c[a+20>>2]|0;E=c[a+24>>2]|0;z=c[k+28>>2]|0;F=c[a+28>>2]|0;c[D>>2]=0;c[B>>2]=0;t=0.0;u=0.0;A=0;w=0;b:while(1){if((w|0)>=(O|0))break;x=w+1|0;y=J+(x<<2)|0;l=0.0;m=0.0;v=c[J+(w<<2)>>2]|0;j=t;d=u;k=A;while(1){o=z+(k<<3)|0;a=C+(k<<2)|0;p=F+(k<<3)|0;q=E+(k<<2)|0;if((v|0)>=(c[y>>2]|0))break;r=c[K+(v<<2)>>2]|0;if((r|0)!=(w|0)){c[a>>2]=r;s=+h[L+(v<<3)>>3];n=s*s;a=n==0.0;switch(f|0){case 2:{n=a?-1.0e5:-1.0/n;break}case 1:{n=a?-1.0e5:-1.0/s;break}case 0:{n=-1.0;break}default:{P=23;break b}}h[o>>3]=n;c[q>>2]=r;Q=s*n;h[p>>3]=Q;d=d+Q*+Xw(e,b,w,r);Q=+h[p>>3];l=l+n;m=m+Q;j=j+s*Q;k=k+1|0}v=v+1|0}c[a>>2]=w;A=M+(w<<3)|0;t=-(l*+h[A>>3]);h[A>>3]=t;h[o>>3]=t-l;c[q>>2]=w;h[p>>3]=-m;A=k+1|0;c[B+(x<<2)>>2]=A;c[D+(x<<2)>>2]=A;t=j;u=d;w=x}if((P|0)==23)Aa(138697,96132,591,96313);j=(g|0)==0?1.0:u/t;if(j==0.0)i=0;else{k=0;while(1){if((k|0)>=(A|0))break;P=F+(k<<3)|0;h[P>>3]=j*+h[P>>3];k=k+1|0}h[N>>3]=j;c[(c[H>>2]|0)+8>>2]=A;c[(c[I>>2]|0)+8>>2]=A}}else{Cx(i);i=0}return i|0}Aa(96246,96132,525,96313);return 0}function Ex(a){a=a|0;Cx(a);return}function Fx(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;return +(+Gx(a,b,c,d,e))}function Gx(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;var g=0,i=0,j=0.0,k=0,m=0,n=0,o=0,p=0.0,q=0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,D=0,E=0,F=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0;U=l;l=l+16|0;Q=U+12|0;T=U+8|0;n=U+4|0;k=U;m=c[a+4>>2]|0;i=c[a+8>>2]|0;c[Q>>2]=0;c[T>>2]=0;c[n>>2]=0;L=c[a+12>>2]|0;c[k>>2]=0;M=uw(i)|0;N=c[m>>2]|0;O=S(N,b)|0;g=O<<3;R=IK(g)|0;if((R|0)!=0?(P=S(b<<3,N)|0,B6(R|0,d|0,P|0)|0,K=IK(g)|0,c[T>>2]=K,(K|0)!=0):0){J=c[i+20>>2]|0;K=c[i+24>>2]|0;E=c[i+28>>2]|0;F=c[M+28>>2]|0;H=c[m+28>>2]|0;I=a+24|0;g=a+20|0;switch(c[I>>2]|0){case 1:{Hx(c[g>>2]|0,N,b,d,k,n);g=c[k>>2]|0;if(!g){B=0.0;C=0.0;g=0}else{m=vw(m,g)|0;B=0.0;C=0.0}break}case 2:{g=c[g>>2]|0;B=+h[g+8>>3];C=+h[g>>3];g=0;break}default:{B=0.0;C=0.0;g=0}}z=(L|0)==0;A=a+48|0;y=a+40|0;i=c[n>>2]|0;j=1.0;k=0;a:while(1){x=k+1|0;if(!((k|0)<(e|0)&j>f))break;b:do if((c[I>>2]|0)==4){n=c[T>>2]|0;k=0;while(1){if((k|0)>=(N|0))break b;o=S(k,b)|0;a=0;while(1){if((a|0)>=(b|0))break;h[n+(a+o<<3)>>3]=0.0;a=a+1|0}k=k+1|0}}else{t=0;while(1){if((t|0)>=(N|0))break;v=t+1|0;w=J+(v<<2)|0;p=0.0;u=c[J+(t<<2)>>2]|0;k=-1;while(1){if((u|0)>=(c[w>>2]|0))break;n=K+(u<<2)|0;a=c[n>>2]|0;if((t|0)==(a|0))k=u;else{s=+Xw(d,b,t,a);o=E+(u<<3)|0;r=+h[o>>3];q=F+(u<<3)|0;if(r==0.0)r=0.0;else{if(s==0.0){r=r/+h[H+(u<<3)>>3];a=0;while(1){if((a|0)>=(b|0))break;s=r*((+Pw()+.0001)*.0001);V=d+((S(c[n>>2]|0,b)|0)+a<<3)|0;h[V>>3]=+h[V>>3]+s;a=a+1|0}s=+Xw(d,b,t,c[n>>2]|0);r=+h[o>>3]}r=r/s}h[q>>3]=r;p=p+r}u=u+1|0}if((k|0)<=-1){D=25;break a}h[F+(k<<3)>>3]=-p;t=v}Dw(M,0,d,0,T,0,b)}while(0);c:do if(!z){n=c[T>>2]|0;k=0;while(1){if((k|0)>=(N|0))break c;o=L+(k<<3)|0;q=S(k,b)|0;a=0;while(1){if((a|0)>=(b|0))break;w=a+q|0;V=n+(w<<3)|0;h[V>>3]=+h[o>>3]*+h[R+(w<<3)>>3]+ +h[V>>3];a=a+1|0}k=k+1|0}}while(0);switch(c[I>>2]|0){case 1:{n=c[T>>2]|0;k=0;while(1){if((k|0)>=(N|0))break;o=S(k,b)|0;a=0;while(1){if((a|0)>=(b|0))break;D=a+o|0;V=n+(D<<3)|0;h[V>>3]=+h[i+(D<<3)>>3]+ +h[V>>3];a=a+1|0}k=k+1|0}k=n;p=+h[y>>3];a=c[A>>2]|0;D=51;break}case 2:{Ix(N,b,d,c[T>>2]|0,C,B);k=c[T>>2]|0;p=+h[y>>3];a=c[A>>2]|0;if((c[I>>2]|0)==2)Jx(m,C,b,d,k,p,a,Q);else D=51;break}default:{k=c[T>>2]|0;p=+h[y>>3];a=c[A>>2]|0;D=51}}if((D|0)==51){D=0;+cy(m,b,d,k,p,a,0,Q)}if(c[Q>>2]|0)break;j=+Kx(N,b,d,c[T>>2]|0);j=j/+G(+(+Tw(O,d,d)));B6(d|0,c[T>>2]|0,P|0)|0;k=x}if((D|0)==25)Aa(96350,96132,895,96361);nw(M);if(g){nw(g);nw(m)}}else{nw(M);j=1.0;i=0}l6(R);g=c[T>>2]|0;if(g|0)l6(g);if(i|0)l6(i);l=U;return +j}function Hx(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0,x=0.0,y=0,z=0,A=0,B=0,C=0.0;q=c[a+8>>2]|0;B=c[a+12>>2]|0;y=c[a+16>>2]|0;A=c[a+32>>2]|0;z=c[A+20>>2]|0;A=c[A+24>>2]|0;m=a+20|0;s=c[m>>2]|0;n=a+24|0;r=c[n>>2]|0;o=a+28|0;p=c[o>>2]|0;x=+h[a>>3];a=(s|0)!=0;i=(r|0)!=0|(p|0)!=0;a:do if((q|2|0)==3){if(!a){if(i)Aa(96395,96132,692,96412);else{j=0;l=0}while(1){if((j|0)>=(B|0))break;w=c[y+(j<<2)>>2]|0;t=+((c[z+(w+1<<2)>>2]|0)-(c[z+(w<<2)>>2]|0)|0)+1.0;j=j+1|0;l=~~(t*t)+l|0}r=l<<2;s=IK(r)|0;c[m>>2]=s;r=IK(r)|0;c[n>>2]=r;p=IK(l<<3)|0;c[o>>2]=p}u=0;a=0;while(1){if((u|0)>=(B|0))break;o=c[y+(u<<2)>>2]|0;q=z+(o<<2)|0;j=c[q>>2]|0;i=c[A+(j<<2)>>2]|0;j=c[A+(j+1<<2)>>2]|0;b:do if((i|0)!=(j|0)){C=+Ww(e,d,i,j);C=C*C;n=z+(o+1<<2)|0;t=+((c[n>>2]|0)-(c[q>>2]|0)|0);c[s+(a<<2)>>2]=o;c[r+(a<<2)>>2]=o;h[p+(a<<3)>>3]=x/C;k=C*(t*t);t=-(x/(C*t));j=c[q>>2]|0;while(1){a=a+1|0;i=c[n>>2]|0;if((j|0)>=(i|0))break;c[s+(a<<2)>>2]=o;c[r+(a<<2)>>2]=c[A+(j<<2)>>2];h[p+(a<<3)>>3]=t;j=j+1|0}k=x/k;m=c[q>>2]|0;while(1){if((m|0)>=(i|0))break b;l=c[A+(m<<2)>>2]|0;c[s+(a<<2)>>2]=l;c[r+(a<<2)>>2]=o;h[p+(a<<3)>>3]=t;j=c[q>>2]|0;while(1){a=a+1|0;i=c[n>>2]|0;if((j|0)>=(i|0))break;w=c[A+(j<<2)>>2]|0;c[s+(a<<2)>>2]=l;c[r+(a<<2)>>2]=w;h[p+(a<<3)>>3]=k;j=j+1|0}m=m+1|0}}while(0);u=u+1|0}i=Aw(a,b,b,s,r,p,1,8)|0;a=0}else{switch(q|0){case 2:case 4:break;default:{i=0;a=0;break a}}do if(!a)if(i)Aa(96395,96132,734,96412);else{v=B<<2;w=IK(v)|0;c[m>>2]=w;v=IK(v)|0;c[n>>2]=v;u=IK(B<<3)|0;c[o>>2]=u;break}else{u=p;v=r;w=s}while(0);a=IK(S(b<<3,d)|0)|0;j=S(d,b)|0;i=0;while(1){if((i|0)>=(j|0)){o=0;break}h[a+(i<<3)>>3]=0.0;i=i+1|0}while(1){if((o|0)>=(B|0))break;p=c[y+(o<<2)>>2]|0;l=z+(p<<2)|0;m=c[l>>2]|0;k=+Ww(e,d,c[A+(m<<2)>>2]|0,c[A+(m+1<<2)>>2]|0);c[w+(o<<2)>>2]=p;c[v+(o<<2)>>2]=p;k=x/k;h[u+(o<<3)>>3]=k;l=c[l>>2]|0;m=c[z+(p+1<<2)>>2]|0;p=S(p,d)|0;j=l;while(1){if((j|0)>=(m|0))break;n=S(c[A+(j<<2)>>2]|0,d)|0;i=0;while(1){if((i|0)>=(d|0))break;s=a+(i+p<<3)|0;h[s>>3]=+h[e+(i+n<<3)>>3]+ +h[s>>3];i=i+1|0}j=j+1|0}k=k/+(m-l|0);i=0;while(1){if((i|0)>=(d|0))break;s=a+(i+p<<3)|0;h[s>>3]=+h[s>>3]*k;i=i+1|0}o=o+1|0}i=Aw(o,b,b,w,v,u,1,8)|0}while(0);c[f>>2]=i;c[g>>2]=a;return}function Ix(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=+f;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0;f=e*f;g=0;a:while(1){if((g|0)>=(a|0))break;l=g+1|0;m=S(g,b)|0;i=l;while(1){if((i|0)==(a|0)){g=l;continue a}e=+Ww(c,b,g,i);k=S(i,b)|0;j=0;while(1){if((j|0)>=(b|0))break;p=j+m|0;n=j+k|0;o=f*((+h[c+(p<<3)>>3]-+h[c+(n<<3)>>3])/e);p=d+(p<<3)|0;h[p>>3]=+h[p>>3]+o;n=d+(n<<3)|0;h[n>>3]=+h[n>>3]-o;j=j+1|0}i=i+1|0}}return}function Jx(a,b,d,e,f,g,h,i){a=a|0;b=+b;d=d|0;e=e|0;f=f|0;g=+g;h=h|0;i=i|0;var j=0,k=0;k=Tx(a,b)|0;j=Yx(a,b)|0;+$x(k,j,c[a>>2]|0,d,e,f,g,h,i);return}function Kx(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0,k=0.0,l=0;f=0;i=0.0;while(1){if((f|0)>=(a|0))break;j=S(f,b)|0;e=0;g=0.0;while(1){if((e|0)>=(b|0))break;l=e+j|0;k=+h[d+(l<<3)>>3]-+h[c+(l<<3)>>3];e=e+1|0;g=g+k*k}f=f+1|0;i=i+ +G(+g)}return +i}function Lx(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=e|0;f=f|0;var g=0,i=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0.0;A=c[a>>2]|0;p=c[a+20>>2]|0;q=c[a+24>>2]|0;if(!(tw(a,0)|0))Aa(96096,96132,1034,96434);r=A<<3;B=IK(r)|0;j=0;while(1){if((j|0)>=(A|0))break;m=B+(j<<3)|0;h[m>>3]=0.0;n=j+1|0;o=p+(n<<2)|0;l=c[p+(j<<2)>>2]|0;g=0;k=0.0;while(1){if((l|0)>=(c[o>>2]|0))break;i=c[q+(l<<2)>>2]|0;if((j|0)!=(i|0)){k=+Xw(e,b,j,i);k=k+ +h[m>>3];h[m>>3]=k;g=g+1|0}l=l+1|0}if((g|0)<=0){z=11;break}h[m>>3]=k/+(g|0);j=n}if((z|0)==11)Aa(96209,96132,1046,96434);g=IK(56)|0;y=g+32|0;h[y>>3]=1.0;c[g+20>>2]=0;c[g+24>>2]=0;h[g+40>>3]=.01;c[g+48>>2]=~~+G(+(+(c[a>>2]|0)));x=IK(r)|0;c[g+12>>2]=x;i=0;while(1){if((i|0)>=(A|0))break;h[x+(i<<3)>>3]=d;i=i+1|0}do if((A|0)>2)if(!f){i=ey(A,b,e)|0;break}else{i=dy(A,b,e)|0;break}else i=uw(a)|0;while(0);f=g+4|0;c[f>>2]=vw(a,i)|0;nw(i);j=uw(c[f>>2]|0)|0;c[g+8>>2]=j;i=c[f>>2]|0;if((j|0)==0|(i|0)==0){Mx(g);g=0}else{r=c[i+20>>2]|0;q=c[i+24>>2]|0;p=c[i+28>>2]|0;f=c[j+28>>2]|0;v=0.0;w=0.0;m=0;while(1){if((m|0)>=(A|0))break;o=m+1|0;n=r+(o<<2)|0;u=0.0;d=0.0;j=-1;s=v;t=w;l=c[r+(m<<2)>>2]|0;while(1){if((l|0)>=(c[n>>2]|0))break;i=c[q+(l<<2)>>2]|0;if((i|0)==(m|0)){k=u;i=l}else{D=+H(+(+Ww(e,b,m,i)),.6);k=1.0/(D*D);h[p+(l<<3)>>3]=k;C=D*k;a=f+(l<<3)|0;h[a>>3]=C;t=t+C*+Xw(e,b,m,i);C=+h[a>>3];k=u+k;d=d+C;i=j;s=s+D*C}u=k;j=i;l=l+1|0}a=x+(m<<3)|0;k=-(u*+h[a>>3]);h[a>>3]=k;if((j|0)<=-1){z=31;break}h[p+(j<<3)>>3]=k-u;h[f+(j<<3)>>3]=-d;v=s;w=t;m=o}if((z|0)==31)Aa(96455,96132,1112,96434);k=w/v;j=c[r+(A<<2)>>2]|0;i=0;while(1){if((i|0)>=(j|0))break;A=f+(i<<3)|0;h[A>>3]=k*+h[A>>3];i=i+1|0}h[y>>3]=k;l6(B)}return g|0}function Mx(a){a=a|0;Cx(a);return}function Nx(a,b,c){a=a|0;b=b|0;c=c|0;+Gx(a,b,c,50,.001);return}function Ox(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;z=c[a>>2]|0;A=c[a+20>>2]|0;B=c[a+24>>2]|0;if(!(tw(a,0)|0))Aa(96096,96132,1149,96466);v=Ax(a,b,e)|0;w=c[v+28>>2]|0;a=IK(8)|0;x=IK(z<<2)|0;y=IK(z<<3)|0;i=0;while(1){if((i|0)>=(z|0)){o=0;break}l=y+(i<<3)|0;h[l>>3]=0.0;m=i+1|0;n=A+(m<<2)|0;j=c[A+(i<<2)>>2]|0;f=0;k=0.0;while(1){if((j|0)>=(c[n>>2]|0))break;g=c[B+(j<<2)>>2]|0;if((i|0)!=(g|0)){k=+Xw(e,b,i,g);k=k+ +h[l>>3];h[l>>3]=k;f=f+1|0}j=j+1|0}if((f|0)<=0){p=11;break}h[l>>3]=k/+(f|0);i=m}if((p|0)==11)Aa(96209,96132,1167,96466);while(1){if((o|0)>=(z|0)){m=0;f=0;break}c[x+(o<<2)>>2]=-1;o=o+1|0}a:while(1){if((m|0)>=(z|0))break;c[x+(m<<2)>>2]=m;j=A+(m<<2)|0;n=m+1|0;o=A+(n<<2)|0;i=c[j>>2]|0;while(1){g=c[o>>2]|0;if((i|0)>=(g|0))break;g=x+(c[B+(i<<2)>>2]<<2)|0;if((c[g>>2]|0)!=(m|0)){c[g>>2]=m;f=f+1|0}i=i+1|0}l=c[j>>2]|0;while(1){if((l|0)>=(g|0)){m=n;continue a}i=c[B+(l<<2)>>2]|0;j=A+(i+1<<2)|0;i=c[A+(i<<2)>>2]|0;while(1){if((i|0)>=(c[j>>2]|0))break;g=x+(c[B+(i<<2)>>2]<<2)|0;if((c[g>>2]|0)!=(m|0)){c[g>>2]=m;f=f+1|0}i=i+1|0}l=l+1|0;g=c[o>>2]|0}}e=ow(z,z,f,1,1)|0;c[a>>2]=e;if(!e){Px(a);a=0}else{p=c[e+20>>2]|0;q=c[e+24>>2]|0;r=c[e+28>>2]|0;c[p>>2]=0;g=0;f=0;while(1){if((g|0)>=(z|0))break;s=g+z|0;c[x+(g<<2)>>2]=s;l=A+(g<<2)|0;t=g+1|0;u=A+(t<<2)|0;b=y+(g<<3)|0;j=c[l>>2]|0;while(1){g=c[u>>2]|0;if((j|0)>=(g|0))break;g=c[B+(j<<2)>>2]|0;i=x+(g<<2)|0;if((c[i>>2]|0)!=(s|0)){c[i>>2]=s;c[q+(f<<2)>>2]=g;o=r+(f<<3)|0;h[o>>3]=(+h[b>>3]+ +h[y+(g<<3)>>3])*.5;h[o>>3]=+h[w+(j<<3)>>3];f=f+1|0}j=j+1|0}o=c[l>>2]|0;while(1){if((o|0)>=(g|0))break;j=c[B+(o<<2)>>2]|0;l=A+(j+1<<2)|0;m=y+(j<<3)|0;n=w+(o<<3)|0;j=c[A+(j<<2)>>2]|0;while(1){if((j|0)>=(c[l>>2]|0))break;g=B+(j<<2)|0;i=x+(c[g>>2]<<2)|0;if((c[i>>2]|0)!=(s|0)){c[i>>2]=s;c[q+(f<<2)>>2]=c[g>>2];i=r+(f<<3)|0;h[i>>3]=(+h[b>>3]+ +h[m>>3]*2.0+ +h[y+(c[g>>2]<<3)>>3])*.5;h[i>>3]=+h[n>>3]+ +h[w+(j<<3)>>3];f=f+1|0}j=j+1|0}o=o+1|0;g=c[u>>2]|0}c[p+(t<<2)>>2]=f;g=t}c[e+8>>2]=f;A=Vp()|0;B=a+4|0;c[B>>2]=A;B6(A|0,d|0,168)|0;B=c[B>>2]|0;c[B+16>>2]=0;c[B+40>>2]=1;A=B+96|0;h[A>>3]=+h[A>>3]*.5;c[B+80>>2]=20;l6(x);l6(y);nw(v)}return a|0}function Px(a){a=a|0;var b=0;if(a|0){b=c[a>>2]|0;if(b|0)nw(b);a=c[a+4>>2]|0;if(a|0)Wp(a)}return}function Qx(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=l;l=l+16|0;h=g;c[h>>2]=0;pq(e,b,c[a>>2]|0,c[a+4>>2]|0,d,f,h);if(!(c[h>>2]|0)){l=g;return}else Aa(96485,96132,1262,96491)}function Rx(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;c[g>>2]=0;g=c[d+120>>2]|0;a:do switch(g|0){case 5:case 6:{if((c[b>>2]|0)>2){b=Lx(b,a,0.0,f,(g|0)!=6&1)|0;Nx(b,a,f);Mx(b)}break}case 4:{g=0;while(1){if((g|0)==1)break a;i=Ox(b,a,d,f)|0;Qx(i,b,e,a,f);Px(i);g=g+1|0}}case 1:{d=0;h=6;break}case 2:{d=1;h=6;break}case 3:{d=2;h=6;break}default:{}}while(0);b:do if((h|0)==6){g=0;while(1){if((g|0)==1)break b;i=Bx(b,a,.05,f,d)|0;+Gx(i,a,f,50,.001);Cx(i);g=g+1|0}}while(0);return}function Sx(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0.0,i=0.0,j=0,k=0;k=l;l=l+16|0;f=k;c[f>>2]=d;j=c[a>>2]|0;a=c[j+8>>2]|0;i=+h[j>>3];j=c[a>>2]|0;Gw(a,b,f,0);a=0;g=0.0;while(1){if((a|0)>=(j|0))break;e=g+ +h[b+(a<<3)>>3];a=a+1|0;g=e}d=c[f>>2]|0;e=+(j|0);a=0;while(1){if((a|0)>=(j|0))break;f=d+(a<<3)|0;h[f>>3]=+h[f>>3]+i*(e*+h[b+(a<<3)>>3]-g);a=a+1|0}l=k;return d|0}function Tx(a,b){a=a|0;b=+b;var d=0,e=0;d=IK(8)|0;e=IK(16)|0;c[d>>2]=e;h[e>>3]=b;c[e+8>>2]=a;c[d+4>>2]=28;return d|0}function Ux(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;e=f;c[e>>2]=d;Gw(c[a>>2]|0,b,e,0);l=f;return c[e>>2]|0}function Vx(a){a=a|0;var b=0;b=IK(8)|0;c[b>>2]=a;c[b+4>>2]=29;return b|0}function Wx(a){a=a|0;if(a|0)l6(a);return}function Xx(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=c[a>>2]|0;e=~~+h[f>>3];f=f+8|0;a=0;while(1){if((a|0)>=(e|0))break;h[d+(a<<3)>>3]=+h[b+(a<<3)>>3]*+h[f+(a<<3)>>3];a=a+1|0}return d|0}function Yx(a,b){a=a|0;b=+b;var d=0,e=0,f=0,g=0,i=0,j=0.0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0.0;m=c[a>>2]|0;o=c[a+20>>2]|0;p=c[a+24>>2]|0;k=c[a+28>>2]|0;l=IK(8)|0;i=IK((m<<3)+8|0)|0;c[l>>2]=i;h[i>>3]=+(m|0);i=i+8|0;q=+(m+-1|0);j=1.0/q;b=q*b;a=0;a:while(1){if((a|0)>=(m|0))break;e=i+(a<<3)|0;h[e>>3]=j;f=a+1|0;g=c[o+(f<<2)>>2]|0;d=c[o+(a<<2)>>2]|0;while(1){if((d|0)>=(g|0)){a=f;continue a}if((a|0)==(c[p+(d<<2)>>2]|0)?(n=+h[k+(d<<3)>>3],(n>=0.0?n:-n)>0.0):0)h[e>>3]=1.0/(b+n);d=d+1|0}}c[l+4>>2]=30;return l|0}function Zx(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0.0,k=0,l=0,m=0,n=0;i=c[a>>2]|0;k=c[a+20>>2]|0;l=c[a+24>>2]|0;m=c[a+28>>2]|0;n=IK(8)|0;d=IK((c[a>>2]<<3)+8|0)|0;c[n>>2]=d;h[d>>3]=+(i|0);d=d+8|0;a=0;a:while(1){if((a|0)>=(i|0))break;e=d+(a<<3)|0;h[e>>3]=1.0;f=a+1|0;g=c[k+(f<<2)>>2]|0;b=c[k+(a<<2)>>2]|0;while(1){if((b|0)>=(g|0)){a=f;continue a}if((a|0)==(c[l+(b<<2)>>2]|0)?(j=+h[m+(b<<3)>>3],(j>=0.0?j:-j)>0.0):0)h[e>>3]=1.0/j;b=b+1|0}}c[n+4>>2]=30;return n|0}function _x(a){a=a|0;l6(c[a>>2]|0);if(a|0)l6(a);return}function $x(a,b,c,d,e,f,g,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=+g;i=i|0;j=j|0;var k=0.0,l=0,m=0.0,n=0,o=0,p=0;o=c<<3;n=IK(o)|0;o=IK(o)|0;l=0;m=0.0;while(1){if((l|0)<(d|0))j=0;else break;while(1){if((j|0)>=(c|0))break;p=(S(j,d)|0)+l|0;h[n+(j<<3)>>3]=+h[e+(p<<3)>>3];h[o+(j<<3)>>3]=+h[f+(p<<3)>>3];j=j+1|0}k=+ay(a,b,c,n,o,g,i);j=0;while(1){if((j|0)>=(c|0))break;h[f+((S(j,d)|0)+l<<3)>>3]=+h[n+(j<<3)>>3];j=j+1|0}l=l+1|0;m=m+k}l6(n);l6(o);return +m}function ay(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=+g;h=h|0;var i=0,j=0.0,k=0,l=0,m=0,n=0.0,o=0.0,p=0,q=0,r=0,s=0.0,t=0,u=0;r=c[a+4>>2]|0;p=c[b+4>>2]|0;q=d<<3;i=IK(q)|0;k=IK(q)|0;t=IK(q)|0;l=IK(q)|0;k=eb[r&63](a,e,k)|0;m=Sw(d,f,k)|0;o=+(d|0);s=+G(+(+Tw(d,m,m)))/o;n=s*g;m=0;f=t;j=1.0;g=s;while(1){if(!(g>n&(m|0)<(h|0)))break;i=eb[p&63](b,k,i)|0;g=+Tw(d,k,i);if((m|0)>0)Uw(d,i,f,g/j)|0;else B6(f|0,i|0,q|0)|0;u=eb[r&63](a,f,l)|0;j=g/+Tw(d,f,u);Vw(d,e,f,j)|0;t=Vw(d,k,u,-j)|0;m=m+1|0;j=g;l=u;g=+G(+(+Tw(d,t,t)))/o}l6(i);l6(k);l6(f);l6(l);return +g}function by(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0.0,j=0.0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=l;l=l+16|0;B=C;y=c[a+4>>2]|0;z=y<<3;A=IK(z)|0;u=IK(z)|0;v=IK(z)|0;w=c[a+20>>2]|0;x=c[a+24>>2]|0;s=c[a+28>>2]|0;t=c[15715]|0;r=0;while(1){if((r|0)<(b|0))g=0;else break;while(1){if((g|0)>=(y|0)){a=0;break}q=(S(g,b)|0)+r|0;h[A+(g<<3)>>3]=+h[d+(q<<3)>>3];h[v+(g<<3)>>3]=+h[e+(q<<3)>>3];g=g+1|0}while(1){if((a|0)<(f|0))n=0;else{g=0;break}while(1){if((n|0)>=(y|0))break;o=c[w+(n<<2)>>2]|0;p=n+1|0;q=c[w+(p<<2)>>2]|0;m=o;j=0.0;i=0.0;while(1){if((m|0)>=(q|0))break;g=c[x+(m<<2)>>2]|0;k=+h[s+(m<<3)>>3];if((g|0)==(n|0))i=k;else j=j+k*+h[A+(g<<3)>>3];m=m+1|0}if(j==0.0){c[B>>2]=q-o;z4(t,96513,B)|0}h[u+(n<<3)>>3]=(+h[v+(n<<3)>>3]-j)/i;n=p}B6(A|0,u|0,z|0)|0;a=a+1|0}while(1){if((g|0)>=(y|0))break;h[e+((S(g,b)|0)+r<<3)>>3]=+h[A+(g<<3)>>3];g=g+1|0}r=r+1|0}l6(A);l6(u);l6(v);l=C;return e|0}function cy(a,b,d,e,f,g,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;g=g|0;h=h|0;i=i|0;var j=0;j=c[a>>2]|0;c[i>>2]=0;switch(h|0){case 0:{h=Vx(a)|0;i=Zx(a)|0;f=+$x(h,i,j,b,d,e,f,g,0);Wx(h);_x(i);break}case 1:{by(a,b,d,e,g,0)|0;f=0.0;break}default:f=0.0}return +f}function dy(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;o=l;l=l+32|0;k=o;m=o+20|0;f=o+16|0;g=o+12|0;i=o+8|0;h[k>>3]=1.0;j=a<<3;n=IK(j)|0;j=IK(j)|0;b=0;while(1){if((b|0)>=(a|0))break;e=b<<1;h[n+(b<<3)>>3]=+h[d+(e<<3)>>3];h[j+(b<<3)>>3]=+h[d+((e|1)<<3)>>3];b=b+1|0}c[m>>2]=b;if((a|0)>2)d=Wr(n,j,a,i)|0;else{c[i>>2]=0;d=0}e=ow(a,a,1,1,2)|0;b=0;while(1){c[m>>2]=b;if((b|0)>=(c[i>>2]|0))break;p=b<<1;c[f>>2]=c[d+(p<<2)>>2];c[g>>2]=c[d+((p|1)<<2)>>2];Kw(e,1,f,g,k)|0;b=(c[m>>2]|0)+1|0}if((a|0)==2){c[f>>2]=0;c[g>>2]=1;Kw(e,1,f,g,k)|0;b=0}else b=0;while(1){c[m>>2]=b;if((b|0)>=(a|0))break;Kw(e,1,m,m,k)|0;b=(c[m>>2]|0)+1|0}a=zw(e)|0;nw(e);p=sw(a,0)|0;nw(a);l6(d);l6(n);l6(j);l=o;return p|0}function ey(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;g=m+8|0;i=m;h[i>>3]=1.0;k=a<<3;j=IK(k)|0;k=IK(k)|0;e=0;while(1){if((e|0)>=(a|0))break;f=S(e,b)|0;h[j+(e<<3)>>3]=+h[d+(f<<3)>>3];h[k+(e<<3)>>3]=+h[d+(f+1<<3)>>3];e=e+1|0}c[g>>2]=e;e=Xr(j,k,a,0)|0;f=ow(a,a,1,1,2)|0;b=0;while(1){c[g>>2]=b;if((b|0)<(a|0))d=1;else{b=0;break}while(1){if((d|0)>=(c[e+(b*12|0)>>2]|0))break;Kw(f,1,g,(c[e+(b*12|0)+4>>2]|0)+(d<<2)|0,i)|0;d=d+1|0;b=c[g>>2]|0}b=b+1|0}while(1){c[g>>2]=b;if((b|0)>=(a|0))break;Kw(f,1,g,g,i)|0;b=(c[g>>2]|0)+1|0}i=sw(zw(f)|0,0)|0;nw(f);l6(j);l6(k);Yr(e);l=m;return i|0}function fy(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;gy(f,c);hy(a,b,c,f);iy(b,f,d);jy(f);l=e;return}function gy(a,b){a=a|0;b=b|0;c[a>>2]=IK(b<<4)|0;c[a+4>>2]=b;c[a+8>>2]=0;return}function hy(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=l;l=l+64|0;r=D+32|0;u=D+48|0;v=D+16|0;w=D;t=b<<2;A=IK(t)|0;C=IK(t)|0;c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;s=IK(t)|0;t=IK(t)|0;f=0;while(1){if((f|0)>=(b|0))break;c[s+(f<<2)>>2]=f;f=f+1|0}q=b+-1|0;ft(a,s,0,q);f=0;while(1){if((f|0)>=(b|0))break;c[t+(c[s+(f<<2)>>2]<<2)>>2]=f;f=f+1|0}ly(u,a,s,b);f=1;while(1){if((f|0)>=(b|0)){f=0;break}c[A+(c[s+(f<<2)>>2]<<2)>>2]=c[s+(f+-1<<2)>>2];f=f+1|0}while(1){if((f|0)>=(q|0))break;p=f+1|0;c[C+(c[s+(f<<2)>>2]<<2)>>2]=c[s+(p<<2)>>2];f=p}k=e+8|0;m=e+4|0;n=v+4|0;o=w+4|0;p=w+8|0;j=0;while(1){if((j|0)>=(d|0))break;if(!((my(u,v)|0)<<24>>24))break;f=c[k>>2]|0;b=c[m>>2]|0;if((f|0)<(b|0))b=c[e>>2]|0;else{c[m>>2]=b<<1;b=n6(c[e>>2]|0,b<<5)|0;c[e>>2]=b;f=c[k>>2]|0}c[k>>2]=f+1;f=b+(f<<4)|0;c[f>>2]=c[v>>2];c[f+4>>2]=c[v+4>>2];c[f+8>>2]=c[v+8>>2];c[f+12>>2]=c[v+12>>2];f=c[v>>2]|0;b=c[t+(f<<2)>>2]|0;g=c[n>>2]|0;i=c[t+(g<<2)>>2]|0;if((b|0)>0?(x=c[s+(b+-1<<2)>>2]|0,y=C+(x<<2)|0,(c[t+(c[y>>2]<<2)>>2]|0)<(i|0)):0){c[w>>2]=x;c[o>>2]=g;h[p>>3]=+h[a+(g<<3)>>3]-+h[a+(x<<3)>>3];c[r>>2]=c[w>>2];c[r+4>>2]=c[w+4>>2];c[r+8>>2]=c[w+8>>2];c[r+12>>2]=c[w+12>>2];ny(u,r);c[y>>2]=g;c[A+(g<<2)>>2]=x}if((i|0)<(q|0)?(z=c[s+(i+1<<2)>>2]|0,B=A+(z<<2)|0,(c[t+(c[B>>2]<<2)>>2]|0)>(b|0)):0){c[w>>2]=f;c[o>>2]=z;h[p>>3]=+h[a+(z<<3)>>3]-+h[a+(f<<3)>>3];c[r>>2]=c[w>>2];c[r+4>>2]=c[w+4>>2];c[r+8>>2]=c[w+8>>2];c[r+12>>2]=c[w+12>>2];ny(u,r);c[B>>2]=f;c[C+(f<<2)>>2]=z}j=j+1|0}l6(A);l6(C);l6(s);l6(t);oy(u);l=D;return}function iy(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;k=IK(a<<2)|0;l=b+8|0;i=c[l>>2]|0;j=(i<<1)+a|0;h=j<<2;e=IK(h)|0;h=IK(h)|0;f=0;while(1){if((f|0)>=(a|0))break;c[k+(f<<2)>>2]=1;f=f+1|0}f=0;while(1){if((f|0)>=(i|0)){f=0;break}n=c[b>>2]|0;m=c[n+(f<<4)+4>>2]|0;n=k+(c[n+(f<<4)>>2]<<2)|0;c[n>>2]=(c[n>>2]|0)+1;m=k+(m<<2)|0;c[m>>2]=(c[m>>2]|0)+1;f=f+1|0}while(1){if((f|0)>=(j|0))break;g[h+(f<<2)>>2]=1.0;f=f+1|0}i=IK(a*20|0)|0;c[d>>2]=i;f=0;while(1){if((f|0)>=(a|0))break;c[i+(f*20|0)>>2]=1;c[i+(f*20|0)+8>>2]=h;c[i+(f*20|0)+4>>2]=e;c[e>>2]=f;g[h>>2]=0.0;n=c[k+(f<<2)>>2]|0;h=h+(n<<2)|0;e=e+(n<<2)|0;f=f+1|0}l6(k);while(1){e=c[l>>2]|0;if(!e)break;n=e+-1|0;c[l>>2]=n;m=c[b>>2]|0;ky(i,c[m+(n<<4)>>2]|0,c[m+(n<<4)+4>>2]|0)}return}function jy(a){a=a|0;l6(c[a>>2]|0);return}function ky(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,i=0,j=0;f=a+(b*20|0)|0;h=c[f>>2]|0;i=c[a+(b*20|0)+4>>2]|0;e=0;while(1){if((e|0)>=(h|0)){j=4;break}if((c[i+(e<<2)>>2]|0)==(d|0))break;else e=e+1|0}if((j|0)==4?(c[f>>2]=h+1,c[i+(h<<2)>>2]=d,i=c[a+(d*20|0)+4>>2]|0,h=a+(d*20|0)|0,j=c[h>>2]|0,c[h>>2]=j+1,c[i+(j<<2)>>2]=b,c[a+8>>2]|0):0){j=c[a+(b*20|0)+8>>2]|0;g[j>>2]=+g[j>>2]+-1.0;j=c[a+(d*20|0)+8>>2]|0;g[j>>2]=+g[j>>2]+-1.0}return}function ly(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0.0,k=0,l=0;f=e+-1|0;c[a+4>>2]=f;c[a+8>>2]=f;c[a>>2]=IK(f<<4)|0;e=0;while(1){if((e|0)>=(f|0))break;l=c[d+(e<<2)>>2]|0;g=e+1|0;k=c[d+(g<<2)>>2]|0;j=+h[b+(k<<3)>>3]-+h[b+(l<<3)>>3];i=c[a>>2]|0;c[i+(e<<4)>>2]=l;c[i+(e<<4)+4>>2]=k;h[i+(e<<4)+8>>3]=j;e=g}e=(f|0)/2|0;while(1){if((e|0)<=-1)break;py(a,e);e=e+-1|0}return}function my(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+4|0;if(!(c[d>>2]|0))a=0;else{e=c[a>>2]|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];b=c[a>>2]|0;e=b+((c[d>>2]|0)+-1<<4)|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];c[d>>2]=(c[d>>2]|0)+-1;py(a,0);a=1}return a|0}function ny(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0.0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;k=m;i=a+4|0;j=c[i>>2]|0;d=a+8|0;if((j|0)==(c[d>>2]|0)){c[d>>2]=j<<1;e=n6(c[a>>2]|0,j<<5)|0;c[a>>2]=e;d=c[i>>2]|0}else{d=j;e=c[a>>2]|0}c[i>>2]=d+1;e=e+(j<<4)|0;c[e>>2]=c[b>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];e=j;while(1){if((e|0)<=0)break;d=c[a>>2]|0;f=+h[d+(e<<4)+8>>3];b=e>>>1;g=+h[d+(b<<4)+8>>3];if(!(f>2]|0}j=d+(e<<4)|0;c[k>>2]=c[j>>2];c[k+4>>2]=c[j+4>>2];c[k+8>>2]=c[j+8>>2];c[k+12>>2]=c[j+12>>2];i=d+(b<<4)|0;c[j>>2]=c[i>>2];c[j+4>>2]=c[i+4>>2];c[j+8>>2]=c[i+8>>2];c[j+12>>2]=c[i+12>>2];j=(c[a>>2]|0)+(b<<4)|0;c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];e=b}l=m;return}function oy(a){a=a|0;l6(c[a>>2]|0);return}function py(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,g=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+16|0;i=m;j=a+4|0;while(1){d=b<<1;g=d|1;if((d|0)<(c[j>>2]|0)){n=c[a>>2]|0;e=+h[n+(d<<4)+8>>3];f=+h[n+(b<<4)+8>>3];if(!(e>2]|0)){n=c[a>>2]|0;e=+h[n+(g<<4)+8>>3];f=+h[n+(d<<4)+8>>3];if(!(e>2]|0;n=g+(d<<4)|0;c[i>>2]=c[n>>2];c[i+4>>2]=c[n+4>>2];c[i+8>>2]=c[n+8>>2];c[i+12>>2]=c[n+12>>2];g=g+(b<<4)|0;c[n>>2]=c[g>>2];c[n+4>>2]=c[g+4>>2];c[n+8>>2]=c[g+8>>2];c[n+12>>2]=c[g+12>>2];n=(c[a>>2]|0)+(b<<4)|0;c[n>>2]=c[i>>2];c[n+4>>2]=c[i+4>>2];c[n+8>>2]=c[i+8>>2];c[n+12>>2]=c[i+12>>2];b=d}l=m;return}function qy(a,b,d,e,f,g,i,j){a=a|0;b=b|0;d=+d;e=+e;f=f|0;g=g|0;i=i|0;j=j|0;var k=0,l=0,m=0,n=0.0;l=(f|0)!=0;if(!l){f=IK(b<<3)|0;if(!(gu(a,b,f,b)|0))m=3;else{a=1;m=17}}else m=3;if((m|0)==3){k=HK(b<<2)|0;c[g>>2]=k;a=0;while(1){if((a|0)>=(b|0))break;c[k+(a<<2)>>2]=a;a=a+1|0}a=b+-1|0;ft(f,k,0,a);n=+h[f+(c[k>>2]<<3)>>3];e=(+h[f+(c[k+(a<<2)>>2]<<3)>>3]-n)*e/+(a|0);e=e=(b|0))break;n=+h[f+(c[k+(g<<2)>>2]<<3)>>3];a=(n-d>e&1)+a|0;g=g+1|0;d=n}c[j>>2]=a;a:do if(!a){k=IK(4)|0;c[i>>2]=k;c[k>>2]=b}else{j=IK(a<<2)|0;c[i>>2]=j;a=0;g=1;while(1){if((g|0)>=(b|0))break a;if(+h[f+(c[k+(g<<2)>>2]<<3)>>3]-+h[f+(c[k+(g+-1<<2)>>2]<<3)>>3]>e){c[j+(a<<2)>>2]=g;a=a+1|0}g=g+1|0}}while(0);if(l)a=0;else{a=0;m=17}}if((m|0)==17)l6(f);return a|0}function ry(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0,i=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=c[46972]|0;if(d|0)sn(d);c[46972]=rn(b,b,0.0)|0;d=c[46973]|0;if(d|0)l6(d);c[46973]=HK(b<<2)|0;d=c[46974]|0;if(d|0)l6(d);n=HK(b<<3)|0;c[46974]=n;o=c[46972]|0;p=c[46973]|0;i=0;while(1){if((i|0)>=(b|0)){e=10;break}e=a+(i<<2)|0;g=o+(i<<2)|0;f=0.0;d=0;while(1){if((d|0)==(b|0))break;j=+h[(c[e>>2]|0)+(d<<3)>>3];h[(c[g>>2]|0)+(d<<3)>>3]=j;j=+F(+j);f=f>3]=1.0/f;c[p+(i<<2)>>2]=i;i=i+1|0}a:do if((e|0)==10){m=b+-1|0;d=0;l=0;b:while(1){if((l|0)<(m|0)){e=l;f=0.0}else break;while(1){if((e|0)>=(b|0))break;k=c[p+(e<<2)>>2]|0;j=+F(+(+h[(c[o+(k<<2)>>2]|0)+(l<<3)>>3]));j=j*+h[n+(k<<3)>>3];k=f>2]|0;c[e>>2]=c[g>>2];c[g>>2]=k}i=c[o+(c[e>>2]<<2)>>2]|0;f=+h[i+(l<<3)>>3];k=l+1|0;g=k;while(1){if((g|0)>=(b|0)){l=k;continue b}a=c[o+(c[p+(g<<2)>>2]<<2)>>2]|0;e=a+(l<<3)|0;j=+h[e>>3]/f;h[e>>3]=j;c:do if(j!=0.0){e=k;while(1){if((e|0)>=(b|0))break c;q=a+(e<<3)|0;h[q>>3]=+h[q>>3]-j*+h[i+(e<<3)>>3];e=e+1|0}}while(0);g=g+1|0}}d=+h[(c[o+(c[p+(m<<2)>>2]<<2)>>2]|0)+(m<<3)>>3]!=0.0&1}else if((e|0)==15){h[d>>3]=0.0;d=0}while(0);return d|0}function sy(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0,i=0,j=0,k=0,l=0;k=c[46973]|0;l=c[46972]|0;j=0;while(1){if((j|0)>=(d|0)){e=d;break}g=c[k+(j<<2)>>2]|0;i=l+(g<<2)|0;f=0.0;e=0;while(1){if((e|0)==(j|0))break;f=f+ +h[(c[i>>2]|0)+(e<<3)>>3]*+h[a+(e<<3)>>3];e=e+1|0}h[a+(j<<3)>>3]=+h[b+(g<<3)>>3]-f;j=j+1|0}while(1){b=e+-1|0;if((e|0)<=0)break;g=c[l+(c[k+(b<<2)>>2]<<2)>>2]|0;f=0.0;while(1){if((e|0)>=(d|0))break;f=f+ +h[g+(e<<3)>>3]*+h[a+(e<<3)>>3];e=e+1|0}e=a+(b<<3)|0;h[e>>3]=(+h[e>>3]-f)/+h[g+(b<<3)>>3];e=b}return}function ty(a){a=a|0;var b=0;b=IK(8)|0;c[b>>2]=a;c[b+4>>2]=0;return b|0}function uy(a,b){a=a|0;b=b|0;var d=0,e=0;if(a|0)do{d=a;a=c[a+4>>2]|0;e=c[d>>2]|0;if(e|0)db[b&127](e);l6(d)}while((a|0)!=0);return}function vy(a,b){a=a|0;b=b|0;b=ty(b)|0;c[b+4>>2]=a;return b|0}function wy(a){a=a|0;return c[a>>2]|0}function xy(a){a=a|0;return c[a+4>>2]|0}function yy(a){a=a|0;var b=0;b=IK(12)|0;c[b>>2]=a;c[b+4>>2]=0;c[b+8>>2]=0;return b|0}function zy(a,b){a=a|0;b=b|0;var d=0,e=0;if(a|0)do{d=a;a=c[a+4>>2]|0;e=c[d>>2]|0;if(e|0)db[b&127](e);l6(d)}while((a|0)!=0);return}function Ay(a,b){a=a|0;b=b|0;b=yy(b)|0;if(a|0){c[b+4>>2]=a;c[a+8>>2]=b}return b|0}function By(a){a=a|0;return c[a>>2]|0}function Cy(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;if(a|0){e=c[a+4>>2]|0;f=c[a+8>>2]|0;g=c[a>>2]|0;if(g|0)db[b&127](g);l6(a);if(e|0)c[e+8>>2]=f;c[(f|0?f+4|0:d)>>2]=e}return}function Dy(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;return}function Ey(a){a=a|0;var b=0;b=HK(64)|0;Dy(b+36|0);c[b+8>>2]=a;return b|0}function Fy(a){a=a|0;if(a|0){$y(c[a+32>>2]|0);l6(a)}return}function Gy(a){a=a|0;return qB(c[a+8>>2]|0)|0}function Hy(a,b){a=a|0;b=b|0;var d=0,e=0;c[b+4>>2]=0;d=a+4|0;e=c[d>>2]|0;c[((e|0)==0?a:e+4|0)>>2]=b;c[d>>2]=b;return}function Iy(a,b){a=a|0;b=b|0;var d=0;d=c[a>>2]|0;if(!d){c[a>>2]=b;a=a+4|0}else c[b+4>>2]=d;c[a>>2]=b;return}function Jy(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;Ky(a,b);j=c[b>>2]|0;h=c[j+4>>2]|0;while(1){if(!h)break;k=c[h+8>>2]|0;i=gC(k)|0;d=c[(c[i+16>>2]|0)+112>>2]|0;a=c[d+16+4>>2]|0;d=c[d+8>>2]|0;f=i;i=hC(k,i)|0;while(1){if(!i)break;e=c[(c[i+16>>2]|0)+112>>2]|0;g=c[e+16+4>>2]|0;if((g|0)<(a|0)){f=i;d=c[e+8>>2]|0;a=g}i=hC(k,i)|0}i=c[(c[d+16>>2]|0)+112>>2]|0;k=i+4|0;c[k>>2]=c[k>>2]|8;c[h>>2]=f;k=c[h+4>>2]|0;Hy((c[i+12>>2]|0)+36|0,h);h=k}Dy(b);return j|0}function Ky(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;i=j;h=j+8|0;f=c[d+24>>2]|0;if(!((f|0)!=0?(e=qC(b,f,0)|0,(e|0)!=0):0))g=3;a:do if((g|0)==3){f=d+20|0;b:do if(c[f>>2]|0){e=gC(b)|0;while(1){if(!e)break b;if((aP(c[c[(c[e+16>>2]|0)+112>>2]>>2]|0,c[f>>2]|0,0)|0)<<24>>24)break a;e=hC(b,e)|0}}while(0);e=gC(b)|0}while(0);if(a[195234]|0){g=c[15715]|0;c[i>>2]=HB(e)|0;z4(g,96524,i)|0}c[h+4>>2]=0;c[h>>2]=0;Ly(b,e,d,1,h);l=j;return}function Ly(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;l=d+8|0;j=c[l>>2]|0;c[l>>2]=j+1;l=b+16|0;k=c[(c[l>>2]|0)+112>>2]|0;c[k+16+4>>2]=j;c[k+24>>2]=j;k=(e|0)!=0;j=ZA(a,b)|0;while(1){if(!j)break;e=c[j>>2]&3;g=c[((e|0)==2?j:j+-48|0)+40>>2]|0;h=c[(c[j+16>>2]|0)+120>>2]|0;i=(c[h>>2]|0)!=0;if((g|0)==(b|0)){e=c[((e|0)==3?j:j+48|0)+40>>2]|0;if(i)g=e;else{c[h>>2]=-1;g=e}}else if(!i)c[h>>2]=1;e=g+16|0;h=c[(c[e>>2]|0)+112>>2]|0;i=c[h+16+4>>2]|0;do if(!i){c[h+8>>2]=b;My(f,j);Ly(a,g,d,0,f);i=c[(c[l>>2]|0)+112>>2]|0;m=i+24|0;h=(c[(c[e>>2]|0)+112>>2]|0)+24|0;c[m>>2]=c[(c[(c[((c[m>>2]|0)<(c[h>>2]|0)?b:g)+16>>2]|0)+112>>2]|0)+24>>2];if((c[h>>2]|0)>=(c[i+16+4>>2]|0)){e=0;do{h=Ny(f)|0;g=(c[c[(c[h+16>>2]|0)+120>>2]>>2]|0)==1;g=c[((c[h>>2]&3|0)==((g?2:3)|0)?h:h+((g?-1:1)*48|0)|0)+40>>2]|0;if(!(c[(c[(c[g+16>>2]|0)+112>>2]|0)+12>>2]|0)){if(!e)e=Oy(a,d)|0;Py(e,g)}}while((h|0)!=(j|0));if(e|0){if((c[(c[(c[l>>2]|0)+112>>2]|0)+12>>2]|0)==0?(Gy(e)|0)>1:0)Py(e,b);if(k?(c[(c[(c[l>>2]|0)+112>>2]|0)+12>>2]|0)==(e|0):0){Iy(d,e);break}Hy(d,e)}}}else{e=c[(c[l>>2]|0)+112>>2]|0;if((c[e+8>>2]|0)!=(g|0)){m=e+24|0;h=c[m>>2]|0;c[m>>2]=(h|0)<(i|0)?h:i}}while(0);j=_A(a,j,b)|0}if(k?(c[(c[(c[l>>2]|0)+112>>2]|0)+12>>2]|0)==0:0){m=Oy(a,d)|0;Py(m,b);Iy(d,m)}return}function My(a,b){a=a|0;b=b|0;c[(c[(c[b+16>>2]|0)+120>>2]|0)+4>>2]=c[a>>2];c[a>>2]=b;b=a+4|0;c[b>>2]=(c[b>>2]|0)+1;return}function Ny(a){a=a|0;var b=0,d=0,e=0;b=c[a>>2]|0;if(!b)Aa(138697,96555,65,96567);d=a+4|0;e=c[d>>2]|0;if((e|0)>0){c[a>>2]=c[(c[(c[b+16>>2]|0)+120>>2]|0)+4>>2];c[d>>2]=e+-1;return b|0}else Aa(96545,96555,61,96567);return 0}function Oy(a,b){a=a|0;b=b|0;return Ey(Qy(a,b)|0)|0}function Py(a,b){a=a|0;b=b|0;lC(c[a+8>>2]|0,b,1)|0;c[(c[(c[b+16>>2]|0)+112>>2]|0)+12>>2]=a;return}function Qy(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=l;l=l+144|0;f=d;e=d+8|0;g=b+12|0;b=c[g>>2]|0;c[g>>2]=b+1;c[f>>2]=b;i2(e,96535,f)|0;b=LD(a,e,1)|0;RC(b,137786,280,1)|0;l=d;return b|0}function Ry(a){a=a|0;var b=0,d=0;b=c[a+36>>2]|0;while(1){if(!b)break;d=c[b+4>>2]|0;Ry(b);b=d}Fy(a);return}function Sy(a,b,c){a=a|0;b=b|0;c=c|0;Ty(a,b,+h[c+32>>3]);return}function Ty(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,g=0,i=0;e=b+36|0;f=0;while(1){e=c[e>>2]|0;if(!e)break;Ty(a,e,d);e=e+4|0;f=f+1|0}e=jz(a,b,d)|0;c[b+32>>2]=e;a=gz(e)|0;if((f|0)>0)d=+Uy(f,a,e,b,d);else d=3.141592653589793;if((((a|0)==1?(g=c[b>>2]|0,g|0):0)?c[(c[(c[g+16>>2]|0)+112>>2]|0)+8>>2]|0:0)?(i=b+48|0,h[i>>3]=d,d<0.0):0)h[i>>3]=d+6.283185307179586;return}function Uy(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;var g=0.0,i=0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+48|0;t=v;u=HK(a*56|0)|0;c[t+40>>2]=c[e+36>>2];p=e+16|0;j=+h[p>>3];q=t+8|0;h[q>>3]=j;h[t>>3]=j;c[t+44>>2]=c[e>>2];j=6.283185307179586/+(b|0);h[t+16>>3]=j;r=t+24|0;h[r>>3]=-1.0;s=t+32|0;h[s>>3]=-1.0;k=0;o=0;g=0.0;while(1){i=c[d>>2]|0;if(!i)break;d=c[i>>2]|0;if(!(c[(c[(c[d+16>>2]|0)+112>>2]|0)+4>>2]&8))d=o;else{n=u+(o*56|0)|0;c[n>>2]=d;h[u+(o*56|0)+8>>3]=+(k|0)*j;d=o+1|0;g=+Vy(n,t,f)}k=k+1|0;o=d;d=i+4|0}a:do if((o|0)==1){h[u+40>>3]=1.0;d=0}else{n=u+8|0;if((o|0)==2){j=+h[u+64>>3]-+h[n>>3];Wy(u,u+56|0,j>3.141592653589793?6.283185307179586-j:j);d=0;break}else{m=u;d=0}while(1){if((d|0)>=(o|0)){d=0;break a}d=d+1|0;k=m+56|0;j=+h[m+8>>3];if((d|0)==(o|0)){i=u;j=+h[n>>3]-j+6.283185307179586}else{i=k;j=+h[m+64>>3]-j}Wy(m,i,j);m=k}}while(0);while(1){if((d|0)>=(o|0))break;Xy(u+(d*56|0)|0,t,b,f);d=d+1|0}l6(u);if((a|0)==1){f=f*.5+g;Yy(e,-f,0.0,0.0);h[p>>3]=f+ +h[p>>3];u=e+56|0;c[u>>2]=c[u>>2]|1}else h[p>>3]=+h[q>>3];l=v;return +((+h[r>>3]+ +h[s>>3])*.5+-3.141592653589793)}function Vy(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0.0,g=0.0,i=0,j=0,k=0.0;i=0;f=0.0;g=0.0;e=b+40|0;while(1){j=c[e>>2]|0;if(!j)break;e=c[j>>2]|0;if(!e)e=0;else e=c[(c[(c[e+16>>2]|0)+112>>2]|0)+8>>2]|0;if((e|0)==(c[a>>2]|0)){k=+h[j+16>>3];e=i+1|0;f=f+(k*2.0+d);g=g>3]=f;c[a+48>>2]=i;h[a+16>>3]=g+(+h[b>>3]+d);h[a+24>>3]=g;return +g}function Wy(a,b,c){a=a|0;b=b|0;c=+c;var d=0.0,e=0.0;e=+h[b+16>>3];d=+h[a+16>>3];c=(+h[a+32>>3]*e+ +h[b+32>>3]*d)/(e*(c*2.0*d));c=c<1.0?1.0:c;a=a+40|0;if(c>+h[a>>3])h[a>>3]=c;a=b+40|0;if(c>+h[a>>3])h[a>>3]=c;return}function Xy(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0.0,g=0.0,i=0.0,j=0,k=0.0,l=0.0,m=0,n=0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0.0,y=0,z=0,A=0,B=0,C=0.0,D=0.0;y=b+8|0;x=+h[y>>3];z=b+24|0;l=+h[z>>3];A=b+32|0;k=+h[A>>3];f=+h[a+40>>3]*+h[a+16>>3];u=(d|0)==1;v=a+48|0;w=a+8|0;g=+h[a+32>>3];if(u){i=g/6.283185307179586;i=f>i?f:i;f=i*6.283185307179586-g;if(f>0.0){e=f/+(c[v>>2]|0)+e;g=0.0;f=i}else{g=0.0;f=i}}else g=+h[w>>3]-g/(f*2.0);s=f+ +h[a+24>>3];t=s>x;p=e/f;q=((c[v>>2]|0)+1|0)/2|0;r=p*.5;m=b+40|0;i=k;e=l;n=0;o=0.0;while(1){m=c[m>>2]|0;if(!m)break;j=c[m>>2]|0;if(!j)j=0;else j=c[(c[(c[j+16>>2]|0)+112>>2]|0)+8>>2]|0;if((j|0)==(c[a>>2]|0)?(gz(c[m+32>>2]|0)|0)>=1:0){k=+h[m+16>>3]/f;l=r+k;do if(!u)if((c[v>>2]|0)==1){g=+h[w>>3];break}else{g=g+l;break}else{if(g!=0.0)g=(c[v>>2]|0)==2?3.141592653589793:g+k;i=g;e=e<0.0?g:e}while(0);D=f*+I(+g);C=f*+J(+g);Yy(m,D,C,+Zy(m,D,C,g));g=(u?p+k:l)+g;n=n+1|0;j=n;k=(n|0)==(q|0)?g:o}else{j=n;k=o}m=m+4|0;n=j;o=k}f=t?s:x;if((d|0)>1?(B=c[a>>2]|0,(B|0)==(c[b+44>>2]|0)):0)h[(c[(c[B+16>>2]|0)+112>>2]|0)+24>>3]=o;h[y>>3]=f;h[z>>3]=e;h[A>>3]=i;return}function Yy(a,b,d,e){a=a|0;b=+b;d=+d;e=+e;var f=0,g=0.0,i=0.0,j=0.0,k=0,l=0,m=0,n=0,o=0.0,p=0.0;m=c[a+8>>2]|0;n=e!=0.0;f=gC(m)|0;while(1){if(!f)break;k=c[(c[f+16>>2]|0)+132>>2]|0;l=k+8|0;i=+h[k>>3];g=+h[l>>3];if(n){p=+I(+e);o=+J(+e);j=i*p-g*o;g=g*p+i*o}else j=i;h[k>>3]=j+b;h[l>>3]=g+d;f=hC(m,f)|0}f=a+36|0;while(1){f=c[f>>2]|0;if(!f)break;Yy(f,b,d,e);f=f+4|0}return}function Zy(a,b,d,e){a=a|0;b=+b;d=+d;e=+e;var f=0.0,g=0,i=0.0,j=0.0,k=0.0,l=0,m=0,n=0,o=0,p=0;n=c[a+8>>2]|0;f=+h[a+48>>3];do if(!(f>=0.0)){if((gz(c[a+32>>2]|0)|0)==2){f=e+-1.5707963267948966;break}m=c[a>>2]|0;o=m+16|0;l=c[(c[o>>2]|0)+132>>2]|0;k=+h[l>>3]+b;f=+h[l+8>>3]+d;f=k*k+f*f;l=gC(n)|0;g=m;while(1){if(!l)break;if((l|0)!=(m|0)?(p=c[(c[l+16>>2]|0)+132>>2]|0,k=+h[p>>3]+b,i=+h[p+8>>3]+d,i=k*k+i*i,i>3];k=+h[a+16>>3]-j;g=c[o>>2]|0;p=c[g+132>>2]|0;f=+h[p>>3];i=+h[p+8>>3];if(f>-k?(c[a+56>>2]&1|0)!=0:0){i=+O(+i,+(k+f));f=+I(+i);f=1.5707963267948966-i-+M(+(f*((k-j/f)/+G(+(b*b+d*d)))))+e;break}else{f=3.141592653589793-+O(+i,+f);f=f-+h[(c[g+112>>2]|0)+24>>3]+e;f=f>6.283185307179586?f+-6.283185307179586:f;break}}else f=0.0}else{f=3.141592653589793-f+e;f=f<0.0?f+6.283185307179586:f}while(0);return +f}function _y(){return HK(12)|0}function $y(a){a=a|0;var b=0,d=0;if(a|0){b=c[a>>2]|0;while(1){if(!b)break;d=c[b+4>>2]|0;l6(b);b=d}l6(a)}return}function az(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=bz(d)|0;h=a+8|0;c[h>>2]=(c[h>>2]|0)+1;h=a+4|0;i=c[h>>2]|0;d=(b|0)==0?i:b;b=d+4|0;e=g+4|0;f=g+8|0;if((d|0)==(i|0)){c[(i|0?b:a)>>2]=g;c[f>>2]=i;c[e>>2]=0;c[h>>2]=g}else{a=c[b>>2]|0;c[b>>2]=g;c[f>>2]=d;c[a+8>>2]=g;c[e>>2]=a}return}function bz(a){a=a|0;var b=0;b=HK(12)|0;c[b>>2]=a;return b|0}function cz(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;d=c[a>>2]|0;b=d;while(1){if(!b)break;g=b+4|0;e=c[g>>2]|0;f=b+8|0;c[g>>2]=c[f>>2];c[f>>2]=e;b=e}f=a+4|0;g=c[f>>2]|0;c[f>>2]=d;c[a>>2]=g;return a|0}function dz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=c[a>>2]|0;if((d|0)!=(b|0)){f=b+8|0;e=c[f>>2]|0;c[a>>2]=b;c[f>>2]=0;b=a+4|0;a=c[b>>2]|0;c[a+4>>2]=d;c[d+8>>2]=a;c[b>>2]=e;c[e+4>>2]=0}return}function ez(a){a=a|0;var b=0,d=0,e=0;d=_y()|0;e=d+4|0;b=0;while(1){a=c[a>>2]|0;if(!a)break;az(d,b,c[a>>2]|0);b=c[e>>2]|0;a=a+4|0}return d|0}function fz(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;m=c[a>>2]|0;while(1){if(!m){k=4;break}l=m+4|0;f=c[l>>2]|0;if((c[m>>2]|0)==(b|0))break;else m=f}if((k|0)==4)Aa(96571,96578,217,96589);h=a+4|0;j=m+8|0;i=c[j>>2]|0;c[(i|0?i+4|0:a)>>2]=f;c[(f|0?f+8|0:h)>>2]=i;i=c[a>>2]|0;f=0;g=i;while(1){if(!g)break;b=g+4|0;if((c[g>>2]|0)==(d|0)){k=8;break}f=g;g=c[b>>2]|0}if((k|0)==8){do if(!e){b=g+8|0;if((g|0)==(i|0)){c[a>>2]=m;c[l>>2]=i;c[j>>2]=0;break}else{c[f+4>>2]=m;c[j>>2]=f;c[l>>2]=g;break}}else if((g|0)==(c[h>>2]|0)){c[h>>2]=m;c[l>>2]=0;c[j>>2]=g;break}else{c[j>>2]=g;c[l>>2]=c[b>>2];c[(c[b>>2]|0)+8>>2]=m;break}while(0);c[b>>2]=m}return}function gz(a){a=a|0;return c[a+8>>2]|0}function hz(a,b){a=a|0;b=b|0;iz(a,cz(b)|0);l6(b);return}function iz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=c[b>>2]|0;if(d|0){e=a+4|0;f=c[e>>2]|0;c[f+4>>2]=d;c[d+8>>2]=f;c[e>>2]=c[b+4>>2];d=a+8|0;c[d>>2]=(c[d>>2]|0)+(c[b+8>>2]|0)}return}function jz(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0.0,g=0.0,i=0.0,j=0.0,k=0,l=0,m=0,n=0,o=0.0,p=0;m=c[b+8>>2]|0;kz(a,b);l=lz(m)|0;a=nz(mz(l)|0)|0;oz(m,a);m=pz(a,m)|0;a=gz(m)|0;j=+qz(m);k=(a|0)==1;f=+(a|0);i=f*(j+d)/6.283185307179586;g=k?0.0:i;a=m;while(1){a=c[a>>2]|0;if(!a)break;if(c[(c[(c[(c[a>>2]|0)+16>>2]|0)+112>>2]|0)+4>>2]&8|0){e=4;break}a=a+4|0}if((e|0)==4)dz(m,a);d=6.283185307179586/f;e=0;a=m;while(1){a=c[a>>2]|0;if(!a)break;n=c[(c[a>>2]|0)+16>>2]|0;p=c[n+112>>2]|0;c[p+16>>2]=e;h[p+24>>3]=0.0;f=d*+(e|0);o=g*+I(+f);n=c[n+132>>2]|0;h[n>>3]=o;h[n+8>>3]=g*+J(+f);e=e+1|0;a=a+4|0}o=k?j*.5:i;h[b+16>>3]=o;h[b+24>>3]=o;h[b+48>>3]=-1.0;pB(l)|0;return m|0}function kz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=c[b+8>>2]|0;d=gC(f)|0;while(1){if(!d)break;e=UA(a,d)|0;while(1){if(!e)break;if((c[(c[(c[(c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0)+16>>2]|0)+112>>2]|0)+12>>2]|0)==(b|0))jB(f,e,1)|0;e=WA(a,e)|0}d=hC(f,d)|0}return}function lz(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;g=k;f=wz(a,g)|0;g=c[g>>2]|0;i=qB(g)|0;h=xz(g)|0;i=i+-3|0;e=0;while(1){if((e|0)>=(i|0))break;j=Gz(h)|0;d=ZA(g,j)|0;while(1){if(!d)break;b=c[d>>2]&3;a=c[((b|0)==2?d:d+-48|0)+40>>2]|0;if((j|0)==(a|0))a=c[((b|0)==3?d:d+48|0)+40>>2]|0;Fz(h,a);d=_A(g,d,j)|0}yz(g,j,f);d=ZA(g,j)|0;while(1){if(!d)break;b=c[d>>2]&3;a=c[((b|0)==2?d:d+-48|0)+40>>2]|0;if((j|0)==(a|0))a=c[((b|0)==3?d:d+48|0)+40>>2]|0;b=(c[a+16>>2]|0)+236|0;c[b>>2]=(c[b>>2]|0)+-1;Ez(h,a);d=_A(g,d,j)|0}tC(g,j)|0;e=e+1|0}pB(g)|0;Dz(h);l=k;return f|0}function mz(a){a=a|0;var b=0,d=0,e=0,f=0;f=l;l=l+144|0;b=f;e=f+8|0;d=c[46975]|0;c[46975]=d+1;c[b>>2]=d;i2(e,96604,b)|0;e=LD(a,e,1)|0;RC(e,137786,280,1)|0;b=gC(a)|0;while(1){if(!b)break;lC(e,b,1)|0;d=c[(c[b+16>>2]|0)+112>>2]|0;c[d+16+12>>2]=0;c[d+32>>2]=0;d=d+4|0;c[d>>2]=c[d>>2]&-2;b=hC(a,b)|0}b=gC(a)|0;while(1){if(!b)break;d=c[(c[b+16>>2]|0)+112>>2]|0;if(!(c[d+4>>2]&1)){c[d+16>>2]=0;vz(a,b,e)}b=hC(a,b)|0}l=f;return e|0}function nz(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;if((qB(a)|0)!=1){d=gC(a)|0;while(1){if(!d)break;b=0;e=ZA(a,d)|0;while(1){if(!e)break;b=b+1|0;e=_A(a,e,d)|0}if((b|0)==1)uz(d,d,0,0);d=hC(a,d)|0}b=0;f=0;d=gC(a)|0;while(1){if(!d)break;g=c[(c[d+16>>2]|0)+112>>2]|0;g=(c[g+32>>2]|0)+(c[g+16+12>>2]|0)|0;e=(g|0)>(b|0);b=e?g:b;f=e?d:f;d=hC(a,d)|0}b=_y()|0;e=f+16|0;d=(c[(c[e>>2]|0)+112>>2]|0)+16+4|0;while(1){d=c[d>>2]|0;if((d|0)==(f|0))break;az(b,0,d);d=c[(c[d+16>>2]|0)+112>>2]|0;g=d+4|0;c[g>>2]=c[g>>2]|16;d=d+16|0}az(b,0,f);g=c[(c[e>>2]|0)+112>>2]|0;a=g+4|0;c[a>>2]=c[a>>2]|16;if(c[g+32>>2]|0){a=_y()|0;d=(c[(c[e>>2]|0)+112>>2]|0)+24|0;while(1){d=c[d>>2]|0;if((d|0)==(f|0))break;az(a,0,d);d=c[(c[d+16>>2]|0)+112>>2]|0;g=d+4|0;c[g>>2]=c[g>>2]|16;d=d+16|0}hz(b,a)}}else{b=_y()|0;g=gC(a)|0;az(b,0,g);g=(c[(c[g+16>>2]|0)+112>>2]|0)+4|0;c[g>>2]=c[g>>2]|16}return b|0}function oz(a,b){a=a|0;b=b|0;var d=0;d=gC(a)|0;while(1){if(!d)break;if(!(c[(c[(c[d+16>>2]|0)+112>>2]|0)+4>>2]&16))tz(a,d,b);d=hC(a,d)|0}return}function pz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;g=l;l=l+16|0;f=g;d=rz(a,b)|0;c[f>>2]=d;a:do if(d){e=0;while(1){if((e|0)>=10)break a;a=sz(a,b,f)|0;h=d;d=c[f>>2]|0;if((h|0)==(d|0)|(d|0)==0)break;else e=e+1|0}}while(0);l=g;return a|0}function qz(a){a=a|0;var b=0.0,d=0.0,e=0.0,f=0;b=0.0;while(1){a=c[a>>2]|0;if(!a)break;f=c[(c[c[(c[(c[a>>2]|0)+16>>2]|0)+112>>2]>>2]|0)+16>>2]|0;d=+h[f+32>>3];d=d>b?d:b;e=+h[f+40>>3];b=e>d?e:d;a=a+4|0}return +b}function rz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;k=Hz()|0;e=gC(b)|0;while(1){if(!e)break;d=UA(b,e)|0;while(1){if(!d)break;c[c[(c[d+16>>2]|0)+120>>2]>>2]=0;d=WA(b,d)|0}e=hC(b,e)|0}j=1;d=0;while(1){h=c[a>>2]|0;if(!h)break;i=c[h>>2]|0;g=ZA(b,i)|0;while(1){if(!g)break;f=g+16|0;if((c[c[(c[f>>2]|0)+120>>2]>>2]|0)>0){a=eb[c[k>>2]&63](k,0,128)|0;while(1){if(!a)break;e=c[a+8>>2]|0;if((c[c[(c[e+16>>2]|0)+120>>2]>>2]|0)>(c[c[(c[f>>2]|0)+120>>2]>>2]|0)?(l=c[e>>2]&3,(c[((l|0)==2?e:e+-48|0)+40>>2]|0)!=(i|0)):0)d=((c[((l|0)==3?e:e+48|0)+40>>2]|0)!=(i|0)&1)+d|0;a=eb[c[k>>2]&63](k,a,8)|0}Nz(k,g)}g=_A(b,g,i)|0}e=ZA(b,i)|0;while(1){if(!e)break;a=c[(c[e+16>>2]|0)+120>>2]|0;if(!(c[a>>2]|0)){c[a>>2]=j;Mz(k,e)}e=_A(b,e,i)|0}a=h+4|0;j=j+1|0}Lz(k);return d|0}function sz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=c[d>>2]|0;k=gC(b)|0;a:while(1){if(!k)break;j=ZA(b,k)|0;while(1){if(!j)break;g=c[j>>2]&3;f=c[((g|0)==3?j:j+48|0)+40>>2]|0;if((f|0)==(k|0))f=c[((g|0)==2?j:j+-48|0)+40>>2]|0;i=0;while(1){if((i|0)>=2)break;h=ez(a)|0;fz(a,k,f,i);g=rz(a,b)|0;if((g|0)<(e|0)){$y(h);if(!g){e=0;break a}else e=g}else{$y(a);a=h}i=i+1|0}j=_A(b,j,k)|0}k=hC(b,k)|0}c[d>>2]=e;return a|0}function tz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=_y()|0;e=UA(a,b)|0;while(1){if(!e)break;h=e+-48|0;az(j,0,c[((c[e>>2]&3|0)==2?e:h)+40>>2]|0);h=(c[(c[(c[((c[e>>2]&3|0)==2?e:h)+40>>2]|0)+16>>2]|0)+112>>2]|0)+4|0;c[h>>2]=c[h>>2]|32;e=WA(a,e)|0}e=XA(a,b)|0;while(1){if(!e)break;h=e+48|0;az(j,0,c[((c[e>>2]&3|0)==3?e:h)+40>>2]|0);h=(c[(c[(c[((c[e>>2]&3|0)==3?e:h)+40>>2]|0)+16>>2]|0)+112>>2]|0)+4|0;c[h>>2]=c[h>>2]|32;e=YA(a,e)|0}a:do if((gz(j)|0)>1){f=c[d>>2]|0;g=d+4|0;a=f;while(1){if(!a){i=16;break a}h=a+4|0;if((a|0)==(c[g>>2]|0))e=f;else e=c[h>>2]|0;if(c[(c[(c[(c[a>>2]|0)+16>>2]|0)+112>>2]|0)+4>>2]&32|0?c[(c[(c[(c[e>>2]|0)+16>>2]|0)+112>>2]|0)+4>>2]&32|0:0)break;a=c[h>>2]|0}az(d,a,b)}else i=16;while(0);b:do if((i|0)==16){c:do if((gz(j)|0)>0){e=d;while(1){e=c[e>>2]|0;if(!e)break c;if(c[(c[(c[(c[e>>2]|0)+16>>2]|0)+112>>2]|0)+4>>2]&32|0)break;e=e+4|0}az(d,e,b);break b}while(0);az(d,0,b)}while(0);e=j;while(1){e=c[e>>2]|0;if(!e)break;d=(c[(c[(c[e>>2]|0)+16>>2]|0)+112>>2]|0)+4|0;c[d>>2]=c[d>>2]&-33;e=e+4|0}$y(j);return}function uz(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;f=e;e=c[(c[b+16>>2]|0)+112>>2]|0;while(1){e=c[e+16>>2]|0;if(!e)break;k=d+1|0;e=c[(c[e+16>>2]|0)+112>>2]|0;h=e+16|0;g=h+12|0;b=c[g>>2]|0;h=h+4|0;if(b){i=e+24|0;j=e+32|0;if((b|0)>(d|0)){l=10;break}d=c[h>>2]|0;if((d|0)!=(f|0)){if(!((c[j>>2]|0)!=0?(c[i>>2]|0)==(f|0):0))f=d;c[i>>2]=d;c[j>>2]=b}}c[h>>2]=a;c[g>>2]=k;d=k}if((l|0)==10?(c[j>>2]|0)<=(d|0):0){c[i>>2]=a;c[j>>2]=k}return}function vz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=(c[(c[b+16>>2]|0)+112>>2]|0)+4|0;c[g>>2]=c[g>>2]|1;g=ZA(a,b)|0;while(1){if(!g)break;f=c[g>>2]&3;e=c[((f|0)==2?g:g+-48|0)+40>>2]|0;if((e|0)==(b|0))e=c[((f|0)==3?g:g+48|0)+40>>2]|0;f=e+16|0;if(!(c[(c[(c[f>>2]|0)+112>>2]|0)+4>>2]&1)){jB(d,g,1)|0;c[(c[(c[f>>2]|0)+112>>2]|0)+16>>2]=b;vz(a,e,d)}g=_A(a,g,b)|0}return}function wz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;j=l;l=l+144|0;i=j+8|0;h=j;d=j+16|0;g=c[46976]|0;c[46976]=g+1;c[h>>2]=g;i2(d,96613,h)|0;h=LD(a,d,1)|0;RC(h,137786,280,1)|0;g=c[46976]|0;c[46976]=g+1;c[i>>2]=g;i2(d,96613,i)|0;c[i>>2]=c[a+24>>2];i=lB(d,i,0)|0;d=gC(a)|0;while(1){if(!d)break;lC(h,d,1)|0;g=qC(i,HB(d)|0,1)|0;RC(g,137750,304,1)|0;c[(c[(c[d+16>>2]|0)+112>>2]|0)+16>>2]=g;d=hC(a,d)|0}e=gC(a)|0;while(1){if(!e)break;f=c[(c[(c[e+16>>2]|0)+112>>2]|0)+16>>2]|0;g=f+16|0;d=UA(a,e)|0;while(1){if(!d)break;jB(h,d,1)|0;k=c[(c[(c[(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)+16>>2]|0)+112>>2]|0)+16>>2]|0;m=fB(i,f,k,0,1)|0;RC(m,137763,176,1)|0;c[(c[m+16>>2]|0)+116>>2]=d;m=(c[g>>2]|0)+236|0;c[m>>2]=(c[m>>2]|0)+1;k=(c[k+16>>2]|0)+236|0;c[k>>2]=(c[k>>2]|0)+1;d=WA(a,d)|0}e=hC(a,e)|0}c[b>>2]=i;l=j;return h|0}function xz(a){a=a|0;var b=0,c=0;c=zz()|0;b=gC(a)|0;while(1){if(!b)break;Ez(c,b);b=hC(a,b)|0}return c|0}function yz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;m=c[(c[b+16>>2]|0)+236>>2]|0;p=m<<2;o=IK(p)|0;p=IK(p)|0;i=0;l=ZA(a,b)|0;n=0;f=0;while(1){if(!l)break;e=c[l>>2]&3;g=c[((e|0)==2?l:l+-48|0)+40>>2]|0;if((g|0)==(b|0))g=c[((e|0)==3?l:l+48|0)+40>>2]|0;h=0;k=ZA(a,b)|0;j=i;while(1){if(!k)break;if((k|0)!=(l|0)){i=c[k>>2]&3;e=c[((i|0)==2?k:k+-48|0)+40>>2]|0;if((e|0)==(b|0))e=c[((i|0)==3?k:k+48|0)+40>>2]|0;i=fB(a,g,e,0,0)|0;if(i)if(g>>>0>>0){e=j+1|0;h=i+16|0;i=c[(c[h>>2]|0)+116>>2]|0;if(!i)h=1;else{tC(d,i)|0;c[(c[h>>2]|0)+116>>2]=0;h=1}}else{h=1;e=j}else e=j}else e=j;k=_A(a,k,b)|0;j=e}if(!h){c[p+(n<<2)>>2]=g;e=n+1|0}else{c[o+(f<<2)>>2]=g;e=n;f=f+1|0}i=j;l=_A(a,l,b)|0;n=e}e=m+-1-i|0;a:do if((e|0)>0){if((e|0)<(n|0))g=0;else{if((e|0)!=(n|0))break;f=c[o>>2]|0;g=f+16|0;e=0;while(1){if((e|0)>=(n|0))break a;m=c[p+(e<<2)>>2]|0;RC(fB(a,f,m,0,1)|0,137763,176,1)|0;d=(c[g>>2]|0)+236|0;c[d>>2]=(c[d>>2]|0)+1;m=(c[m+16>>2]|0)+236|0;c[m>>2]=(c[m>>2]|0)+1;e=e+1|0}}while(1){if((g|0)>=(n|0)){f=2;break}f=g|1;if((f|0)>=(n|0)){f=2;break}d=c[p+(g<<2)>>2]|0;m=c[p+(f<<2)>>2]|0;RC(fB(a,d,m,0,1)|0,137763,176,1)|0;d=(c[d+16>>2]|0)+236|0;c[d>>2]=(c[d>>2]|0)+1;m=(c[m+16>>2]|0)+236|0;c[m>>2]=(c[m>>2]|0)+1;g=g+2|0;e=e+-1|0}while(1){if((e|0)<=0)break a;m=c[p>>2]|0;n=c[p+(f<<2)>>2]|0;RC(fB(a,m,n,0,1)|0,137763,176,1)|0;m=(c[m+16>>2]|0)+236|0;c[m>>2]=(c[m>>2]|0)+1;n=(c[n+16>>2]|0)+236|0;c[n>>2]=(c[n>>2]|0)+1;f=f+1|0;e=e+-1|0}}while(0);l6(p);l6(o);return}function zz(){return Sz(18280,c[4591]|0)|0}function Az(a,b,d){a=a|0;b=b|0;d=d|0;d=IK(16)|0;c[d+12>>2]=0;c[d+8>>2]=c[b+8>>2];return d|0}function Bz(a,b,c){a=a|0;b=b|0;c=c|0;l6(b);return}function Cz(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;b=c[b>>2]|0;e=c[d>>2]|0;return ((b|0)<(e|0)?-1:(b|0)>(e|0)&1)|0}function Dz(a){a=a|0;Oz(a)|0;return}function Ez(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;f=d;e=b+16|0;c[f+8>>2]=c[(c[e>>2]|0)+236>>2];a=(eb[c[a>>2]&63](a,f,1)|0)+12|0;c[(c[e>>2]|0)+164>>2]=c[a>>2];c[a>>2]=b;l=d;return}function Fz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;h=l;l=l+16|0;f=h;e=b+16|0;c[f+8>>2]=c[(c[e>>2]|0)+236>>2];f=eb[c[a>>2]&63](a,f,4)|0;if(!f)Aa(96623,96626,107,96636);d=f+12|0;g=c[d>>2]|0;if((g|0)==(b|0)){b=c[(c[e>>2]|0)+164>>2]|0;c[d>>2]=b;if(!b)eb[c[a>>2]&63](a,f,2)|0}else{f=g;d=g+16|0;while(1){a=c[(c[d>>2]|0)+164>>2]|0;e=(a|0)!=0;d=a+16|0;if(!(e&(a|0)!=(b|0)))break;else f=a}if(e)c[(c[f+16>>2]|0)+164>>2]=c[(c[d>>2]|0)+164>>2]}l=h;return}function Gz(a){a=a|0;var b=0,d=0,e=0,f=0;d=eb[c[a>>2]&63](a,0,128)|0;if(d){f=d+12|0;b=c[f>>2]|0;e=c[(c[b+16>>2]|0)+164>>2]|0;c[f>>2]=e;if(!e)eb[c[a>>2]&63](a,d,2)|0}else b=0;return b|0}function Hz(){return Sz(18316,c[4591]|0)|0}function Iz(a,b,d){a=a|0;b=b|0;d=d|0;d=IK(12)|0;c[d+8>>2]=c[b+8>>2];return d|0}function Jz(a,b,c){a=a|0;b=b|0;c=c|0;l6(b);return}function Kz(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;b=c[b>>2]|0;e=c[d>>2]|0;return (b>>>0>e>>>0?1:(b>>>0>>0)<<31>>31)|0}function Lz(a){a=a|0;Oz(a)|0;return}function Mz(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e+8>>2]=b;eb[c[a>>2]&63](a,e,1)|0;l=d;return}function Nz(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e+8>>2]=b;eb[c[a>>2]&63](a,e,2)|0;l=d;return}function Oz(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;do if((a|0)!=0?(c[a+24>>2]|0)<=0:0){h=c[a+4>>2]|0;g=h+32|0;b=c[g>>2]|0;if(b){b=tb[b&127](a,2,0,h)|0;if((b|0)<0){b=-1;break}}else b=0;if(c[a+28>>2]|0)Xz(a,0)|0;e=(b|0)==0;f=a+12|0;if(e){eb[c[c[a+16>>2]>>2]&63](a,0,64)|0;if((Uz(a)|0)>0){b=-1;break}d=a+8|0;b=c[d>>2]|0;if((c[b+12>>2]|0)>0){tb[c[f>>2]&127](a,c[b+8>>2]|0,0,h)|0;b=c[d>>2]|0}tb[c[f>>2]&127](a,b,0,h)|0}b=c[a+20>>2]|0;if(b){if(e&(b|0)==1)tb[c[f>>2]&127](a,a,0,h)|0}else l6(a);b=c[g>>2]|0;if(!b)b=0;else{tb[b&127](a,6,0,h)|0;b=0}}else b=-1;while(0);return b|0}function Pz(a){a=a|0;var b=0,d=0,e=0;e=a+8|0;b=c[e>>2]|0;d=c[b>>2]|0;a:do if(!(d&12)){if(!(d&3)){d=b+8|0;a=c[d>>2]|0;c[d>>2]=0;break}a=Qz(a)|0;d=c[e>>2]|0;b=c[d+8>>2]|0;d=b+(c[d+12>>2]<<2)|0;while(1){if(b>>>0>=d>>>0)break a;c[b>>2]=0;b=b+4|0}}else a=c[b+4>>2]|0;while(0);e=c[e>>2]|0;c[e>>2]=c[e>>2]&-4097;c[e+16>>2]=0;c[e+4>>2]=0;return a|0}function Qz(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=a+8|0;b=c[g>>2]|0;d=c[b>>2]|0;e=b+4|0;if(!(d&4096)){a=b+8|0;a:do if(!(d&3)){if(d&112|0){a=c[a>>2]|0;break}a=c[e>>2]|0;if(!a)a=0;else{while(1){b=a+4|0;d=c[b>>2]|0;if(!d){e=a;break}c[b>>2]=c[d>>2];c[d>>2]=a;a=d}while(1){b=c[e>>2]|0;if(!b)break a;d=c[b+4>>2]|0;if(!d){e=b;continue}while(1){c[b+4>>2]=c[d>>2];c[d>>2]=b;b=c[d+4>>2]|0;if(!b)break;else{f=d;d=b;b=f}}c[e>>2]=d;e=d}}}else{e=c[a>>2]|0;f=e+(c[b+12>>2]<<2)|0;b=0;a=0;while(1){if(e>>>0>=f>>>0)break a;d=c[e>>2]|0;if(d){if(!b){b=d;a=d}else c[b>>2]=d;while(1){d=c[b>>2]|0;if(!d)break;else b=d}c[e>>2]=b}e=e+4|0}}while(0);g=c[g>>2]|0;c[g+4>>2]=a;c[g>>2]=c[g>>2]|4096}else a=c[e>>2]|0;return a|0}function Rz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;t=a+8|0;if(c[c[t>>2]>>2]&4096|0)Tz(a,0)|0;s=c[a+4>>2]|0;k=c[s>>2]|0;l=c[s+4>>2]|0;p=s+8|0;i=c[p>>2]|0;m=c[s+20>>2]|0;n=a+20|0;f=c[n>>2]&-32769;c[n>>2]=f;q=s+16|0;v=0-i|0;r=a+12|0;w=(i|0)<0;o=(d&4098|0)!=0;a:do if(!b){if(d&384|0){f=c[t>>2]|0;e=c[f+8>>2]|0;if(!e){e=0;break}if(d&256){e=c[e+4>>2]|0;c[f+4>>2]=e;if(!e){e=0;break}}else c[f+4>>2]=e;if(w){e=c[e+8>>2]|0;break}else{e=e+v|0;break}}if(o){e=c[t>>2]|0;if(c[e>>2]&144|0){e=0;break}e=c[e+8>>2]|0;if(!e){e=0;break}else{i=e;u=86;break}}if(!(d&64))e=0;else{b:do if((c[q>>2]|0)!=0|w){e=c[(c[t>>2]|0)+8>>2]|0;while(1){if(!e)break b;f=c[e>>2]|0;g=c[q>>2]|0;if(g|0){if(w)h=c[e+8>>2]|0;else h=e+v|0;rb[g&127](a,h,s)}if((c[p>>2]|0)>=0){e=f;continue}tb[c[r>>2]&127](a,e,0,s)|0;e=f}}while(0);e=c[t>>2]|0;c[e+4>>2]=0;c[e+8>>2]=0;c[(c[t>>2]|0)+16>>2]=0;e=0}}else{if(d&2049|0){g=s+12|0;e=c[g>>2]|0;h=(d&1|0)==0;if(!(h|(e|0)==0)){e=eb[e&63](a,b,s)|0;if(!e){e=0;break}else f=e}else f=b;do if((i|0)>-1)b=f+i|0;else{e=tb[c[r>>2]&127](a,0,12,s)|0;if(e|0){c[e+8>>2]=f;b=e;break}if(!(c[g>>2]|0)){e=0;break a}e=c[q>>2]|0;if(h|(e|0)==0){e=0;break a}rb[e&127](a,f,s);e=0;break a}while(0);e=c[t>>2]|0;f=c[e>>2]|0;g=(d&8192|0)!=0;i=b+4|0;h=e+8|0;do if(!(f&128)){if(!(f&16))if(!(f&32)){u=52;break}else{u=48;break}f=c[e+4>>2]|0;e=(f|0)!=0;if(g){if(!e){u=52;break}e=c[f>>2]|0;if(!e){u=52;break}c[b>>2]=e;c[e+4>>2]=b;c[i>>2]=f;c[f>>2]=b;break}else{if(!e){u=48;break}e=c[h>>2]|0;if((f|0)==(e|0)){u=49;break}d=f+4|0;s=c[d>>2]|0;c[i>>2]=s;c[s>>2]=b;c[b>>2]=f;c[d>>2]=b;break}}else if(g)u=52;else u=48;while(0);if((u|0)==48){e=c[h>>2]|0;u=49}else if((u|0)==52){e=c[h>>2]|0;if(!e){c[h>>2]=b;e=b}else{d=e+4|0;c[c[d>>2]>>2]=b;c[i>>2]=c[d>>2]}c[e+4>>2]=b;c[b>>2]=0}if((u|0)==49){c[b>>2]=e;if(!e)e=b;else c[i>>2]=c[e+4>>2];c[e+4>>2]=b;c[(c[t>>2]|0)+8>>2]=b}e=c[t>>2]|0;f=e+16|0;g=c[f>>2]|0;if((g|0)>-1)c[f>>2]=g+1;c[e+4>>2]=b;if(w){e=c[b+8>>2]|0;break}else{e=b+v|0;break}}do if(!(d&512)){h=c[t>>2]|0;e=c[h+4>>2]|0;if(e|0){if(w)g=c[e+8>>2]|0;else g=e+v|0;if((g|0)==(b|0))break}e=b+k|0;if((l|0)<0){b=c[e>>2]|0;j=1;u=70}else{b=e;j=0;u=70}}else{h=c[t>>2]|0;j=(l|0)<0;u=70}while(0);if((u|0)==70){g=(m|0)==0;i=(l|0)<1;e=h+8|0;do{e=c[e>>2]|0;if(!e){e=0;break a}if(w)f=c[e+8>>2]|0;else f=e+v|0;f=f+k|0;if(j)f=c[f>>2]|0;do if(g)if(i){f=f2(b,f)|0;break}else{f=g2(b,f,l)|0;break}else f=tb[m&127](a,b,f,s)|0;while(0)}while((f|0)!=0);f=c[n>>2]|0}c[n>>2]=f|32768;if(!o){f=c[t>>2]|0;do if(!(d&8)){if(!(d&16)){c[f+4>>2]=e;break}if((e|0)==(c[f+8>>2]|0)){c[f+4>>2]=0;e=0;break a}else{e=e+4|0;u=110;break}}else u=110;while(0);if((u|0)==110){e=c[e>>2]|0;c[f+4>>2]=e;if(!e){e=0;break}}if(w){e=c[e+8>>2]|0;break}else{e=e+v|0;break}}else{i=e;u=86}}while(0);if((u|0)==86){e=c[i>>2]|0;g=i+4|0;if(e){c[e+4>>2]=c[g>>2];e=c[i>>2]|0}f=(c[t>>2]|0)+8|0;u=c[f>>2]|0;h=u+4|0;if((i|0)==(u|0)){c[f>>2]=e;e=c[(c[t>>2]|0)+8>>2]|0;if(e|0)c[e+4>>2]=c[h>>2]}else{c[c[g>>2]>>2]=e;if((i|0)==(c[h>>2]|0))c[h>>2]=c[g>>2]}e=c[t>>2]|0;f=e+4|0;if((i|0)==(c[f>>2]|0))g=c[i>>2]|0;else g=0;c[f>>2]=g;u=e+16|0;c[u>>2]=(c[u>>2]|0)+-1;if(w)e=c[i+8>>2]|0;else e=i+v|0;f=c[q>>2]|0;if(!((d&2|0)==0|(f|0)==0))rb[f&127](a,e,s);if((c[p>>2]|0)<0)tb[c[r>>2]&127](a,i,0,s)|0}return e|0}function Sz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;h=k;a:do if((a|0)!=0&(b|0)!=0?(f=k6(40)|0,(f|0)!=0):0){c[f>>2]=0;c[f+16>>2]=0;c[f+4>>2]=0;_z(f,a,0)|0;d=f+20|0;j=a+32|0;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;d=c[j>>2]|0;g=b+4|0;do if(d){c[h>>2]=0;d=tb[d&127](f,1,h,a)|0;if((d|0)>=0)if(d){e=c[h>>2]|0;if(e|0)if(!(c[g>>2]&c[e>>2])){d=f;i=12;break}else{d=f;break}d=a+28|0;if(!(c[d>>2]|0)){d=f;i=12}else{l6(f);e=tb[c[d>>2]&127](0,0,40,a)|0;if(!e){d=0;break a}c[e>>2]=0;c[e+16>>2]=0;c[e+4>>2]=0;_z(e,a,0)|0;c[e+20>>2]=1;c[e+24>>2]=0;c[e+32>>2]=0;c[e+28>>2]=0;d=e;f=e;i=11}}else{d=f;i=11}else{d=f;i=12}}else{d=f;i=11}while(0);if((i|0)==11){e=tb[c[d+12>>2]&127](d,0,28,a)|0;c[h>>2]=e;if(!e){d=f;i=12}else{c[e>>2]=c[g>>2];h=e+4|0;c[h>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;c[h+12>>2]=0;c[h+16>>2]=0;c[h+20>>2]=0}}if((i|0)==12){l6(d);d=0;break}c[d+8>>2]=e;c[d>>2]=c[b>>2];c[d+16>>2]=b;e=c[j>>2]|0;if(e)tb[e&127](d,5,f,a)|0}else d=0;while(0);l=k;return d|0}function Tz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;i=c[c[a+16>>2]>>2]|0;j=a+8|0;f=c[j>>2]|0;g=c[f>>2]|0;d=f+4|0;e=f+16|0;if(!b)if(!(g&4096))b=-1;else{h=1;b=c[d>>2]|0;k=5}else if(!(c[e>>2]|0)){h=0;k=5}else b=-1;a:do if((k|0)==5){c[f>>2]=g&-4097;if(!(g&3)){if(!(g&12)){c[d>>2]=0;d=f+8|0}c[d>>2]=b;if(h){b=0;break}c[(c[j>>2]|0)+16>>2]=-1;b=0;break}c[d>>2]=0;if(!h){c[e>>2]=0;while(1){if(!b){b=0;break a}k=c[b>>2]|0;eb[i&63](a,b,32)|0;b=k}}e=c[f+8>>2]|0;f=e+(c[f+12>>2]<<2)|0;while(1){if(e>>>0>=f>>>0){b=0;break a}d=c[e>>2]|0;if(d){c[e>>2]=b;b=c[d>>2]|0;c[d>>2]=0}e=e+4|0}}while(0);return b|0}function Uz(a){a=a|0;var b=0,d=0,e=0;b=a+8|0;d=c[b>>2]|0;if(c[d>>2]&4096){Tz(a,0)|0;d=c[b>>2]|0}e=d+16|0;a=c[e>>2]|0;do if((a|0)<0){b=c[d>>2]|0;if(b&12|0){a=Vz(c[d+4>>2]|0)|0;c[e>>2]=a;break}if(b&112){a=0;b=d+8|0;while(1){b=c[b>>2]|0;if(!b)break;a=a+1|0}c[e>>2]=a}}while(0);return a|0}function Vz(a){a=a|0;var b=0;if(!a)return 0;else{b=Vz(c[a+4>>2]|0)|0;return b+1+(Vz(c[a>>2]|0)|0)|0}return 0}function Wz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;Q=l;l=l+128|0;F=Q+120|0;p=Q;P=a+8|0;e=c[P>>2]|0;if(c[e>>2]&4096){Tz(a,0)|0;e=c[P>>2]|0}M=c[a+4>>2]|0;J=c[M>>2]|0;K=c[M+4>>2]|0;y=M+8|0;v=c[y>>2]|0;L=c[M+20>>2]|0;t=a+20|0;c[t>>2]=c[t>>2]&-32769;h=c[e+4>>2]|0;B=a+12|0;A=M+16|0;N=0-v|0;O=(v|0)<0;j=(h|0)!=0;a:do if(!b)if((d&448|0)==0|j^1)e=0;else{if(!(d&64)){b:do if(!(d&256)){e=h;while(1){f=e+4|0;g=c[f>>2]|0;if(!g)break b;c[f>>2]=c[g>>2];c[g>>2]=e;e=g}}else{e=h;while(1){f=c[e>>2]|0;if(!f)break b;a=f+4|0;c[e>>2]=c[a>>2];c[a>>2]=e;e=f}}while(0);c[(c[P>>2]|0)+4>>2]=e;if(O){e=c[e+8>>2]|0;break}else{e=e+N|0;break}}if((c[A>>2]|0)!=0|O){e=h;do{h=e;while(1){e=h+4|0;f=c[e>>2]|0;if(!f)break;c[e>>2]=c[f>>2];c[f>>2]=h;h=f}e=c[h>>2]|0;f=c[A>>2]|0;if(f|0){if(O)g=c[h+8>>2]|0;else g=h+N|0;rb[f&127](a,g,M)}if((c[y>>2]|0)<0)tb[c[B>>2]&127](a,h,0,M)|0}while((e|0)!=0);e=c[P>>2]|0}c[e+16>>2]=0;c[e+4>>2]=0;e=0}else{D=a+16|0;G=(K|0)<0;E=F+4|0;u=(d&4098|0)!=0;H=(L|0)!=0;C=(d&2|0)!=0;I=(K|0)<1;i=b+J|0;c:do if((c[(c[D>>2]|0)+4>>2]|0)!=8|u^1)x=44;else{if(G)g=c[i>>2]|0;else g=i;f=eb[c[a>>2]&63](a,b,4)|0;while(1){if(!f){x=44;break c}e=f+J|0;if(G)e=c[e>>2]|0;do if(!H)if(I){e=f2(g,e)|0;break}else{e=g2(g,e,K)|0;break}else e=tb[L&127](a,g,e,M)|0;while(0);if(e|0){x=44;break c}if((f|0)==(b|0))break;f=eb[c[a>>2]&63](a,f,8)|0}h=c[(c[P>>2]|0)+4>>2]|0;c[F>>2]=c[h+4>>2];c[E>>2]=c[h>>2];e=F;x=174}while(0);d:do if((x|0)==44){z=(d&516|0)!=0;s=(d&32|0)!=0;do if(!(d&2565)){if(s){if(O)g=c[b+8>>2]|0;else g=b+N|0;e=g+J|0;if(G)e=c[e>>2]|0;if(j){r=b;q=e;m=b;x=62;break}else{e=b;o=F;n=F;h=0;m=b;break}}if(j){if(O)e=c[h+8>>2]|0;else e=h+N|0;if((e|0)!=(b|0))if(G){g=b;r=0;q=c[i>>2]|0;m=0;x=62}else{g=b;r=0;q=i;m=0;x=62}else{g=b;e=0;o=F;n=F;m=0}}else{g=b;e=0;o=F;n=F;h=0;m=0}}else{e=(d&512|0)!=0;if(e|G^1)e=e?b:i;else e=c[i>>2]|0;if(j){g=b;r=0;q=e;m=0;x=62}else{g=b;e=0;o=F;n=F;h=0;m=0}}while(0);e:do if((x|0)==62){f:do if((c[(c[D>>2]|0)+4>>2]|0)==4?(o=c[(c[P>>2]|0)+24>>2]|0,!((o|0)==0|z^1)):0){i=0;j=h;while(1){if((i|0)>=(o|0)){f=F;n=F;k=0;break}b=j+8|0;e=j+N|0;if(O)f=c[b>>2]|0;else f=e;f=f+J|0;if(G)f=c[f>>2]|0;do if(!H)if(I){f=f2(q,f)|0;break}else{f=g2(q,f,K)|0;break}else f=tb[L&127](a,q,f,M)|0;while(0);if(!f){x=75;break}c[p+(i<<2)>>2]=f;j=c[((f|0)<0?j+4|0:j)>>2]|0;if(!j){e=0;break a}else i=i+1|0}if((x|0)==75){if(!O)break a;e=c[b>>2]|0;break a}while(1){if((k|0)>=(o|0)){e=h;break f}j=f+4|0;b=c[p+((k|1)<<2)>>2]|0;do if((c[p+(k<<2)>>2]|0)<0){e=h+4|0;i=c[e>>2]|0;if((b|0)<0){c[e>>2]=c[i>>2];c[i>>2]=h;c[j>>2]=i;f=i;h=n;e=i+4|0;break}else{c[n>>2]=i;c[j>>2]=h;f=h;h=i;e=i;break}}else{i=c[h>>2]|0;e=i+4|0;if((b|0)>0){c[h>>2]=c[e>>2];c[e>>2]=h;c[n>>2]=i;h=i;e=i;break}else{c[j>>2]=i;c[n>>2]=h;f=i;break}}while(0);n=h;k=k+2|0;h=c[e>>2]|0}}else{f=F;n=F;e=h}while(0);g:while(1){i=f;h=e;while(1){if(O)e=c[h+8>>2]|0;else e=h+N|0;e=e+J|0;if(G)e=c[e>>2]|0;do if(!H)if(I){e=f2(q,e)|0;break}else{e=g2(q,e,K)|0;break}else e=tb[L&127](a,q,e,M)|0;while(0);if(!e){e=r;o=i;break e}j=i+4|0;if((e|0)>=0)break;f=h+4|0;i=c[f>>2]|0;if(!i){x=115;break g}if(O)e=c[i+8>>2]|0;else e=i+N|0;e=e+J|0;if(G)e=c[e>>2]|0;do if(!H)if(I){e=f2(q,e)|0;break}else{e=g2(q,e,K)|0;break}else e=tb[L&127](a,q,e,M)|0;while(0);if((e|0)>=0){x=112;break}c[f>>2]=c[i>>2];c[i>>2]=h;c[j>>2]=i;h=c[i+4>>2]|0;if(!h){e=r;o=i;h=0;break e}}if((x|0)==112){x=0;if(!e){x=113;break}c[n>>2]=i;c[j>>2]=h;e=c[i>>2]|0;if(!e){e=r;o=h;n=i;h=0;break e}else{f=h;n=i;continue}}b=c[h>>2]|0;if(!b){x=133;break}if(O)e=c[b+8>>2]|0;else e=b+N|0;e=e+J|0;if(G)e=c[e>>2]|0;do if(!H)if(I){e=f2(q,e)|0;break}else{e=g2(q,e,K)|0;break}else e=tb[L&127](a,q,e,M)|0;while(0);f=b+4|0;if((e|0)>0){c[h>>2]=c[f>>2];c[f>>2]=h;c[n>>2]=b;e=c[b>>2]|0;if(!e){e=r;o=i;n=b;h=0;break e}else{f=i;n=b;continue}}if(!e){x=131;break}c[j>>2]=b;c[n>>2]=h;e=c[f>>2]|0;if(!e){e=r;o=b;n=h;h=0;break e}else{f=b;n=h}}if((x|0)==113){c[j>>2]=h;e=r;o=h;h=i;break}else if((x|0)==115){c[j>>2]=h;e=r;o=h;h=0;break}else if((x|0)==131){c[n>>2]=h;e=r;o=i;n=h;h=b;break}else if((x|0)==133){c[n>>2]=h;e=r;o=i;n=h;h=0;break}}while(0);i=o+4|0;j=(d&8|0)!=0;b=(d&2049|0)!=0;k=(d&16|0)!=0;do if(!h){c[i>>2]=0;c[n>>2]=0;if(!j)if(!k){if(z){e=o;break d}if(b)x=199;else{if(!s){g=0;e=o;break d}C=(c[P>>2]|0)+16|0;c[C>>2]=(c[C>>2]|0)+1}}else x=169;else x=163}else{c[t>>2]=c[t>>2]|32768;f=h+4|0;c[n>>2]=c[f>>2];c[i>>2]=c[h>>2];if(!z){if(j){c[f>>2]=c[F>>2];c[h>>2]=0;c[F>>2]=h;x=163;break}if(k){c[h>>2]=c[E>>2];c[f>>2]=0;c[E>>2]=h;x=169;break}if(u){e=o;x=174;break d}if(b){if(c[(c[D>>2]|0)+4>>2]&4|0){e=h;break}c[f>>2]=0;c[h>>2]=c[E>>2];c[E>>2]=h;x=199;break}if(!s){e=0;break a}if(!(c[(c[D>>2]|0)+4>>2]&4)){c[e+4>>2]=0;c[e>>2]=c[E>>2];c[E>>2]=m;e=(c[P>>2]|0)+16|0;c[e>>2]=(c[e>>2]|0)+1;e=h;break}e=c[A>>2]|0;if(e|0)rb[e&127](a,g,M);if((c[y>>2]|0)<0){tb[c[B>>2]&127](a,m,0,M)|0;e=h}else e=h}else e=h}while(0);if((x|0)==163){e=c[E>>2]|0;if(!e){e=o;break}while(1){f=e+4|0;g=c[f>>2]|0;if(!g)break;c[f>>2]=c[g>>2];c[g>>2]=e;e=g}c[E>>2]=c[e>>2]}else if((x|0)==169){e=c[F>>2]|0;if(!e){e=o;break}while(1){f=c[e>>2]|0;if(!f)break;C=f+4|0;c[e>>2]=c[C>>2];c[C>>2]=e;e=f}c[F>>2]=c[e+4>>2]}else if((x|0)==199){i=M+12|0;e=c[i>>2]|0;f=(d&1|0)==0;if(!(f|(e|0)==0))g=eb[e&63](a,g,M)|0;do if(g){if((v|0)>-1){e=g+v|0;x=209;break}e=tb[c[B>>2]&127](a,0,12,M)|0;if(e|0){c[e+8>>2]=g;break}if((c[i>>2]|0)!=0?(w=c[A>>2]|0,!(f|(w|0)==0)):0){rb[w&127](a,g,M);x=209}else x=209}else{e=h;x=209}while(0);if((x|0)==209)if(!e){e=o;break}f=(c[P>>2]|0)+16|0;g=c[f>>2]|0;if((g|0)>-1)c[f>>2]=g+1}c[e+4>>2]=c[F>>2];c[e>>2]=c[E>>2];h:do if(!((c[(c[D>>2]|0)+4>>2]&8|0)==0|z^1)){if(O)f=c[e+8>>2]|0;else f=e+N|0;f=f+J|0;if(G)f=c[f>>2]|0;while(1){i=e+4|0;g=c[i>>2]|0;if(!g)break h;while(1){h=c[g>>2]|0;if(!h)break;F=h+4|0;c[g>>2]=c[F>>2];c[F>>2]=g;g=h}c[i>>2]=g;if(O)h=c[g+8>>2]|0;else h=g+N|0;h=h+J|0;if(G)h=c[h>>2]|0;do if(!H)if(I){h=f2(f,h)|0;break}else{h=g2(f,h,K)|0;break}else h=tb[L&127](a,f,h,M)|0;while(0);if(h|0)break h;c[i>>2]=c[g>>2];c[g>>2]=e;e=g}}while(0);c[(c[P>>2]|0)+4>>2]=e;if(O){e=c[e+8>>2]|0;break a}else{e=e+N|0;break a}}while(0);if((x|0)==174){if(O)g=c[h+8>>2]|0;else g=h+N|0;f=c[A>>2]|0;if(!((f|0)==0|C^1))rb[f&127](a,g,M);if((c[y>>2]|0)<0)tb[c[B>>2]&127](a,h,0,M)|0;O=(c[P>>2]|0)+16|0;N=c[O>>2]|0;c[O>>2]=(N|0)<1?-1:N+-1|0}do{f=e+4|0;e=c[f>>2]|0}while((e|0)!=0);c[f>>2]=c[F>>2];c[(c[P>>2]|0)+4>>2]=c[E>>2];e=C?g:0}while(0);l=Q;return e|0}function Xz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;if(c[c[a+8>>2]>>2]&4096|0)Tz(a,0)|0;f=(b|0)!=0;g=a+16|0;if(f){if(c[c[b+8>>2]>>2]&4096|0)Tz(b,0)|0;if((c[b+16>>2]|0)==(c[g>>2]|0)){d=b;e=7}else b=0}else{d=0;e=7}a:do if((e|0)==7){while(1){if(!d)break;if((d|0)==(a|0)){b=0;break a}d=c[d+28>>2]|0;e=7}d=a+28|0;e=c[d>>2]|0;if(e|0){h=e+24|0;c[h>>2]=(c[h>>2]|0)+-1}c[a+32>>2]=0;c[d>>2]=0;if(f){c[d>>2]=b;c[a>>2]=31;h=b+24|0;c[h>>2]=(c[h>>2]|0)+1;break}else{c[a>>2]=c[c[g>>2]>>2];b=e;break}}while(0);return b|0}function Yz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=a+16|0;a:do if(!(d&99)){p=a+32|0;if((d&516|0)==0?(e=(c[(c[f>>2]|0)+4>>2]&12|0)!=0,(d&384|0)==0|e):0){if(e){if(!(d&408)){e=0;break}n=(d&136|0)!=0;o=(d&272|0)!=0;m=0;f=0;e=0;while(1){if(!a)break;l=eb[c[c[a+16>>2]>>2]&63](a,b,d)|0;do if(!l)g=m;else{h=c[a+4>>2]|0;i=c[h+4>>2]|0;j=c[h+20>>2]|0;g=l+(c[h>>2]|0)|0;if((i|0)<0)k=c[g>>2]|0;else k=g;if(e|0){do if(!j)if((i|0)<1){g=f2(k,f)|0;break}else{g=g2(k,f,i)|0;break}else g=tb[j&127](a,k,f,h)|0;while(0);if(!(n&(g|0)<0|o&(g|0)>0)){g=m;break}}g=a;f=k;e=l}while(0);m=g;a=c[a+28>>2]|0}c[p>>2]=m;break}if(!(d&24)){e=0;break}f=c[p>>2]|0;if(f){e=c[(c[f+4>>2]|0)+8>>2]|0;g=c[(c[f+8>>2]|0)+4>>2]|0;if((e|0)<0)e=c[g+8>>2]|0;else e=g+(0-e)|0;if((e|0)==(b|0))e=b;else{f=a;h=32}}else{f=a;h=32}do if((h|0)==32){while(1){if(!f){h=33;break}e=eb[c[c[f+16>>2]>>2]&63](f,b,4)|0;if(e|0){h=36;break}f=c[f+28>>2]|0;h=32}if((h|0)==33){c[p>>2]=0;e=0;break a}else if((h|0)==36){c[p>>2]=f;break}}while(0);i=(d<<4&128^128)+128|0;e=eb[c[c[f+16>>2]>>2]&63](f,e,d)|0;while(1){h=f+16|0;while(1){if(!e)break;else g=a;while(1){if((g|0)==(f|0))break a;if(eb[c[c[g+16>>2]>>2]&63](g,e,4)|0)break;g=c[g+28>>2]|0}e=eb[c[c[h>>2]>>2]&63](f,e,d)|0}f=c[f+28>>2]|0;c[p>>2]=f;if(!f){e=0;break a}e=eb[c[c[f+16>>2]>>2]&63](f,0,i)|0}}while(1){if(!a){a=0;e=0;break}e=eb[c[c[a+16>>2]>>2]&63](a,b,d)|0;if(e|0)break;a=c[a+28>>2]|0}c[p>>2]=a}else e=eb[c[c[f>>2]>>2]&63](a,b,d)|0;while(0);return e|0}function Zz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=a+32|0;f=eb[c[a>>2]&63](a,0,128)|0;do{if(!f){e=0;break}h=c[g>>2]|0;e=f;f=eb[c[a>>2]&63](a,f,8)|0;e=eb[b&63]((h|0)==0?a:h,e,d)|0}while((e|0)>=0);return e|0}function _z(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=a+4|0;n=c[f>>2]|0;g=b+28|0;h=a+12|0;a:do if(n)if(b){m=c[c[a+16>>2]>>2]|0;i=a+8|0;if(c[c[i>>2]>>2]&4096|0)Tz(a,0)|0;e=c[n+32>>2]|0;if(e|0?(tb[e&127](a,3,b,n)|0)<0:0){b=0;break}c[f>>2]=b;e=c[g>>2]|0;c[h>>2]=(e|0)==0?52:e;e=c[c[i>>2]>>2]|0;if(!(e&112)){l=(d&2|0)!=0;do if(!(e&2))if(!(e&3))if(!(d&1))break;else{b=n;break a}else if((d&3|0)==3){b=n;break a}else break;else if(l){b=n;break a}while(0);g=Qz(a)|0;e=c[i>>2]|0;k=c[e>>2]|0;c[e>>2]=k&-4097;c[e+4>>2]=0;c[e+16>>2]=0;b:do if(k&3|0){k=c[e+8>>2]|0;f=k+(c[e+12>>2]<<2)|0;e=k;while(1){if(e>>>0>=f>>>0)break b;c[e>>2]=0;e=e+4|0}}while(0);i=b+8|0;j=b+4|0;k=b+24|0;while(1){if(!g){b=n;break a}d=c[g>>2]|0;if(!l){e=c[i>>2]|0;if((e|0)<0)e=c[g+8>>2]|0;else e=g+(0-e)|0;h=c[j>>2]|0;e=e+(c[b>>2]|0)|0;if((h|0)<0)e=c[e>>2]|0;f=c[k>>2]|0;if(!f)e=aA(0,e,h)|0;else e=eb[f&63](a,e,b)|0;c[g+4>>2]=e}eb[m&63](a,g,32)|0;g=d}}else b=n}else b=n;else{c[f>>2]=b;n=c[g>>2]|0;c[h>>2]=(n|0)==0?52:n}while(0);return b|0}function $z(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;a=(c|0)==0;do if(!b)if(a)a=0;else a=k6(c)|0;else if(a){l6(b);a=0;break}else{a=n6(b,c)|0;break}while(0);return a|0}function aA(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0;g=c;if((e|0)>=1){h=c+e+-1|0;g=(h>>>0>>0?c:h)+(1-g)&-2;f=c;while(1){if(f>>>0>=h>>>0)break;b=S(((d[f>>0]|0)<<8)+b+(d[f+1>>0]|0)|0,17109811)|0;f=f+2|0}f=c+g|0;if(f>>>0>h>>>0)c=e;else{c=e;b=S(((d[f>>0]|0)<<8)+b|0,17109811)|0}}else{while(1){f=a[c>>0]|0;if(!(f<<24>>24))break;h=a[c+1>>0]|0;e=S(((f&255)<<8)+b+(h&255)|0,17109811)|0;b=e;c=c+(h<<24>>24?2:1)|0}c=c-g|0}return S(b+c|0,17109811)|0}function bA(a){a=a|0;var b=0;b=c[46977]|0;c[46977]=a;return b|0}function cA(a){a=a|0;var b=0;b=c[46978]|0;c[46978]=a;return b|0}function dA(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=eA(a,b,f)|0;l=e;return d|0}function eA(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+16|0;f=h;e=(a|0)==3?c[46981]|0:(a|0)==2?1:a;c[46981]=e;g=c[46982]|0;c[46982]=g>>>0>e>>>0?g:e;g=(a|0)!=3;do if(e>>>0<(c[46978]|0)>>>0){a=c[46979]|0;if(!a){a=$5()|0;c[46979]=a;if(!a){a=1;break}}if(g){c[46980]=Y5(a)|0;a=c[46979]|0}l2(a,b,d)|0;a=0}else{if(c[46977]|0){fA(a,b,d);a=0;break}e=c[15715]|0;if(g){c[f>>2]=(a|0)==1?96650:96656;z4(e,96664,f)|0}l2(e,b,d)|0;a=0}while(0);l=h;return a|0}function fA(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;if((c[46983]|0)==0?(f=k6(c[4600]|0)|0,c[46983]=f,(f|0)==0):0)Z3(96669,c[15715]|0)|0;else e=4;do if((e|0)==4){if((a|0)!=3){pb[c[46977]&63]((a|0)==1?96650:96656)|0;pb[c[46977]&63](97328)|0}while(1){a=k2(c[46983]|0,c[4600]|0,b,d)|0;f=c[46983]|0;e=c[4600]|0;if((a|0)>-1&(a|0)<(e|0)){e=7;break}g=e<<1;e=a+1|0;e=(g|0)>(e|0)?g:e;c[4600]=e;if(!(n6(f,e)|0)){e=9;break}}if((e|0)==7){pb[c[46977]&63](f)|0;break}else if((e|0)==9){Z3(96669,c[15715]|0)|0;break}}while(0);return}function gA(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;eA(1,a,e)|0;l=d;return}function hA(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=b+12|0;if(!e){d=(d|0)==0?1024:d;c[f>>2]=1;e=k6(d)|0;c[b>>2]=e}else{c[b>>2]=e;c[f>>2]=0}c[b+8>>2]=e+d;c[b+4>>2]=e;a[e>>0]=0;return}function iA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=a+8|0;g=c[a>>2]|0;f=g;e=(c[h>>2]|0)-f|0;d=e<<1;e=e+b|0;d=e>>>0>d>>>0?e:d;e=a+4|0;f=(c[e>>2]|0)-f|0;b=a+12|0;if(!(c[b>>2]|0)){i=k6(d)|0;B6(i|0,g|0,f|0)|0;c[b>>2]=1;b=i}else b=n6(g,d)|0;c[a>>2]=b;c[e>>2]=b+f;c[h>>2]=b+d;return 0}function jA(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=a+4|0;e=c[f>>2]|0;if((e+d|0)>>>0>(c[a+8>>2]|0)>>>0){iA(a,d)|0;e=c[f>>2]|0}B6(e|0,b|0,d|0)|0;c[f>>2]=(c[f>>2]|0)+d;return d|0}function kA(a,b){a=a|0;b=b|0;return jA(a,b,D3(b)|0)|0}function lA(a){a=a|0;if(c[a+12>>2]|0)l6(c[a>>2]|0);return}function mA(a){a=a|0;var b=0,e=0;b=a+4|0;e=c[b>>2]|0;if(e>>>0>(c[a>>2]|0)>>>0){c[b>>2]=e+-1;a=d[e>>0]|0}else a=-1;return a|0}function nA(a,b,d){a=a|0;b=b|0;d=d|0;fD(c[46985]|0,c[b+8>>2]|0)|0;fD(c[46985]|0,c[b+12>>2]|0)|0;bC(c[46985]|0,b);return}function oA(a,b){a=a|0;b=b|0;var c=0;c=PC(a,96717,0)|0;if((b|0)!=0&(c|0)==0){pA(a);c=PC(a,96717,0)|0}return c|0}function pA(a){a=a|0;var b=0,c=0,d=0;d=vC(a)|0;zE(d,d,107,0,1)|0;c=gC(d)|0;while(1){if(!c)break;rA(a,c);b=UA(d,c)|0;while(1){if(!b)break;sA(a,b);b=WA(d,b)|0}c=hC(d,c)|0}return}function qA(b){b=b|0;var c=0;c=b+24|0;a[c>>0]=a[c>>0]|64;xA(b);c=OD(b)|0;uA((c|0)==0?b:c,b);return}function rA(a,b){a=a|0;b=b|0;var d=0;d=tA(b)|0;if(!((d|0)!=0?(c[d+8>>2]|0)!=0:0))uA(a,b);return}function sA(a,b){a=a|0;b=b|0;var d=0;d=tA(b)|0;if(!((d|0)!=0?(c[d+8>>2]|0)!=0:0))uA(a,b);return}function tA(a){a=a|0;return PC(a,c[4610]|0,0)|0}function uA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=RC(b,c[4610]|0,16,0)|0;f=vA(a,c[b>>2]&3)|0;e=d+8|0;a:do if(!(c[e>>2]|0)){a=vC(a)|0;c[e>>2]=vA(a,c[b>>2]&3)|0;a=wA(b)|0;d=d+12|0;c[d>>2]=aC(uC(b)|0,((a|0)>4?a:4)<<2)|0;a=eb[c[f>>2]&63](f,0,128)|0;while(1){if(!a)break a;e=uC(b)|0;e=dD(e,c[a+12>>2]|0)|0;c[(c[d>>2]|0)+(c[a+16>>2]<<2)>>2]=e;a=eb[c[f>>2]&63](f,a,8)|0}}while(0);return}function vA(a,b){a=a|0;b=b|0;var d=0,e=0;e=l;l=l+16|0;d=e;a=oA(a,0)|0;a:do if(!a)a=0;else switch(b|0){case 0:{a=c[a+16>>2]|0;break a}case 1:{a=c[a+8>>2]|0;break a}case 2:case 3:{a=c[a+12>>2]|0;break a}default:{c[d>>2]=b;dA(1,96730,d)|0;a=0;break a}}while(0);l=e;return a|0}function wA(a){a=a|0;var b=0;b=vC(uC(a)|0)|0;a=vA(b,c[a>>2]&3)|0;if(!a)a=0;else a=Uz(a)|0;return a|0}function xA(a){a=a|0;var b=0,d=0,e=0,f=0;d=RC(a,96717,20,0)|0;e=d+8|0;c[e>>2]=SD(a,18404,c[4599]|0)|0;f=d+12|0;c[f>>2]=SD(a,18404,c[4599]|0)|0;d=d+16|0;c[d>>2]=SD(a,18404,c[4599]|0)|0;b=OD(a)|0;if(!b){b=c[46984]|0;if(!((b|0)==0|(b|0)==(a|0))){b=oA(b,0)|0;yA(c[b+8>>2]|0,c[e>>2]|0,a,1);yA(c[b+12>>2]|0,c[f>>2]|0,a,2);yA(c[b+16>>2]|0,c[d>>2]|0,a,0)}}else{a=oA(b,0)|0;Xz(c[e>>2]|0,c[a+8>>2]|0)|0;Xz(c[f>>2]|0,c[a+12>>2]|0)|0;Xz(c[d>>2]|0,c[a+16>>2]|0)|0}return}function yA(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=eb[c[b>>2]&63](b,0,128)|0;while(1){if(!g)break;h=zA(e,c[g+8>>2]|0,c[g+12>>2]|0,c[g+16>>2]|0,f)|0;a[h+22>>0]=a[g+22>>0]|0;a[h+21>>0]=a[g+21>>0]|0;eb[c[d>>2]&63](d,h,1)|0;g=eb[c[b>>2]&63](b,g,8)|0}return}function zA(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=aC(b,24)|0;a[h+20>>0]=g;c[h+8>>2]=dD(b,d)|0;c[h+12>>2]=dD(b,e)|0;c[h+16>>2]=f;return h|0}function AA(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+32|0;e=d;c[e+8>>2]=b;b=eb[c[a>>2]&63](a,e,4)|0;l=d;return b|0}function BA(a,b){a=a|0;b=b|0;var c=0;c=Xz(a,0)|0;b=AA(a,b)|0;Xz(a,c)|0;return b|0}function CA(a,b){a=a|0;b=b|0;a=tA(a)|0;if(!a)a=0;else a=AA(c[a+8>>2]|0,b)|0;return a|0}function DA(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+16|0;f=g;if(!a){a=c[46984]|0;if(!a){c[f>>2]=c[4611];a=lB(0,f,0)|0;c[46984]=a}}if(!e)a=FA(a,b,d)|0;else a=EA(a,b,d,e)|0;l=g;return a|0}function EA(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=vC(a)|0;oA(a,1)|0;g=vA(a,b)|0;f=BA(g,d)|0;a:do if(!f){f=AA(g,d)|0;if(f|0){f=zA(a,d,e,c[f+16>>2]|0,b)|0;eb[c[g>>2]&63](g,f,1)|0;h=16;break}g=vA(i,b)|0;f=zA(a,d,e,Uz(g)|0,b)|0;eb[c[g>>2]&63](g,f,1)|0;switch(b|0){case 0:{zE(i,i,57,f,1)|0;h=16;break a}case 1:{d=gC(i)|0;while(1){if(!d){h=16;break a}GA(a,d,f);d=hC(i,d)|0}}case 2:case 3:{g=gC(i)|0;while(1){if(!g){h=16;break a}d=UA(i,g)|0;while(1){if(!d)break;GA(a,d,f);d=WA(i,d)|0}g=hC(i,g)|0}}default:break a}}else{h=f+12|0;fD(a,c[h>>2]|0)|0;c[h>>2]=dD(a,e)|0;h=16}while(0);if((h|0)==16)if((b|0)==0&(f|0)!=0)HA(a,f,e)|0;yC(a,a,f);return f|0}function FA(a,b,c){a=a|0;b=b|0;c=c|0;a=vA(a,b)|0;if(!a)a=0;else a=AA(a,c)|0;return a|0}function GA(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;b=tA(b)|0;f=d+16|0;e=c[f>>2]|0;if((e|0)>3){g=c[a+64>>2]|0;b=b+12|0;e=e<<2;c[b>>2]=tb[c[(c[g>>2]|0)+8>>2]&127](c[g+12>>2]|0,c[b>>2]|0,e,e+4|0)|0}else b=b+12|0;g=dD(a,c[d+12>>2]|0)|0;c[(c[b>>2]|0)+(c[f>>2]<<2)>>2]=g;return}function HA(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=uC(a)|0;g=(tA(a)|0)+12|0;i=b+16|0;fD(h,c[(c[g>>2]|0)+(c[i>>2]<<2)>>2]|0)|0;f=dD(h,d)|0;c[(c[g>>2]|0)+(c[i>>2]<<2)>>2]=f;do if(!(c[a>>2]&3)){e=c[(oA(h,0)|0)+16>>2]|0;f=b+8|0;g=BA(e,c[f>>2]|0)|0;if(!g){i=zA(h,c[f>>2]|0,d,c[i>>2]|0,c[a>>2]&3)|0;eb[c[e>>2]&63](e,i,1)|0;break}else{i=g+12|0;fD(h,c[i>>2]|0)|0;c[i>>2]=dD(h,d)|0;break}}while(0);yC(h,a,b);return 0}function IA(a,b,d){a=a|0;b=b|0;d=d|0;a=vA(a,b)|0;do if(a){b=c[a>>2]|0;if(!d){a=eb[b&63](a,0,128)|0;break}else{a=eb[b&63](a,d,8)|0;break}}else a=0;while(0);return a|0}function JA(a){a=a|0;var b=0;c[46985]=a;b=tA(a)|0;if(b|0){KA(a,b);TC(a,c[b>>2]|0)|0}b=oA(a,0)|0;if(b)if(((UD(a,c[b+8>>2]|0)|0)==0?(UD(a,c[b+12>>2]|0)|0)==0:0)?(UD(a,c[b+16>>2]|0)|0)==0:0){TC(a,c[b>>2]|0)|0;b=0}else b=1;else b=0;return b|0}function KA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=uC(a)|0;e=wA(a)|0;b=b+12|0;a=0;while(1){d=c[b>>2]|0;if((a|0)>=(e|0))break;fD(f,c[d+(a<<2)>>2]|0)|0;a=a+1|0}bC(f,d);return}function LA(a){a=a|0;var b=0;b=tA(a)|0;if(b|0){KA(a,b);TC(a,c[4610]|0)|0}return}function MA(a){a=a|0;var b=0;b=tA(a)|0;if(b|0){KA(a,b);TC(a,c[4610]|0)|0}return}function NA(a,b){a=a|0;b=b|0;b=CA(a,b)|0;if(!b)b=0;else{a=c[(tA(a)|0)+12>>2]|0;b=c[a+(c[b+16>>2]<<2)>>2]|0}return b|0}function OA(a,b){a=a|0;b=b|0;a=c[(tA(a)|0)+12>>2]|0;return c[a+(c[b+16>>2]<<2)>>2]|0}function PA(a,b,c){a=a|0;b=b|0;c=c|0;b=CA(a,b)|0;if(!b)b=-1;else{HA(a,b,c)|0;b=0}return b|0}function QA(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=uC(a)|0;f=DA(f,c[a>>2]&3,b,0)|0;if(!f){f=uC(a)|0;f=DA(f,c[a>>2]&3,b,e)|0}HA(a,f,d)|0;return 0}function RA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=uC(a)|0;f=c[a>>2]|0;a:do if(!((c[b>>2]^f)&3)){d=1;e=0;while(1){e=IA(g,f&3,e)|0;if(!e)break a;d=CA(b,c[e+8>>2]|0)|0;if(!d){d=1;break a}f=OA(a,e)|0;HA(b,d,f)|0;if(gD(f)|0)hD(OA(b,d)|0);d=0;f=c[a>>2]|0}}else d=1;while(0);return d|0}function SA(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;a=c[b+40>>2]|0;f=c[d+40>>2]|0;if((a|0)==(f|0)){e=(c[b>>2]|0)>>>4;a=(c[d>>2]|0)>>>4;if(e>>>0>=a>>>0)if(e>>>0>a>>>0)a=1;else g=6;else a=-1}else{e=(c[a>>2]|0)>>>4;a=(c[f>>2]|0)>>>4;if(e>>>0>=a>>>0)if(e>>>0>a>>>0)a=1;else g=6;else a=-1}if((g|0)==6)a=0;return a|0}function TA(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;a=(c[b+40>>2]|0)+8|0;g=c[a>>2]|0;a=c[a+4>>2]|0;f=(c[d+40>>2]|0)+8|0;e=c[f>>2]|0;f=c[f+4>>2]|0;do if(!(a>>>0>>0|(a|0)==(f|0)&g>>>0>>0))if(a>>>0>f>>>0|(a|0)==(f|0)&g>>>0>e>>>0)a=1;else{e=b+8|0;a=c[e>>2]|0;e=c[e+4>>2]|0;if(!((a|0)==0&(e|0)==0)?(i=d+8|0,h=c[i>>2]|0,i=c[i+4>>2]|0,!((h|0)==0&(i|0)==0)):0){if(e>>>0>>0|(e|0)==(i|0)&a>>>0>>0){a=-1;break}if(e>>>0>i>>>0|(e|0)==(i|0)&a>>>0>h>>>0){a=1;break}}a=0}else a=-1;while(0);return a|0}function UA(a,b){a=a|0;b=b|0;var d=0;b=VA(a,b)|0;if(!b)b=0;else{d=a+44|0;a=b+32|0;Tz(c[d>>2]|0,c[a>>2]|0)|0;b=c[d>>2]|0;b=eb[c[b>>2]&63](b,0,128)|0;c[a>>2]=Pz(c[d>>2]|0)|0}return b|0}function VA(a,b){a=a|0;b=b|0;var d=0,e=0;e=l;l=l+48|0;d=e;if((c[b+24>>2]|0)==(a|0))a=b+28|0;else{c[d+16>>2]=b;a=c[a+40>>2]|0;a=eb[c[a>>2]&63](a,d,4)|0}l=e;return a|0}function WA(a,b){a=a|0;b=b|0;var d=0,e=0;d=VA(a,c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0)|0;if(!d)a=0;else{e=a+44|0;d=d+32|0;Tz(c[e>>2]|0,c[d>>2]|0)|0;a=c[e>>2]|0;a=eb[c[a>>2]&63](a,b,8)|0;c[d>>2]=Pz(c[e>>2]|0)|0}return a|0}function XA(a,b){a=a|0;b=b|0;var d=0;b=VA(a,b)|0;if(!b)b=0;else{d=a+44|0;a=b+28|0;Tz(c[d>>2]|0,c[a>>2]|0)|0;b=c[d>>2]|0;b=eb[c[b>>2]&63](b,0,128)|0;c[a>>2]=Pz(c[d>>2]|0)|0}return b|0}function YA(a,b){a=a|0;b=b|0;var d=0,e=0;d=VA(a,c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)|0;if(!d)a=0;else{e=a+44|0;d=d+28|0;Tz(c[e>>2]|0,c[d>>2]|0)|0;a=c[e>>2]|0;a=eb[c[a>>2]&63](a,b,8)|0;c[d>>2]=Pz(c[e>>2]|0)|0}return a|0}function ZA(a,b){a=a|0;b=b|0;var c=0;c=UA(a,b)|0;if(!c)c=XA(a,b)|0;return c|0}function _A(a,b,d){a=a|0;b=b|0;d=d|0;a:do if((c[b>>2]&3|0)==2){b=WA(a,b)|0;if(!b){b=0;do{if(!b)b=XA(a,d)|0;else b=YA(a,b)|0;if(!b){b=0;break a}}while((c[b+40>>2]|0)==(d|0))}}else do{b=YA(a,b)|0;if(!b){b=0;break a}}while((c[b+40>>2]|0)==(d|0));while(0);return b|0}function $A(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+32|0;f=h+16|0;g=h;if((wB(a)|0)!=0?(c[g>>2]=0,c[g+4>>2]=0,c[g+8>>2]=0,c[g+12>>2]=0,c[f>>2]=c[g>>2],c[f+4>>2]=c[g+4>>2],c[f+8>>2]=c[g+8>>2],c[f+12>>2]=c[g+12>>2],(dB(a,b,e,f)|0)!=0):0)f=0;else f=((d[a+24>>0]|0)>>>2&1^1)&255|(b|0)!=(e|0);l=h;return f|0}function aB(a,b){a=a|0;b=b|0;cB(a,b);return}function bB(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0;lC(b,d,1)|0;lC(b,e,1)|0;h=aC(b,96)|0;i=h+48|0;l=oB(b,2)|0;j=c[i>>2]|0;k=c[h>>2]|0;m=h+8|0;c[m>>2]=f;c[m+4>>2]=g;m=h+56|0;c[m>>2]=f;c[m+4>>2]=g;g=l<<4;c[h>>2]=k&12|g|2;c[i>>2]=j&12|g|3;c[h+88>>2]=d;c[h+40>>2]=e;cB(b,h);if(a[b+24>>0]&64){RC(h,c[4610]|0,16,0)|0;sA(b,h)}wC(b,h);return h|0}function cB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;i=l;l=l+16|0;d=i;h=c[b>>2]&3;g=(h|0)==2?b:b+-48|0;h=(h|0)==3?b:b+48|0;e=c[h+40>>2]|0;f=c[g+40>>2]|0;while(1){if(!a)break;c[d>>2]=c[b>>2];c[d+4>>2]=c[b+4>>2];c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];if(dB(a,e,f,d)|0)break;j=VA(a,e)|0;m=a+44|0;eB(c[m>>2]|0,j+32|0,g);k=a+48|0;eB(c[k>>2]|0,j+24|0,g);j=VA(a,f)|0;eB(c[m>>2]|0,j+28|0,h);eB(c[k>>2]|0,j+20|0,h);a=OD(a)|0}l=i;return}function dB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+48|0;f=h;if(!((b|0)==0|(d|0)==0)?(c[f>>2]=c[e>>2],c[f+4>>2]=c[e+4>>2],c[f+8>>2]=c[e+8>>2],c[f+12>>2]=c[e+12>>2],c[f+40>>2]=b,g=VA(a,d)|0,(g|0)!=0):0){e=a+48|0;g=g+20|0;Tz(c[e>>2]|0,c[g>>2]|0)|0;a=c[e>>2]|0;a=eb[c[a>>2]&63](a,f,4)|0;c[g>>2]=Pz(c[e>>2]|0)|0}else a=0;l=h;return a|0}function eB(a,b,d){a=a|0;b=b|0;d=d|0;Tz(a,c[b>>2]|0)|0;eb[c[a>>2]&63](a,d,1)|0;c[b>>2]=Pz(a)|0;return}function fB(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+48|0;i=o+24|0;m=o+16|0;j=o;h=(f|0)!=0;do if(!(EB(a,2,e,m,0)|0)){if(e|0)if(h){n=18;break}else{f=0;break}if(h?(wB(a)|0)==0:0){n=18;break}n=j;c[n>>2]=0;c[n+4>>2]=0;c[j>>2]=0;n=j+8|0;c[n>>2]=0;c[n+4>>2]=0;n=7}else{g=j;c[g>>2]=0;c[g+4>>2]=0;g=m;k=c[g+4>>2]|0;n=j+8|0;c[n>>2]=c[g>>2];c[n+4>>2]=k;c[j>>2]=2;n=7}while(0);a:do if((n|0)==7){c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];f=dB(a,b,d,i)|0;if(f|0)break;if(!(vB(a)|0))k=0;else{c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];k=dB(a,d,b,i)|0}g=(k|0)!=0;f=h^1;do if(g|f)g=g^1;else{f=vC(a)|0;c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];f=dB(f,b,d,i)|0;if(!f){if(!(vB(a)|0)){g=1;f=0;break}f=vC(a)|0;c[i>>2]=c[j>>2];c[i+4>>2]=c[j+4>>2];c[i+8>>2]=c[j+8>>2];c[i+12>>2]=c[j+12>>2];f=dB(f,d,b,i)|0;if(!f){g=1;f=0;break}}aB(a,f);break a}while(0);if(f|g^1)f=g?0:k;else n=18}while(0);if((n|0)==18)if(($A(a,b,d)|0)!=0?(EB(a,2,e,m,1)|0)!=0:0){f=m;f=bB(a,b,d,c[f>>2]|0,c[f+4>>2]|0)|0;IB(a,2,f)}else f=0;l=o;return f|0}function gB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;d=(c[b>>2]&3|0)==3;g=d?b+-48|0:b;d=d?b:b+48|0;b=c[g+40>>2]|0;h=VA(a,c[d+40>>2]|0)|0;f=a+44|0;hB(c[f>>2]|0,h+32|0,g);e=a+48|0;hB(c[e>>2]|0,h+24|0,g);b=VA(a,b)|0;hB(c[f>>2]|0,b+28|0,d);hB(c[e>>2]|0,b+20|0,d);return}function hB(a,b,d){a=a|0;b=b|0;d=d|0;Tz(a,c[b>>2]|0)|0;eb[c[a>>2]&63](a,d,2)|0;c[b>>2]=Pz(a)|0;return}function iB(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=l;l=l+16|0;f=e;d=(c[d>>2]&3|0)==2?d:d+-48|0;g=c[d>>2]&3;h=c[((g|0)==3?d:d+48|0)+40>>2]|0;g=c[((g|0)==2?d:d+-48|0)+40>>2]|0;c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];if(dB(b,h,g,f)|0){if((vC(b)|0)==(b|0)){if(a[b+24>>0]&64)MA(d);AC(b,d);ZC(d);h=d+8|0;GB(b,2,c[h>>2]|0,c[h+4>>2]|0)}if(!(zE(b,d,58,0,0)|0))if((vC(b)|0)==(b|0)){bC(b,d);d=0}else d=0;else d=-1}else d=-1;l=e;return d|0}function jB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+16|0;e=h;f=lC(a,c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0,d)|0;g=lC(a,c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0,d)|0;do if((f|0)!=0&(g|0)!=0){c[e>>2]=c[b>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[e+12>>2]=c[b+12>>2];e=dB(a,f,g,e)|0;f=(e|0)==0;if(!((d|0)!=0&f)){if(f)break}else{cB(a,b);e=b}d=c[e>>2]&3;l=h;return ((d|0)==(c[b>>2]&3|0)?e:e+(((d|0)==3?-1:1)*48|0)|0)|0}while(0);l=h;return 0}function kB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;b=b+8|0;e=d+8|0;e=t6(c[b>>2]|0,c[b+4>>2]|0,c[e>>2]|0,c[e+4>>2]|0)|0;return ((e|0)==0?0:e>>31|1)|0}function lB(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;h=l;l=l+16|0;g=h;j=mB(e)|0;f=vb[c[(c[j>>2]|0)+4>>2]&127](c[j+12>>2]|0,72)|0;c[f>>2]=c[f>>2]&-4;i=f+64|0;c[i>>2]=j;k=f+24|0;d=c[d>>2]|0;c[k>>2]=d;a[k>>0]=d&255|8;c[f+60>>2]=f;e=vb[c[c[j+4>>2]>>2]&127](f,e)|0;c[(c[i>>2]|0)+16>>2]=e;if(EB(f,0,b,g,1)|0){i=g;j=c[i+4>>2]|0;k=f+8|0;c[k>>2]=c[i>>2];c[k+4>>2]=j}k=nB(f)|0;IB(k,0,f);l=h;return k|0}function mB(b){b=b|0;var d=0,e=0,f=0,g=0;d=(b|0)!=0;if(d){e=c[b>>2]|0;e=(e|0)==0?18780:e}else e=18780;g=pb[c[e>>2]&63](b)|0;f=vb[c[e+4>>2]&127](g,80)|0;c[f>>2]=e;c[f+12>>2]=g;if(d){g=c[b+4>>2]|0;c[f+4>>2]=(g|0)==0?18656:g;b=c[b+8>>2]|0;b=(b|0)==0?18756:b}else{c[f+4>>2]=18656;b=18756}c[f+8>>2]=b;a[f+52>>0]=1;return f|0}function nB(b){b=b|0;var d=0,e=0;c[b+36>>2]=SD(b,18836,c[4599]|0)|0;c[b+40>>2]=SD(b,18800,c[4599]|0)|0;d=(vC(b)|0)==(b|0);c[b+44>>2]=SD(b,d?18448:18484,c[4599]|0)|0;d=(vC(b)|0)==(b|0);c[b+48>>2]=SD(b,d?18520:18556,c[4599]|0)|0;c[b+52>>2]=SD(b,18592,c[4599]|0)|0;d=OD(b)|0;if(!((d|0)!=0?(e=oB(d,0)|0,c[b>>2]=c[b>>2]&15|e<<4,e=c[d+52>>2]|0,eb[c[e>>2]&63](e,b,1)|0,!(a[d+24>>0]&64)):0))qA(b);wC(b,b);return b|0}function oB(a,b){a=a|0;b=b|0;var d=0;d=(c[a+64>>2]|0)+24+(b<<3)|0;b=d;b=w6(c[b>>2]|0,c[b+4>>2]|0,1,0)|0;a=D;c[d>>2]=b;c[d+4>>2]=a;D=a;return b|0}function pB(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;f=OD(b)|0;g=(f|0)==0;h=b+64|0;if(g?(c[(c[c[h>>2]>>2]|0)+16>>2]|0)!=0:0){AC(b,b);d=b+8|0;GB(b,0,c[d>>2]|0,c[d+4>>2]|0);d=c[h>>2]|0;db[c[(c[d>>2]|0)+16>>2]&127](c[d+12>>2]|0);d=0}else e=4;do if((e|0)==4){d=MD(b)|0;while(1){if(!d)break;e=ND(d)|0;pB(d)|0;d=e}d=gC(b)|0;while(1){if(!d)break;e=hC(b,d)|0;sC(b,d)|0;d=e}RB(b);AC(b,b);if(((((UD(b,c[b+40>>2]|0)|0)==0?(UD(b,c[b+36>>2]|0)|0)==0:0)?(UD(b,c[b+48>>2]|0)|0)==0:0)?(UD(b,c[b+44>>2]|0)|0)==0:0)?(UD(b,c[b+52>>2]|0)|0)==0:0){if(a[b+24>>0]&64?JA(b)|0:0){d=-1;break}ZC(b);e=b+8|0;GB(b,0,c[e>>2]|0,c[e+4>>2]|0);if(!g){PD(f,b)|0;bC(f,b);d=0;break}while(1){d=c[h>>2]|0;e=c[d+48>>2]|0;if(!e)break;DC(b,c[e>>2]|0)|0}db[c[(c[d+4>>2]|0)+20>>2]&127](c[d+16>>2]|0);if(!(_C(b)|0)){d=c[h>>2]|0;h=c[d+12>>2]|0;g=(c[d>>2]|0)+12|0;lb[c[g>>2]&63](h,b);lb[c[g>>2]&63](h,d);d=0}else d=-1}else d=-1}while(0);return d|0}function qB(a){a=a|0;return Uz(c[a+40>>2]|0)|0}function rB(a){a=a|0;var b=0,c=0,d=0;b=0;c=gC(a)|0;while(1){if(!c)break;d=(sB(a,c,0,1)|0)+b|0;b=d;c=hC(a,c)|0}return b|0}function sB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=VA(a,b)|0;if(f){a=a+44|0;if(!e)b=0;else b=tB(c[a>>2]|0,f+32|0)|0;if(d)b=(tB(c[a>>2]|0,f+28|0)|0)+b|0}else b=0;return b|0}function tB(a,b){a=a|0;b=b|0;var d=0;Tz(a,c[b>>2]|0)|0;d=Uz(a)|0;c[b>>2]=Pz(a)|0;return d|0}function uB(b){b=b|0;return a[b+24>>0]&1|0}function vB(a){a=a|0;return (uB(a)|0)==0|0}function wB(a){a=a|0;return (d[a+24>>0]|0)>>>1&1|0}function xB(a,b){a=a|0;b=b|0;return a|0}function yB(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;if(!d){f=1392;d=c[f>>2]|0;f=c[f+4>>2]|0;c[e>>2]=d;c[e+4>>2]=f;f=w6(d|0,f|0,2,0)|0;e=1392;c[e>>2]=f;c[e+4>>2]=D}else{if(!f)a=aD(a,d)|0;else a=dD(a,d)|0;c[e>>2]=a;c[e+4>>2]=0}return 1}function zB(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return 0}function AB(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((c&1|0)==0&0==0)fD(a,c)|0;return}function BB(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return ((c&1|0)==0&0==0?c:0)|0}function CB(a){a=a|0;return}function DB(a,b,c){a=a|0;b=b|0;c=c|0;return} +function Ol(a){a=a|0;var d=0,e=0,f=0,g=0;g=a+16|0;a=c[g>>2]|0;if(b[a+236>>1]|0)Aa(88706,88689,190,88725);d=c[a+196>>2]|0;a=(b[a+238>>1]<<6)+192|0;if(!d)a=IK(a)|0;else a=KK(d,a)|0;e=a+64|0;a=c[g>>2]|0;c[a+196>>2]=e;a=b[a+238>>1]|0;while(1){d=e+(a<<6)|0;if((a|0)<=-1)break;a=a+-1|0;e=e+(a<<6)|0;f=d+64|0;do{c[d>>2]=c[e>>2];d=d+4|0;e=e+4|0}while((d|0)<(f|0));e=c[(c[g>>2]|0)+196>>2]|0}c[e+(a<<6)+8>>2]=0;c[d>>2]=0;e=HK(8)|0;g=c[g>>2]|0;f=c[g+196>>2]|0;c[f+(a<<6)+12>>2]=e;c[f+(a<<6)+4>>2]=e;c[f+(a<<6)+56>>2]=0;h[f+(a<<6)+24>>3]=1.0;h[f+(a<<6)+16>>3]=1.0;h[f+(a<<6)+40>>3]=1.0;h[f+(a<<6)+32>>3]=1.0;g=g+236|0;b[g>>1]=(b[g>>1]|0)+-1<<16>>16;return}function Pl(b){b=b|0;var d=0,e=0,f=0.0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0;j=b+16|0;if(c[(c[j>>2]|0)+96>>2]|0){m=b+48|0;k=dg(c[((c[b>>2]&3|0)==3?b:m)+40>>2]|0)|0;d=c[(c[(c[((c[b>>2]&3|0)==3?b:m)+40>>2]|0)+16>>2]|0)+232>>2]|0;l=Ql(k,b)|0;n=k+16|0;e=c[n>>2]|0;g=c[e+196>>2]|0;o=d+-1|0;i=c[c[g+(o<<6)+4>>2]>>2]|0;if(!i)f=+h[(c[(c[c[g+(d<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]+ +h[g+(d<<6)+24>>3]+ +(c[e+252>>2]|0);else f=+h[(c[i+16>>2]|0)+24>>3]-+h[g+(o<<6)+16>>3];d=Rl(k,o,l)|0;k=c[(c[j>>2]|0)+96>>2]|0;q=+h[k+24>>3];p=+h[k+32>>3];j=(c[(c[n>>2]|0)+116>>2]&1|0)==0;r=j?p:q;g=d+16|0;e=c[g>>2]|0;h[e+80>>3]=r;l=~~(r*.5);p=(j?q:p)*.5;h[e+96>>3]=p;h[e+88>>3]=p;c[e+104>>2]=k;h[e+24>>3]=+(l+~~f|0);e=kh(d,c[((c[b>>2]&3|0)==3?b:m)+40>>2]|0,b)|0;e=c[e+16>>2]|0;h[e+16>>3]=-+h[(c[g>>2]|0)+88>>3];h[e+56>>3]=+h[(c[(c[((c[b>>2]&3|0)==3?b:m)+40>>2]|0)+16>>2]|0)+96>>3];a[e+112>>0]=4;e=b+-48|0;d=kh(d,c[((c[b>>2]&3|0)==2?b:e)+40>>2]|0,b)|0;g=c[g>>2]|0;d=c[d+16>>2]|0;h[d+16>>3]=+h[g+96>>3];h[d+56>>3]=+h[(c[(c[((c[b>>2]&3|0)==2?b:e)+40>>2]|0)+16>>2]|0)+88>>3];a[d+112>>0]=4;d=c[(c[n>>2]|0)+196>>2]|0;e=d+(o<<6)+16|0;f=+(l|0);if(+h[e>>3]>3]=f;d=d+(o<<6)+24|0;if(+h[d>>3]>3]=f;c[g+112>>2]=b}return}function Ql(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+32|0;j=n+8|0;f=n+4|0;g=n;d=c[b>>2]&3;e=c[((d|0)==3?b:b+48|0)+40>>2]|0;k=(c[(c[e+16>>2]|0)+232>>2]|0)+-1|0;a=c[(c[a+16>>2]|0)+196>>2]|0;h=c[a+(k<<6)+4>>2]|0;a=c[a+(k<<6)>>2]|0;k=j+8|0;c[k>>2]=-1;c[j>>2]=-1;m=j+12|0;c[m>>2]=a;i=j+4|0;c[i>>2]=a;Sl(e,c[((d|0)==2?b:b+-48|0)+40>>2]|0,f,g);f=c[f>>2]|0;g=c[g>>2]|0;d=0;e=a;b=-1;while(1){if((d|0)>=(e|0))break;e=e+-1|0;Tl(c[h+(d<<2)>>2]|0,j,f,g);if((d|0)!=(e|0))Tl(c[h+(e<<2)>>2]|0,j,f,g);a=c[i>>2]|0;b=c[j>>2]|0;if((a-b|0)<2)break;else d=d+1|0}if((b|0)>(a|0))a=(c[m>>2]|0)+(c[k>>2]|0)|0;else a=a+b|0;l=n;return (a+1|0)/2|0|0}function Rl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=a+16|0;e=c[(c[g>>2]|0)+196>>2]|0;f=c[e+(b<<6)+4>>2]|0;e=(c[e+(b<<6)>>2]<<2)+8|0;if(!f)f=IK(e)|0;else f=KK(f,e)|0;e=c[(c[g>>2]|0)+196>>2]|0;c[e+(b<<6)+4>>2]=f;e=c[e+(b<<6)>>2]|0;while(1){if((e|0)<=(d|0))break;h=e+-1|0;i=c[f+(h<<2)>>2]|0;c[f+(e<<2)>>2]=i;i=(c[i+16>>2]|0)+236|0;c[i>>2]=(c[i>>2]|0)+1;e=h}h=ph(a)|0;i=f+(d<<2)|0;c[i>>2]=h;h=c[h+16>>2]|0;c[h+236>>2]=d;c[h+232>>2]=b;g=(c[(c[g>>2]|0)+196>>2]|0)+(b<<6)|0;h=(c[g>>2]|0)+1|0;c[g>>2]=h;c[f+(h<<2)>>2]=0;return c[i>>2]|0}function Sl(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;a=c[(c[a+16>>2]|0)+236>>2]|0;b=c[(c[b+16>>2]|0)+236>>2]|0;f=(a|0)>(b|0);c[d>>2]=f?b:a;c[e>>2]=f?a:b;return}function Tl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;h=o+4|0;g=o;b=c[b+16>>2]|0;do if((a[b+156>>0]|0)==1){n=c[b+236>>2]|0;m=d+4|0;j=c[b+180>>2]|0;if(c[b+176>>2]|0){b=0;g=0;h=0;while(1){i=c[j+(h<<2)>>2]|0;if(!i)break;i=c[(c[(c[((c[i>>2]&3|0)==2?i:i+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0;k=(i|0)>(e|0);b=k?((i|0)<(f|0)?b:1):b;g=k?g:1;h=h+1|0}if(g<<24>>24!=0&b<<24>>24==0){c[d>>2]=n+1;break}if(!(g<<24>>24==0&b<<24>>24!=0))break;c[m>>2]=n+-1;break}if((c[b+184>>2]|0)!=2)Aa(88669,88689,63,88696);k=c[j>>2]|0;j=c[j+4>>2]|0;Sl(c[((c[k>>2]&3|0)==2?k:k+-48|0)+40>>2]|0,c[((c[j>>2]&3|0)==2?j:j+-48|0)+40>>2]|0,h,g);j=c[g>>2]|0;k=d+8|0;if((j|0)<=(e|0)){c[d>>2]=n;c[k>>2]=n;break}i=c[h>>2]|0;h=d+12|0;if((i|0)>=(f|0)){c[m>>2]=n;c[h>>2]=n;break}b=(i|0)<(e|0);g=(j|0)>(f|0);if(!(g&b)){if(!(!b?!((j|0)<(f|0)&(i|0)==(e|0)):0))c[k>>2]=n;if(!g?!((j|0)==(f|0)&(i|0)>(e|0)):0)break;c[h>>2]=n}}while(0);l=o;return}function Ul(a){a=a|0;c[47180]=1;mm(a);c[47180]=0;return}function Vl(a){a=a|0;c[47180]=2;mm(a);c[47180]=0;return}function Wl(a){a=a|0;var b=0;RC(a,137750,304,1)|0;qP(a);b=HK((e[(c[(uC(a)|0)+16>>2]|0)+176>>1]|0)<<3)|0;c[(c[a+16>>2]|0)+132>>2]=b;oQ(a,c[(c[(uC(a)|0)+16>>2]|0)+116>>2]&1);return}function Xl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0;u=l;l=l+64|0;j=u+48|0;p=u+40|0;k=u+24|0;i=u+8|0;s=u+56|0;n=u;do if((b|0)!=0?(t=e+16|0,q=c[(c[t>>2]|0)+132>>2]|0,g=OA(e,b)|0,(a[g>>0]|0)!=0):0){a[s>>0]=0;m=q+16|0;r=(d|0)!=0;b=q+8|0;if((c[47184]|0)>2?(c[i>>2]=q,c[i+4>>2]=b,c[i+8>>2]=m,c[i+12>>2]=s,(q4(g,88807,i)|0)>2):0){a[(c[t>>2]|0)+119>>0]=1;g=c[47184]|0;a:do if(+h[23314]>0.0){b=0;while(1){if((b|0)>=(g|0))break a;p=q+(b<<3)|0;h[p>>3]=+h[p>>3]/+h[23314];b=b+1|0}}while(0);if((g|0)>3)Cn(e,f,3);if((a[s>>0]|0)!=33){if(!r){b=1;break}if(!((bP(OA(e,d)|0)|0)<<24>>24)){b=1;break}}a[(c[t>>2]|0)+119>>0]=3;b=1;break}c[k>>2]=q;c[k+4>>2]=b;c[k+8>>2]=s;if((q4(g,102050,k)|0)<=1){c[j>>2]=HB(e)|0;c[j+4>>2]=g;dA(1,88821,j)|0;b=0;break}a[(c[t>>2]|0)+119>>0]=1;g=c[47184]|0;b:do if(+h[23314]>0.0){b=0;while(1){if((b|0)>=(g|0))break b;k=q+(b<<3)|0;h[k>>3]=+h[k>>3]/+h[23314];b=b+1|0}}while(0);do if((g|0)>2){b=c[47233]|0;if((b|0?(o=OA(e,b)|0,o|0):0)?(c[p>>2]=n,(q4(o,101510,p)|0)==1):0){w=+h[23314];v=+h[n>>3];h[m>>3]=w>0.0?v/w:v;Cn(e,f,3);break}Dn(e,f)}while(0);if((a[s>>0]|0)!=33){if(!r){b=1;break}if(!((bP(OA(e,d)|0)|0)<<24>>24)){b=1;break}}a[(c[t>>2]|0)+119>>0]=3;b=1}else b=0;while(0);l=u;return b|0}function Yl(a){a=a|0;var b=0,c=0;c=gC(a)|0;while(1){if(!c)break;b=UA(a,c)|0;while(1){if(!b)break;WP(b);b=WA(a,b)|0}UP(c);c=hC(a,c)|0}Zl(a);return}function Zl(a){a=a|0;if((c[47180]|0)!=0|(c[46837]|0)<0)An(a);if((vC(a)|0)!=(a|0))XC(a,0,137786);return}function _l(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+48|0;m=q+32|0;o=q;k=DA(b,0,102938,0)|0;e=DA(b,0,102972,0)|0;p=cP(NA(b,88865)|0,0)|0;if(!e)e=DA(b,0,102972,195341)|0;zn(b)|0;n=b+16|0;i=0;while(1){j=c[(c[(c[n>>2]|0)+152>>2]|0)+(i<<2)>>2]|0;if(!j){f=12;break}g=j+16|0;f=c[g>>2]|0;if(!(a[f+119>>0]|0)){if(h2(HB(j)|0,108307,7)|0){f=8;break}f=c[g>>2]|0}f=c[f+108>>2]|0;if(f|0)$l(j,f,102934);i=i+1|0}a:do if((f|0)==8){p=HB(j)|0;e=HB(b)|0;c[m>>2]=p;c[m+4>>2]=e;dA(1,88877,m)|0;e=-1}else if((f|0)==12){am(b,k,e);j=bm(b)|0;e=c[(c[n>>2]|0)+8>>2]|0;if(!(c[e+88>>2]|0))e=0;else{c[e+84>>2]=0;e=1}g=(d|0)!=0;i=(e|0)!=0;if(!(i|g&(c[47180]|0)==1^1)?(lr(b)|0)!=0:0){f=c[(c[n>>2]|0)+12>>2]|0;if(!f)f=1;else{a[f+81>>0]=0;f=1}}else f=0;zP(b);if(i){d=(c[n>>2]|0)+16|0;lI(o,b);c[d>>2]=c[o>>2];c[d+4>>2]=c[o+4>>2];c[d+8>>2]=c[o+8>>2];c[d+12>>2]=c[o+12>>2];c[d+16>>2]=c[o+16>>2];c[d+20>>2]=c[o+20>>2];c[d+24>>2]=c[o+24>>2];c[d+28>>2]=c[o+28>>2]}if(!g){c[47185]=1;f=gC(b)|0;while(1){if(!f)break a;p=c[f+16>>2]|0;o=c[p+132>>2]|0;h[p+16>>3]=+h[o>>3]*72.0;h[p+24>>3]=+h[o+8>>3]*72.0;f=hC(b,f)|0}}do if(!(p<<24>>24!=0|i)){p=c[n>>2]|0;if(!(+h[p+16>>3]!=0.0)?!(+h[p+24>>3]!=0.0):0)break;Zm(b)}while(0);if(!((j|0)!=0&(f|(Xm(b)|0)<<24>>24!=0))){if((j|0)==2){c[47185]=1;break}}else cm(b);Wm(b,0)}while(0);l=q;return e|0}function $l(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0;k=l;l=l+48|0;j=k+32|0;f=k+24|0;g=k+16|0;i=k;b=NA(b,e)|0;if(b|0?(c[j>>2]=f,c[j+4>>2]=g,(q4(b,105804,j)|0)==2):0){j=d+56|0;fm(i,+h[f>>3],+h[g>>3]);c[j>>2]=c[i>>2];c[j+4>>2]=c[i+4>>2];c[j+8>>2]=c[i+8>>2];c[j+12>>2]=c[i+12>>2];a[d+81>>0]=1}l=k;return}function am(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+48|0;k=m+32|0;f=m+24|0;g=m+16|0;i=m;j=b+16|0;if((d|0?(c[(c[j>>2]|0)+12>>2]|0)!=0:0)?(n=OA(b,d)|0,c[k>>2]=f,c[k+4>>2]=g,(q4(n,105804,k)|0)==2):0){n=(c[(c[j>>2]|0)+12>>2]|0)+56|0;fm(i,+h[f>>3],+h[g>>3]);c[n>>2]=c[i>>2];c[n+4>>2]=c[i+4>>2];c[n+8>>2]=c[i+8>>2];c[n+12>>2]=c[i+12>>2];a[(c[(c[j>>2]|0)+12>>2]|0)+81>>0]=1}a:do if(e|0){f=MD(b)|0;while(1){if(!f)break a;gm(f,b,d,e);f=ND(f)|0}}while(0);l=m;return}function bm(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;if(rB(a)|0){f=DA(a,2,102924,0)|0;if(!((f|0)==0|(c[47180]|0)<2)){b=0;e=gC(a)|0;while(1){if(!e)break;d=UA(a,e)|0;while(1){if(!d)break;g=((dm(f,d)|0)!=0&1)+b|0;d=WA(a,d)|0;b=g}e=hC(a,e)|0}if(b){b=(b|0)==(rB(a)|0);b=b?2:1}else b=0}else b=0}else b=2;return b|0}function cm(a){a=a|0;var b=0,d=0,e=0;d=gC(a)|0;while(1){if(!d)break;b=UA(a,d)|0;while(1){if(!b)break;XP(b);e=b+16|0;AK(c[(c[e>>2]|0)+96>>2]|0);AK(c[(c[e>>2]|0)+108>>2]|0);AK(c[(c[e>>2]|0)+100>>2]|0);AK(c[(c[e>>2]|0)+104>>2]|0);b=WA(a,b)|0}d=hC(a,d)|0}return}function dm(b,d){b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0.0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;B=l;l=l+96|0;z=B+72|0;x=B+56|0;A=B+48|0;y=B+32|0;w=B+16|0;r=B+88|0;s=B+8|0;t=B;u=B+84|0;v=B+80|0;b=OA(d,b)|0;do if(a[b>>0]|0){FH(d,u,v);q=1;f=0;e=0;j=0.0;i=0.0;k=0.0;g=0.0;a:while(1){c[w>>2]=s;c[w+4>>2]=t;c[w+8>>2]=r;if((q4(b,88914,w)|0)==2){p=1;b=b+(c[r>>2]|0)|0;i=+h[s>>3];g=+h[t>>3]}else p=e;c[y>>2]=s;c[y+4>>2]=t;c[y+8>>2]=r;if((q4(b,88926,y)|0)==2){o=1;b=b+(c[r>>2]|0)|0;j=+h[s>>3];k=+h[t>>3]}else o=f;m=em(b)|0;if(!((m|0)>3&((m|0)%3|0|0)==1)){e=8;break}n=IK(m<<4)|0;e=n;f=m;while(1){if(!f)break;c[x>>2]=s;c[x+4>>2]=t;c[x+8>>2]=r;if((q4(b,88996,x)|0)<2){e=13;break a}C=b+(c[r>>2]|0)|0;h[e>>3]=+h[s>>3];h[e+8>>3]=+h[t>>3];e=e+16|0;f=f+-1|0;b=C}while(1){e=a[b>>0]|0;f=b+1|0;if(!(X1(e<<24>>24)|0))break;else b=f}C=e<<24>>24==0;b=C?b:f;q=C?0:q;f=aO(d,m)|0;if(p|0){c[f+8>>2]=c[u>>2];h[f+16>>3]=i;h[f+24>>3]=g}if(o|0){c[f+12>>2]=c[v>>2];h[f+32>>3]=j;h[f+40>>3]=k}e=0;while(1){if((e|0)>=(m|0))break;C=(c[f>>2]|0)+(e<<4)|0;D=n+(e<<4)|0;c[C>>2]=c[D>>2];c[C+4>>2]=c[D+4>>2];c[C+8>>2]=c[D+8>>2];c[C+12>>2]=c[D+12>>2];e=e+1|0}l6(n);if(!q){e=26;break}else{f=o;e=p}}if((e|0)==8){XP(d);if(a[194051]|0){b=0;break}a[194051]=1;D=HB(c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0)|0;b=HB(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)|0;c[A>>2]=D;c[A+4>>2]=b;dA(0,88939,A)|0;b=0;break}else if((e|0)==13){if(!(a[194051]|0)){a[194051]=1;C=HB(c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0)|0;D=HB(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)|0;c[z>>2]=C;c[z+4>>2]=D;dA(0,89006,z)|0}l6(n);XP(d);b=0;break}else if((e|0)==26){f=d+16|0;b=c[f>>2]|0;e=c[b+96>>2]|0;if(e){$l(d,e,102938);b=c[f>>2]|0}e=c[b+108>>2]|0;if(e){$l(d,e,102934);b=c[f>>2]|0}e=c[b+100>>2]|0;if(e){$l(d,e,102941);b=c[f>>2]|0}b=c[b+104>>2]|0;if(!b){b=1;break}$l(d,b,102949);b=1;break}}else b=0;while(0);l=B;return b|0}function em(b){b=b|0;var c=0,d=0;d=0;do{while(1){c=a[b>>0]|0;if(!(X1(c&255)|0))break;else b=b+1|0}a:do if(!(c<<24>>24))c=0;else{d=d+1|0;while(1){if(!(c<<24>>24)){c=0;break a}if(c<<24>>24==59|(X1(c&255)|0)!=0)break a;c=b+1|0;b=c;c=a[c>>0]|0}}while(0)}while((X1(c&255)|0)!=0);return d|0}function fm(a,b,c){a=a|0;b=+b;c=+c;h[a>>3]=b;h[a+8>>3]=c;return}function gm(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=l;l=l+32|0;f=h;if((h2(HB(a)|0,108307,7)|0)==0?(hm(a,e,f)|0)!=0:0){RC(a,137786,280,1)|0;i=(c[a+16>>2]|0)+16|0;c[i>>2]=c[f>>2];c[i+4>>2]=c[f+4>>2];c[i+8>>2]=c[f+8>>2];c[i+12>>2]=c[f+12>>2];c[i+16>>2]=c[f+16>>2];c[i+20>>2]=c[f+20>>2];c[i+24>>2]=c[f+24>>2];c[i+28>>2]=c[f+28>>2];im(b,a);am(a,d,e)}else g=4;a:do if((g|0)==4){a=MD(a)|0;while(1){if(!a)break a;gm(a,b,d,e);a=ND(a)|0}}while(0);l=h;return}function hm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0,j=0,k=0;i=l;l=l+48|0;j=i+32|0;g=i;k=OA(a,b)|0;a=g+8|0;b=g+24|0;c[j>>2]=g;c[j+4>>2]=a;c[j+8>>2]=g+16;c[j+12>>2]=b;if((q4(k,89054,j)|0)==4){e=+h[a>>3];f=+h[b>>3];if(e>f){h[a>>3]=f;h[b>>3]=e};c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];c[d+16>>2]=c[g+16>>2];c[d+20>>2]=c[g+20>>2];c[d+24>>2]=c[g+24>>2];c[d+28>>2]=c[g+28>>2];a=1}else a=0;l=i;return a|0}function im(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;e=a+16|0;d=c[e>>2]|0;g=d+180|0;a=c[g>>2]|0;f=a+1|0;c[g>>2]=f;d=c[d+184>>2]|0;a=a+2|0;if(!d)a=HK(a<<2)|0;else a=JK(d,a,4,f)|0;c[(c[e>>2]|0)+184>>2]=a;c[a+(f<<2)>>2]=b;sK(b);return}function jm(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+48|0;m=n+8|0;k=n;i=n+16|0;j=n+12|0;h=NA(b,89070)|0;do if((h|0)!=0?(g=a[h>>0]|0,g<<24>>24!=0):0){g=g&255;if(!(P2(g)|0))if((e|0)==2|(g+-48|0)>>>0<10)e=h;else break;else{if(!(h2(h,89076,4)|0)){e=0;break}if(!(h2(h,105812,7)|0)){e=1;break}if(h2(h,89081,6)|0)if((e|0)==2)e=h;else break;else e=h+6|0}if(!(((d[e>>0]|0)+-48|0)>>>0<10?(c[k>>2]=j,(q4(e,100234,k)|0)>=1):0)){k=e4()|0;k=(Ya(0)|0)^k;c[j>>2]=k;c[m>>2]=k;i2(i,100234,m)|0;PA(b,89070,i)|0}c[f>>2]=c[j>>2];e=2}while(0);l=n;return e|0}function km(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;e=f+4|0;c[e>>2]=1;d=jm(a,d,e)|0;if((d|0)!=2&(c[46838]|0)!=0)dA(0,89088,f)|0;if((d|0)==1)lm(a,b);W4(c[e>>2]|0);l=f;return d|0}function lm(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0.0,i=0.0,j=0,k=0,l=0.0;g=+(d|0);i=6.283185307179586/g;e=gC(b)|0;f=0.0;while(1){if(!e)break;l=g*+I(+f);j=c[e+16>>2]|0;k=c[j+132>>2]|0;h[k>>3]=l;h[k+8>>3]=g*+J(+f);a[j+119>>0]=1;if((c[47184]|0)>2)Dn(e,d);e=hC(b,e)|0;f=i+f}return}function mm(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0;r=l;l=l+80|0;d=r+24|0;n=r+32|0;k=r;p=r+28|0;m=r+64|0;q=+h[23314];do if(c[47180]|0){h[23314]=72.0;nm(b);om(b);if((_l(b,1)|0)<0){dA(3,89136,d)|0;break}else{aM(b,0);f=32;break}}else{o=cP(NA(b,88865)|0,0)|0;h[23314]=+ZO(b);nm(b);g=pm(b)|0;Kq(b,k,0)|0;i=qm(b)|0;j=kH(b,0,n)|0;d=jH(b,-1,8)|0;c[46837]=d;e=(d|0)<0;do if(!j){if((g|0)!=0&e){c[46837]=8;c[n+16>>2]=2;f=11;break}c[n+16>>2]=2;if((d|0)<=-1){rm(b,g,i);Nq(b,k)|0;om(b);if(!(o<<24>>24)){cn(b);break}else{sm(b);break}}else f=11}else if(e){c[46837]=8;f=11}else f=11;while(0);if((f|0)==11){j=qG(b,p,89164,m)|0;d=c[p>>2]|0;do if((d|0)<=1){rm(b,g,i);Nq(b,k)|0;if(!(o<<24>>24)){cn(b);break}else{sm(b);break}}else{f=o<<24>>24==0;e=0;while(1){if((e|0)>=(d|0))break;d=c[j+(e<<2)>>2]|0;IG(d)|0;rm(d,g,i);Nq(d,k)|0;mQ(d,2);if(f)cn(d);else sm(d);e=e+1|0;d=c[p>>2]|0}if(!(a[m>>0]|0))e=0;else{e=HK(d)|0;a[e>>0]=1;d=c[p>>2]|0}c[n+8>>2]=c[46837];c[n+20>>2]=e;c[n+12>>2]=1;gH(d,j,b,n)|0;l6(e)}while(0);zP(b);om(b);d=0;while(1){if((d|0)>=(c[p>>2]|0))break;n=c[j+(d<<2)>>2]|0;An(n);TC(n,137786)|0;tC(b,n)|0;d=d+1|0}l6(j)}aM(b,o<<24>>24==0&1);f=32}while(0);if((f|0)==32)h[23314]=q;l=r;return}function nm(a){a=a|0;var d=0,e=0,f=0,g=0;mQ(a,2);f=XO(a,DA(a,0,91669,0)|0,2,2)|0;d=(XO(a,DA(a,0,91675,0)|0,f,2)|0)&65535;b[(c[(vC(a)|0)+16>>2]|0)+176>>1]=d;d=c[(c[a+60>>2]|0)+16>>2]|0;g=d+176|0;e=b[g>>1]|0;e=(e&65535)<10?e:10;b[g>>1]=e;e=e&65535;c[47184]=e;b[d+178>>1]=(f|0)<(e|0)?f:e;Cm(a);return}function om(a){a=a|0;var b=0,d=0,e=0,f=0;f=l;l=l+1040|0;e=f;d=f+8|0;a:do if((c[47184]|0)>2&(c[47233]|0)!=0){b=gC(a)|0;while(1){if(!b)break a;h[e>>3]=+h[(c[(c[b+16>>2]|0)+132>>2]|0)+16>>3]*72.0;i2(d,101510,e)|0;HA(b,c[47233]|0,d)|0;b=hC(a,b)|0}}while(0);l=f;return}function pm(b){b=b|0;var d=0,e=0,f=0;f=l;l=l+16|0;e=f;d=NA(b,89849)|0;a:do if(!d)b=1;else{switch(a[d>>0]|0){case 0:{b=1;break a}case 75:{if(!(f2(d,89854)|0)){b=0;break a}break}case 109:{if(!(f2(d,89857)|0)){b=1;break a}break}case 104:{if(!(f2(d,89863)|0)){b=2;break a}break}default:{}}b=HB(b)|0;c[e>>2]=d;c[e+4>>2]=b;dA(0,89868,e)|0;b=1}while(0);l=f;return b|0}function qm(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;h=l;l=l+32|0;g=h+16|0;f=h+8|0;e=h;d=NA(b,89632)|0;a:do if(!d)b=0;else{switch(a[d>>0]|0){case 0:{b=0;break a}case 99:{if(!(f2(d,89638)|0)){b=1;break a}break}case 115:{if(!(f2(d,89646)|0)){b=2;break a}if(!(f2(d,89653)|0)){b=0;break a}break}case 109:{if(!(f2(d,89663)|0)){if(DA(b,2,92794,0)|0){b=3;break a}c[e>>2]=HB(b)|0;dA(0,89667,e)|0;dA(3,89730,f)|0;b=0;break a}break}default:{}}b=HB(b)|0;c[g>>2]=d;c[g+4>>2]=b;dA(0,89787,g)|0;b=0}while(0);l=h;return b|0}function rm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=NA(a,91362)|0;if(!e)if((b|0)==1)e=200;else e=(qB(a)|0)*100|0;else e=d6(e)|0;c[47183]=e;e=tn(a,b)|0;do if(!((e|0)<2|(c[47183]|0)<0))if(!b){um(a,e,d);break}else{tm(a,e,b,d,c[47184]|0);break}while(0);return}function sm(a){a=a|0;zP(a);Wm(a,1);return}function tm(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+64|0;s=v+40|0;p=v+24|0;o=v;q=v+48|0;u=v+44|0;r=(e|0)==2;j=km(b,d,r?0:2)|0;k=Bm(b)|0;m=k|4;t=IK(g<<2)|0;c[t>>2]=IK(S(d<<3,g)|0)|0;i=c[47184]|0;g=1;while(1){if((g|0)>=(i|0))break;c[t+(g<<2)>>2]=(c[t>>2]|0)+((S(g,d)|0)<<3);g=g+1|0}i=(j|0)==0;g=i?m:k;if(a[195234]|0){m=c[15715]|0;k=c[47183]|0;n=+h[23315];c[o>>2]=f;c[o+4>>2]=i&1;c[o+8>>2]=g&3;c[o+12>>2]=k;h[o+16>>3]=n;z4(m,89445,o)|0;_3(89502,15,1,m)|0;RO();_3(89518,13,1,m)|0}o=xm(b,d,q,e,f,u)|0;if(a[195234]|0){m=c[15715]|0;n=+SO();c[p>>2]=d;h[p+8>>3]=n;z4(m,89532,p)|0}if((e|0)!=1){n=+YO(b,DA(b,0,89551,0)|0,0.0,-1797693134862315708145274.0e284);if(r){g=yr(o,d,c[q>>2]|0,t,c[u>>2]|0,c[47184]|0,g,f,c[47183]|0,n)|0;i=12}else i=14}else{g=ln(o,d,c[q>>2]|0,t,c[u>>2]|0,c[47184]|0,g,f,c[47183]|0)|0;i=12}if((i|0)==12)if((g|0)<0)dA(3,89561,s)|0;else i=14;a:do if((i|0)==14){i=gC(b)|0;while(1){if(!i)break a;m=c[i+16>>2]|0;j=c[m+120>>2]|0;k=c[47184]|0;m=m+132|0;g=0;while(1){if((g|0)>=(k|0))break;h[(c[m>>2]|0)+(g<<3)>>3]=+h[(c[t+(g<<2)>>2]|0)+(j<<3)>>3];g=g+1|0}i=hC(b,i)|0}}while(0);Zr(o);l6(c[t>>2]|0);l6(t);l6(c[u>>2]|0);l=v;return}function um(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0.0,k=0;i=l;l=l+48|0;g=i+32|0;f=i;switch(e|0){case 2:{vm(b,d);break}case 1:{if(!(ur(b,d)|0)){c[f>>2]=HB(b)|0;dA(0,89174,f)|0;dA(3,93665,i+8|0)|0;dA(3,89226,i+16|0)|0;dA(3,89298,i+24|0)|0;Rn(b,d)}break}default:{Rn(b,d);if((e|0)==3)wm(b)}}Fn(b,d);Gn(b,d);if(a[195234]|0){f=c[15715]|0;k=c[47183]|0;j=+h[23315];c[g>>2]=e;c[g+4>>2]=k;h[g+8>>3]=j;z4(f,89336,g)|0;RO()}Hn(b,d);l=i;return}function vm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0;j=l;l=l+16|0;g=xm(a,b,j,0,2,0)|0;i=$s(g,b)|0;e=a+16|0;a=0;while(1){if((a|0)>=(b|0))break;f=i+(a<<2)|0;d=0;while(1){if((d|0)==(b|0))break;h[(c[(c[(c[e>>2]|0)+160>>2]|0)+(a<<2)>>2]|0)+(d<<3)>>3]=+(c[(c[f>>2]|0)+(d<<2)>>2]|0);d=d+1|0}a=a+1|0}l6(c[i>>2]|0);l6(i);Zr(g);l=j;return}function wm(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0.0;f=a+16|0;d=gC(a)|0;while(1){if(!d)break;b=UA(a,d)|0;while(1){if(!b)break;g=c[b>>2]&3;e=(c[c[((g|0)==3?b:b+48|0)+40>>2]>>2]|0)>>>4;g=(c[c[((g|0)==2?b:b+-48|0)+40>>2]>>2]|0)>>>4;if((e|0)!=(g|0)){j=+h[(c[b+16>>2]|0)+136>>3];i=c[(c[f>>2]|0)+160>>2]|0;h[(c[i+(g<<2)>>2]|0)+(e<<3)>>3]=j;h[(c[i+(e<<2)>>2]|0)+(g<<3)>>3]=j}b=WA(a,b)|0}d=hC(a,d)|0}return}function xm(a,b,d,e,f,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0;j=rB(a)|0;H=TL()|0;if((f|0)==2){k=0;E=0}else{E=DA(a,2,92794,0)|0;k=(c[47236]|0)!=0&1;E=(E|0)!=0}B=(e|1|0)==3;F=IK(b*20|0)|0;G=IK(b<<2)|0;l=(j<<1)+b<<2;m=IK(l)|0;A=B|E;if(A)f=IK(l)|0;else f=0;D=(k|0)!=0;if(D)j=IK(l)|0;else j=0;if(B)k=IK(l)|0;else k=0;l=0;y=gC(a)|0;z=0;while(1){if(!y)break;WL(H);if((c[(c[y+16>>2]|0)+120>>2]|0)!=(z|0)){C=12;break}c[G+(z<<2)>>2]=y;v=F+(z*20|0)+4|0;c[v>>2]=m;w=F+(z*20|0)+8|0;c[w>>2]=A?f:0;x=F+(z*20|0)+12|0;c[x>>2]=D?j:0;c[F+(z*20|0)+16>>2]=B?k:0;s=1;u=ZA(a,y)|0;t=1;r=l;m=m+4|0;f=A?f+4|0:f;j=D?j+4|0:j;k=B?k+4|0:k;while(1){if(!u)break;p=c[u>>2]&3;q=u+-48|0;l=u+48|0;do if((c[((p|0)==2?u:q)+40>>2]|0)==(c[((p|0)==3?u:l)+40>>2]|0)){n=s;p=t;l=r}else{n=ym(H,u,s)|0;p=u+16|0;if((n|0)!=(s|0)){if(D){q=(c[x>>2]|0)+(n<<2)|0;g[q>>2]=+h[(c[p>>2]|0)+128>>3]+ +g[q>>2]}if(!E){n=s;p=t;l=r;break}n=(c[w>>2]|0)+(n<<2)|0;I=+h[(c[p>>2]|0)+136>>3];o=+(~~+g[n>>2]|0);g[n>>2]=I>o?I:o;n=s;p=t;l=r;break}J=c[u>>2]&3;l=(J|0)==3?u:l;r=r+1|0;n=s+1|0;s=m+4|0;c[m>>2]=c[(c[(c[((c[l+40>>2]|0)==(y|0)?((J|0)==2?u:q):l)+40>>2]|0)+16>>2]|0)+120>>2];if(D){g[j>>2]=+h[(c[p>>2]|0)+128>>3];j=j+4|0}m=f+4|0;if(E){g[f>>2]=+h[(c[p>>2]|0)+136>>3];if(B)C=27;else f=m}else if(B){g[f>>2]=1.0;C=27}if((C|0)==27){C=0;f=NA(u,101860)|0;l=k+4|0;if((f|0)!=0?(h2(f,136010,4)|0)==0:0)o=0.0;else o=(y|0)==(c[((c[u>>2]&3|0)==2?u:q)+40>>2]|0)?1.0:-1.0;g[k>>2]=o;f=m;k=l}p=t+1|0;l=r;m=s}while(0);s=n;u=_A(a,u,y)|0;t=p;r=l}c[F+(z*20|0)>>2]=t;c[c[v>>2]>>2]=z;l=r;y=hC(a,y)|0;z=z+1|0}if((C|0)==12)Aa(89375,89390,819,89402);if(B)zm(F,b,e,G);n=(l|0)/2|0;a:do if((n|0)!=(rB(a)|0)){l=(n<<1)+b<<2;k=KK(c[F+4>>2]|0,l)|0;if(E)f=KK(c[F+8>>2]|0,l)|0;if(D){m=0;j=KK(c[F+12>>2]|0,l)|0}else m=0;while(1){if((m|0)>=(b|0))break a;l=c[F+(m*20|0)>>2]|0;c[F+(m*20|0)+4>>2]=k;if(E){c[F+(m*20|0)+8>>2]=f;f=f+(l<<2)|0}if(D){c[F+(m*20|0)+12>>2]=j;j=j+(l<<2)|0}m=m+1|0;k=k+(l<<2)|0}}while(0);c[d>>2]=n;if(!i)l6(G);else c[i>>2]=G;XL(H);return F|0}function ym(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=c[b>>2]&3;e=c[(c[(c[((f|0)==3?b:b+48|0)+40>>2]|0)+16>>2]|0)+120>>2]|0;b=c[(c[(c[((f|0)==2?b:b+-48|0)+40>>2]|0)+16>>2]|0)+120>>2]|0;f=(e|0)>(b|0);return YL(a,f?b:e,f?e:b,d)|0}function zm(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=0;while(1){if((g|0)>=(d|0)){g=0;break}h=c[(c[f+(g<<2)>>2]|0)+16>>2]|0;a[h+157>>0]=0;a[h+158>>0]=0;g=g+1|0}while(1){if((g|0)>=(d|0))break;if(!(a[(c[(c[f+(g<<2)>>2]|0)+16>>2]|0)+157>>0]|0))Am(b,g,e,f);g=g+1|0}return}function Am(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0;q=(c[f+(d<<2)>>2]|0)+16|0;l=c[q>>2]|0;a[l+157>>0]=1;a[l+158>>0]=1;l=b+(d*20|0)|0;m=b+(d*20|0)+16|0;n=b+(d*20|0)+4|0;o=(e|0)==3?-1.0:1.0;k=1;a:while(1){if((k|0)>=(c[l>>2]|0)){h=14;break}h=(c[m>>2]|0)+(k<<2)|0;do if(!(+g[h>>2]==1.0)){p=c[(c[n>>2]|0)+(k<<2)>>2]|0;i=c[(c[f+(p<<2)>>2]|0)+16>>2]|0;if(!(a[i+158>>0]|0)){if(a[i+157>>0]|0)break;Am(b,p,e,f);break}g[h>>2]=o;i=c[b+(p*20|0)>>2]|0;j=b+(p*20|0)+4|0;h=1;while(1){if((h|0)>=(i|0)){h=9;break a}if((c[(c[j>>2]|0)+(h<<2)>>2]|0)==(d|0))break;h=h+1|0}g[(c[b+(p*20|0)+16>>2]|0)+(h<<2)>>2]=-1.0}while(0);k=k+1|0}if((h|0)==9)Aa(89416,89390,721,89436);else if((h|0)==14){a[(c[q>>2]|0)+158>>0]=0;return}}function Bm(a){a=a|0;var b=0,d=0;d=l;l=l+16|0;b=d;a=XO(a,DA(a,0,89577,0)|0,2,0)|0;if((a|0)==0|(a|0)>2){c[b>>2]=89577;dA(0,89586,b)|0;a=2}l=d;return a|0}function Cm(a){a=a|0;var b=0,d=0,e=0;d=qB(a)|0;c[46838]=DA(a,1,102924,0)|0;e=DA(a,1,90961,0)|0;b=gC(a)|0;while(1){if(!b)break;Wl(b);Xl(c[46838]|0,e,b,d)|0;b=hC(a,b)|0}d=gC(a)|0;while(1){if(!d)break;b=UA(a,d)|0;while(1){if(!b)break;Dm(b);b=WA(a,b)|0}d=hC(a,d)|0}return}function Dm(a){a=a|0;var b=0.0;RC(a,137763,176,1)|0;rP(a)|0;b=+YO(a,c[47236]|0,1.0,1.0);h[(c[a+16>>2]|0)+128>>3]=b;return}function Em(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0;a=HK(64)|0;e=a+8|0;f=d+8|0;g=e+48|0;do{c[e>>2]=c[f>>2];e=e+4|0;f=f+4|0}while((e|0)<(g|0));d=c[d+56>>2]|0;c[a+56>>2]=d;b[(c[d+16>>2]|0)+168>>1]=1;return a|0}function Fm(a,b,c){a=a|0;b=b|0;c=c|0;l6(b);return}function Gm(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;a=c[b>>2]|0;e=c[d>>2]|0;if(a>>>0<=e>>>0)if(a>>>0>=e>>>0){e=c[b+24>>2]|0;a=c[d+24>>2]|0;if(e>>>0<=a>>>0)if(e>>>0>=a>>>0){a=~~(+h[b+8>>3]-+h[d+8>>3]);if(!a){a=~~(+h[b+16>>3]-+h[d+16>>3]);if(!a){a=~~(+h[b+32>>3]-+h[d+32>>3]);if(!a)a=~~(+h[b+40>>3]-+h[d+40>>3])}}}else a=-1;else a=1}else a=-1;else a=1;return a|0}function Hm(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0.0,j=0,k=0,m=0;k=l;l=l+16|0;g=k;h=e+16|0;m=b[(c[h>>2]|0)+168>>1]|0;j=m<<16>>16;i=+(f|0);if(m<<16>>16!=1&(a[195236]|0)==0){h=IK(j<<2)|0;f=0;while(1){if((f|0)>=(j|0))break;c[h+(f<<2)>>2]=e;e=c[(c[e+16>>2]|0)+172>>2]|0;f=f+1|0}jO(d,h,0,j,i,i,17832);e=0;while(1){if((e|0)>=(j|0))break;f=c[h+(e<<2)>>2]|0;g=f+16|0;if(c[(c[g>>2]|0)+96>>2]|0){m=uC(c[((c[f>>2]&3|0)==3?f:f+48|0)+40>>2]|0)|0;xP(m,c[(c[g>>2]|0)+96>>2]|0)}qO(f);e=e+1|0}l6(h)}else{c[g>>2]=e;jO(d,g,0,1,i,i,17832);if(c[(c[h>>2]|0)+96>>2]|0){m=uC(c[((c[e>>2]&3|0)==3?e:e+48|0)+40>>2]|0)|0;xP(m,c[(c[h>>2]|0)+96>>2]|0)}qO(e)}l=k;return}function Im(a){a=a|0;return 0}function Jm(a){a=a|0;return 0}function Km(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,H=0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0,Q=0,R=0.0,S=0,T=0,U=0;U=l;l=l+384|0;P=U+368|0;Q=U+112|0;y=U+32|0;q=U+336|0;D=U+320|0;E=U+304|0;F=U+288|0;H=U+272|0;z=U+256|0;A=U+240|0;B=U+224|0;C=U+208|0;i=U+192|0;r=U+176|0;s=U+160|0;t=U+144|0;u=U+128|0;v=U+96|0;w=U+16|0;x=U;S=d+4|0;T=b+16|0;a:do switch(UM(b)|0){case 3:case 1:{b=HK(8)|0;f=c[T>>2]|0;i=c[f+12>>2]|0;do if(!(e<<24>>24)){f=c[i+8>>2]|0;if((f|0)>2){R=0.0;y=c[i+44>>2]|0;q=0;K=+g[d>>2];L=+g[S>>2];break}else{R=+S4()*.01;f=8;y=0;q=1;K=0.0;L=0.0;break}}else if(!(c[i+40>>2]&2048)){L=+h[f+88>>3];K=-L;R=+h[f+80>>3];O=R*-.5;h[y>>3]=K;h[y+8>>3]=O;h[y+16>>3]=L;h[y+24>>3]=O;R=R*.5;h[y+32>>3]=L;h[y+40>>3]=R;h[y+48>>3]=K;h[y+56>>3]=R;R=0.0;f=4;q=0;K=0.0;L=0.0;break}else{wP(q,i);K=+h[q>>3];O=+h[q+8>>3];L=+h[q+16>>3];R=+h[q+24>>3];h[y>>3]=K;h[y+8>>3]=O;h[y+16>>3]=L;h[y+24>>3]=O;h[y+32>>3]=L;h[y+40>>3]=R;h[y+48>>3]=K;h[y+56>>3]=R;R=0.0;f=4;q=0;K=0.0;L=0.0;break}while(0);c[b+4>>2]=f;r=HK(f<<4)|0;c[b>>2]=r;s=d+8|0;M=+(f|0);t=(f|0)==4;N=-K;O=-L;e=0;while(1){if((f|0)<=(e|0))break a;i=(a[s>>0]|0)!=0;u=c[T>>2]|0;do if(q){k=R+ +(e|0)*6.283185307179586/M;o=+I(+k);k=+J(+k);p=+g[d>>2];m=+g[S>>2];j=+h[u+80>>3];n=+h[u+96>>3]+ +h[u+88>>3];if(i){k=k*(m+j);j=o*(p+n)}else{k=k*m*j;j=o*p*n}m=j*.5;j=k*.5}else{n=+h[y+(e<<4)+8>>3];m=+h[y+(e<<4)>>3];if(!i){m=K*m;j=L*n;break}if(!t){j=+G(+(n*n+m*m));m=m*(K/j+1.0);j=n*(L/j+1.0);break}switch(e|0){case 0:{k=L;j=K;break}case 1:{k=L;j=N;break}case 2:{k=O;j=N;break}case 3:{k=O;j=K;break}default:{k=0.0;j=0.0}}m=m+j;j=n+k}while(0);Q=f-e+-1|0;h[r+(Q<<4)>>3]=m+ +h[u+16>>3];h[r+(Q<<4)+8>>3]=j+ +h[u+24>>3];e=e+1|0}}case 2:{b=c[(c[T>>2]|0)+12>>2]|0;j=+h[b+16>>3];n=+h[b+24>>3];k=+h[b+32>>3];m=+h[b+40>>3];b=HK(8)|0;c[b+4>>2]=4;f=HK(64)|0;c[b>>2]=f;T=(c[T>>2]|0)+16|0;c[Q>>2]=c[T>>2];c[Q+4>>2]=c[T+4>>2];c[Q+8>>2]=c[T+8>>2];c[Q+12>>2]=c[T+12>>2];if(!(a[d+8>>0]|0)){c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Mm(z,j,n,P,d);c[f>>2]=c[z>>2];c[f+4>>2]=c[z+4>>2];c[f+8>>2]=c[z+8>>2];c[f+12>>2]=c[z+12>>2];T=(c[b>>2]|0)+16|0;c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Mm(A,j,m,P,d);c[T>>2]=c[A>>2];c[T+4>>2]=c[A+4>>2];c[T+8>>2]=c[A+8>>2];c[T+12>>2]=c[A+12>>2];T=(c[b>>2]|0)+32|0;c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Mm(B,k,m,P,d);c[T>>2]=c[B>>2];c[T+4>>2]=c[B+4>>2];c[T+8>>2]=c[B+8>>2];c[T+12>>2]=c[B+12>>2];T=(c[b>>2]|0)+48|0;c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Mm(C,k,n,P,d);c[T>>2]=c[C>>2];c[T+4>>2]=c[C+4>>2];c[T+8>>2]=c[C+8>>2];c[T+12>>2]=c[C+12>>2];break a}else{R=j-+g[d>>2];O=n-+g[S>>2];c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Lm(D,R,O,P);c[f>>2]=c[D>>2];c[f+4>>2]=c[D+4>>2];c[f+8>>2]=c[D+8>>2];c[f+12>>2]=c[D+12>>2];T=(c[b>>2]|0)+16|0;O=j-+g[d>>2];R=m+ +g[S>>2];c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Lm(E,O,R,P);c[T>>2]=c[E>>2];c[T+4>>2]=c[E+4>>2];c[T+8>>2]=c[E+8>>2];c[T+12>>2]=c[E+12>>2];T=(c[b>>2]|0)+32|0;R=k+ +g[d>>2];O=m+ +g[S>>2];c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Lm(F,R,O,P);c[T>>2]=c[F>>2];c[T+4>>2]=c[F+4>>2];c[T+8>>2]=c[F+8>>2];c[T+12>>2]=c[F+12>>2];T=(c[b>>2]|0)+48|0;O=k+ +g[d>>2];R=n-+g[S>>2];c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Lm(H,O,R,P);c[T>>2]=c[H>>2];c[T+4>>2]=c[H+4>>2];c[T+8>>2]=c[H+8>>2];c[T+12>>2]=c[H+12>>2];break a}}case 4:{b=HK(8)|0;c[b+4>>2]=4;f=HK(64)|0;c[b>>2]=f;H=c[T>>2]|0;F=H+16|0;c[Q>>2]=c[F>>2];c[Q+4>>2]=c[F+4>>2];c[Q+8>>2]=c[F+8>>2];c[Q+12>>2]=c[F+12>>2];j=-+h[H+88>>3];k=-+h[H+80>>3];if(!(a[d+8>>0]|0)){c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Mm(u,j,k,P,d);c[f>>2]=c[u>>2];c[f+4>>2]=c[u+4>>2];c[f+8>>2]=c[u+8>>2];c[f+12>>2]=c[u+12>>2];S=(c[b>>2]|0)+16|0;H=c[T>>2]|0;O=-+h[H+88>>3];R=+h[H+80>>3];c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Mm(v,O,R,P,d);c[S>>2]=c[v>>2];c[S+4>>2]=c[v+4>>2];c[S+8>>2]=c[v+8>>2];c[S+12>>2]=c[v+12>>2];S=(c[b>>2]|0)+32|0;H=c[T>>2]|0;R=+h[H+96>>3];O=+h[H+80>>3];c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Mm(w,R,O,P,d);c[S>>2]=c[w>>2];c[S+4>>2]=c[w+4>>2];c[S+8>>2]=c[w+8>>2];c[S+12>>2]=c[w+12>>2];S=(c[b>>2]|0)+48|0;T=c[T>>2]|0;O=+h[T+96>>3];R=-+h[T+80>>3];c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Mm(x,O,R,P,d);c[S>>2]=c[x>>2];c[S+4>>2]=c[x+4>>2];c[S+8>>2]=c[x+8>>2];c[S+12>>2]=c[x+12>>2];break a}else{R=j-+g[d>>2];O=k-+g[S>>2];c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Lm(i,R,O,P);c[f>>2]=c[i>>2];c[f+4>>2]=c[i+4>>2];c[f+8>>2]=c[i+8>>2];c[f+12>>2]=c[i+12>>2];H=(c[b>>2]|0)+16|0;F=c[T>>2]|0;O=-+h[F+88>>3]-+g[d>>2];R=+h[F+80>>3]+ +g[S>>2];c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Lm(r,O,R,P);c[H>>2]=c[r>>2];c[H+4>>2]=c[r+4>>2];c[H+8>>2]=c[r+8>>2];c[H+12>>2]=c[r+12>>2];H=(c[b>>2]|0)+32|0;F=c[T>>2]|0;R=+h[F+96>>3]+ +g[d>>2];O=+h[F+80>>3]+ +g[S>>2];c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Lm(s,R,O,P);c[H>>2]=c[s>>2];c[H+4>>2]=c[s+4>>2];c[H+8>>2]=c[s+8>>2];c[H+12>>2]=c[s+12>>2];H=(c[b>>2]|0)+48|0;T=c[T>>2]|0;O=+h[T+96>>3]+ +g[d>>2];R=-+h[T+80>>3]-+g[S>>2];c[P>>2]=c[Q>>2];c[P+4>>2]=c[Q+4>>2];c[P+8>>2]=c[Q+8>>2];c[P+12>>2]=c[Q+12>>2];Lm(t,O,R,P);c[H>>2]=c[t>>2];c[H+4>>2]=c[t+4>>2];c[H+8>>2]=c[t+8>>2];c[H+12>>2]=c[t+12>>2];break a}}default:b=0}while(0);l=U;return b|0}function Lm(a,b,c,d){a=a|0;b=+b;c=+c;d=d|0;c=+h[d+8>>3]+c;h[a>>3]=+h[d>>3]+b;h[a+8>>3]=c;return}function Mm(a,b,c,d,e){a=a|0;b=+b;c=+c;d=d|0;e=e|0;c=+h[d+8>>3]+ +g[e+4>>2]*c;h[a>>3]=+h[d>>3]+ +g[e>>2]*b;h[a+8>>3]=c;return}function Nm(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;o=l;l=l+112|0;j=o+88|0;i=o+72|0;k=o+32|0;m=o+16|0;n=o;f=o+56|0;g=o+40|0;h=b+48|0;r=(c[(c[((c[b>>2]&3|0)==3?b:h)+40>>2]|0)+16>>2]|0)+16|0;p=b+16|0;q=(c[p>>2]|0)+16|0;c[i>>2]=c[r>>2];c[i+4>>2]=c[r+4>>2];c[i+8>>2]=c[r+8>>2];c[i+12>>2]=c[r+12>>2];c[j>>2]=c[q>>2];c[j+4>>2]=c[q+4>>2];c[j+8>>2]=c[q+8>>2];c[j+12>>2]=c[q+12>>2];Om(f,i,j);c[m>>2]=c[f>>2];c[m+4>>2]=c[f+4>>2];c[m+8>>2]=c[f+8>>2];c[m+12>>2]=c[f+12>>2];f=b+-48|0;q=(c[(c[((c[b>>2]&3|0)==2?b:f)+40>>2]|0)+16>>2]|0)+16|0;p=(c[p>>2]|0)+56|0;c[i>>2]=c[q>>2];c[i+4>>2]=c[q+4>>2];c[i+8>>2]=c[q+8>>2];c[i+12>>2]=c[q+12>>2];c[j>>2]=c[p>>2];c[j+4>>2]=c[p+4>>2];c[j+8>>2]=c[p+8>>2];c[j+12>>2]=c[p+12>>2];Om(g,i,j);c[n>>2]=c[g>>2];c[n+4>>2]=c[g+4>>2];c[n+8>>2]=c[g+8>>2];c[n+12>>2]=c[g+12>>2];if(!e){g=-1111;f=-1111}else{r=c[b>>2]&3;g=c[(c[(c[((r|0)==2?b:f)+40>>2]|0)+16>>2]|0)+288>>2]|0;f=c[(c[(c[((r|0)==3?b:h)+40>>2]|0)+16>>2]|0)+288>>2]|0};c[i>>2]=c[m>>2];c[i+4>>2]=c[m+4>>2];c[i+8>>2]=c[m+8>>2];c[i+12>>2]=c[m+12>>2];c[j>>2]=c[n>>2];c[j+4>>2]=c[n+4>>2];c[j+8>>2]=c[n+8>>2];c[j+12>>2]=c[n+12>>2];KX(d,i,f,j,g,k)|0;p=k;q=c[p+4>>2]|0;r=a;c[r>>2]=c[p>>2];c[r+4>>2]=q;l=o;return}function Om(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=+h[b+8>>3]+ +h[c+8>>3];h[a>>3]=+h[b>>3]+ +h[c>>3];h[a+8>>3]=d;return}function Pm(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=l;l=l+144|0;r=w+104|0;s=w+88|0;q=w+80|0;p=w+72|0;m=w+64|0;u=w+128|0;o=w+32|0;n=w+124|0;v=w+16|0;t=w;k=w+120|0;j=(c[b+16>>2]|0)+144|0;i=c[j>>2]|0;j=c[j+4>>2]|0;h=m;c[h>>2]=i;c[h+4>>2]=j;h=i;c[v>>2]=c[h>>2];c[v+4>>2]=c[h+4>>2];c[v+8>>2]=c[h+8>>2];c[v+12>>2]=c[h+12>>2];j=i+(j+-1<<4)|0;c[t>>2]=c[j>>2];c[t+4>>2]=c[j+4>>2];c[t+8>>2]=c[j+8>>2];c[t+12>>2]=c[j+12>>2];a:do if(!(g<<24>>24)){h=-1111;g=-1111}else{h=-1111;g=-1111;j=0;while(1){if((j|0)>=(f|0))break a;i=e+(j<<2)|0;if((g|0)==-1111){g=c[i>>2]|0;c[s>>2]=c[g>>2];c[s+4>>2]=c[g+4>>2];c[r>>2]=c[v>>2];c[r+4>>2]=c[v+4>>2];c[r+8>>2]=c[v+8>>2];c[r+12>>2]=c[v+12>>2];g=(LX(s,r)|0)==0;g=g?-1111:j}if((h|0)==-1111){h=c[i>>2]|0;c[s>>2]=c[h>>2];c[s+4>>2]=c[h+4>>2];c[r>>2]=c[t>>2];c[r+4>>2]=c[t+4>>2];c[r+8>>2]=c[t+8>>2];c[r+12>>2]=c[t+12>>2];h=(LX(s,r)|0)==0;h=h?-1111:j}j=j+1|0}}while(0);Qm(e,f,g,h,k,n);c[o>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[o+16>>2]=0;c[o+20>>2]=0;c[o+24>>2]=0;c[o+28>>2]=0;h=c[k>>2]|0;n=c[n>>2]|0;c[r>>2]=c[m>>2];c[r+4>>2]=c[m+4>>2];g=b+48|0;if((MX(h,n,r,o,u)|0)<0){u=HB(c[((c[b>>2]&3|0)==3?b:g)+40>>2]|0)|0;v=HB(c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)|0;c[p>>2]=u;c[p+4>>2]=v;dA(1,89929,p)|0}else{if((d[195234]|0)>1){p=c[15715]|0;n=HB(c[((c[b>>2]&3|0)==3?b:g)+40>>2]|0)|0;g=b+-48|0;o=HB(c[((c[b>>2]&3|0)==2?b:g)+40>>2]|0)|0;c[q>>2]=n;c[q+4>>2]=o;z4(p,89977,q)|0}else g=b+-48|0;bO(b,c[((c[b>>2]&3|0)==2?b:g)+40>>2]|0,c[u>>2]|0,c[u+4>>2]|0,17832);l6(h);c[s>>2]=c[v>>2];c[s+4>>2]=c[v+4>>2];c[s+8>>2]=c[v+8>>2];c[s+12>>2]=c[v+12>>2];c[r>>2]=c[t>>2];c[r+4>>2]=c[t+4>>2];c[r+8>>2]=c[t+8>>2];c[r+12>>2]=c[t+12>>2];wO(a,b,s,r)}l=w;return}function Qm(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;i=0;h=0;while(1){if((i|0)>=(b|0))break;if(!((i|0)==(d|0)|(i|0)==(e|0)))h=(c[(c[a+(i<<2)>>2]|0)+4>>2]|0)+h|0;i=i+1|0}o=IK(h<<5)|0;i=0;n=0;while(1){if((n|0)>=(b|0))break;a:do if(!((n|0)==(d|0)|(n|0)==(e|0))){m=a+(n<<2)|0;l=0;while(1){j=c[m>>2]|0;k=c[j+4>>2]|0;if((l|0)>=(k|0))break a;p=l+1|0;q=o+(i<<5)|0;j=(c[j>>2]|0)+(l<<4)|0;c[q>>2]=c[j>>2];c[q+4>>2]=c[j+4>>2];c[q+8>>2]=c[j+8>>2];c[q+12>>2]=c[j+12>>2];j=o+(i<<5)+16|0;k=(c[c[m>>2]>>2]|0)+(((p|0)<(k|0)?p:0)<<4)|0;c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];l=p;i=i+1|0}}while(0);n=n+1|0}if((i|0)==(h|0)){c[f>>2]=o;c[g>>2]=h;return}else Aa(89991,89998,77,90013)}function Rm(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;o=l;l=l+32|0;m=o+12|0;f=o;mr(f,a);c[m>>2]=c[f>>2];c[m+4>>2]=c[f+4>>2];c[m+8>>2]=c[f+8>>2];f=gC(a)|0;while(1){if(!f)break;g=UA(a,f)|0;while(1){if(!g)break;XN(g);g=WA(a,g)|0}f=hC(a,f)|0}h=Sz(17796,c[4591]|0)|0;f=gC(a)|0;while(1){if(!f)break;g=UA(a,f)|0;while(1){if(!g)break;i=g+16|0;if((c[47180]|0)>1?(j=c[i>>2]|0,(c[j+8>>2]|0)!=0):0){p=j+168|0;b[p>>1]=(b[p>>1]|0)+1<<16>>16}else n=14;if((n|0)==14?(n=0,k=Sm(h,g)|0,(k|0)!=(g|0)):0){p=c[k+16>>2]|0;q=p+168|0;b[q>>1]=(b[q>>1]|0)+1<<16>>16;p=p+172|0;c[(c[i>>2]|0)+172>>2]=c[p>>2];c[p>>2]=g}g=WA(a,g)|0}f=hC(a,f)|0}Oz(h)|0;if(!(eb[d&63](a,m,e)|0)){c[47185]=1;f=0}else f=1;l=o;return f|0}function Sm(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0,g=0.0,i=0,j=0,k=0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0,s=0,t=0;t=l;l=l+64|0;s=t;e=c[b>>2]&3;k=c[((e|0)==3?b:b+48|0)+40>>2]|0;e=c[((e|0)==2?b:b+-48|0)+40>>2]|0;j=c[b+16>>2]|0;o=j+24|0;f=j+56|0;i=j+64|0;j=j+16|0;do if(k>>>0>=e>>>0){if(k>>>0>e>>>0){r=e;e=k;p=+h[j>>3];q=+h[o>>3];g=+h[f>>3];d=+h[i>>3];break}m=+h[f>>3];n=+h[i>>3];g=+h[j>>3];d=+h[o>>3];if(!(gm)){f=d>n;if(d>3];q=+h[i>>3];g=+h[j>>3];d=+h[o>>3]}while(0);c[s+8>>2]=r;h[s+16>>3]=g;h[s+24>>3]=d;c[s+32>>2]=e;h[s+40>>3]=p;h[s+48>>3]=q;c[s+56>>2]=b;s=c[(eb[c[a>>2]&63](a,s,1)|0)+56>>2]|0;l=t;return s|0}function Tm(a,b){a=a|0;b=b|0;return Rm(a,24,b)|0}function Um(d,e,f){d=d|0;e=e|0;f=f|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0;G=l;l=l+112|0;C=G+88|0;B=G+72|0;t=G+56|0;p=G+24|0;o=G;u=G+64|0;D=G+40|0;E=G+8|0;i=(c[47180]|0)>1&1;s=(f|0)==8;do if((f|0)>5){r=HK((qB(d)|0)<<2)|0;n=s&1;m=gC(d)|0;q=0;while(1){if(!m)break;j=Km(m,e,n)|0;k=(c[m+16>>2]|0)+288|0;if(!j){c[k>>2]=-1111;j=q}else{c[k>>2]=q;c[r+(q<<2)>>2]=j;j=q+1|0}m=hC(d,m)|0;q=j}if(r){j=it(r,q)|0;if(j|0){if(s){z=0;A=r;y=r;v=1;break}z=HX(r,q)|0;A=r;y=r;v=1;break}if(s){dA(0,90027,o)|0;j=0;z=0;A=r;y=r;v=1;break}else{H=+g[e+4>>2];h[p>>3]=+g[e>>2];h[p+8>>3]=H;dA(0,90105,p)|0;j=0;z=0;A=r;y=r;v=1;break}}else{j=0;z=0;A=0;y=0;v=0}}else{j=0;z=0;A=0;q=0;y=0;v=0}while(0);w=(f|0)==10;x=(z|0)!=0;j=s&(j|0)!=0;if(a[195234]|0){s=c[15715]|0;c[t>>2]=j|x^1?(j?90187:90204):w?110357:90218;z4(s,90228,t)|0}a:do if(!x){if(j){pQ(d,0);i=1}}else{k=gC(d)|0;while(1){if(!k)break a;j=UA(d,k)|0;while(1){if(!j)break;t=(c[j+16>>2]|0)+144|0;Nm(u,j,z,1,0,0);r=u;s=c[r+4>>2]|0;c[t>>2]=c[r>>2];c[t+4>>2]=s;j=WA(d,j)|0}k=hC(d,k)|0}}while(0);p=(i|0)==0;r=d+60|0;i=0;o=gC(d)|0;j=0;while(1){if(!o)break;s=o+16|0;e=UA(d,o)|0;while(1){if(!e)break;n=c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0;m=e+16|0;k=c[m>>2]|0;if(!p?(c[k+8>>2]|0)!=0:0){u=(c[s>>2]|0)+16|0;t=k+16|0;c[B>>2]=c[u>>2];c[B+4>>2]=c[u+4>>2];c[B+8>>2]=c[u+8>>2];c[B+12>>2]=c[u+12>>2];c[C>>2]=c[t>>2];c[C+4>>2]=c[t+4>>2];c[C+8>>2]=c[t+8>>2];c[C+12>>2]=c[t+12>>2];Om(D,B,C);t=(c[n+16>>2]|0)+16|0;u=(c[m>>2]|0)+56|0;c[B>>2]=c[t>>2];c[B+4>>2]=c[t+4>>2];c[B+8>>2]=c[t+8>>2];c[B+12>>2]=c[t+12>>2];c[C>>2]=c[u>>2];c[C+4>>2]=c[u+4>>2];c[C+8>>2]=c[u+8>>2];c[C+12>>2]=c[u+12>>2];Om(E,B,C);c[B>>2]=c[D>>2];c[B+4>>2]=c[D+4>>2];c[B+8>>2]=c[D+8>>2];c[B+12>>2]=c[D+12>>2];c[C>>2]=c[E>>2];c[C+4>>2]=c[E+4>>2];c[C+8>>2]=c[E+8>>2];c[C+12>>2]=c[E+12>>2];wO(d,e,B,C)}else F=33;b:do if((F|0)==33){F=0;u=b[k+168>>1]|0;k=u<<16>>16;if(u<<16>>16){if((o|0)==(n|0)){if(!i){j=HK(96)|0;c[j+84>>2]=HK(((qB(d)|0)<<5)+11520|0)|0;i=j}Hm(i,e,c[(c[(c[r>>2]|0)+16>>2]|0)+248>>2]|0);break}if(!x){MM(d,e,f,17832);break}k=a[195236]|0?1:k;m=e;n=0;while(1){if((n|0)>=(k|0))break b;if(w)Pm(d,m,A,q,1);else Vm(d,m);m=c[(c[m+16>>2]|0)+172>>2]|0;n=n+1|0}}}while(0);e=WA(d,e)|0}o=hC(d,o)|0}if(x)JX(z);if(i|0){l6(c[i+84>>2]|0);l6(j)}if(v){i=0;while(1){if((i|0)>=(q|0))break;l6(c[A+(i<<2)>>2]|0);i=i+1|0}l6(y)}l=G;return 0}function Vm(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;k=l;l=l+96|0;g=k+64|0;f=k+48|0;e=k+40|0;h=k+80|0;m=k+32|0;i=k+16|0;j=k;n=(c[b+16>>2]|0)+144|0;o=c[n>>2]|0;n=c[n+4>>2]|0;p=m;c[p>>2]=o;c[p+4>>2]=n;p=o;c[i>>2]=c[p>>2];c[i+4>>2]=c[p+4>>2];c[i+8>>2]=c[p+8>>2];c[i+12>>2]=c[p+12>>2];n=o+(n+-1<<4)|0;c[j>>2]=c[n>>2];c[j+4>>2]=c[n+4>>2];c[j+8>>2]=c[n+8>>2];c[j+12>>2]=c[n+12>>2];c[g>>2]=c[m>>2];c[g+4>>2]=c[m+4>>2];DY(g,h);if((d[195234]|0)>1){o=c[15715]|0;m=HB(c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0)|0;p=b+-48|0;n=HB(c[((c[b>>2]&3|0)==2?b:p)+40>>2]|0)|0;c[e>>2]=m;c[e+4>>2]=n;z4(o,90253,e)|0;e=p}else e=b+-48|0;bO(b,c[((c[b>>2]&3|0)==2?b:e)+40>>2]|0,c[h>>2]|0,c[h+4>>2]|0,17832);c[f>>2]=c[i>>2];c[f+4>>2]=c[i+4>>2];c[f+8>>2]=c[i+8>>2];c[f+12>>2]=c[i+12>>2];c[g>>2]=c[j>>2];c[g+4>>2]=c[j+4>>2];c[g+8>>2]=c[j+8>>2];c[g+12>>2]=c[j+12>>2];wO(a,b,f,g);l=k;return}function Wm(a,d){a=a|0;d=d|0;var e=0;e=b[(c[a+16>>2]|0)+136>>1]&14;if(d<<24>>24)Xm(a)|0;if(e<<16>>16)Tm(a,e&65535)|0;return}function Xm(a){a=a|0;var b=0,d=0,e=0,f=0;d=Ym(a)|0;b=gC(a)|0;while(1){if(!b)break;e=c[b+16>>2]|0;f=c[e+132>>2]|0;h[e+16>>3]=+h[f>>3]*72.0;h[e+24>>3]=+h[f+8>>3]*72.0;b=hC(a,b)|0}return d|0}function Ym(a){a=a|0;var b=0,d=0,e=0,f=0.0,g=0.0,i=0.0,j=0,k=0,l=0,m=0;a:do if((c[a+60>>2]|0)==(a|0)?(d=a+16|0,e=c[d>>2]|0,(c[(c[e+8>>2]|0)+84>>2]|0)!=0):0){if(!(+h[e+16>>3]!=0.0)?!(+h[e+24>>3]!=0.0):0)b=0;else{Zm(a);b=1;e=c[d>>2]|0}m=(c[e+116>>2]&1|0)!=0;l=e+40|0;j=e+32|0;if(m){i=+h[j>>3];h[j>>3]=+h[l>>3];h[l>>3]=i}d=c[e+8>>2]|0;e=d+64|0;k=d+72|0;b:do switch(c[d+84>>2]|0){case 2:{f=+h[e>>3];if(f<=0.0)break a;g=f/+h[j>>3];f=+h[k>>3]/+h[l>>3];if(g<1.0|f<1.0)if(g>3];if(f<=0.0)break a;g=f/+h[j>>3];f=+h[k>>3]/+h[l>>3];if(!(g>1.0&f>1.0))break a;f=g>3];f=+h[l>>3]/+h[j>>3];if(f1){d=gC(a)|0;while(1){if(!d)break c;b=UA(a,d)|0;while(1){if(!b)break;if(c[(c[b+16>>2]|0)+8>>2]|0)_m(b,f,g);b=WA(a,b)|0}d=hC(a,d)|0}}while(0);b=gC(a)|0;while(1){if(!b)break;m=c[(c[b+16>>2]|0)+132>>2]|0;h[m>>3]=f*+h[m>>3];m=m+8|0;h[m>>3]=g*+h[m>>3];b=hC(a,b)|0}$m(a,f,g);b=1}else b=0;while(0);return b|0}function Zm(b){b=b|0;var d=0,e=0,f=0.0,g=0.0,i=0.0,j=0.0,k=0,m=0,n=0,o=0;n=l;l=l+32|0;k=n+16|0;m=n;d=(c[b+16>>2]|0)+16|0;c[m>>2]=c[d>>2];c[m+4>>2]=c[d+4>>2];c[m+8>>2]=c[d+8>>2];c[m+12>>2]=c[d+12>>2];f=+h[m>>3];g=f/72.0;i=+h[m+8>>3];j=i/72.0;d=gC(b)|0;while(1){if(!d)break;e=c[d+16>>2]|0;o=c[e+132>>2]|0;h[o>>3]=+h[o>>3]-g;o=o+8|0;h[o>>3]=+h[o>>3]-j;e=c[e+108>>2]|0;if(e|0?a[e+81>>0]|0:0){o=e+56|0;h[o>>3]=+h[o>>3]-f;o=e+64|0;h[o>>3]=+h[o>>3]-i}d=hC(b,d)|0}e=gC(b)|0;while(1){if(!e)break;d=UA(b,e)|0;while(1){if(!d)break;if(c[(c[d+16>>2]|0)+8>>2]|0){c[k>>2]=c[m>>2];c[k+4>>2]=c[m+4>>2];c[k+8>>2]=c[m+8>>2];c[k+12>>2]=c[m+12>>2];an(d,k)}d=WA(b,d)|0}e=hC(b,e)|0}c[k>>2]=c[m>>2];c[k+4>>2]=c[m+4>>2];c[k+8>>2]=c[m+8>>2];c[k+12>>2]=c[m+12>>2];bn(b,k);l=n;return}function _m(b,d,e){b=b|0;d=+d;e=+e;var f=0.0,g=0.0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0;r=c[b>>2]&3;k=c[(c[(c[((r|0)==2?b:b+-48|0)+40>>2]|0)+16>>2]|0)+132>>2]|0;u=d+-1.0;s=u*+h[k>>3]*72.0;v=e+-1.0;t=v*+h[k+8>>3]*72.0;r=c[(c[(c[((r|0)==3?b:b+48|0)+40>>2]|0)+16>>2]|0)+132>>2]|0;u=u*+h[r>>3]*72.0;v=v*+h[r+8>>3]*72.0;r=c[b+16>>2]|0;k=c[r+8>>2]|0;l=c[k+4>>2]|0;m=l+-1|0;b=0;k=c[k>>2]|0;while(1){if((b|0)>=(l|0))break;n=c[k+4>>2]|0;o=(b|0)==(m|0);p=n+-1|0;i=0;j=c[k>>2]|0;while(1){if((i|0)>=(n|0))break;q=j+8|0;f=+h[j>>3];g=+h[q>>3];do if(i|b)if(o&(i|0)==(p|0)){h[j>>3]=s+f;f=t+g;break}else{h[j>>3]=f*d;f=g*e;break}else{h[j>>3]=u+f;f=v+g}while(0);h[q>>3]=f;i=i+1|0;j=j+16|0}if(c[k+8>>2]|0){q=k+16|0;h[q>>3]=u+ +h[q>>3];q=k+24|0;h[q>>3]=v+ +h[q>>3]}if(c[k+12>>2]|0){q=k+32|0;h[q>>3]=s+ +h[q>>3];q=k+40|0;h[q>>3]=t+ +h[q>>3]}b=b+1|0;k=k+48|0}b=c[r+96>>2]|0;if(b|0?a[b+81>>0]|0:0){q=b+56|0;h[q>>3]=+h[q>>3]*d;q=b+64|0;h[q>>3]=+h[q>>3]*e}b=c[r+100>>2]|0;if(b|0?a[b+81>>0]|0:0){q=b+56|0;h[q>>3]=s+ +h[q>>3];q=b+64|0;h[q>>3]=t+ +h[q>>3]}b=c[r+104>>2]|0;if(b|0?a[b+81>>0]|0:0){r=b+56|0;h[r>>3]=u+ +h[r>>3];r=b+64|0;h[r>>3]=v+ +h[r>>3]}return}function $m(b,d,e){b=b|0;d=+d;e=+e;var f=0,g=0,i=0;i=b+16|0;g=c[i>>2]|0;b=g+32|0;h[b>>3]=+h[b>>3]*d;b=g+40|0;h[b>>3]=+h[b>>3]*e;b=g+16|0;h[b>>3]=+h[b>>3]*d;b=g+24|0;h[b>>3]=+h[b>>3]*e;b=c[g+12>>2]|0;if((b|0)!=0?(a[b+81>>0]|0)!=0:0){f=b+56|0;h[f>>3]=+h[f>>3]*d;f=b+64|0;h[f>>3]=+h[f>>3]*e;f=1;b=g}else{f=1;b=g}while(1){if((f|0)>(c[b+180>>2]|0))break;$m(c[(c[b+184>>2]|0)+(f<<2)>>2]|0,d,e);f=f+1|0;b=c[i>>2]|0}return}function an(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0;k=c[b+16>>2]|0;b=c[k+8>>2]|0;j=c[b+4>>2]|0;l=d+8|0;b=c[b>>2]|0;g=0;while(1){if((g|0)>=(j|0))break;i=c[b+4>>2]|0;e=c[b>>2]|0;f=0;while(1){if((f|0)>=(i|0))break;h[e>>3]=+h[e>>3]-+h[d>>3];m=e+8|0;h[m>>3]=+h[m>>3]-+h[l>>3];e=e+16|0;f=f+1|0}if(c[b+8>>2]|0){m=b+16|0;h[m>>3]=+h[m>>3]-+h[d>>3];m=b+24|0;h[m>>3]=+h[m>>3]-+h[l>>3]}if(c[b+12>>2]|0){m=b+32|0;h[m>>3]=+h[m>>3]-+h[d>>3];m=b+40|0;h[m>>3]=+h[m>>3]-+h[l>>3]}b=b+48|0;g=g+1|0}b=c[k+96>>2]|0;if(b|0?a[b+81>>0]|0:0){m=b+56|0;h[m>>3]=+h[m>>3]-+h[d>>3];m=b+64|0;h[m>>3]=+h[m>>3]-+h[l>>3]}b=c[k+108>>2]|0;if(b|0?a[b+81>>0]|0:0){m=b+56|0;h[m>>3]=+h[m>>3]-+h[d>>3];m=b+64|0;h[m>>3]=+h[m>>3]-+h[l>>3]}b=c[k+100>>2]|0;if(b|0?a[b+81>>0]|0:0){m=b+56|0;h[m>>3]=+h[m>>3]-+h[d>>3];m=b+64|0;h[m>>3]=+h[m>>3]-+h[l>>3]}b=c[k+104>>2]|0;if(b|0?a[b+81>>0]|0:0){m=b+56|0;h[m>>3]=+h[m>>3]-+h[d>>3];m=b+64|0;h[m>>3]=+h[m>>3]-+h[l>>3]}return}function bn(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0.0,i=0,j=0,k=0,m=0;k=l;l=l+16|0;j=k;g=+h[d>>3];i=b+16|0;b=c[i>>2]|0;e=b+32|0;h[e>>3]=+h[e>>3]-g;f=+h[d+8>>3];e=b+40|0;h[e>>3]=+h[e>>3]-f;e=b+16|0;h[e>>3]=+h[e>>3]-g;e=b+24|0;h[e>>3]=+h[e>>3]-f;e=c[b+12>>2]|0;if((e|0)!=0?(a[e+81>>0]|0)!=0:0){m=e+56|0;h[m>>3]=+h[m>>3]-g;e=e+64|0;h[e>>3]=+h[e>>3]-f;e=1}else e=1;while(1){if((e|0)>(c[b+180>>2]|0))break;m=c[(c[b+184>>2]|0)+(e<<2)>>2]|0;c[j>>2]=c[d>>2];c[j+4>>2]=c[d+4>>2];c[j+8>>2]=c[d+8>>2];c[j+12>>2]=c[d+12>>2];bn(m,j);e=e+1|0;b=c[i>>2]|0}l=k;return}function cn(a){a=a|0;var b=0,d=0,e=0,f=0.0,g=0.0,i=0,j=0;i=l;l=l+16|0;d=i;zP(a);e=a+16|0;b=c[e>>2]|0;f=+h[b+16>>3]/72.0;g=+h[b+24>>3]/72.0;b=gC(a)|0;while(1){if(!b)break;j=c[(c[b+16>>2]|0)+132>>2]|0;h[j>>3]=+h[j>>3]-f;j=j+8|0;h[j>>3]=+h[j>>3]-g;b=hC(a,b)|0}j=(c[e>>2]|0)+16|0;c[d>>2]=c[j>>2];c[d+4>>2]=c[j+4>>2];c[d+8>>2]=c[j+8>>2];c[d+12>>2]=c[j+12>>2];dn(a,d);Wm(a,1);l=i;return}function dn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0.0,j=0.0;g=l;l=l+16|0;f=g;d=a+16|0;a=1;while(1){e=c[d>>2]|0;if((a|0)>(c[e+180>>2]|0))break;e=c[(c[e+184>>2]|0)+(a<<2)>>2]|0;c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];dn(e,f);a=a+1|0}j=+h[b>>3];f=e+32|0;h[f>>3]=+h[f>>3]-j;i=+h[b+8>>3];b=e+40|0;h[b>>3]=+h[b>>3]-i;b=e+16|0;h[b>>3]=+h[b>>3]-j;b=e+24|0;h[b>>3]=+h[b>>3]-i;l=g;return}function en(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0;p=(e|0)>2;n=0;o=0;j=c[f+4>>2]|0;b=c[f>>2]|0;while(1){if((o|0)>=(d|0)){b=0;break}i=c[(c[g+(o<<2)>>2]|0)+16>>2]|0;l=a[i+119>>0]|0;a:do if(!(l<<24>>24)){k=b+8|0;h[b>>3]=+S4();i=j+8|0;h[j>>3]=+S4();if(p){b=2;while(1){if((b|0)==(e|0)){j=n;b=k;break a}q=+S4();h[(c[f+(b<<2)>>2]|0)+(o<<3)>>3]=q;b=b+1|0}}else{j=n;b=k}}else{k=c[i+132>>2]|0;m=b+8|0;h[b>>3]=+h[k>>3];i=j+8|0;h[j>>3]=+h[k+8>>3];b:do if(p){j=2;b=k+16|0;while(1){if((j|0)==(e|0))break b;h[(c[f+(j<<2)>>2]|0)+(o<<3)>>3]=+h[b>>3];j=j+1|0;b=b+8|0}}while(0);j=(l&255)>1?1:n;b=m}while(0);n=j;o=o+1|0;j=i}while(1){if((b|0)>=(e|0))break;Et(d,c[f+(b<<2)>>2]|0);b=b+1|0}return n|0}function fn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,i=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0;d=HK(((S(b+1|0,b)|0)/2|0)<<2)|0;n=rn(b,b,0.0)|0;o=rn(b,b,0.0)|0;a:do if(!(c[a+8>>2]|0)){e=0;while(1){if((e|0)>=(b|0))break a;i=c[a+(e*20|0)>>2]|0;j=a+(e*20|0)+4|0;k=n+(e<<2)|0;f=1;while(1){if((f|0)>=(i|0))break;m=c[(c[j>>2]|0)+(f<<2)>>2]|0;h[(c[n+(m<<2)>>2]|0)+(e<<3)>>3]=-1.0;h[(c[k>>2]|0)+(m<<3)>>3]=-1.0;f=f+1|0}e=e+1|0}}else{e=0;while(1){if((e|0)>=(b|0))break a;i=c[a+(e*20|0)>>2]|0;j=a+(e*20|0)+4|0;k=a+(e*20|0)+8|0;m=n+(e<<2)|0;f=1;while(1){if((f|0)>=(i|0))break;p=c[(c[j>>2]|0)+(f<<2)>>2]|0;l=-1.0/+g[(c[k>>2]|0)+(f<<2)>>2];h[(c[n+(p<<2)>>2]|0)+(e<<3)>>3]=l;h[(c[m>>2]|0)+(p<<3)>>3]=l;f=f+1|0}e=e+1|0}}while(0);b:do if(!(tr(b,n,o)|0)){l6(d);d=0}else{f=0;j=0;m=b;while(1){if((j|0)>=(b|0))break b;k=o+(j<<2)|0;e=j;i=f;while(1){if((e|0)==(b|0))break;if((j|0)==(e|0))l=0.0;else{p=c[k>>2]|0;l=+h[p+(j<<3)>>3]+ +h[(c[o+(e<<2)>>2]|0)+(e<<3)>>3]-+h[p+(e<<3)>>3]*2.0}g[d+(i<<2)>>2]=l;e=e+1|0;i=i+1|0}f=f+m|0;j=j+1|0;m=m+-1|0}}while(0);sn(n);sn(o);return d|0}function gn(b,d){b=b|0;d=d|0;var e=0,f=0,i=0.0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0;s=l;l=l+16|0;r=s;if(c[b+8>>2]|0){e=hn(b,d)|0;i=0.0;f=0;q=0;while(1){if((q|0)>=(d|0))break;f=f+q|0;p=c[b+(q*20|0)>>2]|0;m=b+(q*20|0)+4|0;n=(S(q,d)|0)-f|0;o=b+(q*20|0)+8|0;k=1;while(1){if((k|0)>=(p|0))break;j=c[(c[m>>2]|0)+(k<<2)>>2]|0;if((j|0)>=(q|0)){j=e+(n+j<<2)|0;t=+g[(c[o>>2]|0)+(k<<2)>>2];i=i+ +F(+(+g[j>>2]-t));g[j>>2]=t}k=k+1|0}q=q+1|0}if(a[195234]|0){d=c[15715]|0;h[r>>3]=i;z4(d,90269,r)|0}}else e=0;l=s;return e|0}function hn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;h=m;i=HK(((S(b+1|0,b)|0)/2|0)<<2)|0;j=HK(b<<2)|0;rr(h,b);d=0;f=0;k=b;while(1){if((d|0)>=(b|0))break;es(d,a,b,j);e=d;g=f;while(1){if((e|0)==(b|0))break;c[i+(g<<2)>>2]=c[j+(e<<2)>>2];e=e+1|0;g=g+1|0}d=d+1|0;f=f+k|0;k=k+-1|0}l6(j);sr(h);l=m;return i|0}function jn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+16|0;i=n;j=HK(((S(b+1|0,b)|0)/2|0)<<2)|0;k=HK(b<<2)|0;rr(i,b);d=0;f=0;m=b;while(1){if((d|0)>=(b|0))break;nr(d,a,b,k,i);e=d;h=f;while(1){if((e|0)==(b|0))break;g[j+(h<<2)>>2]=+(c[k+(e<<2)>>2]|0);e=e+1|0;h=h+1|0}d=d+1|0;f=f+m|0;m=m+-1|0}l6(k);sr(i);l=n;return j|0}function kn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0;r=a+8|0;d=c[r>>2]|0;e=0;f=0;while(1){if((f|0)>=(b|0))break;e=(c[a+(f*20|0)>>2]|0)+e|0;f=f+1|0}f=HK(e<<2)|0;q=HK(b<<2)|0;e=0;while(1){if((e|0)>=(b|0))break;c[q+(e<<2)>>2]=0;e=e+1|0}if(!(c[r>>2]|0)){h=0;while(1){if((h|0)>=(b|0))break;c[a+(h*20|0)+8>>2]=f;Ws(a,h,q);i=a+(h*20|0)|0;j=c[i>>2]|0;k=a+(h*20|0)+4|0;l=+(j+-1|0);e=1;while(1){if((e|0)>=(j|0))break;p=c[(c[k>>2]|0)+(e<<2)>>2]|0;s=l+ +((c[a+(p*20|0)>>2]|0)+-1|0);g[f+(e<<2)>>2]=s-+((Vs(a,h,p,q)|0)<<1|0);e=e+1|0}Xs(a,h,q);f=f+(c[i>>2]<<2)|0;h=h+1|0}f=jn(a,b)|0}else{j=0;while(1){if((j|0)>=(b|0))break;Ws(a,j,q);k=a+(j*20|0)|0;m=c[k>>2]|0;n=a+(j*20|0)+4|0;o=m+-2|0;p=a+(j*20|0)+8|0;i=1;while(1){if((i|0)>=(m|0))break;e=c[(c[n>>2]|0)+(i<<2)>>2]|0;h=o+(c[a+(e*20|0)>>2]|0)|0;s=+(h-((Vs(a,j,e,q)|0)<<1)|0);l=+g[(c[p>>2]|0)+(i<<2)>>2];if(s>l)l=+(h-((Vs(a,j,e,q)|0)<<1)|0);g[f+(i<<2)>>2]=l;i=i+1|0}Xs(a,j,q);c[p>>2]=f;f=f+(c[k>>2]<<2)|0;j=j+1|0}f=hn(a,b)|0}l6(q);l6(c[r>>2]|0);c[r>>2]=0;a:do if(d|0){e=0;while(1){if((e|0)>=(b|0))break a;c[a+(e*20|0)+8>>2]=d;d=d+(c[a+(e*20|0)>>2]<<2)|0;e=e+1|0}}while(0);return f|0}function ln(b,e,f,i,j,k,m,n,o){b=b|0;e=e|0;f=f|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;var p=0,q=0,r=0,s=0,t=0,u=0.0,v=0,w=0.0,x=0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0.0;N=l;l=l+80|0;M=N+56|0;L=N+48|0;A=N+40|0;v=N+32|0;t=N+24|0;s=N+16|0;q=N+8|0;p=N;r=m&4;K=m&3;a:do if((o|0)<0)f=0;else{if(a[195234]|0)RO();m=(n|0)==2;b:do if(m){if(a[195234]|0)_3(93591,24,1,c[15715]|0)|0;f=kn(b,e)|0;x=14}else{switch(n|0){case 1:{f=fn(b,e)|0;if(f|0){J=f;break b}dA(0,93616,p)|0;dA(3,93665,q)|0;x=15;break b}case 3:break;default:{x=15;break b}}if(a[195234]|0)_3(93718,21,1,c[15715]|0)|0;f=gn(b,e)|0;x=14}while(0);if((x|0)==14)if(!f)x=15;else J=f;do if((x|0)==15){if(a[195234]|0)_3(93740,26,1,c[15715]|0)|0;if(!(c[b+8>>2]|0)){J=jn(b,e)|0;break}else{J=hn(b,e)|0;break}}while(0);if(a[195234]|0){I=c[15715]|0;h[s>>3]=+SO();z4(I,93767,s)|0;_3(93779,25,1,I)|0;RO()}c:do if((e|0)>1&(r|0)!=0)if((mn(b,e,i,k,r,K,m&1)|0)<0){v=0;t=0;f=-1;b=0;s=0;r=0;q=0;p=0;n=0;m=0}else{m=0;while(1){if((m|0)>=(k|0)){z=0;x=34;break c}n=i+(m<<2)|0;u=1.0;f=0;while(1){if((f|0)==(e|0)){f=0;break}y=+F(+(+h[(c[n>>2]|0)+(f<<3)>>3]));u=y>u?y:u;f=f+1|0}while(1){if((f|0)==(e|0)){f=0;break}I=(c[n>>2]|0)+(f<<3)|0;h[I>>3]=+h[I>>3]/u;f=f+1|0}while(1){if((f|0)==(e|0))break;y=(+S4()+-.5)*1.0e-06;I=(c[n>>2]|0)+(f<<3)|0;h[I>>3]=+h[I>>3]+y;f=f+1|0}Et(e,c[n>>2]|0);m=m+1|0}}else{z=en(0,e,k,i,j)|0;x=34}while(0);d:do if((x|0)==34){if(a[195234]|0){I=c[15715]|0;h[t>>3]=+SO();z4(I,93805,t)|0}if((e|0)==1|(o|0)==0){f=0;break a}if(a[195234]|0){I=c[15715]|0;h[v>>3]=+SO();z4(I,93767,v)|0;_3(90291,26,1,I)|0;RO()}r=k<<2;I=HK(r)|0;b=e<<2;s=S(b,k)|0;H=HK(s)|0;f=0;while(1){if((f|0)>=(k|0))break;n=H+((S(f,e)|0)<<2)|0;c[I+(f<<2)>>2]=n;p=i+(f<<2)|0;m=0;while(1){if((m|0)>=(e|0))break;g[n+(m<<2)>>2]=+h[(c[p>>2]|0)+(m<<3)>>3];m=m+1|0}f=f+1|0}G=e+-1|0;e:do if(!K){f=0;u=0.0;p=0;while(1){if((p|0)>=(G|0))break e;q=e-p|0;n=f;m=1;while(1){f=n+1|0;if((m|0)>=(q|0))break;n=f;u=u+ +g[J+(f<<2)>>2];m=m+1|0}p=p+1|0}}else u=+(e|0)*+(G|0)*.5;while(0);C=(S(e+1|0,e)|0)/2|0;D=(K|0)==2;if(D)_t(C,J);$t(C,J);E=e<<3;n=HK(E)|0;u6(n|0,0,E|0)|0;f=0;p=0;while(1){if((p|0)>=(G|0)){f=e;m=0;p=0;break}q=e-p|0;w=0.0;m=1;while(1){f=f+1|0;if((m|0)>=(q|0))break;y=+g[J+(f<<2)>>2];B=n+(m+p<<3)|0;h[B>>3]=+h[B>>3]-y;w=w+y;m=m+1|0}B=n+(p<<3)|0;h[B>>3]=+h[B>>3]-w;p=p+1|0}while(1){if((m|0)>=(e|0))break;g[J+(p<<2)>>2]=+h[n+(m<<3)>>3];B=f+p|0;f=f+-1|0;m=m+1|0;p=B}B=HK(r)|0;c[B>>2]=HK(s)|0;f=1;while(1){if((f|0)>=(k|0))break;c[B+(f<<2)>>2]=(c[B>>2]|0)+((S(f,e)|0)<<2);f=f+1|0}q=HK(b)|0;p=HK(b)|0;m=HK(C<<2)|0;if(a[195234]|0){x=c[15715]|0;h[A>>3]=+SO();z4(x,93767,A)|0;_3(90318,15,1,x)|0;RO()}x=(z|0)==0;z=c[15715]|0;f=0;r=0;y=1797693134862315708145274.0e284;while(1){if(!(r<<24>>24==0&(f|0)<(o|0)))break;u6(n|0,0,E|0)|0;if(D){au(C,J,m);v=0;b=0}else{v=0;b=0}while(1){if((v|0)>=(G|0)){r=e;s=0;b=0;break}t=e-v+-1|0;Yt(t,0.0,p);r=0;while(1){if((r|0)>=(k|0))break;A=I+(r<<2)|0;Yt(t,+g[(c[A>>2]|0)+(v<<2)>>2],q);Tt(t,q,-1.0,(c[A>>2]|0)+(v<<2)+4|0);_t(t,q);St(t,q,p,p);r=r+1|0}bu(t,p);r=0;while(1){if((r|0)>=(t|0))break;s=p+(r<<2)|0;w=+g[s>>2];if(w>=3402823466385288598117041.0e14|w<0.0)g[s>>2]=0.0;r=r+1|0}r=b+1|0;b=v+1|0;f:do if(D){w=0.0;s=0;while(1){if((s|0)>=(t|0))break f;A=m+(r<<2)|0;O=+g[p+(s<<2)>>2]*+g[A>>2];g[A>>2]=O;A=n+(b+s<<3)|0;h[A>>3]=+h[A>>3]-O;w=w+O;r=r+1|0;s=s+1|0}}else{w=0.0;s=0;while(1){if((s|0)>=(t|0))break f;O=+g[p+(s<<2)>>2];g[m+(r<<2)>>2]=O;A=n+(b+s<<3)|0;h[A>>3]=+h[A>>3]-O;w=w+O;r=r+1|0;s=s+1|0}}while(0);A=n+(v<<3)|0;h[A>>3]=+h[A>>3]-w;v=b;b=r}while(1){if((s|0)>=(e|0)){r=0;break}g[m+(b<<2)>>2]=+h[n+(s<<3)>>3];A=r+b|0;r=r+-1|0;s=s+1|0;b=A}while(1){if((r|0)>=(k|0)){w=0.0;r=0;break}Qt(m,e,c[I+(r<<2)>>2]|0,c[B+(r<<2)>>2]|0);r=r+1|0}while(1){if((r|0)>=(k|0))break;w=w+ +Wt(e,c[I+(r<<2)>>2]|0,c[B+(r<<2)>>2]|0);r=r+1|0}w=u+w*2.0;r=0;while(1){if((r|0)>=(k|0))break;A=I+(r<<2)|0;Qt(J,e,c[A>>2]|0,q);w=w-+Wt(e,c[A>>2]|0,q);r=r+1|0}P=y-w;O=+h[23315];r=(w=0.0?P:-P)/y=(k|0))break;t=I+(b<<2)|0;s=c[t>>2]|0;g:do if(x){if((xr(J,s,c[B+(b<<2)>>2]|0,e,.001,e)|0)<0){v=B;t=J;f=-1;b=H;s=I;r=B;break d}}else{Vt(e,s,q);if((xr(J,q,c[B+(b<<2)>>2]|0,e,.001,e)|0)<0){v=B;t=J;f=-1;b=H;s=I;r=B;break d}else s=0;while(1){if((s|0)>=(e|0))break g;if((d[(c[(c[j+(s<<2)>>2]|0)+16>>2]|0)+119>>0]|0)<=1)c[(c[t>>2]|0)+(s<<2)>>2]=c[q+(s<<2)>>2];s=s+1|0}}while(0);b=b+1|0}if(((f|0)%5|0|0)==0&(a[195234]|0)!=0?(h[L>>3]=w,z4(z,90672,L)|0,((f+5|0)%50|0|0)==0):0)W5(10,z)|0;f=f+1|0;y=w}if(!(a[195234]|0))r=0;else{O=+nn(I,J,k,e,K);P=+SO();h[M>>3]=O;c[M+8>>2]=f;h[M+16>>3]=P;z4(z,90334,M)|0;r=0}while(1){if((r|0)>=(k|0)){v=B;t=J;b=H;s=I;r=B;break d}b=I+(r<<2)|0;t=i+(r<<2)|0;s=0;while(1){if((s|0)>=(e|0))break;h[(c[t>>2]|0)+(s<<3)>>3]=+g[(c[b>>2]|0)+(s<<2)>>2];s=s+1|0}r=r+1|0}}while(0);l6(b);l6(s);l6(t);if(v|0){l6(c[v>>2]|0);l6(r)}l6(q);l6(p);l6(n);l6(m)}while(0);l=N;return f|0}function mn(b,d,e,f,i,j,k){b=b|0;d=d|0;e=e|0;f=f|0;i=i|0;j=j|0;k=k|0;var m=0,n=0,o=0,p=0.0,q=0,r=0,s=0.0,t=0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;Q=l;l=l+32|0;o=Q+24|0;P=Q+8|0;H=Q+4|0;N=Q;M=(d|0)<50?d:50;O=IK(M<<2)|0;G=d<<3;n=IK(S(G,M)|0)|0;m=0;while(1){if((m|0)>=(M|0))break;c[O+(m<<2)>>2]=n+((S(m,d)|0)<<3);m=m+1|0}D=M<<1;D=(D|0)>50?D:50;D=(D|0)>(d|0)?d:D;c[o>>2]=0;os(b,d,D,o,k);ps(c[o>>2]|0,d,D);ju(c[o>>2]|0,D,d,O,M);l6(c[c[o>>2]>>2]|0);l6(c[o>>2]|0);D=d<<2;L=IK(D)|0;m=0;while(1){if((m|0)>=(d|0))break;c[L+(m<<2)>>2]=-1;m=m+1|0}rr(P,d);J=c[b+8>>2]|0;I=(k|0)!=0;if(I)at(b,d);B=IK(D)|0;K=IK(160)|0;n=IK(d*160|0)|0;C=IK(160)|0;m=0;while(1){if((m|0)==40)break;c[C+(m<<2)>>2]=n+((S(m,d)|0)<<2);m=m+1|0}m=(U4()|0)%(d|0)|0;c[L+(m<<2)>>2]=0;c[K>>2]=m;n=c[C>>2]|0;if(I){_r(m,b,d,n);n=0;o=0}else{nr(m,b,d,n,P);n=0;o=0}while(1){if((o|0)>=(d|0)){r=1;break}E=c[(c[C>>2]|0)+(o<<2)>>2]|0;c[B+(o<<2)>>2]=E;A=(E|0)>(n|0);m=A?o:m;n=A?E:n;o=o+1|0}while(1){if((r|0)==40){m=0;break}c[L+(m<<2)>>2]=r;c[K+(r<<2)>>2]=m;t=C+(r<<2)|0;n=c[t>>2]|0;if(I){_r(m,b,d,n);q=0;n=0}else{nr(m,b,d,n,P);q=0;n=0}while(1){if((q|0)>=(d|0))break;o=B+(q<<2)|0;E=c[o>>2]|0;k=c[(c[t>>2]|0)+(q<<2)>>2]|0;k=(E|0)<(k|0)?E:k;c[o>>2]=k;if((k|0)<=(n|0)){if((k|0)==(n|0)?((U4()|0)%(q+1|0)|0|0)==0:0){n=c[o>>2]|0;m=q}}else{n=k;m=q}q=q+1|0}r=r+1|0}while(1){if((m|0)>=(d|0))break;c[B+(m<<2)>>2]=-1;m=m+1|0}w=IK(D)|0;E=IK(d<<4)|0;x=d+-1|0;y=x<<2;A=0;k=0;o=0;n=0;v=0;while(1){if((v|0)>=(d|0))break;m=L+(v<<2)|0;z=v+1|0;a:do if((c[m>>2]|0)>-1){r=E+(v<<4)+4|0;c[r>>2]=IK(y)|0;t=IK(y)|0;c[E+(v<<4)+8>>2]=t;c[E+(v<<4)>>2]=x;a[E+(v<<4)+12>>0]=1;q=C+(c[m>>2]<<2)|0;m=0;while(1){if((m|0)==(v|0)){m=z;break}c[(c[r>>2]|0)+(m<<2)>>2]=m;c[t+(m<<2)>>2]=c[(c[q>>2]|0)+(m<<2)>>2];m=m+1|0}while(1){if((m|0)==(d|0)){m=x;break a}v=m+-1|0;c[(c[r>>2]|0)+(v<<2)>>2]=m;c[t+(v<<2)>>2]=c[(c[q>>2]|0)+(m<<2)>>2];m=m+1|0}}else{if((n|0)<40){o=IK(D)|0;k=IK(D)|0;n=d;m=1}else m=0;a[E+(v<<4)+12>>0]=m;c[E+(v<<4)+4>>2]=o;c[E+(v<<4)+8>>2]=k;c[E+(v<<4)>>2]=40;m=0;while(1){if((m|0)==40)break;c[o+(m<<2)>>2]=c[K+(m<<2)>>2];c[k+(m<<2)>>2]=c[(c[C+(m<<2)>>2]|0)+(v<<2)>>2];m=m+1|0}k=k+160|0;o=o+160|0;n=n+-40|0;m=40}while(0);A=m+A|0;v=z}l6(B);l6(w);if(C|0){l6(c[C>>2]|0);l6(C)}C=IK(d*20|0)|0;q=A+d<<2;r=IK(q)|0;v=(j|0)==2;q=IK(q)|0;t=0;while(1){if((t|0)>=(d|0))break;c[C+(t*20|0)+4>>2]=r;c[C+(t*20|0)+8>>2]=q;m=(c[E+(t<<4)>>2]|0)+1|0;w=C+(t*20|0)|0;c[w>>2]=m;o=(c[E+(t<<4)+8>>2]|0)+-4|0;k=E+(t<<4)+4|0;b:do if(v){p=0.0;n=1;while(1){if((n|0)>=(m|0))break b;c[r+(n<<2)>>2]=c[(c[k>>2]|0)+(n+-1<<2)>>2];u=+(c[o+(n<<2)>>2]|0);u=-1.0/(u*u);g[q+(n<<2)>>2]=u;p=p-u;n=n+1|0;m=c[w>>2]|0}}else{p=0.0;n=1;while(1){if((n|0)>=(m|0))break b;c[r+(n<<2)>>2]=c[(c[k>>2]|0)+(n+-1<<2)>>2];u=-1.0/+(c[o+(n<<2)>>2]|0);g[q+(n<<2)>>2]=u;p=p-u;n=n+1|0;m=c[w>>2]|0}}while(0);c[r>>2]=t;g[q>>2]=p;D=c[w>>2]|0;q=q+(D<<2)|0;r=r+(D<<2)|0;t=t+1|0}B=IK(f<<2)|0;c[B>>2]=IK(S(f<<3,M)|0)|0;m=1;while(1){if((m|0)>=(f|0))break;c[B+(m<<2)>>2]=(c[B>>2]|0)+((S(m,M)|0)<<3);m=m+1|0}c:do if(i){m=0;while(1){if((m|0)>=(f|0))break;o=B+(m<<2)|0;n=0;while(1){if((n|0)>=(M|0))break;h[(c[o>>2]|0)+(n<<3)>>3]=0.0;n=n+1|0}m=m+1|0}if((f|0)!=2){m=0;while(1){if((m|0)>=(f|0)){m=0;break c}h[(c[B+(m<<2)>>2]|0)+(m<<3)>>3]=1.0;m=m+1|0}}h[c[B>>2]>>3]=1.0;m=B+4|0;if(!((ku(O,M,d,c[m>>2]|0)|0)<<24>>24)){n=c[m>>2]|0;m=0;while(1){if((m|0)>=(M|0))break;h[n+(m<<3)>>3]=0.0;m=m+1|0}h[n+8>>3]=1.0;m=0}else m=0}else{n=0;while(1){if((n|0)>=(f|0)){m=0;break c}o=B+(n<<2)|0;m=0;while(1){if((m|0)>=(M|0))break;u=+(U4()|0)/2147483647.0;h[(c[o>>2]|0)+(m<<3)>>3]=u;m=m+1|0}n=n+1|0}}while(0);while(1){if((m|0)>=(f|0))break;Ot(O,d,M,c[B+(m<<2)>>2]|0,c[e+(m<<2)>>2]|0);m=m+1|0}c[H>>2]=0;c[N>>2]=0;Dt(C,O,d,M,H);Bt(O,c[H>>2]|0,M,d,M,N);l6(c[c[H>>2]>>2]|0);l6(c[H>>2]|0);z=IK(G)|0;A=IK(M<<3)|0;m=0;n=0;p=+on(e,E,f,d,j);d:while(1){if((n|0)<50&m<<24>>24==0)x=0;else break;while(1){if((x|0)>=(f|0))break;y=e+(x<<2)|0;o=0;while(1){if((o|0)>=(d|0))break;q=z+(o<<3)|0;h[q>>3]=0.0;r=(c[E+(o<<4)+8>>2]|0)+-4|0;t=c[C+(o*20|0)+4>>2]|0;v=c[C+(o*20|0)+8>>2]|0;w=C+(o*20|0)|0;s=0.0;k=1;while(1){if((k|0)>=(c[w>>2]|0))break;m=c[t+(k<<2)>>2]|0;u=+ct(e,f,o,m);if(u>1.0e-30){u=-(+g[v+(k<<2)>>2]*+(c[r+(k<<2)>>2]|0))/u;h[q>>3]=+h[q>>3]+ +h[(c[y>>2]|0)+(m<<3)>>3]*u;s=s-u}k=k+1|0}h[q>>3]=+h[q>>3]+s*+h[(c[y>>2]|0)+(o<<3)>>3];o=o+1|0}At(O,M,d,z,A);m=B+(x<<2)|0;if(wr(c[N>>2]|0,c[m>>2]|0,A,M,.001,M,0)|0){n=-1;break d}Ot(O,d,M,c[m>>2]|0,c[y>>2]|0);x=x+1|0}if(!(n&1)){u=+on(e,E,f,d,j);p=+F(+(u-p))/(u+1.0e-10);m=p<+h[23315]&1;p=u}else m=0;n=n+1|0}l6(A);l6(z);if(I){bt(b,d,J);m=0}else m=0;while(1){if((m|0)>=(d|0))break;if(a[E+(m<<4)+12>>0]|0){l6(c[E+(m<<4)+4>>2]|0);l6(c[E+(m<<4)+8>>2]|0)}m=m+1|0}l6(E);l6(c[C+4>>2]|0);l6(c[C+8>>2]|0);l6(C);l6(L);l6(K);l6(c[B>>2]|0);l6(B);m=c[N>>2]|0;if(m|0){l6(c[m>>2]|0);l6(c[N>>2]|0)}l6(c[O>>2]|0);l6(O);sr(P);l=Q;return n|0}function nn(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,i=0.0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0;q=e+-1|0;o=(f|0)==2;h=0.0;f=0;m=0;while(1){if((m|0)>=(q|0))break;p=e-m|0;n=1;while(1){f=f+1|0;if((n|0)>=(p|0))break;k=n+m|0;i=0.0;j=0;while(1){if((j|0)>=(d|0))break;r=c[a+(j<<2)>>2]|0;l=+g[r+(m<<2)>>2]-+g[r+(k<<2)>>2];i=i+l*l;j=j+1|0}i=+G(+i);l=+g[b+(f<<2)>>2];if(o){i=1.0/+G(+l)-i;i=i*i}else{i=1.0/l-i;i=i*i}n=n+1|0;h=h+l*i}m=m+1|0}return +h}function on(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0.0,i=0.0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0;a:do if((f|0)==2){g=0.0;l=0;while(1){if((l|0)>=(e|0))break a;n=c[b+(l<<4)>>2]|0;o=b+(l<<4)+4|0;m=b+(l<<4)+8|0;k=0;while(1){if((k|0)>=(n|0))break;j=c[(c[o>>2]|0)+(k<<2)>>2]|0;if((j|0)>(l|0)){i=0.0;f=0;while(1){if((f|0)>=(d|0))break;q=c[a+(f<<2)>>2]|0;p=+h[q+(l<<3)>>3]-+h[q+(j<<3)>>3];i=i+p*p;f=f+1|0}i=+G(+i);p=+(c[(c[m>>2]|0)+(k<<2)>>2]|0);i=p-i;g=g+i*i/(p*p)}k=k+1|0}l=l+1|0}}else{l=0;g=0.0;while(1){if((l|0)>=(e|0))break a;m=c[b+(l<<4)>>2]|0;n=b+(l<<4)+4|0;o=b+(l<<4)+8|0;k=0;while(1){if((k|0)>=(m|0))break;j=c[(c[n>>2]|0)+(k<<2)>>2]|0;if((j|0)>(l|0)){i=0.0;f=0;while(1){if((f|0)>=(d|0))break;q=c[a+(f<<2)>>2]|0;p=+h[q+(l<<3)>>3]-+h[q+(j<<3)>>3];i=i+p*p;f=f+1|0}i=+G(+i);p=+(c[(c[o>>2]|0)+(k<<2)>>2]|0);i=p-i;g=g+i*i/p}k=k+1|0}l=l+1|0}}while(0);return +g}function pn(a){a=+a;a=+G(+a);return +(a*(a*a))}function qn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,i=0.0;g=c[47184]|0;e=0.0;f=0;while(1){if((f|0)>=(g|0))break;i=+h[a+(f<<3)>>3]-+h[b+(f<<3)>>3];h[d+(f<<3)>>3]=i;e=e+i*i;f=f+1|0}return +(+G(+e))}function rn(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,g=0,i=0;i=HK(a<<2)|0;f=0;g=HK(S(a<<3,b)|0)|0;while(1){if((f|0)>=(a|0))break;c[i+(f<<2)>>2]=g;e=0;while(1){if((e|0)>=(b|0))break;h[g+(e<<3)>>3]=d;e=e+1|0}f=f+1|0;g=g+(b<<3)|0}return i|0}function sn(a){a=a|0;if(a|0){l6(c[a>>2]|0);l6(a)}return}function tn(b,d){b=b|0;d=d|0;var e=0.0,f=0,g=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0.0,q=0;o=l;l=l+16|0;f=o;k=o+8|0;if(a[195234]|0){n=c[15715]|0;j=HB(b)|0;m=qB(b)|0;c[f>>2]=j;c[f+4>>2]=m;z4(n,90372,f)|0}a:do if(a[195235]|0){i=b+60|0;f=gC(b)|0;b:while(1){if(!f)break a;j=hC(b,f)|0;switch(un(b,f,k)|0){case 0:{tC(c[i>>2]|0,f)|0;f=j;continue b}case 1:{tC(c[i>>2]|0,f)|0;f=vn(b,c[k>>2]|0,j)|0;continue b}default:{f=j;continue b}}}}while(0);n=qB(b)|0;m=rB(b)|0;k=DA(b,2,92794,0)|0;g=+(n|0);c:do if(!d){h[23315]=g*.0001;nK(b,109187,186520);f=NA(c[b+60>>2]|0,90401)|0;if(!f)e=.99;else e=+a6(f);h[23317]=e;f=HK((n<<2)+4|0)|0;j=b+16|0;c[(c[j>>2]|0)+152>>2]=f;f=0;e=0.0;i=gC(b)|0;while(1){if(!i)break c;c[(c[(c[j>>2]|0)+152>>2]|0)+(f<<2)>>2]=i;q=c[i+16>>2]|0;c[q+120>>2]=f;c[q+124>>2]=-1;p=e+ +wn(b,i,k);f=f+1|0;e=p;i=hC(b,i)|0}}else{h[23315]=.0001;nK(b,109187,186520);f=0;e=0.0;i=gC(b)|0;while(1){if(!i)break c;c[(c[i+16>>2]|0)+120>>2]=f;p=e+ +wn(b,i,k);f=f+1|0;e=p;i=hC(b,i)|0}}while(0);f=NA(b,90409)|0;if((f|0)!=0?(a[f>>0]|0)!=0:0){e=+h[23315];g=+a6(f);if(!(e>g))e=g}else e=e/+(((m|0)>1?m:1)|0)*+G(+g)+1.0;h[23316]=e;if(!(c[47180]|d)){d=rn(n,n,e)|0;q=b+16|0;c[(c[q>>2]|0)+160>>2]=d;d=rn(n,n,1.0)|0;c[(c[q>>2]|0)+164>>2]=d;d=rn(n,c[47184]|0,1.0)|0;c[(c[q>>2]|0)+168>>2]=d;d=xn(n,n,c[47184]|0)|0;c[(c[q>>2]|0)+172>>2]=d}l=o;return n|0}function un(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;f=0;e=0;j=ZA(a,b)|0;a:while(1){if(!j)break;h=c[j>>2]&3;g=c[((h|0)==2?j:j+-48|0)+40>>2]|0;h=c[((h|0)==3?j:j+48|0)+40>>2]|0;do if((g|0)!=(h|0)){i=(h|0)==(b|0);if((e|0)!=1){f=i?g:h;c[d>>2]=f;e=e+1|0;break}if(!((g|0)==(f|0)&i)?!((g|0)==(b|0)&(h|0)==(f|0)):0){e=2;break a}else e=1}while(0);j=_A(a,j,b)|0}return e|0}function vn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+16|0;f=h;g=a+60|0;a:while(1){b:while(1){if(!b)break a;switch(un(a,b,f)|0){case 0:{e=5;break b}case 1:{e=8;break b}default:b=0}}if((e|0)==5){if((d|0)==(b|0))d=hC(a,d)|0;tC(c[g>>2]|0,b)|0;b=0;continue}else if((e|0)==8){if((d|0)==(b|0))d=hC(a,d)|0;tC(c[g>>2]|0,b)|0;b=c[f>>2]|0;continue}}l=h;return d|0}function wn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0,j=0,k=0;k=l;l=l+32|0;i=k+8|0;g=k;b=UA(a,b)|0;e=0.0;while(1){if(!b)break;switch(yn(b,d,g)|0){case 0:{f=+h[g>>3];break}case 2:{c[i>>2]=HB(a)|0;h[i+8>>3]=1.0;dA(3,90421,i)|0;j=6;break}default:j=6}if((j|0)==6){j=0;h[g>>3]=1.0;f=1.0}h[(c[b+16>>2]|0)+136>>3]=f;b=WA(a,b)|0;e=e+f}l=k;return +e}function xn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0;j=HK((a<<2)+4|0)|0;k=(b<<2)+4|0;l=d<<3;g=0;while(1){if((g|0)>=(a|0))break;i=j+(g<<2)|0;c[i>>2]=HK(k)|0;f=0;while(1){if((f|0)>=(b|0))break;e=HK(l)|0;c[(c[i>>2]|0)+(f<<2)>>2]=e;e=0;while(1){if((e|0)>=(d|0))break;h[(c[(c[i>>2]|0)+(f<<2)>>2]|0)+(e<<3)>>3]=0.0;e=e+1|0}f=f+1|0}c[(c[i>>2]|0)+(f<<2)>>2]=0;g=g+1|0}c[j+(g<<2)>>2]=0;return j|0}function yn(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0,j=0,k=0;k=l;l=l+16|0;j=k+8|0;i=k;do if((d|0)!=0?(f=OA(b,d)|0,(a[f>>0]|0)!=0):0){c[i>>2]=e;if(((q4(f,101510,i)|0)>=1?(g=+h[e>>3],!(g<0.0)):0)?g!=0.0|(c[47180]|0)!=0:0){b=0;break}c[j>>2]=f;dA(0,90448,j)|0;b=2}else b=1;while(0);l=k;return b|0}function zn(a){a=a|0;return tn(a,0)|0}function An(a){a=a|0;a=a+16|0;l6(c[(c[a>>2]|0)+152>>2]|0);if(!(c[47180]|0)){sn(c[(c[a>>2]|0)+160>>2]|0);sn(c[(c[a>>2]|0)+164>>2]|0);sn(c[(c[a>>2]|0)+168>>2]|0);Bn(c[(c[a>>2]|0)+172>>2]|0);c[(c[a>>2]|0)+172>>2]=0}return}function Bn(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;if(a|0){f=0;while(1){g=a+(f<<2)|0;b=c[g>>2]|0;if(!b)break;else e=0;while(1){d=c[b+(e<<2)>>2]|0;if(!d)break;l6(d);e=e+1|0;b=c[g>>2]|0}l6(b);f=f+1|0}l6(a)}return}function Cn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0;e=+(b|0);b=a+16|0;while(1){if((d|0)>=(c[47184]|0))break;f=e*+S4();h[(c[(c[b>>2]|0)+132>>2]|0)+(d<<3)>>3]=f;d=d+1|0}return}function Dn(a,b){a=a|0;b=b|0;Cn(a,b,2);return}function En(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0;e=+(b|0);f=e*+S4();d=a+16|0;h[c[(c[d>>2]|0)+132>>2]>>3]=f;e=e*+S4();h[(c[(c[d>>2]|0)+132>>2]|0)+8>>3]=e;if((c[47184]|0)>2)Dn(a,b);return}function Fn(b,d){b=b|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;e=f;if(a[195234]|0)_3(90466,26,1,c[15715]|0)|0;d=km(b,d,2)|0;a:do if((d|0)!=1){if(!(c[46839]|d)){dA(0,90493,e)|0;c[46839]=1}b=b+16|0;d=0;while(1){e=c[(c[(c[b>>2]|0)+152>>2]|0)+(d<<2)>>2]|0;if(!e)break a;if(!(a[(c[e+16>>2]|0)+119>>0]|0))En(e,1);d=d+1|0}}while(0);l=f;return}function Gn(b,d){b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0;r=l;l=l+96|0;q=r+80|0;o=r;if(a[195234]|0){_3(90542,25,1,c[15715]|0)|0;RO()}p=b+16|0;i=c[p>>2]|0;m=c[i+164>>2]|0;i=c[i+160>>2]|0;n=0;while(1){if((n|0)>=(d|0))break;j=i+(n<<2)|0;k=m+(n<<2)|0;f=0;while(1){if((f|0)==(n|0))break;g=+h[(c[j>>2]|0)+(f<<3)>>3];g=1.0/(g*g);e=c[(c[p>>2]|0)+152>>2]|0;e=fB(b,c[e+(n<<2)>>2]|0,c[e+(f<<2)>>2]|0,0,0)|0;if(e)g=g*+h[(c[e+16>>2]|0)+128>>3];h[(c[m+(f<<2)>>2]|0)+(n<<3)>>3]=g;h[(c[k>>2]|0)+(f<<3)>>3]=g;f=f+1|0}n=n+1|0}b=c[47184]|0;f=0;while(1){if((f|0)<(d|0))e=0;else break;while(1){if((e|0)>=(b|0))break;h[(c[(c[(c[p>>2]|0)+168>>2]|0)+(f<<2)>>2]|0)+(e<<3)>>3]=0.0;e=e+1|0}f=f+1|0}j=0;while(1){e=c[(c[(c[p>>2]|0)+152>>2]|0)+(j<<2)>>2]|0;if(!e)break;b=e+16|0;e=0;while(1){if((e|0)>=(d|0))break;a:do if((j|0)!=(e|0)){g=+qn(c[(c[b>>2]|0)+132>>2]|0,c[(c[(c[(c[(c[p>>2]|0)+152>>2]|0)+(e<<2)>>2]|0)+16>>2]|0)+132>>2]|0,o);i=c[47184]|0;f=0;while(1){if((f|0)>=(i|0))break a;n=c[p>>2]|0;s=+h[o+(f<<3)>>3];s=+h[(c[(c[n+164>>2]|0)+(j<<2)>>2]|0)+(e<<3)>>3]*(s-s*+h[(c[(c[n+160>>2]|0)+(j<<2)>>2]|0)+(e<<3)>>3]/g);h[(c[(c[(c[n+172>>2]|0)+(j<<2)>>2]|0)+(e<<2)>>2]|0)+(f<<3)>>3]=s;n=(c[(c[n+168>>2]|0)+(j<<2)>>2]|0)+(f<<3)|0;h[n>>3]=s+ +h[n>>3];f=f+1|0}}while(0);e=e+1|0}j=j+1|0}if(a[195234]|0){p=c[15715]|0;h[q>>3]=+SO();z4(p,90568,q)|0}l=r;return}function Hn(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0.0,m=0;j=l;l=l+32|0;i=j+24|0;g=j+8|0;f=j;k=+h[23315];h[23235]=k*k;while(1){e=In(b,d)|0;if(!e)break;Jn(b,d,e)}if(!(a[195234]|0))d=b+16|0;else{e=c[15715]|0;h[f>>3]=+Kn(b,d);z4(e,90578,f)|0;d=b+16|0;m=c[(c[d>>2]|0)+156>>2]|0;f=(m|0)==(c[47183]|0)?90592:195341;k=+SO();c[g>>2]=m;c[g+4>>2]=f;h[g+8>>3]=k;z4(e,90594,g)|0}d=c[(c[d>>2]|0)+156>>2]|0;if((d|0)==(c[47183]|0)){m=HB(b)|0;c[i>>2]=d;c[i+4>>2]=m;dA(0,90621,i)|0}l=j;return}function In(b,e){b=b|0;e=e|0;var f=0.0,g=0,i=0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0;s=l;l=l+16|0;r=s;p=(c[46841]|0)+1|0;c[46841]=p;b=c[b+16>>2]|0;if((c[b+156>>2]|0)<(c[47183]|0)){n=b+152|0;o=c[47184]|0;m=b+168|0;b=0;f=0.0;k=0;while(1){if((k|0)>=(e|0))break;i=c[(c[n>>2]|0)+(k<<2)>>2]|0;if((d[(c[i+16>>2]|0)+119>>0]|0)<=1){j=0.0;g=0;while(1){if((g|0)>=(o|0))break;t=+h[(c[(c[m>>2]|0)+(k<<2)>>2]|0)+(g<<3)>>3];j=j+t*t;g=g+1|0}if(j>f){b=i;f=j}}k=k+1|0}if(!(f<+h[23235])){if((a[195234]|0)!=0&((p|0)%100|0|0)==0?(q=c[15715]|0,h[r>>3]=+G(+f),z4(q,90672,r)|0,((c[46841]|0)%1e3|0|0)==0):0)W5(10,q)|0}else b=0}else b=0;l=s;return b|0}function Jn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;n=o;k=d+16|0;m=c[(c[k>>2]|0)+120>>2]|0;f=c[46840]|0;if(!f){g=c[47184]|0;g=IK(S(g<<3,g)|0)|0}else{g=c[47184]|0;g=KK(f,S(g<<3,g)|0)|0}c[46840]=g;Ln(a,b,m,g);i=c[47184]|0;j=a+16|0;f=0;while(1){if((f|0)>=(i|0))break;h[185888+(f<<3)>>3]=-+h[(c[(c[(c[j>>2]|0)+168>>2]|0)+(m<<2)>>2]|0)+(f<<3)>>3];f=f+1|0}Uu(g,185968,185888,i);f=0;while(1){if((f|0)>=(c[47184]|0))break;e=+h[23317];e=e+ +S4()*((1.0-e)*2.0);i=185968+(f<<3)|0;e=+h[i>>3]*e;h[i>>3]=e;i=(c[(c[k>>2]|0)+132>>2]|0)+(f<<3)|0;h[i>>3]=e+ +h[i>>3];f=f+1|0}k=(c[j>>2]|0)+156|0;c[k>>2]=(c[k>>2]|0)+1;Mn(a,b,m);if(pP()|0){g=c[47184]|0;e=0.0;f=0;while(1){if((f|0)>=(g|0))break;e=e+ +F(+(+h[185968+(f<<3)>>3]));f=f+1|0}e=+G(+e);m=c[15715]|0;c[n>>2]=HB(d)|0;h[n+8>>3]=e;z4(m,90663,n)|0}l=o;return}function Kn(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0;q=b+-1|0;n=a+16|0;o=c[47184]|0;g=0;d=0.0;a:while(1){if((g|0)>=(q|0))break;m=c[n>>2]|0;p=c[m+152>>2]|0;j=g+1|0;k=(c[p+(g<<2)>>2]|0)+16|0;l=m+164|0;m=m+160|0;i=j;while(1){if((i|0)>=(b|0)){g=j;continue a}f=(c[p+(i<<2)>>2]|0)+16|0;a=0;e=0.0;while(1){if((a|0)>=(o|0))break;r=+h[(c[(c[k>>2]|0)+132>>2]|0)+(a<<3)>>3]-+h[(c[(c[f>>2]|0)+132>>2]|0)+(a<<3)>>3];a=a+1|0;e=e+r*r}r=+h[(c[(c[m>>2]|0)+(g<<2)>>2]|0)+(i<<3)>>3];r=d+ +h[(c[(c[l>>2]|0)+(g<<2)>>2]|0)+(i<<3)>>3]*(e+r*r-r*2.0*+G(+e));i=i+1|0;d=r}}return +d}function Ln(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0;x=l;l=l+80|0;w=x;v=c[a+16>>2]|0;k=c[v+164>>2]|0;m=c[v+160>>2]|0;v=c[v+152>>2]|0;j=c[v+(d<<2)>>2]|0;g=c[47184]|0;a=0;while(1){if((a|0)>=(g|0))break;i=S(g,a)|0;f=0;while(1){if((f|0)==(g|0))break;h[e+(f+i<<3)>>3]=0.0;f=f+1|0}a=a+1|0}u=c[47184]|0;t=j+16|0;s=k+(d<<2)|0;k=m+(d<<2)|0;j=0;while(1){if((j|0)>=(b|0))break;a:do if((j|0)!=(d|0)){f=(c[v+(j<<2)>>2]|0)+16|0;r=0.0;a=0;while(1){if((a|0)>=(u|0))break;q=+h[(c[(c[t>>2]|0)+132>>2]|0)+(a<<3)>>3]-+h[(c[(c[f>>2]|0)+132>>2]|0)+(a<<3)>>3];h[w+(a<<3)>>3]=q;r=r+q*q;a=a+1|0}n=1.0/+pn(r);i=0;while(1){if((i|0)>=(u|0))break a;f=(c[s>>2]|0)+(j<<3)|0;g=(c[k>>2]|0)+(j<<3)|0;o=+h[w+(i<<3)>>3];a=0;while(1){p=+h[f>>3];q=+h[g>>3];if((a|0)==(i|0))break;m=e+((S(a,u)|0)+i<<3)|0;h[m>>3]=+h[m>>3]+n*(p*q*o*+h[w+(a<<3)>>3]);a=a+1|0}m=e+((S(u,i)|0)+i<<3)|0;h[m>>3]=p*(1.0-n*(q*(r-o*o)))+ +h[m>>3];i=i+1|0}}while(0);j=j+1|0}f=c[47184]|0;i=1;while(1){if((i|0)>=(f|0))break;g=S(f,i)|0;a=0;while(1){if((a|0)==(i|0))break;h[e+(a+g<<3)>>3]=+h[e+((S(a,f)|0)+i<<3)>>3];a=a+1|0}i=i+1|0}l=x;return}function Mn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0.0,j=0,k=0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0;m=l;l=l+80|0;k=m;j=a+16|0;f=c[j>>2]|0;g=c[(c[f+152>>2]|0)+(d<<2)>>2]|0;e=c[47184]|0;f=f+168|0;a=0;while(1){if((a|0)>=(e|0))break;h[(c[(c[f>>2]|0)+(d<<2)>>2]|0)+(a<<3)>>3]=0.0;a=a+1|0}f=g+16|0;a=0;while(1){if((a|0)>=(b|0))break;a:do if((a|0)!=(d|0)){i=+qn(c[(c[f>>2]|0)+132>>2]|0,c[(c[(c[(c[(c[j>>2]|0)+152>>2]|0)+(a<<2)>>2]|0)+16>>2]|0)+132>>2]|0,k);g=c[47184]|0;e=0;while(1){if((e|0)>=(g|0))break a;n=c[j>>2]|0;q=c[n+172>>2]|0;r=(c[(c[q+(d<<2)>>2]|0)+(a<<2)>>2]|0)+(e<<3)|0;o=+h[k+(e<<3)>>3];o=+h[(c[(c[n+164>>2]|0)+(d<<2)>>2]|0)+(a<<3)>>3]*(o-o*+h[(c[(c[n+160>>2]|0)+(d<<2)>>2]|0)+(a<<3)>>3]/i);h[r>>3]=o;n=c[n+168>>2]|0;s=(c[n+(d<<2)>>2]|0)+(e<<3)|0;h[s>>3]=+h[s>>3]+o;q=(c[(c[q+(a<<2)>>2]|0)+(d<<2)>>2]|0)+(e<<3)|0;o=+h[q>>3];p=-+h[r>>3];h[q>>3]=p;n=(c[n+(a<<2)>>2]|0)+(e<<3)|0;h[n>>3]=p-o+ +h[n>>3];e=e+1|0}}while(0);a=a+1|0}l=m;return}function Nn(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0;d=a+16|0;g=c[46842]|0;b=c[(c[d>>2]|0)+124>>2]|0;while(1){if((b|0)<=0)break;i=(b+-1|0)/2|0;j=g+(i<<2)|0;e=c[j>>2]|0;f=e+16|0;if(+h[(c[f>>2]|0)+136>>3]<=+h[(c[d>>2]|0)+136>>3])break;c[j>>2]=a;c[(c[d>>2]|0)+124>>2]=i;c[g+(b<<2)>>2]=e;c[(c[f>>2]|0)+124>>2]=b;b=i}return}function On(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0;i=a+16|0;j=c[46843]|0;k=c[46842]|0;g=c[(c[i>>2]|0)+124>>2]|0;while(1){e=g<<1|1;if((e|0)>=(j|0))break;d=e+1|0;if((d|0)<(j|0)){f=c[k+(d<<2)>>2]|0;b=c[k+(e<<2)>>2]|0;if(+h[(c[f+16>>2]|0)+136>>3]<+h[(c[b+16>>2]|0)+136>>3]){e=d;b=f}else l=6}else{b=c[k+(e<<2)>>2]|0;l=6}if((l|0)==6)l=0;d=b+16|0;if(+h[(c[i>>2]|0)+136>>3]<=+h[(c[d>>2]|0)+136>>3])break;c[k+(e<<2)>>2]=a;c[(c[i>>2]|0)+124>>2]=e;c[k+(g<<2)>>2]=b;c[(c[d>>2]|0)+124>>2]=g;g=e}return}function Pn(a){a=a|0;var b=0,d=0;b=(c[a+16>>2]|0)+124|0;if((c[b>>2]|0)>=0)Aa(90678,90698,643,90706);d=c[46843]|0;c[46843]=d+1;c[b>>2]=d;c[(c[46842]|0)+(d<<2)>>2]=a;if((d|0)>0)Nn(a);return}function Qn(){var a=0,b=0,d=0,e=0;b=c[46843]|0;if(!b)a=0;else{e=c[46842]|0;a=c[e>>2]|0;d=b+-1|0;c[46843]=d;b=c[e+(d<<2)>>2]|0;c[e>>2]=b;c[(c[b+16>>2]|0)+124>>2]=0;if((d|0)>1)On(b);c[(c[a+16>>2]|0)+124>>2]=-1}return a|0}function Rn(b,d){b=b|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;e=f;c[46842]=HK((d<<2)+4|0)|0;if(a[195234]|0){_3(90720,28,1,c[15715]|0)|0;RO()}d=gC(b)|0;while(1){if(!d)break;Sn(b,d);d=hC(b,d)|0}if(a[195234]|0){b=c[15715]|0;h[e>>3]=+SO();z4(b,90568,e)|0}l6(c[46842]|0);l=f;return}function Sn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0,i=0,j=0,k=0;e=c[(c[a+16>>2]|0)+152>>2]|0;f=+h[23316];d=0;while(1){g=c[e+(d<<2)>>2]|0;if(!g)break;h[(c[g+16>>2]|0)+136>>3]=f;d=d+1|0}c[46844]=b;k=c[b+16>>2]|0;h[k+136>>3]=0.0;c[k+128>>2]=0;Pn(b);a:while(1){j=Qn()|0;if(!j)break;d=c[46844]|0;k=j+16|0;if((j|0)!=(d|0))Tn(a,d,j,+h[(c[k>>2]|0)+136>>3]);i=ZA(a,j)|0;while(1){if(!i)continue a;d=c[i>>2]&3;b=c[((d|0)==3?i:i+48|0)+40>>2]|0;if((b|0)==(j|0))b=c[((d|0)==2?i:i+-48|0)+40>>2]|0;d=c[k>>2]|0;f=+h[d+136>>3]+ +h[(c[i+16>>2]|0)+136>>3];e=c[b+16>>2]|0;g=e+136|0;do if(+h[g>>3]>f){h[g>>3]=f;if((c[e+124>>2]|0)>-1){Nn(b);break}else{c[e+128>>2]=(c[d+128>>2]|0)+1;Pn(b);break}}while(0);i=_A(a,i,j)|0}}return}function Tn(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;b=c[(c[b+16>>2]|0)+120>>2]|0;d=c[(c[d+16>>2]|0)+120>>2]|0;a=c[(c[a+16>>2]|0)+160>>2]|0;h[(c[a+(d<<2)>>2]|0)+(b<<3)>>3]=e;h[(c[a+(b<<2)>>2]|0)+(d<<3)>>3]=e;return}function Un(a){a=a|0;mQ(a,2);b[(c[a+16>>2]|0)+176>>1]=2;c[47184]=2;Vn(a);return}function Vn(a){a=a|0;var b=0,d=0,e=0,f=0;b=qB(a)|0;e=HK(b*56|0)|0;b=HK((b<<2)+4|0)|0;f=a+16|0;c[(c[f>>2]|0)+152>>2]=b;b=gC(a)|0;d=0;while(1){if(!b)break;Wl(b);c[(c[b+16>>2]|0)+112>>2]=e+(d*56|0);c[(c[(c[f>>2]|0)+152>>2]|0)+(d<<2)>>2]=b;b=hC(a,b)|0;d=d+1|0}d=gC(a)|0;while(1){if(!d)break;b=UA(a,d)|0;while(1){if(!b)break;Wn(b);b=WA(a,b)|0}d=hC(a,d)|0}return}function Wn(a){a=a|0;var b=0.0;RC(a,137763,176,1)|0;rP(a)|0;b=+YO(a,c[47236]|0,1.0,0.0);h[(c[a+16>>2]|0)+128>>3]=b;return}function Xn(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=l;l=l+80|0;m=u+32|0;i=u+24|0;g=u+16|0;j=u;t=u+72|0;p=u+40|0;if(qB(b)|0){Un(b);f=NA(b,96039)|0;if(f)if(a[f>>0]|0){d=qC(b,f,0)|0;if(!d){c[g>>2]=f;dA(0,90749,g)|0;dA(3,90789,i)|0;d=0;s=1}else s=0}else{d=0;s=1}else{d=0;s=0}n=DA(b,1,96039,0)|0;o=(n|0)!=0;f=NA(b,141045)|0;if((f|0?a[f>>0]|0:0)?(k=j+8|0,c[m>>2]=j,c[m+4>>2]=k,(q4(f,105804,m)|0)==1):0)h[k>>3]=+h[j>>3];if(qB(b)|0){m=BG(b,t,0)|0;if((c[t>>2]|0)==1){g=(d|0)!=0;do if(g)e=d;else{if(o?(e=Yn(b,n)|0,e|0):0)break;e=0}while(0);f=Wu(b,e)|0;if(!((e|0)!=0|o^1))HA(f,n,137699)|0;r=(gC(b)|0)+16|0;l6(c[(c[r>>2]|0)+112>>2]|0);c[(c[r>>2]|0)+112>>2]=0;lr(b)|0;cn(b);d=(s|0)==0|g?d:f}else{iH(b,2,8,p)|0;c[p+12>>2]=0;k=(s|0)==0;j=0;while(1){if((j|0)>=(c[t>>2]|0))break;g=c[m+(j<<2)>>2]|0;e=(d|0)!=0;if(e?(EC(g,d)|0)!=0:0)f=d;else r=23;do if((r|0)==23){r=0;if(o?(q=Yn(g,n)|0,q|0):0){f=q;break}f=0}while(0);IG(g)|0;i=Wu(g,f)|0;d=k|e?d:i;if(o?(f|0)==0|(f|0)==(d|0):0)HA(i,n,137699)|0;lr(g)|0;j=j+1|0}r=(gC(b)|0)+16|0;l6(c[(c[r>>2]|0)+112>>2]|0);c[(c[r>>2]|0)+112>>2]=0;hH(c[t>>2]|0,m,b,p)|0;cn(b)}e=0;while(1){if((e|0)>=(c[t>>2]|0))break;tC(b,c[m+(e<<2)>>2]|0)|0;e=e+1|0}l6(m)}if(s|0)PA(b,96039,HB(d)|0)|0;rM(b)}l=u;return}function Yn(a,b){a=a|0;b=b|0;var c=0;c=gC(a)|0;while(1){if(!c){c=0;break}if((bP(OA(c,b)|0)|0)<<24>>24)break;c=hC(a,c)|0}return c|0}function Zn(a){a=a|0;var b=0,c=0;b=gC(a)|0;if(b|0){while(1){if(!b)break;c=UA(a,b)|0;while(1){if(!c)break;WP(c);c=WA(a,c)|0}UP(b);b=hC(a,b)|0}_n(a)}return}function _n(a){a=a|0;l6(c[(c[a+16>>2]|0)+152>>2]|0);if((vC(a)|0)!=(a|0))XC(a,0,137786);return}function $n(a){a=a|0;ao(a);if(!((qB(a)|0)==0?!(c[(c[a+16>>2]|0)+180>>2]|0):0)){kv(a);rM(a)}return}function ao(a){a=a|0;c[47201]=DA(a,1,108531,108537)|0;mQ(a,2);b[(c[a+16>>2]|0)+176>>1]=2;c[47184]=2;bo(a,0);co(a);return}function bo(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i;h=(b|0)==0;if(h){go(g);b=g}d=MD(a)|0;while(1){if(!d)break;if(!(h2(HB(d)|0,108307,7)|0)){RC(d,137786,280,1)|0;ho(b,d);bo(d,0)}else bo(d,b);d=ND(d)|0}if(h?(e=c[g+8>>2]|0,f=a+16|0,c[(c[f>>2]|0)+180>>2]=e,e|0):0){h=KK(c[g>>2]|0,(e<<2)+4|0)|0;c[(c[f>>2]|0)+184>>2]=h}l=i;return}function co(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;f=HK((qB(a)|0)<<2)|0;b=HK(((qB(a)|0)<<2)+4|0)|0;g=a+16|0;c[(c[g>>2]|0)+152>>2]=b;b=gC(a)|0;d=0;while(1){if(!b)break;RC(b,137750,304,1)|0;c[(c[b+16>>2]|0)+112>>2]=f+(d<<2);c[(c[(c[g>>2]|0)+152>>2]|0)+(d<<2)>>2]=b;eo(b);e=UA(a,b)|0;while(1){if(!e)break;fo(e);e=WA(a,e)|0}b=hC(a,b)|0;d=d+1|0}return}function eo(a){a=a|0;PA(a,108531,108537)|0;return}function fo(a){a=a|0;RC(a,137763,304,1)|0;return}function go(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;return}function ho(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;g=a+8|0;d=(c[g>>2]|0)+1|0;c[g>>2]=d;e=a+4|0;h=c[e>>2]|0;f=h+10|0;if((d|0)<(h|0))a=c[a>>2]|0;else{c[e>>2]=f;d=KK(c[a>>2]|0,f<<2)|0;c[a>>2]=d;a=d;d=c[g>>2]|0}c[a+(d<<2)>>2]=b;return}function io(a){a=a|0;var b=0,d=0;b=gC(a)|0;if(b|0){l6(c[(c[b+16>>2]|0)+112>>2]|0);while(1){if(!b)break;d=UA(a,b)|0;while(1){if(!d)break;WP(d);d=WA(a,d)|0}UP(b);b=hC(a,b)|0}jo(a)}return}function jo(a){a=a|0;l6(c[(c[a+16>>2]|0)+152>>2]|0);if((vC(a)|0)!=(a|0))XC(a,0,137786);return}function ko(a){a=a|0;var d=0,e=0,f=0;lo(a);mo(a,0);no(a,0);oo(a,0);d=c[a+16>>2]|0;if(!(c[(c[d+8>>2]|0)+84>>2]|0)){d=b[d+136>>1]&14;if(d<<16>>16)Tm(a,d&65535)|0}else{d=gC(a)|0;while(1){if(!d)break;f=c[d+16>>2]|0;e=c[f+132>>2]|0;h[e>>3]=+h[f+16>>3]/72.0;h[e+8>>3]=+h[f+24>>3]/72.0;d=hC(a,d)|0}Wm(a,1)}rM(a);return}function lo(a){a=a|0;var d=0,e=0;mQ(a,2);b[(c[a+16>>2]|0)+176>>1]=2;c[47184]=2;d=gC(a)|0;while(1){if(!d)break;Wl(d);d=hC(a,d)|0}e=gC(a)|0;while(1){if(!e)break;d=UA(a,e)|0;while(1){if(!d)break;RC(d,137763,176,1)|0;rP(d)|0;d=WA(a,d)|0}e=hC(a,e)|0}return}function mo(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i;h=(b|0)==0;if(h){to(g);b=g}d=MD(a)|0;while(1){if(!d)break;if(!(h2(HB(d)|0,108307,7)|0)){RC(d,137786,280,1)|0;sK(d);uo(b,d);mo(d,0)}else mo(d,b);d=ND(d)|0}if(h?(e=c[g+8>>2]|0,f=a+16|0,c[(c[f>>2]|0)+180>>2]=e,e|0):0){h=KK(c[g>>2]|0,(e<<2)+4|0)|0;c[(c[f>>2]|0)+184>>2]=h}l=i;return}function no(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,i=0,j=0.0,k=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;T=l;l=l+448|0;J=T+400|0;I=T+384|0;S=T+344|0;R=T+320|0;Q=T+248|0;G=T+208|0;A=T+152|0;B=T+96|0;p=T+88|0;e=T+64|0;L=T+32|0;M=T;E=T+416|0;u=T+304|0;z=T+288|0;N=T+192|0;O=T+176|0;P=T+136|0;K=T+72|0;o=c[a+60>>2]|0;if((d[195234]|0)>1){po(b);H=c[15715]|0;c[e>>2]=HB(a)|0;z4(H,91024,e)|0}H=a+16|0;g=b+1|0;e=1;f=0;while(1){i=c[H>>2]|0;if((e|0)>(c[i+180>>2]|0))break;F=c[(c[i+184>>2]|0)+(e<<2)>>2]|0;no(F,g);e=e+1|0;f=(qB(F)|0)+f|0}r=(qB(a)|0)-f|0;e=c[H>>2]|0;F=(c[e+180>>2]|0)+r|0;v=(F|0)==0;if(v?(c[e+12>>2]|0)==0:0){S=e+16|0;c[S>>2]=0;c[S+4>>2]=0;c[S+8>>2]=0;c[S+12>>2]=0;h[e+40>>3]=18.0;h[e+32>>3]=18.0}else{e=E+16|0;do if((iH(a,4,4,E)|0)>>>0>=3)if((c[e>>2]|0)==4?(c[E+28>>2]&2|0)!=0:0){f=DA(o,0,99491,0)|0;e=DA(o,1,99491,0)|0;if((f|0)!=0|(e|0)!=0){c[E+24>>2]=HK(F<<2)|0;break}else{c[p>>2]=HB(a)|0;dA(0,90878,p)|0;e=0;f=0;break}}else{e=0;f=0}else{c[e>>2]=3;e=0;f=0}while(0);C=HK(F<<5)|0;D=HK(F<<2)|0;s=E+24|0;o=(f|0)!=0;q=0;i=1;while(1){g=c[H>>2]|0;if((i|0)>(c[g+180>>2]|0))break;g=c[(c[g+184>>2]|0)+(i<<2)>>2]|0;y=C+(q<<5)|0;x=(c[g+16>>2]|0)+16|0;c[y>>2]=c[x>>2];c[y+4>>2]=c[x+4>>2];c[y+8>>2]=c[x+8>>2];c[y+12>>2]=c[x+12>>2];c[y+16>>2]=c[x+16>>2];c[y+20>>2]=c[x+20>>2];c[y+24>>2]=c[x+24>>2];c[y+28>>2]=c[x+28>>2];if(o&(c[s>>2]|0)!=0){y=XO(g,f,0,0)|0;c[(c[s>>2]|0)+(q<<2)>>2]=y}c[D+(q<<2)>>2]=g;q=q+1|0;i=i+1|0}w=L+16|0;x=L+8|0;y=L+24|0;a:do if((r|0)>0){p=(e|0)!=0;o=gC(a)|0;f=q;while(1){if(!o)break a;g=c[o+16>>2]|0;i=g+112|0;if(!(c[i>>2]|0)){c[i>>2]=a;c[L>>2]=0;c[L+4>>2]=0;c[L+8>>2]=0;c[L+12>>2]=0;h[w>>3]=+h[g+88>>3]+ +h[g+96>>3];h[y>>3]=+h[g+80>>3];t=C+(f<<5)|0;c[t>>2]=c[L>>2];c[t+4>>2]=c[L+4>>2];c[t+8>>2]=c[L+8>>2];c[t+12>>2]=c[L+12>>2];c[t+16>>2]=c[L+16>>2];c[t+20>>2]=c[L+20>>2];c[t+24>>2]=c[L+24>>2];c[t+28>>2]=c[L+28>>2];if(p&(c[s>>2]|0)!=0){t=XO(o,e,0,0)|0;c[(c[s>>2]|0)+(f<<2)>>2]=t}c[D+(f<<2)>>2]=o;f=f+1|0}o=hC(a,o)|0}}while(0);t=bH(F,C,E)|0;e=c[s>>2]|0;if(e|0)l6(e);qo(M,2147483647.0,2147483647.0);r=M+16|0;qo(u,-2147483647.0,-2147483647.0);c[r>>2]=c[u>>2];c[r+4>>2]=c[u+4>>2];c[r+8>>2]=c[u+8>>2];c[r+12>>2]=c[u+12>>2];o=M+24|0;p=M+8|0;q=c[15715]|0;e=0;while(1){i=c[H>>2]|0;if((e|0)>=(F|0))break;k=+(c[t+(e<<3)>>2]|0);n=+(c[t+(e<<3)+4>>2]|0);f=C+(e<<5)|0;c[L>>2]=c[f>>2];c[L+4>>2]=c[f+4>>2];c[L+8>>2]=c[f+8>>2];c[L+12>>2]=c[f+12>>2];c[L+16>>2]=c[f+16>>2];c[L+20>>2]=c[f+20>>2];c[L+24>>2]=c[f+24>>2];c[L+28>>2]=c[f+28>>2];j=k+ +h[L>>3];h[L>>3]=j;k=k+ +h[w>>3];h[w>>3]=k;m=n+ +h[x>>3];h[x>>3]=m;n=n+ +h[y>>3];h[y>>3]=n;h[M>>3]=+h[(+h[M>>3]>3];h[p>>3]=+h[(+h[p>>3]>3];h[r>>3]=+h[(+h[r>>3]>k?M:L)+16>>3];h[o>>3]=+h[(+h[o>>3]>n?M:L)+24>>3];f=c[D+(e<<2)>>2]|0;g=f+16|0;if((e|0)<(c[i+180>>2]|0)){u=(c[g>>2]|0)+16|0;c[u>>2]=c[L>>2];c[u+4>>2]=c[L+4>>2];c[u+8>>2]=c[L+8>>2];c[u+12>>2]=c[L+12>>2];c[u+16>>2]=c[L+16>>2];c[u+20>>2]=c[L+20>>2];c[u+24>>2]=c[L+24>>2];c[u+28>>2]=c[L+28>>2];if((d[195234]|0)>1){po(b);c[B>>2]=HB(f)|0;h[B+8>>3]=j;h[B+16>>3]=m;h[B+24>>3]=k;h[B+32>>3]=n;z4(q,90857,B)|0}}else{u=(c[g>>2]|0)+16|0;c[I>>2]=c[L>>2];c[I+4>>2]=c[L+4>>2];c[I+8>>2]=c[L+8>>2];c[I+12>>2]=c[L+12>>2];c[J>>2]=c[w>>2];c[J+4>>2]=c[w+4>>2];c[J+8>>2]=c[w+8>>2];c[J+12>>2]=c[w+12>>2];ro(z,I,J);c[u>>2]=c[z>>2];c[u+4>>2]=c[z+4>>2];c[u+8>>2]=c[z+8>>2];c[u+12>>2]=c[z+12>>2];if((d[195234]|0)>1){po(b);u=HB(f)|0;s=c[g>>2]|0;m=+h[s+16>>3];n=+h[s+24>>3];c[A>>2]=u;h[A+8>>3]=m;h[A+16>>3]=n;z4(q,90845,A)|0}}e=e+1|0}e=c[i+12>>2]|0;if(e|0){j=+h[e+24>>3];if(v){k=+h[e+32>>3];c[M>>2]=0;c[M+4>>2]=0;c[M+8>>2]=0;c[M+12>>2]=0;h[r>>3]=j;h[o>>3]=k;k=j;m=0.0}else{k=+h[r>>3];m=+h[M>>3]}n=j-(k-m);j=n*.5;if(n>0.0){h[M>>3]=m-j;h[r>>3]=k+j}}if((b|0)>0)j=+((c[E+8>>2]|0)>>>0)*.5;else j=0.0;k=+h[M>>3]-j;h[M>>3]=k;m=j+ +h[r>>3];h[r>>3]=m;n=+h[p>>3]-(j+ +h[i+56>>3]);h[p>>3]=n;j=+h[o>>3]+(j+ +h[i+88>>3]);h[o>>3]=j;if((d[195234]|0)>1){po(b);c[G>>2]=HB(a)|0;h[G+8>>3]=k;h[G+16>>3]=n;h[G+24>>3]=m;h[G+32>>3]=j;z4(q,90857,G)|0}e=0;while(1){if((e|0)>=(F|0))break;f=c[D+(e<<2)>>2]|0;g=f+16|0;if((e|0)<(c[(c[H>>2]|0)+180>>2]|0)){G=(c[g>>2]|0)+16|0;c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[L+16>>2]=c[G+16>>2];c[L+20>>2]=c[G+20>>2];c[L+24>>2]=c[G+24>>2];c[L+28>>2]=c[G+28>>2];c[I>>2]=c[G>>2];c[I+4>>2]=c[G+4>>2];c[I+8>>2]=c[G+8>>2];c[I+12>>2]=c[G+12>>2];c[J>>2]=c[M>>2];c[J+4>>2]=c[M+4>>2];c[J+8>>2]=c[M+8>>2];c[J+12>>2]=c[M+12>>2];so(L,I,J);c[I>>2]=c[w>>2];c[I+4>>2]=c[w+4>>2];c[I+8>>2]=c[w+8>>2];c[I+12>>2]=c[w+12>>2];c[J>>2]=c[M>>2];c[J+4>>2]=c[M+4>>2];c[J+8>>2]=c[M+8>>2];c[J+12>>2]=c[M+12>>2];so(N,I,J);c[w>>2]=c[N>>2];c[w+4>>2]=c[N+4>>2];c[w+8>>2]=c[N+8>>2];c[w+12>>2]=c[N+12>>2];G=(c[g>>2]|0)+16|0;c[G>>2]=c[L>>2];c[G+4>>2]=c[L+4>>2];c[G+8>>2]=c[L+8>>2];c[G+12>>2]=c[L+12>>2];c[G+16>>2]=c[L+16>>2];c[G+20>>2]=c[L+20>>2];c[G+24>>2]=c[L+24>>2];c[G+28>>2]=c[L+28>>2];if((d[195234]|0)>1){po(b);G=HB(f)|0;j=+h[L>>3];k=+h[x>>3];m=+h[w>>3];n=+h[y>>3];c[Q>>2]=G;h[Q+8>>3]=j;h[Q+16>>3]=k;h[Q+24>>3]=m;h[Q+32>>3]=n;z4(q,90857,Q)|0}}else{G=(c[g>>2]|0)+16|0;c[I>>2]=c[G>>2];c[I+4>>2]=c[G+4>>2];c[I+8>>2]=c[G+8>>2];c[I+12>>2]=c[G+12>>2];c[J>>2]=c[M>>2];c[J+4>>2]=c[M+4>>2];c[J+8>>2]=c[M+8>>2];c[J+12>>2]=c[M+12>>2];so(O,I,J);c[G>>2]=c[O>>2];c[G+4>>2]=c[O+4>>2];c[G+8>>2]=c[O+8>>2];c[G+12>>2]=c[O+12>>2];if((d[195234]|0)>1){po(b);G=HB(f)|0;E=c[g>>2]|0;m=+h[E+16>>3];n=+h[E+24>>3];c[R>>2]=G;h[R+8>>3]=m;h[R+16>>3]=n;z4(q,90845,R)|0}}e=e+1|0}c[I>>2]=c[r>>2];c[I+4>>2]=c[r+4>>2];c[I+8>>2]=c[r+8>>2];c[I+12>>2]=c[r+12>>2];c[J>>2]=c[M>>2];c[J+4>>2]=c[M+4>>2];c[J+8>>2]=c[M+8>>2];c[J+12>>2]=c[M+12>>2];so(P,I,J);c[r>>2]=c[P>>2];c[r+4>>2]=c[P+4>>2];c[r+8>>2]=c[P+8>>2];c[r+12>>2]=c[P+12>>2];c[I>>2]=c[M>>2];c[I+4>>2]=c[M+4>>2];c[I+8>>2]=c[M+8>>2];c[I+12>>2]=c[M+12>>2];c[J>>2]=c[M>>2];c[J+4>>2]=c[M+4>>2];c[J+8>>2]=c[M+8>>2];c[J+12>>2]=c[M+12>>2];so(K,I,J);c[M>>2]=c[K>>2];c[M+4>>2]=c[K+4>>2];c[M+8>>2]=c[K+8>>2];c[M+12>>2]=c[K+12>>2];R=(c[H>>2]|0)+16|0;c[R>>2]=c[M>>2];c[R+4>>2]=c[M+4>>2];c[R+8>>2]=c[M+8>>2];c[R+12>>2]=c[M+12>>2];c[R+16>>2]=c[M+16>>2];c[R+20>>2]=c[M+20>>2];c[R+24>>2]=c[M+24>>2];c[R+28>>2]=c[M+28>>2];if((d[195234]|0)>1){po(b);R=HB(a)|0;j=+h[M>>3];k=+h[p>>3];m=+h[r>>3];n=+h[o>>3];c[S>>2]=R;h[S+8>>3]=j;h[S+16>>3]=k;h[S+24>>3]=m;h[S+32>>3]=n;z4(q,90857,S)|0}l6(C);l6(D);l6(t)}l=T;return}function oo(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0,t=0,u=0,v=0;u=l;l=l+80|0;t=u+32|0;j=u+8|0;e=u;s=a+16|0;p=c[s>>2]|0;q=+h[p+16>>3];r=+h[p+24>>3];if((d[195234]|0)>1){po(b);p=c[15715]|0;c[e>>2]=HB(a)|0;z4(p,90830,e)|0}p=(b|0)!=0;a:do if(p){e=gC(a)|0;f=c[15715]|0;while(1){if(!e)break a;g=e+16|0;i=c[g>>2]|0;if((c[i+112>>2]|0)==(a|0)?(v=i+16|0,h[v>>3]=q+ +h[v>>3],i=i+24|0,h[i>>3]=r+ +h[i>>3],(d[195234]|0)>1):0){po(b);v=HB(e)|0;i=c[g>>2]|0;n=+h[i+16>>3];o=+h[i+24>>3];c[j>>2]=v;h[j+8>>3]=n;h[j+16>>3]=o;z4(f,90845,j)|0}e=hC(a,e)|0}}else f=c[15715]|0;while(0);j=b+1|0;a=1;while(1){e=c[s>>2]|0;if((a|0)>(c[e+180>>2]|0))break;i=c[(c[e+184>>2]|0)+(a<<2)>>2]|0;if(p){g=i+16|0;e=c[g>>2]|0;k=q+ +h[e+16>>3];m=r+ +h[e+24>>3];n=q+ +h[e+32>>3];o=r+ +h[e+40>>3];if((d[195234]|0)>1){po(b);c[t>>2]=HB(i)|0;h[t+8>>3]=k;h[t+16>>3]=m;h[t+24>>3]=n;h[t+32>>3]=o;z4(f,90857,t)|0;e=c[g>>2]|0}h[e+16>>3]=k;h[e+24>>3]=m;h[e+32>>3]=n;h[e+40>>3]=o}oo(i,j);a=a+1|0}l=u;return}function po(a){a=a|0;var b=0;b=c[15715]|0;while(1){if((a|0)<=0)break;Z3(90875,b)|0;a=a+-1|0}return}function qo(a,b,c){a=a|0;b=+b;c=+c;h[a>>3]=b;h[a+8>>3]=c;return}function ro(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=(+h[b+8>>3]+ +h[c+8>>3])*.5;h[a>>3]=(+h[b>>3]+ +h[c>>3])*.5;h[a+8>>3]=d;return}function so(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=+h[b+8>>3]-+h[c+8>>3];h[a>>3]=+h[b>>3]-+h[c>>3];h[a+8>>3]=d;return}function to(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;return}function uo(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;g=a+8|0;d=(c[g>>2]|0)+1|0;c[g>>2]=d;e=a+4|0;h=c[e>>2]|0;f=h+10|0;if((d|0)<(h|0))a=c[a>>2]|0;else{c[e>>2]=f;d=KK(c[a>>2]|0,f<<2)|0;c[a>>2]=d;a=d;d=c[g>>2]|0}c[a+(d<<2)>>2]=b;return}function vo(a){a=a|0;var b=0;b=gC(a)|0;while(1){if(!b)break;UP(b);b=hC(a,b)|0}wo(a);return}function wo(a){a=a|0;var b=0,d=0,e=0;b=a+16|0;a=1;while(1){e=c[b>>2]|0;d=c[e+184>>2]|0;if((a|0)>(c[e+180>>2]|0))break;e=c[d+(a<<2)>>2]|0;AK(c[(c[e+16>>2]|0)+12>>2]|0);wo(e);a=a+1|0}l6(d);return}function xo(a){a=a|0;var b=0,d=0,e=0;WC(a,1,137750,304,1);FP(a)|0;b=HK(((qB(a)|0)<<2)+4|0)|0;e=a+16|0;c[(c[e>>2]|0)+152>>2]=b;b=0;d=gC(a)|0;while(1){if(!d)break;yo(d);c[(c[(c[e>>2]|0)+152>>2]|0)+(b<<2)>>2]=d;c[(c[d+16>>2]|0)+120>>2]=b;b=b+1|0;d=hC(a,d)|0}e=DA(a,2,92794,0)|0;d=gC(a)|0;while(1){if(!d)break;b=UA(a,d)|0;while(1){if(!b)break;zo(b,e);b=WA(a,b)|0}d=hC(a,d)|0}Ao(a);return}function yo(a){a=a|0;var b=0;qP(a);b=HK((e[(c[(uC(a)|0)+16>>2]|0)+176>>1]|0)<<3)|0;c[(c[a+16>>2]|0)+132>>2]=b;oQ(a,c[(c[(uC(a)|0)+16>>2]|0)+116>>2]&1);return}function zo(a,b){a=a|0;b=b|0;var d=0,e=0.0;RC(a,137763,176,1)|0;e=+YO(a,c[47236]|0,1.0,0.0);d=a+16|0;h[(c[d>>2]|0)+128>>3]=e;e=+YO(a,b,+h[(c[5180]|0)+32>>3],0.0);h[(c[d>>2]|0)+136>>3]=e;rP(a)|0;return}function Ao(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;r=l;l=l+32|0;q=r+16|0;p=r;m=r+24|0;n=DA(b,1,102924,0)|0;a:do if(n|0){o=DA(b,1,90961,0)|0;i=b+16|0;j=(o|0)==0;k=c[15715]|0;g=0;while(1){e=c[(c[(c[i>>2]|0)+152>>2]|0)+(g<<2)>>2]|0;if(!e)break a;b=OA(e,n)|0;do if(a[b>>0]|0){f=e+16|0;d=c[(c[f>>2]|0)+132>>2]|0;a[m>>0]=0;c[p>>2]=d;c[p+4>>2]=d+8;c[p+8>>2]=m;if((q4(b,102050,p)|0)<=1){c[q>>2]=HB(e)|0;c[q+4>>2]=b;z4(k,90965,q)|0;break}b:do if(+h[23314]>0.0){b=0;while(1){if((b|0)==2)break b;s=d+(b<<3)|0;h[s>>3]=+h[s>>3]/+h[23314];b=b+1|0}}while(0);b=c[f>>2]|0;a[b+119>>0]=1;if((a[m>>0]|0)!=33){if(j)break;if(!((bP(OA(e,o)|0)|0)<<24>>24))break;b=c[f>>2]|0}a[b+119>>0]=3}while(0);g=g+1|0}}while(0);l=r;return}function Bo(a){a=a|0;var b=0,c=0;c=gC(a)|0;while(1){if(!c)break;b=UA(a,c)|0;while(1){if(!b)break;WP(b);b=WA(a,b)|0}UP(c);c=hC(a,c)|0}Co(a);return}function Co(a){a=a|0;Do(a);a=a+16|0;l6(c[(c[a>>2]|0)+152>>2]|0);l6(c[(c[a>>2]|0)+140>>2]|0);return}function Do(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;g=a+16|0;f=1;while(1){e=c[g>>2]|0;b=c[e+184>>2]|0;if((f|0)>(c[e+180>>2]|0))break;e=c[b+(f<<2)>>2]|0;b=e+16|0;AK(c[(c[b>>2]|0)+12>>2]|0);d=c[(c[b>>2]|0)+140>>2]|0;if(d|0){l6(c[d>>2]|0);l6(c[(c[b>>2]|0)+140>>2]|0)}Do(e);f=f+1|0}l6(b);if((vC(a)|0)!=(a|0))TC(a,137786)|0;return}function Eo(a,b){a=a|0;b=b|0;c[b+4>>2]=DA(a,0,91017,0)|0;c[b+8>>2]=DA(a,0,141419,0)|0;c[b+12>>2]=DA(a,0,141351,0)|0;c[b>>2]=a;c[b+16>>2]=0;c[b+36>>2]=iH(a,2,4,b+20|0)|0;return}function Fo(a){a=a|0;var d=0,e=0;mQ(a,2);d=HK(56)|0;e=a+16|0;c[(c[e>>2]|0)+140>>2]=d;d=(XO(a,DA(a,0,91675,0)|0,2,2)|0)&65535;d=(d&65535)<10?d:10;b[(c[e>>2]|0)+176>>1]=d;c[47184]=d&65535;Go(a,0,a);cp(a);xo(a);return}function Go(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;m=l;l=l+16|0;j=m;k=(d|0)==0;if(k){Ho(j);d=j}g=e+16|0;f=MD(a)|0;while(1){if(!f)break;if(!(h2(HB(f)|0,108307,7)|0)){RC(f,137786,280,1)|0;n=HK(56)|0;p=c[f+16>>2]|0;c[p+140>>2]=n;o=c[g>>2]|0;b[p+176>>1]=b[o+176>>1]|0;c[n+44>>2]=(c[(c[o+140>>2]|0)+44>>2]|0)+1;c[n+48>>2]=e;Io(d,f);Go(f,0,f)}else Go(f,d,e);f=ND(f)|0}if(k?(h=c[j+8>>2]|0,i=a+16|0,c[(c[i>>2]|0)+180>>2]=h,h|0):0){p=KK(c[j>>2]|0,(h<<2)+4|0)|0;c[(c[i>>2]|0)+184>>2]=p}l=m;return}function Ho(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;return}function Io(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;g=a+8|0;d=(c[g>>2]|0)+1|0;c[g>>2]=d;e=a+4|0;h=c[e>>2]|0;f=h+10|0;if((d|0)<(h|0))a=c[a>>2]|0;else{c[e>>2]=f;d=KK(c[a>>2]|0,f<<2)|0;c[a>>2]=d;a=d;d=c[g>>2]|0}c[a+(d<<2)>>2]=b;return}function Jo(a){a=a|0;var b=0,c=0;b=l;l=l+64|0;c=b;Eo(a,c);Ko(a,c);Lo(a);Mo(a,a);No(a);l=b;return}function Ko(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0,w=0.0,x=0.0;s=l;l=l+64|0;r=s+48|0;e=s+40|0;o=s+56|0;n=s+52|0;m=s;if(a[195234]|0){q=c[15715]|0;c[e>>2]=HB(b)|0;z4(q,91024,e)|0}e=gC(b)|0;while(1){if(!e)break;c[(c[e+16>>2]|0)+164>>2]=0;e=hC(b,e)|0}p=Oo(b,d)|0;q=Fv(p,o,n)|0;e=q;while(1){k=e+4|0;f=c[e>>2]|0;if(!f)break;dp(f,m);e=gC(f)|0;while(1){if(!e)break;g=hC(f,e)|0;i=e+16|0;j=c[i>>2]|0;if(c[j+212>>2]|0){v=Po(e,f)|0;Ko(v,d);v=c[(c[v+16>>2]|0)+140>>2]|0;u=+h[v+24>>3];j=c[i>>2]|0;h[j+32>>3]=u;t=+h[v+32>>3];h[j+40>>3]=t;u=u*72.0*.5;h[j+88>>3]=u;h[j+96>>3]=u;h[j+80>>3]=t*72.0;e=g;continue}if(c[(c[j+112>>2]|0)+8>>2]|0){e=g;continue}tC(f,e)|0;e=g}if((qB(f)|0)<=1){e=k;continue}if((c[d>>2]|0)==(b|0))Iq(f)|0;qp(f,m);e=k}e=c[o>>2]|0;if((e|0)<=1)if((e|0)==1){zP(c[q>>2]|0);e=0}else e=0;else{if(!(c[n>>2]|0))f=0;else{f=HK(e)|0;a[f>>0]=1;e=c[o>>2]|0}c[d+40>>2]=f;e=OG(e,q,0,d+20|0)|0;l6(f)}Qo(p,c[o>>2]|0,q,e,b,d);l6(e);g=gC(p)|0;while(1){if(!g)break;e=c[g+16>>2]|0;f=c[e+212>>2]|0;i=e+132|0;if(!f){e=c[(c[e+112>>2]|0)+8>>2]|0;if(e|0){o=c[i>>2]|0;v=c[(c[e+16>>2]|0)+132>>2]|0;h[v>>3]=+h[o>>3];h[v+8>>3]=+h[o+8>>3]}}else{o=c[i>>2]|0;x=+h[e+32>>3];w=+h[o>>3]-x*.5;v=c[(c[f+16>>2]|0)+140>>2]|0;h[v+8>>3]=w;t=+h[e+40>>3];u=+h[o+8>>3]-t*.5;h[v+16>>3]=u;h[v+24>>3]=x+w;h[v+32>>3]=t+u}g=hC(p,g)|0}v=(c[(c[b+16>>2]|0)+140>>2]|0)+8|0;o=(c[(c[p+16>>2]|0)+140>>2]|0)+8|0;c[v>>2]=c[o>>2];c[v+4>>2]=c[o+4>>2];c[v+8>>2]=c[o+8>>2];c[v+12>>2]=c[o+12>>2];c[v+16>>2]=c[o+16>>2];c[v+20>>2]=c[o+20>>2];c[v+24>>2]=c[o+24>>2];c[v+28>>2]=c[o+28>>2];Ro(p,q);l6(q);if(a[195234]|0){v=c[15715]|0;c[r>>2]=HB(b)|0;z4(v,91035,r)|0}l=s;return}function Lo(b){b=b|0;var d=0,e=0,f=0.0,g=0.0,i=0.0,j=0.0,k=0,l=0.0,m=0.0;d=gC(b)|0;while(1){if(!d)break;e=c[d+16>>2]|0;if(a[e+118>>0]|0){k=c[(c[(c[e+212>>2]|0)+16>>2]|0)+140>>2]|0;j=+h[k+24>>3]-+h[k+8>>3];i=+h[k+32>>3]-+h[k+16>>3];m=j*.5;l=i*.5;g=m*72.0;f=l*72.0;k=c[e+132>>2]|0;h[k>>3]=m;h[k+8>>3]=l;h[e+32>>3]=j;h[e+40>>3]=i;h[e+96>>3]=g;h[e+88>>3]=g;h[e+80>>3]=i*72.0;e=c[(c[e+12>>2]|0)+44>>2]|0;h[e>>3]=g;h[e+8>>3]=f;i=-g;h[e+16>>3]=i;h[e+24>>3]=f;h[e+32>>3]=i;f=-f;h[e+40>>3]=f;h[e+48>>3]=g;h[e+56>>3]=f}d=hC(b,d)|0}return}function Mo(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0.0,i=0,j=0,k=0.0,l=0,m=0.0,n=0,o=0.0,p=0;i=a+16|0;j=c[(c[i>>2]|0)+140>>2]|0;f=+h[j+8>>3];g=+h[j+16>>3];j=(a|0)!=(b|0);a:do if(j){d=gC(a)|0;while(1){if(!d){a=1;break a}e=c[d+16>>2]|0;if((c[e+212>>2]|0)==(a|0)){e=c[e+132>>2]|0;h[e>>3]=f+ +h[e>>3];e=e+8|0;h[e>>3]=g+ +h[e>>3]}d=hC(a,d)|0}}else a=1;while(0);while(1){d=c[i>>2]|0;if((a|0)>(c[d+180>>2]|0))break;d=c[(c[d+184>>2]|0)+(a<<2)>>2]|0;if(j){e=c[(c[d+16>>2]|0)+140>>2]|0;p=e+8|0;n=e+16|0;l=e+24|0;e=e+32|0;o=g+ +h[n>>3];m=f+ +h[l>>3];k=g+ +h[e>>3];h[p>>3]=f+ +h[p>>3];h[n>>3]=o;h[l>>3]=m;h[e>>3]=k}Mo(d,b);a=a+1|0}return}function No(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,g=0.0;b=a+16|0;a=c[b>>2]|0;d=c[a+140>>2]|0;g=+h[d+16>>3]*72.0;f=+h[d+24>>3]*72.0;e=+h[d+32>>3]*72.0;h[a+16>>3]=+h[d+8>>3]*72.0;h[a+24>>3]=g;h[a+32>>3]=f;h[a+40>>3]=e;a=1;while(1){d=c[b>>2]|0;if((a|0)>(c[d+180>>2]|0))break;No(c[(c[d+184>>2]|0)+(a<<2)>>2]|0);a=a+1|0}return}function Oo(e,f){e=e|0;f=f|0;var g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;z=l;l=l+160|0;t=z+24|0;u=z+8|0;i=z;g=z+56|0;x=f+16|0;y=c[x>>2]|0;c[x>>2]=y+1;c[t>>2]=y;i2(g,91097,t)|0;if((d[195234]|0)>1){y=c[15715]|0;x=HB(e)|0;c[i>>2]=g;c[i+4>>2]=x;z4(y,91104,i)|0};c[t>>2]=c[4658];x=lB(91457,t,0)|0;RC(x,137786,280,1)|0;w=HK(56)|0;y=x+16|0;p=c[y>>2]|0;c[p+140>>2]=w;w=e+16|0;b[p+176>>1]=b[(c[w>>2]|0)+176>>1]|0;Xo(e,x,92808);Xo(e,x,93413);Xo(e,x,91503);p=f+4|0;q=t+16|0;r=t+8|0;s=t+24|0;k=0;o=1;while(1){g=c[w>>2]|0;if((o|0)>(c[g+180>>2]|0))break;c[t>>2]=c[332];c[t+4>>2]=c[333];c[t+8>>2]=c[334];c[t+12>>2]=c[335];c[t+16>>2]=c[336];c[t+20>>2]=c[337];c[t+24>>2]=c[338];c[t+28>>2]=c[339];i=c[(c[g+184>>2]|0)+(o<<2)>>2]|0;sK(i);j=Yo(x,HB(i)|0)|0;m=j+16|0;g=c[m>>2]|0;c[g+212>>2]=i;n=k+1|0;c[g+120>>2]=k;if(c[p>>2]|0)Zo(i,j,f,t);g=gC(i)|0;while(1){if(!g)break;c[(c[g+16>>2]|0)+164>>2]=j;g=hC(i,g)|0}g=c[m>>2]|0;if(a[g+119>>0]|0){m=c[g+132>>2]|0;h[m>>3]=(+h[t>>3]+ +h[q>>3])*.5;h[m+8>>3]=(+h[r>>3]+ +h[s>>3])*.5}k=n;o=o+1|0}m=gC(e)|0;while(1){if(!m)break;g=m+16|0;i=c[g>>2]|0;if(!(c[i+164>>2]|0)){j=i+212|0;t=c[j>>2]|0;if(t|0?(t|0)!=(c[(c[(c[w>>2]|0)+140>>2]|0)+48>>2]|0):0){v=18;break}c[j>>2]=e;if(!(a[i+118>>0]|0)){j=Yo(x,HB(m)|0)|0;i=c[g>>2]|0;c[i+164>>2]=j;j=c[j+16>>2]|0;c[j+120>>2]=k;h[j+32>>3]=+h[i+32>>3];h[j+40>>3]=+h[i+40>>3];h[j+88>>3]=+h[i+88>>3];h[j+96>>3]=+h[i+96>>3];h[j+80>>3]=+h[i+80>>3];c[j+8>>2]=c[i+8>>2];c[j+12>>2]=c[i+12>>2];g=a[i+119>>0]|0;if(g<<24>>24){f=c[i+132>>2]|0;t=c[j+132>>2]|0;h[t>>3]=+h[f>>3];h[t+8>>3]=+h[f+8>>3];a[j+119>>0]=g}c[(c[j+112>>2]|0)+8>>2]=m;g=k+1|0}else g=k}else g=k;m=hC(e,m)|0;k=g}if((v|0)==18){f=HB(m)|0;t=HB(e)|0;v=HB(c[(c[g>>2]|0)+212>>2]|0)|0;c[u>>2]=f;c[u+4>>2]=t;c[u+8>>2]=v;dA(1,91127,u)|0;Ca(187380,1)}n=gC(e)|0;while(1){if(!n)break;o=c[(c[n+16>>2]|0)+164>>2]|0;p=o+16|0;j=UA(e,n)|0;while(1){if(!j)break;g=c[(c[(c[((c[j>>2]&3|0)==2?j:j+-48|0)+40>>2]|0)+16>>2]|0)+164>>2]|0;if((g|0)!=(o|0)){if(g>>>0>o>>>0)m=fB(x,o,g,0,1)|0;else m=fB(x,g,o,0,1)|0;RC(m,137763,176,1)|0;i=c[j+16>>2]|0;v=c[m+16>>2]|0;h[v+136>>3]=+h[i+136>>3];h[v+128>>3]=+h[i+128>>3];g=c[(c[g+16>>2]|0)+112>>2]|0;i=g+4|0;c[i>>2]=(c[i>>2]|0)+1;i=c[(c[p>>2]|0)+112>>2]|0;u=i+4|0;c[u>>2]=(c[u>>2]|0)+1;if(!(c[v+172>>2]|0)){c[g>>2]=(c[g>>2]|0)+1;c[i>>2]=(c[i>>2]|0)+1}_o(m,j)}j=WA(e,j)|0}n=hC(e,n)|0}g=c[(c[w>>2]|0)+140>>2]|0;i=c[g>>2]|0;if(i|0){j=HK((c[g+4>>2]<<4)+16|0)|0;c[c[(c[y>>2]|0)+140>>2]>>2]=j;g=0;while(1){if(!(c[i>>2]|0))break;n=c[(c[(c[i+4>>2]|0)+16>>2]|0)+164>>2]|0;if(n){$o(e,i);o=Yo(x,194052)|0;p=o+16|0;c[(c[p>>2]|0)+120>>2]=k;if(o>>>0>n>>>0)m=fB(x,n,o,0,1)|0;else m=fB(x,o,n,0,1)|0;RC(m,137763,176,1)|0;v=c[i>>2]|0;u=c[v+16>>2]|0;w=c[m+16>>2]|0;h[w+136>>3]=+h[u+136>>3];h[w+128>>3]=+h[u+128>>3];_o(m,v);v=c[(c[p>>2]|0)+112>>2]|0;w=v+4|0;c[w>>2]=(c[w>>2]|0)+1;w=c[(c[n+16>>2]|0)+112>>2]|0;u=w+4|0;c[u>>2]=(c[u>>2]|0)+1;c[v>>2]=(c[v>>2]|0)+1;c[w>>2]=(c[w>>2]|0)+1;c[j+4>>2]=o;h[j+8>>3]=+h[i+8>>3];c[j>>2]=m;g=g+1|0;j=j+16|0;k=k+1|0}i=i+16|0}c[(c[(c[y>>2]|0)+140>>2]|0)+4>>2]=g}l=z;return x|0}function Po(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0,g=0,i=0,j=0,k=0,l=0;l=c[a+16>>2]|0;k=c[l+212>>2]|0;l=c[(c[l+112>>2]|0)+4>>2]|0;do if(l|0){j=HK((l<<4)+16|0)|0;f=Uo(a,b)|0;g=f+8|0;b=0;e=f;while(1){if(!(c[e>>2]|0))break;i=e+24|0;if(!(c[i>>2]|0))d=+h[g>>3]+6.283185307179586;else d=+h[e+32>>3];b=Vo(a,e,j,b,d)|0;e=i}if((b|0)==(l|0)){a=c[(c[k+16>>2]|0)+140>>2]|0;c[a>>2]=j;c[a+4>>2]=l;l6(f);break}else Aa(91043,91053,766,91062)}while(0);return k|0}function Qo(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0.0;B=l;l=l+32|0;u=B+16|0;y=B;m=c[g+8>>2]|0;k=c[g+12>>2]|0;v=(c[g>>2]|0)==(f|0);z=(b|0)!=0;x=y+8|0;w=y+4|0;A=y+12|0;a:do if(z){n=c[(c[d>>2]|0)+16>>2]|0;j=+h[n+16>>3];m=~~(j+(j>=0.0?.5:-.5));c[y>>2]=m;j=+h[n+24>>3];g=~~(j+(j>=0.0?.5:-.5));c[w>>2]=g;j=+h[n+32>>3];k=~~(j+(j>=0.0?.5:-.5));c[x>>2]=k;j=+h[n+40>>3];n=~~(j+(j>=0.0?.5:-.5));c[A>>2]=n;if((b|0)>1){b=c[e>>2]|0;t=c[e+4>>2]|0;m=m+b|0;c[y>>2]=m;s=g+t|0;c[w>>2]=s;b=k+b|0;c[x>>2]=b;p=u+4|0;q=u+8|0;r=u+12|0;o=e;g=d;t=n+t|0;while(1){g=g+4|0;k=o+8|0;c[A>>2]=t;n=c[g>>2]|0;if(!n){p=0;break a}F=c[n+16>>2]|0;G=+h[F+16>>3];i=+h[F+24>>3];j=+h[F+32>>3];H=+h[F+40>>3];F=~~(H+(H>=0.0?.5:-.5));c[r>>2]=F;n=c[k>>2]|0;E=c[o+12>>2]|0;D=~~(G+(G>=0.0?.5:-.5))+n|0;c[u>>2]=D;C=~~(i+(i>=0.0?.5:-.5))+E|0;c[p>>2]=C;n=~~(j+(j>=0.0?.5:-.5))+n|0;c[q>>2]=n;E=F+E|0;c[r>>2]=E;D=c[((m|0)<(D|0)?y:u)>>2]|0;c[y>>2]=D;C=c[((s|0)<(C|0)?y:u)+4>>2]|0;c[w>>2]=C;n=c[((b|0)>(n|0)?y:u)+8>>2]|0;c[x>>2]=n;o=k;t=c[((t|0)>(E|0)?y:u)+12>>2]|0;m=D;s=C;b=n}}else{p=0;s=g;t=n;b=k}}else{c[y>>2]=0;c[w>>2]=0;b=XO(f,m,54,3)|0;c[x>>2]=b;t=XO(f,k,36,3)|0;c[A>>2]=t;p=1;s=0;m=0}while(0);n=f+16|0;o=c[n>>2]|0;g=c[o+12>>2]|0;if(g){H=+h[g+24>>3];g=~~(H+(H>=0.0?.5:-.5))+(m-b)|0;if((g|0)>0){g=g>>>1;m=m-g|0;c[y>>2]=m;b=g+b|0;c[x>>2]=b;g=0}else g=0}else g=p;if(v|(g|0)!=0){k=0;g=o}else{k=XO(a,c[47198]|0,8,0)|0;g=c[n>>2]|0}q=k-m|0;p=~~(+(k-s|0)+ +h[g+56>>3]);c[y>>2]=0;c[w>>2]=0;o=q+k+b|0;c[x>>2]=o;n=~~(+(p+k|0)+ +h[g+88>>3]+ +(t|0));c[A>>2]=n;b:do if(z){g=e;c:while(1){b=d+4|0;k=c[d>>2]|0;if(!k)break b;if(!g){m=0;d=q;g=p}else{m=g+8|0;d=(c[g>>2]|0)+q|0;g=(c[g+4>>2]|0)+p|0}j=+(d|0)/72.0;i=+(g|0)/72.0;d=gC(k)|0;while(1){if(!d){d=b;g=m;continue c}F=c[(c[d+16>>2]|0)+132>>2]|0;h[F>>3]=j+ +h[F>>3];F=F+8|0;h[F>>3]=i+ +h[F>>3];d=hC(k,d)|0}}}while(0);F=c[(c[a+16>>2]|0)+140>>2]|0;h[F+8>>3]=0.0;h[F+16>>3]=0.0;h[F+24>>3]=+(o|0)/72.0;h[F+32>>3]=+(n|0)/72.0;l=B;return}function Ro(a,b){a=a|0;b=b|0;var d=0,e=0;while(1){d=c[b>>2]|0;if(!d)break;So(d);TC(d,137786)|0;b=b+4|0}b=c[c[(c[a+16>>2]|0)+140>>2]>>2]|0;if(b|0)l6(b);So(a);TC(a,137786)|0;d=gC(a)|0;while(1){if(!d)break;e=hC(a,d)|0;b=UA(a,d)|0;while(1){if(!b)break;l6(c[(c[b+16>>2]|0)+172>>2]|0);TC(b,137763)|0;b=WA(a,b)|0}To(d);d=e}pB(a)|0;return}function So(a){a=a|0;l6(c[(c[a+16>>2]|0)+140>>2]|0);return}function To(a){a=a|0;var b=0;b=a+16|0;l6(c[(c[b>>2]|0)+112>>2]|0);l6(c[(c[b>>2]|0)+132>>2]|0);TC(a,137750)|0;return}function Uo(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0.0,g=0,i=0,j=0,k=0,l=0,m=0;k=a+16|0;l=c[c[(c[k>>2]|0)+112>>2]>>2]|0;m=HK((l*24|0)+24|0)|0;i=0;j=ZA(b,a)|0;while(1){if(!j)break;g=c[j>>2]&3;e=c[((g|0)==2?j:j+-48|0)+40>>2]|0;if((e|0)==(a|0))e=c[((g|0)==3?j:j+48|0)+40>>2]|0;e=c[(c[e+16>>2]|0)+132>>2]|0;g=c[(c[k>>2]|0)+132>>2]|0;d=+h[e>>3]-+h[g>>3];f=+h[e+8>>3]-+h[g+8>>3];c[m+(i*24|0)>>2]=j;h[m+(i*24|0)+8>>3]=+O(+f,+d);h[m+(i*24|0)+16>>3]=d*d+f*f;i=i+1|0;j=_A(b,j,a)|0}if((i|0)!=(l|0))Aa(91076,91053,642,91085);k3(m,l,24,67);a:do if((l|0)>1){a=l+-1|0;e=0;b:while(1){if((e|0)>=(a|0))break a;f=+h[m+(e*24|0)+8>>3];g=e+1|0;j=g;while(1){i=m+(j*24|0)+8|0;if((j|0)>=(l|0))break;if(!(+h[i>>3]==f))break;j=j+1|0}if((j|0)==(g|0)){e=g;continue}if((j|0)==(l|0))d=3.141592653589793;else d=+h[i>>3];d=(d-f)/+(j-e|0);d=d>.03490658503988659?.03490658503988659:d;f=0.0;while(1){if((e|0)>=(j|0))continue b;k=m+(e*24|0)+8|0;h[k>>3]=f+ +h[k>>3];f=d+f;e=e+1|0}}}while(0);return m|0}function Vo(a,d,e,f,g){a=a|0;d=d|0;e=e|0;f=f|0;g=+g;var i=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0.0,q=0;k=c[d>>2]|0;n=c[k+16>>2]|0;m=b[n+168>>1]|0;o=m<<16>>16;j=c[k>>2]&3;i=c[((j|0)==2?k:k+-48|0)+40>>2]|0;if((i|0)==(a|0))i=c[((j|0)==3?k:k+48|0)+40>>2]|0;p=+h[d+8>>3];g=(g-p)/+(m<<16>>16);g=g>.03490658503988659?.03490658503988659:g;q=i>>>0>a>>>0;m=o+f|0;l=q?g:-g;d=q?1:-1;k=0;j=c[n+172>>2]|0;i=q?f:m+-1|0;g=q?p:p+ +(o+-1|0)*g;while(1){if((k|0)>=(o|0))break;q=c[j>>2]|0;c[e+(i<<4)>>2]=q;f=c[q>>2]&3;n=(f|0)==3?q:q+48|0;c[e+(i<<4)+4>>2]=c[((c[(c[(c[n+40>>2]|0)+16>>2]|0)+164>>2]|0)==(a|0)?n:(f|0)==2?q:q+-48|0)+40>>2];h[e+(i<<4)+8>>3]=g;k=k+1|0;j=j+4|0;i=i+d|0;g=l+g}return m|0}function Wo(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+h[a+8>>3];d=+h[b+8>>3];if(!(c>d))if(!(c>3];c=+h[b+16>>3];if(d>c)a=1;else a=(d>31}else a=-1;else a=1;return a|0}function Xo(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=DA(a,0,c,0)|0;do if(d|0){a=OA(a,d)|0;d=DA(b,0,c,0)|0;if(!d){DA(b,0,c,a)|0;break}else{HA(b,d,a)|0;break}}while(0);return}function Yo(a,b){a=a|0;b=b|0;var d=0,f=0;b=qC(a,b,1)|0;RC(b,137750,304,1)|0;f=HK(32)|0;d=b+16|0;c[(c[d>>2]|0)+112>>2]=f;a=IK((e[(c[a+16>>2]|0)+176>>1]|0)<<3)|0;c[(c[d>>2]|0)+132>>2]=a;return b|0}function Zo(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+80|0;n=q+56|0;m=q+32|0;o=q;p=q+64|0;i=c[e+4>>2]|0;k=OA(b,i)|0;do if(a[k>>0]|0){if((c[e>>2]|0)!=(b|0)){e=OA(OD(b)|0,i)|0;if((e|0)==(k|0))break;if(!(f2(k,e)|0))break}a[p>>0]=0;e=o+8|0;i=o+16|0;j=o+24|0;c[m>>2]=o;c[m+4>>2]=e;c[m+8>>2]=i;c[m+12>>2]=j;c[m+16>>2]=p;if((q4(k,91238,m)|0)<=3){c[n>>2]=HB(b)|0;c[n+4>>2]=k;dA(0,91256,n)|0;break}g=+h[23314];if(g>0.0){h[o>>3]=+h[o>>3]/g;h[e>>3]=+h[e>>3]/g;h[i>>3]=+h[i>>3]/g;h[j>>3]=+h[j>>3]/g}p=a[p>>0]|0;a[(c[d+16>>2]|0)+119>>0]=p<<24>>24==33?3:p<<24>>24==63?2:1;c[f>>2]=c[o>>2];c[f+4>>2]=c[o+4>>2];c[f+8>>2]=c[o+8>>2];c[f+12>>2]=c[o+12>>2];c[f+16>>2]=c[o+16>>2];c[f+20>>2]=c[o+20>>2];c[f+24>>2]=c[o+24>>2];c[f+28>>2]=c[o+28>>2]}while(0);l=q;return}function _o(a,d){a=a|0;d=d|0;var e=0,f=0,g=0;f=a+16|0;g=c[f>>2]|0;e=c[g+172>>2]|0;g=b[g+168>>1]|0;a=(g<<2)+4|0;if(!e)a=IK(a)|0;else a=KK(e,a)|0;c[a+(g<<2)>>2]=d;d=c[f>>2]|0;c[d+172>>2]=a;d=d+168|0;b[d>>1]=(b[d>>1]|0)+1<<16>>16;return}function $o(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;i=l;l=l+48|0;h=i+24|0;g=i;e=c[b>>2]|0;d=c[e>>2]&3;f=c[((d|0)==2?e:e+-48|0)+40>>2]|0;d=c[((d|0)==3?e:e+48|0)+40>>2]|0;b=D3(HB(a)|0)|0;j=D3(HB(f)|0)|0;j=(b+8+j+(D3(HB(d)|0)|0)|0)>999;b=HB(a)|0;if(j){d=HB(d)|0;j=HB(f)|0;h=(c[e>>2]|0)>>>4;c[g>>2]=b;c[g+4>>2]=d;c[g+8>>2]=j;j=g+16|0;c[j>>2]=h;c[j+4>>2]=0;i2(194052,91196,g)|0}else{d=c[(c[d+16>>2]|0)+120>>2]|0;j=c[(c[f+16>>2]|0)+120>>2]|0;g=(c[e>>2]|0)>>>4;c[h>>2]=b;c[h+4>>2]=d;c[h+8>>2]=j;j=h+16|0;c[j>>2]=g;c[j+4>>2]=0;i2(194052,91215,h)|0}l=i;return}function ap(a){a=a|0;var d=0,e=0,f=0.0,g=0.0,i=0,j=0,k=0;j=4;i=k6(40)|0;c[i>>2]=0;g=+h[23314];o=0;f=+da(1,a|0);d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,i|0,j|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)!=1){h[23314]=f;o=0;$(102,a|0);d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,i|0,j|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)!=1){i=x6(187380,1,i|0,j|0)|0;j=D;o=0;e=o;o=0;if((e|0)!=0&(p|0)!=0){d=A6(c[e>>2]|0,i|0,j|0)|0;if(!d)Ca(e|0,p|0);D=p}else d=-1;if((d|0)!=1)d=0;else d=D}else d=D}else d=D;while(1){if(d|0)break;o=0;$(103,a|0);d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,i|0,j|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)==1){d=D;continue}o=0;la(22,a|0)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,i|0,j|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)==1){d=D;continue}if(b[(c[a+16>>2]|0)+136>>1]&14){o=0;$(104,a|0);d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,i|0,j|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)==1){d=D;continue}}o=0;ha(22,a|0,0);d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,i|0,j|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)==1)d=D;else{k=12;break}}if((k|0)==12)h[23314]=g;l6(i|0);return}function bp(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;g=i;e=a+16|0;f=b[(c[e>>2]|0)+136>>1]&14;d=f&65535;if((f&65535)>8){if(f<<16>>16==12){if(Rm(a,25,10)|0){c[47180]=2;h=5}}else h=5;do if((h|0)==5)if(!(b[(c[e>>2]|0)+136>>1]&1)){Tm(a,d)|0;break}else{dA(0,91299,g)|0;d=2;break}while(0);c[47180]=0}if((c[47185]|0)<1)Tm(a,d)|0;l=i;return}function cp(a){a=a|0;var b=0.0,d=0.0,e=0,f=0;e=l;l=l+16|0;f=c[5180]|0;c[46512]=c[f>>2];c[46513]=c[f+4>>2];c[46515]=c[f+8>>2];c[46517]=c[f+12>>2];h[23264]=0.0;h[23259]=+h[f+16>>3];h[23260]=+h[f+24>>3];c[46516]=XO(a,DA(a,0,91362,0)|0,600,0)|0;b=+YO(a,DA(a,0,91503,0)|0,.3,0.0);h[23261]=b;f=c[5180]|0;h[f+32>>3]=b;b=+h[f+40>>3];if(b==-1.0)b=+YO(a,DA(a,0,91370,0)|0,-1.0,0.0);h[23262]=b;c[46514]=1;f=jm(a,2,186056)|0;c[46526]=f;if(!f){dA(0,91373,e)|0;c[46514]=2}c[46542]=(S(c[46516]|0,c[46517]|0)|0)/100|0;d=+h[23261];h[23266]=d*d;if(c[46512]|0){b=+h[23264];if(b<=0.0){b=d*3.0;h[23264]=b}h[23265]=b*b}l=e;return}function dp(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,g=0,i=0,j=0;j=l;l=l+16|0;d=j;g=c[c[(c[a+16>>2]|0)+140>>2]>>2]|0;i=ep(a,b)|0;fp(d,a,g);e=+h[d>>3];f=+h[d+8>>3];a:do if(!(c[46512]|0)){b=0;while(1){if((b|0)>=(c[46543]|0))break a;ip(a,+gp(b),g);b=b+1|0}}else{d=Hv(qB(a)|0)|0;Mv(d,qB(a)|0);b=0;while(1){if((b|0)>=(c[46543]|0))break;hp(a,+gp(b),g,d);b=b+1|0}Ov(d)}while(0);b:do if(e!=0.0|f!=0.0){b=gC(a)|0;while(1){if(!b)break b;g=c[(c[b+16>>2]|0)+132>>2]|0;h[g>>3]=e+ +h[g>>3];g=g+8|0;h[g>>3]=f+ +h[g>>3];b=hC(a,b)|0}}while(0);if(i|0)jp();l=j;return}function ep(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0,g=0,i=0,j=0;if(+h[23262]==-1.0){i=qB(a)|0;d=+h[23261];h[23262]=+h[23260]*d*+G(+(+(i|0)))/5.0;i=1}else{i=0;d=+h[23261]}g=c[46542]|0;h[b+8>>3]=+gp(g);h[b+16>>3]=d;h[b+24>>3]=+h[23259];e=c[46516]|0;a=e-g|0;c[b>>2]=a;f=c[46515]|0;do if((f|0)>-1){if((f|0)<=(g|0)){c[46543]=f;a=0;j=10;break}if((f|0)<=(e|0)){c[46543]=g;a=f-g|0;j=10}}else{c[46543]=g;j=10}while(0);if((j|0)==10)c[b+32>>2]=a;return i|0}function fp(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0;w=qB(d)|0;x=c[(c[(c[d+16>>2]|0)+140>>2]|0)+4>>2]|0;u=gC(d)|0;v=0;n=0;f=0;g=0;o=0;while(1){l=+(f|0);k=+(n|0);y=(v|0)!=0;if(!u)break;p=c[u+16>>2]|0;if(!(a[p+119>>0]|0))p=v;else{p=c[p+132>>2]|0;j=+h[p>>3];i=+h[p+8>>3];if(y){t=+(g|0);s=+(o|0);o=~~(i>s?i:s);n=~~(jt?j:t)}else{g=~~j;f=~~i;o=f;n=g}p=v+1|0}u=hC(d,u)|0;v=p}t=+h[23261]*(+G(+(+(w-x|0)))+1.0)*.5*1.2;h[23268]=t;h[23267]=t;if((v|0)!=1)if((v|0)>1){r=+(g+n|0)*.5;s=+(o+f|0)*.5;q=+(g-n|0)*1.2;k=+(o-f|0)*1.2;l=t*4.0*t;m=q*k/l;i=q*.5;j=k*.5;do if(!(m>=1.0)){if(m>0.0){j=+G(+m)*2.0;i=q/j;h[23267]=i;j=k/j;A=19;break}if(q>0.0){h[23267]=i;j=l/q*.5;A=19;break}if(k>0.0){i=l/k*.5;h[23267]=i;A=19}else{j=t;i=t}}else{h[23267]=i;A=19}while(0);if((A|0)==19)h[23268]=j;q=+O(+j,+i);t=i/+I(+q);h[23267]=t;i=j/+J(+q);h[23268]=i;j=t}else{r=0.0;s=0.0;j=t;i=t}else{r=k;s=l;j=t;i=t}h[23269]=j*j;h[23270]=i*i;if((c[46526]|0)==2)f=c[46514]|0;else{f=e4()|0;f=(Ya(0)|0)^f}W4(f);a:do if(!e){e=gC(d)|0;if(!y)while(1){if(!e)break a;t=+h[23267];t=t*(+S4()*2.0+-1.0);A=e+16|0;h[c[(c[A>>2]|0)+132>>2]>>3]=t;t=+h[23268];t=t*(+S4()*2.0+-1.0);h[(c[(c[A>>2]|0)+132>>2]|0)+8>>3]=t;e=hC(d,e)|0}while(1){if(!e)break a;f=e+16|0;g=c[f>>2]|0;if(!(a[g+119>>0]|0)){t=+h[23267];t=t*(+S4()*2.0+-1.0);h[c[(c[f>>2]|0)+132>>2]>>3]=t;t=+h[23268];t=t*(+S4()*2.0+-1.0);h[(c[(c[f>>2]|0)+132>>2]|0)+8>>3]=t}else{A=c[g+132>>2]|0;h[A>>3]=+h[A>>3]-r;A=A+8|0;h[A>>3]=+h[A>>3]-s}e=hC(d,e)|0}}else{while(1){if(!(c[e>>2]|0))break;w=e+8|0;t=r+ +h[23267]*+I(+(+h[w>>3]));y=c[(c[e+4>>2]|0)+16>>2]|0;x=c[y+132>>2]|0;h[x>>3]=t;h[x+8>>3]=s+ +h[23268]*+J(+(+h[w>>3]));a[y+119>>0]=1;e=e+16|0}m=r*.1;q=s*.1;u=gC(d)|0;while(1){if(!u)break a;p=u+16|0;e=c[p>>2]|0;if(!((c[(c[e+112>>2]|0)+8>>2]|0)==0?!(c[e+212>>2]|0):0))A=31;do if((A|0)==31){A=0;if(a[e+119>>0]|0){y=c[e+132>>2]|0;h[y>>3]=+h[y>>3]-r;y=y+8|0;h[y>>3]=+h[y>>3]-s;break}o=ZA(d,u)|0;n=0;j=0.0;i=0.0;while(1){if(!o)break;g=c[o>>2]&3;e=(g|0)==2?o:o+-48|0;f=c[e+40>>2]|0;g=(g|0)==3?o:o+48|0;if((f|0)!=(c[g+40>>2]|0)?(z=c[(c[((f|0)==(u|0)?g:e)+40>>2]|0)+16>>2]|0,(a[z+119>>0]|0)!=0):0){e=n+1|0;y=c[z+132>>2]|0;l=+h[y+8>>3];k=+h[y>>3];if(!n){j=k;i=l}else{B=+(n|0);t=+(e|0);j=(j*B+k)/t;i=(i*B+l)/t}}else e=n;o=_A(d,o,u)|0;n=e}do if((n|0)<=1)if((n|0)==1){f=c[p>>2]|0;e=c[f+132>>2]|0;h[e>>3]=m+j*.98;i=q+i*.9;break}else{i=+S4()*6.283185307179586;B=+S4()*.9;t=B*+h[23267]*+I(+i);f=c[p>>2]|0;e=c[f+132>>2]|0;h[e>>3]=t;i=B*+h[23268]*+J(+i);break}else{f=c[p>>2]|0;e=c[f+132>>2]|0;h[e>>3]=j}while(0);h[e+8>>3]=i;a[f+119>>0]=1}while(0);u=hC(d,u)|0}}while(0);h[b>>3]=r;h[b+8>>3]=s;return}function gp(a){a=a|0;var b=0;b=c[46516]|0;return +(+h[23262]*+(b-a|0)/+(b|0))}function hp(a,b,d,e){a=a|0;b=+b;d=d|0;e=e|0;var f=0,g=0,i=0,j=0.0;if(!(b<=0.0)){Nv(e);f=gC(a)|0;while(1){if(!f)break;i=c[f+16>>2]|0;g=(c[i+112>>2]|0)+16|0;c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;i=c[i+132>>2]|0;j=+h[23264];g=~~+E(+(+h[i>>3]/j));Qv(e,g,~~+E(+(+h[i+8>>3]/j)),f);f=hC(a,f)|0}g=gC(a)|0;while(1){if(!g)break;f=UA(a,g)|0;while(1){if(!f)break;i=c[((c[f>>2]&3|0)==2?f:f+-48|0)+40>>2]|0;if((g|0)!=(i|0))lp(g,i,f);f=WA(a,f)|0}g=hC(a,g)|0}Sv(e,26);mp(a,b,d)}return}function ip(a,b,d){a=a|0;b=+b;d=d|0;var e=0,f=0,g=0;if(!(b<=0.0)){e=gC(a)|0;while(1){if(!e)break;g=(c[(c[e+16>>2]|0)+112>>2]|0)+16|0;c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;e=hC(a,e)|0}g=gC(a)|0;while(1){if(!g)break;else e=g;while(1){e=hC(a,e)|0;if(!e)break;kp(g,e)}e=UA(a,g)|0;while(1){if(!e)break;f=c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0;if((g|0)!=(f|0))lp(g,f,e);e=WA(a,e)|0}g=hC(a,g)|0}mp(a,b,d)}return}function jp(){h[23262]=-1.0;return}function kp(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0,g=0;g=c[(c[b+16>>2]|0)+132>>2]|0;f=c[(c[a+16>>2]|0)+132>>2]|0;e=+h[g>>3]-+h[f>>3];d=+h[g+8>>3]-+h[f+8>>3];np(a,b,e,d,e*e+d*d);return}function lp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,g=0.0,i=0.0,j=0,k=0;j=b+16|0;k=c[(c[j>>2]|0)+132>>2]|0;b=a+16|0;a=c[(c[b>>2]|0)+132>>2]|0;e=+h[k>>3]-+h[a>>3];f=+h[k+8>>3]-+h[a+8>>3];g=e;i=f;e=e*e;f=f*f;while(1){e=f+e;if(!(e==0.0))break;e=+(5-((U4()|0)%10|0)|0);f=+(5-((U4()|0)%10|0)|0);g=e;i=f;e=e*e;f=f*f}f=+G(+e);k=(c[46513]|0)==0;d=c[d+16>>2]|0;e=+h[d+136>>3];f=+h[d+128>>3]*(k?f:f-e)/(k?e:f);g=g*f;k=c[(c[j>>2]|0)+112>>2]|0;d=k+16|0;h[d>>3]=+h[d>>3]-g;i=i*f;k=k+24|0;h[k>>3]=+h[k>>3]-i;k=c[(c[b>>2]|0)+112>>2]|0;d=k+16|0;h[d>>3]=g+ +h[d>>3];k=k+24|0;h[k>>3]=i+ +h[k>>3];return}function mp(b,d,e){b=b|0;d=+d;e=e|0;var f=0.0,g=0.0,i=0.0,j=0,k=0,l=0,m=0,n=0,o=0.0;o=d*d;n=(e|0)==0;l=gC(b)|0;while(1){if(!l)break;k=c[l+16>>2]|0;if(!(a[k+119>>0]&2)){e=c[k+112>>2]|0;f=+h[e+16>>3];g=+h[e+24>>3];i=f*f+g*g;j=c[k+132>>2]|0;m=j+8|0;if(!(i>3]+f;f=+h[m>>3]+g;do if(!n){g=+G(+(i*i/+h[23269]+f*f/+h[23270]));if((c[e+8>>2]|0)==0?(c[k+212>>2]|0)==0:0){h[j>>3]=i/g;f=f/g;break}if(!(g>=1.0)){h[j>>3]=i;break}else{h[j>>3]=i*.95/g;f=f*.95/g;break}}else h[j>>3]=i;while(0);h[m>>3]=f}l=hC(b,l)|0}return}function np(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=+e;f=+f;var g=0,i=0;while(1){if(!(f==0.0))break;f=+(5-((U4()|0)%10|0)|0);e=+(5-((U4()|0)%10|0)|0);d=f;f=f*f+e*e}if(c[46513]|0)f=f*+G(+f);f=+h[23266]/f;i=c[a+16>>2]|0;g=c[i+112>>2]|0;a=c[b+16>>2]|0;b=c[a+112>>2]|0;if(((c[g+8>>2]|0)==0?(c[i+212>>2]|0)==0:0)?(c[b+8>>2]|0)==0:0)f=(c[a+212>>2]|0)==0?f*10.0:f;d=d*f;i=b+16|0;h[i>>3]=+h[i>>3]+d;e=e*f;i=b+24|0;h[i>>3]=e+ +h[i>>3];i=g+16|0;h[i>>3]=+h[i>>3]-d;i=g+24|0;h[i>>3]=+h[i>>3]-e;return}function op(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;f=c[b+8>>2]|0;g=c[b>>2]|0;e=c[b+4>>2]|0;b=f;while(1){if(!b)break;a=f;while(1){if(!a)break;if((b|0)!=(a|0))kp(c[b>>2]|0,c[a>>2]|0);a=c[a+4>>2]|0}b=c[b+4>>2]|0}h=g+-1|0;a=e+-1|0;pp(d,h,a,f);pp(d,h,e,f);b=e+1|0;pp(d,h,b,f);pp(d,g,a,f);pp(d,g,b,f);g=g+1|0;pp(d,g,a,f);pp(d,g,e,f);pp(d,g,b,f);return 0}function pp(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0,k=0,l=0,m=0;a=Tv(a,b,d)|0;if((e|0)!=0&(a|0)!=0){k=a+8|0;do{d=c[e>>2]|0;j=d+16|0;a=k;while(1){a=c[a>>2]|0;if(!a)break;b=c[a>>2]|0;m=c[(c[b+16>>2]|0)+132>>2]|0;l=c[(c[j>>2]|0)+132>>2]|0;f=+h[m>>3]-+h[l>>3];g=+h[m+8>>3]-+h[l+8>>3];i=f*f+g*g;if(i<+h[23265])np(d,b,f,g,i);a=a+4|0}e=c[e+4>>2]|0}while((e|0)!=0)}return}function qp(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=l;l=l+16|0;g=h;e=NA(b,92808)|0;if(a[195234]|0)_3(91417,8,1,c[15715]|0)|0;if(!((e|0)!=0?(a[e>>0]|0)!=0:0))e=91426;f=F3(e,58)|0;do if(!f)f=0;else{if((f|0)!=(e|0)?((a[e>>0]|0)+-48|0)>>>0>=10:0){f=0;break}i=d6(e)|0;e=f+1|0;f=(i|0)>0?i:0}while(0);if(a[195234]|0){i=c[15715]|0;c[g>>2]=f;c[g+4>>2]=e;z4(i,91434,g)|0}if(!((f|0)!=0?!(rp(b,d,f)|0):0))kr(b,e)|0;l=h;return}function rp(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,i=0,j=0,k=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0;t=l;l=l+64|0;r=t;j=t+40|0;s=qB(b)|0;k=rB(b)|0;ir(j,b);c[46884]=c[j>>2];c[46885]=c[j+4>>2];c[46886]=c[j+8>>2];if(a[187544]|0){g[46884]=+g[46884]/72.0;g[46885]=+g[46885]/72.0}f=sp(b)|0;a:do if(!f)f=0;else{j=r;i=j+40|0;do{c[j>>2]=c[d>>2];j=j+4|0;d=d+4|0}while((j|0)<(i|0));j=r+16|0;q=+h[j>>3];o=+(k|0);p=+(S(s+-1|0,s)|0);i=0;n=q;while(1){if(!((f|0)!=0&(i|0)<(e|0)))break a;tp(s,r);m=+h[170]*+h[23272];h[23273]=m;h[23274]=o*m*2.0/p;d=0;while(1){if((d|0)>=(c[46550]|0))break;m=+up(d);if(m<=0.0)break;f=vp(b,m)|0;if(!f){f=0;break}else d=d+1|0}m=q+n;h[j>>3]=m;i=i+1|0;n=m}}while(0);l=t;return f|0}function sp(a){a=a|0;var b=0,c=0,d=0,e=0;b=0;e=gC(a)|0;while(1){if(!e)break;else d=e;while(1){c=hC(a,d)|0;if(!c)break;d=c;b=(yp(e,c)|0)+b|0}e=hC(a,e)|0}return b|0}function tp(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0.0;e=+h[b+16>>3];h[171]=e;c[344]=c[b>>2];f=+h[b+8>>3];h[23276]=f;c[46550]=c[b+32>>2];d=+h[b+24>>3];if(d>0.0)h[170]=d;h[23272]=e*e;if(f==0.0)h[23276]=e*+G(+(+(a|0)))/5.0;return}function up(a){a=a|0;var b=0;b=c[344]|0;return +(+h[23276]*+(b-a|0)/+(b|0))}function vp(b,d){b=b|0;d=+d;var e=0,f=0,g=0,i=0.0,j=0,k=0.0,l=0.0,m=0.0,n=0.0;e=gC(b)|0;while(1){if(!e)break;j=(c[(c[e+16>>2]|0)+112>>2]|0)+16|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;e=hC(b,e)|0}e=0;j=gC(b)|0;while(1){if(!j)break;else g=j;while(1){f=hC(b,g)|0;if(!f)break;g=f;e=(wp(j,f)|0)+e|0}f=UA(b,j)|0;while(1){if(!f)break;xp(j,c[((c[f>>2]&3|0)==2?f:f+-48|0)+40>>2]|0);f=WA(b,f)|0}j=hC(b,j)|0}a:do if(!e)e=0;else{n=d*d;g=gC(b)|0;while(1){if(!g)break a;f=c[g+16>>2]|0;if((a[f+119>>0]|0)!=3){j=c[f+112>>2]|0;l=+h[j+16>>3];i=+h[j+24>>3];m=l*l+i*i;f=c[f+132>>2]|0;k=+h[f>>3];if(m>3]=l+k;else{m=+G(+m);h[f>>3]=k+l*d/m;i=i*d/m}j=f+8|0;h[j>>3]=i+ +h[j>>3]}g=hC(b,g)|0}}while(0);return e|0}function wp(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0,g=0;g=c[(c[b+16>>2]|0)+132>>2]|0;f=c[(c[a+16>>2]|0)+132>>2]|0;e=+h[g>>3]-+h[f>>3];d=+h[g+8>>3]-+h[f+8>>3];return Ap(a,b,e,d,e*e+d*d)|0}function xp(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0,g=0.0,i=0,j=0.0,k=0.0,l=0,m=0;if(!(yp(a,b)|0)){i=c[b+16>>2]|0;m=c[i+132>>2]|0;f=c[a+16>>2]|0;l=c[f+132>>2]|0;e=+h[m>>3]-+h[l>>3];g=+h[m+8>>3]-+h[l+8>>3];j=+G(+(e*e+g*g));d=+zp(a);d=d+ +zp(b);k=j-d;d=k*k/(j*(+h[171]+d));e=e*d;b=c[i+112>>2]|0;a=b+16|0;h[a>>3]=+h[a>>3]-e;d=g*d;b=b+24|0;h[b>>3]=+h[b>>3]-d;b=c[f+112>>2]|0;a=b+16|0;h[a>>3]=e+ +h[a>>3];b=b+24|0;h[b>>3]=d+ +h[b>>3]}return}function yp(b,d){b=b|0;d=d|0;var e=0.0,f=0,i=0.0,j=0.0,k=0.0,l=0.0,m=0;f=c[d+16>>2]|0;m=c[f+132>>2]|0;b=c[b+16>>2]|0;d=c[b+132>>2]|0;l=+h[m>>3]-+h[d>>3];e=+h[m+8>>3]-+h[d+8>>3];d=(a[187544]|0)!=0;k=+h[b+32>>3];i=+g[46884];j=+h[f+32>>3];if(!((l<0.0?-l:l)<=(d?k*.5+i:k*i*.5)+(d?i+j*.5:j*i*.5)))d=0;else{j=+h[b+40>>3];l=+g[46885];k=+h[f+40>>3];d=(e<0.0?-e:e)<=(d?j*.5+l:j*l*.5)+(d?l+k*.5:k*l*.5)}return d&1|0}function zp(b){b=b|0;var d=0.0,e=0.0,f=0.0,i=0;i=(a[187544]|0)!=0;b=c[b+16>>2]|0;f=+h[b+32>>3];e=+g[46884];e=i?f*.5+e:f*e*.5;f=+h[b+40>>3];d=+g[46885];d=i?f*.5+d:f*d*.5;return +(+G(+(e*e+d*d)))}function Ap(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=+e;f=+f;var g=0,i=0;while(1){if(!(f==0.0))break;f=+(5-((U4()|0)%10|0)|0);e=+(5-((U4()|0)%10|0)|0);d=f;f=f*f+e*e}g=yp(a,b)|0;f=((g|0)==0?+h[23274]:+h[23273])/f;d=d*f;b=c[(c[b+16>>2]|0)+112>>2]|0;i=b+16|0;h[i>>3]=+h[i>>3]+d;f=e*f;b=b+24|0;h[b>>3]=f+ +h[b>>3];b=c[(c[a+16>>2]|0)+112>>2]|0;a=b+16|0;h[a>>3]=+h[a>>3]-d;b=b+24|0;h[b>>3]=+h[b>>3]-f;return g|0}function Bp(a){a=a|0;mQ(a,2);b[(c[a+16>>2]|0)+176>>1]=2;c[47184]=2;Cp(a);return}function Cp(a){a=a|0;var b=0,d=0,e=0,f=0;e=HK((qB(a)|0)<<2)|0;b=HK(((qB(a)|0)<<2)+4|0)|0;f=a+16|0;c[(c[f>>2]|0)+152>>2]=b;b=gC(a)|0;d=0;while(1){if(!b)break;Wl(b);c[(c[b+16>>2]|0)+112>>2]=e+(d<<2);c[(c[(c[f>>2]|0)+152>>2]|0)+(d<<2)>>2]=b;b=hC(a,b)|0;d=d+1|0}d=gC(a)|0;while(1){if(!d)break;b=UA(a,d)|0;while(1){if(!b)break;Dp(b);b=WA(a,b)|0}d=hC(a,d)|0}return}function Dp(a){a=a|0;var b=0.0;RC(a,137763,176,1)|0;rP(a)|0;b=+YO(a,c[47236]|0,1.0,0.0);h[(c[a+16>>2]|0)+128>>3]=b;return}function Ep(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;k=m+4|0;j=m;c[k>>2]=c[4660];k=lB(91457,k,0)|0;RC(k,91465,280,1)|0;c[(c[a+16>>2]|0)+140>>2]=k;d=gC(a)|0;while(1){if(!d)break;e=d+16|0;if(!(c[c[(c[e>>2]|0)+112>>2]>>2]|0)){i=Fp(k,HB(d)|0,d)|0;c[c[(c[e>>2]|0)+112>>2]>>2]=i}d=hC(a,d)|0}e=gC(a)|0;while(1){if(!e)break;d=UA(a,e)|0;while(1){if(!d)break;g=c[d>>2]&3;f=c[c[(c[(c[((g|0)==3?d:d+48|0)+40>>2]|0)+16>>2]|0)+112>>2]>>2]|0;g=c[c[(c[(c[((g|0)==2?d:d+-48|0)+40>>2]|0)+16>>2]|0)+112>>2]>>2]|0;if((f|0)!=(g|0))RC(fB(k,f,g,0,1)|0,137763,176,1)|0;d=WA(a,d)|0}e=hC(a,e)|0}i=BG(k,j,0)|0;e=0;while(1){if((e|0)>=(c[j>>2]|0))break;g=c[i+(e<<2)>>2]|0;d=gC(g)|0;while(1){if(!d)break;f=UA(a,c[c[(c[d+16>>2]|0)+112>>2]>>2]|0)|0;while(1){if(!f)break;h=c[c[(c[(c[((c[f>>2]&3|0)==2?f:f+-48|0)+40>>2]|0)+16>>2]|0)+112>>2]>>2]|0;if((d|0)!=(h|0)){h=fB(k,d,h,0,1)|0;RC(h,137763,176,1)|0;jB(g,h,1)|0}f=WA(a,f)|0}d=hC(g,d)|0}e=e+1|0}d=gC(k)|0;while(1){if(!d)break;e=UA(k,d)|0;while(1){if(!e)break;a=HK(8)|0;c[(c[e+16>>2]|0)+120>>2]=a;e=WA(k,e)|0}d=hC(k,d)|0}c[b>>2]=c[j>>2];l=m;return i|0}function Fp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;b=qC(a,b,1)|0;RC(b,137750,304,1)|0;e=HK(40)|0;a=b+16|0;c[(c[a>>2]|0)+112>>2]=e;e=HK(c[47184]<<3)|0;a=c[a>>2]|0;c[a+132>>2]=e;e=c[d+16>>2]|0;h[a+88>>3]=+h[e+88>>3];h[a+96>>3]=+h[e+96>>3];h[a+80>>3]=+h[e+80>>3];c[c[a+112>>2]>>2]=d;return b|0}function Gp(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;h=l;l=l+48|0;b=h+32|0;e=h;if(qB(a)|0){g=Ep(a,b)|0;f=c[b>>2]|0;b=c[g>>2]|0;if((f|0)==1){_w(b,a);Hp(c[g>>2]|0);lr(a)|0}else{d=c[b+60>>2]|0;iH(a,2,8,e)|0;b=0;while(1){if((b|0)>=(f|0))break;i=c[g+(b<<2)>>2]|0;_w(i,a);lr(i)|0;b=b+1|0}hH(f,g,d,e)|0;b=0;while(1){if((b|0)>=(f|0))break;Hp(c[g+(b<<2)>>2]|0);b=b+1|0}}l6(g)}l=h;return}function Hp(a){a=a|0;var b=0,d=0,e=0;b=gC(a)|0;while(1){if(!b)break;d=c[b+16>>2]|0;e=c[d+132>>2]|0;d=c[(c[(c[c[d+112>>2]>>2]|0)+16>>2]|0)+132>>2]|0;h[d>>3]=+h[e>>3];h[d+8>>3]=+h[e+8>>3];b=hC(a,b)|0}return}function Ip(a){a=a|0;if(qB(a)|0){Bp(a);Gp(a);l6(c[(c[(gC(a)|0)+16>>2]|0)+112>>2]|0);cn(a);rM(a)}return}function Jp(a){a=a|0;var b=0,d=0,e=0;b=gC(a)|0;if(b|0){e=a+16|0;Kp(c[(c[e>>2]|0)+140>>2]|0);while(1){if(!b)break;d=UA(a,b)|0;while(1){if(!d)break;WP(d);d=WA(a,d)|0}UP(b);b=hC(a,b)|0}l6(c[(c[e>>2]|0)+152>>2]|0);if((vC(a)|0)!=(a|0))XC(a,0,137786)}return}function Kp(a){a=a|0;var b=0,d=0;d=gC(a)|0;while(1){if(!d)break;b=UA(a,d)|0;while(1){if(!b)break;l6(c[(c[b+16>>2]|0)+120>>2]|0);b=WA(a,b)|0}b=d+16|0;l6(c[(c[b>>2]|0)+112>>2]|0);l6(c[(c[b>>2]|0)+132>>2]|0);d=hC(a,d)|0}pB(a)|0;return}function Lp(b){b=b|0;var d=0,e=0.0,f=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+112|0;k=r+40|0;m=r+16|0;q=r+100|0;n=r;i=r+88|0;o=r+56|0;Mp(b);j=(c[47184]|0)==2;d=j&1;if(qB(b)|0){p=Vp()|0;Np(b,p);Kq(b,m,0)|0;f=p+124|0;if(j&(c[m>>2]|0)==18){c[f>>2]=c[m+8>>2];h[p+144>>3]=+h[m+16>>3];ir(i,b);if(!(a[i+8>>0]|0)){h[n>>3]=.05555555555555555;e=.05555555555555555}else{e=+g[i+4>>2];h[n>>3]=+g[i>>2]/72.0;e=e/72.0}h[n+8>>3]=e;d=0}else c[f>>2]=-1;if(a[195234]|0)Xp(p);j=BG(b,q,0)|0;if((c[q>>2]|0)==1){c[k>>2]=c[n>>2];c[k+4>>2]=c[n+4>>2];c[k+8>>2]=c[n+8>>2];c[k+12>>2]=c[n+12>>2];Op(b,p,k);if(d|0)Nq(b,m)|0;cn(b);d=0}else{iH(b,2,8,o)|0;c[o+12>>2]=1;i=(d|0)==0;f=0;while(1){d=c[q>>2]|0;if((f|0)>=(d|0))break;d=c[j+(f<<2)>>2]|0;IG(d)|0;c[k>>2]=c[n>>2];c[k+4>>2]=c[n+4>>2];c[k+8>>2]=c[n+8>>2];c[k+12>>2]=c[n+12>>2];Op(d,p,k);if(!i)Nq(d,m)|0;mQ(d,2);cn(d);f=f+1|0}hH(d,j,b,o)|0;d=0}while(1){if((d|0)>=(c[q>>2]|0))break;tC(b,c[j+(d<<2)>>2]|0)|0;d=d+1|0}l6(j);Wp(p)}rM(b);l=r;return}function Mp(a){a=a|0;var d=0,f=0;mQ(a,2);d=XO(a,DA(a,0,91669,0)|0,2,2)|0;f=(XO(a,DA(a,0,91675,0)|0,d,2)|0)&65535;b[(c[(vC(a)|0)+16>>2]|0)+176>>1]=f;if((e[(c[(vC(a)|0)+16>>2]|0)+176>>1]|0)<10)f=b[(c[(vC(a)|0)+16>>2]|0)+176>>1]|0;else f=10;b[(c[(vC(a)|0)+16>>2]|0)+176>>1]=f;f=f&65535;c[47184]=f;b[(c[(vC(a)|0)+16>>2]|0)+178>>1]=(d|0)<(f|0)?d:f;Sp(a);return}function Np(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=l;l=l+16|0;f=g+8|0;d=g+12|0;e=b+108|0;c[d>>2]=c[e>>2];if((jm(a,2,d)|0)!=2)dA(0,91470,g)|0;c[e>>2]=c[d>>2];h[b+24>>3]=+YO(a,DA(a,0,91503,0)|0,-1.0,0.0);h[b>>3]=-+YO(a,DA(a,0,91505,0)|0,1.0001234,0.0);c[b+40>>2]=XO(a,DA(a,0,91520,0)|0,2147483647,0)|0;c[b+120>>2]=Qp(a,DA(a,0,91527,0)|0)|0;c[b+132>>2]=Rp(a,DA(a,0,91537,0)|0)|0;c[b+136>>2]=0;c[b+112>>2]=(cP(NA(a,91546)|0,0)|0)&255;c[b+128>>2]=(cP(NA(a,91555)|0,1)|0)&255;h[b+152>>3]=+YO(a,DA(a,0,91570,0)|0,0.0,-1797693134862315708145274.0e284);d=XO(a,DA(a,0,91579,0)|0,0,0)|0;a=b+160|0;c[a>>2]=d;if((d|0)>4){c[f>>2]=d;dA(0,91592,f)|0;c[a>>2]=0}l=g;return}function Op(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+48|0;f=q;n=q+32|0;j=q+28|0;g=q+24|0;p=q+20|0;o=q+16|0;c[g>>2]=0;c[p>>2]=0;c[o>>2]=0;i=b+136|0;e=c[47184]|0;if((c[i>>2]|0)==1)m=Hq(a,e,o)|0;else m=Hq(a,e,0)|0;do if((c[b+124>>2]|0)>-1)if((c[b+160>>2]|0)>0){c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];k=Gq(a,f,g,p)|0;break}else{c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];k=Gq(a,f,0,0)|0;break}else k=0;while(0);e=Pp(a)|0;c[n>>2]=e;switch(c[i>>2]|0){case 1:case 0:{tq(c[47184]|0,m,c[o>>2]|0,b,0,k,e,c[g>>2]|0,c[p>>2]|0,j);break}case 5:{Fq(c[47184]|0,m,e,j);break}case 4:{e=c[o>>2]|0;if(!e)e=Nw(m)|0;else e=xw(e,0)|0;c[o>>2]=e;Aq(c[47184]|0,m,e,n,1,200,.001,j);break}default:{}}e=gC(a)|0;while(1){if(!e)break;d=c[47184]|0;g=c[e+16>>2]|0;b=(c[n>>2]|0)+((S(c[g+120>>2]|0,d)|0)<<3)|0;g=g+132|0;f=0;while(1){if((f|0)>=(d|0))break;h[(c[g>>2]|0)+(f<<3)>>3]=+h[b+(f<<3)>>3];f=f+1|0}e=hC(a,e)|0}l6(k);l6(c[n>>2]|0);nw(m);e=c[o>>2]|0;if(e|0)nw(e);e=c[p>>2]|0;if(e|0)l6(e);l=q;return}function Pp(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0;j=c[47184]|0;j=HK(S(j<<3,qB(b)|0)|0)|0;a:do if(DA(b,1,102924,0)|0){f=gC(b)|0;while(1){if(!f)break a;d=c[f+16>>2]|0;b:do if(a[d+119>>0]|0){g=c[47184]|0;i=d+132|0;e=S(g,c[d+120>>2]|0)|0;d=0;while(1){if((d|0)>=(g|0))break b;h[j+(e+d<<3)>>3]=+h[(c[i>>2]|0)+(d<<3)>>3];d=d+1|0}}while(0);f=hC(b,f)|0}}while(0);return j|0}function Qp(b,c){b=b|0;c=c|0;do if(c){b=OA(b,c)|0;c=a[b>>0]|0;if((c+-48|0)>>>0<10){b=d6(b)|0;b=(b|0)<5?b:0;break}if(P2(c)|0)if(C3(b,91631)|0)if(C3(b,91640)|0)if(C3(b,136010)|0)if(!(C3(b,91651)|0))b=3;else{b=(C3(b,91662)|0)==0;b=b?4:0}else b=0;else b=1;else b=2;else b=0}else b=0;while(0);return b|0}function Rp(b,c){b=b|0;c=c|0;do if(c){b=OA(b,c)|0;c=a[b>>0]|0;if((c+-48|0)>>>0<10){b=d6(b)|0;b=b>>>0<3?b:1;break}if(P2(c)|0)if((C3(b,136010)|0)!=0?(C3(b,137609)|0)!=0:0)if(((C3(b,100031)|0)!=0?(C3(b,107953)|0)!=0:0)?(C3(b,107958)|0)!=0:0){b=(C3(b,91626)|0)==0;b=b?2:1}else b=1;else b=0;else b=1}else b=1;while(0);return b|0}function Sp(a){a=a|0;var b=0,c=0;b=gC(a)|0;while(1){if(!b)break;Wl(b);b=hC(a,b)|0}c=gC(a)|0;while(1){if(!c)break;b=UA(a,c)|0;while(1){if(!b)break;Tp(b);b=WA(a,b)|0}c=hC(a,c)|0}return}function Tp(a){a=a|0;RC(a,137763,176,1)|0;rP(a)|0;return}function Up(a){a=a|0;var b=0,c=0;c=gC(a)|0;while(1){if(!c)break;b=UA(a,c)|0;while(1){if(!b)break;WP(b);b=WA(a,b)|0}UP(c);c=hC(a,c)|0}return}function Vp(){var a=0,b=0;a=IK(168)|0;h[a>>3]=-1.0001234;h[a+8>>3]=1.0;c[a+16>>2]=1;h[a+24>>3]=-1.0;h[a+32>>3]=.2;c[a+40>>2]=0;c[a+44>>2]=4;c[a+48>>2]=1;c[a+52>>2]=45;c[a+56>>2]=10;h[a+64>>3]=.6;h[a+72>>3]=.001;c[a+80>>2]=500;h[a+88>>3]=.9;h[a+96>>3]=.1;c[a+104>>2]=1;c[a+108>>2]=123;b=a+112|0;c[b>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[a+128>>2]=1;c[a+132>>2]=3;c[a+136>>2]=0;h[a+144>>3]=-4.0;h[a+152>>3]=0.0;c[a+160>>2]=0;return a|0}function Wp(a){a=a|0;l6(a);return}function Xp(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0.0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;b=l;l=l+176|0;d=b+160|0;f=b+152|0;g=b+128|0;k=b+112|0;j=b+88|0;m=b+64|0;n=b+56|0;o=b+40|0;q=b+24|0;p=b+16|0;r=b;e=c[15715]|0;_3(91679,27,1,e)|0;i=+h[a+8>>3];h[r>>3]=+h[a>>3];h[r+8>>3]=i;z4(e,91707,r)|0;r=c[a+108>>2]|0;c[p>>2]=c[a+16>>2];c[p+4>>2]=r;z4(e,91758,p)|0;i=+h[a+32>>3];h[q>>3]=+h[a+24>>3];h[q+8>>3]=i;z4(e,91785,q)|0;q=c[a+44>>2]|0;p=c[a+48>>2]|0;c[o>>2]=c[a+40>>2];c[o+4>>2]=q;c[o+8>>2]=p;z4(e,91808,o)|0;o=c[a+56>>2]|0;c[n>>2]=c[a+52>>2];c[n+4>>2]=o;z4(e,91859,n)|0;i=+h[a+72>>3];n=c[a+80>>2]|0;h[m>>3]=+h[a+64>>3];h[m+8>>3]=i;c[m+16>>2]=n;z4(e,91892,m)|0;i=+h[a+96>>3];m=c[a+104>>2]|0;h[j>>3]=+h[a+88>>3];h[j+8>>3]=i;c[j+16>>2]=m;z4(e,91950,j)|0;j=c[a+116>>2]|0;i=+h[a+152>>3];c[k>>2]=c[a+112>>2];c[k+4>>2]=j;h[k+8>>3]=i;z4(e,91996,k)|0;k=c[a+124>>2]|0;j=c[a+128>>2]|0;i=+h[a+144>>3];c[g>>2]=c[17844+(c[a+120>>2]<<2)>>2];c[g+4>>2]=k;c[g+8>>2]=j;h[g+16>>3]=i;z4(e,92049,g)|0;g=c[17888+(c[a+136>>2]<<2)>>2]|0;c[f>>2]=c[17872+(c[a+132>>2]<<2)>>2];c[f+4>>2]=g;z4(e,92114,f)|0;c[d>>2]=c[a+160>>2];z4(e,92144,d)|0;l=b;return}function Yp(a){a=a|0;l6(a);return}function Zp(a){a=a|0;var b=0;b=IK(184)|0;c[b>>2]=a;c[b+176>>2]=0;return b|0}function _p(a,b){a=a|0;b=+b;var d=0,e=0,f=0,g=0,i=0,j=0;e=c[a>>2]|0;h[a+8+(e<<3)>>3]=b;f=a+176|0;g=c[a>>2]|0;i=g+1|0;d=g+-1|0;j=(g|0)>19;a:do switch(c[f>>2]|0){case 0:{if((g|0)==20)c[f>>2]=-1;else{c[f>>2]=1;d=j?20:i}c[a>>2]=d;break}case 1:if((g|0)<20?+h[a+8+(e+-1<<3)>>3]>b:0){c[a>>2]=j?20:i;break a}else{c[a>>2]=d;c[f>>2]=-1;break a}default:if((g|0)>0?+h[a+8+(e+1<<3)>>3]>b:0){c[a>>2]=d;break a}else{c[a>>2]=i;c[f>>2]=1;break a}}while(0);return}function $p(a){a=a|0;return c[a>>2]|0}function aq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0;o=c[a+20>>2]|0;p=c[a+24>>2]|0;m=c[a>>2]|0;n=c[o+(m<<2)>>2]|0;if(!n)e=1.0;else{a=0;e=0.0;a:while(1){if((a|0)>=(m|0))break;j=a+1|0;k=c[o+(j<<2)>>2]|0;l=S(a,b)|0;i=c[o+(a<<2)>>2]|0;while(1){if((i|0)>=(k|0)){a=j;continue a}g=p+(i<<2)|0;a=0;f=0.0;while(1){if((a|0)>=(b|0))break;q=+h[d+(a+l<<3)>>3]-+h[d+((S(c[g>>2]|0,b)|0)<<3)>>3];a=a+1|0;f=f+q*q}i=i+1|0;e=e+ +G(+f)}}e=e/+(n|0)}return +e}function bq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=b+10|0;if((c[d>>2]|0)<=(b|0)){c[d>>2]=e;c[a>>2]=KK(c[a>>2]|0,e<<3)|0}return}function cq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=b+10|0;if((c[d>>2]|0)<=(b|0)){c[d>>2]=e;c[a>>2]=KK(c[a>>2]|0,e<<2)|0}return}function dq(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,g=0.0,i=0,j=0,k=0;k=l;l=l+16|0;j=k;i=S(d,b)|0;b=S(c,b)|0;d=0;while(1){if((d|0)==2)break;h[j+(d<<3)>>3]=+h[a+(d+i<<3)>>3]-+h[a+(d+b<<3)>>3];d=d+1|0}g=+h[j>>3];f=+h[j+8>>3];do if(!((g>=0.0?g:-g)<=(f>=0.0?f:-f)*1.0e-05)){e=+N(+(f/g));if(g>0.0){if(!(f<0.0))break;e=e+6.283185307179586;break}else{if(!(g<0.0))break;e=e+3.141592653589793;break}}else e=f>0.0?1.5707963267948966:4.71238898038469;while(0);l=k;return +e}function eq(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+h[a>>3];c=+h[b>>3];return (d>c?1:(d>31)|0}function fq(b,d,e,f,g,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0.0,m=0,n=0,o=0.0,p=0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0.0,x=0,y=0,z=0,A=0.0,B=0.0,C=0,D=0,E=0,F=0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0,P=0,Q=0,R=0.0,T=0,U=0.0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0.0;$=l;l=l+80|0;_=$+32|0;Z=$;q=+h[e>>3];n=e+24|0;o=+h[n>>3];p=e+32|0;k=+h[p>>3];R=+h[e+72>>3];T=c[e+80>>2]|0;U=+h[e+88>>3];r=+h[e+96>>3];V=c[e+104>>2]|0;W=e+56|0;j=c[W>>2]|0;do if(!((d|0)==0|(T|0)<1)?(X=c[d+4>>2]|0,!((b|0)<1|(X|0)<1)):0){Q=c[d>>2]|0;Y=Zp(j)|0;c[i>>2]=0;if((Q|0)!=(X|0)){c[i>>2]=-100;Yp(Y);c[W>>2]=j;break}O=sw(d,1)|0;P=c[O+20>>2]|0;Q=c[O+24>>2]|0;a:do if(c[e+16>>2]|0){T4(c[e+108>>2]|0);m=S(X,b)|0;j=0;while(1){if((j|0)>=(m|0))break a;h[g+(j<<3)>>3]=+Pw();j=j+1|0}}while(0);if(o<0.0){o=+aq(O,b,g);h[n>>3]=o}if(k<0.0){h[p>>3]=.2;k=.2}if(q>=0.0){h[e>>3]=-1.0;q=-1.0}N=+H(+o,+(1.0-q));B=+H(+k,+((2.0-q)/3.0))/o;C=S(X,b<<3)|0;D=IK(C)|0;E=IK(C)|0;F=e+116|0;I=e+64|0;J=c[15715]|0;K=O+8|0;L=Z+8|0;M=Z+16|0;z=0;A=0.0;w=r;while(1){B6(D|0,g|0,C|0)|0;x=$p(Y)|0;y=ew(b,X,x,g,(c[F>>2]|0)==0?0:f)|0;$v(y,E,g,+h[I>>3],q,N,Z,i);n=0;b:while(1){if((n|0)>=(X|0)){r=0.0;m=0;break}p=S(n,b)|0;s=E+(p<<3)|0;t=n+1|0;u=P+(t<<2)|0;m=c[P+(n<<2)>>2]|0;while(1){if((m|0)>=(c[u>>2]|0)){n=t;continue b}v=Q+(m<<2)|0;j=c[v>>2]|0;c:do if((j|0)!=(n|0)){k=+Xw(g,b,n,j);j=0;while(1){if((j|0)>=(b|0))break c;r=k*(B*(+h[g+(j+p<<3)>>3]-+h[g+((S(c[v>>2]|0,b)|0)+j<<3)>>3]));aa=s+(j<<3)|0;h[aa>>3]=+h[aa>>3]-r;j=j+1|0}}while(0);m=m+1|0}}while(1){if((m|0)>=(X|0))break;n=S(m,b)|0;p=E+(n<<3)|0;k=0.0;j=0;while(1){if((j|0)>=(b|0))break;ba=+h[p+(j<<3)>>3];k=k+ba*ba;j=j+1|0}k=+G(+k);r=r+k;d:do if(k>0.0){j=0;while(1){if((j|0)>=(b|0)){j=0;break d}aa=p+(j<<3)|0;h[aa>>3]=+h[aa>>3]/k;j=j+1|0}}else j=0;while(0);while(1){if((j|0)>=(b|0))break;aa=g+(j+n<<3)|0;h[aa>>3]=+h[aa>>3]+w*+h[p+(j<<3)>>3];j=j+1|0}m=m+1|0}z=z+1|0;if(!y){if(a[195234]|0){aa=c[K>>2]|0;c[_>>2]=z;h[_+8>>3]=w;h[_+16>>3]=r;c[_+24>>2]=aa;h[_+32>>3]=o;z4(J,92400,_)|0}}else{lw(y);_p(Y,+h[Z>>3]+ +h[L>>3]*.85+ +h[M>>3]*3.3)}w=+gq(V,w,r,A,U);if(!((z|0)<(T|0)&w>R))break;else A=r}if(c[e+112>>2]|0)hq(b,O,g);Yp(Y);c[W>>2]=x;l6(D);if((O|0)!=(d|0))nw(O);l6(E)}while(0);l=$;return}function gq(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;var f=0.0;f=b*e;if((a|0)!=0&!(c>=d)){if(!(d*.95>2]|0;C=c[b+20>>2]|0;t=c[b+24>>2]|0;c[v>>2]=10;c[A>>2]=10;u=IK(B<<2)|0;f=IK(80)|0;c[y>>2]=f;e=IK(40)|0;c[z>>2]=e;b=0;while(1){if((b|0)>=(B|0)){n=0;r=f;k=e;o=e;m=f;break}c[u+(b<<2)>>2]=0;b=b+1|0}while(1){if((n|0)>=(B|0))break;b=c[C+(n<<2)>>2]|0;a:do if((((c[C+(n+1<<2)>>2]|0)-b|0)==1?(c[u+(n<<2)>>2]|0)==0:0)?(w=c[t+(b<<2)>>2]|0,x=u+(w<<2)|0,(c[x>>2]|0)==0):0){c[x>>2]=1;q=C+(w+1<<2)|0;n=0;s=0;g=0.0;p=c[C+(w<<2)>>2]|0;k=o;b=r;while(1){if((p|0)>=(c[q>>2]|0))break;e=t+(p<<2)|0;f=c[e>>2]|0;if(((c[C+(f+1<<2)>>2]|0)-(c[C+(f<<2)>>2]|0)|0)==1){c[u+(f<<2)>>2]=1;cq(z,s,v);g=g+ +Xw(d,a,w,c[e>>2]|0);k=c[z>>2]|0;c[k+(s<<2)>>2]=c[e>>2];e=n;f=s+1|0}else{bq(y,n,A);j=+dq(d,a,w,c[e>>2]|0);b=c[y>>2]|0;h[b+(n<<3)>>3]=j;e=n+1|0;f=s;m=b}n=e;s=f;p=p+1|0}j=g/+(s|0);if((n|0)>0){iq(n,m);b=m}g=(s|0)>1?6.283185307179586/+(s+-1|0):0.0;e=0;i=0.0;while(1){if((e|0)>=(s|0)){o=k;f=k;break a}jq(d,a,j,i,w,c[k+(e<<2)>>2]|0);e=e+1|0;i=g+i}}else{e=n;f=k;b=r}while(0);n=e+1|0;r=b;k=f}l6(u);l6(r);l6(k);l=D;return}function iq(a,b){a=a|0;b=b|0;k3(b,a,8,68);return}function jq(a,b,c,d,e,f){a=a|0;b=b|0;c=+c;d=+d;e=e|0;f=f|0;var g=0.0;g=+I(+d)*c;e=S(e,b)|0;f=S(f,b)|0;h[a+(f<<3)>>3]=g+ +h[a+(e<<3)>>3];d=+J(+d)*c;h[a+(f+1<<3)>>3]=d+ +h[a+(e+1<<3)>>3];return}function kq(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0.0,l=0.0,m=0,n=0.0,o=0,p=0,q=0,r=0.0,s=0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0,B=0.0,C=0.0,D=0,E=0,F=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0.0,Q=0,R=0.0,T=0,U=0,V=0,W=0;n=+h[d>>3];m=d+24|0;l=+h[m>>3];o=d+32|0;k=+h[o>>3];P=+h[d+72>>3];Q=c[d+80>>2]|0;R=+h[d+88>>3];r=+h[d+96>>3];T=c[d+104>>2]|0;i=c[d+56>>2]|0;_3(92499,32,1,c[15715]|0)|0;if(!((b|0)==0|(Q|0)<1)?(U=c[b>>2]|0,j=c[b+4>>2]|0,!((a|0)<1|(j|0)<1)):0){p=a<<3;V=IK(S(p,j)|0)|0;if((j|0)<(c[d+52>>2]|0)){J=0;K=0;L=0;M=0;N=0;O=0}else{Zp(i)|0;M=IK(a*80|0)|0;N=IK(80)|0;O=IK(80)|0;J=O;K=N;L=M}c[g>>2]=0;if((U|0)==(j|0)){D=sw(b,1)|0;E=c[D+20>>2]|0;F=c[D+24>>2]|0;I=S(U,a)|0;a:do if(c[d+16>>2]|0){T4(c[d+108>>2]|0);i=0;while(1){if((i|0)>=(I|0))break a;h[f+(i<<3)>>3]=+Pw();i=i+1|0}}while(0);if(l<0.0){l=+aq(D,a,f);h[m>>3]=l}if(k<0.0){h[o>>3]=.2;k=.2}if(n>=0.0){h[d>>3]=-1.0;n=-1.0}B=1.0-n;C=+H(+l,+B);z=+H(+k,+((2.0-n)/3.0))/l;A=IK(p)|0;w=S(U,p)|0;x=IK(w)|0;y=d+116|0;u=n==-1.0;v=(e|0)!=0;s=0;t=0.0;while(1){i=0;while(1){if((i|0)>=(I|0))break;h[V+(i<<3)>>3]=0.0;i=i+1|0}B6(x|0,f|0,w|0)|0;q=0;while(1){if((q|0)<(U|0))i=0;else{o=0;break}while(1){if((i|0)>=(a|0))break;h[A+(i<<3)>>3]=0.0;i=i+1|0}p=S(q,a)|0;b:do if(v&(c[y>>2]|0)!=0){i=0;while(1){if((i|0)==(U|0)){i=0;break b}c:do if((i|0)!=(q|0)){l=+Ww(f,a,q,i);g=e+(i<<3)|0;m=S(i,a)|0;n=l*l;j=0;while(1){if((j|0)>=(a|0))break c;o=A+(j<<3)|0;if(u)k=n;else k=+H(+l,+B);h[o>>3]=+h[o>>3]+C*+h[g>>3]*(+h[f+(j+p<<3)>>3]-+h[f+(j+m<<3)>>3])/k;j=j+1|0}}while(0);i=i+1|0}}else{i=0;while(1){if((i|0)==(U|0)){i=0;break b}d:do if((i|0)!=(q|0)){l=+Ww(f,a,q,i);g=S(i,a)|0;n=l*l;j=0;while(1){if((j|0)>=(a|0))break d;m=A+(j<<3)|0;if(u)k=n;else k=+H(+l,+B);h[m>>3]=+h[m>>3]+C*(+h[f+(j+p<<3)>>3]-+h[f+(j+g<<3)>>3])/k;j=j+1|0}}while(0);i=i+1|0}}while(0);while(1){if((i|0)>=(a|0))break;o=V+(i+p<<3)|0;h[o>>3]=+h[A+(i<<3)>>3]+ +h[o>>3];i=i+1|0}q=q+1|0}e:while(1){if((o|0)<(U|0))i=0;else{l=0.0;j=0;break}while(1){if((i|0)>=(a|0))break;h[A+(i<<3)>>3]=0.0;i=i+1|0}p=o+1|0;g=E+(p<<2)|0;q=S(o,a)|0;j=c[E+(o<<2)>>2]|0;while(1){if((j|0)>=(c[g>>2]|0)){i=0;break}m=F+(j<<2)|0;i=c[m>>2]|0;f:do if((i|0)!=(o|0)){k=+Xw(f,a,o,i);i=0;while(1){if((i|0)>=(a|0))break f;n=k*(z*(+h[f+(i+q<<3)>>3]-+h[f+((S(c[m>>2]|0,a)|0)+i<<3)>>3]));W=A+(i<<3)|0;h[W>>3]=+h[W>>3]-n;i=i+1|0}}while(0);j=j+1|0}while(1){if((i|0)>=(a|0)){o=p;continue e}W=V+(i+q<<3)|0;h[W>>3]=+h[A+(i<<3)>>3]+ +h[W>>3];i=i+1|0}}while(1){if((j|0)>=(U|0))break;g=S(j,a)|0;i=0;while(1){if((i|0)>=(a|0)){k=0.0;i=0;break}h[A+(i<<3)>>3]=+h[V+(i+g<<3)>>3];i=i+1|0}while(1){if((i|0)>=(a|0))break;n=+h[A+(i<<3)>>3];k=k+n*n;i=i+1|0}k=+G(+k);l=l+k;g:do if(k>0.0){i=0;while(1){if((i|0)>=(a|0)){i=0;break g}W=A+(i<<3)|0;h[W>>3]=+h[W>>3]/k;i=i+1|0}}else i=0;while(0);while(1){if((i|0)>=(a|0))break;W=f+(i+g<<3)|0;h[W>>3]=+h[W>>3]+r*+h[A+(i<<3)>>3];i=i+1|0}j=j+1|0}s=s+1|0;r=+gq(T,r,l,t,R);if(!((s|0)<(Q|0)&r>P))break;else t=l}if(c[d+112>>2]|0)hq(a,D,f);l6(x);if((D|0)!=(b|0))nw(D);l6(A)}else c[g>>2]=-100;if(L|0)l6(M);if(K|0)l6(N);if(J|0)l6(O);l6(V)}return}function lq(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0.0,I=0,J=0,K=0,L=0.0,M=0.0,N=0,O=0,P=0.0,Q=0.0,R=0,T=0,U=0,V=0,W=0,X=0.0,Y=0,Z=0.0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0;ia=l;l=l+32|0;aa=ia+24|0;ba=ia+20|0;fa=ia+16|0;ga=ia+12|0;ha=ia+8|0;W=ia;s=+h[d>>3];k=d+24|0;r=+h[k>>3];m=d+32|0;q=+h[m>>3];X=+h[d+72>>3];Y=c[d+80>>2]|0;Z=+h[d+88>>3];t=+h[d+96>>3];_=c[d+104>>2]|0;c[aa>>2]=0;c[ba>>2]=10;c[fa>>2]=0;c[ga>>2]=0;c[ha>>2]=0;h[W>>3]=0.0;ea=d+56|0;n=c[ea>>2]|0;if(!((b|0)==0|(Y|0)<1)?($=c[b>>2]|0,i=c[b+4>>2]|0,!((a|0)<1|(i|0)<1)):0){if((i|0)<(c[d+52>>2]|0)){da=0;ca=0}else{da=Zp(n)|0;c[fa>>2]=IK(a*80|0)|0;c[ga>>2]=IK(80)|0;c[ha>>2]=IK(80)|0;ca=1}c[g>>2]=0;a:do if(($|0)==(i|0)){o=sw(b,1)|0;R=c[o+20>>2]|0;T=c[o+24>>2]|0;b:do if(c[d+16>>2]|0){T4(c[d+108>>2]|0);j=S($,a)|0;i=0;while(1){if((i|0)>=(j|0))break b;h[f+(i<<3)>>3]=+Pw();i=i+1|0}}while(0);if(r<0.0){r=+aq(o,a,f);h[k>>3]=r}if(q<0.0){h[m>>3]=.2;q=.2}if(s>=0.0){h[d>>3]=-1.0;s=-1.0}P=1.0-s;Q=+H(+r,+P);M=+H(+q,+((2.0-s)/3.0))/r;N=a<<3;U=IK(N)|0;N=S($,N)|0;V=IK(N)|0;O=d+116|0;I=s==-1.0;J=d+64|0;K=(e|0)!=0;L=+($|0);i=0;E=0;F=0.0;while(1){E=E+1|0;B6(V|0,f|0,N|0)|0;if(ca){i=$p(da)|0;n=i;i=ew(a,$,i,f,(c[O>>2]|0)==0?0:e)|0}u=0.0;s=0.0;y=0;r=0.0;c:while(1){if((y|0)<($|0))j=0;else break;while(1){if((j|0)>=(a|0))break;h[U+(j<<3)>>3]=0.0;j=j+1|0}C=y+1|0;m=R+(C<<2)|0;D=S(y,a)|0;k=c[R+(y<<2)>>2]|0;while(1){if((k|0)>=(c[m>>2]|0))break;p=T+(k<<2)|0;j=c[p>>2]|0;d:do if((j|0)!=(y|0)){q=+Xw(f,a,y,j);j=0;while(1){if((j|0)>=(a|0))break d;w=q*(M*(+h[f+(j+D<<3)>>3]-+h[f+((S(c[p>>2]|0,a)|0)+j<<3)>>3]));B=U+(j<<3)|0;h[B>>3]=+h[B>>3]-w;j=j+1|0}}while(0);k=k+1|0}e:do if(!ca)if(K&(c[O>>2]|0)!=0){j=0;while(1){if((j|0)==($|0))break e;f:do if((j|0)!=(y|0)){v=+Ww(f,a,y,j);m=e+(j<<3)|0;p=S(j,a)|0;w=v*v;k=0;while(1){if((k|0)>=(a|0))break f;x=U+(k<<3)|0;if(I)q=w;else q=+H(+v,+P);h[x>>3]=+h[x>>3]+Q*+h[m>>3]*(+h[f+(k+D<<3)>>3]-+h[f+(k+p<<3)>>3])/q;k=k+1|0}}while(0);j=j+1|0}}else{j=0;while(1){if((j|0)==($|0))break e;g:do if((j|0)!=(y|0)){v=+Ww(f,a,y,j);m=S(j,a)|0;w=v*v;k=0;while(1){if((k|0)>=(a|0))break g;p=U+(k<<3)|0;if(I)q=w;else q=+H(+v,+P);h[p>>3]=+h[p>>3]+Q*(+h[f+(k+D<<3)>>3]-+h[f+(k+m<<3)>>3])/q;k=k+1|0}}while(0);j=j+1|0}}else{_v(i,+h[J>>3],f+(D<<3)|0,y,aa,ba,fa,ga,ha,W,g);u=u+ +h[W>>3];B=c[aa>>2]|0;s=s+ +(B|0);if(c[g>>2]|0){m=U;k=V;i=U;j=V;p=72;break a}m=c[ha>>2]|0;p=c[ga>>2]|0;x=c[fa>>2]|0;j=0;while(1){if((j|0)>=(B|0))break e;v=+h[m+(j<<3)>>3];v=v>1.0e-15?v:1.0e-15;y=p+(j<<3)|0;z=S(j,a)|0;w=v*v;k=0;while(1){if((k|0)>=(a|0))break;A=U+(k<<3)|0;if(I)q=w;else q=+H(+v,+P);h[A>>3]=+h[A>>3]+Q*+h[y>>3]*(+h[f+(k+D<<3)>>3]-+h[x+(k+z<<3)>>3])/q;k=k+1|0}j=j+1|0}}while(0);q=0.0;j=0;while(1){if((j|0)>=(a|0))break;w=+h[U+(j<<3)>>3];q=q+w*w;j=j+1|0}q=+G(+q);r=r+q;h:do if(q>0.0){j=0;while(1){if((j|0)>=(a|0)){j=0;break h}B=U+(j<<3)|0;h[B>>3]=+h[B>>3]/q;j=j+1|0}}else j=0;while(0);while(1){if((j|0)>=(a|0)){y=C;continue c}B=f+(j+D<<3)|0;h[B>>3]=+h[B>>3]+t*+h[U+(j<<3)>>3];j=j+1|0}}if(i|0){lw(i);_p(da,s/L*5.0+u/L)}t=+gq(_,t,r,F,Z);if(!((E|0)<(Y|0)&t>X))break;else F=r}if(!(c[d+112>>2]|0)){m=U;k=V;j=V;i=U;p=71}else{hq(a,o,f);m=U;k=V;j=V;i=U;p=71}}else{c[g>>2]=-100;o=b;m=0;k=0;j=0;i=0;p=71}while(0);if((p|0)==71)if(ca)p=72;if((p|0)==72){Yp(da);c[ea>>2]=n}if(k|0)l6(j);if((o|0)!=(b|0))nw(o);if(m|0)l6(i);i=c[fa>>2]|0;if(i|0)l6(i);i=c[ga>>2]|0;if(i|0)l6(i);i=c[ha>>2]|0;if(i|0)l6(i)}l=ia;return}function mq(a,b,d,e,f,g,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=+i;j=j|0;var k=0,m=0,n=0,o=0.0,p=0,q=0.0,r=0,s=0.0,t=0,u=0.0,v=0.0,w=0,x=0,y=0,z=0.0,A=0,B=0,C=0.0,D=0,E=0.0,F=0.0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0.0,_=0,$=0.0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;ha=l;l=l+48|0;p=ha+8|0;ca=ha+40|0;da=ha+36|0;X=ha+32|0;fa=ha+28|0;ga=ha+24|0;Y=ha;q=+h[e>>3];r=e+32|0;s=+h[r>>3];Z=+h[e+72>>3];_=c[e+80>>2]|0;$=+h[e+88>>3];u=+h[e+96>>3];aa=c[e+104>>2]|0;c[ca>>2]=0;c[da>>2]=10;c[X>>2]=0;c[fa>>2]=0;c[ga>>2]=0;h[Y>>3]=0.0;if(!((b|0)==0|(_|0)<1)?(ba=c[b>>2]|0,n=c[b+4>>2]|0,!((a|0)<1|(n|0)<1)):0){if((c[e+132>>2]|0)!=0?(n|0)>=(c[e+52>>2]|0):0){m=IK(a*80|0)|0;c[X>>2]=m;c[fa>>2]=IK(80)|0;c[ga>>2]=IK(80)|0;t=1;k=m}else{t=0;k=0;m=0}c[j>>2]=0;if((ba|0)==(n|0)){W=sw(b,1)|0;if(!d){V=0;k=W}else{V=c[d+28>>2]|0;k=d}U=c[k+24>>2]|0;T=c[k+20>>2]|0;o=+(ba|0);if(i<0.0){F=+nq(ba,T,V);E=+(c[T+(ba<<2)>>2]|0);i=E/(o*o-E)*i/+H(+F,+(q+1.0));R=c[15715]|0;h[p>>3]=F;h[p+8>>3]=i;z4(R,92532,p)|0}a:do if(c[e+16>>2]|0){_3(92554,24,1,c[15715]|0)|0;T4(c[e+108>>2]|0);m=S(ba,a)|0;k=0;while(1){if((k|0)>=(m|0))break a;h[g+(k<<3)>>3]=+Pw();k=k+1|0}}while(0);oq(ba,a,g,T,U,V);if(s<0.0)h[r>>3]=.2;if(!(q>=0.0))o=q;else{h[e>>3]=-1.0;o=-1.0}Q=a<<3;P=IK(Q)|0;Q=S(ba,Q)|0;R=IK(Q)|0;M=(t|0)!=0;N=e+116|0;O=o==-1.0;F=1.0-o;I=(f|0)!=0;J=(V|0)==0;K=e+8|0;L=e+64|0;k=0;D=0;E=0.0;o=1.0;C=u;b:while(1){D=D+1|0;B6(R|0,g|0,Q|0)|0;if(M)k=ew(a,ba,10,g,(c[N>>2]|0)==0?0:f)|0;t=0;s=0.0;c:while(1){if((t|0)<(ba|0))m=0;else break;while(1){if((m|0)>=(a|0))break;h[P+(m<<3)>>3]=0.0;m=m+1|0}B=t+1|0;r=T+(B<<2)|0;A=S(t,a)|0;p=c[T+(t<<2)>>2]|0;while(1){if((p|0)>=(c[r>>2]|0))break;d=U+(p<<2)|0;m=c[d>>2]|0;d:do if((m|0)!=(t|0)){z=+Ww(g,a,t,m);if(!J)o=+h[V+(p<<3)>>3];q=+h[K>>3];v=z-o;u=o*o;e:do if(!(q==2.0))if(q==1.0){q=1.0/u;m=0;while(1){if((m|0)>=(a|0))break e;u=-(v*(q*(+h[g+(m+A<<3)>>3]-+h[g+((S(c[d>>2]|0,a)|0)+m<<3)>>3])))/z;y=P+(m<<3)|0;h[y>>3]=+h[y>>3]+u;m=m+1|0}}else{q=1.0/+H(+o,+(q+1.0));m=0;while(1){if((m|0)>=(a|0))break e;u=q*(+h[g+(m+A<<3)>>3]-+h[g+((S(c[d>>2]|0,a)|0)+m<<3)>>3]);u=-(u*+H(+v,+(+h[K>>3])))/z;y=P+(m<<3)|0;h[y>>3]=+h[y>>3]+u;m=m+1|0}}else{q=1.0/(o*u);m=0;while(1){if((m|0)>=(a|0))break e;u=-(v*(v*(q*(+h[g+(m+A<<3)>>3]-+h[g+((S(c[d>>2]|0,a)|0)+m<<3)>>3]))))/z;y=P+(m<<3)|0;h[y>>3]=+h[y>>3]+u;m=m+1|0}}while(0);u=z*z;q=+H(+z,+F);if(I&(c[N>>2]|0)!=0){n=f+(p<<3)|0;q=O?u:q;m=0;while(1){if((m|0)>=(a|0))break d;y=P+(m<<3)|0;z=i*+h[n>>3]*(+h[g+(m+A<<3)>>3]-+h[g+((S(c[d>>2]|0,a)|0)+m<<3)>>3])/q;h[y>>3]=+h[y>>3]-z;m=m+1|0}}else{q=O?u:q;m=0;while(1){if((m|0)>=(a|0))break d;y=P+(m<<3)|0;z=i*(+h[g+(m+A<<3)>>3]-+h[g+((S(c[d>>2]|0,a)|0)+m<<3)>>3])/q;h[y>>3]=+h[y>>3]-z;m=m+1|0}}}while(0);p=p+1|0}f:do if(!M)if(I&(c[N>>2]|0)!=0){m=0;while(1){if((m|0)==(ba|0)){q=0.0;m=0;break f}g:do if((m|0)!=(t|0)){u=+Ww(g,a,t,m);d=f+(m<<3)|0;p=S(m,a)|0;v=u*u;n=0;while(1){if((n|0)>=(a|0))break g;r=P+(n<<3)|0;if(O)q=v;else q=+H(+u,+F);h[r>>3]=+h[r>>3]+i*+h[d>>3]*(+h[g+(n+A<<3)>>3]-+h[g+(n+p<<3)>>3])/q;n=n+1|0}}while(0);m=m+1|0}}else{m=0;while(1){if((m|0)==(ba|0)){q=0.0;m=0;break f}h:do if((m|0)!=(t|0)){u=+Ww(g,a,t,m);d=S(m,a)|0;v=u*u;n=0;while(1){if((n|0)>=(a|0))break h;p=P+(n<<3)|0;if(O)q=v;else q=+H(+u,+F);h[p>>3]=+h[p>>3]+i*(+h[g+(n+A<<3)>>3]-+h[g+(n+d<<3)>>3])/q;n=n+1|0}}while(0);m=m+1|0}}else{_v(k,+h[L>>3],g+(A<<3)|0,t,ca,da,X,fa,ga,Y,j);d=c[ca>>2]|0;if(c[j>>2]|0)break b;p=c[ga>>2]|0;r=c[fa>>2]|0;t=c[X>>2]|0;m=0;while(1){if((m|0)>=(d|0)){q=0.0;m=0;break f}u=+h[p+(m<<3)>>3];u=u>1.0e-15?u:1.0e-15;w=r+(m<<3)|0;x=S(m,a)|0;v=u*u;n=0;while(1){if((n|0)>=(a|0))break;y=P+(n<<3)|0;if(O)q=v;else q=+H(+u,+F);h[y>>3]=+h[y>>3]+i*+h[w>>3]*(+h[g+(n+A<<3)>>3]-+h[t+(n+x<<3)>>3])/q;n=n+1|0}m=m+1|0}}while(0);while(1){if((m|0)>=(a|0))break;z=+h[P+(m<<3)>>3];q=q+z*z;m=m+1|0}q=+G(+q);s=s+q;i:do if(q>0.0){m=0;while(1){if((m|0)>=(a|0)){m=0;break i}y=P+(m<<3)|0;h[y>>3]=+h[y>>3]/q;m=m+1|0}}else m=0;while(0);while(1){if((m|0)>=(a|0)){t=B;continue c}y=g+(m+A<<3)|0;h[y>>3]=+h[y>>3]+C*+h[P+(m<<3)>>3];m=m+1|0}}if(k|0)lw(k);C=+gq(aa,C,s,E,$);if(!((D|0)<(_|0)&C>Z)){ea=88;break}else E=s}if((ea|0)==88?c[e+112>>2]|0:0)hq(a,W,g);l6(R);if((W|0)!=(b|0))nw(W);l6(P);k=c[X>>2]|0;m=k}else c[j>>2]=-100;if(m|0)l6(k);k=c[fa>>2]|0;if(k|0)l6(k);k=c[ga>>2]|0;if(k|0)l6(k)}l=ha;return}function nq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,i=0,j=0.0;if(!d)e=1.0;else{f=0;e=0.0;a:while(1){if((f|0)>=(a|0))break;g=f+1|0;i=c[b+(g<<2)>>2]|0;f=c[b+(f<<2)>>2]|0;while(1){if((f|0)>=(i|0)){f=g;continue a}j=e+ +h[d+(f<<3)>>3];f=f+1|0;e=j}}e=e/+(c[b+(a<<2)>>2]|0)}return +e}function oq(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0;v=l;l=l+16|0;u=v;t=(g|0)==0;k=0.0;m=0.0;n=1.0;j=0;a:while(1){if((j|0)>=(a|0))break;r=j+1|0;s=e+(r<<2)|0;q=c[e+(j<<2)>>2]|0;while(1){if((q|0)>=(c[s>>2]|0)){j=r;continue a}i=c[f+(q<<2)>>2]|0;b:do if((i|0)!=(j|0)){o=+Ww(d,b,j,i);if(!t)n=+h[g+(q<<3)>>3];w=1.0/(n*n);p=o*(n*w);o=o*(o*w);i=0;while(1){if((i|0)>=(b|0))break b;i=i+1|0;k=o+k;m=p+m}}while(0);q=q+1|0}}k=m/k;j=S(b,a)|0;i=0;while(1){if((i|0)>=(j|0))break;b=d+(i<<3)|0;h[b>>3]=k*+h[b>>3];i=i+1|0}d=c[15715]|0;h[u>>3]=k;z4(d,92579,u)|0;l=v;return} +function $g(a){a=a|0;var b=0,d=0,e=0;while(1){b=c[(c[a+16>>2]|0)+116>>2]|0;if(!b)break;else a=b}b=c[a>>2]&3;d=c[(c[((b|0)==2?a:a+-48|0)+40>>2]|0)+16>>2]|0;e=c[d+232>>2]|0;a=c[(c[((b|0)==3?a:a+48|0)+40>>2]|0)+16>>2]|0;b=c[a+232>>2]|0;if((e|0)<=(b|0))if((e|0)<(b|0))a=1;else a=(c[d+236>>2]|0)<(c[a+236>>2]|0)&1;else a=0;return a|0}function ah(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=l;l=l+16|0;e=d+8|0;f=d;h=(c[a+16>>2]|0)+180|0;g=(c[b+16>>2]|0)+172|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];b=bh(a,f,b,e)|0;l=d;return b|0}function bh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=c[b+4>>2]|0;a:do if((f|0)>0?(g=c[e+4>>2]|0,(g|0)>0):0)if((f|0)<(g|0)){f=c[b>>2]|0;e=0;while(1){b=c[f+(e<<2)>>2]|0;if(!b){b=0;break a}if((c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)==(d|0))break;else e=e+1|0}}else{f=c[e>>2]|0;e=0;while(1){b=c[f+(e<<2)>>2]|0;if(!b){b=0;break a}if((c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0)==(a|0))break;else e=e+1|0}}else b=0;while(0);return b|0}function ch(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=l;l=l+16|0;e=d+8|0;f=d;h=(c[a+16>>2]|0)+188|0;g=(c[b+16>>2]|0)+196|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];b=bh(a,f,b,e)|0;l=d;return b|0}function dh(a){a=a|0;var b=0,d=0,e=0,f=0;e=a+48|0;d=c[(c[((c[a>>2]&3|0)==3?a:e)+40>>2]|0)+16>>2]|0;b=c[d+180>>2]|0;d=(c[d+184>>2]<<2)+8|0;if(!b)b=IK(d)|0;else b=KK(b,d)|0;c[(c[(c[((c[a>>2]&3|0)==3?a:e)+40>>2]|0)+16>>2]|0)+180>>2]=b;f=c[(c[((c[a>>2]&3|0)==3?a:e)+40>>2]|0)+16>>2]|0;b=c[f+180>>2]|0;f=f+184|0;d=c[f>>2]|0;c[f>>2]=d+1;c[b+(d<<2)>>2]=a;e=c[(c[((c[a>>2]&3|0)==3?a:e)+40>>2]|0)+16>>2]|0;c[(c[e+180>>2]|0)+(c[e+184>>2]<<2)>>2]=0;e=a+-48|0;d=c[(c[((c[a>>2]&3|0)==2?a:e)+40>>2]|0)+16>>2]|0;b=c[d+172>>2]|0;d=(c[d+176>>2]<<2)+8|0;if(!b)b=IK(d)|0;else b=KK(b,d)|0;c[(c[(c[((c[a>>2]&3|0)==2?a:e)+40>>2]|0)+16>>2]|0)+172>>2]=b;b=c[(c[((c[a>>2]&3|0)==2?a:e)+40>>2]|0)+16>>2]|0;d=c[b+172>>2]|0;b=b+176|0;f=c[b>>2]|0;c[b>>2]=f+1;c[d+(f<<2)>>2]=a;f=c[(c[((c[a>>2]&3|0)==2?a:e)+40>>2]|0)+16>>2]|0;c[(c[f+172>>2]|0)+(c[f+176>>2]<<2)>>2]=0;return a|0}function eh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;e=a+4|0;f=c[e>>2]|0;d=0;while(1){if((d|0)>=(f|0))break;g=c[a>>2]|0;h=g+(d<<2)|0;if((c[h>>2]|0)==(b|0)){i=4;break}else d=d+1|0}if((i|0)==4){i=f+-1|0;c[e>>2]=i;c[h>>2]=c[g+(i<<2)>>2];c[(c[a>>2]|0)+(i<<2)>>2]=0}return}function fh(a){a=a|0;if(!a)Aa(85823,85833,117,85842);else{eh((c[(c[((c[a>>2]&3|0)==3?a:a+48|0)+40>>2]|0)+16>>2]|0)+180|0,a);eh((c[(c[((c[a>>2]&3|0)==2?a:a+-48|0)+40>>2]|0)+16>>2]|0)+172|0,a);return}}function gh(a){a=a|0;var b=0,d=0,e=0,f=0;e=a+48|0;d=c[(c[((c[a>>2]&3|0)==3?a:e)+40>>2]|0)+16>>2]|0;b=c[d+204>>2]|0;d=(c[d+208>>2]<<2)+8|0;if(!b)b=IK(d)|0;else b=KK(b,d)|0;c[(c[(c[((c[a>>2]&3|0)==3?a:e)+40>>2]|0)+16>>2]|0)+204>>2]=b;f=c[(c[((c[a>>2]&3|0)==3?a:e)+40>>2]|0)+16>>2]|0;b=c[f+204>>2]|0;f=f+208|0;d=c[f>>2]|0;c[f>>2]=d+1;c[b+(d<<2)>>2]=a;e=c[(c[((c[a>>2]&3|0)==3?a:e)+40>>2]|0)+16>>2]|0;c[(c[e+204>>2]|0)+(c[e+208>>2]<<2)>>2]=0;return}function hh(a){a=a|0;ih(a,(c[(c[((c[a>>2]&3|0)==3?a:a+48|0)+40>>2]|0)+16>>2]|0)+204|0);return}function ih(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;h=b+4|0;e=c[h>>2]|0;g=c[b>>2]|0;d=0;while(1){if((d|0)>=(e|0)){f=4;break}if((c[g+(d<<2)>>2]|0)==(a|0))break;else d=d+1|0}if((f|0)==4){d=(e<<2)+8|0;if(!g)d=IK(d)|0;else d=KK(g,d)|0;c[b>>2]=d;f=c[h>>2]|0;g=f+1|0;c[h>>2]=g;c[d+(f<<2)>>2]=a;c[(c[b>>2]|0)+(g<<2)>>2]=0}return}function jh(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=HK(96)|0;g=o+48|0;c[g>>2]=c[g>>2]|3;c[o>>2]=c[o>>2]&-4|2;i=HK(176)|0;n=o+16|0;c[n>>2]=i;c[((c[o>>2]&3|0)==3?o:g)+40>>2]=d;j=o+-48|0;c[((c[o>>2]&3|0)==2?o:j)+40>>2]=e;a[i+112>>0]=1;if(!f){c[i+156>>2]=1;b[i+154>>1]=1;b[i+168>>1]=1;b[i+170>>1]=1}else{c[o>>2]=c[o>>2]&15|c[f>>2]&-16;c[g>>2]=c[g>>2]&15|c[f>>2]&-16;m=f+16|0;h=c[m>>2]|0;b[i+168>>1]=b[h+168>>1]|0;b[i+154>>1]=b[h+154>>1]|0;c[i+156>>2]=c[h+156>>2];b[i+170>>1]=b[h+170>>1]|0;d=c[((c[o>>2]&3|0)==3?o:g)+40>>2]|0;e=c[f>>2]&3;k=f+48|0;l=f+-48|0;if((d|0)!=(c[((e|0)==3?f:k)+40>>2]|0)){if((d|0)==(c[((e|0)==2?f:l)+40>>2]|0)){g=i+16|0;d=h+56|0;e=g+40|0;do{c[g>>2]=c[d>>2];g=g+4|0;d=d+4|0}while((g|0)<(e|0))}}else{g=i+16|0;d=h+16|0;e=g+40|0;do{c[g>>2]=c[d>>2];g=g+4|0;d=d+4|0}while((g|0)<(e|0))}d=c[((c[o>>2]&3|0)==2?o:j)+40>>2]|0;e=c[f>>2]&3;if((d|0)!=(c[((e|0)==2?f:l)+40>>2]|0)){if((d|0)==(c[((e|0)==3?f:k)+40>>2]|0)){g=(c[n>>2]|0)+56|0;d=(c[m>>2]|0)+16|0;e=g+40|0;do{c[g>>2]=c[d>>2];g=g+4|0;d=d+4|0}while((g|0)<(e|0))}}else{g=(c[n>>2]|0)+56|0;d=(c[m>>2]|0)+56|0;e=g+40|0;do{c[g>>2]=c[d>>2];g=g+4|0;d=d+4|0}while((g|0)<(e|0))}d=(c[m>>2]|0)+172|0;if(!(c[d>>2]|0))c[d>>2]=o;c[(c[n>>2]|0)+116>>2]=f}return o|0}function kh(a,b,c){a=a|0;b=b|0;c=c|0;return dh(jh(a,b,c)|0)|0}function lh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(c[a+16>>2]|0)+192|0;f=c[d>>2]|0;e=c[b+16>>2]|0;c[e+164>>2]=f;a=f;if(f|0)c[(c[a+16>>2]|0)+168>>2]=b;c[d>>2]=b;c[e+168>>2]=0;if((a|0)==(b|0))Aa(85859,85833,215,85875);else return}function mh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;if((a|0)==(b|0))Aa(85885,85833,220,85892);f=c[b+16>>2]|0;d=f+164|0;if(c[d>>2]|0)Aa(85905,85833,221,85892);e=(c[a+16>>2]|0)+164|0;c[d>>2]=c[e>>2];d=c[e>>2]|0;if(d|0)c[(c[d+16>>2]|0)+168>>2]=b;c[f+168>>2]=a;c[e>>2]=b;return}function nh(a,b){a=a|0;b=b|0;var d=0;if(!(oh(a,b)|0))Aa(85924,85833,231,85945);b=c[b+16>>2]|0;d=c[b+164>>2]|0;b=b+168|0;if(d|0)c[(c[d+16>>2]|0)+168>>2]=c[b>>2];b=c[b>>2]|0;if(!b)c[(c[a+16>>2]|0)+192>>2]=d;else c[(c[b+16>>2]|0)+164>>2]=d;return}function oh(a,b){a=a|0;b=b|0;a=(c[a+16>>2]|0)+192|0;while(1){a=c[a>>2]|0;if((a|0)==0|(a|0)==(b|0))break;a=(c[a+16>>2]|0)+164|0}return a|0}function ph(b){b=b|0;var d=0,e=0,f=0,g=0;d=HK(64)|0;c[d>>2]=c[d>>2]&-4|1;e=d+16|0;c[e>>2]=HK(304)|0;c[d+24>>2]=vC(b)|0;g=c[e>>2]|0;a[g+156>>0]=1;h[g+96>>3]=1.0;h[g+88>>3]=1.0;h[g+80>>3]=1.0;c[g+216>>2]=1;c[g+176>>2]=0;g=HK(20)|0;f=c[e>>2]|0;c[f+172>>2]=g;c[f+184>>2]=0;f=HK(20)|0;c[(c[e>>2]|0)+180>>2]=f;lh(b,d);b=(c[b+16>>2]|0)+232|0;c[b>>2]=(c[b>>2]|0)+1;return d|0}function qh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=d+48|0;f=c[(c[((c[d>>2]&3|0)==3?d:g)+40>>2]|0)+16>>2]|0;e=c[f+188>>2]|0;f=(c[f+192>>2]<<2)+8|0;if(!e)e=IK(f)|0;else e=KK(e,f)|0;c[(c[(c[((c[d>>2]&3|0)==3?d:g)+40>>2]|0)+16>>2]|0)+188>>2]=e;h=c[(c[((c[d>>2]&3|0)==3?d:g)+40>>2]|0)+16>>2]|0;e=c[h+188>>2]|0;h=h+192|0;f=c[h>>2]|0;c[h>>2]=f+1;c[e+(f<<2)>>2]=d;g=c[(c[((c[d>>2]&3|0)==3?d:g)+40>>2]|0)+16>>2]|0;c[(c[g+188>>2]|0)+(c[g+192>>2]<<2)>>2]=0;g=d+-48|0;f=c[(c[((c[d>>2]&3|0)==2?d:g)+40>>2]|0)+16>>2]|0;e=c[f+196>>2]|0;f=(c[f+200>>2]<<2)+8|0;if(!e)e=IK(f)|0;else e=KK(e,f)|0;c[(c[(c[((c[d>>2]&3|0)==2?d:g)+40>>2]|0)+16>>2]|0)+196>>2]=e;e=c[(c[((c[d>>2]&3|0)==2?d:g)+40>>2]|0)+16>>2]|0;f=c[e+196>>2]|0;e=e+200|0;h=c[e>>2]|0;c[e>>2]=h+1;c[f+(h<<2)>>2]=d;h=c[(c[((c[d>>2]&3|0)==2?d:g)+40>>2]|0)+16>>2]|0;c[(c[h+196>>2]|0)+(c[h+200>>2]<<2)>>2]=0;a[(c[b+16>>2]|0)+240>>0]=1;a[(c[(dg(b)|0)+16>>2]|0)+240>>0]=1;return}function rh(a){a=a|0;var b=0,d=0;if(!a)Aa(85823,85833,269,85962);b=c[(c[a+16>>2]|0)+116>>2]|0;if(b|0?(d=(c[b+16>>2]|0)+172|0,(c[d>>2]|0)==(a|0)):0)c[d>>2]=0;eh((c[(c[((c[a>>2]&3|0)==3?a:a+48|0)+40>>2]|0)+16>>2]|0)+188|0,a);eh((c[(c[((c[a>>2]&3|0)==2?a:a+-48|0)+40>>2]|0)+16>>2]|0)+196|0,a);return}function sh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=l;l=l+16|0;d=(c[a+16>>2]|0)+172|0;e=c[d>>2]|0;do if((e|0)!=(b|0))if(!e){c[d>>2]=b;th(a,b);break}else Aa(87865,85833,340,86e3);else dA(0,85979,f)|0;while(0);l=f;return}function th(a,d){a=a|0;d=d|0;var f=0,g=0,h=0,i=0;f=(c[d+16>>2]|0)+170|0;i=c[a+16>>2]|0;a=b[i+170>>1]|0;if((e[f>>1]|0)<(a&65535))b[f>>1]=a;g=i+168|0;h=i+154|0;f=i+156|0;a=d;while(1){if(!a)break;d=c[a+16>>2]|0;i=d+168|0;b[i>>1]=(e[i>>1]|0)+(e[g>>1]|0);i=d+154|0;b[i>>1]=(e[i>>1]|0)+(e[h>>1]|0);i=d+156|0;c[i>>2]=(c[i>>2]|0)+(c[f>>2]|0);a=c[d+172>>2]|0}return}function uh(d){d=d|0;var e=0,f=0,g=0,h=0;f=d+16|0;e=c[(c[f>>2]|0)+172>>2]|0;a:while(1){if(!e)break;vh(e,d);h=c[e+16>>2]|0;g=c[h+172>>2]|0;if(!(b[h+168>>1]|0))wh(e);while(1){if((a[(c[e+16>>2]|0)+112>>0]|0)!=1){e=g;continue a}e=c[(c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0)+16>>2]|0;if((a[e+156>>0]|0)!=1){e=g;continue a}if((c[e+184>>2]|0)!=1){e=g;continue a}e=c[c[e+180>>2]>>2]|0;vh(e,d)}}c[(c[f>>2]|0)+172>>2]=0;return}function vh(a,d){a=a|0;d=d|0;var f=0;f=c[d+16>>2]|0;d=c[a+16>>2]|0;a=d+168|0;b[a>>1]=(e[a>>1]|0)-(e[f+168>>1]|0);a=d+154|0;b[a>>1]=(e[a>>1]|0)-(e[f+154>>1]|0);d=d+156|0;c[d>>2]=(c[d>>2]|0)-(c[f+156>>2]|0);return}function wh(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;if(!a)Aa(85823,85833,128,86013);g=a+48|0;d=0;while(1){b=c[a>>2]|0;e=(c[(c[((b&3|0)==3?a:g)+40>>2]|0)+16>>2]|0)+180|0;f=c[(c[e>>2]|0)+(d<<2)>>2]|0;if(!f)break;if((f|0)==(a|0))eh(e,a);d=d+1|0}g=a+-48|0;f=0;while(1){d=(c[(c[((b&3|0)==2?a:g)+40>>2]|0)+16>>2]|0)+172|0;e=c[(c[d>>2]|0)+(f<<2)>>2]|0;if(!e)break;if((e|0)==(a|0)){eh(d,a);b=c[a>>2]|0}f=f+1|0}return}function xh(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;p=l;l=l+1040|0;n=p+4|0;o=p;m=p+8|0;k=a+16|0;a=c[k>>2]|0;j=b[a+236>>1]|0;while(1){if((j|0)>(b[a+238>>1]|0))break;i=c[a+196>>2]|0;h=i+(j<<6)|0;i=i+(j<<6)+4|0;g=0;a=0;while(1){d=(a|0)!=0;if((g|0)>=(c[h>>2]|0))break;e=c[(c[i>>2]|0)+(g<<2)>>2]|0;f=e+16|0;if(c[(c[f>>2]|0)+112>>2]|0){if(!d){c[n>>2]=c[4658];a=lB(86035,n,0)|0}c[o>>2]=g;i2(m,137696,o)|0;s=qC(a,m,1)|0;RC(s,91465,24,1)|0;d=c[(c[f>>2]|0)+180>>2]|0;q=c[d>>2]|0;q=c[(c[(c[((c[q>>2]&3|0)==2?q:q+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0;d=c[d+4>>2]|0;d=c[(c[(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0;r=(q|0)>(d|0);f=c[s+16>>2]|0;c[f+12>>2]=r?d:q;c[f+16>>2]=r?q:d;c[f+20>>2]=e}g=g+1|0}if(d){if((qB(a)|0)>1)yh(a,h);pB(a)|0}j=j+1|0;a=c[k>>2]|0}l=p;return}function yh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=0;h=gC(a)|0;a:while(1){if(!h)break;i=hC(a,h)|0;j=h+16|0;g=i;while(1){if(!g){h=i;continue a}f=c[g+16>>2]|0;e=c[j>>2]|0;if((c[f+16>>2]|0)>(c[e+12>>2]|0)){if((c[e+16>>2]|0)<=(c[f+12>>2]|0))fB(a,h,g,0,1)|0}else{fB(a,g,h,0,1)|0;d=1}g=hC(a,g)|0}}do if(d|0){h=LD(a,86038,1)|0;j=HK((qB(a)|0)<<2)|0;i=HK((qB(a)|0)<<2)|0;f=b+4|0;e=gC(a)|0;b:while(1){if(!e){d=23;break}if((c[(c[e+16>>2]|0)+8>>2]|0)==0?sB(a,e,1,1)|0:0){c:do if(zh(a,e,h,i)|0){g=qB(h)|0;if((Ah(a,h,j)|0)!=(g|0)){d=17;break b}k3(i,g,4,60);d=0;while(1){if((d|0)>=(g|0))break c;b=i+(d<<2)|0;k=c[j+(d<<2)>>2]|0;c[(c[k+16>>2]|0)+236>>2]=c[b>>2];c[(c[f>>2]|0)+(c[b>>2]<<2)>>2]=k;d=d+1|0}}while(0);Ch(h)}e=hC(a,e)|0}if((d|0)==17)Aa(86043,86053,265,86064);else if((d|0)==23){l6(j);break}}while(0);return}function zh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;h=c[b+16>>2]|0;c[h+8>>2]=1;h=c[(c[(c[h+20>>2]|0)+16>>2]|0)+236>>2]|0;c[e+((qB(d)|0)<<2)>>2]=h;lC(d,b,1)|0;h=UA(a,b)|0;f=0;while(1){if(!h)break;j=c[h>>2]&3;g=c[((j|0)==2?h:h+-48|0)+40>>2]|0;i=c[g+16>>2]|0;f=((c[(c[(c[i+20>>2]|0)+16>>2]|0)+236>>2]|0)>(c[(c[(c[(c[(c[((j|0)==3?h:h+48|0)+40>>2]|0)+16>>2]|0)+20>>2]|0)+16>>2]|0)+236>>2]|0)&1)+f|0;if(!(c[i+8>>2]|0))f=(zh(a,g,d,e)|0)+f|0;h=WA(a,h)|0}h=XA(a,b)|0;while(1){if(!h)break;i=c[h>>2]&3;g=c[((i|0)==3?h:h+48|0)+40>>2]|0;j=c[g+16>>2]|0;f=((c[(c[(c[(c[(c[((i|0)==2?h:h+-48|0)+40>>2]|0)+16>>2]|0)+20>>2]|0)+16>>2]|0)+236>>2]|0)>(c[(c[(c[j+20>>2]|0)+16>>2]|0)+236>>2]|0)&1)+f|0;if(!(c[j+8>>2]|0))f=(zh(a,g,d,e)|0)+f|0;h=YA(a,h)|0}return f|0}function Ah(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=0;while(1){e=Dh(a,b)|0;if(!e)break;c[d+(f<<2)>>2]=c[(c[e+16>>2]|0)+20>>2];sC(b,e)|0;e=UA(a,e)|0;while(1){if(!e)break;g=WA(a,e)|0;iB(a,e)|0;e=g}f=f+1|0}return f|0}function Bh(a,b){a=a|0;b=b|0;return (c[a>>2]|0)-(c[b>>2]|0)|0}function Ch(a){a=a|0;var b=0,c=0;b=gC(a)|0;while(1){if(!b)break;c=hC(a,b)|0;sC(a,b)|0;b=c}return}function Dh(a,b){a=a|0;b=b|0;var c=0;c=gC(b)|0;while(1){if(!c){c=0;break}if(!(sB(a,c,1,0)|0))break;c=hC(b,c)|0}return c|0}function Eh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;Fh(b);i=b+16|0;f=0;e=0;while(1){if((f|0)>=(c[(c[i>>2]|0)+220>>2]|0))break;Gh(b,f);f=f+1|0;e=(Hh(b,0,d)|0)+e|0}Ih(b);h=1;while(1){f=c[i>>2]|0;g=c[f+180>>2]|0;if((h|0)>(g|0))break;g=(Jh(c[(c[f+184>>2]|0)+(h<<2)>>2]|0,d)|0)+e|0;h=h+1|0;e=g}do if((g|0)>0){f=NA(b,86078)|0;if(f|0?(bP(f)|0)<<24>>24==0:0)break;gl(b);a[194049]=1;e=Hh(b,2,d)|0}while(0);Kh(b,e);return}function Fh(d){d=d|0;var e=0;if(a[195234]|0)RO();a[194049]=0;c[46783]=d;e=((rB(dg(d)|0)|0)<<2)+4|0;c[46782]=HK(e)|0;c[46781]=HK(e)|0;Ai(d);e=d+16|0;if(b[(c[e>>2]|0)+136>>1]&16)Bi(d);Pk(d);Dl(d,1);Ci(d);Rh(d);e=c[e>>2]|0;c[46784]=b[e+236>>1];c[46785]=b[e+238>>1];return}function Gh(a,d){a=a|0;d=d|0;var e=0,f=0,g=0;a=c[a+16>>2]|0;c[a+192>>2]=c[(c[a+216>>2]|0)+(d<<2)>>2];a:do if((d|0)>0){d=b[a+238>>1]|0;e=a+196|0;a=b[a+236>>1]|0;while(1){if((a|0)>(d|0))break a;f=c[e>>2]|0;g=f+(a<<6)+4|0;f=f+(a<<6)|0;c[g>>2]=(c[g>>2]|0)+(c[f>>2]<<2);c[f>>2]=0;a=a+1|0}}while(0);return}function Hh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+32|0;p=q;if((d|0)>1){f=fi(0)|0;gi(b)}else f=2147483647;o=c[15715]|0;n=d;g=0;d=f;while(1){if((n|0)>=3)break;g=c[47183]|0;if((n|0)==2)if((f|0)>(d|0)){ii(b);f=d}else f=d;else{f=(g|0)<4?g:4;if((dg(b)|0)==(b|0))hi(b,n);if(!n)Sh(b);Th(b);i=fi(0)|0;if((i|0)>(d|0)){g=f;f=i}else{gi(b);g=f;f=i;d=i}}i=0;m=0;while(1){j=(f|0)==0;if((m|0)>=(g|0))break;if(a[195234]|0){c[p>>2]=n;c[p+4>>2]=m;c[p+8>>2]=i;c[p+12>>2]=f;c[p+16>>2]=d;z4(o,86471,p)|0}k=i+1|0;if(j|(i|0)>=(c[46786]|0))break;ji(b,m);f=fi(0)|0;if((f|0)>(d|0))i=k;else{gi(b);i=+(f|0)<+(d|0)*+h[23234]?0:k;d=f}m=m+1|0}if(j){f=0;break}else n=n+1|0}if((f|0)>(d|0))ii(b);if((d|0)>0){ki(b,0);f=fi(0)|0}else f=d;a:do if(e|0){d=0;while(1){if((d|0)>=(g|0))break a;li(b);d=d+1|0}}while(0);l=q;return f|0}function Ih(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;o=q;ei(d);m=d+16|0;e=c[m>>2]|0;n=c[15715]|0;k=b[e+236>>1]|0;while(1){if((k|0)>(b[e+238>>1]|0))break;f=c[e+196>>2]|0;g=c[f+(k<<6)+8>>2]|0;c[f+(k<<6)>>2]=g;h=c[f+(k<<6)+12>>2]|0;c[f+(k<<6)+4>>2]=h;j=0;while(1){if((j|0)>=(g|0))break;i=c[h+(j<<2)>>2]|0;if(!i){p=6;break}c[(c[i+16>>2]|0)+236>>2]=j;j=j+1|0}if((p|0)==6){p=0;if(a[195234]|0){f=HB(d)|0;e=c[(c[(c[m>>2]|0)+196>>2]|0)+(k<<6)>>2]|0;c[o>>2]=f;c[o+4>>2]=k;c[o+8>>2]=j;c[o+12>>2]=e;z4(n,86421,o)|0;e=c[m>>2]|0;f=c[e+196>>2]|0}c[f+(k<<6)>>2]=j}k=k+1|0}l=q;return}function Jh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;al(a);Rh(a);Sh(a);Th(a);f=a+16|0;d=Hh(a,2,b)|0;e=1;while(1){g=c[f>>2]|0;if((e|0)>(c[g+180>>2]|0))break;d=(Jh(c[(c[g+184>>2]|0)+(e<<2)>>2]|0,b)|0)+d|0;e=e+1|0}Uh(a);return d|0}function Kh(d,e){d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0;q=l;l=l+16|0;p=q;f=c[46781]|0;if(f|0){l6(f);c[46781]=0}f=c[46782]|0;if(f|0){l6(f);c[46782]=0}o=d+16|0;f=1;while(1){g=c[o>>2]|0;if((f|0)>(c[g+180>>2]|0))break;Lh(c[(c[g+184>>2]|0)+(f<<2)>>2]|0);f=f+1|0}n=b[g+236>>1]|0;f=g;while(1){if((n|0)>(b[f+238>>1]|0))break;else m=0;while(1){f=c[f+196>>2]|0;if((m|0)>=(c[f+(n<<6)>>2]|0))break;k=(c[(c[f+(n<<6)+4>>2]|0)+(m<<2)>>2]|0)+16|0;f=c[k>>2]|0;c[f+236>>2]=m;f=c[f+188>>2]|0;a:do if(f|0){g=0;while(1){i=c[f+(g<<2)>>2]|0;if(!i)break a;j=i+16|0;if((a[(c[j>>2]|0)+112>>0]|0)==4){rh(i);l6(c[j>>2]|0);l6(i);g=g+-1|0;f=c[(c[k>>2]|0)+188>>2]|0}g=g+1|0}}while(0);m=m+1|0;f=c[o>>2]|0}Mh(c[f+(n<<6)+56>>2]|0);n=n+1|0;f=c[o>>2]|0}if(a[195234]|0){o=c[15715]|0;d=HB(d)|0;r=+SO();c[p>>2]=d;c[p+4>>2]=e;h[p+8>>3]=r;z4(o,86089,p)|0}l=q;return}function Lh(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;g=a+16|0;d=1;while(1){f=c[g>>2]|0;if((d|0)>(c[f+180>>2]|0))break;Lh(c[(c[f+184>>2]|0)+(d<<2)>>2]|0);d=d+1|0}a:do if(c[f+268>>2]|0){e=b[f+236>>1]|0;d=f;while(1){if((e|0)>(b[d+238>>1]|0))break a;j=c[(c[d+268>>2]|0)+(e<<2)>>2]|0;i=Nh(a,j,-1)|0;j=Nh(a,j,1)|0;c[(c[(c[g>>2]|0)+268>>2]|0)+(e<<2)>>2]=i;k=c[(c[(c[(dg(a)|0)+16>>2]|0)+196>>2]|0)+(e<<6)+4>>2]|0;i=c[(c[i+16>>2]|0)+236>>2]|0;f=c[g>>2]|0;h=c[f+196>>2]|0;c[h+(e<<6)+4>>2]=k+(i<<2);c[h+(e<<6)>>2]=(c[(c[j+16>>2]|0)+236>>2]|0)+1-i;e=e+1|0;d=f}}while(0);return}function Mh(a){a=a|0;if(a|0){l6(c[a+8>>2]|0);l6(a)}return}function Nh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=b;while(1){b=Oh(b,c)|0;if(!b)break;if(Ph(a,b)|0){d=b;continue}e=(Qh(a,b)|0)==0;d=e?d:b}return d|0}function Oh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;if(!a)Aa(86128,86053,1023,86130);a=a+16|0;if((b|0)<0){a=c[a>>2]|0;e=c[a+236>>2]|0;if((e|0)>0){a=(c[(c[(c[46783]|0)+16>>2]|0)+196>>2]|0)+(c[a+232>>2]<<6)+4|0;d=e+-1|0;f=7}else g=0}else{a=c[a>>2]|0;e=c[a+236>>2]|0;a=(c[(c[(c[46783]|0)+16>>2]|0)+196>>2]|0)+(c[a+232>>2]<<6)+4|0;d=e+1|0;f=7}if((f|0)==7){a=c[(c[a>>2]|0)+(d<<2)>>2]|0;if(a)if((S((c[(c[a+16>>2]|0)+236>>2]|0)-e|0,b)|0)>0)g=a;else Aa(86139,86053,1029,86130);else g=0}return g|0}function Ph(b,d){b=b|0;d=d|0;if(!(a[(c[d+16>>2]|0)+156>>0]|0))b=(EC(b,d)|0)!=0;else b=0;return b&1|0}function Qh(b,d){b=b|0;d=d|0;var e=0,f=0;d=c[d+16>>2]|0;if(((a[d+156>>0]|0)==1?(c[d+176>>2]|0)==1:0)?(c[d+184>>2]|0)==1:0){d=c[d+180>>2]|0;while(1){d=c[d>>2]|0;e=c[d+16>>2]|0;if(!(a[e+112>>0]|0))break;else d=e+116|0}if(EC(b,d)|0)d=1;else f=7}else f=7;if((f|0)==7)d=0;return d|0}function Rh(b){b=b|0;var d=0,e=0,f=0;f=l;l=l+16|0;e=f;d=c[47194]|0;a:do if((d|0)!=0|(c[47223]|0)!=0){d=_O(b,d,0)|0;if(d|0){switch(a[d>>0]|0){case 0:break a;case 111:{if(!(f2(d,86341)|0)){$h(b,1);break a}break}case 105:{if(!(f2(d,99036)|0)){$h(b,0);break a}break}default:{}}c[e>>2]=d;dA(1,86345,e)|0;break}d=MD(b)|0;while(1){if(!d)break;if(!(Mj(d)|0))Rh(d);d=ND(d)|0}if(c[47223]|0)ai(b)}while(0);l=f;return}function Sh(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=d+16|0;e=c[k>>2]|0;j=b[e+236>>1]|0;while(1){if((j|0)>(b[e+238>>1]|0))break;else{f=0;i=0}while(1){g=c[e+196>>2]|0;h=c[g+(j<<6)>>2]|0;if((i|0)>=(h|0))break;g=c[(c[(c[g+(j<<6)+4>>2]|0)+(i<<2)>>2]|0)+16>>2]|0;a[g+158>>0]=0;a[g+157>>0]=0;c[g+284>>2]=i;if((f|0)==0&(c[g+192>>2]|0)>0){f=Zh(h,h)|0;e=c[k>>2]|0;c[(c[e+196>>2]|0)+(j<<6)+56>>2]=f;f=1}i=i+1|0}a:do if(f){i=0;f=h;while(1){if((i|0)>=(f|0))break a;h=c[(c[g+(j<<6)+4>>2]|0)+(i<<2)>>2]|0;if(!(a[(c[h+16>>2]|0)+157>>0]|0)){_h(d,h);e=c[k>>2]|0;f=c[e+196>>2]|0;g=f;f=c[f+(j<<6)>>2]|0}i=i+1|0}}while(0);j=j+1|0}return}function Th(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;t=d+16|0;e=c[t>>2]|0;if(a[e+240>>0]|0){h=0;s=b[e+236>>1]|0;f=0;a:while(1){r=(h|0)!=0;if((s|0)>(b[e+238>>1]|0))break;g=c[e+196>>2]|0;i=c[g+(s<<6)>>2]|0;if(!i)g=h;else{g=c[g+(s<<6)+4>>2]|0;p=c[(c[(c[g>>2]|0)+16>>2]|0)+236>>2]|0;e=0;while(1){h=e+1|0;if((e|0)>=(i|0))break;a[(c[(c[g+(e<<2)>>2]|0)+16>>2]|0)+157>>0]=0;e=h}e=h<<2;if(r)q=KK(f,e)|0;else q=IK(e)|0;m=0;n=0;while(1){e=c[t>>2]|0;g=c[e+196>>2]|0;h=c[g+(s<<6)>>2]|0;i=e+116|0;o=q+(m<<2)|0;if((h|0)<=(n|0))break;j=c[(c[g+(s<<6)+4>>2]|0)+(((c[i>>2]&1|0)==0?h+~n|0:n)<<2)>>2]|0;l=j+16|0;e=0;k=0;while(1){i=c[l>>2]|0;if((e|0)>=(c[i+200>>2]|0)){g=0;h=0;e=i;break}i=((Vh(d,c[(c[i+196>>2]|0)+(e<<2)>>2]|0)|0)!=0&1)+k|0;e=e+1|0;k=i}while(1){if((h|0)>=(c[e+192>>2]|0))break;i=((Vh(d,c[(c[e+188>>2]|0)+(h<<2)>>2]|0)|0)!=0&1)+g|0;g=i;h=h+1|0;e=c[l>>2]|0}if(g|k)if((k|0)==0&(a[e+157>>0]|0)==0)e=(Wh(d,j,o,s)|0)+m|0;else e=m;else{c[o>>2]=j;e=m+1|0}m=e;n=n+1|0}b:do if(m){c:do if(!(c[i>>2]&1)){g=q;e=o;while(1){e=e+-4|0;if(g>>>0>=e>>>0){h=0;break c}o=c[g>>2]|0;c[g>>2]=c[e>>2];c[e>>2]=o;g=g+4|0}}else h=0;while(0);while(1){e=c[t>>2]|0;i=c[e+196>>2]|0;g=c[i+(s<<6)>>2]|0;if((h|0)>=(g|0)){m=0;h=i;break}o=c[q+(h<<2)>>2]|0;c[(c[i+(s<<6)+4>>2]|0)+(h<<2)>>2]=o;c[(c[o+16>>2]|0)+236>>2]=h+p;h=h+1|0}while(1){if((m|0)>=(g|0))break b;l=(c[(c[h+(s<<6)+4>>2]|0)+(m<<2)>>2]|0)+16|0;i=c[(c[l>>2]|0)+188>>2]|0;if(i){k=0;g=i;while(1){h=c[g+(k<<2)>>2]|0;e=c[t>>2]|0;if(!h)break;j=c[h>>2]&3;i=c[(c[(c[((j|0)==2?h:h+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0;j=c[(c[(c[((j|0)==3?h:h+48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0;if(!(c[e+116>>2]&1))if((i|0)<(j|0))u=35;else e=k;else if((i|0)>(j|0))u=35;else e=k;if((u|0)==35){u=0;if(Vh(d,h)|0){u=36;break a}rh(h);Xh(d,h);e=k+-1|0;g=c[(c[l>>2]|0)+188>>2]|0}k=e+1|0}g=c[e+196>>2]|0;h=g;g=c[g+(s<<6)>>2]|0}m=m+1|0}}while(0);a[(c[(c[(c[46783]|0)+16>>2]|0)+196>>2]|0)+(s<<6)+49>>0]=0;g=q;f=q}h=g;s=s+1|0}if((u|0)==36)Aa(86187,86053,1561,86226);if(r)l6(f)}return}function Uh(a){a=a|0;var d=0,e=0;e=a+16|0;a=c[e>>2]|0;a:do if(c[a+268>>2]|0){d=b[a+236>>1]|0;while(1){if((d|0)>(b[a+238>>1]|0))break a;c[(c[a+268>>2]|0)+(d<<2)>>2]=c[c[(c[a+196>>2]|0)+(d<<6)+4>>2]>>2];d=d+1|0;a=c[e>>2]|0}}while(0);return}function Vh(a,b){a=a|0;b=b|0;if((c[(c[b+16>>2]|0)+156>>2]|0)!=0?(Yh(a,c[((c[b>>2]&3|0)==3?b:b+48|0)+40>>2]|0)|0)!=0:0)a=(Yh(a,c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)|0)!=0&1;else a=0;return a|0}function Wh(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;l=d+16|0;g=c[l>>2]|0;a[g+157>>0]=1;a:do if((c[g+192>>2]|0)>0){h=0;j=0;while(1){i=c[(c[g+188>>2]|0)+(j<<2)>>2]|0;if(!i)break a;if((Vh(b,i)|0)!=0?(k=c[((c[i>>2]&3|0)==2?i:i+-48|0)+40>>2]|0,(a[(c[k+16>>2]|0)+157>>0]|0)==0):0)h=(Wh(b,k,e+(h<<2)|0,f)|0)+h|0;j=j+1|0;g=c[l>>2]|0}}else h=0;while(0);if((c[g+232>>2]|0)==(f|0)){c[e+(h<<2)>>2]=d;return h+1|0}else Aa(86239,86053,1490,86255);return 0}function Xh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=c[d>>2]&3;i=c[((h|0)==2?d:d+-48|0)+40>>2]|0;f=c[(c[i+16>>2]|0)+188>>2]|0;l=d+48|0;a:do if(!f)m=14;else{g=((h|0)==3?d:l)+40|0;e=0;while(1){j=c[f+(e<<2)>>2]|0;if(!j){m=14;break a}if((c[((c[j>>2]&3|0)==2?j:j+-48|0)+40>>2]|0)==(c[g>>2]|0))break;else e=e+1|0}sh(d,j);e=(c[d+16>>2]|0)+172|0;if(!(c[e>>2]|0))c[e>>2]=j;e=c[j+16>>2]|0;if((a[e+112>>0]|0)==4?(k=e+116|0,(c[k>>2]|0)==0):0)c[k>>2]=d;b=c[(c[((c[d>>2]&3|0)==3?d:l)+40>>2]|0)+16>>2]|0;e=c[b+204>>2]|0;b=(c[b+208>>2]<<2)+8|0;if(!e)e=IK(b)|0;else e=KK(e,b)|0;c[(c[(c[((c[d>>2]&3|0)==3?d:l)+40>>2]|0)+16>>2]|0)+204>>2]=e;i=c[(c[((c[d>>2]&3|0)==3?d:l)+40>>2]|0)+16>>2]|0;j=c[i+204>>2]|0;i=i+208|0;k=c[i>>2]|0;c[i>>2]=k+1;c[j+(k<<2)>>2]=d;l=c[(c[((c[d>>2]&3|0)==3?d:l)+40>>2]|0)+16>>2]|0;c[(c[l+204>>2]|0)+(c[l+208>>2]<<2)>>2]=0}while(0);if((m|0)==14){m=jh(i,c[((h|0)==3?d:l)+40>>2]|0,d)|0;d=c[d+16>>2]|0;l=c[m+16>>2]|0;a[l+112>>0]=(a[d+112>>0]|0)==4?4:3;c[l+96>>2]=c[d+96>>2];qh(b,m)}return}function Yh(a,b){a=a|0;b=b|0;var c=0;c=Ph(a,b)|0;return Qh(a,b)|0|c|0}function Zh(a,b){a=a|0;b=b|0;var d=0;d=HK(12)|0;c[d>>2]=a;c[d+4>>2]=b;c[d+8>>2]=HK(S(b,a)|0)|0;return d|0}function _h(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;o=d+16|0;l=c[o>>2]|0;k=c[(c[(c[b+16>>2]|0)+196>>2]|0)+(c[l+232>>2]<<6)+56>>2]|0;a[l+157>>0]=1;a[l+158>>0]=1;l=(c[(c[(dg(b)|0)+16>>2]|0)+180>>2]|0)>0;e=c[o>>2]|0;f=c[e+188>>2]|0;a:do if(f){m=k+4|0;n=k+8|0;d=0;b:while(1){j=c[f+(d<<2)>>2]|0;if(!j){p=e;break a}g=j+-48|0;e=j+48|0;if(l){if((EC(b,c[((c[j>>2]&3|0)==3?j:e)+40>>2]|0)|0)!=0?(EC(b,c[((c[j>>2]&3|0)==2?j:g)+40>>2]|0)|0)!=0:0)q=7}else q=7;do if((q|0)==7){q=0;h=j+16|0;if(c[(c[h>>2]|0)+156>>2]|0){s=c[j>>2]&3;r=c[(c[((s|0)==2?j:g)+40>>2]|0)+16>>2]|0;i=c[r+284>>2]|0;f=(i|0)<(c[k>>2]|0);e=((s|0)==3?j:e)+40|0;if((a[r+158>>0]|0)==1){if(!f){q=10;break b}e=c[(c[(c[e>>2]|0)+16>>2]|0)+284>>2]|0;f=c[m>>2]|0;if((e|0)>=(f|0)){q=12;break b}a[(c[n>>2]|0)+((S(f,i)|0)+e)>>0]=1;rh(j);d=d+-1|0;if((a[(c[h>>2]|0)+112>>0]|0)==4)break;Xh(b,j);break}else{if(!f){q=16;break b}e=c[(c[(c[e>>2]|0)+16>>2]|0)+284>>2]|0;f=c[m>>2]|0;if((e|0)>=(f|0)){q=18;break b}a[(c[n>>2]|0)+((S(f,e)|0)+i)>>0]=1;e=c[((c[j>>2]&3|0)==2?j:g)+40>>2]|0;if(a[(c[e+16>>2]|0)+157>>0]|0)break;_h(b,e);break}}}while(0);f=c[o>>2]|0;d=d+1|0;e=f;f=c[f+188>>2]|0}if((q|0)==10)Aa(86265,86053,1251,86297);else if((q|0)==12)Aa(86309,86053,1252,86297);else if((q|0)==16)Aa(86265,86053,1260,86297);else if((q|0)==18)Aa(86309,86053,1261,86297)}else p=e;while(0);a[p+158>>0]=0;return}function $h(a,b){a=a|0;b=b|0;var c=0;c=gC(a)|0;while(1){if(!c)break;bi(a,c,b);c=hC(a,c)|0}return}function ai(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;g=l;l=l+16|0;f=g;d=gC(b)|0;while(1){if(!d)break;e=_O(d,c[47223]|0,0)|0;a:do if(e|0){switch(a[e>>0]|0){case 0:break a;case 111:{if(!(f2(e,86341)|0)){bi(b,d,1);break a}break}case 105:{if(!(f2(e,99036)|0)){bi(b,d,0);break a}break}default:{}}h=HB(d)|0;c[f>>2]=e;c[f+4>>2]=h;dA(1,86376,f)|0}while(0);d=hC(b,d)|0}l=g;return}function bi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;j=c[46782]|0;h=d+16|0;f=c[h>>2]|0;a:do if(!(c[f+212>>2]|0)){i=(e|0)!=0;b:do if(i){g=0;d=0;e=f;while(1){f=c[(c[e+180>>2]|0)+(g<<2)>>2]|0;if(!f)break b;if(!(ci(f)|0)){c[j+(d<<2)>>2]=f;d=d+1|0;e=c[h>>2]|0}g=g+1|0}}else{g=0;d=0;e=f;while(1){f=c[(c[e+172>>2]|0)+(g<<2)>>2]|0;if(!f)break b;if(!(ci(f)|0)){c[j+(d<<2)>>2]=f;d=d+1|0;e=c[h>>2]|0}g=g+1|0}}while(0);if((d|0)>=2){c[j+(d<<2)>>2]=0;k3(j,d,4,61);h=i?2:3;g=i?-1:1;f=1;while(1){d=c[j+(f<<2)>>2]|0;if(!d)break a;e=c[j+(f+-1<<2)>>2]|0;e=c[((c[e>>2]&3|0)==(h|0)?e:e+(g*48|0)|0)+40>>2]|0;d=c[((c[d>>2]&3|0)==(h|0)?d:d+(g*48|0)|0)+40>>2]|0;if(ch(e,d)|0)break a;i=jh(e,d,0)|0;a[(c[i+16>>2]|0)+112>>0]=4;qh(b,i);f=f+1|0}}}while(0);return}function ci(a){a=a|0;var b=0;while(1){b=c[(c[a+16>>2]|0)+116>>2]|0;if(!b)break;else a=b}b=c[a>>2]&3;return (c[(c[(c[((b|0)==3?a:a+48|0)+40>>2]|0)+16>>2]|0)+212>>2]|0)!=(c[(c[(c[((b|0)==2?a:a+-48|0)+40>>2]|0)+16>>2]|0)+212>>2]|0)|0}function di(a,b){a=a|0;b=b|0;return ((c[c[a>>2]>>2]|0)>>>4)-((c[c[b>>2]>>2]|0)>>>4)|0}function ei(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;g=c[a+16>>2]|0;h=g+220|0;i=c[h>>2]|0;if((i|0)>=2){f=c[g+216>>2]|0;a=0;e=0;while(1){if((e|0)==(i|0))break;d=c[f+(e<<2)>>2]|0;if(a|0)c[(c[a+16>>2]|0)+164>>2]=d;j=c[d+16>>2]|0;c[j+168>>2]=a;a=d;d=j;while(1){d=c[d+164>>2]|0;if(!d)break;a=d;d=c[d+16>>2]|0}e=e+1|0}c[h>>2]=1;c[g+192>>2]=c[f>>2];b[g+236>>1]=c[46784];b[g+238>>1]=c[46785]}return}function fi(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;i=c[46783]|0;j=i+16|0;f=c[j>>2]|0;g=0;h=b[f+236>>1]|0;while(1){if((h|0)>=(b[f+238>>1]|0))break;d=c[f+196>>2]|0;if(!(a[d+(h<<6)+49>>0]|0)){e=yi(i,h)|0;d=c[j>>2]|0;f=c[d+196>>2]|0;c[f+(h<<6)+52>>2]=e;a[f+(h<<6)+49>>0]=1}else{e=c[d+(h<<6)+52>>2]|0;d=f}g=e+g|0;h=h+1|0;f=d}return g|0}function gi(a){a=a|0;var d=0,e=0,f=0,g=0,i=0,j=0;a=c[a+16>>2]|0;g=b[a+238>>1]|0;i=a+196|0;a=b[a+236>>1]|0;while(1){if((a|0)>(g|0))break;f=c[i>>2]|0;e=c[f+(a<<6)>>2]|0;f=f+(a<<6)+4|0;d=0;while(1){if((d|0)>=(e|0))break;j=c[(c[(c[f>>2]|0)+(d<<2)>>2]|0)+16>>2]|0;h[j+16>>3]=+(c[j+236>>2]|0);d=d+1|0}a=a+1|0}return}function hi(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+16|0;m=r;n=d+16|0;o=TO(c[(c[n>>2]|0)+232>>2]|0)|0;j=c[n>>2]|0;f=j+192|0;g=f;while(1){g=c[g>>2]|0;if(!g)break;g=c[g+16>>2]|0;a[g+157>>0]=0;g=g+164|0}h=b[j+238>>1]|0;i=j+196|0;g=b[j+236>>1]|0;while(1){if((g|0)>(h|0))break;c[(c[i>>2]|0)+(g<<6)>>2]=0;g=g+1|0}i=(e|0)==0;while(1){g=c[f>>2]|0;if(!g)break;h=g+16|0;f=c[h>>2]|0;if((c[c[(i?f+172|0:f+180|0)>>2]>>2]|0)==0?(k=f+157|0,(a[k>>0]|0)==0):0){a[k>>0]=1;VO(o,g);while(1){f=WO(o)|0;if(!f)break;if((a[(c[f+16>>2]|0)+159>>0]|0)==7){fl(d,f,e,o);continue}else{wi(d,f);xi(o,f,e);continue}}f=c[h>>2]|0}f=f+164|0}if(WO(o)|0)dA(1,86584,m)|0;f=c[n>>2]|0;j=b[f+236>>1]|0;while(1){if((j|0)>(b[f+238>>1]|0))break;a[(c[(c[(c[46783]|0)+16>>2]|0)+196>>2]|0)+(j<<6)+49>>0]=0;if((c[f+116>>2]&1|0)!=0?(p=c[f+196>>2]|0,q=c[p+(j<<6)>>2]|0,(q|0)>0):0){g=c[p+(j<<6)+4>>2]|0;h=q+-1|0;i=(h|0)/2|0;f=0;while(1){if((f|0)>(i|0))break;qi(c[g+(f<<2)>>2]|0,c[g+(h-f<<2)>>2]|0);f=f+1|0}f=c[n>>2]|0}j=j+1|0}if((dg(d)|0)==(d|0)?(fi(0)|0)>0:0)ki(d,0);UO(o);l=r;return}function ii(d){d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;n=d+16|0;d=c[n>>2]|0;f=b[d+236>>1]|0;e=b[d+238>>1]|0;l=e<<16>>16;m=d+196|0;g=f;while(1){if((g|0)>(l|0))break;k=c[m>>2]|0;j=c[k+(g<<6)>>2]|0;k=k+(g<<6)+4|0;i=0;while(1){if((i|0)>=(j|0))break;o=c[(c[(c[k>>2]|0)+(i<<2)>>2]|0)+16>>2]|0;c[o+236>>2]=~~+h[o+16>>3];i=i+1|0}g=g+1|0}while(1){if((f|0)>(e<<16>>16|0))break;a[(c[(c[(c[46783]|0)+16>>2]|0)+196>>2]|0)+(f<<6)+49>>0]=0;o=c[d+196>>2]|0;k3(c[o+(f<<6)+4>>2]|0,c[o+(f<<6)>>2]|0,4,62);o=c[n>>2]|0;f=f+1|0;e=b[o+238>>1]|0;d=o}return}function ji(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;l=((d|0)%4|0|0)<2&1;f=c[a+16>>2]|0;i=b[f+238>>1]|0;j=i<<16>>16;f=b[f+236>>1]|0;g=f<<16>>16;h=c[(c[46783]|0)+16>>2]|0;if(!(d&1)){k=1;e=j;d=(f<<16>>16<=(b[h+236>>1]|0)&1)+g|0}else{k=-1;e=g;d=((i<<16>>16>=(b[h+238>>1]|0))<<31>>31)+j|0}e=k+e|0;while(1){if((d|0)==(e|0))break;ti(a,d,l,(si(a,d,d-k|0)|0)&255);d=d+k|0}ki(a,l^1);return}function ki(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=d+16|0;g=c[k>>2]|0;i=b[g+236>>1]|0;j=b[g+238>>1]|0;h=g+196|0;f=i<<16>>16;while(1){if((f|0)>(j|0)){h=i;break}a[(c[h>>2]|0)+(f<<6)+48>>0]=1;f=f+1|0}while(1){f=0;h=h<<16>>16;while(1){if((h|0)>(b[g+238>>1]|0))break;if(a[(c[g+196>>2]|0)+(h<<6)+48>>0]|0){f=(ri(d,h,e)|0)+f|0;g=c[k>>2]|0}h=h+1|0}if((f|0)<=0)break;h=b[g+236>>1]|0}return}function li(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;o=d+16|0;e=c[o>>2]|0;n=b[e+238>>1]|0;a:while(1){if((n|0)<(b[e+236>>1]|0)){e=16;break}f=c[e+196>>2]|0;a[f+(n<<6)+48>>0]=0;p=(n|0)>0;q=n+1|0;g=0;b:while(1){l=(c[f+(n<<6)>>2]|0)+-1|0;m=f+(n<<6)+4|0;k=f+(q<<6)|0;while(1){if((g|0)>=(l|0))break b;j=c[m>>2]|0;i=c[j+(g<<2)>>2]|0;g=g+1|0;j=c[j+(g<<2)>>2]|0;if((c[(c[i+16>>2]|0)+236>>2]|0)>=(c[(c[j+16>>2]|0)+236>>2]|0)){e=7;break a}if(mi(d,i,j)|0)continue;if(p){f=ni(i,j)|0;h=ni(j,i)|0}else{f=0;h=0}if((c[k>>2]|0)>0){f=(oi(i,j)|0)+f|0;h=(oi(j,i)|0)+h|0}if((h|0)<=(f|0))break}pi(d,n,i,j);e=c[o>>2]|0;f=c[e+196>>2]|0}n=n+-1|0}if((e|0)==7)Aa(86535,86053,721,86561);else if((e|0)==16)return}function mi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;j=c[d+16>>2]|0;i=c[j+212>>2]|0;f=c[e+16>>2]|0;g=c[f+212>>2]|0;h=(i|0)!=(g|0);do if(!(a[194049]|0))if((g|0)==0|((i|0)==0|h^1))k=9;else{if((a[j+159>>0]|0)==7?(a[j+156>>0]|0)==1:0){b=0;break}if((a[f+159>>0]|0)==7?(a[f+156>>0]|0)==1:0){b=0;break}b=1}else if(h)b=1;else k=9;while(0);if((k|0)==9){f=c[b+16>>2]|0;b=c[(c[f+196>>2]|0)+(c[j+232>>2]<<6)+56>>2]|0;if(!b)b=0;else{j=(c[f+116>>2]&1|0)==0;k=S(c[b+4>>2]|0,c[(c[(j?d:e)+16>>2]|0)+284>>2]|0)|0;b=a[(c[b+8>>2]|0)+((c[(c[(j?e:d)+16>>2]|0)+284>>2]|0)+k)>>0]|0}}return b|0}function ni(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0;l=a+16|0;j=c[(c[d+16>>2]|0)+172>>2]|0;d=0;while(1){a=c[j>>2]|0;if(!a)break;i=c[a+16>>2]|0;k=b[i+154>>1]|0;g=c[(c[(c[((c[a>>2]&3|0)==3?a:a+48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0;i=i+16|0;f=c[(c[l>>2]|0)+172>>2]|0;a=d;while(1){d=c[f>>2]|0;if(!d)break;e=(c[(c[(c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0)-g|0;d=d+16|0;if((e|0)<=0){if((e|0)==0?(m=c[d>>2]|0,+h[m+16>>3]>+h[i>>3]):0){d=m;n=9}}else{d=c[d>>2]|0;n=9}if((n|0)==9){n=0;a=(S(b[d+154>>1]|0,k)|0)+a|0}f=f+4|0}j=j+4|0;d=a}return d|0}function oi(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0;l=a+16|0;j=c[(c[d+16>>2]|0)+180>>2]|0;d=0;while(1){a=c[j>>2]|0;if(!a)break;i=c[a+16>>2]|0;k=b[i+154>>1]|0;g=c[(c[(c[((c[a>>2]&3|0)==2?a:a+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0;i=i+56|0;f=c[(c[l>>2]|0)+180>>2]|0;a=d;while(1){d=c[f>>2]|0;if(!d)break;e=(c[(c[(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0)-g|0;d=d+16|0;if((e|0)<=0){if((e|0)==0?(m=c[d>>2]|0,+h[m+56>>3]>+h[i>>3]):0){d=m;n=9}}else{d=c[d>>2]|0;n=9}if((n|0)==9){n=0;a=(S(b[d+154>>1]|0,k)|0)+a|0}f=f+4|0}j=j+4|0;d=a}return d|0}function pi(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;i=a[(c[e+16>>2]|0)+156>>0]|0;if(i<<24>>24!=(a[(c[f+16>>2]|0)+156>>0]|0)){j=b+16|0;l=c[(c[j>>2]|0)+196>>2]|0;k=c[l+(d<<6)>>2]|0;l=l+(d<<6)+4|0;b=0;g=0;h=0;while(1){if((b|0)>=(k|0))break;o=(a[(c[(c[(c[l>>2]|0)+(b<<2)>>2]|0)+16>>2]|0)+156>>0]|0)==0;b=b+1|0;g=(o&1)+g|0;h=((o^1)&1)+h|0}i=i<<24>>24==0;h=(g|0)<(h|0)?(i?e:f):i?f:e;i=0;b=0;while(1){if((b|0)>=(k|0))break;i=(c[(c[l>>2]|0)+(b<<2)>>2]|0)==(h|0)?b:i;b=b+1|0}o=(a[(c[h+16>>2]|0)+156>>0]|0)==0&1;n=0;g=i;while(1){b=g+-1|0;if((g|0)<=0){m=0;b=i;break}if((a[(c[(c[(c[l>>2]|0)+(b<<2)>>2]|0)+16>>2]|0)+156>>0]|0)!=(o|0)){m=0;b=i;break}n=n+1|0;g=b}while(1){b=b+1|0;if((b|0)>=(k|0))break;if((a[(c[(c[(c[l>>2]|0)+(b<<2)>>2]|0)+16>>2]|0)+156>>0]|0)!=(o|0))break;m=m+1|0}qi(e,f);j=c[(c[j>>2]|0)+196>>2]|0;k=c[j+(d<<6)>>2]|0;j=j+(d<<6)+4|0;b=0;while(1){if((b|0)>=(k|0)){h=0;g=i;break}i=(c[(c[j>>2]|0)+(b<<2)>>2]|0)==(h|0)?b:i;b=b+1|0}while(1){b=g+-1|0;if((g|0)<=0){g=0;b=i;break}if((a[(c[(c[(c[j>>2]|0)+(b<<2)>>2]|0)+16>>2]|0)+156>>0]|0)!=(o|0)){g=0;b=i;break}h=h+1|0;g=b}while(1){b=b+1|0;if((b|0)>=(k|0))break;if((a[(c[(c[(c[j>>2]|0)+(b<<2)>>2]|0)+16>>2]|0)+156>>0]|0)!=(o|0))break;g=g+1|0}d=h-g|0;o=n-m|0;if((((d|0)>-1?d:0-d|0)|0)>(((o|0)>-1?o:0-o|0)|0))qi(e,f)}return}function qi(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;f=c[a+16>>2]|0;e=c[f+232>>2]|0;f=f+236|0;d=c[f>>2]|0;g=b+16|0;h=c[(c[g>>2]|0)+236>>2]|0;c[f>>2]=h;f=(c[46783]|0)+16|0;c[(c[(c[(c[f>>2]|0)+196>>2]|0)+(e<<6)+4>>2]|0)+(h<<2)>>2]=a;c[(c[g>>2]|0)+236>>2]=d;c[(c[(c[(c[f>>2]|0)+196>>2]|0)+(e<<6)+4>>2]|0)+(d<<2)>>2]=b;return}function ri(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;q=d+16|0;n=c[(c[q>>2]|0)+196>>2]|0;a[n+(e<<6)+48>>0]=0;r=(e|0)>0;s=e+1|0;o=(f|0)!=0;p=e+-1|0;g=0;i=0;f=n;a:while(1){l=(c[f+(e<<6)>>2]|0)+-1|0;m=f+(e<<6)+4|0;h=f+(s<<6)|0;n=g;while(1){if((n|0)>=(l|0)){f=17;break a}k=c[m>>2]|0;j=c[k+(n<<2)>>2]|0;n=n+1|0;k=c[k+(n<<2)>>2]|0;if((c[(c[j+16>>2]|0)+236>>2]|0)>=(c[(c[k+16>>2]|0)+236>>2]|0)){f=5;break a}if(mi(d,j,k)|0)continue;if(r){f=ni(j,k)|0;g=ni(k,j)|0}else{f=0;g=0}if((c[h>>2]|0)>0){f=(oi(j,k)|0)+f|0;g=(oi(k,j)|0)+g|0}if((f|0)>(g|0))break;if((f|0)==(g|0)&(o&(f|0)>0)){f=g;break}}qi(j,k);i=f-g+i|0;g=c[(c[(c[46783]|0)+16>>2]|0)+196>>2]|0;a[g+(e<<6)+49>>0]=0;h=c[q>>2]|0;f=c[h+196>>2]|0;a[f+(e<<6)+48>>0]=1;if((b[h+236>>1]|0)<(e|0)){a[g+(p<<6)+49>>0]=0;a[f+(p<<6)+48>>0]=1}if((b[h+238>>1]|0)<=(e|0)){g=n;continue}a[g+(s<<6)+49>>0]=0;a[f+(s<<6)+48>>0]=1;g=n}if((f|0)==5)Aa(86535,86053,770,86569);else if((f|0)==17)return i|0;return 0}function si(a,e,f){a=a|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;p=c[46781]|0;q=a+16|0;a=c[(c[q>>2]|0)+196>>2]|0;r=c[a+(e<<6)+4>>2]|0;n=(f|0)>(e|0);o=p+4|0;m=0;while(1){f=c[a+(e<<6)>>2]|0;if((m|0)>=(f|0)){a=0;i=0;break}l=(c[r+(m<<2)>>2]|0)+16|0;k=c[l>>2]|0;a:do if(n){j=c[k+180>>2]|0;a=0;i=0;while(1){f=c[j+(i<<2)>>2]|0;if(!f)break a;g=c[f+16>>2]|0;if((b[g+154>>1]|0)>0){c[p+(a<<2)>>2]=d[g+88>>0]|c[(c[(c[((c[f>>2]&3|0)==2?f:f+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]<<8;a=a+1|0}i=i+1|0}}else{j=c[k+172>>2]|0;i=0;a=0;while(1){f=c[j+(i<<2)>>2]|0;if(!f)break a;g=c[f+16>>2]|0;if((b[g+154>>1]|0)>0){c[p+(a<<2)>>2]=d[g+48>>0]|c[(c[(c[((c[f>>2]&3|0)==3?f:f+48|0)+40>>2]|0)+16>>2]|0)+236>>2]<<8;a=a+1|0}i=i+1|0}}while(0);b:do switch(a|0){case 0:{h[k+240>>3]=-1.0;break}case 1:{h[k+240>>3]=+(c[p>>2]|0);break}case 2:{h[k+240>>3]=+(((c[o>>2]|0)+(c[p>>2]|0)|0)/2|0|0);break}default:{k3(p,a,4,60);f=(a|0)/2|0;j=c[p+(f<<2)>>2]|0;i=(c[l>>2]|0)+240|0;if(a&1|0){h[i>>3]=+(j|0);break b}g=(c[p+(a+-1<<2)>>2]|0)-j|0;a=c[p+(f+-1<<2)>>2]|0;f=a-(c[p>>2]|0)|0;if((f|0)==(g|0)){h[i>>3]=+((a+j|0)/2|0|0);break b}else{h[i>>3]=+(((S(f,j)|0)+(S(a,g)|0)|0)/(f+g|0)|0|0);break b}}}while(0);m=m+1|0;a=c[(c[q>>2]|0)+196>>2]|0}while(1){if((i|0)>=(f|0))break;g=c[r+(i<<2)>>2]|0;p=c[g+16>>2]|0;if((c[p+184>>2]|0)==0?(c[p+176>>2]|0)==0:0){a=(ui(g)|0|a&255)&255;f=c[(c[(c[q>>2]|0)+196>>2]|0)+(e<<6)>>2]|0}i=i+1|0}return a|0}function ti(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;m=c[(c[b+16>>2]|0)+196>>2]|0;q=c[m+(d<<6)+4>>2]|0;m=c[m+(d<<6)>>2]|0;o=(e|0)!=0;n=(f|e|0)==0;f=0;e=m;m=q+(m<<2)|0;while(1){l=e+-1|0;if((e|0)>0)e=q;else break;a:while(1){b:while(1){if(e>>>0>=m>>>0)break a;do{if(e>>>0>=m>>>0)break a;k=c[e>>2]|0;e=e+4|0}while(+h[(c[k+16>>2]|0)+240>>3]<0.0);g=0;while(1){if(e>>>0>=m>>>0)break a;i=c[e>>2]|0;if(!(g<<24>>24!=0?(c[(c[i+16>>2]|0)+212>>2]|0)!=0:0)){if(mi(b,k,i)|0)continue b;j=c[i+16>>2]|0;if(+h[j+240>>3]>=0.0)break;g=(c[j+212>>2]|0)==0?g:1}e=e+4|0}g=~~+h[(c[k+16>>2]|0)+240>>3];j=~~+h[(c[i+16>>2]|0)+240>>3];if((g|0)>(j|0)|o&(g|0)==(j|0))break}qi(k,i);f=f+1|0}e=l;m=n?m+-4|0:m}if(f|0?(p=c[(c[(c[46783]|0)+16>>2]|0)+196>>2]|0,a[p+(d<<6)+49>>0]=0,(d|0)>0):0)a[p+(d+-1<<6)+49>>0]=0;return}function ui(a){a=a|0;var b=0.0,d=0,e=0,f=0,g=0,i=0;a=c[a+16>>2]|0;i=a+240|0;if((c[a+200>>2]|0)>0){g=c[a+196>>2]|0;a=c[g>>2]|0;a=c[((c[a>>2]&3|0)==3?a:a+48|0)+40>>2]|0;d=1;while(1){e=c[g+(d<<2)>>2]|0;f=c[a+16>>2]|0;if(!e)break;e=c[((c[e>>2]&3|0)==3?e:e+48|0)+40>>2]|0;a=(c[(c[e+16>>2]|0)+236>>2]|0)>(c[f+236>>2]|0)?e:a;d=d+1|0}b=+h[f+240>>3];if(!(b>=0.0))a=1;else{h[i>>3]=b+1.0;a=0}}else if((c[a+192>>2]|0)>0){e=c[a+188>>2]|0;d=c[e>>2]|0;a=1;d=c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0;while(1){f=c[e+(a<<2)>>2]|0;g=c[d+16>>2]|0;if(!f)break;f=c[((c[f>>2]&3|0)==2?f:f+-48|0)+40>>2]|0;a=a+1|0;d=(c[(c[f+16>>2]|0)+236>>2]|0)<(c[g+236>>2]|0)?f:d}b=+h[g+240>>3];if(b>0.0){h[i>>3]=b+-1.0;a=0}else a=1}else a=1;return a|0}function vi(a,b){a=a|0;b=b|0;return (c[(c[(c[a>>2]|0)+16>>2]|0)+236>>2]|0)-(c[(c[(c[b>>2]|0)+16>>2]|0)+236>>2]|0)|0}function wi(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+96|0;o=p+64|0;n=p+48|0;h=p+24|0;f=p;j=d+16|0;k=c[(c[j>>2]|0)+232>>2]|0;m=a+16|0;e=c[(c[m>>2]|0)+196>>2]|0;i=c[e+(k<<6)>>2]|0;do if((c[e+(k<<6)+8>>2]|0)>=1){c[(c[e+(k<<6)+4>>2]|0)+(i<<2)>>2]=d;c[(c[j>>2]|0)+236>>2]=i;a=c[m>>2]|0;f=c[a+196>>2]|0;e=f+(k<<6)|0;g=c[e>>2]|0;c[e>>2]=g+1;if((g|0)>=(c[f+(k<<6)+8>>2]|0))Aa(86649,86053,1346,86685);g=c[(c[(c[(c[46783]|0)+16>>2]|0)+196>>2]|0)+(k<<6)+8>>2]|0;if((i|0)>(g|0)){m=HB(d)|0;n=c[(c[j>>2]|0)+236>>2]|0;o=c[(c[(c[(c[46783]|0)+16>>2]|0)+196>>2]|0)+(k<<6)+8>>2]|0;c[h>>2]=1359;c[h+4>>2]=m;c[h+8>>2]=n;c[h+12>>2]=k;c[h+16>>2]=o;dA(1,86701,h)|0;break}e=b[a+236>>1]|0;a=b[a+238>>1]|0;if((k|0)<(e|0)|(k|0)>(a|0)){c[n>>2]=1364;c[n+4>>2]=k;c[n+8>>2]=e;c[n+12>>2]=a;dA(1,86774,n)|0;break}if(((c[f+(k<<6)+4>>2]|0)+(i<<2)|0)>>>0>((c[f+(k<<6)+12>>2]|0)+(g<<2)|0)>>>0){i=HB(d)|0;n=c[(c[m>>2]|0)+196>>2]|0;m=(c[n+(k<<6)+4>>2]|0)+(c[(c[j>>2]|0)+236>>2]<<2)|0;n=(c[n+(k<<6)+12>>2]|0)+(c[(c[(c[(c[46783]|0)+16>>2]|0)+196>>2]|0)+(k<<6)+8>>2]<<2)|0;c[o>>2]=1370;c[o+4>>2]=k;c[o+8>>2]=i;c[o+12>>2]=m;c[o+16>>2]=k;c[o+20>>2]=k;c[o+24>>2]=n;dA(1,86835,o)|0}}else{n=HB(a)|0;o=HB(d)|0;c[f>>2]=1339;c[f+4>>2]=n;c[f+8>>2]=o;c[f+12>>2]=k;c[f+16>>2]=i;dA(1,86594,f)|0}while(0);l=p;return}function xi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=d+16|0;a:do if(!e){g=0;while(1){d=c[h>>2]|0;if((g|0)>=(c[d+184>>2]|0))break a;d=c[(c[d+180>>2]|0)+(g<<2)>>2]|0;e=d+-48|0;f=(c[(c[((c[d>>2]&3|0)==2?d:e)+40>>2]|0)+16>>2]|0)+157|0;if(!(a[f>>0]|0)){a[f>>0]=1;VO(b,c[((c[d>>2]&3|0)==2?d:e)+40>>2]|0)}g=g+1|0}}else{g=0;while(1){d=c[h>>2]|0;if((g|0)>=(c[d+176>>2]|0))break a;d=c[(c[d+172>>2]|0)+(g<<2)>>2]|0;e=d+48|0;f=(c[(c[((c[d>>2]&3|0)==3?d:e)+40>>2]|0)+16>>2]|0)+157|0;if(!(a[f>>0]|0)){a[f>>0]=1;VO(b,c[((c[d>>2]&3|0)==3?d:e)+40>>2]|0)}g=g+1|0}}while(0);return}function yi(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=l;l=l+16|0;t=u;g=d+16|0;f=c[(c[g>>2]|0)+196>>2]|0;r=c[f+(e<<6)+4>>2]|0;s=e+1|0;d=c[(c[(c[(c[46783]|0)+16>>2]|0)+196>>2]|0)+(s<<6)>>2]|0;if((c[46787]|0)>(d|0))d=c[46788]|0;else{f=d+1|0;c[46787]=f;d=c[46788]|0;f=f<<2;if(!d)d=IK(f)|0;else d=KK(d,f)|0;c[46788]=d;f=c[(c[g>>2]|0)+196>>2]|0}q=f+(s<<6)|0;g=0;while(1){if((g|0)>=(c[q>>2]|0))break;c[d+(g<<2)>>2]=0;g=g+1|0}p=f+(e<<6)|0;o=0;g=0;d=0;while(1){j=c[p>>2]|0;if((o|0)>=(j|0))break;n=c[(c[(c[r+(o<<2)>>2]|0)+16>>2]|0)+180>>2]|0;a:do if((g|0)>0){m=c[46788]|0;k=0;while(1){h=c[n+(k<<2)>>2]|0;if(!h)break a;j=h+16|0;i=c[(c[(c[((c[h>>2]&3|0)==2?h:h+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0;while(1){h=i+1|0;if((i|0)>=(g|0))break;i=h;d=(S(b[(c[j>>2]|0)+154>>1]|0,c[m+(h<<2)>>2]|0)|0)+d|0}k=k+1|0}}while(0);h=0;while(1){i=c[n+(h<<2)>>2]|0;if(!i)break;m=c[(c[(c[((c[i>>2]&3|0)==2?i:i+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0;k=(c[46788]|0)+(m<<2)|0;c[k>>2]=(c[k>>2]|0)+(b[(c[i+16>>2]|0)+154>>1]|0);g=(m|0)>(g|0)?m:g;h=h+1|0}o=o+1|0}i=f+(e<<6)+4|0;h=0;while(1){if((h|0)>=(j|0))break;g=c[(c[(c[i>>2]|0)+(h<<2)>>2]|0)+16>>2]|0;if(a[g+145>>0]|0){e=g+180|0;c[t>>2]=c[e>>2];c[t+4>>2]=c[e+4>>2];d=(zi(t,1)|0)+d|0}h=h+1|0}i=c[q>>2]|0;h=f+(s<<6)+4|0;g=0;while(1){if((g|0)>=(i|0))break;f=c[(c[(c[h>>2]|0)+(g<<2)>>2]|0)+16>>2]|0;if(a[f+145>>0]|0){s=f+172|0;c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];d=(zi(t,-1)|0)+d|0}g=g+1|0}l=u;return d|0}function zi(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0;n=(d|0)>0;l=c[a>>2]|0;d=0;a=0;a:while(1){m=c[l+(d<<2)>>2]|0;if(!m)break;d=d+1|0;k=m+16|0;if(n){j=m+-48|0;i=d;while(1){e=c[l+(i<<2)>>2]|0;if(!e)continue a;f=c[e+16>>2]|0;g=c[k>>2]|0;if(+((c[(c[(c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0)-(c[(c[(c[((c[m>>2]&3|0)==2?m:j)+40>>2]|0)+16>>2]|0)+236>>2]|0)|0)*(+h[f+16>>3]-+h[g+16>>3])<0.0)a=(S(b[f+154>>1]|0,b[g+154>>1]|0)|0)+a|0;i=i+1|0}}else{j=m+48|0;i=d;while(1){e=c[l+(i<<2)>>2]|0;if(!e)continue a;f=c[e+16>>2]|0;g=c[k>>2]|0;if(+((c[(c[(c[((c[e>>2]&3|0)==3?e:e+48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0)-(c[(c[(c[((c[m>>2]&3|0)==3?m:j)+40>>2]|0)+16>>2]|0)+236>>2]|0)|0)*(+h[f+56>>3]-+h[g+56>>3])<0.0)a=(S(b[f+154>>1]|0,b[g+154>>1]|0)|0)+a|0;i=i+1|0}}}return a|0}function Ai(a){a=a|0;var b=0.0,d=0.0;c[46786]=8;c[47183]=24;h[23234]=.995;a=NA(a,86957)|0;if(a|0?(b=+a6(a),b>0.0):0){d=b*+(c[46786]|0);c[46786]=~~(d<=1.0?1.0:d);b=b*+(c[47183]|0);c[47183]=~~(b<=1.0?1.0:b)}return}function Bi(a){a=a|0;var d=0,e=0;e=(b[(c[a+16>>2]|0)+238>>1]|0)+2|0;d=HK(e<<2)|0;Di(a,d,e,0)|0;l6(d);return}function Ci(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=a+16|0;i=HK((b[(c[h>>2]|0)+238>>1]<<2)+8|0)|0;g=gC(a)|0;while(1){if(!g)break;f=i+(c[(c[g+16>>2]|0)+232>>2]<<2)|0;c[f>>2]=(c[f>>2]|0)+1;f=UA(a,g)|0;while(1){if(!f)break;j=c[f>>2]&3;d=c[(c[(c[((j|0)==3?f:f+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0;j=c[(c[(c[((j|0)==2?f:f+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0;k=(d|0)>(j|0);e=k?d:j;d=k?j:d;while(1){d=d+1|0;if((d|0)>=(e|0))break;k=i+(d<<2)|0;c[k>>2]=(c[k>>2]|0)+1}f=WA(a,f)|0}g=hC(a,g)|0}f=HK((b[(c[h>>2]|0)+238>>1]<<6)+128|0)|0;e=c[h>>2]|0;c[e+196>>2]=f;d=b[e+236>>1]|0;while(1){if((d|0)>(b[e+238>>1]|0))break;j=i+(d<<2)|0;e=c[j>>2]|0;c[f+(d<<6)>>2]=e;c[f+(d<<6)+8>>2]=e;j=HK((c[j>>2]<<2)+4|0)|0;e=c[h>>2]|0;k=c[e+196>>2]|0;c[k+(d<<6)+4>>2]=j;c[k+(d<<6)+12>>2]=j;d=d+1|0;f=k}l6(i);return}function Di(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0;m=a+16|0;i=1;while(1){g=c[m>>2]|0;if((i|0)>(c[g+180>>2]|0))break;l=Di(c[(c[g+184>>2]|0)+(i<<2)>>2]|0,d,e,f)|0;i=i+1|0;f=l}a:do if((dg(a)|0)!=(a|0)){u6(d|0,0,e<<2|0)|0;g=gC(a)|0;while(1){if(!g)break;k=g+16|0;c[d+(c[(c[k>>2]|0)+232>>2]<<2)>>2]=1;i=UA(a,g)|0;while(1){if(!i)break;l=i+-48|0;j=c[(c[k>>2]|0)+232>>2]|0;while(1){e=j+1|0;if((j|0)>=(c[(c[(c[((c[i>>2]&3|0)==2?i:l)+40>>2]|0)+16>>2]|0)+232>>2]|0))break;c[d+(e<<2)>>2]=1;j=e}i=WA(a,i)|0}g=hC(a,g)|0}g=c[m>>2]|0;i=b[g+236>>1]|0;while(1){if((i|0)>(b[g+238>>1]|0))break a;if(!(c[d+(i<<2)>>2]|0)){if(!f)f=LD(dg(a)|0,86947,1)|0;g=qC(f,0,1)|0;RC(g,137750,304,1)|0;l=g+16|0;j=c[l>>2]|0;c[j+232>>2]=i;h[j+96>>3]=.5;h[j+88>>3]=.5;h[j+80>>3]=1.0;c[j+216>>2]=1;c[j+176>>2]=0;j=HK(20)|0;k=c[l>>2]|0;c[k+172>>2]=j;c[k+184>>2]=0;k=HK(20)|0;c[(c[l>>2]|0)+180>>2]=k;lC(a,g,1)|0;g=c[m>>2]|0}i=i+1|0}}while(0);return f|0}function Ei(a){a=a|0;var b=0,d=0;Uh(a);b=a+16|0;a=1;while(1){d=c[b>>2]|0;if((a|0)>(c[d+180>>2]|0))break;Ei(c[(c[d+184>>2]|0)+(a<<2)>>2]|0);a=a+1|0}return}function Fi(a){a=a|0;var b=0,d=0;b=c[a>>2]&3;d=Gi(c[((b|0)==3?a:a+48|0)+40>>2]|0)|0;b=c[17348+(d*12|0)+((Gi(c[((b|0)==2?a:a+-48|0)+40>>2]|0)|0)<<2)>>2]|0;a=(c[a+16>>2]|0)+156|0;c[a>>2]=S(c[a>>2]|0,b)|0;return}function Gi(b){b=b|0;b=c[b+16>>2]|0;if((a[b+156>>0]|0)==1)b=2;else b=(a[b+160>>0]|0)<2&1;return b|0}function Hi(b,d){b=b|0;d=d|0;if(c[(c[b+16>>2]|0)+192>>2]|0){gl(b);Ii(b);if(a[195236]|0)ul(b);Ji(b);if(Ml(b)|0)Ii(b);Ki(b);if(sL(b,2,Li(b)|0)|0?(Mi(b),sL(b,2,Li(b)|0)|0):0)Aa(86965,86993,134,87004);Ni(b);Oi(b,d);Pi(b)}return}function Ii(d){d=d|0;var e=0,f=0,g=0,i=0,j=0.0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0;v=d+16|0;e=c[v>>2]|0;w=c[e+196>>2]|0;t=b[e+236>>1]|0;while(1){if((t|0)>(b[e+238>>1]|0))break;n=w+(t<<6)|0;o=w+(t<<6)+4|0;p=w+(t<<6)+40|0;q=w+(t<<6)+24|0;r=w+(t<<6)+32|0;s=w+(t<<6)+16|0;m=0;while(1){if((m|0)>=(c[n>>2]|0))break;l=(c[(c[o>>2]|0)+(m<<2)>>2]|0)+16|0;e=c[l>>2]|0;j=+h[e+80>>3]*.5;i=c[e+204>>2]|0;a:do if(i){g=0;while(1){f=c[i+(g<<2)>>2]|0;if(!f)break a;x=c[f>>2]&3;if((c[((x|0)==3?f:f+48|0)+40>>2]|0)==(c[((x|0)==2?f:f+-48|0)+40>>2]|0)?(u=c[(c[f+16>>2]|0)+96>>2]|0,(u|0)!=0):0){k=+h[u+32>>3]*.5;j=j>k?j:k}g=g+1|0}}while(0);if(+h[p>>3]>3]=j;h[p>>3]=j}if(+h[r>>3]>3]=j;h[r>>3]=j}i=c[e+212>>2]|0;if(i|0){if((i|0)==(d|0))g=0;else{g=XO(i,c[47198]|0,8,0)|0;e=c[l>>2]|0}f=c[e+232>>2]|0;e=c[i+16>>2]|0;j=j+ +(g|0);if((f|0)==(b[e+236>>1]|0)){x=e+128|0;k=+h[x>>3];h[x>>3]=k>j?k:j}if((f|0)==(b[e+238>>1]|0)){x=e+120|0;k=+h[x>>3];h[x>>3]=k>j?k:j}}m=m+1|0}t=t+1|0;e=c[v>>2]|0}m=oj(d)|0;g=c[v>>2]|0;e=b[g+238>>1]|0;h[(c[(c[c[w+(e<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]=+h[w+(e<<6)+16>>3];f=b[g+236>>1]|0;i=g+252|0;k=0.0;while(1){l=e+-1|0;if((e|0)<=(f|0))break;y=+h[w+(e<<6)+40>>3]+ +h[w+(l<<6)+32>>3]+ +(c[i>>2]|0);j=+h[w+(e<<6)+24>>3]+ +h[w+(l<<6)+16>>3]+8.0;j=y>j?y:j;if((c[w+(l<<6)>>2]|0)>0)h[(c[(c[c[w+(l<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]=j+ +h[(c[(c[c[w+(e<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3];k=k>j?k:j;e=l}b:do if((m|0)!=0?(c[g+116>>2]&1|0)!=0:0){pj(d,0);g=c[v>>2]|0;if(a[g+276>>0]|0){e=b[g+238>>1]|0;f=b[g+236>>1]|0;j=+h[(c[(c[c[w+(e<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3];k=0.0;while(1){i=e+-1|0;if((e|0)<=(f|0))break b;z=+h[(c[(c[c[w+(i<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3];y=z-j;j=z;k=k>y?k:y;e=i}}}while(0);c:do if(a[g+276>>0]|0){i=b[g+236>>1]|0;f=b[g+238>>1]|0;while(1){e=f+-1|0;if((f|0)<=(i|0))break c;if((c[w+(e<<6)>>2]|0)<=0){f=e;continue}h[(c[(c[c[w+(e<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]=k+ +h[(c[(c[c[w+(f<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3];f=e}}while(0);e=g+192|0;while(1){e=c[e>>2]|0;if(!e)break;e=c[e+16>>2]|0;h[e+24>>3]=+h[(c[(c[c[w+(c[e+232>>2]<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3];e=e+164|0}return}function Ji(a){a=a|0;var b=0,d=0,e=0;kj(a);b=(c[a+16>>2]|0)+192|0;while(1){b=c[b>>2]|0;if(!b)break;e=b+16|0;b=c[e>>2]|0;d=c[b+224>>2]|0;if(d){lj(a,d);b=c[e>>2]|0}d=c[b+228>>2]|0;if(!d)d=b;else{lj(a,d);d=c[e>>2]|0}e=c[d+204>>2]|0;if(e|0){b=0;while(1)if(!(c[e+(b<<2)>>2]|0))break;else b=b+1|0}b=d+164|0}return}function Ki(a){a=a|0;Yi(a);Zi(a);_i(a);$i(a);aj(a);return}function Li(a){a=a|0;var b=0,c=0.0;b=NA(a,87193)|0;if(!b)a=2147483647;else{c=+a6(b);a=~~(c*+(qB(a)|0))}return a|0}function Mi(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;r=d+16|0;e=c[r>>2]|0;q=b[e+236>>1]|0;while(1){p=b[e+238>>1]|0;if((q|0)>(p|0)){s=19;break}n=c[e+196>>2]|0;o=n+(q<<6)|0;m=c[o>>2]|0;n=n+(q<<6)+4|0;l=0;f=0;a:while(1){if((l|0)>=(m|0)){s=14;break}f=c[(c[n>>2]|0)+(l<<2)>>2]|0;h=c[f+16>>2]|0;i=c[h+256>>2]|0;b:do if(i|0){g=0;while(1){j=c[i+(g<<2)>>2]|0;if(!j)break b;k=c[j>>2]&3;if((c[(c[(c[((k|0)==2?j:j+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)>(q|0))break a;if((c[(c[(c[((k|0)==3?j:j+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)>(q|0))break a;else g=g+1|0}}while(0);h=c[h+248>>2]|0;c:do if(h|0){g=0;while(1){i=c[h+(g<<2)>>2]|0;if(!i)break c;j=c[i>>2]&3;if((c[(c[(c[((j|0)==3?i:i+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)>(q|0))break a;if((c[(c[(c[((j|0)==2?i:i+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)>(q|0))break a;else g=g+1|0}}while(0);l=l+1|0}if((s|0)==14){s=0;if(f){f=c[c[n>>2]>>2]|0;e=c[c[o+(((q|0)<(p|0)?1:-1)<<6)+4>>2]>>2]|0;if(!e){s=16;break}o=ph(d)|0;p=o+16|0;a[(c[p>>2]|0)+156>>0]=2;Wi(o,f,0.0,0)|0;Wi(o,e,0.0,0)|0;c[(c[p>>2]|0)+232>>2]=c[(c[((c[(c[f+16>>2]|0)+232>>2]|0)<(c[(c[e+16>>2]|0)+232>>2]|0)?f:e)+16>>2]|0)+232>>2];e=c[r>>2]|0}}q=q+1|0}if((s|0)==16)Aa(87101,86993,111,87104);else if((s|0)==19)return}function Ni(a){a=a|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0;a=c[a+16>>2]|0;i=c[a+196>>2]|0;e=b[a+238>>1]|0;a=b[a+236>>1]|0;while(1){if((a|0)>(e|0))break;f=c[i+(a<<6)>>2]|0;g=i+(a<<6)+4|0;d=0;while(1){if((d|0)>=(f|0))break;k=c[(c[(c[g>>2]|0)+(d<<2)>>2]|0)+16>>2]|0;j=k+232|0;h[k+16>>3]=+(c[j>>2]|0);c[j>>2]=a;d=d+1|0}a=a+1|0}return}function Oi(a,d){a=a|0;d=d|0;var e=0,f=0.0,g=0.0,i=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0.0;Qi(a,a);i=a+16|0;l=c[i>>2]|0;a:do if((b[l+238>>1]|0)>0?(j=c[l+8>>2]|0,e=c[j+84>>2]|0,e|0):0){m=~~(+h[l+32>>3]-+h[l+16>>3]);n=~~(+h[l+40>>3]-+h[l+24>>3]);o=(c[l+116>>2]&1|0)==0;if((e|0)==4){p=Ri(a)|0;l=c[i>>2]|0;j=c[l+8>>2]|0}else p=(e|0)==2&1;q=+((o?m:n)|0);k=+((o?n:m)|0);i=j+72|0;e=j+64|0;b:do if(!(p<<24>>24)){switch(c[j+84>>2]|0){case 5:{f=+h[e>>3];if(f<=0.0)break a;k=f/+h[l+32>>3];q=+h[i>>3]/+h[l+40>>3];f=k1.0&q>1.0){k=f;break b}else break a}case 1:break;default:break a}g=+h[j+16>>3];f=k/q;if(f>3];if(f<=0.0)break a;g=f/q;f=+h[i>>3]/k;if(g<1.0|f<1.0)if(g>2]&1|0)==0;g=e?f:k;f=e?k:f;e=l+192|0;while(1){e=c[e>>2]|0;if(!e)break;e=c[e+16>>2]|0;p=e+16|0;q=f*+h[p>>3];h[p>>3]=+(~~(q+(q>=0.0?.5:-.5))|0);p=e+24|0;q=g*+h[p>>3];h[p>>3]=+(~~(q+(q>=0.0?.5:-.5))|0);e=e+164|0}Si(a,f,g)}while(0);if(d|0)Ti(a,d);return}function Pi(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;h=b+16|0;b=(c[h>>2]|0)+192|0;while(1){b=c[b>>2]|0;if(!b)break;g=b+16|0;d=0;while(1){b=c[g>>2]|0;f=c[b+180>>2]|0;e=c[f+(d<<2)>>2]|0;if(!e)break;l6(c[e+16>>2]|0);l6(e);d=d+1|0}if(f){l6(f);b=c[g>>2]|0}d=c[b+172>>2]|0;if(d){l6(d);b=c[g>>2]|0}f=b+256|0;e=c[f+4>>2]|0;b=b+180|0;c[b>>2]=c[f>>2];c[b+4>>2]=e;b=c[g>>2]|0;e=b+248|0;f=c[e+4>>2]|0;b=b+172|0;c[b>>2]=c[e>>2];c[b+4>>2]=f;b=(c[g>>2]|0)+164|0}b=0;d=c[(c[h>>2]|0)+192>>2]|0;a:while(1){g=(b|0)==0;f=b+16|0;b=d;while(1){if(!b)break a;e=c[b+16>>2]|0;d=c[e+164>>2]|0;if((a[e+156>>0]|0)!=2)continue a;if(g)c[(c[h>>2]|0)+192>>2]=d;else c[(c[f>>2]|0)+164>>2]=d;l6(e);l6(b);b=d}}c[(c[(c[(c[h>>2]|0)+192>>2]|0)+16>>2]|0)+168>>2]=0;return}function Qi(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;e=a+16|0;d=1;while(1){f=c[e>>2]|0;if((d|0)>(c[f+180>>2]|0))break;Qi(c[(c[f+184>>2]|0)+(d<<2)>>2]|0,b);d=d+1|0}Vi(a,b);return}function Ri(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0.0,k=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0;s=l;l=l+80|0;e=s+64|0;d=s+48|0;f=s+16|0;m=s;r=s+32|0;a=a+16|0;b=c[(c[a>>2]|0)+8>>2]|0;t=b+48|0;c[f>>2]=c[t>>2];c[f+4>>2]=c[t+4>>2];c[f+8>>2]=c[t+8>>2];c[f+12>>2]=c[t+12>>2];if((!(+h[f>>3]<.001)?(g=f+8|0,!(+h[g>>3]<.001)):0)?(i=b+32|0,c[m>>2]=c[i>>2],c[m+4>>2]=c[i+4>>2],c[m+8>>2]=c[i+8>>2],c[m+12>>2]=c[i+12>>2],c[d>>2]=c[f>>2],c[d+4>>2]=c[f+4>>2],c[d+8>>2]=c[f+8>>2],c[d+12>>2]=c[f+12>>2],c[e>>2]=c[i>>2],c[e+4>>2]=c[i+4>>2],c[e+8>>2]=c[i+8>>2],c[e+12>>2]=c[i+12>>2],Ui(r,d,e),c[f>>2]=c[r>>2],c[f+4>>2]=c[r+4>>2],c[f+8>>2]=c[r+8>>2],c[f+12>>2]=c[r+12>>2],c[d>>2]=c[r>>2],c[d+4>>2]=c[r+4>>2],c[d+8>>2]=c[r+8>>2],c[d+12>>2]=c[r+12>>2],c[e>>2]=c[m>>2],c[e+4>>2]=c[m+4>>2],c[e+8>>2]=c[m+8>>2],c[e+12>>2]=c[m+12>>2],Ui(f,d,e),i=c[a>>2]|0,j=+h[i+32>>3],k=+h[i+40>>3],n=+h[f>>3],o=n/j,p=+h[g>>3],q=p/k,!(o>=1.0&q>=1.0)):0){o=o.5?o:.5;q=p*+R(+(k*o/p))/k;p=j*(n*+R(+(j*o/n))/j);a=c[i+8>>2]|0;h[a+64>>3]=p;h[a+72>>3]=k*q;a=1}else a=0;l=s;return a|0}function Si(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0;e=a+16|0;a=1;while(1){f=c[e>>2]|0;if((a|0)>(c[f+180>>2]|0))break;Si(c[(c[f+184>>2]|0)+(a<<2)>>2]|0,b,d);a=a+1|0}e=f+16|0;h[e>>3]=+h[e>>3]*b;e=f+24|0;h[e>>3]=+h[e>>3]*d;e=f+32|0;h[e>>3]=+h[e>>3]*b;f=f+40|0;h[f>>3]=+h[f>>3]*d;return}function Ti(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0,j=0.0,k=0,m=0,n=0,o=0;n=l;l=l+32|0;k=n+24|0;i=n+16|0;g=n;o=c[b+16>>2]|0;f=+h[o+32>>3]-+h[o+16>>3];e=+h[o+40>>3]-+h[o+24>>3];j=f/e;if(a[195234]|0){o=c[15715]|0;h[g>>3]=j;h[g+8>>3]=f*e/1.0e4;z4(o,87017,g)|0;c[i>>2]=uk(b)|0;z4(o,87042,i)|0}e=+h[d>>3];b=d+24|0;do if(!(j>e*1.1)){if(!(j<=e*.8)){c[b>>2]=0;m=9;break}c[b>>2]=-1;if(a[195234]|0){_3(87052,34,1,c[15715]|0)|0;m=9}}else{c[b>>2]=~~(e*+((c[d+20>>2]|0)-(c[d+16>>2]|0)|0)/j);m=9}while(0);if((m|0)==9?a[195234]|0:0){o=c[15715]|0;c[k>>2]=c[b>>2];z4(o,87087,k)|0}l=n;return}function Ui(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=+h[b+8>>3]-+h[c+8>>3];h[a>>3]=+h[b>>3]-+h[c>>3];h[a+8>>3]=d;return}function Vi(d,e){d=d|0;e=e|0;var f=0.0,g=0.0,i=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0;n=(dg(d)|0)==(d|0);s=d+16|0;t=c[s>>2]|0;q=b[t+236>>1]|0;r=b[t+238>>1]|0;a:do if(n){n=t+196|0;m=q;g=-2147483647.0;f=2147483647.0;while(1){if((m|0)>(r|0))break;d=c[n>>2]|0;l=c[d+(m<<6)>>2]|0;if((l|0)!=0?(o=c[d+(m<<6)+4>>2]|0,p=c[o>>2]|0,(p|0)!=0):0){j=1;d=p;while(1){d=c[d+16>>2]|0;i=a[d+156>>0]|0;if(!((j|0)<(l|0)&i<<24>>24!=0))break;d=c[o+(j<<2)>>2]|0;j=j+1|0}if(!(i<<24>>24)){k=+h[d+16>>3]-+h[d+88>>3];j=f>2]|0)+16>>2]|0;if(!(a[d+156>>0]|0))break;else{d=i;i=i+-1|0}}u=+h[d+16>>3]+ +h[d+96>>3];g=g>u?g:u;f=j?f:k}}m=m+1|0}i=c[t+180>>2]|0;j=t+184|0;d=1;while(1){if((d|0)>(i|0))break a;p=c[(c[(c[j>>2]|0)+(d<<2)>>2]|0)+16>>2]|0;u=+h[p+16>>3]+-8.0;k=+h[p+32>>3]+8.0;d=d+1|0;g=g>k?g:k;f=f>2]|0)+16>>2]|0)+232>>2]|0);f=+(c[(c[(c[t+256>>2]|0)+16>>2]|0)+232>>2]|0)}while(0);e=c[(c[e+16>>2]|0)+196>>2]|0;k=+h[(c[(c[c[e+(r<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]-+h[t+120>>3];u=+h[(c[(c[c[e+(q<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]+ +h[t+128>>3];h[t+16>>3]=f;h[t+24>>3]=k;e=c[s>>2]|0;h[e+32>>3]=g;h[e+40>>3]=u;return}function Wi(a,d,e,f){a=a|0;d=d|0;e=+e;f=f|0;var g=0,h=0,i=0,j=0;i=HK(96)|0;j=i+48|0;c[j>>2]=c[j>>2]|3;c[i>>2]=c[i>>2]&-4|2;g=HK(176)|0;h=i+16|0;c[h>>2]=g;c[((c[i>>2]&3|0)==3?i:j)+40>>2]=a;c[((c[i>>2]&3|0)==2?i:i+-48|0)+40>>2]=d;if(e>65535.0){Xi(e);e=65535.0;g=c[h>>2]|0}b[g+170>>1]=~~(e+(e>=0.0?.5:-.5));c[g+156>>2]=f;dh(i)|0;return i|0}function Xi(a){a=+a;var b=0,d=0;b=l;l=l+16|0;d=b;h[d>>3]=a;c[d+8>>2]=65535;dA(1,87117,d)|0;l=b;return}function Yi(a){a=a|0;var b=0,d=0,e=0,f=0;a=(c[a+16>>2]|0)+192|0;while(1){a=c[a>>2]|0;if(!a)break;f=a+16|0;e=c[f>>2]|0;a=e+172|0;d=c[a+4>>2]|0;e=e+248|0;c[e>>2]=c[a>>2];c[e+4>>2]=d;e=c[f>>2]|0;d=e+180|0;a=c[d+4>>2]|0;e=e+256|0;c[e>>2]=c[d>>2];c[e+4>>2]=a;e=c[f>>2]|0;a=c[e+180>>2]|0;d=0;while(1)if(!(c[a+(d<<2)>>2]|0))break;else d=d+1|0;b=c[e+172>>2]|0;a=0;while(1)if(!(c[b+(a<<2)>>2]|0))break;else a=a+1|0;c[e+176>>2]=0;a=HK((a+d<<2)+16|0)|0;e=c[f>>2]|0;c[e+172>>2]=a;c[e+184>>2]=0;e=HK(16)|0;a=c[f>>2]|0;c[a+180>>2]=e;a=a+164|0}return}function Zi(d){d=d|0;var f=0,g=0,i=0.0,j=0,k=0,m=0.0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0;z=l;l=l+16|0;w=z;x=d+16|0;u=c[x>>2]|0;y=c[u+196>>2]|0;d=(a[(c[(c[d+60>>2]|0)+16>>2]|0)+113>>0]&1)!=0;v=c[u+248>>2]|0;c[w>>2]=v;c[w+4>>2]=d?5:v;v=b[u+236>>1]|0;d=u;while(1){if((v|0)>(b[d+238>>1]|0))break;r=y+(v<<6)+4|0;c[(c[(c[c[r>>2]>>2]|0)+16>>2]|0)+232>>2]=0;s=y+(v<<6)|0;t=+(c[w+((v&1)<<2)>>2]|0);m=0.0;k=0;a:while(1){if((k|0)>=(c[s>>2]|0))break;f=c[r>>2]|0;n=c[f+(k<<2)>>2]|0;u=n+16|0;d=c[u>>2]|0;i=+h[d+96>>3];h[d+240>>3]=i;if((c[d+208>>2]|0)>0){j=0;f=0;while(1){g=c[(c[d+204>>2]|0)+(j<<2)>>2]|0;if(!g)break;q=c[g>>2]&3;if((c[((q|0)==3?g:g+48|0)+40>>2]|0)==(c[((q|0)==2?g:g+-48|0)+40>>2]|0)){f=(iO(g)|0)+f|0;d=c[u>>2]|0}j=j+1|0}q=d+96|0;i=+(f|0)+ +h[q>>3];h[q>>3]=i;f=c[r>>2]|0}q=k+1|0;f=c[f+(q<<2)>>2]|0;if(!f)p=m;else{o=f+16|0;p=t+(i+ +h[(c[o>>2]|0)+88>>3]);Wi(n,f,p,0)|0;d=~~(m+p);c[(c[o>>2]|0)+232>>2]=d;p=+(d|0);d=c[u>>2]|0}f=c[d+112>>2]|0;if(f){j=c[d+256>>2]|0;k=c[j>>2]|0;j=c[j+4>>2]|0;d=(c[(c[(c[((c[k>>2]&3|0)==2?k:k+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0)>(c[(c[(c[((c[j>>2]&3|0)==2?j:j+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0);g=d?j:k;j=d?k:j;k=f+16|0;d=c[k>>2]|0;i=+((S(c[(c[x>>2]|0)+248>>2]|0,e[d+170>>1]|0)|0)/2|0|0);o=c[g>>2]&3;f=c[((o|0)==2?g:g+-48|0)+40>>2]|0;g=c[((o|0)==3?g:g+48|0)+40>>2]|0;if(!(ij(g,f)|0))Wi(f,g,+(~~(i+ +h[(c[f+16>>2]|0)+96>>3]+ +h[(c[g+16>>2]|0)+88>>3])|0),c[d+156>>2]|0)|0;d=c[j>>2]&3;f=c[((d|0)==3?j:j+48|0)+40>>2]|0;d=c[((d|0)==2?j:j+-48|0)+40>>2]|0;if(!(ij(d,f)|0)){Wi(f,d,+(~~(i+ +h[(c[f+16>>2]|0)+96>>3]+ +h[(c[d+16>>2]|0)+88>>3])|0),c[(c[k>>2]|0)+156>>2]|0)|0;o=0}else o=0}else o=0;while(1){d=c[u>>2]|0;if((o|0)>=(c[d+192>>2]|0)){m=p;k=q;continue a}k=c[(c[d+188>>2]|0)+(o<<2)>>2]|0;j=c[k>>2]&3;g=c[((j|0)==3?k:k+48|0)+40>>2]|0;j=c[((j|0)==2?k:k+-48|0)+40>>2]|0;d=(c[(c[g+16>>2]|0)+236>>2]|0)<(c[(c[j+16>>2]|0)+236>>2]|0);f=d?g:j;g=d?j:g;i=+h[(c[f+16>>2]|0)+96>>3]+ +h[(c[g+16>>2]|0)+88>>3];j=k+16|0;d=~~(i+ +(S(c[(c[x>>2]|0)+248>>2]|0,e[(c[j>>2]|0)+170>>1]|0)|0));n=ah(f,g)|0;m=+(d|0);if(!n){d=c[j>>2]|0;if(!(c[d+96>>2]|0))Wi(f,g,m,c[d+156>>2]|0)|0}else{d=c[j>>2]|0;A=+h[d+136>>3];i=i+ +(c[(c[x>>2]|0)+248>>2]|0)+ +(~~(A+(A>=0.0?.5:-.5))|0);f=~~(m>i?m:i);if((f|0)>65535){Xi(+(f|0));f=65535;d=c[j>>2]|0}j=c[n+16>>2]|0;g=j+170|0;B=e[g>>1]|0;b[g>>1]=(B|0)>(f|0)?B:f;j=j+156|0;c[j>>2]=c[(c[((c[j>>2]|0)>(c[d+156>>2]|0)?n:k)+16>>2]|0)+156>>2]}o=o+1|0}}v=v+1|0;d=c[x>>2]|0}l=z;return}function _i(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0;d=(c[b+16>>2]|0)+192|0;while(1){d=c[d>>2]|0;if(!d)break;g=d+16|0;d=c[g>>2]|0;e=c[d+256>>2]|0;a:do if(e){f=0;while(1){e=c[e+(f<<2)>>2]|0;if(!e)break a;n=ph(b)|0;d=n+16|0;a[(c[d>>2]|0)+156>>0]=2;l=e+16|0;k=c[l>>2]|0;i=~~(+h[k+56>>3]-+h[k+16>>3]);m=(i|0)>0;j=m?0:0-i|0;i=m?i:0;m=e+48|0;Wi(n,c[((c[e>>2]&3|0)==3?e:m)+40>>2]|0,+(i+1|0),c[k+156>>2]|0)|0;k=e+-48|0;Wi(n,c[((c[e>>2]&3|0)==2?e:k)+40>>2]|0,+(j+1|0),c[(c[l>>2]|0)+156>>2]|0)|0;l=c[e>>2]&3;i=(c[(c[(c[((l|0)==3?e:m)+40>>2]|0)+16>>2]|0)+232>>2]|0)-i|0;e=(c[(c[(c[((l|0)==2?e:k)+40>>2]|0)+16>>2]|0)+232>>2]|0)-j|0;c[(c[d>>2]|0)+232>>2]=((i|0)<(e|0)?i:e)+-1;d=c[g>>2]|0;f=f+1|0;e=c[d+256>>2]|0}}while(0);d=d+164|0}return}function $i(a){a=a|0;if((c[(c[a+16>>2]|0)+180>>2]|0)>0){dj(a);ej(a);fj(a);gj(a)}return}function aj(a){a=a|0;var b=0.0,d=0.0,e=0,f=0;e=a+16|0;f=c[(c[e>>2]|0)+8>>2]|0;if((c[f+84>>2]|0)==3?(b=+h[f+64>>3],d=+h[f+72>>3],!(b*d<=1.0)):0){bj(a);f=c[e>>2]|0;d=(c[f+116>>2]&1|0)==0?b:d;Wi(c[f+256>>2]|0,c[f+260>>2]|0,d<65535.0?d:65535.0,1e3)|0}return}function bj(a){a=a|0;var d=0,e=0,f=0.0,g=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+16|0;m=n;e=XO(a,c[47198]|0,8,0)|0;cj(a);i=a+16|0;g=c[i>>2]|0;j=c[g+256>>2]|0;k=c[g+260>>2]|0;f=+(e|0);e=b[g+236>>1]|0;while(1){if((e|0)>(b[g+238>>1]|0))break;d=c[g+196>>2]|0;do if(c[d+(e<<6)>>2]|0){d=c[c[d+(e<<6)+4>>2]>>2]|0;if(!d){c[m>>2]=HB(a)|0;c[m+4>>2]=e;dA(1,87201,m)|0;break}else{Wi(j,d,f+ +h[(c[d+16>>2]|0)+88>>3]+ +h[g+96>>3],0)|0;g=c[i>>2]|0;d=c[g+196>>2]|0;d=c[(c[d+(e<<6)+4>>2]|0)+((c[d+(e<<6)>>2]|0)+-1<<2)>>2]|0;Wi(d,k,f+ +h[(c[d+16>>2]|0)+96>>3]+ +h[g+64>>3],0)|0;break}}while(0);e=e+1|0;g=c[i>>2]|0}l=n;return}function cj(b){b=b|0;var d=0,e=0,f=0;d=b+16|0;if(!(c[(c[d>>2]|0)+256>>2]|0)){f=ph(dg(b)|0)|0;a[(c[f+16>>2]|0)+156>>0]=2;e=ph(dg(b)|0)|0;a[(c[e+16>>2]|0)+156>>0]=2;if((c[(c[d>>2]|0)+12>>2]|0?(dg(b)|0)!=(b|0):0)?(c[(c[(vC(b)|0)+16>>2]|0)+116>>2]&1|0)==0:0){b=c[d>>2]|0;Wi(f,e,+(~~+h[b+48+((+h[b+48>>3]>+h[b+80>>3]?0:2)<<4)>>3]|0),0)|0}d=c[d>>2]|0;c[d+256>>2]=f;c[d+260>>2]=e}return}function dj(a){a=a|0;var b=0,d=0;b=a+16|0;do if((dg(a)|0)!=(a|0)){bj(a);a=c[b>>2]|0;a=ah(c[a+256>>2]|0,c[a+260>>2]|0)|0;if(!a){d=c[b>>2]|0;Wi(c[d+256>>2]|0,c[d+260>>2]|0,1.0,128)|0;break}else{d=(c[a+16>>2]|0)+156|0;c[d>>2]=(c[d>>2]|0)+128;break}}while(0);a=1;while(1){d=c[b>>2]|0;if((a|0)>(c[d+180>>2]|0))break;dj(c[(c[d+184>>2]|0)+(a<<2)>>2]|0);a=a+1|0}return}function ej(d){d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0.0,n=0,o=0;k=XO(d,c[47198]|0,8,0)|0;o=d+16|0;e=c[o>>2]|0;m=+(k|0);k=b[e+236>>1]|0;while(1){if((k|0)>(b[e+238>>1]|0)){f=1;break}e=c[e+196>>2]|0;a:do if(c[e+(k<<6)>>2]|0?(l=c[c[e+(k<<6)+4>>2]>>2]|0,l|0):0){i=l+16|0;f=c[(c[i>>2]|0)+236>>2]|0;while(1){if((f|0)<=0)break;f=f+-1|0;j=c[(c[(c[(c[(dg(d)|0)+16>>2]|0)+196>>2]|0)+(k<<6)+4>>2]|0)+(f<<2)>>2]|0;g=j+16|0;e=c[g>>2]|0;if(!(a[e+156>>0]|0)){n=10;break}if(hj(d,j)|0){n=9;break}}if((n|0)==9){e=c[g>>2]|0;n=10}if((n|0)==10){n=0;Wi(j,c[(c[o>>2]|0)+256>>2]|0,m+ +h[e+96>>3],0)|0}f=(c[(c[(c[o>>2]|0)+196>>2]|0)+(k<<6)>>2]|0)+(c[(c[i>>2]|0)+236>>2]|0)|0;while(1){if((f|0)>=(c[(c[(c[(dg(d)|0)+16>>2]|0)+196>>2]|0)+(k<<6)>>2]|0))break a;i=c[(c[(c[(c[(dg(d)|0)+16>>2]|0)+196>>2]|0)+(k<<6)+4>>2]|0)+(f<<2)>>2]|0;g=i+16|0;e=c[g>>2]|0;if(!(a[e+156>>0]|0))break;if(!(hj(d,i)|0))f=f+1|0;else{n=15;break}}if((n|0)==15){n=0;e=c[g>>2]|0}Wi(c[(c[o>>2]|0)+260>>2]|0,i,m+ +h[e+88>>3],0)|0}while(0);k=k+1|0;e=c[o>>2]|0}while(1){if((f|0)>(c[e+180>>2]|0))break;ej(c[(c[e+184>>2]|0)+(f<<2)>>2]|0);f=f+1|0;e=c[o>>2]|0}return}function fj(a){a=a|0;var b=0,d=0.0,e=0,f=0,g=0;e=XO(a,c[47198]|0,8,0)|0;cj(a);b=a+16|0;d=+(e|0);a=1;while(1){e=c[b>>2]|0;if((a|0)>(c[e+180>>2]|0))break;e=c[(c[e+184>>2]|0)+(a<<2)>>2]|0;cj(e);f=c[b>>2]|0;g=e+16|0;Wi(c[f+256>>2]|0,c[(c[g>>2]|0)+256>>2]|0,d+ +h[f+96>>3],0)|0;f=c[b>>2]|0;Wi(c[(c[g>>2]|0)+260>>2]|0,c[f+260>>2]|0,d+ +h[f+64>>3],0)|0;fj(e);a=a+1|0}return}function gj(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0.0,n=0,o=0;d=XO(a,c[47198]|0,8,0)|0;n=a+16|0;a=1;while(1){f=c[n>>2]|0;e=c[f+180>>2]|0;if((a|0)>(e|0))break;cj(c[(c[f+184>>2]|0)+(a<<2)>>2]|0);a=a+1|0}m=+(d|0);l=1;a=e;d=f;while(1){if((l|0)>(a|0))break;k=l+1|0;j=k;while(1){e=c[d+184>>2]|0;f=c[e+(l<<2)>>2]|0;if((j|0)>(a|0))break;e=c[e+(j<<2)>>2]|0;g=(b[(c[f+16>>2]|0)+236>>1]|0)>(b[(c[e+16>>2]|0)+236>>1]|0);i=g?e:f;e=g?f:e;f=c[i+16>>2]|0;g=c[e+16>>2]|0;o=b[g+236>>1]|0;h=o<<16>>16;if((b[f+238>>1]|0)>=o<<16>>16){a=(c[(c[(c[c[(c[f+196>>2]|0)+(h<<6)+4>>2]>>2]|0)+16>>2]|0)+236>>2]|0)<(c[(c[(c[c[(c[g+196>>2]|0)+(h<<6)+4>>2]>>2]|0)+16>>2]|0)+236>>2]|0);Wi(c[(c[(a?i:e)+16>>2]|0)+260>>2]|0,c[(c[(a?e:i)+16>>2]|0)+256>>2]|0,m,0)|0;a=c[n>>2]|0;d=a;a=c[a+180>>2]|0}j=j+1|0}gj(f);d=c[n>>2]|0;l=k;a=c[d+180>>2]|0}return}function hj(b,d){b=b|0;d=d|0;var e=0;d=c[d+16>>2]|0;if((a[d+156>>0]|0)==1){d=c[c[d+256>>2]>>2]|0;while(1){e=c[(c[d+16>>2]|0)+116>>2]|0;if(!e)break;else d=e}if(!(EC(b,c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0)|0))d=(EC(b,c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)|0)==0&1;else d=0}else d=0;return d|0}function ij(a,b){a=a|0;b=b|0;return jj(a,b)|0}function jj(a,b){a=a|0;b=b|0;var d=0,e=0;a:do if((a|0)==(b|0))a=1;else{d=c[(c[a+16>>2]|0)+180>>2]|0;a=0;while(1){e=c[d+(a<<2)>>2]|0;if(!e){a=0;break a}if(!(jj(c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0,b)|0))a=a+1|0;else{a=1;break}}}while(0);return a|0}function kj(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;l=d+16|0;d=c[l>>2]|0;k=b[d+236>>1]|0;while(1){if((k|0)>(b[d+238>>1]|0))break;h=c[d+196>>2]|0;g=c[h+(k<<6)>>2]|0;h=h+(k<<6)+4|0;j=0;f=0;while(1){i=j+1|0;if((f|0)>=(g|0))break;e=c[(c[(c[h>>2]|0)+(f<<2)>>2]|0)+16>>2]|0;c[e+236>>2]=j;if((a[e+159>>0]|0)==6)e=(c[e+216>>2]|0)+j|0;else e=i;j=e;f=f+1|0}if((j|0)>(g|0)){e=c[h>>2]|0;d=i<<2;if(!e)d=IK(d)|0;else d=KK(e,d)|0;f=c[(c[l>>2]|0)+196>>2]|0;c[f+(k<<6)+4>>2]=d;g=c[f+(k<<6)>>2]|0;while(1){e=g+-1|0;if((g|0)<=0)break;f=c[d+(e<<2)>>2]|0;c[d+(c[(c[f+16>>2]|0)+236>>2]<<2)>>2]=f;f=c[(c[l>>2]|0)+196>>2]|0;g=e;d=c[f+(k<<6)+4>>2]|0}c[f+(k<<6)>>2]=j;c[d+(j<<2)>>2]=0;d=c[l>>2]|0}k=k+1|0}return}function lj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;o=l;l=l+48|0;n=o+32|0;m=o+8|0;d=o+24|0;k=o+16|0;j=o;e=b+16|0;f=c[e>>2]|0;a:do if((c[f+216>>2]|0)>=2){c[m>>2]=~~(+h[f+16>>3]-+h[f+88>>3]);c[m+4>>2]=~~+h[f+24>>3];c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];mj(d,b,n);g=d;i=c[g+4>>2]|0;d=m;c[d>>2]=c[g>>2];c[d+4>>2]=i;e=c[e>>2]|0;d=(c[e+236>>2]|0)+1|0;if((c[e+184>>2]|0)>0){j=c[c[e+180>>2]>>2]|0;j=XA(a,c[((c[j>>2]&3|0)==2?j:j+-48|0)+40>>2]|0)|0;while(1){if(!j)break a;i=(c[j>>2]&3|0)==2?j:j+-48|0;e=i+48|0;f=c[((c[i>>2]&3|0)==3?i:e)+40>>2]|0;if((f|0)!=(b|0)?(dP(f)|0)==(b|0):0){e=c[((c[i>>2]&3|0)==3?i:e)+40>>2]|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];nj(k,a,e,n,d);e=k;f=c[e+4>>2]|0;g=m;c[g>>2]=c[e>>2];c[g+4>>2]=f;uh(i);g=i+-48|0;f=c[(c[((c[i>>2]&3|0)==2?i:g)+40>>2]|0)+16>>2]|0;e=c[f+172>>2]|0;f=(c[f+176>>2]<<2)+8|0;if(!e)e=IK(f)|0;else e=KK(e,f)|0;c[(c[(c[((c[i>>2]&3|0)==2?i:g)+40>>2]|0)+16>>2]|0)+172>>2]=e;p=c[(c[((c[i>>2]&3|0)==2?i:g)+40>>2]|0)+16>>2]|0;e=c[p+172>>2]|0;p=p+176|0;f=c[p>>2]|0;c[p>>2]=f+1;c[e+(f<<2)>>2]=i;i=c[(c[((c[i>>2]&3|0)==2?i:g)+40>>2]|0)+16>>2]|0;c[(c[i+172>>2]|0)+(c[i+176>>2]<<2)>>2]=0;d=d+1|0}j=YA(a,j)|0}}else{i=c[c[e+172>>2]>>2]|0;i=UA(a,c[((c[i>>2]&3|0)==3?i:i+48|0)+40>>2]|0)|0;while(1){if(!i)break a;e=i+-48|0;f=c[((c[i>>2]&3|0)==2?i:e)+40>>2]|0;if((f|0)!=(b|0)?(dP(f)|0)==(b|0):0){e=c[((c[i>>2]&3|0)==2?i:e)+40>>2]|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];nj(j,a,e,n,d);e=j;f=c[e+4>>2]|0;g=m;c[g>>2]=c[e>>2];c[g+4>>2]=f;uh(i);g=i+48|0;f=c[(c[((c[i>>2]&3|0)==3?i:g)+40>>2]|0)+16>>2]|0;e=c[f+180>>2]|0;f=(c[f+184>>2]<<2)+8|0;if(!e)e=IK(f)|0;else e=KK(e,f)|0;c[(c[(c[((c[i>>2]&3|0)==3?i:g)+40>>2]|0)+16>>2]|0)+180>>2]=e;f=c[(c[((c[i>>2]&3|0)==3?i:g)+40>>2]|0)+16>>2]|0;k=c[f+180>>2]|0;f=f+184|0;p=c[f>>2]|0;c[f>>2]=p+1;c[k+(p<<2)>>2]=i;p=c[(c[((c[i>>2]&3|0)==3?i:g)+40>>2]|0)+16>>2]|0;c[(c[p+180>>2]|0)+(c[p+184>>2]<<2)>>2]=0;d=d+1|0}i=WA(a,i)|0}}}while(0);l=o;return}function mj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0;oQ(b,c[(c[(uC(b)|0)+16>>2]|0)+116>>2]&1);e=c[b+16>>2]|0;h[e+24>>3]=+(c[d+4>>2]|0);f=+(c[d>>2]|0)+ +h[e+88>>3];h[e+16>>3]=f;f=f+ +h[e+96>>3];c[d>>2]=~~(f+ +(c[(c[(uC(b)|0)+16>>2]|0)+248>>2]|0));e=d;b=c[e+4>>2]|0;d=a;c[d>>2]=c[e>>2];c[d+4>>2]=b;return}function nj(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;i=l;l=l+16|0;h=i;b=dg(b)|0;g=dP(d)|0;if((g|0)!=(d|0))mh(g,d);j=c[d+16>>2]|0;c[j+236>>2]=f;g=c[(c[g+16>>2]|0)+232>>2]|0;c[j+232>>2]=g;c[(c[(c[(c[b+16>>2]|0)+196>>2]|0)+(g<<6)+4>>2]|0)+(f<<2)>>2]=d;c[h>>2]=c[e>>2];c[h+4>>2]=c[e+4>>2];mj(a,d,h);l=i;return}function oj(a){a=a|0;var d=0.0,e=0.0,f=0,g=0,i=0,j=0.0,k=0,l=0,m=0,n=0.0;m=c[(c[(dg(a)|0)+16>>2]|0)+196>>2]|0;if((dg(a)|0)==(a|0))j=8.0;else j=+(XO(a,c[47198]|0,8,0)|0);l=a+16|0;g=c[l>>2]|0;f=0;k=1;e=+h[g+120>>3];d=+h[g+128>>3];while(1){if((k|0)>(c[g+180>>2]|0))break;i=c[(c[g+184>>2]|0)+(k<<2)>>2]|0;f=oj(i)|0|f;i=c[i+16>>2]|0;g=c[l>>2]|0;if((b[i+238>>1]|0)==(b[g+238>>1]|0)){n=j+ +h[i+120>>3];e=e>n?e:n}if((b[i+236>>1]|0)==(b[g+236>>1]|0)){n=j+ +h[i+128>>3];d=d>n?d:n}k=k+1|0}if((dg(a)|0)!=(a|0)?(c[(c[l>>2]|0)+12>>2]|0)!=0:0)if(!(c[(c[(vC(a)|0)+16>>2]|0)+116>>2]&1)){k=c[l>>2]|0;f=1;e=e+ +h[k+56>>3];d=d+ +h[k+88>>3]}else f=1;k=c[l>>2]|0;h[k+120>>3]=e;h[k+128>>3]=d;if((dg(a)|0)!=(a|0)){l=c[l>>2]|0;a=m+(b[l+236>>1]<<6)+24|0;n=+h[a>>3];h[a>>3]=n>d?n:d;m=m+(b[l+238>>1]<<6)+16|0;n=+h[m>>3];h[m>>3]=n>e?n:e}return f|0}function pj(a,d){a=a|0;d=d|0;var e=0,f=0.0,g=0.0,i=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0.0,q=0.0;o=c[(c[(dg(a)|0)+16>>2]|0)+196>>2]|0;if((dg(a)|0)==(a|0))e=0;else e=XO(a,c[47198]|0,8,0)|0;l=a+16|0;i=c[l>>2]|0;m=e+d|0;k=+(e|0);j=1;f=+h[i+128>>3];g=+h[i+120>>3];e=i;while(1){if((j|0)>(c[e+180>>2]|0))break;i=c[(c[e+184>>2]|0)+(j<<2)>>2]|0;pj(i,m);i=c[i+16>>2]|0;e=c[l>>2]|0;if((b[i+238>>1]|0)==(b[e+238>>1]|0)){q=k+ +h[i+120>>3];g=g>q?g:q}if((b[i+236>>1]|0)==(b[e+236>>1]|0)){q=k+ +h[i+128>>3];f=f>q?f:q}j=j+1|0}h[e+120>>3]=g;h[e+128>>3]=f;if(((dg(a)|0)!=(a|0)?(n=c[l>>2]|0,c[n+12>>2]|0):0)?(p=+h[n+48+((+h[n+104>>3]>+h[n+72>>3]?3:1)<<4)+8>>3]-(f+(g+(+h[(c[(c[c[o+(b[n+236>>1]<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]-+h[(c[(c[c[o+(b[n+238>>1]<<6)+4>>2]>>2]|0)+16>>2]|0)+24>>3]))),p>0.0):0)qj(a,~~p,d);if((dg(a)|0)!=(a|0)){n=c[l>>2]|0;m=o+(b[n+236>>1]<<6)+24|0;q=+h[m>>3];p=+h[n+128>>3];h[m>>3]=q>p?q:p;o=o+(b[n+238>>1]<<6)+16|0;p=+h[o>>3];q=+h[n+120>>3];h[o>>3]=p>q?p:q}return}function qj(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0,k=0.0,l=0,m=0,n=0.0,o=0,p=0;j=c[(dg(a)|0)+16>>2]|0;o=c[j+196>>2]|0;l=c[a+16>>2]|0;a=b[l+238>>1]|0;f=b[l+236>>1]|0;p=(d+1|0)/2|0;m=l+120|0;n=+(p|0)+ +h[m>>3];i=+(e|0);e=~~(n-(+h[o+(a<<6)+16>>3]-i));l=l+128|0;i=+h[o+(f<<6)+24>>3]-i;k=+(d-p|0)+ +h[l>>3];if((e|0)>0){g=+(e|0);while(1){if((a|0)<(f|0))break;if((c[o+(a<<6)>>2]|0)>0){p=(c[(c[c[o+(a<<6)+4>>2]>>2]|0)+16>>2]|0)+24|0;h[p>>3]=g+ +h[p>>3]}a=a+-1|0}g=k+g}else g=k;a=~~(g-i);a:do if((a|0)>0){e=b[j+236>>1]|0;g=+(a|0);while(1){a=f+-1|0;if((f|0)<=(e|0))break a;if((c[o+(a<<6)>>2]|0)<=0){f=a;continue}f=(c[(c[c[o+(a<<6)+4>>2]>>2]|0)+16>>2]|0)+24|0;h[f>>3]=g+ +h[f>>3];f=a}}while(0);h[l>>3]=k;h[m>>3]=n;return}function rj(b,d){b=b|0;d=d|0;var e=0,f=0;e=c[b+16>>2]|0;f=a[e+84>>0]|0;b=c[d+16>>2]|0;do if(f<<24>>24==(a[b+84>>0]|0)){if(+h[e+56>>3]==+h[b+56>>3]){if(!(f<<24>>24==0?1:+h[e+64>>3]==+h[b+64>>3])){b=0;break}}else if(f<<24>>24){b=0;break}if(+h[e+16>>3]==+h[b+16>>3]?+h[e+24>>3]==+h[b+24>>3]:0){b=1;break}b=(a[e+44>>0]|0)==0}else b=0;while(0);return b&1|0}function sj(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=a+16|0;d=c[j>>2]|0;b[d+236>>1]=32767;b[d+238>>1]=-1;d=0;i=gC(a)|0;while(1){e=c[j>>2]|0;if(!i)break;f=e+238|0;g=c[(c[i+16>>2]|0)+232>>2]|0;h=g&65535;if((b[f>>1]|0)<(g|0))b[f>>1]=h;e=e+236|0;if((b[e>>1]|0)>(g|0))b[e>>1]=h;if(!d)d=i;else d=(g|0)<(c[(c[d+16>>2]|0)+232>>2]|0)?i:d;i=hC(a,i)|0}c[e+264>>2]=d;return}function tj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0.0;b=NA(a,87246)|0;if(!b)b=2147483647;else{g=+a6(b);b=~~(g*+(qB(a)|0))}e=a+16|0;d=0;while(1){f=c[e>>2]|0;if((d|0)>=(c[f+220>>2]|0))break;c[f+192>>2]=c[(c[f+216>>2]|0)+(d<<2)>>2];sL(a,(c[f+180>>2]|0)==0&1,b)|0;d=d+1|0}return}function uj(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=l;l=l+16|0;g=h;f=d+16|0;if(!(NA(d,87255)|0))wj(d,e);else{i=(c[f>>2]|0)+136|0;b[i>>1]=b[i>>1]|16;vj(d,e)}if(a[195234]|0){i=c[15715]|0;e=c[f>>2]|0;f=b[e+236>>1]|0;c[g>>2]=b[e+238>>1];c[g+4>>2]=f;z4(i,87263,g)|0}l=h;return}function vj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0.0;h=l;l=l+16|0;g=h;c[46789]=0;c[g>>2]=c[4658];g=lB(87473,g,0)|0;RC(g,87502,280,1)|0;CC(g,17444,17384);xj(a);d=NA(a,87246)|0;if(!d)e=2147483647;else{i=+a6(d);e=~~(i*+(qB(a)|0))}Nj(a,0);Oj(a,g);Pj(a,g);Qj(a,g,0,0);Rj(g);f=Sj(g)|0;Tj(g);if(b|0){Hk(g);vk(g)}d=NA(a,102887)|0;if(!d)d=-1;else d=d6(d)|0;LK(g,1,e,d)|0;Uj(a,g,f);pB(g)|0;l=h;return}function wj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;g=l;l=l+32|0;f=g+16|0;e=g+8|0;d=g;xj(a);do if(!b){yj(a,a);Kk(a);zj(d,a);h=d;d=c[h+4>>2]|0;b=e;c[b>>2]=c[h>>2];c[b+4>>2]=d;Dl(a,0);b=0}else{Hk(a);vk(a);yj(a,a);Kk(a);zj(d,a);i=d;d=c[i+4>>2]|0;h=e;c[h>>2]=c[i>>2];c[h+4>>2]=d;Dl(a,0);h=c[a+16>>2]|0;if((c[h+220>>2]|0)<=1?(c[h+180>>2]|0)<=0:0)break;c[b+32>>2]=1;b=0}while(0);sk(a);c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];if(Aj(a,f)|0)Dl(a,0);if(!b)tj(a);else wk(a,b);Bj(a,b);Cj(a);l=g;return}function xj(d){d=d|0;var f=0,g=0,h=0;if(a[(c[(c[d+60>>2]|0)+16>>2]|0)+113>>0]&1){g=gC(d)|0;while(1){if(!g)break;f=UA(d,g)|0;while(1){if(!f)break;h=(c[f+16>>2]|0)+170|0;b[h>>1]=(e[h>>1]|0)<<1;f=WA(d,f)|0}g=hC(d,g)|0}h=(c[d+16>>2]|0)+252|0;c[h>>2]=((c[h>>2]|0)+1|0)/2|0}return}function yj(a,b){a=a|0;b=b|0;var d=0;b=MD(b)|0;while(1){if(!b)break;d=Kj(b)|0;do if(d)if((d|0)==7&(c[47182]|0)==100){Gj(a,b);break}else{Lj(a,b,d);break}else yj(a,b);while(0);b=ND(b)|0}return}function zj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=d+16|0;d=c[h>>2]|0;e=c[d+228>>2]|0;j=b+4|0;f=c[d+224>>2]|0;g=(f|0)==0;a:do if(!((e|0)==0&g)){if(!g){e=dP(f)|0;d=c[h>>2]|0;c[d+224>>2]=e;e=c[d+228>>2]|0}do if(e){d=dP(e)|0;e=c[h>>2]|0;c[e+228>>2]=d;if(d){e=d+16|0;d=c[e>>2]|0;f=(a[d+159>>0]|0)==5&1;while(1){d=c[c[d+180>>2]>>2]|0;if(!d){d=11;break}g=c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0;if((g|0)!=(dP(g)|0)){d=9;break}rk(d);d=c[e>>2]|0}if((d|0)==9)Aa(87366,87306,346,87398);else if((d|0)==11){k=f;i=c[h>>2]|0;break}}else{k=0;i=e}}else{k=0;i=d}while(0);d=c[i+224>>2]|0;if(!d){l=k;m=0}else{e=d+16|0;d=c[e>>2]|0;f=(a[d+159>>0]|0)==3&1;while(1){d=c[c[d+172>>2]>>2]|0;if(!d){l=k;m=f;break a}i=c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0;if((i|0)!=(dP(i)|0))break;rk(d);d=c[e>>2]|0}Aa(87411,87306,353,87398)}}else{l=0;m=0}while(0);c[b>>2]=m;c[j>>2]=l;return}function Aj(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;j=a+16|0;i=c[j>>2]|0;if((c[i+228>>2]|0)==0?(c[i+224>>2]|0)==0:0)d=0;else e=3;a:do if((e|0)==3){g=gC(a)|0;i=d+4|0;h=c[d>>2]&65535;d=0;while(1){if(!g)break a;if((g|0)==(dP(g)|0)){f=g+16|0;e=c[f>>2]|0;if((c[e+184>>2]|0)==0?(k=c[(c[j>>2]|0)+228>>2]|0,!((k|0)==0|(g|0)==(k|0))):0){d=kh(g,k,0)|0;e=c[d+16>>2]|0;b[e+170>>1]=c[i>>2];c[e+156>>2]=0;e=c[f>>2]|0}if((c[e+176>>2]|0)==0?(l=c[(c[j>>2]|0)+224>>2]|0,!((l|0)==0|(g|0)==(l|0))):0){d=kh(l,g,0)|0;f=c[d+16>>2]|0;b[f+170>>1]=h;c[f+156>>2]=0}}g=hC(a,g)|0}}while(0);return (d|0)!=0|0}function Bj(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;g=gC(d)|0;l=d+16|0;f=c[l>>2]|0;a:do if(g){b[f+236>>1]=32767;b[f+238>>1]=-1;k=(e|0)==0;while(1){if(!g)break;f=dP(g)|0;j=c[g+16>>2]|0;h=j+232|0;e=c[h>>2]|0;if((f|0)!=(g|0)&(k|(e|0)==0)){e=(c[(c[f+16>>2]|0)+232>>2]|0)+e|0;c[h>>2]=e}f=c[l>>2]|0;h=f+238|0;i=e&65535;if((b[h>>1]|0)<(e|0))b[h>>1]=i;f=f+236|0;if((b[f>>1]|0)>(e|0))b[f>>1]=i;switch(a[j+159>>0]|0){case 6:case 0:break;default:fP(g)}g=hC(d,g)|0}if((dg(d)|0)==(d|0)){if((c[47182]|0)==100)e=1;else{Fj(d);break}while(1){f=c[l>>2]|0;if((e|0)>(c[f+180>>2]|0))break a;Ej(c[(c[f+184>>2]|0)+(e<<2)>>2]|0);e=e+1|0}}}else{b[f+238>>1]=0;b[f+236>>1]=0}while(0);return}function Cj(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=b+16|0;e=0;while(1){d=c[j>>2]|0;if((e|0)>=(c[d+220>>2]|0))break;i=c[(c[d+216>>2]|0)+(e<<2)>>2]|0;c[d+192>>2]=i;d=i;while(1){if(!d)break;i=d+16|0;Dj((c[i>>2]|0)+172|0);Dj((c[i>>2]|0)+180|0);i=c[i>>2]|0;a[i+157>>0]=0;d=c[i+164>>2]|0}e=e+1|0}i=gC(b)|0;while(1){if(!i)break;h=UA(b,i)|0;while(1){if(!h)break;f=h+16|0;d=c[f>>2]|0;g=c[d+172>>2]|0;if((g|0)!=0?(k=g+16|0,(h|0)==(c[(c[k>>2]|0)+116>>2]|0)):0){d=gC(b)|0;while(1){if(!d)break;e=UA(b,d)|0;while(1){if(!e)break;if((h|0)!=(e|0)?(l=(c[e+16>>2]|0)+172|0,m=c[l>>2]|0,(m|0)!=0&(g|0)==(m|0)):0)c[l>>2]=0;e=WA(b,e)|0}d=hC(b,d)|0}l6(c[k>>2]|0);l6(g);d=c[f>>2]|0}c[d+172>>2]=0;h=WA(b,h)|0}i=hC(b,i)|0}l6(c[(c[j>>2]|0)+216>>2]|0);m=c[j>>2]|0;c[m+216>>2]=0;c[m+220>>2]=0;return}function Dj(a){a=a|0;var b=0,d=0;d=a+4|0;b=c[d>>2]|0;while(1){if((b|0)<=-1)break;c[(c[a>>2]|0)+(b<<2)>>2]=0;b=b+-1|0}c[d>>2]=0;return}function Ej(a){a=a|0;var d=0,f=0,g=0;d=a+16|0;f=c[d>>2]|0;g=c[(c[(c[f+264>>2]|0)+16>>2]|0)+232>>2]|0;a=f+236|0;b[a>>1]=(e[a>>1]|0)+g;a=f+238|0;b[a>>1]=(e[a>>1]|0)+g;a=1;while(1){if((a|0)>(c[f+180>>2]|0))break;Ej(c[(c[f+184>>2]|0)+(a<<2)>>2]|0);a=a+1|0;f=c[d>>2]|0}return}function Fj(b){b=b|0;var d=0;d=MD(dg(b)|0)|0;while(1){if(!d)break;if((a[(c[d+16>>2]|0)+274>>0]|0)==7)Gj(b,d);d=ND(d)|0}return}function Gj(a,b){a=a|0;b=b|0;var d=0;d=(c[b+16>>2]|0)+200|0;do if((c[d>>2]|0)==0?(c[d>>2]=a,Hj(a,b),gC(b)|0):0){Ij(a,b);if((c[47182]|0)==100){wj(b,0);Jj(b);break}else{sj(b);break}}while(0);return}function Hj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=b+16|0;g=gC(d)|0;while(1){if(!g)break;i=hC(d,g)|0;j=g+16|0;if(!(a[(c[j>>2]|0)+159>>0]|0))f=1;else{tC(d,g)|0;g=i;continue}while(1){e=c[h>>2]|0;b=c[e+180>>2]|0;if((f|0)>=(b|0))break;if(EC(c[(c[e+184>>2]|0)+(f<<2)>>2]|0,g)|0){k=7;break}f=f+1|0}if((k|0)==7){k=0;b=c[(c[h>>2]|0)+180>>2]|0}if((f|0)<(b|0))tC(d,g)|0;c[(c[j>>2]|0)+212>>2]=0;g=i}e=gC(d)|0;while(1){if(!e)break;b=UA(dg(d)|0,e)|0;while(1){if(!b)break;if(EC(d,c[((c[b>>2]&3|0)==2?b:b+-48|0)+40>>2]|0)|0)jB(d,b,1)|0;b=WA(dg(d)|0,b)|0}e=hC(d,e)|0}return}function Ij(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;e=a+16|0;d=c[e>>2]|0;g=d+180|0;a=c[g>>2]|0;f=a+1|0;c[g>>2]=f;d=c[d+184>>2]|0;a=a+2|0;if(!d)a=HK(a<<2)|0;else a=JK(d,a,4,f)|0;c[(c[e>>2]|0)+184>>2]=a;c[a+(f<<2)>>2]=b;sK(b);return}function Jj(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;g=c[b+16>>2]|0;d=g+192|0;h=0;while(1){d=c[d>>2]|0;if(!d)break;f=c[d+16>>2]|0;if(!(c[f+232>>2]|0))e=(a[f+156>>0]|0)==0?d:h;else e=h;d=f+164|0;h=e}if(!h)Aa(87291,87306,238,87313);c[g+264>>2]=h;d=gC(b)|0;while(1){if(!d){d=13;break}e=d+16|0;if(!((d|0)==(h|0)?1:(c[(c[e>>2]|0)+216>>2]|0)<2)){d=11;break}eP(d,h)|0;a[(c[e>>2]|0)+159>>0]=7;d=hC(b,d)|0}if((d|0)==11)Aa(87328,87306,242,87313);else if((d|0)==13)return}function Kj(b){b=b|0;var d=0;if(!(Mj(b)|0)){d=nP(NA(b,87443)|0,17396,17420)|0;a[(c[b+16>>2]|0)+274>>0]=d;b=d}else b=7;return b|0}function Lj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;g=gC(d)|0;a:do if(g|0){j=e&255;i=g+16|0;f=g;h=j;while(1){a[(c[f+16>>2]|0)+159>>0]=h;f=hC(d,f)|0;if(!f)break;eP(g,f)|0;h=a[(c[i>>2]|0)+159>>0]|0}b=b+16|0;switch(e|0){case 3:case 2:{f=c[b>>2]|0;h=c[f+224>>2]|0;if(h){g=eP(h,g)|0;f=c[b>>2]|0}c[f+224>>2]=g;break}case 5:case 4:{f=c[b>>2]|0;h=c[f+228>>2]|0;if(h){g=eP(h,g)|0;f=c[b>>2]|0}c[f+228>>2]=g;break}default:break a}switch(e|0){case 3:{f=f+224|0;break}case 5:{f=f+228|0;break}default:break a}a[(c[(c[f>>2]|0)+16>>2]|0)+159>>0]=j}while(0);return}function Mj(a){a=a|0;return (h2(HB(a)|0,108307,7)|0)==0|0}function Nj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;g=m;if(!(gk(b)|0)){j=b+16|0;do if(DP(b)|0)if(!d){c[(c[j>>2]|0)+204>>2]=0;d=b;break}else{c[(c[j>>2]|0)+204>>2]=(c[(c[d+16>>2]|0)+204>>2]|0)+1;hk(b,d);d=b;break}while(0);e=MD(b)|0;while(1){if(!e)break;Nj(e,d);e=ND(e)|0}a:do if(DP(b)|0){e=gC(b)|0;while(1){if(!e)break a;f=(c[e+16>>2]|0)+212|0;if(!(c[f>>2]|0))c[f>>2]=b;e=hC(b,e)|0}}while(0);d=d+16|0;switch(ik(b)|0){case 3:{a[(c[d>>2]|0)+241>>0]=1;k=19;break}case 2:{k=19;break}case 5:{a[(c[d>>2]|0)+242>>0]=1;k=21;break}case 4:{k=21;break}case 1:{jk(b)|0;break}case 6:break;default:{e=HB(b)|0;f=NA(b,87443)|0;c[g>>2]=e;c[g+4>>2]=f;dA(0,87626,g)|0}}if((k|0)==19){k=jk(b)|0;k=kk(k,c[(c[d>>2]|0)+208>>2]|0)|0;c[(c[d>>2]|0)+208>>2]=k}else if((k|0)==21){k=jk(b)|0;k=kk(k,c[(c[d>>2]|0)+212>>2]|0)|0;c[(c[d>>2]|0)+212>>2]=k}if((DP(b)|0?(h=c[j>>2]|0,i=c[h+208>>2]|0,i|0):0)?(i|0)==(c[h+212>>2]|0):0){i=jk(b)|0;k=c[j>>2]|0;c[k+208>>2]=i;c[k+212>>2]=i}}l=m;return}function Oj(a,b){a=a|0;b=b|0;var d=0,e=0;c[46789]=0;d=gC(a)|0;while(1){if(!d)break;if((Vj(d)|0)==(d|0)){e=Yj(b,HB(d)|0)|0;c[(c[d+16>>2]|0)+148>>2]=e}d=hC(a,d)|0}d=gC(a)|0;while(1){if(!d)break;b=d+16|0;if(!(c[(c[b>>2]|0)+148>>2]|0)){e=c[(c[(Vj(d)|0)+16>>2]|0)+148>>2]|0;c[(c[b>>2]|0)+148>>2]=e}d=hC(a,d)|0}return}function Pj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=gC(a)|0;while(1){if(!h)break;d=c[(c[h+16>>2]|0)+148>>2]|0;i=UA(a,h)|0;while(1){if(!i)break;do if((bk(i)|0)==0?(j=i+-48|0,k=c[(c[(Vj(c[((c[i>>2]&3|0)==2?i:j)+40>>2]|0)|0)+16>>2]|0)+148>>2]|0,(d|0)!=(k|0)):0){f=c[i>>2]&3;g=i+48|0;e=((f|0)==3?i:g)+40|0;f=c[(c[(c[((f|0)==2?i:j)+40>>2]|0)+16>>2]|0)+212>>2]|0;if(!(ck(i)|0)){if((ak(c[(c[(c[e>>2]|0)+16>>2]|0)+212>>2]|0)|0)==0?(ak(f)|0)==0:0){dk(b,d,k,i);break}ek(b,d,k,i);break}else{f=Vj(c[e>>2]|0)|0;e=c[i>>2]&3;if((f|0)!=(c[(c[(c[(c[(c[((e|0)==3?i:g)+40>>2]|0)+16>>2]|0)+212>>2]|0)+16>>2]|0)+212>>2]|0)?(g=Vj(c[((e|0)==2?i:j)+40>>2]|0)|0,(g|0)!=(c[(c[(c[(c[(c[((c[i>>2]&3|0)==2?i:j)+40>>2]|0)+16>>2]|0)+212>>2]|0)+16>>2]|0)+208>>2]|0)):0)e=k;else{e=d;d=k}dk(b,d,e,i);break}}while(0);i=WA(a,i)|0}h=hC(a,h)|0}return}function Qj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;if((DP(a)|0)!=0?(ak(a)|0)!=0:0){i=gC(a)|0;while(1){f=(d|0)!=0;h=(e|0)!=0;if(!i)break;if(!(XA(a,i)|0)){g=c[(c[(Vj(i)|0)+16>>2]|0)+148>>2]|0;if(!f)d=Yj(b,87524)|0;fB(b,d,g,0,1)|0}if(!(UA(a,i)|0)){f=c[(c[(Vj(i)|0)+16>>2]|0)+148>>2]|0;if(!h)e=Yj(b,87529)|0;fB(b,f,e,0,1)|0}i=hC(a,i)|0}if(h&f){$j(fB(b,d,e,0,1)|0,0,1e3);f=d}else f=d}else f=d;d=MD(a)|0;while(1){if(!d)break;Qj(d,b,f,e);d=ND(d)|0}return}function Rj(b){b=b|0;var d=0,e=0;d=gC(b)|0;while(1){if(!d)break;e=c[d+16>>2]|0;a[e+158>>0]=0;a[e+157>>0]=0;d=hC(b,d)|0}d=gC(b)|0;while(1){if(!d)break;Zj(b,d);d=hC(b,d)|0}return}function Sj(a){a=a|0;var b=0,d=0,e=0,f=0;b=gC(a)|0;while(1){if(!b)break;c[(c[b+16>>2]|0)+128>>2]=0;b=hC(a,b)|0}b=0;e=gC(a)|0;while(1){if(!e)break;d=b+1|0;if(!(c[(c[e+16>>2]|0)+128>>2]|0)){Xj(a,e,d);b=d}e=hC(a,e)|0}a:do if((b|0)>1){f=Yj(a,87518)|0;d=1;e=gC(a)|0;while(1){if(!e)break a;if((c[(c[e+16>>2]|0)+128>>2]|0)==(d|0)){fB(a,f,e,0,1)|0;d=d+1|0}e=hC(a,e)|0}}while(0);return b|0}function Tj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;g=gC(a)|0;while(1){if(!g)break;h=g+16|0;f=UA(a,g)|0;while(1){if(!f)break;b=c[h>>2]|0;d=c[b+180>>2]|0;b=(c[b+184>>2]<<2)+8|0;if(!d)b=IK(b)|0;else b=KK(d,b)|0;d=c[h>>2]|0;c[d+180>>2]=b;d=d+184|0;e=c[d>>2]|0;c[d>>2]=e+1;c[b+(e<<2)>>2]=f;e=c[h>>2]|0;c[(c[e+180>>2]|0)+(c[e+184>>2]<<2)>>2]=0;e=f+-48|0;d=c[(c[((c[f>>2]&3|0)==2?f:e)+40>>2]|0)+16>>2]|0;b=c[d+172>>2]|0;d=(c[d+176>>2]<<2)+8|0;if(!b)b=IK(d)|0;else b=KK(b,d)|0;c[(c[(c[((c[f>>2]&3|0)==2?f:e)+40>>2]|0)+16>>2]|0)+172>>2]=b;i=c[(c[((c[f>>2]&3|0)==2?f:e)+40>>2]|0)+16>>2]|0;b=c[i+172>>2]|0;i=i+176|0;d=c[i>>2]|0;c[i>>2]=d+1;c[b+(d<<2)>>2]=f;e=c[(c[((c[f>>2]&3|0)==2?f:e)+40>>2]|0)+16>>2]|0;c[(c[e+172>>2]|0)+(c[e+176>>2]<<2)>>2]=0;f=WA(a,f)|0}g=hC(a,g)|0}return}function Uj(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;n=a+16|0;p=c[n>>2]|0;b[p+236>>1]=32767;b[p+238>>1]=-1;a:do if((f|0)>1){h=HK((f<<2)+4|0)|0;g=f+1|0;f=1;while(1){if((f|0)==(g|0)){m=h;o=h;break a}c[h+(f<<2)>>2]=32767;f=f+1|0}}else{m=0;o=0}while(0);p=(m|0)!=0;h=gC(a)|0;while(1){if(!h)break;i=c[(c[(c[(Vj(h)|0)+16>>2]|0)+148>>2]|0)+16>>2]|0;j=c[i+232>>2]|0;k=c[h+16>>2]|0;c[k+232>>2]=j;f=c[n>>2]|0;g=f+238|0;l=j&65535;if((b[g>>1]|0)<(j|0))b[g>>1]=l;f=f+236|0;if((b[f>>1]|0)>(j|0))b[f>>1]=l;if(p){l=c[i+128>>2]|0;c[k+128>>2]=l;l=m+(l<<2)|0;k=c[l>>2]|0;c[l>>2]=(k|0)<(j|0)?k:j}h=hC(a,h)|0}b:do if(!p){m=b[(c[n>>2]|0)+236>>1]|0;g=m<<16>>16;if(m<<16>>16>0){f=gC(a)|0;while(1){if(!f)break;m=(c[f+16>>2]|0)+232|0;c[m>>2]=(c[m>>2]|0)-g;f=hC(a,f)|0}f=c[n>>2]|0;n=f+236|0;b[n>>1]=(e[n>>1]|0)-g;f=f+238|0;b[f>>1]=(e[f>>1]|0)-g;f=0}else f=0}else{f=gC(a)|0;while(1){if(!f){f=1;break b}l=c[f+16>>2]|0;n=l+232|0;c[n>>2]=(c[n>>2]|0)-(c[m+(c[l+128>>2]<<2)>>2]|0);f=hC(a,f)|0}}while(0);Wj(a,f);i=gC(d)|0;while(1){if(!i)break;g=i+16|0;f=c[g>>2]|0;h=c[f+172>>2]|0;if(h){l6(h);f=c[g>>2]|0}f=c[f+180>>2]|0;if(f|0)l6(f);i=hC(d,i)|0}l6(c[(c[(gC(a)|0)+16>>2]|0)+112>>2]|0);f=gC(a)|0;while(1){if(!f)break;c[(c[f+16>>2]|0)+112>>2]=0;f=hC(a,f)|0}if(p)l6(o);return}function Vj(a){a=a|0;var b=0,d=0,e=0;b=a+16|0;d=(c[b>>2]|0)+152|0;e=c[d>>2]|0;if(e){if((e|0)!=(a|0)){e=Vj(e)|0;c[(c[b>>2]|0)+152>>2]=e;return e|0}}else c[d>>2]=a;return a|0}function Wj(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=a+16|0;e=1;while(1){f=c[j>>2]|0;if((e|0)>(c[f+180>>2]|0))break;Wj(c[(c[f+184>>2]|0)+(e<<2)>>2]|0,0);e=e+1|0}if((d|0)!=0|(c[f+200>>2]|0)!=0){b[f+236>>1]=32767;b[f+238>>1]=-1;e=0;i=gC(a)|0;while(1){d=c[j>>2]|0;if(!i)break;g=c[(c[i+16>>2]|0)+232>>2]|0;f=d+238|0;h=g&65535;if((b[f>>1]|0)<(g|0))b[f>>1]=h;d=d+236|0;if((b[d>>1]|0)>(g|0)){b[d>>1]=h;e=i}i=hC(a,i)|0}c[d+264>>2]=e}return}function Xj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=(c[b+16>>2]|0)+128|0;a:do if(!(c[e>>2]|0)){c[e>>2]=d;e=UA(a,b)|0;while(1){if(!e)break;Xj(a,c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0,d);e=WA(a,e)|0}e=XA(a,b)|0;while(1){if(!e)break a;Xj(a,c[((c[e>>2]&3|0)==3?e:e+48|0)+40>>2]|0,d);e=YA(a,e)|0}}while(0);return}function Yj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;f=qC(a,b,1)|0;b=f+16|0;c[(c[b>>2]|0)+176>>2]=0;e=HK(20)|0;d=c[b>>2]|0;c[d+172>>2]=e;c[d+184>>2]=0;d=HK(20)|0;b=c[b>>2]|0;c[b+180>>2]=d;d=c[46789]|0;e=b+168|0;if(!d){c[e>>2]=0;c[(c[a+16>>2]|0)+192>>2]=f}else{c[e>>2]=d;c[(c[d+16>>2]|0)+164>>2]=f}c[46789]=f;c[b+164>>2]=0;return f|0}function Zj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=d+16|0;e=c[h>>2]|0;f=e+157|0;if(!(a[f>>0]|0)){a[f>>0]=1;a[e+158>>0]=1;d=UA(b,d)|0;while(1){if(!d)break;e=WA(b,d)|0;f=c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0;g=c[f+16>>2]|0;if(a[g+158>>0]|0){_j(b,d);d=e;continue}if(a[g+157>>0]|0){d=e;continue}Zj(b,f);d=e}a[(c[h>>2]|0)+158>>0]=0}return}function _j(a,b){a=a|0;b=b|0;var d=0,f=0,g=0;d=c[b>>2]&3;g=b+-48|0;f=b+48|0;d=fB(a,c[((d|0)==2?b:g)+40>>2]|0,c[((d|0)==3?b:f)+40>>2]|0,0,0)|0;if(!d){d=c[b>>2]&3;d=fB(a,c[((d|0)==2?b:g)+40>>2]|0,c[((d|0)==3?b:f)+40>>2]|0,0,1)|0}g=c[b+16>>2]|0;$j(d,e[g+170>>1]|0,c[g+156>>2]|0);tC(a,b)|0;return}function $j(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,h=0;a=c[a+16>>2]|0;g=a+170|0;h=e[g>>1]|0;b[g>>1]=(h|0)>(d|0)?h:d;d=a+156|0;c[d>>2]=(c[d>>2]|0)+f;return}function ak(a){a=a|0;return (cP(NA(a,87534)|0,0)|0)&255|0}function bk(b){b=b|0;var d=0,e=0;d=c[47258]|0;if((((d|0)!=0?(e=OA(b,d)|0,(e|0)!=0):0)?(a[e>>0]|0)!=0:0)?(bP(e)|0)<<24>>24==0:0)b=1;else b=0;return b|0}function ck(a){a=a|0;var b=0,d=0;d=c[a>>2]&3;b=c[(c[(c[((d|0)==3?a:a+48|0)+40>>2]|0)+16>>2]|0)+212>>2]|0;a=c[(c[(c[((d|0)==2?a:a+-48|0)+40>>2]|0)+16>>2]|0)+212>>2]|0;if((b|0)==(a|0))return 1;else{d=fk(b,a)|0;return ((d|0)==(b|0)|(d|0)==(a|0))&1|0}return 0}function dk(a,b,d,f){a=a|0;b=b|0;d=d|0;f=f|0;var g=0,h=0,i=0,j=0;j=l;l=l+16|0;h=j;g=fB(a,b,d,0,0)|0;if(!g){g=fB(a,d,b,0,0)|0;if(!g){g=fB(a,b,d,0,1)|0;if(!g){b=HB(b)|0;f=HB(d)|0;c[h>>2]=b;c[h+4>>2]=f;dA(1,87551,h)|0}else i=4}else i=4}else i=4;if((i|0)==4){i=c[f+16>>2]|0;$j(g,e[i+170>>1]|0,c[i+156>>2]|0)}l=j;return}function ek(a,d,f,g){a=a|0;d=d|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+112|0;j=m;i=m+4|0;h=XA(a,d)|0;while(1){if(!h){k=6;break}n=UA(a,c[((c[h>>2]&3|0)==3?h:h+48|0)+40>>2]|0)|0;if(n|0?(c[((c[n>>2]&3|0)==2?n:n+-48|0)+40>>2]|0)==(f|0):0)break;h=YA(a,h)|0}if((k|0)==6){n=c[46790]|0;c[46790]=n+1;c[j>>2]=n;i2(i,87542,j)|0;i=Yj(a,i)|0;n=fB(a,i,d,0,1)|0;i=fB(a,i,f,0,1)|0;f=c[g+16>>2]|0;k=f+156|0;n=(c[n+16>>2]|0)+156|0;c[n>>2]=(c[n>>2]|0)+((c[k>>2]|0)*1e3|0);n=c[i+16>>2]|0;j=n+170|0;b[j>>1]=b[(c[((e[j>>1]|0)>(e[f+170>>1]|0)?i:g)+16>>2]|0)+170>>1]|0;n=n+156|0;c[n>>2]=(c[n>>2]|0)+(c[k>>2]|0)}l=m;return}function fk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;a:while(1){e=a+16|0;while(1){if((a|0)==(b|0))break a;f=c[e>>2]|0;d=c[b+16>>2]|0;if((c[f+204>>2]|0)>=(c[d+204>>2]|0))break;b=c[d+200>>2]|0}a=c[f+200>>2]|0}return a|0}function gk(a){a=a|0;return (gC(a)|0)==0|0}function hk(a,b){a=a|0;b=b|0;c[(c[a+16>>2]|0)+200>>2]=b;Ij(b,a);Hj(b,a);return}function ik(b){b=b|0;var c=0;b=NA(b,87443)|0;if((b|0)!=0?(a[b>>0]|0)!=0:0)if(f2(b,87453)|0)if(f2(b,87457)|0)if(f2(b,87464)|0)if(f2(b,87468)|0)if(!(f2(b,87448)|0))b=1;else c=8;else b=5;else b=4;else b=3;else b=2;else c=8;if((c|0)==8)b=6;return b|0}function jk(a){a=a|0;var b=0,c=0;c=gC(a)|0;a:do if(!c)b=0;else{b=Vj(c)|0;while(1){c=hC(a,c)|0;if(!c)break a;kk(b,c)|0}}while(0);return b|0}function kk(a,b){a=a|0;b=b|0;if(b){a=Vj(a)|0;c[(c[(Vj(b)|0)+16>>2]|0)+152>>2]=a}return a|0}function lk(a,b,d){a=a|0;b=b|0;d=d|0;RC(b,87502,c[d>>2]|0,1)|0;return}function mk(a,b,d){a=a|0;b=b|0;d=d|0;RC(b,87669,c[d+4>>2]|0,1)|0;return}function nk(a,b,d){a=a|0;b=b|0;d=d|0;RC(b,87654,c[d+8>>2]|0,1)|0;return}function ok(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+240|0;m=p+120|0;n=p;c[47262]=DA(b,2,87684,0)|0;k=DA(b,2,87693,0)|0;c[47263]=k;a:do if((k|0)!=0|(c[47262]|0)!=0){k=gC(b)|0;while(1){if(!k)break a;j=0;d=0;i=ZA(b,k)|0;while(1){if(!i){f=0;break}e=c[i>>2]|0;g=e&3;f=c[((g|0)==2?i:i+-48|0)+40>>2]|0;h=i+48|0;b:do if((f|0)!=(c[((g|0)==3?i:h)+40>>2]|0)){g=c[47262]|0;do if((f|0)==(k|0)&(g|0)!=0){f=OA(i,g)|0;if(!(a[f>>0]|0)){e=c[i>>2]|0;break}else{e=j;d=pk(m,d,k,i,f)|0;break b}}while(0);f=c[47263]|0;if((f|0?(c[((e&3|0)==3?i:h)+40>>2]|0)==(k|0):0)?(o=OA(i,f)|0,(a[o>>0]|0)!=0):0)e=pk(n,j,k,i,o)|0;else e=j}else e=j;while(0);j=e;i=_A(b,i,k)|0}while(1){if((f|0)>=(d|0)){e=0;break}e=m+(f*24|0)+4|0;if((c[m+(f*24|0)+8>>2]|0)>1)qk(k,e);e=c[e>>2]|0;if(e|0)l6(e);f=f+1|0}while(1){if((e|0)>=(j|0))break;d=n+(e*24|0)+4|0;if((c[n+(e*24|0)+8>>2]|0)>1)qk(k,d);d=c[d>>2]|0;if(d|0)l6(d);e=e+1|0}k=hC(b,k)|0}}while(0);l=p;return}function pk(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0.0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;s=l;l=l+16|0;n=s;p=s+12|0;q=s+8|0;r=0;while(1){m=b+(r*24|0)|0;if((r|0)>=(d|0)){o=10;break}j=c[m>>2]|0;if((a[j>>0]|0)==(a[g>>0]|0)?(f2(j,g)|0)==0:0){o=5;break}r=r+1|0}do if((o|0)==5){k=b+(r*24|0)+4|0;m=b+(r*24|0)+8|0;j=c[k>>2]|0;if(!j)j=IK((c[m>>2]<<2)+8|0)|0;else j=KK(j,(c[m>>2]<<2)+8|0)|0;c[k>>2]=j;n=c[m>>2]|0;o=n+1|0;c[m>>2]=o;c[j+(n<<2)>>2]=f;c[(c[k>>2]|0)+(o<<2)>>2]=0;o=13}else if((o|0)==10){j=b+(r*24|0)+4|0;k=b+(r*24|0)+8|0;if((d|0)>4){b=HB(e)|0;c[n>>2]=5;c[n+4>>2]=b;dA(1,87702,n)|0;break}else{c[k>>2]=0;t=HK(8)|0;c[j>>2]=t;n=c[k>>2]|0;o=n+1|0;c[k>>2]=o;c[t+(n<<2)>>2]=f;c[(c[j>>2]|0)+(o<<2)>>2]=0;c[m>>2]=g;c[b+(r*24|0)+12>>2]=0;h[b+(r*24|0)+16>>3]=0.0;d=d+1|0;o=13;break}}while(0);if((o|0)==13){FH(f,p,q);j=(c[((c[f>>2]&3|0)==2?f:f+-48|0)+40>>2]|0)==(e|0)?c[q>>2]|0:c[p>>2]|0;if(j){q=b+(r*24|0)+12|0;t=c[q>>2]|0;c[q>>2]=t+1;if(!t)i=+JH(f,j);else i=0.0;h[b+(r*24|0)+16>>3]=i}}l=s;return d|0}function qk(b,d){b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0,j=0,k=0.0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0;x=l;l=l+80|0;t=x+68|0;u=x+64|0;s=x;v=d+4|0;m=c[v>>2]|0;w=b+16|0;n=c[w>>2]|0;q=+h[n+16>>3];r=+h[n+24>>3];j=0;o=0.0;p=0.0;while(1){if((j|0)>=(m|0))break;f=c[(c[d>>2]|0)+(j<<2)>>2]|0;i=c[f>>2]&3;e=c[((i|0)==2?f:f+-48|0)+40>>2]|0;if((e|0)==(b|0))e=c[((i|0)==3?f:f+48|0)+40>>2]|0;i=c[e+16>>2]|0;y=+h[i+16>>3]-q;g=+h[i+24>>3]-r;k=+c2(y,g);j=j+1|0;o=o+y/k;p=p+g/k}k=+c2(o,p);g=+h[n+88>>3]+ +h[n+96>>3];y=+h[n+80>>3];n=g>y+ +(c[(c[(uC(b)|0)+16>>2]|0)+252>>2]|0);e=c[w>>2]|0;if(n)g=+h[e+88>>3]+ +h[e+96>>3];else{g=+h[e+80>>3];g=g+ +(c[(c[(uC(b)|0)+16>>2]|0)+252>>2]|0);e=c[w>>2]|0}y=o/k*g+ +h[e+16>>3];g=p/k*g+ +h[e+24>>3];h[s>>3]=q;m=s+8|0;h[m>>3]=r;h[s+16>>3]=(q*2.0+y)/3.0;h[s+24>>3]=(r*2.0+g)/3.0;h[s+32>>3]=(q+y*2.0)/3.0;h[s+40>>3]=(r+g*2.0)/3.0;h[s+48>>3]=y;h[s+56>>3]=g;_N(b,s);n=c[w>>2]|0;g=+h[s>>3]-+h[n+16>>3];k=+h[m>>3]-+h[n+24>>3];g=+(~~(g+(g>=0.0?.5:-.5))|0);k=+(~~(k+(k>=0.0?.5:-.5))|0);y=+h[n+88>>3];s=~~((y+g)*256.0/(y+ +h[n+96>>3]))&255;n=0;while(1){if((n|0)>=(c[v>>2]|0))break;m=c[(c[d>>2]|0)+(n<<2)>>2]|0;FH(m,t,u);while(1){if(!m)break;else f=m;while(1){if(!f){i=m;break}e=c[f>>2]|0;i=f+-48|0;j=f+16|0;if((c[((e&3|0)==2?f:i)+40>>2]|0)==(b|0)){e=c[j>>2]|0;h[e+56>>3]=g;h[e+64>>3]=k;h[e+72>>3]=0.0;c[e+80>>2]=0;a[e+84>>0]=1;a[e+85>>0]=0;a[e+86>>0]=0;a[e+87>>0]=0;a[e+88>>0]=s;a[e+89>>0]=0;c[e+92>>2]=0;e=c[f>>2]|0}if((c[((e&3|0)==3?f:f+48|0)+40>>2]|0)==(b|0)){e=c[j>>2]|0;h[e+16>>3]=g;h[e+24>>3]=k;h[e+32>>3]=0.0;c[e+40>>2]=0;a[e+44>>0]=1;a[e+45>>0]=0;a[e+46>>0]=0;a[e+47>>0]=0;a[e+48>>0]=s;a[e+49>>0]=0;c[e+52>>2]=0}if((a[(c[j>>2]|0)+112>>0]|0)!=1){f=0;continue}e=c[(c[((c[f>>2]&3|0)==2?f:i)+40>>2]|0)+16>>2]|0;if((a[e+156>>0]|0)!=1){f=0;continue}if((c[e+184>>2]|0)!=1){f=0;continue}f=c[c[e+180>>2]>>2]|0}while(1){if(!i)break;e=c[i>>2]|0;j=i+16|0;if((c[((e&3|0)==2?i:i+-48|0)+40>>2]|0)==(b|0)){e=c[j>>2]|0;h[e+56>>3]=g;h[e+64>>3]=k;h[e+72>>3]=0.0;c[e+80>>2]=0;a[e+84>>0]=1;a[e+85>>0]=0;a[e+86>>0]=0;a[e+87>>0]=0;a[e+88>>0]=s;a[e+89>>0]=0;c[e+92>>2]=0;e=c[i>>2]|0}f=i+48|0;if((c[((e&3|0)==3?i:f)+40>>2]|0)==(b|0)){e=c[j>>2]|0;h[e+16>>3]=g;h[e+24>>3]=k;h[e+32>>3]=0.0;c[e+40>>2]=0;a[e+44>>0]=1;a[e+45>>0]=0;a[e+46>>0]=0;a[e+47>>0]=0;a[e+48>>0]=s;a[e+49>>0]=0;c[e+52>>2]=0}if((a[(c[j>>2]|0)+112>>0]|0)!=1){i=0;continue}e=c[(c[((c[i>>2]&3|0)==3?i:f)+40>>2]|0)+16>>2]|0;if((a[e+156>>0]|0)!=1){i=0;continue}if((c[e+176>>2]|0)!=1){i=0;continue}i=c[c[e+172>>2]>>2]|0}m=c[(c[m+16>>2]|0)+172>>2]|0}n=n+1|0}a[(c[w>>2]|0)+145>>0]=1;l=x;return}function rk(a){a=a|0;var b=0,d=0,e=0;fh(a);b=c[a>>2]&3;d=a+-48|0;e=a+48|0;b=ah(c[((b|0)==2?a:d)+40>>2]|0,c[((b|0)==3?a:e)+40>>2]|0)|0;if(!b){b=c[a>>2]&3;kh(c[((b|0)==2?a:d)+40>>2]|0,c[((b|0)==3?a:e)+40>>2]|0,a)|0}else sh(a,b);return}function sk(b){b=b|0;var d=0,e=0,f=0,g=0;f=b+16|0;e=0;while(1){b=c[f>>2]|0;if((e|0)>=(c[b+220>>2]|0))break;d=c[(c[b+216>>2]|0)+(e<<2)>>2]|0;c[b+192>>2]=d;b=d;d=b;while(1){if(!d)break;g=c[d+16>>2]|0;a[g+157>>0]=0;d=c[g+164>>2]|0}while(1){if(!b)break;tk(b);b=c[(c[b+16>>2]|0)+164>>2]|0}e=e+1|0}return}function tk(b){b=b|0;var d=0,e=0,f=0,g=0;g=b+16|0;d=c[g>>2]|0;b=d+157|0;if(!(a[b>>0]|0)){a[b>>0]=1;a[d+158>>0]=1;b=0;while(1){f=c[(c[d+180>>2]|0)+(b<<2)>>2]|0;if(!f)break;d=c[((c[f>>2]&3|0)==2?f:f+-48|0)+40>>2]|0;e=c[d+16>>2]|0;if(!(a[e+158>>0]|0)){if(!(a[e+157>>0]|0))tk(d)}else{rk(f);b=b+-1|0}b=b+1|0;d=c[g>>2]|0}a[d+158>>0]=0}return}function uk(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;e=gC(a)|0;b=0;while(1){if(!e)break;d=UA(a,e)|0;while(1){if(!d)break;g=c[d>>2]&3;h=c[(c[(c[((g|0)==2?d:d+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0;g=c[(c[(c[((g|0)==3?d:d+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0;f=h-g|0;d=WA(a,d)|0;b=((h|0)==(g|0)?0:((f|0)>-1?f:0-f|0)+-1|0)+b|0}e=hC(a,e)|0}return b|0}function vk(b){b=b|0;var d=0,e=0,f=0,g=0;e=gC(b)|0;while(1){if(!e)break;g=c[e+16>>2]|0;f=c[g+176>>2]|0;g=g+172|0;d=0;while(1){if((d|0)>=(f|0))break;a[(c[(c[(c[g>>2]|0)+(d<<2)>>2]|0)+16>>2]|0)+112>>0]=0;d=d+1|0}e=hC(b,e)|0}return}function wk(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0.0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+16|0;p=r;k=c[d+24>>2]|0;xk(b);m=(k|0)==-1;n=d+8|0;j=m^1;o=c[15715]|0;g=1797693134862315708145274.0e284;i=0;while(1){if(!(m|(i|0)<(k|0)))break;e=gC(b)|0;while(1){if(!e)break;c[(c[e+16>>2]|0)+232>>2]=0;e=hC(b,e)|0}tj(b);f=+yk(b);h[n>>3]=f;if(a[195234]|0){h[p>>3]=f;z4(o,87754,p)|0;f=+h[n>>3]}if(!(!(f<=+h[d>>3])&(!(g<=f)|j))){q=9;break}zk(b);g=f;i=i+1|0}if((q|0)==9){q=d+20|0;c[d+16>>2]=c[q>>2];c[q>>2]=i}tj(b);Ak(b);Bk();h[n>>3]=+yk(b);l=r;return}function xk(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0;c[46794]=IK((qB(a)|0)*24|0)|0;c[46793]=0;b=gC(a)|0;while(1){if(!b)break;c[(c[b+16>>2]|0)+120>>2]=-1;b=hC(a,b)|0}l=gC(a)|0;while(1){if(!l)break;f=l+16|0;do if(!(c[(c[f>>2]|0)+216>>2]|0)){j=HK(4)|0;i=c[46794]|0;k=c[46793]|0;c[i+(k*24|0)>>2]=j;c[j>>2]=l;c[i+(k*24|0)+4>>2]=1;j=c[f>>2]|0;h[i+(k*24|0)+8>>3]=+h[j+32>>3];h[i+(k*24|0)+16>>3]=+h[j+40>>3];c[j+120>>2]=k;c[46793]=k+1}else{g=dP(l)|0;i=g+16|0;b=c[i>>2]|0;d=c[b+120>>2]|0;if((d|0)>-1){j=c[46794]|0;i=c[j+(d*24|0)>>2]|0;g=j+(d*24|0)+4|0;k=c[g>>2]|0;c[g>>2]=k+1;c[i+(k<<2)>>2]=l;k=c[f>>2]|0;i=j+(d*24|0)+8|0;h[i>>3]=+h[k+32>>3]+ +h[i>>3];j=j+(d*24|0)+16|0;m=+h[j>>3];n=+h[k+40>>3];h[j>>3]=m>2]=d;break}d=HK(c[b+216>>2]<<2)|0;j=c[46794]|0;k=c[46793]|0;b=j+(k*24|0)|0;c[b>>2]=d;c[d>>2]=g;d=j+(k*24|0)+4|0;e=j+(k*24|0)+8|0;if((g|0)==(l|0)){c[d>>2]=1;d=c[i>>2]|0;h[e>>3]=+h[d+32>>3];e=c[f>>2]|0;b=e}else{c[(c[b>>2]|0)+4>>2]=l;c[d>>2]=2;d=c[i>>2]|0;i=c[f>>2]|0;h[e>>3]=+h[d+32>>3]+ +h[i+32>>3];b=c[(+h[d+40>>3]<+h[i+40>>3]?l:g)+16>>2]|0;e=i}h[j+(k*24|0)+16>>3]=+h[b+40>>3];c[d+120>>2]=k;c[e+120>>2]=k;c[46793]=k+1}while(0);l=hC(a,l)|0}return}function yk(a){a=a|0;var b=0.0,d=0.0,e=0,f=0,g=0,i=0.0,j=0.0;Ak(a);g=c[46791]|0;e=c[a+16>>2]|0;b=+(S(c[e+252>>2]|0,g+-1|0)|0);f=c[46792]|0;e=e+248|0;a=0;d=0.0;while(1){if((a|0)>=(g|0))break;i=+h[f+(a*40|0)+24>>3]+ +(S(c[e>>2]|0,c[f+(a*40|0)+16>>2]|0)|0);j=b+ +h[f+(a*40|0)+32>>3];a=a+1|0;b=j;d=d=(qB(a)|0))break;c[(c[46795]|0)+(b<<2)>>2]=b;b=b+1|0}Ak(a);Ck(a);Dk(a);return}function Ak(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0.0,k=0,l=0,m=0;c[46791]=0;b=c[46792]|0;if(b|0){e=0;while(1){if((e|0)>=(c[46793]|0))break;d=c[b+(e*40|0)+4>>2]|0;if(d){l6(d);b=c[46792]|0}d=c[b+(e*40|0)+8>>2]|0;if(d){l6(d);b=c[46792]|0}e=e+1|0}l6(b)}c[46792]=HK((c[46793]|0)*40|0)|0;b=0;while(1){d=c[46793]|0;if((b|0)>=(d|0))break;l=HK(d<<2)|0;c[(c[46792]|0)+(b*40|0)+4>>2]=l;l=HK(c[46793]<<2)|0;m=c[46792]|0;c[m+(b*40|0)+8>>2]=l;c[m+(b*40|0)>>2]=b;c[m+(b*40|0)+12>>2]=0;c[m+(b*40|0)+16>>2]=0;m=m+(b*40|0)+24|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;b=b+1|0}e=gC(a)|0;while(1){if(!e)break;d=UA(a,e)|0;while(1){if(!d)break;i=c[d>>2]|0;f=d+-48|0;g=c[46792]|0;b=c[(c[(c[((i&3|0)==3?d:d+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0;while(1){b=b+1|0;if((b|0)>=(c[(c[(c[((i&3|0)==2?d:f)+40>>2]|0)+16>>2]|0)+232>>2]|0))break;i=g+(b*40|0)+16|0;c[i>>2]=(c[i>>2]|0)+1;i=c[d>>2]|0}d=WA(a,d)|0}e=hC(a,e)|0}k=c[46793]|0;l=c[46794]|0;m=c[46792]|0;d=a+16|0;b=0;while(1){if((b|0)>=(k|0))break;e=l+(b*24|0)|0;f=(c[c[e>>2]>>2]|0)+16|0;g=c[(c[f>>2]|0)+232>>2]|0;if((g|0)>=(c[46791]|0))c[46791]=g+1;i=m+(g*40|0)+24|0;j=+h[i>>3];h[i>>3]=j+(+h[l+(b*24|0)+8>>3]*72.0+(j>0.0?+(c[(c[d>>2]|0)+248>>2]|0):0.0));i=m+(g*40|0)+32|0;j=+h[l+(b*24|0)+16>>3]*72.0;if(+h[i>>3]>3]=j;c[(c[m+(g*40|0)+4>>2]|0)+(c[m+(g*40|0)+12>>2]<<2)>>2]=e;a=m+((c[(c[f>>2]|0)+232>>2]|0)*40|0)+12|0;c[a>>2]=(c[a>>2]|0)+1;b=b+1|0}return}function Bk(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;k=c[46791]|0;l=c[46792]|0;j=0;b=0;a=0;while(1){if((j|0)>=(k|0))break;i=c[l+(j*40|0)+12>>2]|0;d=l+(j*40|0)|0;e=(b|0)==0;a:do if(i)if(!e){if((c[d>>2]|0)>(a|0)){f=l+(j*40|0)+4|0;d=0;while(1){if((d|0)>=(i|0))break a;g=c[(c[f>>2]|0)+(d<<2)>>2]|0;h=c[g+4>>2]|0;e=0;while(1){if((e|0)>=(h|0))break;m=(c[(c[(c[g>>2]|0)+(e<<2)>>2]|0)+16>>2]|0)+232|0;c[m>>2]=(c[m>>2]|0)-b;e=e+1|0}d=d+1|0}}}else b=0;else{if(e)a=c[d>>2]|0;b=b+1|0}while(0);j=j+1|0}return}function Ck(a){a=a|0;var b=0;b=c[46795]|0;k3(b,qB(a)|0,4,63);return}function Dk(b){b=b|0;var d=0.0,e=0,f=0.0,g=0,i=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0;k=c[46791]|0;l=c[46792]|0;i=c[46795]|0;j=0;while(1){if((j|0)>=(k|0)){e=0;f=0.0;break}e=c[i+(j<<2)>>2]|0;g=j+1|0;if((c[l+(e*40|0)+12>>2]|0)<2)j=g;else{m=4;break}}if((m|0)==4)if((k|0)>(g|0))f=+h[l+((c[i+(g<<2)>>2]|0)*40|0)+24>>3];else f=0.0;a:do if((j|0)!=(k|0)){k3(c[l+(e*40|0)+4>>2]|0,c[l+(e*40|0)+12>>2]|0,4,64);g=c[46792]|0;d=+h[g+(e*40|0)+24>>3];if(!(!(f<=d*.25)?!(f>=d*3.0*.25):0))f=d*.5;t=c[g+(e*40|0)+12>>2]|0;s=b+16|0;p=0;q=0;d=0.0;i=0;r=0;while(1){if((r|0)>=(i+t|0))break a;do if(!(c[(c[g+(e*40|0)+8>>2]|0)+(r<<2)>>2]|0)){m=c[(c[g+(e*40|0)+4>>2]|0)+(r<<2)>>2]|0;b=m+8|0;n=+h[b>>3]*72.0;o=d>0.0?+(c[(c[s>>2]|0)+248>>2]|0):0.0;j=(q|0)!=0;if(!(j&!(d+n+o<=f))){k=j?p:m;j=j?q:1;d=d+(n+o);break}k=p+4|0;l=m+4|0;j=0;while(1){if((j|0)<(c[k>>2]|0))g=0;else break;while(1){if((g|0)>=(c[l>>2]|0))break;a[(c[(kh(c[(c[p>>2]|0)+(j<<2)>>2]|0,c[(c[m>>2]|0)+(g<<2)>>2]|0,0)|0)+16>>2]|0)+112>>0]=1;g=g+1|0}j=j+1|0}g=c[46792]|0;c[(c[g+(e*40|0)+8>>2]|0)+(r<<2)>>2]=1;k=g+(e*40|0)+12|0;c[k>>2]=(c[k>>2]|0)+-1;k=g+(e*40|0)+16|0;c[k>>2]=(c[k>>2]|0)+1;k=g+(e*40|0)+24|0;h[k>>3]=+h[k>>3]-(+h[b>>3]*72.0+ +(c[(c[s>>2]|0)+248>>2]|0));k=p;j=q}else{k=p;j=q;i=i+1|0}while(0);p=k;q=j;r=r+1|0}}while(0);return}function Ek(a,b){a=a|0;b=b|0;a=Fk(c[a>>2]|0)|0;b=Fk(c[b>>2]|0)|0;return ((b|0)<(a|0)&1)-((b|0)>(a|0)&1)|0}function Fk(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;f=a+4|0;d=0;b=0;while(1){if((d|0)>=(c[f>>2]|0))break;e=c[(c[a>>2]|0)+(d<<2)>>2]|0;g=uC(e)|0;e=UA(g,e)|0;while(1){if(!e)break;e=WA(g,e)|0;b=b+1|0}d=d+1|0}return b|0}function Gk(a,b){a=a|0;b=b|0;var d=0.0,e=0.0,f=0;f=c[46792]|0;e=+h[f+((c[b>>2]|0)*40|0)+24>>3];d=+h[f+((c[a>>2]|0)*40|0)+24>>3];return (e>d&1)-(e>2]|0)+216>>2]=0;b=hC(a,b)|0}return}function Ik(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;g=l;l=l+32|0;f=g+16|0;e=g+8|0;d=g+20|0;c[d>>2]=5;a=NA(a,99906)|0;if(a|0?(c[e>>2]=g,c[e+4>>2]=d,(q4(a,87769,e)|0)>=1):0)dA(0,87776,f)|0;c[b+24>>2]=0;c[b+32>>2]=0;l=g;return 0}function Jk(b){b=b|0;var d=0,e=0;d=c[47258]|0;if((((d|0)!=0?(e=OA(b,d)|0,(e|0)!=0):0)?(a[e>>0]|0)!=0:0)?(bP(e)|0)<<24>>24==0:0)b=1;else b=0;return b|0}function Kk(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;dl(a);b=gC(a)|0;while(1){if(!b)break;d=UA(a,b)|0;while(1){if(!d)break;do if(((c[(c[d+16>>2]|0)+172>>2]|0)==0?(Jk(d)|0)==0:0)?(e=d+48|0,f=dP(c[((c[d>>2]&3|0)==3?d:e)+40>>2]|0)|0,g=d+-48|0,h=dP(c[((c[d>>2]&3|0)==2?d:g)+40>>2]|0)|0,(f|0)!=(h|0)):0){if((c[(c[f+16>>2]|0)+212>>2]|0)==0?(c[(c[h+16>>2]|0)+212>>2]|0)==0:0){i=ah(f,h)|0;if(!i){kh(f,h,d)|0;break}else{sh(d,i);break}}i=c[d>>2]&3;Lk(a,c[((i|0)==3?d:e)+40>>2]|0,c[((i|0)==2?d:g)+40>>2]|0,d)}while(0);d=WA(a,d)|0}b=hC(a,b)|0}return}function Lk(b,d,f,g){b=b|0;d=d|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;j=c[g>>2]&3;h=c[(c[((j|0)==3?g:g+48|0)+40>>2]|0)+16>>2]|0;i=c[h+212>>2]|0;if(!i)k=0;else k=(c[h+232>>2]|0)-(c[(c[(c[(c[i+16>>2]|0)+264>>2]|0)+16>>2]|0)+232>>2]|0)|0;h=c[(c[((j|0)==2?g:g+-48|0)+40>>2]|0)+16>>2]|0;i=c[h+212>>2]|0;if(!i)h=0;else h=(c[h+232>>2]|0)-(c[(c[(c[(c[i+16>>2]|0)+264>>2]|0)+16>>2]|0)+232>>2]|0)|0;j=g+16|0;k=k-h+(e[(c[j>>2]|0)+170>>1]|0)|0;b=ph(b)|0;a[(c[b+16>>2]|0)+156>>0]=2;i=dP(d)|0;d=dP(f)|0;f=Wi(b,i,(k|0)>0?0.0:+(0-k|0),(c[(c[j>>2]|0)+156>>2]|0)*10|0)|0;c[(c[(Wi(b,d,+(((k|0)>0?k:0)|0),c[(c[j>>2]|0)+156>>2]|0)|0)+16>>2]|0)+116>>2]=g;c[(c[f+16>>2]|0)+116>>2]=g;return}function Mk(a,d,f,g){a=a|0;d=d|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;k=c[d>>2]&3;j=(k|0)==3?d:d+48|0;k=(k|0)==2?d:d+-48|0;k=c[(c[(c[((c[(c[(c[j+40>>2]|0)+16>>2]|0)+232>>2]|0)>(c[(c[(c[k+40>>2]|0)+16>>2]|0)+232>>2]|0)?j:k)+40>>2]|0)+16>>2]|0)+232>>2]|0;j=d+16|0;h=c[j>>2]|0;d=h+172|0;if(c[d>>2]|0)Aa(87865,87887,148,87896);c[d>>2]=f;i=(g|0)==0;d=f;while(1){g=c[d+16>>2]|0;if(!i){f=g+168|0;b[f>>1]=(e[f>>1]|0)+(e[h+168>>1]|0)}f=g+154|0;b[f>>1]=(e[f>>1]|0)+(e[h+154>>1]|0);g=g+156|0;c[g>>2]=(c[g>>2]|0)+(c[h+156>>2]|0);g=d+-48|0;h=c[((c[d>>2]&3|0)==2?d:g)+40>>2]|0;if((c[(c[h+16>>2]|0)+232>>2]|0)==(k|0))break;Nk(a,h);d=c[c[(c[(c[((c[d>>2]&3|0)==2?d:g)+40>>2]|0)+16>>2]|0)+180>>2]>>2]|0;if(!d)break;h=c[j>>2]|0}return}function Nk(a,b){a=a|0;b=b|0;var d=0.0;d=+((c[(c[a+16>>2]|0)+248>>2]|0)/2|0|0);b=c[b+16>>2]|0;a=b+88|0;h[a>>3]=+h[a>>3]+d;b=b+96|0;h[b>>3]=d+ +h[b>>3];return}function Ok(a,b){a=a|0;b=b|0;var d=0,e=0;if(((((a|0)!=0&(b|0)!=0?(e=c[a>>2]&3,d=c[b>>2]&3,(c[((e|0)==3?a:a+48|0)+40>>2]|0)==(c[((d|0)==3?b:b+48|0)+40>>2]|0)):0)?(c[((e|0)==2?a:a+-48|0)+40>>2]|0)==(c[((d|0)==2?b:b+-48|0)+40>>2]|0):0)?(c[(c[a+16>>2]|0)+96>>2]|0)==(c[(c[b+16>>2]|0)+96>>2]|0):0)?(rj(a,b)|0)!=0:0)a=1;else a=0;return a|0}function Pk(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=b+16|0;d=c[t>>2]|0;c[d+192>>2]=0;c[d+232>>2]=0;dl(b);d=1;while(1){e=c[t>>2]|0;if((d|0)>(c[e+180>>2]|0))break;el(b,c[(c[e+184>>2]|0)+(d<<2)>>2]|0);d=d+1|0}h=gC(b)|0;while(1){if(!h)break;g=UA(b,h)|0;while(1){if(!g)break;d=c[g>>2]|0;e=(c[(c[((d&3|0)==2?g:g+-48|0)+40>>2]|0)+16>>2]|0)+160|0;f=a[e>>0]|0;if(f<<24>>24<3){a[e>>0]=f+1<<24>>24;d=c[g>>2]|0}d=(c[(c[((d&3|0)==3?g:g+48|0)+40>>2]|0)+16>>2]|0)+160|0;e=a[d>>0]|0;if(e<<24>>24<3)a[d>>0]=e+1<<24>>24;g=WA(b,g)|0}h=hC(b,h)|0}m=gC(b)|0;while(1){if(!m)break;if((c[(c[m+16>>2]|0)+212>>2]|0)==0?(m|0)==(dP(m)|0):0){lh(b,m);l=(c[t>>2]|0)+232|0;c[l>>2]=(c[l>>2]|0)+1}d=0;l=UA(b,m)|0;while(1){if(!l)break;i=l+16|0;e=c[i>>2]|0;a:do if(!(c[e+172>>2]|0)){j=l+48|0;k=l+-48|0;f=d+16|0;if(Qk(l)|0){if(!(Ok(d,l)|0)){Rk(b,l);d=l;break}e=c[(c[f>>2]|0)+172>>2]|0;if(e|0){Mk(b,l,e,0);gh(l);break}i=c[l>>2]&3;if((c[(c[(c[((i|0)==3?l:j)+40>>2]|0)+16>>2]|0)+232>>2]|0)!=(c[(c[(c[((i|0)==2?l:k)+40>>2]|0)+16>>2]|0)+232>>2]|0))break;sh(l,d);gh(l);break}if((d|0?(s=c[l>>2]&3,n=c[((s|0)==3?l:j)+40>>2]|0,o=c[d>>2]&3,(n|0)==(c[((o|0)==3?d:d+48|0)+40>>2]|0)):0)?(p=c[((s|0)==2?l:k)+40>>2]|0,(p|0)==(c[((o|0)==2?d:d+-48|0)+40>>2]|0)):0){if((c[(c[n+16>>2]|0)+232>>2]|0)==(c[(c[p+16>>2]|0)+232>>2]|0)){sh(l,d);gh(l);break}if(((c[e+96>>2]|0)==0?(c[(c[f>>2]|0)+96>>2]|0)==0:0)?rj(l,d)|0:0)if(!(a[195236]|0)){Mk(b,l,c[(c[f>>2]|0)+172>>2]|0,1);gh(l);break}else{a[(c[i>>2]|0)+112>>0]=6;break}}h=c[l>>2]&3;e=c[((h|0)==3?l:j)+40>>2]|0;if((e|0)==(c[((h|0)==2?l:k)+40>>2]|0)){gh(l);d=l;break}e=dP(e)|0;f=dP(c[((c[l>>2]&3|0)==2?l:k)+40>>2]|0)|0;h=c[l>>2]&3;if((c[((h|0)==3?l:j)+40>>2]|0)==(e|0)?(c[((h|0)==2?l:k)+40>>2]|0)==(f|0):0){g=c[(c[e+16>>2]|0)+232>>2]|0;h=c[(c[f+16>>2]|0)+232>>2]|0;if((g|0)==(h|0)){qh(b,l);d=l;break}if((h|0)>(g|0)){Sk(b,e,f,l);d=l;break}e=fB(b,f,e,0,0)|0;do if(e|0?(q=c[e>>2]&3,r=c[((q|0)==2?e:e+-48|0)+40>>2]|0,(r|0)!=(c[((c[l>>2]&3|0)==2?l:k)+40>>2]|0)):0){f=e+16|0;if(!(c[(c[f>>2]|0)+172>>2]|0))Sk(b,c[((q|0)==3?e:e+48|0)+40>>2]|0,r,e);if((c[(c[i>>2]|0)+96>>2]|0)==0?(c[(c[f>>2]|0)+96>>2]|0)==0:0){if(!(rj(l,e)|0))break;if(!(a[195236]|0)){gh(l);Mk(b,l,c[(c[f>>2]|0)+172>>2]|0,1);break a}else{a[(c[i>>2]|0)+112>>0]=6;a[(c[f>>2]|0)+153>>0]=1;break a}}}while(0);d=c[l>>2]&3;Sk(b,c[((d|0)==2?l:k)+40>>2]|0,c[((d|0)==3?l:j)+40>>2]|0,l);d=l}}else d=l;while(0);l=WA(b,l)|0}m=hC(b,m)|0}if((dg(b)|0)!=(b|0)){d=c[(c[t>>2]|0)+216>>2]|0;if(!d)d=IK(4)|0;else d=KK(d,4)|0;t=c[t>>2]|0;c[t+216>>2]=d;c[d>>2]=c[t+192>>2]}return}function Qk(b){b=b|0;var d=0;d=c[b>>2]&3;if((a[(c[(c[((d|0)==3?b:b+48|0)+40>>2]|0)+16>>2]|0)+159>>0]|0)==7)b=1;else b=(a[(c[(c[((d|0)==2?b:b+-48|0)+40>>2]|0)+16>>2]|0)+159>>0]|0)==7;return b&1|0}function Rk(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;f=Vk(c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0)|0;g=Vk(c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)|0;i=(c[(c[f+16>>2]|0)+232>>2]|0)>(c[(c[g+16>>2]|0)+232>>2]|0);e=i?f:g;f=i?g:f;g=f+16|0;i=e+16|0;a:do if((c[(c[g>>2]|0)+212>>2]|0)!=(c[(c[i>>2]|0)+212>>2]|0)){h=ah(f,e)|0;if(h|0){Mk(b,d,h,1);break}if((c[(c[g>>2]|0)+232>>2]|0)!=(c[(c[i>>2]|0)+232>>2]|0)){Sk(b,f,e,d);e=(c[d+16>>2]|0)+172|0;while(1){e=c[e>>2]|0;if(!e)break a;f=e+-48|0;if((c[(c[(c[((c[e>>2]&3|0)==2?e:f)+40>>2]|0)+16>>2]|0)+232>>2]|0)>(c[(c[i>>2]|0)+232>>2]|0))break a;a[(c[e+16>>2]|0)+112>>0]=5;e=c[(c[(c[((c[e>>2]&3|0)==2?e:f)+40>>2]|0)+16>>2]|0)+180>>2]|0}}}while(0);return}function Sk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=e+16|0;f=c[k>>2]|0;g=b+16|0;j=d+16|0;if(!(c[f+96>>2]|0))i=-1;else i=((c[(c[j>>2]|0)+232>>2]|0)+(c[(c[g>>2]|0)+232>>2]|0)|0)/2|0;if(c[f+172>>2]|0)Aa(87908,87887,89,87933);h=c[(c[g>>2]|0)+232>>2]|0;while(1){g=h+1|0;f=c[(c[j>>2]|0)+232>>2]|0;if((h|0)>=(f|0))break;if((g|0)<(f|0)){if((g|0)==(i|0))f=Tk(a,e)|0;else f=Uk(a)|0;c[(c[f+16>>2]|0)+232>>2]=g}else f=d;Fi(kh(b,f,e)|0);h=g;b=f}if(!(c[(c[k>>2]|0)+172>>2]|0))Aa(87944,87887,103,87933);else return}function Tk(b,d){b=b|0;d=d|0;var e=0.0,f=0.0,g=0,i=0,j=0.0;i=d+16|0;g=c[(c[i>>2]|0)+96>>2]|0;e=+h[g+24>>3];f=+h[g+32>>3];g=ph(b)|0;d=g+16|0;c[(c[d>>2]|0)+104>>2]=c[(c[i>>2]|0)+96>>2];j=+(c[(c[(vC(g)|0)+16>>2]|0)+248>>2]|0);h[(c[d>>2]|0)+88>>3]=j;if(!(a[(c[i>>2]|0)+114>>0]|0)){b=(c[(c[(vC(b)|0)+16>>2]|0)+116>>2]&1|0)==0;i=c[d>>2]|0;h[i+80>>3]=b?f:e;h[i+96>>3]=b?e:f}return g|0}function Uk(a){a=a|0;var b=0;b=ph(a)|0;Nk(a,b);return b|0}function Vk(b){b=b|0;var d=0;d=c[b+16>>2]|0;if((a[d+159>>0]|0)==7)b=c[(c[(c[(c[d+212>>2]|0)+16>>2]|0)+268>>2]|0)+(c[d+232>>2]<<2)>>2]|0;else b=dP(b)|0;return b|0}function Wk(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=dg(a)|0;h=gC(a)|0;while(1){if(!h)break;b=ZA(j,h)|0;i=0;while(1){if(!b)break;l=_A(j,b,h)|0;if(EC(a,b)|0){k=i;b=l;i=k;continue}k=(c[b>>2]&3|0)==2?b:b+-48|0;m=(Ok(i,k)|0)==0;e=c[k>>2]&3;b=c[((e|0)==3?k:k+48|0)+40>>2]|0;d=c[(c[b+16>>2]|0)+232>>2]|0;e=c[((e|0)==2?k:k+-48|0)+40>>2]|0;f=c[(c[e+16>>2]|0)+232>>2]|0;g=(d|0)==(f|0);if(!m){c[(c[k+16>>2]|0)+172>>2]=g?i:0;b=c[(c[i+16>>2]|0)+172>>2]|0;if(!b){m=i;b=l;i=m;continue}Mk(a,k,b,0);hh(k);m=i;b=l;i=m;continue}if(!g)if((f|0)>(d|0)){Xk(b,e,k);b=l;i=k;continue}else{Xk(e,b,k);b=l;i=k;continue}b=ch(b,e)|0;if(!b){qh(j,k);b=l;i=k;continue}if((k|0)==(b|0)){m=i;b=l;i=m;continue}hh(k);if(c[(c[k+16>>2]|0)+172>>2]|0){m=i;b=l;i=m;continue}sh(k,b);m=i;b=l;i=m}h=hC(a,h)|0}return}function Xk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=Yk(a)|0;e=Yk(b)|0;Zk(f,e,d,c[(c[d+16>>2]|0)+172>>2]|0,(f|0)==(a|0)&(e|0)==(b|0)?1:5);return}function Yk(b){b=b|0;var d=0,e=0,f=0;d=c[b+16>>2]|0;e=c[d+212>>2]|0;if((e|0)!=0?(f=c[e+16>>2]|0,(a[f+272>>0]|0)==0):0)b=c[(c[f+268>>2]|0)+(c[d+232>>2]<<2)>>2]|0;return b|0}function Zk(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0;n=d+16|0;l=c[(c[n>>2]|0)+232>>2]|0;o=e+16|0;j=c[(c[o>>2]|0)+232>>2]|0;if((j|0)<=(l|0))Aa(87969,87997,81,88007);m=c[g>>2]&3;if(!((c[((m|0)==3?g:g+48|0)+40>>2]|0)==(d|0)?(c[((m|0)==2?g:g+-48|0)+40>>2]|0)==(e|0):0))i=5;a:do if((i|0)==5){i=f+16|0;if((b[(c[g+16>>2]|0)+168>>1]|0)>1){c[(c[i>>2]|0)+172>>2]=0;if(((j-l|0)==1?(k=ah(d,e)|0,k|0):0)?rj(f,k)|0:0){sh(f,k);if(a[(c[n>>2]|0)+156>>0]|0)break;if(a[(c[o>>2]|0)+156>>0]|0)break;gh(f);break}m=h&255;h=d;l=c[(c[n>>2]|0)+232>>2]|0;while(1){i=c[(c[o>>2]|0)+232>>2]|0;if((l|0)>=(i|0))break a;if((l|0)<(i+-1|0)){i=dg(d)|0;j=g+-48|0;i=_k(i,c[((c[g>>2]&3|0)==2?g:j)+40>>2]|0)|0;k=g}else{i=e;j=g+-48|0;k=g}a[(c[(kh(h,i,f)|0)+16>>2]|0)+112>>0]=m;n=(c[g+16>>2]|0)+168|0;b[n>>1]=(b[n>>1]|0)+-1<<16>>16;h=i;l=l+1|0;g=c[c[(c[(c[((c[k>>2]&3|0)==2?g:j)+40>>2]|0)+16>>2]|0)+180>>2]>>2]|0}}do if((j-l|0)==1){g=ah(d,e)|0;if(g|0?rj(f,g)|0:0){c[(c[i>>2]|0)+172>>2]=g;m=c[g+16>>2]|0;a[m+112>>0]=h;m=m+168|0;b[m>>1]=(b[m>>1]|0)+1<<16>>16;if(a[(c[n>>2]|0)+156>>0]|0)break;if(a[(c[o>>2]|0)+156>>0]|0)break;gh(f);break}c[(c[i>>2]|0)+172>>2]=0;g=kh(d,e,f)|0;a[(c[g+16>>2]|0)+112>>0]=h}while(0);l=c[(c[o>>2]|0)+232>>2]|0;if((l-(c[(c[n>>2]|0)+232>>2]|0)|0)>1){if((c[((c[g>>2]&3|0)==3?g:g+48|0)+40>>2]|0)!=(d|0)){c[(c[i>>2]|0)+172>>2]=0;l=kh(d,c[((c[g>>2]&3|0)==2?g:g+-48|0)+40>>2]|0,f)|0;c[(c[i>>2]|0)+172>>2]=l;fh(g);g=l;l=c[(c[o>>2]|0)+232>>2]|0}while(1){i=c[g>>2]&3;j=c[((i|0)==2?g:g+-48|0)+40>>2]|0;k=c[j+16>>2]|0;if((c[k+232>>2]|0)==(l|0))break;g=c[c[k+180>>2]>>2]|0}if((j|0)!=(e|0)){a[(c[(kh(c[((i|0)==3?g:g+48|0)+40>>2]|0,e,f)|0)+16>>2]|0)+112>>0]=h;fh(g)}}}while(0);return}function _k(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=b+16|0;b=c[d>>2]|0;e=c[b+232>>2]|0;$k(a,e,c[b+236>>2]|0,2);b=ph(a)|0;d=c[d>>2]|0;f=c[b+16>>2]|0;h[f+88>>3]=+h[d+88>>3];h[f+96>>3]=+h[d+96>>3];c[f+232>>2]=c[d+232>>2];d=(c[d+236>>2]|0)+1|0;c[f+236>>2]=d;c[(c[(c[(c[a+16>>2]|0)+196>>2]|0)+(e<<6)+4>>2]|0)+(d<<2)>>2]=b;return b|0}function $k(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;h=a+16|0;f=c[(c[h>>2]|0)+196>>2]|0;i=c[f+(b<<6)+4>>2]|0;a:do if((e|0)<1){d=d-e|0;while(1){g=d+1|0;a=c[f+(b<<6)>>2]|0;if((g|0)>=(a|0))break;a=c[i+(g<<2)>>2]|0;f=d+e|0;c[(c[a+16>>2]|0)+236>>2]=f;c[i+(f<<2)>>2]=a;d=g;f=c[(c[h>>2]|0)+196>>2]|0}g=e+-1|0;d=g+a|0;while(1){if((d|0)>=(a|0))break a;c[i+(d<<2)>>2]=0;f=c[(c[h>>2]|0)+196>>2]|0;d=d+1|0;a=c[f+(b<<6)>>2]|0}}else{g=e+-1|0;a=c[f+(b<<6)>>2]|0;while(1){a=a+-1|0;if((a|0)<=(d|0))break;j=c[i+(a<<2)>>2]|0;f=g+a|0;c[(c[j+16>>2]|0)+236>>2]=f;c[i+(f<<2)>>2]=j}f=e+d|0;a=d;while(1){a=a+1|0;if((a|0)>=(f|0))break;c[i+(a<<2)>>2]=0}a=c[(c[h>>2]|0)+196>>2]|0;f=a;a=c[a+(b<<6)>>2]|0}while(0);c[f+(b<<6)>>2]=g+a;return}function al(a){a=a|0;var b=0;Pk(a);b=c[a+16>>2]|0;c[b+220>>2]=1;c[c[b+216>>2]>>2]=c[b+192>>2];Ci(a);hi(a,0);bl(a);Wk(a);cl(a);return}function bl(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;m=dg(d)|0;n=d+16|0;f=c[n>>2]|0;l=b[f+236>>1]|0;o=m+16|0;e=l<<16>>16;if(l<<16>>16>0)a[(c[(c[o>>2]|0)+196>>2]|0)+(e+-1<<6)+49>>0]=0;l=e;while(1){if((l|0)>(b[f+238>>1]|0))break;k=c[(c[(c[(c[f+268>>2]|0)+(l<<2)>>2]|0)+16>>2]|0)+236>>2]|0;$k(m,l,k,c[(c[f+196>>2]|0)+(l<<6)>>2]|0);i=0;j=k;e=c[o>>2]|0;while(1){f=c[n>>2]|0;p=c[f+196>>2]|0;g=p+(l<<6)+4|0;e=c[e+196>>2]|0;h=c[e+(l<<6)+4>>2]|0;if((i|0)>=(c[p+(l<<6)>>2]|0))break;e=c[(c[g>>2]|0)+(i<<2)>>2]|0;c[h+(j<<2)>>2]=e;p=c[e+16>>2]|0;c[p+236>>2]=j;if((a[p+156>>0]|0)==1)c[e+24>>2]=vC(m)|0;nh(d,e);lh(m,e);e=c[o>>2]|0;p=e+232|0;c[p>>2]=(c[p>>2]|0)+1;i=i+1|0;j=j+1|0}c[g>>2]=h+(k<<2);a[e+(l<<6)+49>>0]=0;l=l+1|0}e=c[o>>2]|0;if((l|0)<(b[e+238>>1]|0))a[(c[e+196>>2]|0)+(l<<6)+49>>0]=0;a[f+272>>0]=1;return}function cl(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=a+16|0;d=c[i>>2]|0;h=b[d+236>>1]|0;while(1){if((h|0)>(b[d+238>>1]|0))break;f=c[(c[d+268>>2]|0)+(h<<2)>>2]|0;g=f+16|0;while(1){d=c[g>>2]|0;e=c[c[d+180>>2]>>2]|0;if(!e)break;fh(e)}while(1){d=c[c[d+172>>2]>>2]|0;if(!d)break;fh(d);d=c[g>>2]|0}nh(dg(a)|0,f);c[(c[(c[i>>2]|0)+268>>2]|0)+(h<<2)>>2]=0;h=h+1|0;d=c[i>>2]|0}return}function dl(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;n=o;f=gC(b)|0;while(1){if(!f)break;e=f+16|0;d=c[e>>2]|0;if((a[d+159>>0]|0)==7){fP(f);d=c[e>>2]|0}c[d+212>>2]=0;f=hC(b,f)|0}m=b+16|0;k=1;while(1){d=c[m>>2]|0;if((k|0)>(c[d+180>>2]|0))break;h=c[(c[d+184>>2]|0)+(k<<2)>>2]|0;i=h+16|0;d=gC(h)|0;a:while(1){if(!d)break;j=hC(h,d)|0;e=d+16|0;if(a[(c[e>>2]|0)+159>>0]|0){f=HB(d)|0;g=HB(b)|0;c[n>>2]=f;c[n+4>>2]=g;dA(0,88016,n)|0;tC(h,d)|0;d=j;continue}gP(d,c[(c[i>>2]|0)+264>>2]|0);g=c[e>>2]|0;c[g+212>>2]=h;a[g+159>>0]=7;g=UA(h,d)|0;while(1){if(!g){d=j;continue a}d=c[(c[g+16>>2]|0)+172>>2]|0;b:do if(d|0)do{e=d+-48|0;f=c[(c[((c[d>>2]&3|0)==2?d:e)+40>>2]|0)+16>>2]|0;if((a[f+156>>0]|0)!=1)break b;c[f+212>>2]=h;d=c[c[(c[(c[((c[d>>2]&3|0)==2?d:e)+40>>2]|0)+16>>2]|0)+180>>2]>>2]|0}while((d|0)!=0);while(0);g=WA(h,g)|0}}k=k+1|0}l=o;return}function el(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=e+16|0;g=HK((b[(c[k>>2]|0)+238>>1]<<2)+8|0)|0;f=c[k>>2]|0;c[f+268>>2]=g;g=0;h=b[f+236>>1]|0;while(1){if((h|0)>(b[f+238>>1]|0))break;f=ph(d)|0;c[(c[(c[k>>2]|0)+268>>2]|0)+(h<<2)>>2]=f;j=c[f+16>>2]|0;c[j+232>>2]=h;a[j+159>>0]=7;c[j+212>>2]=e;if(g|0){j=(c[(kh(g,f,0)|0)+16>>2]|0)+154|0;b[j>>1]=(b[j>>1]|0)*1e3}g=f;h=h+1|0;f=c[k>>2]|0}j=gC(e)|0;while(1){f=c[k>>2]|0;i=f+268|0;if(!j)break;h=(c[(c[i>>2]|0)+(c[(c[j+16>>2]|0)+232>>2]<<2)>>2]|0)+16|0;f=(c[h>>2]|0)+216|0;c[f>>2]=(c[f>>2]|0)+1;f=UA(e,j)|0;while(1){if(!f)break;i=c[f>>2]|0;d=f+-48|0;g=c[(c[(c[((i&3|0)==3?f:f+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0;while(1){if((g|0)>=(c[(c[(c[((i&3|0)==2?f:d)+40>>2]|0)+16>>2]|0)+232>>2]|0))break;i=(c[(c[c[(c[h>>2]|0)+180>>2]>>2]|0)+16>>2]|0)+168|0;b[i>>1]=(b[i>>1]|0)+1<<16>>16;g=g+1|0;i=c[f>>2]|0}f=WA(e,f)|0}j=hC(e,j)|0}d=b[f+238>>1]|0;f=b[f+236>>1]|0;while(1){if((f|0)>(d|0))break;g=(c[(c[(c[i>>2]|0)+(f<<2)>>2]|0)+16>>2]|0)+216|0;h=c[g>>2]|0;if((h|0)>1)c[g>>2]=h+-1;f=f+1|0}return}function fl(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;k=(c[(c[e+16>>2]|0)+212>>2]|0)+16|0;e=c[k>>2]|0;j=f+1|0;if((a[e+273>>0]|0)!=(j|0)){i=b[e+236>>1]|0;while(1){h=b[e+238>>1]|0;if((i|0)>(h<<16>>16|0))break;wi(d,c[(c[e+268>>2]|0)+(i<<2)>>2]|0);i=i+1|0;e=c[k>>2]|0}i=b[e+236>>1]|0;while(1){if((i|0)>(h<<16>>16|0))break;xi(g,c[(c[e+268>>2]|0)+(i<<2)>>2]|0,f);d=c[k>>2]|0;i=i+1|0;h=b[d+238>>1]|0;e=d}a[e+273>>0]=j}return}function gl(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;h=gC(b)|0;while(1){if(!h)break;c[(c[h+16>>2]|0)+212>>2]=0;g=UA(b,h)|0;while(1){if(!g)break;d=c[(c[g+16>>2]|0)+172>>2]|0;a:do if(d|0)do{e=d+-48|0;f=c[(c[((c[d>>2]&3|0)==2?d:e)+40>>2]|0)+16>>2]|0;if((a[f+156>>0]|0)!=1)break a;c[f+212>>2]=0;d=c[c[(c[(c[((c[d>>2]&3|0)==2?d:e)+40>>2]|0)+16>>2]|0)+180>>2]>>2]|0}while((d|0)!=0);while(0);g=WA(b,g)|0}h=hC(b,h)|0}hl(b);return}function hl(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;e=b+16|0;d=1;while(1){f=c[e>>2]|0;if((d|0)>(c[f+180>>2]|0))break;hl(c[(c[f+184>>2]|0)+(d<<2)>>2]|0);d=d+1|0}i=gC(b)|0;while(1){if(!i)break;d=(c[i+16>>2]|0)+212|0;if(!(c[d>>2]|0))c[d>>2]=b;h=UA(b,i)|0;while(1){if(!h)break;d=c[(c[h+16>>2]|0)+172>>2]|0;a:do if(d|0)do{e=c[d>>2]|0;g=d+-48|0;f=c[(c[((e&3|0)==2?d:g)+40>>2]|0)+16>>2]|0;if((a[f+156>>0]|0)!=1)break a;f=f+212|0;if(!(c[f>>2]|0)){c[f>>2]=b;e=c[d>>2]|0}d=c[c[(c[(c[((e&3|0)==2?d:g)+40>>2]|0)+16>>2]|0)+180>>2]>>2]|0}while((d|0)!=0);while(0);h=WA(b,h)|0}i=hC(b,i)|0}return}function il(a){a=a|0;var b=0,c=0,d=0;d=GP(a)|0;c=gC(a)|0;while(1){if(!c)break;b=UA(a,c)|0;while(1){if(!b)break;jl(b,d);b=WA(a,b)|0}c=hC(a,c)|0}Oz(d)|0;return}function jl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;R=l;l=l+320|0;L=R+296|0;K=R+280|0;G=R+136|0;z=R+120|0;q=R+104|0;m=R+88|0;f=R+80|0;I=R+16|0;C=R;n=R+264|0;o=R+248|0;p=R+232|0;s=R+216|0;E=R+200|0;F=R+184|0;B=R+168|0;M=R+152|0;i=kl(NA(a,88070)|0,b)|0;u=kl(NA(a,88076)|0,b)|0;v=(u|0)!=0;h=(i|0)!=0;do if(h|v?(Q=a+16|0,e=c[(c[Q>>2]|0)+8>>2]|0,e|0):0){A=a+48|0;b=c[a>>2]&3;g=c[((b|0)==3?a:A)+40>>2]|0;if((c[e+4>>2]|0)>1){P=HB(g)|0;Q=HB(c[((c[a>>2]&3|0)==2?a:a+-48|0)+40>>2]|0)|0;c[f>>2]=P;c[f+4>>2]=Q;dA(0,88082,f)|0;break}P=c[e>>2]|0;k=c[P+4>>2]|0;y=a+-48|0;t=c[((b|0)==2?a:y)+40>>2]|0;N=IK(48)|0;w=P+12|0;c[N+12>>2]=c[w>>2];D=P+8|0;c[N+8>>2]=c[D>>2];H=P+16|0;j=P+32|0;k=k+-1|0;x=N+32|0;r=g+16|0;t=t+16|0;do if(h){g=(c[i+16>>2]|0)+16|0;i=(c[t>>2]|0)+16|0;c[L>>2]=c[i>>2];c[L+4>>2]=c[i+4>>2];c[L+8>>2]=c[i+8>>2];c[L+12>>2]=c[i+12>>2];if(!(ll(L,g)|0)){s=HB(c[((c[a>>2]&3|0)==3?a:A)+40>>2]|0)|0;J=HB(c[((c[a>>2]&3|0)==2?a:y)+40>>2]|0)|0;O=NA(a,88070)|0;c[m>>2]=s;c[m+4>>2]=J;c[m+8>>2]=O;dA(0,88123,m)|0;O=25;break}b=c[P>>2]|0;c[L>>2]=c[b>>2];c[L+4>>2]=c[b+4>>2];c[L+8>>2]=c[b+8>>2];c[L+12>>2]=c[b+12>>2];if(!(ll(L,g)|0))b=0;else{J=(c[r>>2]|0)+16|0;c[L>>2]=c[J>>2];c[L+4>>2]=c[J+4>>2];c[L+8>>2]=c[J+8>>2];c[L+12>>2]=c[J+12>>2];if(ll(L,g)|0){s=HB(c[((c[a>>2]&3|0)==3?a:A)+40>>2]|0)|0;J=HB(c[((c[a>>2]&3|0)==2?a:y)+40>>2]|0)|0;O=NA(a,88070)|0;c[q>>2]=s;c[q+4>>2]=J;c[q+8>>2]=O;dA(0,88166,q)|0;O=25;break}if(!(c[D>>2]|0))Aa(88208,88219,369,88230);c[K>>2]=c[b>>2];c[K+4>>2]=c[b+4>>2];c[K+8>>2]=c[b+8>>2];c[K+12>>2]=c[b+12>>2];c[L>>2]=c[H>>2];c[L+4>>2]=c[H+4>>2];c[L+8>>2]=c[H+8>>2];c[L+12>>2]=c[H+12>>2];ml(C,K,L,g);J=(c[P>>2]|0)+48|0;c[J>>2]=c[C>>2];c[J+4>>2]=c[C+4>>2];c[J+8>>2]=c[C+8>>2];c[J+12>>2]=c[C+12>>2];J=(c[P>>2]|0)+16|0;c[K>>2]=c[C>>2];c[K+4>>2]=c[C+4>>2];c[K+8>>2]=c[C+8>>2];c[K+12>>2]=c[C+12>>2];c[L>>2]=c[H>>2];c[L+4>>2]=c[H+4>>2];c[L+8>>2]=c[H+8>>2];c[L+12>>2]=c[H+12>>2];nl(n,K,L);c[J>>2]=c[n>>2];c[J+4>>2]=c[n+4>>2];c[J+8>>2]=c[n+8>>2];c[J+12>>2]=c[n+12>>2];J=c[P>>2]|0;b=J+16|0;c[K>>2]=c[b>>2];c[K+4>>2]=c[b+4>>2];c[K+8>>2]=c[b+8>>2];c[K+12>>2]=c[b+12>>2];c[L>>2]=c[H>>2];c[L+4>>2]=c[H+4>>2];c[L+8>>2]=c[H+8>>2];c[L+12>>2]=c[H+12>>2];nl(o,K,L);c[J>>2]=c[o>>2];c[J+4>>2]=c[o+4>>2];c[J+8>>2]=c[o+8>>2];c[J+12>>2]=c[o+12>>2];J=c[P>>2]|0;b=J+32|0;J=J+16|0;c[K>>2]=c[J>>2];c[K+4>>2]=c[J+4>>2];c[K+8>>2]=c[J+8>>2];c[K+12>>2]=c[J+12>>2];c[L>>2]=c[C>>2];c[L+4>>2]=c[C+4>>2];c[L+8>>2]=c[C+8>>2];c[L+12>>2]=c[C+12>>2];nl(p,K,L);c[b>>2]=c[p>>2];c[b+4>>2]=c[p+4>>2];c[b+8>>2]=c[p+8>>2];c[b+12>>2]=c[p+12>>2];b=c[w>>2]|0;if(!b){J=3;break}J=(SH(a,c[P>>2]|0,0,0,N,b)|0)+3|0;break}while(1){if((b|0)>=(k|0))break;if(ol((c[P>>2]|0)+(b<<4)|0,g)|0)break;b=b+3|0}e=c[w>>2]|0;f=(e|0)!=0;if((b|0)==(k|0))if(f){J=(c[P>>2]|0)+(k<<4)|0;c[K>>2]=c[j>>2];c[K+4>>2]=c[j+4>>2];c[K+8>>2]=c[j+8>>2];c[K+12>>2]=c[j+12>>2];c[L>>2]=c[J>>2];c[L+4>>2]=c[J+4>>2];c[L+8>>2]=c[J+8>>2];c[L+12>>2]=c[J+12>>2];ml(s,K,L,g);c[x>>2]=c[s>>2];c[x+4>>2]=c[s+4>>2];c[x+8>>2]=c[s+8>>2];c[x+12>>2]=c[s+12>>2];J=k;break}else Aa(88247,88219,387,88230);else{if(f)b=SH(a,c[P>>2]|0,0,b,N,e)|0;J=b+3|0;break}}else O=25;while(0);if((O|0)==25)if(!(c[w>>2]|0))J=k;else{c[x>>2]=c[j>>2];c[x+4>>2]=c[j+4>>2];c[x+8>>2]=c[j+8>>2];c[x+12>>2]=c[j+12>>2];J=k}j=N+16|0;do if(v){i=(c[u+16>>2]|0)+16|0;v=(c[r>>2]|0)+16|0;c[L>>2]=c[v>>2];c[L+4>>2]=c[v+4>>2];c[L+8>>2]=c[v+8>>2];c[L+12>>2]=c[v+12>>2];if(!(ll(L,i)|0)){L=HB(c[((c[a>>2]&3|0)==3?a:A)+40>>2]|0)|0;M=HB(c[((c[a>>2]&3|0)==2?a:y)+40>>2]|0)|0;O=NA(a,88076)|0;c[z>>2]=L;c[z+4>>2]=M;c[z+8>>2]=O;dA(0,88258,z)|0;O=50;break}b=(c[P>>2]|0)+(J<<4)|0;c[L>>2]=c[b>>2];c[L+4>>2]=c[b+4>>2];c[L+8>>2]=c[b+8>>2];c[L+12>>2]=c[b+12>>2];h=J+-3|0;if(ll(L,i)|0){M=(c[t>>2]|0)+16|0;c[L>>2]=c[M>>2];c[L+4>>2]=c[M+4>>2];c[L+8>>2]=c[M+8>>2];c[L+12>>2]=c[M+12>>2];if(ll(L,i)|0){L=HB(c[((c[a>>2]&3|0)==3?a:A)+40>>2]|0)|0;M=HB(c[((c[a>>2]&3|0)==2?a:y)+40>>2]|0)|0;O=NA(a,88076)|0;c[G>>2]=L;c[G+4>>2]=M;c[G+8>>2]=O;dA(0,88301,G)|0;O=50;break}if(!(c[w>>2]|0))Aa(88247,88219,429,88230);c[K>>2]=c[b>>2];c[K+4>>2]=c[b+4>>2];c[K+8>>2]=c[b+8>>2];c[K+12>>2]=c[b+12>>2];c[L>>2]=c[x>>2];c[L+4>>2]=c[x+4>>2];c[L+8>>2]=c[x+8>>2];c[L+12>>2]=c[x+12>>2];ml(C,K,L,i);M=(c[P>>2]|0)+(h<<4)|0;c[M>>2]=c[C>>2];c[M+4>>2]=c[C+4>>2];c[M+8>>2]=c[C+8>>2];c[M+12>>2]=c[C+12>>2];M=J+-1|0;d=(c[P>>2]|0)+(M<<4)|0;c[K>>2]=c[C>>2];c[K+4>>2]=c[C+4>>2];c[K+8>>2]=c[C+8>>2];c[K+12>>2]=c[C+12>>2];c[L>>2]=c[x>>2];c[L+4>>2]=c[x+4>>2];c[L+8>>2]=c[x+8>>2];c[L+12>>2]=c[x+12>>2];nl(E,K,L);c[d>>2]=c[E>>2];c[d+4>>2]=c[E+4>>2];c[d+8>>2]=c[E+8>>2];c[d+12>>2]=c[E+12>>2];d=c[P>>2]|0;I=d+(J<<4)|0;d=d+(M<<4)|0;c[K>>2]=c[d>>2];c[K+4>>2]=c[d+4>>2];c[K+8>>2]=c[d+8>>2];c[K+12>>2]=c[d+12>>2];c[L>>2]=c[x>>2];c[L+4>>2]=c[x+4>>2];c[L+8>>2]=c[x+8>>2];c[L+12>>2]=c[x+12>>2];nl(F,K,L);c[I>>2]=c[F>>2];c[I+4>>2]=c[F+4>>2];c[I+8>>2]=c[F+8>>2];c[I+12>>2]=c[F+12>>2];I=c[P>>2]|0;d=I+(J+-2<<4)|0;M=I+(M<<4)|0;c[K>>2]=c[M>>2];c[K+4>>2]=c[M+4>>2];c[K+8>>2]=c[M+8>>2];c[K+12>>2]=c[M+12>>2];c[L>>2]=c[C>>2];c[L+4>>2]=c[C+4>>2];c[L+8>>2]=c[C+8>>2];c[L+12>>2]=c[C+12>>2];nl(B,K,L);c[d>>2]=c[B>>2];c[d+4>>2]=c[B+4>>2];c[d+8>>2]=c[B+8>>2];c[d+12>>2]=c[B+12>>2];d=c[D>>2]|0;if(!d){d=h;break}d=UH(a,c[P>>2]|0,h,h,N,d)|0;break}f=J;while(1){g=f+-3|0;if((f|0)>0)b=0;else break;while(1){if((b|0)==4)break;G=I+(b<<4)|0;F=(c[P>>2]|0)+(f-b<<4)|0;c[G>>2]=c[F>>2];c[G+4>>2]=c[F+4>>2];c[G+8>>2]=c[F+8>>2];c[G+12>>2]=c[F+12>>2];b=b+1|0}if(!(ol(I,i)|0))f=g;else{b=0;O=42;break}}a:do if((O|0)==42)while(1){O=0;if((b|0)==4)break a;O=(c[P>>2]|0)+(f-b<<4)|0;G=I+(b<<4)|0;c[O>>2]=c[G>>2];c[O+4>>2]=c[G+4>>2];c[O+8>>2]=c[G+8>>2];c[O+12>>2]=c[G+12>>2];b=b+1|0;O=42}while(0);b=c[D>>2]|0;e=(b|0)!=0;if(f|0){if(!e){d=g;break}d=UH(a,c[P>>2]|0,g,h,N,b)|0;break}if(e){d=c[P>>2]|0;c[K>>2]=c[H>>2];c[K+4>>2]=c[H+4>>2];c[K+8>>2]=c[H+8>>2];c[K+12>>2]=c[H+12>>2];c[L>>2]=c[d>>2];c[L+4>>2]=c[d+4>>2];c[L+8>>2]=c[d+8>>2];c[L+12>>2]=c[d+12>>2];ml(M,K,L,i);c[j>>2]=c[M>>2];c[j+4>>2]=c[M+4>>2];c[j+8>>2]=c[M+8>>2];c[j+12>>2]=c[M+12>>2];d=0;break}else Aa(88208,88219,452,88230)}else O=50;while(0);if((O|0)==50)if(!(c[D>>2]|0))d=0;else{c[j>>2]=c[H>>2];c[j+4>>2]=c[H+4>>2];c[j+8>>2]=c[H+8>>2];c[j+12>>2]=c[H+12>>2];d=0}b=J-d+1|0;f=N+4|0;c[f>>2]=b;c[N>>2]=IK(b<<4)|0;b=0;while(1){e=c[P>>2]|0;if((b|0)>=(c[f>>2]|0))break;O=(c[N>>2]|0)+(b<<4)|0;a=e+(d<<4)|0;c[O>>2]=c[a>>2];c[O+4>>2]=c[a+4>>2];c[O+8>>2]=c[a+8>>2];c[O+12>>2]=c[a+12>>2];d=d+1|0;b=b+1|0}l6(e);l6(P);c[c[(c[Q>>2]|0)+8>>2]>>2]=N}while(0);l=R;return}function kl(b,d){b=b|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;e=f;if((b|0)!=0?(a[b>>0]|0)!=0:0){d=IP(d,b)|0;if(!d){c[e>>2]=b;dA(0,88421,e)|0;d=0}}else d=0;l=f;return d|0}function ll(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;d=+h[a>>3];if((+h[b>>3]<=d?d<=+h[b+16>>3]:0)?(c=+h[a+8>>3],+h[b+8>>3]<=c):0)a=c<=+h[b+24>>3];else a=0;return a&1|0}function ml(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0,j=0,k=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0,z=0,A=0.0,B=0,C=0,D=0,E=0,F=0;F=l;l=l+464|0;r=F+48|0;E=F+32|0;x=F+16|0;y=F;z=F+364|0;B=F+264|0;C=F+164|0;D=F+64|0;u=+h[b>>3];v=+h[b+8>>3];k=+h[d>>3];w=+h[d+8>>3];c[x>>2]=c[e>>2];c[x+4>>2]=c[e+4>>2];c[x+8>>2]=c[e+8>>2];c[x+12>>2]=c[e+12>>2];j=e+16|0;c[y>>2]=c[j>>2];c[y+4>>2]=c[j+4>>2];c[y+8>>2]=c[j+8>>2];c[y+12>>2]=c[j+12>>2];m=+h[x>>3];n=v-w;o=u-k;j=a+8|0;e=y+8|0;f=+h[x+8>>3];if(k=f?!(g<=+h[e>>3]):1)):0){s=g;t=m}else i=3;do if((i|0)==3){g=+h[y>>3];if(k>g?(p=v+ +(~~(n*(g-u)/o)|0),!(p>=f?!(p<=+h[e>>3]):1)):0){s=p;t=g;break}if(w=m)|!(q<=g))):0){s=f;t=q;break}f=+h[e>>3];if(w>f?(A=u+ +(~~(o*(f-v)/n)|0),!(!(A>=m)|!(A<=g))):0){s=f;t=A;break};c[r>>2]=c[b>>2];c[r+4>>2]=c[b+4>>2];c[r+8>>2]=c[b+8>>2];c[r+12>>2]=c[b+12>>2];z=tl(r,z)|0;c[r>>2]=c[d>>2];c[r+4>>2]=c[d+4>>2];c[r+8>>2]=c[d+8>>2];c[r+12>>2]=c[d+12>>2];B=tl(r,B)|0;c[r>>2]=c[x>>2];c[r+4>>2]=c[x+4>>2];c[r+8>>2]=c[x+8>>2];c[r+12>>2]=c[x+12>>2];C=tl(r,C)|0;c[r>>2]=c[y>>2];c[r+4>>2]=c[y+4>>2];c[r+8>>2]=c[y+8>>2];c[r+12>>2]=c[y+12>>2];D=tl(r,D)|0;c[E>>2]=z;c[E+4>>2]=B;c[E+8>>2]=C;c[E+12>>2]=D;dA(1,88343,E)|0;Aa(138697,88219,78,88395)}while(0);h[a>>3]=t;h[j>>3]=s;l=F;return}function nl(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0;d=(+h[b+8>>3]+ +h[c+8>>3])*.5;h[a>>3]=(+h[b>>3]+ +h[c>>3])*.5;h[a+8>>3]=d;return}function ol(a,b){a=a|0;b=b|0;var d=0.0,e=0,f=0.0,g=0,i=0,j=0,k=0,m=0;m=l;l=l+80|0;j=m+16|0;k=m;e=0;while(1){if((e|0)==4)break;i=j+(e<<4)|0;g=a+(e<<4)|0;c[i>>2]=c[g>>2];c[i+4>>2]=c[g+4>>2];c[i+8>>2]=c[g+8>>2];c[i+12>>2]=c[g+12>>2];e=e+1|0}e=b+8|0;i=b+24|0;d=+pl(a,0.0,1.0,+h[b>>3],+h[e>>3],+h[i>>3]);if(d>=0.0&d<2.0)iP(k,j,3,d,a,0);else d=2.0;g=b+16|0;f=+pl(a,0.0,d>1.0?1.0:d,+h[g>>3],+h[e>>3],+h[i>>3]);if(f>=0.0&f1.0?1.0:d,+h[e>>3],+h[b>>3],+h[g>>3]);if(f>=0.0&f1.0?1.0:d,+h[i>>3],+h[b>>3],+h[g>>3]);if(f>=0.0&f>3]-d))<=.005){b=+h[a+56>>3];b=!(b>=e)|!(b<=f)?-1.0:c;break a}break}default:{}}iP(i,a,3,.5,j,k);g=(b+c)*.5;b=+pl(j,b,g,d,e,f);if(!(b>=0.0))b=+pl(k,g,c,d,e,f)}while(0);l=m;return +b}function ql(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;var g=0.0,i=0,j=0,k=0,m=0;m=l;l=l+144|0;j=m+80|0;k=m+16|0;i=m;a:do if(!(b==c)){switch(rl(a,d)|0){case 0:{b=-1.0;break a}case 1:{if(+F(+(+h[a+56>>3]-d))<=.005){b=+h[a+48>>3];b=!(b>=e)|!(b<=f)?-1.0:c;break a}break}default:{}}iP(i,a,3,.5,j,k);g=(b+c)*.5;b=+ql(j,b,g,d,e,f);if(!(b>=0.0))b=+ql(k,g,c,d,e,f)}while(0);l=m;return +b}function rl(a,b){a=a|0;b=+b;var c=0,d=0,e=0,f=0.0,g=0,i=0;f=+h[a+8>>3];e=fb&1;c=1;d=e;e=(e|0)==0&1;while(1){if((c|0)==4)break;f=+h[a+(c<<4)+8>>3];i=fb&1;g=((d|0)!=0&(i|0)!=(d|0)&1)+e|0;c=c+1|0;d=i;e=g}return e|0}function sl(a,b){a=a|0;b=+b;var c=0,d=0,e=0,f=0.0,g=0,i=0;f=+h[a>>3];e=fb&1;c=1;d=e;e=(e|0)==0&1;while(1){if((c|0)==4)break;f=+h[a+(c<<4)>>3];i=fb&1;g=((d|0)!=0&(i|0)!=(d|0)&1)+e|0;c=c+1|0;d=i;e=g}return e|0}function tl(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0;c=l;l=l+16|0;d=c;e=+h[a+8>>3];h[d>>3]=+h[a>>3];h[d+8>>3]=e;i2(b,88409,d)|0;l=c;return b|0}function ul(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+16|0;s=v;u=4;t=k6(40)|0;c[t>>2]=0;r=a+16|0;e=c[r>>2]|0;a:do if(((b[e+238>>1]|0)-(b[e+236>>1]|0)|0)>=2){m=1;d=e;e=c[e+196>>2]|0;b:while(1){n=m+1|0;if(!(c[e+(n<<6)>>2]|0)){q=15;break}else k=0;while(1){h=c[e+(m<<6)>>2]|0;if((k|0)>=(h|0)){m=n;continue b}i=c[(c[e+(m<<6)+4>>2]|0)+(k<<2)>>2]|0;o=0;g=la(20,i|0)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){f=A6(c[d>>2]|0,t|0,u|0)|0;if(!f)Ca(d|0,p|0);D=p}else f=-1;if((f|0)==1){d=D;break b}j=k+1|0;if(g<<24>>24){g=j;d=h;while(1){if((g|0)>=(d|0))break;o=0;d=ra(65,i|0,c[(c[e+(m<<6)+4>>2]|0)+(g<<2)>>2]|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,t|0,u|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){d=D;break b}if(!(d<<24>>24))break;d=c[(c[r>>2]|0)+196>>2]|0;g=g+1|0;e=d;d=c[d+(m<<6)>>2]|0}if((g-k|0)>1){o=0;ba(15,a|0,m|0,k|0,g+-1|0,1);d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,t|0,u|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)==1){d=D;break b}}}e=c[r>>2]|0;k=j;d=e;e=c[e+196>>2]|0}}c:do if((q|0)==15){while(1){if((m|0)>0)k=0;else break;while(1){e=c[d+196>>2]|0;h=c[e+(m<<6)>>2]|0;if((k|0)>=(h|0))break;i=c[(c[e+(m<<6)+4>>2]|0)+(k<<2)>>2]|0;o=0;g=la(21,i|0)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){f=A6(c[d>>2]|0,t|0,u|0)|0;if(!f)Ca(d|0,p|0);D=p}else f=-1;if((f|0)==1){d=D;break c}j=k+1|0;if(g<<24>>24){g=j;d=h;while(1){if((g|0)>=(d|0))break;o=0;d=ra(66,i|0,c[(c[e+(m<<6)+4>>2]|0)+(g<<2)>>2]|0)|0;e=o;o=0;if((e|0)!=0&(p|0)!=0){f=A6(c[e>>2]|0,t|0,u|0)|0;if(!f)Ca(e|0,p|0);D=p}else f=-1;if((f|0)==1){d=D;break c}if(!(d<<24>>24))break;d=c[(c[r>>2]|0)+196>>2]|0;g=g+1|0;e=d;d=c[d+(m<<6)>>2]|0}if((g-k|0)>1){o=0;ba(15,a|0,m|0,k|0,g+-1|0,0);d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,t|0,u|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)==1){d=D;break c}}}k=j;d=c[r>>2]|0}m=m+-1|0;q=15}t=x6(187184,1,t|0,u|0)|0;u=D;o=0;d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,t|0,u|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)==1)d=D;else d=0}while(0);d:while(1){if(d){o=0;aa(23,3,88449,s|0)|0;d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,t|0,u|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)==1){d=D;continue}else break}else f=1;while(1){d=c[r>>2]|0;if((f|0)>(c[d+180>>2]|0))break a;o=0;$(101,c[(c[d+184>>2]|0)+(f<<2)>>2]|0);d=o;o=0;if((d|0)!=0&(p|0)!=0){e=A6(c[d>>2]|0,t|0,u|0)|0;if(!e)Ca(d|0,p|0);D=p}else e=-1;if((e|0)==1){d=D;continue d}f=f+1|0}}}while(0);l6(t|0);l=v;return}function vl(b){b=b|0;b=c[b+16>>2]|0;if(((a[b+156>>0]|0)==1?(c[b+176>>2]|0)==1:0)?(c[b+184>>2]|0)==1:0)b=(c[b+104>>2]|0)==0&1;else b=0;return b|0}function wl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+80|0;h=i+40|0;g=i;e=c[c[(c[a+16>>2]|0)+172>>2]>>2]|0;a=c[c[(c[b+16>>2]|0)+172>>2]>>2]|0;if(((vl(b)|0)<<24>>24!=0?(c[((c[e>>2]&3|0)==3?e:e+48|0)+40>>2]|0)==(c[((c[a>>2]&3|0)==3?a:a+48|0)+40>>2]|0):0)?(Cl(e,a)|0)<<24>>24!=0:0){d=(c[a+16>>2]|0)+16|0;f=g;a=(c[e+16>>2]|0)+16|0;b=f+40|0;do{c[f>>2]=c[a>>2];f=f+4|0;a=a+4|0}while((f|0)<(b|0));f=h;a=d;b=f+40|0;do{c[f>>2]=c[a>>2];f=f+4|0;a=a+4|0}while((f|0)<(b|0));a=(eg(g,h)|0)==0&1}else a=0;l=i;return a|0}function xl(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=a+16|0;q=c[(c[(c[(c[t>>2]|0)+196>>2]|0)+(b<<6)+4>>2]|0)+(d<<2)>>2]|0;p=d+1|0;m=(f|0)==1;n=q+16|0;l=p;while(1){if((l|0)>(e|0)){g=e;s=p;break}o=c[(c[(c[(c[t>>2]|0)+196>>2]|0)+(b<<6)+4>>2]|0)+(l<<2)>>2]|0;k=o+16|0;a:do if(m)while(1){d=c[k>>2]|0;j=c[c[d+180>>2]>>2]|0;if(!j)break a;h=c[(c[n>>2]|0)+180>>2]|0;i=j+-48|0;f=0;while(1){d=c[h+(f<<2)>>2]|0;if(!d){r=8;break}if((c[((c[d>>2]&3|0)==2?d:d+-48|0)+40>>2]|0)==(c[((c[j>>2]&3|0)==2?j:i)+40>>2]|0))break;else f=f+1|0}if((r|0)==8){r=0;d=kh(q,c[((c[j>>2]&3|0)==2?j:i)+40>>2]|0,j)|0}while(1){f=c[c[(c[k>>2]|0)+172>>2]>>2]|0;if(!f)break;sh(f,d);fh(f)}fh(j)}else while(1){d=c[k>>2]|0;j=c[c[d+172>>2]>>2]|0;if(!j)break a;h=c[(c[n>>2]|0)+172>>2]|0;i=j+48|0;f=0;while(1){d=c[h+(f<<2)>>2]|0;if(!d){r=17;break}if((c[((c[d>>2]&3|0)==3?d:d+48|0)+40>>2]|0)==(c[((c[j>>2]&3|0)==3?j:i)+40>>2]|0))break;else f=f+1|0}if((r|0)==17){r=0;d=kh(c[((c[j>>2]&3|0)==3?j:i)+40>>2]|0,q,j)|0}while(1){f=c[c[(c[k>>2]|0)+180>>2]>>2]|0;if(!f)break;sh(f,d);fh(f)}fh(j)}while(0);if((c[d+176>>2]|0)!=(0-(c[d+184>>2]|0)|0)){r=23;break}nh(a,o);l=l+1|0}if((r|0)==23)Aa(88585,88629,115,88636);while(1){g=g+1|0;f=c[(c[t>>2]|0)+196>>2]|0;d=f+(b<<6)|0;f=c[f+(b<<6)+4>>2]|0;h=f+(s<<2)|0;if((g|0)>=(c[d>>2]|0))break;r=c[f+(g<<2)>>2]|0;c[h>>2]=r;c[(c[r+16>>2]|0)+236>>2]=s;s=s+1|0}c[d>>2]=s;c[h>>2]=0;return}function yl(b){b=b|0;b=c[b+16>>2]|0;if(((a[b+156>>0]|0)==1?(c[b+184>>2]|0)==1:0)?(c[b+176>>2]|0)==1:0)b=(c[b+104>>2]|0)==0&1;else b=0;return b|0}function zl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+80|0;h=i+40|0;g=i;e=c[c[(c[a+16>>2]|0)+180>>2]>>2]|0;a=c[c[(c[b+16>>2]|0)+180>>2]>>2]|0;if(((yl(b)|0)<<24>>24!=0?(c[((c[e>>2]&3|0)==2?e:e+-48|0)+40>>2]|0)==(c[((c[a>>2]&3|0)==2?a:a+-48|0)+40>>2]|0):0)?(Cl(e,a)|0)<<24>>24!=0:0){d=(c[a+16>>2]|0)+56|0;f=g;a=(c[e+16>>2]|0)+56|0;b=f+40|0;do{c[f>>2]=c[a>>2];f=f+4|0;a=a+4|0}while((f|0)<(b|0));f=h;a=d;b=f+40|0;do{c[f>>2]=c[a>>2];f=f+4|0;a=a+4|0}while((f|0)<(b|0));a=(eg(g,h)|0)==0&1}else a=0;l=i;return a|0}function Al(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+32|0;p=r+16|0;o=r;m=d+16|0;f=c[m>>2]|0;e=b[f+236>>1]|0;while(1){if((e|0)>(b[f+238>>1]|0))break;c[(c[f+268>>2]|0)+(e<<2)>>2]=0;e=e+1|0;f=c[m>>2]|0}sj(d);j=gC(d)|0;while(1){if(!j)break;Bl(d,j);i=UA(d,j)|0;while(1){if(!i)break;else f=i;while(1){e=c[(c[f+16>>2]|0)+172>>2]|0;if(!e)break;else f=e}h=i+-48|0;while(1){e=f+-48|0;g=c[((c[f>>2]&3|0)==2?f:e)+40>>2]|0;if((c[(c[g+16>>2]|0)+232>>2]|0)>=(c[(c[(c[((c[i>>2]&3|0)==2?i:h)+40>>2]|0)+16>>2]|0)+232>>2]|0))break;Bl(d,g);f=c[c[(c[(c[((c[f>>2]&3|0)==2?f:e)+40>>2]|0)+16>>2]|0)+180>>2]>>2]|0}i=WA(d,i)|0}j=hC(d,j)|0}e=c[m>>2]|0;i=b[e+236>>1]|0;while(1){if((i|0)>(b[e+238>>1]|0)){k=1;n=e;break}e=c[(c[e+268>>2]|0)+(i<<2)>>2]|0;j=c[(c[(c[(dg(d)|0)+16>>2]|0)+196>>2]|0)+(i<<6)+4>>2]|0;f=e+16|0;if((c[j+(c[(c[f>>2]|0)+236>>2]<<2)>>2]|0)!=(e|0)){q=17;break}h=c[(c[(c[(dg(d)|0)+16>>2]|0)+196>>2]|0)+(i<<6)+4>>2]|0;e=c[m>>2]|0;f=c[e+196>>2]|0;c[f+(i<<6)+4>>2]=h+(c[(c[(c[(c[e+268>>2]|0)+(i<<2)>>2]|0)+16>>2]|0)+236>>2]<<2);e=-1;h=0;a:while(1){if((h|0)>=(c[f+(i<<6)>>2]|0))break;f=c[(c[f+(i<<6)+4>>2]|0)+(h<<2)>>2]|0;if(!f)break;g=c[f+16>>2]|0;b:do if(!(a[g+156>>0]|0))if(!(EC(d,f)|0))break a;else e=h;else{f=c[c[g+172>>2]>>2]|0;while(1){if(!f)break b;g=c[(c[f+16>>2]|0)+116>>2]|0;if(!g)break;else f=g}if(EC(d,c[((c[f>>2]&3|0)==3?f:f+48|0)+40>>2]|0)|0){j=(EC(d,c[((c[f>>2]&3|0)==2?f:f+-48|0)+40>>2]|0)|0)==0;e=j?e:h}}while(0);h=h+1|0;f=c[(c[m>>2]|0)+196>>2]|0}if((e|0)==-1){c[p>>2]=HB(d)|0;c[p+4>>2]=i;dA(0,88549,p)|0}j=c[m>>2]|0;c[(c[j+196>>2]|0)+(i<<6)>>2]=e+1;i=i+1|0;e=j}if((q|0)==17){p=HB(e)|0;q=c[(c[f>>2]|0)+236>>2]|0;c[o>>2]=p;c[o+4>>2]=q;c[o+8>>2]=i;dA(1,88491,o)|0;Ca(187184,1)}while(1){if((k|0)>(c[n+180>>2]|0))break;Al(c[(c[n+184>>2]|0)+(k<<2)>>2]|0);k=k+1|0;n=c[m>>2]|0}l=r;return}function Bl(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[b+16>>2]|0;a=(c[(c[a+16>>2]|0)+268>>2]|0)+(c[d+232>>2]<<2)|0;e=c[a>>2]|0;if(!((e|0)!=0?(c[(c[e+16>>2]|0)+236>>2]|0)<=(c[d+236>>2]|0):0))c[a>>2]=b;return}function Cl(b,d){b=b|0;d=d|0;var e=0,f=0;while(1){f=c[b+16>>2]|0;if(!(a[f+112>>0]|0))break;b=c[f+116>>2]|0}while(1){e=c[d+16>>2]|0;if(!(a[e+112>>0]|0))break;d=c[e+116>>2]|0}if((a[f+153>>0]|0)==0?(a[e+153>>0]|0)==0:0){f=c[d>>2]&3;e=c[b>>2]&3;b=(S((c[(c[(c[((e|0)==3?b:b+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[(c[(c[((e|0)==2?b:b+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)|0,(c[(c[(c[((f|0)==3?d:d+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)-(c[(c[(c[((f|0)==2?d:d+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)|0)|0)>0&1}else b=0;return b|0}function Dl(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+544|0;j=k+528|0;El(j,k+512|0,k);e=(a[194050]|0)+1<<24>>24;a[194050]=e<<24>>24==0?1:e;e=c[b+16>>2]|0;c[e+220>>2]=0;c[e+232>>2]=0;e=(d|0)>0;d=gC(b)|0;while(1){if(!d)break;if(e?(h=c[d+16>>2]|0,i=c[h+212>>2]|0,(i|0)!=0):0){g=c[(c[(c[i+16>>2]|0)+268>>2]|0)+(c[h+232>>2]<<2)>>2]|0;f=7}else f=6;if((f|0)==6?(f=0,(d|0)==(dP(d)|0)):0){g=d;f=7}if((f|0)==7?(0,(a[(c[g+16>>2]|0)+157>>0]|0)!=(a[194050]|0)):0){Fl(b);Gl(j,b,g);Hl(b)}d=hC(b,d)|0}Il(j);l=k;return}function El(a,b,d){a=a|0;b=b|0;d=d|0;c[b>>2]=d;c[b+4>>2]=d+512;c[b+12>>2]=0;c[b+8>>2]=0;c[a>>2]=b;c[a+4>>2]=b;c[a+8>>2]=d;return}function Fl(a){a=a|0;c[(c[a+16>>2]|0)+192>>2]=0;c[46835]=0;return}function Gl(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+32|0;p=q;Jl(b,e);k=p+8|0;m=p+16|0;n=p+24|0;a:while(1){o=Kl(b)|0;if(!o)break;e=o+16|0;if((a[(c[e>>2]|0)+157>>0]|0)==(a[194050]|0))continue;Ll(d,o);h=c[e>>2]|0;g=h+180|0;j=c[g+4>>2]|0;i=p;c[i>>2]=c[g>>2];c[i+4>>2]=j;i=h+172|0;j=c[i+4>>2]|0;g=k;c[g>>2]=c[i>>2];c[g+4>>2]=j;g=h+188|0;j=c[g+4>>2]|0;i=m;c[i>>2]=c[g>>2];c[i+4>>2]=j;h=h+196|0;i=c[h+4>>2]|0;j=n;c[j>>2]=c[h>>2];c[j+4>>2]=i;j=3;while(1){if((j|0)<=-1)continue a;e=c[p+(j<<3)>>2]|0;b:do if(e|0){i=(c[p+(j<<3)+4>>2]|0)+-1|0;h=e+(i<<2)|0;while(1){if((i|0)<=-1)break b;f=c[h>>2]|0;g=c[f>>2]&3;e=c[((g|0)==2?f:f+-48|0)+40>>2]|0;if((e|0)==(o|0))e=c[((g|0)==3?f:f+48|0)+40>>2]|0;if((a[(c[e+16>>2]|0)+157>>0]|0)!=(a[194050]|0)?(e|0)==(dP(e)|0):0)Jl(b,e);h=h+-4|0;i=i+-1|0}}while(0);j=j+-1|0}}l=q;return}function Hl(a){a=a|0;var b=0,d=0,e=0,f=0;d=a+16|0;a=c[d>>2]|0;f=a+220|0;e=c[f>>2]|0;b=e+1|0;c[f>>2]=b;a=c[a+216>>2]|0;b=b<<2;if(!a)a=IK(b)|0;else a=KK(a,b)|0;f=c[d>>2]|0;c[f+216>>2]=a;c[a+(e<<2)>>2]=c[f+192>>2];return}function Il(a){a=a|0;var b=0;a=c[(c[a>>2]|0)+12>>2]|0;while(1){if(!a)break;b=c[a+12>>2]|0;l6(c[a>>2]|0);l6(a);a=b}return}function Jl(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;h=k+8|0;g=k;j=b+8|0;f=c[j>>2]|0;i=b+4|0;b=c[i>>2]|0;if((f|0)==(c[b+4>>2]|0)){f=c[b+12>>2]|0;if(!f){f=HK(16)|0;if(!f)dA(1,99270,g)|0;c[f+8>>2]=c[i>>2];c[f+12>>2]=0;b=HK(4e6)|0;c[f>>2]=b;if(!b){dA(1,88649,h)|0;b=c[f>>2]|0}c[f+4>>2]=b+4e6;c[(c[i>>2]|0)+12>>2]=f}c[i>>2]=f;f=c[f>>2]|0;c[j>>2]=f}a[(c[e+16>>2]|0)+157>>0]=(d[194050]|0)+1;c[j>>2]=f+4;c[f>>2]=e;l=k;return}function Kl(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;f=a+8|0;b=c[f>>2]|0;d=a+4|0;e=c[d>>2]|0;if((b|0)==(c[e>>2]|0))if((e|0)==(c[a>>2]|0))b=0;else{b=c[e+8>>2]|0;c[d>>2]=b;b=c[b+4>>2]|0;c[f>>2]=b;g=4}else g=4;if((g|0)==4){b=b+-4|0;c[f>>2]=b;b=c[b>>2]|0}return b|0}function Ll(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;f=c[b+16>>2]|0;g=f+232|0;c[g>>2]=(c[g>>2]|0)+1;g=c[d+16>>2]|0;a[g+157>>0]=a[194050]|0;b=c[46835]|0;e=g+168|0;if(!b){c[e>>2]=0;c[f+192>>2]=d}else{c[e>>2]=b;c[(c[b+16>>2]|0)+164>>2]=d}c[46835]=d;c[g+164>>2]=0;return}function Ml(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0;m=b+16|0;d=(c[m>>2]|0)+192|0;while(1){d=c[d>>2]|0;if(!d)break;g=d+16|0;d=c[g>>2]|0;e=c[d+188>>2]|0;a:do if(!e)f=0;else{f=0;while(1){e=c[e+(f<<2)>>2]|0;if(!e){f=0;break a}Nl(e);d=c[g>>2]|0;f=f+1|0;e=c[d+188>>2]|0}}while(0);while(1){if((f|0)>=(c[d+208>>2]|0))break;e=c[(c[d+204>>2]|0)+(f<<2)>>2]|0;l=c[e>>2]&3;if((c[(c[(c[((l|0)==2?e:e+-48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)==(c[(c[(c[((l|0)==3?e:e+48|0)+40>>2]|0)+16>>2]|0)+232>>2]|0)){Nl(e);d=c[g>>2]|0}f=f+1|0}d=d+164|0}l=c[m>>2]|0;d=c[l+196>>2]|0;if(!((c[d+56>>2]|0)==0?(c[l+180>>2]|0)<=0:0))i=13;b:do if((i|0)==13){i=c[d+4>>2]|0;g=0;c:while(1){d=c[i+(g<<2)>>2]|0;if(!d)break b;e=c[(c[d+16>>2]|0)+196>>2]|0;d=0;while(1){f=c[e+(d<<2)>>2]|0;if(!f)break;l=c[f+16>>2]|0;if(c[l+96>>2]|0?(a[l+113>>0]|0)==0:0)break c;d=d+1|0}g=g+1|0}Ol(b)}while(0);Ei(b);e=0;d=(c[m>>2]|0)+192|0;while(1){d=c[d>>2]|0;if(!d)break;l=d+16|0;d=c[l>>2]|0;f=c[d+188>>2]|0;d:do if(f){k=0;while(1){g=c[f+(k<<2)>>2]|0;if(!g){k=0;break}i=c[g+16>>2]|0;j=c[i+96>>2]|0;do if(j)if(!(a[i+113>>0]|0)){Pl(g);f=c[l>>2]|0;e=1;d=f;f=c[f+188>>2]|0;break}else{h[i+136>>3]=+h[((c[(c[m>>2]|0)+116>>2]&1|0)==0?j+24|0:j+32|0)>>3];break}while(0);k=k+1|0}while(1){if((k|0)>=(c[d+208>>2]|0))break d;i=c[(c[d+204>>2]|0)+(k<<2)>>2]|0;j=c[i>>2]&3;g=c[((j|0)==3?i:i+48|0)+40>>2]|0;j=c[((j|0)==2?i:i+-48|0)+40>>2]|0;do if(!((g|0)==(j|0)?1:(c[(c[g+16>>2]|0)+232>>2]|0)!=(c[(c[j+16>>2]|0)+232>>2]|0))){f=i;do{j=c[f+16>>2]|0;f=c[j+172>>2]|0}while((f|0)!=0);f=a[j+113>>0]|0;g=c[i+16>>2]|0;a[g+113>>0]=f;g=c[g+96>>2]|0;if(g)if(!(f<<24>>24)){Pl(i);e=1;d=c[l>>2]|0;break}else{o=+h[((c[(c[m>>2]|0)+116>>2]&1|0)==0?g+24|0:g+32|0)>>3];j=j+136|0;n=+h[j>>3];h[j>>3]=o>n?o:n;break}}while(0);k=k+1|0}}while(0);d=d+164|0}if(e|0){xh(b);Lh(b)}return e|0}function Nl(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=c[b>>2]&3;i=c[((d|0)==3?b:b+48|0)+40>>2]|0;f=i+16|0;g=c[(c[f>>2]|0)+236>>2]|0;d=c[(c[(c[((d|0)==2?b:b+-48|0)+40>>2]|0)+16>>2]|0)+236>>2]|0;h=(g|0)<(d|0);e=h?d:g;i=c[(c[(dg(i)|0)+16>>2]|0)+196>>2]|0;f=i+(c[(c[f>>2]|0)+232>>2]<<6)+4|0;d=h?g:d;a:while(1){d=d+1|0;if((d|0)>=(e|0))break;g=c[(c[(c[f>>2]|0)+(d<<2)>>2]|0)+16>>2]|0;switch(a[g+156>>0]|0){case 0:break a;case 1:break;default:continue a}if(c[g+104>>2]|0)break}if((d|0)==(e|0))do{i=c[b+16>>2]|0;a[i+113>>0]=1;b=c[i+172>>2]|0}while((b|0)!=0);return} +function r3(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=l;l=l+256|0;e=h;a:do if((d|0)>=2?(g=b+(d<<2)|0,c[g>>2]=e,a|0):0)while(1){f=a>>>0<256?a:256;B6(e|0,c[b>>2]|0,f|0)|0;e=0;do{i=b+(e<<2)|0;e=e+1|0;B6(c[i>>2]|0,c[b+(e<<2)>>2]|0,f|0)|0;c[i>>2]=(c[i>>2]|0)+f}while((e|0)!=(d|0));a=a-f|0;if(!a)break a;e=c[g>>2]|0}while(0);l=h;return}function s3(b,e,f){b=b|0;e=e|0;f=f|0;var g=0.0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;switch(e|0){case 0:{l=-149;m=24;j=4;break}case 1:{l=-1074;m=53;j=4;break}case 2:{l=-1074;m=53;j=4;break}default:g=0.0}a:do if((j|0)==4){o=b+4|0;n=b+100|0;do{e=c[o>>2]|0;if(e>>>0<(c[n>>2]|0)>>>0){c[o>>2]=e+1;e=d[e>>0]|0}else e=W1(b)|0}while((X1(e)|0)!=0);b:do switch(e|0){case 43:case 45:{i=1-(((e|0)==45&1)<<1)|0;e=c[o>>2]|0;if(e>>>0<(c[n>>2]|0)>>>0){c[o>>2]=e+1;h=d[e>>0]|0;break b}else{h=W1(b)|0;break b}}default:{h=e;i=1}}while(0);e=0;do{if((h|32|0)!=(a[153600+e>>0]|0))break;do if(e>>>0<7){h=c[o>>2]|0;if(h>>>0<(c[n>>2]|0)>>>0){c[o>>2]=h+1;h=d[h>>0]|0;break}else{h=W1(b)|0;break}}while(0);e=e+1|0}while(e>>>0<8);c:do switch(e|0){case 8:break;case 3:{j=23;break}default:{k=(f|0)!=0;if(k&e>>>0>3)if((e|0)==8)break c;else{j=23;break c}d:do if(!e){e=0;do{if((h|32|0)!=(a[153609+e>>0]|0))break d;do if(e>>>0<2){h=c[o>>2]|0;if(h>>>0<(c[n>>2]|0)>>>0){c[o>>2]=h+1;h=d[h>>0]|0;break}else{h=W1(b)|0;break}}while(0);e=e+1|0}while(e>>>0<3)}while(0);switch(e|0){case 3:{e=c[o>>2]|0;if(e>>>0<(c[n>>2]|0)>>>0){c[o>>2]=e+1;e=d[e>>0]|0}else e=W1(b)|0;if((e|0)==40)e=1;else{if(!(c[n>>2]|0)){g=s;break a}c[o>>2]=(c[o>>2]|0)+-1;g=s;break a}while(1){h=c[o>>2]|0;if(h>>>0<(c[n>>2]|0)>>>0){c[o>>2]=h+1;h=d[h>>0]|0}else h=W1(b)|0;if(!((h+-48|0)>>>0<10|(h+-65|0)>>>0<26)?!((h|0)==95|(h+-97|0)>>>0<26):0)break;e=e+1|0}if((h|0)==41){g=s;break a}h=(c[n>>2]|0)==0;if(!h)c[o>>2]=(c[o>>2]|0)+-1;if(!k){c[(L1()|0)>>2]=22;U1(b,0);g=0.0;break a}if(!e){g=s;break a}while(1){e=e+-1|0;if(!h)c[o>>2]=(c[o>>2]|0)+-1;if(!e){g=s;break a}}}case 0:{if((h|0)==48){e=c[o>>2]|0;if(e>>>0<(c[n>>2]|0)>>>0){c[o>>2]=e+1;e=d[e>>0]|0}else e=W1(b)|0;if((e|32|0)==120){g=+t3(b,m,l,i,f);break a}if(!(c[n>>2]|0))e=48;else{c[o>>2]=(c[o>>2]|0)+-1;e=48}}else e=h;g=+u3(b,e,m,l,i,f);break a}default:{if(c[n>>2]|0)c[o>>2]=(c[o>>2]|0)+-1;c[(L1()|0)>>2]=22;U1(b,0);g=0.0;break a}}}}while(0);if((j|0)==23){h=(c[n>>2]|0)==0;if(!h)c[o>>2]=(c[o>>2]|0)+-1;if((f|0)!=0&e>>>0>3)do{if(!h)c[o>>2]=(c[o>>2]|0)+-1;e=e+-1|0}while(e>>>0>3)}g=+(i|0)*t}while(0);return +g}function t3(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0.0,i=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=a+4|0;i=c[w>>2]|0;v=a+100|0;if(i>>>0<(c[v>>2]|0)>>>0){c[w>>2]=i+1;i=d[i>>0]|0;j=0}else{i=W1(a)|0;j=0}a:while(1){switch(i|0){case 46:{n=8;break a}case 48:break;default:{s=0;t=0;p=1.0;h=0.0;u=0;r=j;j=0;q=0;m=0;l=0;break a}}i=c[w>>2]|0;if(i>>>0<(c[v>>2]|0)>>>0){c[w>>2]=i+1;i=d[i>>0]|0;j=1;continue}else{i=W1(a)|0;j=1;continue}}if((n|0)==8){i=c[w>>2]|0;if(i>>>0<(c[v>>2]|0)>>>0){c[w>>2]=i+1;i=d[i>>0]|0}else i=W1(a)|0;if((i|0)==48){l=0;j=0;do{i=c[w>>2]|0;if(i>>>0<(c[v>>2]|0)>>>0){c[w>>2]=i+1;i=d[i>>0]|0}else i=W1(a)|0;l=w6(l|0,j|0,-1,-1)|0;j=D}while((i|0)==48);s=1;t=0;p=1.0;h=0.0;u=0;r=1;q=0;m=0}else{s=1;t=0;p=1.0;h=0.0;u=0;r=j;j=0;q=0;m=0;l=0}}while(1){n=i+-48|0;o=(i|0)==46;if(n>>>0>=10?!(o|((i|32)+-97|0)>>>0<6):0)break;if(o)if(!s){s=1;n=t;k=p;i=u;l=m;j=q}else{i=46;break}else{i=(i|0)>57?(i|32)+-87|0:n;do if(!((q|0)<0|(q|0)==0&m>>>0<8))if((q|0)<0|(q|0)==0&m>>>0<14){p=p*.0625;n=t;k=p;h=h+p*+(i|0);i=u;break}else{i=(t|0)!=0|(i|0)==0;n=i?t:1;k=p;h=i?h:h+p*.5;i=u;break}else{n=t;k=p;i=i+(u<<4)|0}while(0);m=w6(m|0,q|0,1,0)|0;r=1;q=D}o=c[w>>2]|0;if(o>>>0<(c[v>>2]|0)>>>0){c[w>>2]=o+1;t=n;p=k;u=i;i=d[o>>0]|0;continue}else{t=n;p=k;u=i;i=W1(a)|0;continue}}do if(!r){i=c[v>>2]|0;j=(i|0)!=0;if(j)c[w>>2]=(c[w>>2]|0)+-1;if(g){if(j)c[w>>2]=(c[w>>2]|0)+-1;if(!((s|0)==0|(i|0)==0))c[w>>2]=(c[w>>2]|0)+-1}else U1(a,0);h=+(f|0)*0.0}else{n=(s|0)==0;o=n?m:l;n=n?q:j;if((q|0)<0|(q|0)==0&m>>>0<8){j=u;l=q;do{j=j<<4;m=w6(m|0,l|0,1,0)|0;l=D}while((l|0)<0|(l|0)==0&m>>>0<8);m=j}else m=u;if((i|32|0)==112){j=v3(a,g)|0;i=D;if((j|0)==0&(i|0)==-2147483648){if(!g){U1(a,0);h=0.0;break}if(!(c[v>>2]|0)){j=0;i=0}else{c[w>>2]=(c[w>>2]|0)+-1;j=0;i=0}}}else if(!(c[v>>2]|0)){j=0;i=0}else{c[w>>2]=(c[w>>2]|0)+-1;j=0;i=0}l=v6(o|0,n|0,2)|0;l=w6(l|0,D|0,-32,-1)|0;l=w6(l|0,D|0,j|0,i|0)|0;i=D;if(!m){h=+(f|0)*0.0;break}w=0-e|0;g=((w|0)<0)<<31>>31;if((i|0)>(g|0)|(i|0)==(g|0)&l>>>0>w>>>0){c[(L1()|0)>>2]=34;h=+(f|0)*1797693134862315708145274.0e284*1797693134862315708145274.0e284;break}w=e+-106|0;g=((w|0)<0)<<31>>31;if((i|0)<(g|0)|(i|0)==(g|0)&l>>>0>>0){c[(L1()|0)>>2]=34;h=+(f|0)*2.2250738585072014e-308*2.2250738585072014e-308;break}if((m|0)>-1){j=m;do{w=!(h>=.5);j=j<<1|(w^1)&1;h=h+(w?h:h+-1.0);l=w6(l|0,i|0,-1,-1)|0;i=D}while((j|0)>-1);p=h;m=j}else p=h;w=((b|0)<0)<<31>>31;e=t6(32,0,e|0,((e|0)<0)<<31>>31|0)|0;i=w6(e|0,D|0,l|0,i|0)|0;e=D;if((w|0)>(e|0)|(w|0)==(e|0)&b>>>0>i>>>0)if((i|0)>0)n=59;else{j=0;i=84;n=61}else{i=b;n=59}if((n|0)==59)if((i|0)<53){j=i;i=84-i|0;n=61}else{k=0.0;h=+(f|0)}if((n|0)==61){h=+(f|0);k=+x3(+w3(1.0,i),h);i=j}f=(m&1|0)==0&(p!=0.0&(i|0)<32);h=h*(f?0.0:p)+(k+h*+(((f&1)+m|0)>>>0))-k;if(!(h!=0.0))c[(L1()|0)>>2]=34;h=+z3(h,l)}while(0);return +h}function u3(a,b,e,f,g,h){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0.0,j=0.0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,G=0,H=0,I=0,J=0,K=0.0;J=l;l=l+512|0;G=J;H=f+e|0;I=0-H|0;B=a+4|0;C=a+100|0;k=0;a:while(1){switch(b|0){case 46:{z=6;break a}case 48:break;default:{v=0;p=k;q=0;o=0;break a}}b=c[B>>2]|0;if(b>>>0<(c[C>>2]|0)>>>0){c[B>>2]=b+1;b=d[b>>0]|0;k=1;continue}else{b=W1(a)|0;k=1;continue}}if((z|0)==6){b=c[B>>2]|0;if(b>>>0<(c[C>>2]|0)>>>0){c[B>>2]=b+1;b=d[b>>0]|0}else b=W1(a)|0;if((b|0)==48){k=0;b=0;while(1){k=w6(k|0,b|0,-1,-1)|0;o=D;b=c[B>>2]|0;if(b>>>0<(c[C>>2]|0)>>>0){c[B>>2]=b+1;b=d[b>>0]|0}else b=W1(a)|0;if((b|0)==48)b=o;else{v=1;p=1;q=k;break}}}else{v=1;p=k;q=0;o=0}}c[G>>2]=0;n=b+-48|0;m=(b|0)==46;b:do if(m|n>>>0<10){A=G+496|0;w=0;k=0;u=0;x=v;y=p;z=n;p=0;n=0;c:while(1){do if(m)if(!x){x=1;q=p;o=n}else break c;else{p=w6(p|0,n|0,1,0)|0;n=D;v=(b|0)!=48;if((k|0)>=125){if(!v)break;c[A>>2]=c[A>>2]|1;break}m=G+(k<<2)|0;if(!w)b=z;else b=b+-48+((c[m>>2]|0)*10|0)|0;c[m>>2]=b;w=w+1|0;y=(w|0)==9;w=y?0:w;k=(y&1)+k|0;u=v?p:u;y=1}while(0);b=c[B>>2]|0;if(b>>>0<(c[C>>2]|0)>>>0){c[B>>2]=b+1;b=d[b>>0]|0}else b=W1(a)|0;z=b+-48|0;m=(b|0)==46;if(!(m|z>>>0<10)){v=x;m=y;z=29;break b}}b=w;m=(y|0)!=0;z=37}else{w=0;k=0;u=0;m=p;p=0;n=0;z=29}while(0);do if((z|0)==29){A=(v|0)==0;q=A?p:q;o=A?n:o;m=(m|0)!=0;if(!(m&(b|32|0)==101))if((b|0)>-1){b=w;z=37;break}else{b=w;z=39;break}m=v3(a,h)|0;b=D;if((m|0)==0&(b|0)==-2147483648){if(!h){U1(a,0);i=0.0;break}if(!(c[C>>2]|0)){m=0;b=0}else{c[B>>2]=(c[B>>2]|0)+-1;m=0;b=0}}y=w6(m|0,b|0,q|0,o|0)|0;b=w;o=D;z=41}while(0);if((z|0)==37)if(c[C>>2]|0){c[B>>2]=(c[B>>2]|0)+-1;if(m){y=q;z=41}else z=40}else z=39;if((z|0)==39)if(m){y=q;z=41}else z=40;do if((z|0)==40){c[(L1()|0)>>2]=22;U1(a,0);i=0.0}else if((z|0)==41){m=c[G>>2]|0;if(!m){i=+(g|0)*0.0;break}if(((n|0)<0|(n|0)==0&p>>>0<10)&((y|0)==(p|0)&(o|0)==(n|0))?(e|0)>30|(m>>>e|0)==0:0){i=+(g|0)*+(m>>>0);break}a=(f|0)/-2|0;C=((a|0)<0)<<31>>31;if((o|0)>(C|0)|(o|0)==(C|0)&y>>>0>a>>>0){c[(L1()|0)>>2]=34;i=+(g|0)*1797693134862315708145274.0e284*1797693134862315708145274.0e284;break}a=f+-106|0;C=((a|0)<0)<<31>>31;if((o|0)<(C|0)|(o|0)==(C|0)&y>>>0>>0){c[(L1()|0)>>2]=34;i=+(g|0)*2.2250738585072014e-308*2.2250738585072014e-308;break}if(b){if((b|0)<9){n=G+(k<<2)|0;m=c[n>>2]|0;do{m=m*10|0;b=b+1|0}while((b|0)!=9);c[n>>2]=m}k=k+1|0}if((u|0)<9?(u|0)<=(y|0)&(y|0)<18:0){b=c[G>>2]|0;if((y|0)==9){i=+(g|0)*+(b>>>0);break}if((y|0)<9){i=+(g|0)*+(b>>>0)/+(c[63704+(8-y<<2)>>2]|0);break}a=e+27+(S(y,-3)|0)|0;if((a|0)>30|(b>>>a|0)==0){i=+(g|0)*+(b>>>0)*+(c[63704+(y+-10<<2)>>2]|0);break}}b=(y|0)%9|0;if(!b){b=0;n=0}else{u=(y|0)>-1?b:b+9|0;p=c[63704+(8-u<<2)>>2]|0;if(k){q=1e9/(p|0)|0;n=0;o=0;m=y;b=0;do{B=G+(b<<2)|0;C=c[B>>2]|0;a=((C>>>0)/(p>>>0)|0)+n|0;c[B>>2]=a;n=S(q,(C>>>0)%(p>>>0)|0)|0;a=(b|0)==(o|0)&(a|0)==0;m=a?m+-9|0:m;o=a?o+1&127:o;b=b+1|0}while((b|0)!=(k|0));if(!n)n=o;else{c[G+(k<<2)>>2]=n;n=o;k=k+1|0}}else{n=0;k=0;m=y}b=0;y=9-u+m|0}d:while(1){u=(y|0)<18;v=(y|0)==18;w=G+(n<<2)|0;while(1){if(!u){if(!v){m=y;break d}if((c[w>>2]|0)>>>0>=9007199){m=18;break d}}m=0;x=k;k=k+127|0;while(1){o=k&127;p=G+(o<<2)|0;k=v6(c[p>>2]|0,0,29)|0;k=w6(k|0,D|0,m|0,0)|0;m=D;if(m>>>0>0|(m|0)==0&k>>>0>1e9){q=E6(k|0,m|0,1e9,0)|0;k=J6(k|0,m|0,1e9,0)|0}else q=0;c[p>>2]=k;a=(o|0)==(n|0);x=(k|0)==0&(((o|0)!=(x+127&127|0)|a)^1)?o:x;if(a)break;else{m=q;k=o+-1|0}}b=b+-29|0;if(q|0)break;else k=x}n=n+127&127;k=x+127&127;m=G+((x+126&127)<<2)|0;if((n|0)==(x|0))c[m>>2]=c[m>>2]|c[G+(k<<2)>>2];else k=x;c[G+(n<<2)>>2]=q;y=y+9|0}e:while(1){w=k+1&127;x=G+((k+127&127)<<2)|0;while(1){q=(m|0)==18;v=(m|0)>27?9:1;y=n;while(1){n=0;while(1){o=n+y&127;if((o|0)==(k|0)){E=2;z=88;break}o=c[G+(o<<2)>>2]|0;p=c[63736+(n<<2)>>2]|0;if(o>>>0

>>0){E=2;z=88;break}if(o>>>0>p>>>0)break;n=n+1|0;if((n|0)>=2){E=n;z=88;break}}if((z|0)==88?(z=0,q&(E|0)==2):0){i=0.0;o=0;break e}b=v+b|0;if((y|0)==(k|0))y=k;else break}q=(1<>>v;p=0;n=y;o=y;do{B=G+(o<<2)|0;C=c[B>>2]|0;a=(C>>>v)+p|0;c[B>>2]=a;p=S(C&q,u)|0;a=(o|0)==(n|0)&(a|0)==0;m=a?m+-9|0:m;n=a?n+1&127:n;o=o+1&127}while((o|0)!=(k|0));if(!p)continue;if((w|0)!=(n|0))break;c[x>>2]=c[x>>2]|1}c[G+(k<<2)>>2]=p;k=w}do{n=o+y&127;m=k+1&127;if((n|0)==(k|0)){c[G+(m+-1<<2)>>2]=0;k=m}i=i*1.0e9+ +((c[G+(n<<2)>>2]|0)>>>0);o=o+1|0}while((o|0)!=2);t=+(g|0);j=t*i;o=b+53|0;p=o-f|0;q=(p|0)<(e|0);n=q?((p|0)>0?p:0):e;if((n|0)<53){K=+x3(+w3(1.0,105-n|0),j);r=+y3(j,+w3(1.0,53-n|0));s=K;i=r;r=K+(j-r)}else{s=0.0;i=0.0;r=j}m=y+2&127;if((m|0)!=(k|0)){m=c[G+(m<<2)>>2]|0;do if(m>>>0>=5e8){if((m|0)!=5e8){i=t*.75+i;break}if((y+3&127|0)==(k|0)){i=t*.5+i;break}else{i=t*.75+i;break}}else{if((m|0)==0?(y+3&127|0)==(k|0):0)break;i=t*.25+i}while(0);if((53-n|0)>1?!(+y3(i,1.0)!=0.0):0)j=i+1.0;else j=i}else j=i;i=r+j-s;do if((o&2147483647|0)>(-2-H|0)){H=!(+F(+i)>=9007199254740992.0);b=((H^1)&1)+b|0;i=H?i:i*.5;if((b+50|0)<=(I|0)?!(j!=0.0&(q&((n|0)!=(p|0)|H))):0)break;c[(L1()|0)>>2]=34}while(0);i=+z3(i,b)}while(0);l=J;return +i}function v3(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=a+4|0;e=c[k>>2]|0;j=a+100|0;if(e>>>0<(c[j>>2]|0)>>>0){c[k>>2]=e+1;e=d[e>>0]|0}else e=W1(a)|0;switch(e|0){case 43:case 45:{f=(e|0)==45&1;e=c[k>>2]|0;if(e>>>0<(c[j>>2]|0)>>>0){c[k>>2]=e+1;e=d[e>>0]|0}else e=W1(a)|0;if((b|0)!=0&(e+-48|0)>>>0>9?(c[j>>2]|0)!=0:0)c[k>>2]=(c[k>>2]|0)+-1;break}default:f=0}if((e+-48|0)>>>0>9)if(!(c[j>>2]|0)){f=-2147483648;e=0}else{c[k>>2]=(c[k>>2]|0)+-1;f=-2147483648;e=0}else{g=0;do{g=e+-48+(g*10|0)|0;e=c[k>>2]|0;if(e>>>0<(c[j>>2]|0)>>>0){c[k>>2]=e+1;e=d[e>>0]|0}else e=W1(a)|0}while((e+-48|0)>>>0<10&(g|0)<214748364);b=((g|0)<0)<<31>>31;if((e+-48|0)>>>0<10){do{b=G6(g|0,b|0,10,0)|0;g=D;e=w6(e|0,((e|0)<0)<<31>>31|0,-48,-1)|0;g=w6(e|0,D|0,b|0,g|0)|0;b=D;e=c[k>>2]|0;if(e>>>0<(c[j>>2]|0)>>>0){c[k>>2]=e+1;e=d[e>>0]|0}else e=W1(a)|0}while((e+-48|0)>>>0<10&((b|0)<21474836|(b|0)==21474836&g>>>0<2061584302));h=e;i=g}else{h=e;i=g}e=c[j>>2]|0;if((h+-48|0)>>>0<10)do{g=c[k>>2]|0;if(g>>>0>>0){c[k>>2]=g+1;g=d[g>>0]|0}else{g=W1(a)|0;e=c[j>>2]|0}}while((g+-48|0)>>>0<10);if(e|0)c[k>>2]=(c[k>>2]|0)+-1;k=(f|0)!=0;e=t6(0,0,i|0,b|0)|0;f=k?D:b;e=k?e:i}D=f;return e|0}function w3(a,b){a=+a;b=b|0;var d=0,e=0;if((b|0)<=1023){if((b|0)<-1022){a=a*2.2250738585072014e-308;d=b+1022|0;e=(d|0)<-1022;b=b+2044|0;a=e?a*2.2250738585072014e-308:a;b=e?((b|0)>-1022?b:-1022):d}}else{a=a*8988465674311579538646525.0e283;e=b+-1023|0;d=(e|0)>1023;b=b+-2046|0;a=d?a*8988465674311579538646525.0e283:a;b=d?((b|0)<1023?b:1023):e}d=v6(b+1023|0,0,52)|0;e=D;c[j>>2]=d;c[j+4>>2]=e;return +(a*+h[j>>3])}function x3(a,b){a=+a;b=+b;return +(+e2(a,b))}function y3(a,b){a=+a;b=+b;return +(+A3(a,b))}function z3(a,b){a=+a;b=b|0;return +(+w3(a,b))}function A3(a,b){a=+a;b=+b;var d=0,e=0,f=0,g=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h[j>>3]=a;i=c[j>>2]|0;l=c[j+4>>2]|0;h[j>>3]=b;n=c[j>>2]|0;o=c[j+4>>2]|0;e=z6(i|0,l|0,52)|0;e=e&2047;m=z6(n|0,o|0,52)|0;m=m&2047;p=l&-2147483648;g=v6(n|0,o|0,1)|0;k=D;a:do if(!((g|0)==0&(k|0)==0)?(f=B3(b)|0,d=D&2147483647,!((e|0)==2047|(d>>>0>2146435072|(d|0)==2146435072&f>>>0>0))):0){d=v6(i|0,l|0,1)|0;f=D;if(!(f>>>0>k>>>0|(f|0)==(k|0)&d>>>0>g>>>0))return +((d|0)==(g|0)&(f|0)==(k|0)?a*0.0:a);if(!e){d=v6(i|0,l|0,12)|0;f=D;if((f|0)>-1|(f|0)==-1&d>>>0>4294967295){e=0;do{e=e+-1|0;d=v6(d|0,f|0,1)|0;f=D}while((f|0)>-1|(f|0)==-1&d>>>0>4294967295)}else e=0;i=v6(i|0,l|0,1-e|0)|0;g=D}else g=l&1048575|1048576;if(!m){f=v6(n|0,o|0,12)|0;k=D;if((k|0)>-1|(k|0)==-1&f>>>0>4294967295){d=0;do{d=d+-1|0;f=v6(f|0,k|0,1)|0;k=D}while((k|0)>-1|(k|0)==-1&f>>>0>4294967295)}else d=0;n=v6(n|0,o|0,1-d|0)|0;m=d;l=D}else l=o&1048575|1048576;f=t6(i|0,g|0,n|0,l|0)|0;d=D;k=(d|0)>-1|(d|0)==-1&f>>>0>4294967295;b:do if((e|0)>(m|0)){while(1){if(k){if((f|0)==0&(d|0)==0)break}else{f=i;d=g}i=v6(f|0,d|0,1)|0;g=D;e=e+-1|0;f=t6(i|0,g|0,n|0,l|0)|0;d=D;k=(d|0)>-1|(d|0)==-1&f>>>0>4294967295;if((e|0)<=(m|0))break b}b=a*0.0;break a}while(0);if(k){if((f|0)==0&(d|0)==0){b=a*0.0;break}}else{d=g;f=i}if(d>>>0<1048576|(d|0)==1048576&f>>>0<0)do{f=v6(f|0,d|0,1)|0;d=D;e=e+-1|0}while(d>>>0<1048576|(d|0)==1048576&f>>>0<0);if((e|0)>0){o=w6(f|0,d|0,0,-1048576)|0;d=D;e=v6(e|0,0,52)|0;d=d|D;e=o|e}else{e=z6(f|0,d|0,1-e|0)|0;d=D}c[j>>2]=e;c[j+4>>2]=d|p;b=+h[j>>3]}else q=3;while(0);if((q|0)==3){b=a*b;b=b/b}return +b}function B3(a){a=+a;var b=0;h[j>>3]=a;b=c[j>>2]|0;D=c[j+4>>2]|0;return b|0}function C3(b,c){b=b|0;c=c|0;var e=0,f=0,g=0;f=a[b>>0]|0;e=f&255;a:do if(f<<24>>24){g=f;do{f=a[c>>0]|0;if(!(f<<24>>24))break a;if(g<<24>>24!=f<<24>>24?(g=R1(e)|0,(g|0)!=(R1(f&255)|0)):0)break a;b=b+1|0;c=c+1|0;g=a[b>>0]|0;e=g&255}while(g<<24>>24!=0)}while(0);g=R1(e)|0;return g-(R1(d[c>>0]|0)|0)|0}function D3(b){b=b|0;var d=0,e=0,f=0;f=b;a:do if(!(f&3))e=4;else{d=f;while(1){if(!(a[b>>0]|0)){b=d;break a}b=b+1|0;d=b;if(!(d&3)){e=4;break}}}while(0);if((e|0)==4){while(1){d=c[b>>2]|0;if(!((d&-2139062144^-2139062144)&d+-16843009))b=b+4|0;else break}if((d&255)<<24>>24)do b=b+1|0;while((a[b>>0]|0)!=0)}return b-f|0}function E3(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;H3();c[e>>2]=a;c[e+4>>2]=b;b=K1(Ma(91,e|0)|0)|0;l=d;return b|0}function F3(b,c){b=b|0;c=c|0;b=G3(b,c)|0;return ((a[b>>0]|0)==(c&255)<<24>>24?b:0)|0}function G3(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;f=d&255;a:do if(!f)b=b+(D3(b)|0)|0;else{if(b&3){e=d&255;do{g=a[b>>0]|0;if(g<<24>>24==0?1:g<<24>>24==e<<24>>24)break a;b=b+1|0}while((b&3|0)!=0)}f=S(f,16843009)|0;e=c[b>>2]|0;b:do if(!((e&-2139062144^-2139062144)&e+-16843009))do{g=e^f;if((g&-2139062144^-2139062144)&g+-16843009|0)break b;b=b+4|0;e=c[b>>2]|0}while(!((e&-2139062144^-2139062144)&e+-16843009|0));while(0);e=d&255;while(1){g=a[b>>0]|0;if(g<<24>>24==0?1:g<<24>>24==e<<24>>24)break;else b=b+1|0}}while(0);return b|0}function H3(){return}function I3(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0;k=l;l=l+16|0;g=k;i=(f|0)==0?190424:f;f=c[i>>2]|0;a:do if(!d)if(!f)f=0;else j=17;else{h=(b|0)==0?g:b;if(!e)f=-2;else{if(!f){f=a[d>>0]|0;if(f<<24>>24>-1){c[h>>2]=f&255;f=f<<24>>24!=0&1;break}g=(c[c[(J3()|0)+188>>2]>>2]|0)==0;f=a[d>>0]|0;if(g){c[h>>2]=f<<24>>24&57343;f=1;break}f=(f&255)+-194|0;if(f>>>0>50){j=17;break}f=c[62656+(f<<2)>>2]|0;g=e+-1|0;if(g){d=d+1|0;j=11}}else{g=e;j=11}b:do if((j|0)==11){b=a[d>>0]|0;m=(b&255)>>>3;if((m+-16|m+(f>>26))>>>0>7){j=17;break a}while(1){d=d+1|0;f=(b&255)+-128|f<<6;g=g+-1|0;if((f|0)>=0)break;if(!g)break b;b=a[d>>0]|0;if((b&-64)<<24>>24!=-128){j=17;break a}}c[i>>2]=0;c[h>>2]=f;f=e-g|0;break a}while(0);c[i>>2]=f;f=-2}}while(0);if((j|0)==17){c[i>>2]=0;c[(L1()|0)>>2]=84;f=-1}l=k;return f|0}function J3(){return N1()|0}function K3(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+272|0;n=p+8|0;o=p;do if(!(a[d>>0]|0)){d=Na(153613)|0;if(d|0?a[d>>0]|0:0)break;d=Na(153620+(b*12|0)|0)|0;if(d|0?a[d>>0]|0:0)break;d=Na(153692)|0;if(d|0?a[d>>0]|0:0)break;d=153697}while(0);e=0;a:do{switch(a[d+e>>0]|0){case 47:case 0:break a;default:{}}e=e+1|0}while(e>>>0<15);f=a[d>>0]|0;if(f<<24>>24!=46?(a[d+e>>0]|0)==0:0)if(f<<24>>24==67)m=15;else{k=d;m=16}else{d=153697;m=15}if((m|0)==15)if(!(a[d+1>>0]|0))m=18;else{k=d;m=16}b:do if((m|0)==16)if((f2(k,153697)|0)!=0?(f2(k,153705)|0)!=0:0){d=c[47607]|0;if(d|0)do{if(!(f2(k,d+8|0)|0))break b;d=c[d+24>>2]|0}while((d|0)!=0);Ua(190432);d=c[47607]|0;c:do if(d|0){while(1){if(!(f2(k,d+8|0)|0))break;d=c[d+24>>2]|0;if(!d)break c}Ra(190432);break b}while(0);d:do if(((c[47592]|0)==0?(g=Na(153711)|0,(g|0)!=0):0)?(a[g>>0]|0)!=0:0){i=254-e|0;j=e+1|0;f=g;while(1){h=G3(f,58)|0;d=a[h>>0]|0;g=((d<<24>>24!=0)<<31>>31)+(h-f)|0;if(g>>>0>>0){B6(n|0,f|0,g|0)|0;f=n+g|0;a[f>>0]=47;B6(f+1|0,k|0,e|0)|0;a[n+(j+g)>>0]=0;g=Oa(n|0,o|0)|0;if(g|0)break;d=a[h>>0]|0}f=h+(d<<24>>24!=0&1)|0;if(!(a[f>>0]|0)){m=41;break d}}d=k6(28)|0;f=c[o>>2]|0;if(!d){E3(g,f)|0;m=41;break}else{c[d>>2]=g;c[d+4>>2]=f;o=d+8|0;B6(o|0,k|0,e|0)|0;a[o+e>>0]=0;c[d+24>>2]=c[47607];c[47607]=d;break}}else m=41;while(0);if((m|0)==41){d=k6(28)|0;if(d){c[d>>2]=c[15652];c[d+4>>2]=c[15653];o=d+8|0;B6(o|0,k|0,e|0)|0;a[o+e>>0]=0;c[d+24>>2]=c[47607];c[47607]=d}}Ra(190432);d=(b|0)==0&(d|0)==0?62608:d}else{d=k;m=18}while(0);do if((m|0)==18){if((b|0)==0?(a[d+1>>0]|0)==46:0){d=62608;break}d=0}while(0);l=p;return d|0}function L3(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+16|0;g=h;do if(b>>>0>6)d=0;else{Ua(190440);if((b|0)!=6){d=M3(b,d)|0;Ra(190440);break}if(!d){d=197414;b=0}else{b=g;e=153724;f=b+16|0;do{a[b>>0]=a[e>>0]|0;b=b+1|0;e=e+1|0}while((b|0)<(f|0));f=0;do{b=G3(d,59)|0;e=b-d|0;if((e|0)<16){B6(g|0,d|0,e|0)|0;a[g+e>>0]=0;d=(a[b>>0]|0)==0?d:b+1|0}M3(f,g)|0;f=f+1|0}while((f|0)!=6);d=197414;b=0}do{f=c[190400+(b<<2)>>2]|0;f=f|0?f+8|0:153740;g=D3(f)|0;B6(d|0,f|0,g|0)|0;a[d+g>>0]=59;d=d+(g+1)|0;b=b+1|0}while((b|0)!=6);a[d+-1>>0]=0;Ra(190440);d=197414}while(0);l=h;return d|0}function M3(a,b){a=a|0;b=b|0;if(!b)a=c[190400+(a<<2)>>2]|0;else{b=K3(a,b)|0;c[190400+(a<<2)>>2]=b;a=b}return (a|0?a+8|0:153740)|0}function N3(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0;if(!e)f=0;else{g=a[b>>0]|0;f=g&255;a:do if(g<<24>>24){h=g;do{e=e+-1|0;g=a[c>>0]|0;if(!((e|0)!=0&g<<24>>24!=0))break a;if(h<<24>>24!=g<<24>>24?(h=R1(f)|0,(h|0)!=(R1(g&255)|0)):0)break a;b=b+1|0;c=c+1|0;h=a[b>>0]|0;f=h&255}while(h<<24>>24!=0)}while(0);f=R1(f)|0;f=f-(R1(d[c>>0]|0)|0)|0}return f|0}function O3(a,b){a=a|0;b=b|0;P3(a,b)|0;return a|0}function P3(b,d){b=b|0;d=d|0;var e=0,f=0;e=d;a:do if(!((e^b)&3)){if(e&3)do{e=a[d>>0]|0;a[b>>0]=e;if(!(e<<24>>24))break a;d=d+1|0;b=b+1|0}while((d&3|0)!=0);e=c[d>>2]|0;if(!((e&-2139062144^-2139062144)&e+-16843009)){f=b;while(1){d=d+4|0;b=f+4|0;c[f>>2]=e;e=c[d>>2]|0;if((e&-2139062144^-2139062144)&e+-16843009|0)break;else f=b}}f=8}else f=8;while(0);if((f|0)==8){f=a[d>>0]|0;a[b>>0]=f;if(f<<24>>24)do{d=d+1|0;b=b+1|0;f=a[d>>0]|0;a[b>>0]=f}while(f<<24>>24!=0)}return b|0}function Q3(a,b){a=+a;b=+b;var c=0.0,d=0.0,e=0.0,f=0.0;c=a*a;d=c*c;e=c*.5;f=1.0-e;return +(f+(1.0-f-e+(c*(c*(c*(c*2.480158728947673e-05+-.001388888888887411)+.0416666666666666)+d*d*(c*(2.087572321298175e-09-c*1.1359647557788195e-11)+-2.7557314351390663e-07))-a*b)))}function R3(a,b){a=+a;b=b|0;var d=0,e=0.0,f=0.0,g=0.0,i=0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0;r=l;l=l+48|0;m=r+16|0;n=r;h[j>>3]=a;d=c[j>>2]|0;i=c[j+4>>2]|0;o=z6(d|0,i|0,63)|0;q=i&2147483647;do if(q>>>0<1074752123)if((i&1048575|0)!=598523){d=(o|0)!=0;if(q>>>0<1073928573)if(d){g=a+1.5707963267341256;k=g+6.077100506506192e-11;h[b>>3]=k;h[b+8>>3]=g-k+6.077100506506192e-11;d=-1;break}else{g=a+-1.5707963267341256;k=g+-6.077100506506192e-11;h[b>>3]=k;h[b+8>>3]=g-k+-6.077100506506192e-11;d=1;break}else if(d){g=a+3.1415926534682512;k=g+1.2154201013012384e-10;h[b>>3]=k;h[b+8>>3]=g-k+1.2154201013012384e-10;d=-2;break}else{g=a+-3.1415926534682512;k=g+-1.2154201013012384e-10;h[b>>3]=k;h[b+8>>3]=g-k+-1.2154201013012384e-10;d=2;break}}else p=21;else{if(q>>>0<1075594812)if(q>>>0<1075183037){if((q|0)==1074977148){p=21;break}if(!o){g=a+-4.712388980202377;k=g+-1.8231301519518578e-10;h[b>>3]=k;h[b+8>>3]=g-k+-1.8231301519518578e-10;d=3;break}else{g=a+4.712388980202377;k=g+1.8231301519518578e-10;h[b>>3]=k;h[b+8>>3]=g-k+1.8231301519518578e-10;d=-3;break}}else{if((q|0)==1075388923){p=21;break}if(!o){g=a+-6.2831853069365025;k=g+-2.430840202602477e-10;h[b>>3]=k;h[b+8>>3]=g-k+-2.430840202602477e-10;d=4;break}else{g=a+6.2831853069365025;k=g+2.430840202602477e-10;h[b>>3]=k;h[b+8>>3]=g-k+2.430840202602477e-10;d=-4;break}}if(q>>>0>=1094263291){if(q>>>0>2146435071){k=a-a;h[b+8>>3]=k;h[b>>3]=k;d=0;break}c[j>>2]=d;c[j+4>>2]=i&1048575|1096810496;a=+h[j>>3];d=0;do{k=+(~~a|0);h[m+(d<<3)>>3]=k;a=(a-k)*16777216.0;d=d+1|0}while((d|0)!=2);h[m+16>>3]=a;if(a==0.0){d=1;while(1)if(+h[m+(d<<3)>>3]==0.0)d=d+-1|0;else break}else d=2;d=S3(m,n,(q>>>20)+-1046|0,d+1|0,1)|0;e=+h[n>>3];a=+h[n+8>>3];if(!o){h[b>>3]=e;h[b+8>>3]=a;break}else{h[b>>3]=-e;h[b+8>>3]=-a;d=0-d|0;break}}else p=21}while(0);if((p|0)==21){g=a*.6366197723675814+6755399441055744.0+-6755399441055744.0;d=~~g;e=a-g*1.5707963267341256;f=g*6.077100506506192e-11;a=e-f;h[b>>3]=a;h[j>>3]=a;p=z6(c[j>>2]|0,c[j+4>>2]|0,52)|0;i=q>>>20;if((i-(p&2047)|0)>16){f=g*6.077100506303966e-11;k=e-f;f=g*2.0222662487959506e-21-(e-k-f);a=k-f;h[b>>3]=a;h[j>>3]=a;q=z6(c[j>>2]|0,c[j+4>>2]|0,52)|0;s=g*2.0222662487111665e-21;e=k-s;g=g*8.4784276603689e-32-(k-e-s);if((i-(q&2047)|0)>49){a=e-g;h[b>>3]=a;f=g}else e=k}h[b+8>>3]=e-a-f}l=r;return d|0}function S3(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0.0,i=0.0,j=0,k=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,F=0,G=0,H=0,I=0;I=l;l=l+560|0;C=I+480|0;A=I+320|0;H=I+160|0;F=I;D=c[63744+(f<<2)>>2]|0;q=e+-1|0;z=(d+-3|0)/24|0;z=(z|0)>0?z:0;B=S(z,-24)|0;j=d+-24+B|0;if((D+q|0)>=0){o=D+e|0;m=z-q|0;n=0;while(1){if((m|0)<0)g=0.0;else g=+(c[63760+(m<<2)>>2]|0);h[A+(n<<3)>>3]=g;n=n+1|0;if((n|0)==(o|0))break;else m=m+1|0}}p=(e|0)>0;o=0;while(1){if(p){n=o+q|0;g=0.0;m=0;do{g=g+ +h[a+(m<<3)>>3]*+h[A+(n-m<<3)>>3];m=m+1|0}while((m|0)!=(e|0))}else g=0.0;h[F+(o<<3)>>3]=g;if((o|0)<(D|0))o=o+1|0;else break}u=(j|0)>0;v=24-j|0;w=23-j|0;x=(e|0)>0;y=(j|0)==0;m=D;a:while(1){g=+h[F+(m<<3)>>3];p=(m|0)>0;if(p){n=m;o=0;while(1){k=+(~~(g*5.9604644775390625e-08)|0);c[C+(o<<2)>>2]=~~(g-k*16777216.0);t=n;n=n+-1|0;g=k+ +h[F+(n<<3)>>3];if((t|0)<=1)break;else o=o+1|0}}g=+w3(g,j);g=g-+E(+(g*.125))*8.0;n=~~g;g=g-+(n|0);do if(!u)if(!y)if(!(g>=.5)){q=0;t=n;break}else{o=2;G=20;break}else{o=c[C+(m+-1<<2)>>2]>>23;G=19;break}else{t=C+(m+-1<<2)|0;o=c[t>>2]|0;G=o>>v;o=o-(G<>2]=o;o=o>>w;n=G+n|0;G=19}while(0);if((G|0)==19){G=0;if((o|0)>0)G=20;else{q=o;t=n}}if((G|0)==20){G=0;t=n+1|0;if(p){n=0;s=0;do{q=C+(s<<2)|0;r=c[q>>2]|0;if(!n)if(!r)n=0;else{n=1;p=16777216;G=23}else{p=16777215;G=23}if((G|0)==23){G=0;c[q>>2]=p-r}s=s+1|0}while((s|0)!=(m|0))}else n=0;b:do if(u){switch(j|0){case 1:{p=8388607;break}case 2:{p=4194303;break}default:break b}s=C+(m+-1<<2)|0;c[s>>2]=c[s>>2]&p}while(0);if((o|0)==2){g=1.0-g;if(!n)q=2;else{q=2;g=g-+w3(1.0,j)}}else q=o}if(!(g==0.0)){G=42;break}if((m|0)>(D|0)){n=0;o=m;do{o=o+-1|0;n=c[C+(o<<2)>>2]|n}while((o|0)>(D|0));if(n){G=41;break}else n=1}else n=1;while(1)if(!(c[C+(D-n<<2)>>2]|0))n=n+1|0;else break;p=n+m|0;if((n|0)<=0){m=p;continue}while(1){o=m+1|0;n=m+e|0;h[A+(n<<3)>>3]=+(c[63760+(o+z<<2)>>2]|0);if(x){g=0.0;m=0;do{g=g+ +h[a+(m<<3)>>3]*+h[A+(n-m<<3)>>3];m=m+1|0}while((m|0)!=(e|0))}else g=0.0;h[F+(o<<3)>>3]=g;if((o|0)<(p|0))m=o;else{m=p;continue a}}}if((G|0)==41)while(1){G=0;j=j+-24|0;m=m+-1|0;if(!(c[C+(m<<2)>>2]|0))G=41;else{p=m;break}}else if((G|0)==42){g=+w3(g,0-j|0);if(g>=16777216.0){k=+(~~(g*5.9604644775390625e-08)|0);c[C+(m<<2)>>2]=~~(g-k*16777216.0);j=B+d|0;m=m+1|0;g=k}c[C+(m<<2)>>2]=~~g;p=m}o=(p|0)>-1;if(o){g=+w3(1.0,j);j=p;while(1){h[F+(j<<3)>>3]=g*+(c[C+(j<<2)>>2]|0);if((j|0)>0){g=g*5.9604644775390625e-08;j=j+-1|0}else break}if(o){m=p;while(1){n=p-m|0;j=0;g=0.0;while(1){g=g+ +h[10952+(j<<3)>>3]*+h[F+(j+m<<3)>>3];if((j|0)>=(D|0)|(j|0)>=(n|0))break;else j=j+1|0}h[H+(n<<3)>>3]=g;if((m|0)>0)m=m+-1|0;else break}}}switch(f|0){case 0:{if(o){g=0.0;j=p;while(1){g=g+ +h[H+(j<<3)>>3];if((j|0)>0)j=j+-1|0;else break}}else g=0.0;i=(q|0)==0?g:-g;G=73;break}case 2:case 1:{if(o){g=0.0;j=p;while(1){g=g+ +h[H+(j<<3)>>3];if((j|0)>0)j=j+-1|0;else break}}else g=0.0;m=(q|0)==0;h[b>>3]=m?g:-g;g=+h[H>>3]-g;if((p|0)>=1){j=1;while(1){g=g+ +h[H+(j<<3)>>3];if((j|0)==(p|0))break;else j=j+1|0}}i=m?g:-g;b=b+8|0;G=73;break}case 3:{if((p|0)>0){j=p;g=+h[H+(p<<3)>>3];do{G=j;j=j+-1|0;F=H+(j<<3)|0;k=+h[F>>3];i=g;g=k+g;h[H+(G<<3)>>3]=i+(k-g);h[F>>3]=g}while((G|0)>1);m=(p|0)>1;if(m){j=p;g=+h[H+(p<<3)>>3];do{F=j;j=j+-1|0;G=H+(j<<3)|0;k=+h[G>>3];i=g;g=k+g;h[H+(F<<3)>>3]=i+(k-g);h[G>>3]=g}while((j|0)>1);if(m){j=p;i=0.0;do{i=i+ +h[H+(j<<3)>>3];j=j+-1|0}while((j|0)>1)}else i=0.0}else i=0.0}else i=0.0;k=+h[H>>3];g=+h[H+8>>3];if(!q)h[b>>3]=k;else{h[b>>3]=-k;i=-i;g=-g}h[b+8>>3]=g;b=b+16|0;G=73;break}default:{}}if((G|0)==73)h[b>>3]=i;l=I;return t&7|0}function T3(a,b,c){a=+a;b=+b;c=c|0;var d=0.0,e=0.0,f=0.0;f=a*a;d=f*(f*f)*(f*1.58969099521155e-10+-2.5050760253406863e-08)+(f*(f*2.7557313707070068e-06+-1.984126982985795e-04)+.00833333333332249);e=f*a;if(!c)a=e*(f*d+-.16666666666666632)+a;else a=a-(e*.16666666666666632+(f*(b*.5-e*d)-b));return +a}function U3(a){a=+a;var b=0,d=0,e=0,f=0.0,g=0.0;h[j>>3]=a;d=c[j+4>>2]|0;b=d&2147483647;do if(b>>>0>2146435071)a=a+a;else{if(b>>>0<1048576){h[j>>3]=a*18014398509481984.0;d=c[j+4>>2]|0;b=d&2147483647;if(!b)break;else e=696219795}else e=715094163;c[j>>2]=0;c[j+4>>2]=((b>>>0)/3|0)+e|d&-2147483648;g=+h[j>>3];f=g*g*(g/a);h[j>>3]=g*(f*(f*f)*(f*.14599619288661245+-.758397934778766)+(f*(f*1.6214297201053545+-1.8849797954337717)+1.87595182427177));d=w6(c[j>>2]|0,c[j+4>>2]|0,-2147483648,0)|0;e=D;c[j>>2]=d&-1073741824;c[j+4>>2]=e;f=+h[j>>3];a=a/(f*f);a=f+f*((a-f)/(f+f+a))}while(0);return +a}function V3(a){a=+a;var b=0,d=0,e=0,f=0,g=0.0,i=0.0,k=0.0,l=0.0,m=0.0;h[j>>3]=a;b=c[j>>2]|0;d=c[j+4>>2]|0;e=(d|0)<0;do if(e|d>>>0<1048576){if((b|0)==0&(d&2147483647|0)==0){a=-1.0/(a*a);break}if(e){a=(a-a)/0.0;break}else{h[j>>3]=a*18014398509481984.0;d=c[j+4>>2]|0;e=-1077;b=c[j>>2]|0;f=9;break}}else if(d>>>0<=2146435071)if((b|0)==0&0==0&(d|0)==1072693248)a=0.0;else{e=-1023;f=9}while(0);if((f|0)==9){f=d+614242|0;c[j>>2]=b;c[j+4>>2]=(f&1048575)+1072079006;k=+h[j>>3]+-1.0;i=k*(k*.5);l=k/(k+2.0);m=l*l;a=m*m;h[j>>3]=k-i;d=c[j+4>>2]|0;c[j>>2]=0;c[j+4>>2]=d;g=+h[j>>3];a=k-g-i+l*(i+(a*(a*(a*.15313837699209373+.22222198432149784)+.3999999999940942)+m*(a*(a*(a*.14798198605116586+.1818357216161805)+.2857142874366239)+.6666666666666735)));m=g*.4342944818781689;i=+(e+(f>>>20)|0);l=i*.30102999566361177;k=l+m;a=k+(m+(l-k)+(a*.4342944818781689+(i*3.694239077158931e-13+(g+a)*2.5082946711645275e-11)))}return +a}function W3(a){a=+a;var b=0,d=0,e=0,f=0,g=0.0,i=0.0,k=0.0,l=0.0,m=0.0;h[j>>3]=a;b=c[j>>2]|0;d=c[j+4>>2]|0;e=(d|0)<0;do if(e|d>>>0<1048576){if((b|0)==0&(d&2147483647|0)==0){a=-1.0/(a*a);break}if(e){a=(a-a)/0.0;break}else{h[j>>3]=a*18014398509481984.0;d=c[j+4>>2]|0;e=-1077;b=c[j>>2]|0;f=9;break}}else if(d>>>0<=2146435071)if((b|0)==0&0==0&(d|0)==1072693248)a=0.0;else{e=-1023;f=9}while(0);if((f|0)==9){f=d+614242|0;c[j>>2]=b;c[j+4>>2]=(f&1048575)+1072079006;m=+h[j>>3]+-1.0;k=m*(m*.5);i=m/(m+2.0);l=i*i;a=l*l;h[j>>3]=m-k;d=c[j+4>>2]|0;c[j>>2]=0;c[j+4>>2]=d;g=+h[j>>3];a=m-g-k+i*(k+(a*(a*(a*.15313837699209373+.22222198432149784)+.3999999999940942)+l*(a*(a*(a*.14798198605116586+.1818357216161805)+.2857142874366239)+.6666666666666735)));l=g*1.4426950407214463;k=+(e+(f>>>20)|0);i=k+l;a=i+(l+(k-i)+(a*1.4426950407214463+(g+a)*1.6751713164886512e-10))}return +a}function X3(a,b,d){a=+a;b=b|0;d=d|0;var e=0.0,f=0,g=0,i=0.0,k=0,m=0;k=l;l=l+16|0;g=k;h[j>>3]=a;f=c[j+4>>2]&2147483647;do if(f>>>0<1072243196)if(f>>>0<1044816030){h[b>>3]=a;h[d>>3]=1.0;break}else{h[b>>3]=+T3(a,0.0,0);h[d>>3]=+Q3(a,0.0);break}else{if(f>>>0>2146435071){i=a-a;h[d>>3]=i;h[b>>3]=i;break}f=R3(a,g)|0;m=g+8|0;e=+T3(+h[g>>3],+h[m>>3],1);a=+Q3(+h[g>>3],+h[m>>3]);switch(f&3){case 0:{h[b>>3]=e;i=a;break}case 1:{h[b>>3]=a;i=-e;break}case 2:{h[b>>3]=-e;i=-a;break}case 3:{h[b>>3]=-a;i=e;break}default:{}}h[d>>3]=i}while(0);l=k;return}function Y3(a){a=a|0;var b=0,c=0;c=(D3(a)|0)+1|0;b=k6(c)|0;if(!b)b=0;else B6(b|0,a|0,c|0)|0;return b|0}function Z3(a,b){a=a|0;b=b|0;var c=0;c=D3(a)|0;return ((_3(a,1,c,b)|0)!=(c|0))<<31>>31|0}function _3(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=S(d,b)|0;d=(b|0)==0?0:d;if((c[e+76>>2]|0)>-1){g=(n2(e)|0)==0;a=L2(a,f,e)|0;if(!g)o2(e)}else a=L2(a,f,e)|0;if((a|0)!=(f|0))d=(a>>>0)/(b>>>0)|0;return d|0}function $3(a){a=a|0;var b=0;if(c[a+68>>2]|0){b=c[a+116>>2]|0;a=a+112|0;if(b|0)c[b+112>>2]=c[a>>2];a=c[a>>2]|0;if(!a)a=(a4()|0)+232|0;else a=a+116|0;c[a>>2]=b}return}function a4(){return N1()|0}function b4(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;j=m;k=e&255;a[j>>0]=k;g=b+16|0;h=c[g>>2]|0;if(!h)if(!(M2(b)|0)){h=c[g>>2]|0;i=4}else f=-1;else i=4;do if((i|0)==4){i=b+20|0;g=c[i>>2]|0;if(g>>>0>>0?(f=e&255,(f|0)!=(a[b+75>>0]|0)):0){c[i>>2]=g+1;a[g>>0]=k;break}if((eb[c[b+36>>2]&63](b,j,1)|0)==1)f=d[j>>0]|0;else f=-1}while(0);l=m;return f|0}function c4(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;j=l;l=l+16|0;g=j;a:do if(!e)b=0;else{do if(f|0){i=(b|0)==0?g:b;b=a[e>>0]|0;if(b<<24>>24>-1){c[i>>2]=b&255;b=b<<24>>24!=0&1;break a}h=(c[c[(d4()|0)+188>>2]>>2]|0)==0;b=a[e>>0]|0;if(h){c[i>>2]=b<<24>>24&57343;b=1;break a}b=(b&255)+-194|0;if(b>>>0<=50){g=e+1|0;h=c[62656+(b<<2)>>2]|0;if(f>>>0<4?h&-2147483648>>>((f*6|0)+-6|0)|0:0)break;b=d[g>>0]|0;f=b>>>3;if((f+-16|f+(h>>26))>>>0<=7){b=b+-128|h<<6;if((b|0)>=0){c[i>>2]=b;b=2;break a}g=(d[e+2>>0]|0)+-128|0;if(g>>>0<=63){g=g|b<<6;if((g|0)>=0){c[i>>2]=g;b=3;break a}b=(d[e+3>>0]|0)+-128|0;if(b>>>0<=63){c[i>>2]=b|g<<6;b=4;break a}}}}}while(0);c[(L1()|0)>>2]=84;b=-1}while(0);l=j;return b|0}function d4(){return N1()|0}function e4(){var a=0,b=0;b=l;l=l+16|0;a=ya(20,b|0)|0;l=b;return a|0}function f4(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+48|0;h=i+32|0;g=i+16|0;e=i;if(w2(153742,a[d>>0]|0,4)|0){f=g4(d)|0;c[e>>2]=b;c[e+4>>2]=f|32768;c[e+8>>2]=438;e=K1(Wa(5,e|0)|0)|0;if((e|0)>=0){if(f&524288|0){c[g>>2]=e;c[g+4>>2]=2;c[g+8>>2]=1;ua(221,g|0)|0}b=h4(e,d)|0;if(!b){c[h>>2]=e;xa(6,h|0)|0;b=0}}else b=0}else{c[(L1()|0)>>2]=22;b=0}l=i;return b|0}function g4(b){b=b|0;var c=0,d=0,e=0;d=(F3(b,43)|0)==0;c=a[b>>0]|0;d=d?c<<24>>24!=114&1:2;e=(F3(b,120)|0)==0;d=e?d:d|128;b=(F3(b,101)|0)==0;b=b?d:d|524288;b=c<<24>>24==114?b:b|64;b=c<<24>>24==119?b|512:b;return (c<<24>>24==97?b|1024:b)|0}function h4(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+64|0;n=o+40|0;k=o+24|0;j=o+16|0;g=o;m=o+56|0;f=a[d>>0]|0;if(w2(153742,f<<24>>24,4)|0){e=k6(1156)|0;if(!e)e=0;else{h=e;i=h+124|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(i|0));if(!(F3(d,43)|0))c[e>>2]=f<<24>>24==114?8:4;if(F3(d,101)|0){c[g>>2]=b;c[g+4>>2]=2;c[g+8>>2]=1;ua(221,g|0)|0;f=a[d>>0]|0}if(f<<24>>24==97){c[j>>2]=b;c[j+4>>2]=3;f=ua(221,j|0)|0;if(!(f&1024)){c[k>>2]=b;c[k+4>>2]=4;c[k+8>>2]=f|1024;ua(221,k|0)|0}d=c[e>>2]|128;c[e>>2]=d}else d=c[e>>2]|0;c[e+60>>2]=b;c[e+44>>2]=e+132;c[e+48>>2]=1024;f=e+75|0;a[f>>0]=-1;if((d&8|0)==0?(c[n>>2]=b,c[n+4>>2]=21523,c[n+8>>2]=m,(Qa(54,n|0)|0)==0):0)a[f>>0]=10;c[e+32>>2]=20;c[e+36>>2]=18;c[e+40>>2]=19;c[e+12>>2]=17;if(!(c[47591]|0))c[e+76>>2]=-1;i4(e)|0}}else{c[(L1()|0)>>2]=22;e=0}l=o;return e|0}function i4(a){a=a|0;var b=0,d=0;b=j4()|0;c[a+56>>2]=c[b>>2];d=c[b>>2]|0;if(d|0)c[d+52>>2]=a;c[b>>2]=a;k4();return a|0}function j4(){Ua(190448);return 190456}function k4(){Ra(190448);return}function l4(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;if((c[a+76>>2]|0)>-1)f=n2(a)|0;else f=0;$3(a);g=(c[a>>2]&1|0)!=0;if(!g){e=j4()|0;d=c[a+52>>2]|0;b=a+56|0;if(d|0)c[d+56>>2]=c[b>>2];b=c[b>>2]|0;if(b|0)c[b+52>>2]=d;if((c[e>>2]|0)==(a|0))c[e>>2]=b;k4()}b=m4(a)|0;b=pb[c[a+12>>2]&63](a)|0|b;d=c[a+92>>2]|0;if(d|0)l6(d);if(g){if(f|0)o2(a)}else l6(a);return b|0}function m4(a){a=a|0;var b=0,d=0;do if(a){if((c[a+76>>2]|0)<=-1){b=n4(a)|0;break}d=(n2(a)|0)==0;b=n4(a)|0;if(!d)o2(a)}else{if(!(c[15872]|0))b=0;else b=m4(c[15872]|0)|0;a=c[(j4()|0)>>2]|0;if(a)do{if((c[a+76>>2]|0)>-1)d=n2(a)|0;else d=0;if((c[a+20>>2]|0)>>>0>(c[a+28>>2]|0)>>>0)b=n4(a)|0|b;if(d|0)o2(a);a=c[a+56>>2]|0}while((a|0)!=0);k4()}while(0);return b|0}function n4(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=a+20|0;h=a+28|0;if((c[b>>2]|0)>>>0>(c[h>>2]|0)>>>0?(eb[c[a+36>>2]&63](a,0,0)|0,(c[b>>2]|0)==0):0)a=-1;else{d=a+4|0;e=c[d>>2]|0;f=a+8|0;g=c[f>>2]|0;if(e>>>0>>0)eb[c[a+40>>2]&63](a,e-g|0,1)|0;c[a+16>>2]=0;c[h>>2]=0;c[b>>2]=0;c[f>>2]=0;c[d>>2]=0;a=0}return a|0}function o4(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if((c[f+76>>2]|0)>-1)l=n2(f)|0;else l=0;h=e+-1|0;g=(h|0)!=0;if((e|0)<2){m=f+74|0;k=a[m>>0]|0;a[m>>0]=k+255|k;if(l|0)o2(f);if(g)b=0;else a[b>>0]=0}else{a:do if(g){j=f+4|0;k=f+8|0;e=b;while(1){g=c[j>>2]|0;o=g;p=(c[k>>2]|0)-o|0;n=w2(g,10,p)|0;i=(n|0)==0;n=i?p:1-o+n|0;n=n>>>0>>0?n:h;B6(e|0,g|0,n|0)|0;g=(c[j>>2]|0)+n|0;c[j>>2]=g;e=e+n|0;h=h-n|0;if(!(i&(h|0)!=0)){m=17;break a}if(g>>>0>=(c[k>>2]|0)>>>0){g=Y1(f)|0;if((g|0)<0)break}else{c[j>>2]=g+1;g=d[g>>0]|0}h=h+-1|0;i=e+1|0;a[e>>0]=g;if(!((h|0)!=0&(g&255|0)!=10)){e=i;m=17;break a}else e=i}if((e|0)!=(b|0)?(c[f>>2]&16|0)!=0:0)m=17;else b=0}else{e=b;m=17}while(0);if((m|0)==17)if(!b)b=0;else a[e>>0]=0;if(l)o2(f)}return b|0}function p4(a){a=a|0;var b=0;if((c[a+76>>2]|0)>-1){b=(n2(a)|0)==0;a=(c[a>>2]|0)>>>4&1}else a=(c[a>>2]|0)>>>4&1;return a|0}function q4(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=r4(a,b,f)|0;l=e;return d|0}function r4(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=l;l=l+128|0;e=g;f=e;h=f+124|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(h|0));c[e+32>>2]=44;c[e+44>>2]=a;c[e+76>>2]=-1;c[e+84>>2]=a;h=t4(e,b,d)|0;l=g;return h|0}function s4(a,b,c){a=a|0;b=b|0;c=c|0;return x4(a,b,c)|0}function t4(b,e,f){b=b|0;e=e|0;f=f|0;var i=0,j=0,k=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;Q=l;l=l+288|0;K=Q+8|0;L=Q+17|0;M=Q;N=Q+16|0;if((c[b+76>>2]|0)>-1)P=n2(b)|0;else P=0;i=a[e>>0]|0;a:do if(i<<24>>24){z=b+4|0;A=b+100|0;B=b+108|0;C=b+8|0;E=L+10|0;F=L+33|0;y=K+4|0;G=L+46|0;H=L+94|0;I=L+1|0;J=L+1|0;m=e;u=0;e=0;k=0;j=0;b:while(1){c:do if(!(X1(i&255)|0)){i=i<<24>>24==37;d:do if(i){p=m+1|0;n=a[p>>0]|0;e:do switch(n<<24>>24){case 37:break d;case 42:{x=0;m=m+2|0;break}default:{i=(n&255)+-48|0;if(i>>>0<10?(a[m+2>>0]|0)==36:0){x=u4(f,i)|0;m=m+3|0;break e}m=(c[f>>2]|0)+(4-1)&~(4-1);x=c[m>>2]|0;c[f>>2]=m+4;m=p}}while(0);i=a[m>>0]|0;n=i&255;if((n+-48|0)>>>0<10){p=0;do{p=(p*10|0)+-48+n|0;m=m+1|0;i=a[m>>0]|0;n=i&255}while((n+-48|0)>>>0<10)}else p=0;i=i<<24>>24==109;w=(x|0)!=0;k=i?0:k;j=i?0:j;m=i?m+1|0:m;i=w&i;n=m+1|0;switch(a[m>>0]|0){case 104:{v=(a[n>>0]|0)==104;q=v?-2:-1;m=v?m+2|0:n;break}case 108:{v=(a[n>>0]|0)==108;q=v?3:1;m=v?m+2|0:n;break}case 106:{q=3;m=n;break}case 116:case 122:{q=1;m=n;break}case 76:{q=2;m=n;break}case 110:case 112:case 67:case 83:case 91:case 99:case 115:case 88:case 71:case 70:case 69:case 65:case 103:case 102:case 101:case 97:case 120:case 117:case 111:case 105:case 100:{q=0;break}default:{O=137;break b}}s=d[m>>0]|0;t=(s&47|0)==3;s=t?s|32:s;t=t?1:q;r=s&255;switch(r<<24>>24){case 99:{p=(p|0)>1?p:1;break}case 91:break;case 110:{v4(x,t,u,((u|0)<0)<<31>>31);n=u;break c}default:{U1(b,0);do{n=c[z>>2]|0;if(n>>>0<(c[A>>2]|0)>>>0){c[z>>2]=n+1;n=d[n>>0]|0}else n=W1(b)|0}while((X1(n)|0)!=0);if(!(c[A>>2]|0))n=c[z>>2]|0;else{n=(c[z>>2]|0)+-1|0;c[z>>2]=n}u=(c[B>>2]|0)+u+n-(c[C>>2]|0)|0}}U1(b,p);n=c[z>>2]|0;q=c[A>>2]|0;if(n>>>0>>0)c[z>>2]=n+1;else{if((W1(b)|0)<0){O=137;break b}q=c[A>>2]|0}if(q|0)c[z>>2]=(c[z>>2]|0)+-1;f:do switch(r<<24>>24){case 91:case 99:case 115:{v=(s|0)==99;g:do if((s|16|0)==115){u6(I|0,-1,256)|0;a[L>>0]=0;if((s|0)==115){a[F>>0]=0;a[E>>0]=0;a[E+1>>0]=0;a[E+2>>0]=0;a[E+3>>0]=0;a[E+4>>0]=0}}else{n=m+1|0;s=(a[n>>0]|0)==94;r=s&1;m=s?m+2|0:n;u6(J|0,s&1|0,256)|0;a[L>>0]=0;switch(a[m>>0]|0){case 45:{n=G;O=64;break}case 93:{n=H;O=64;break}default:s=(r^1)&255}if((O|0)==64){O=0;s=(r^1)&255;a[n>>0]=s;m=m+1|0}while(1){n=a[m>>0]|0;h:do switch(n<<24>>24){case 0:{O=137;break b}case 93:break g;case 45:{r=m+1|0;n=a[r>>0]|0;switch(n<<24>>24){case 93:case 0:{n=45;break h}default:{}}m=a[m+-1>>0]|0;if((m&255)<(n&255)){m=m&255;do{m=m+1|0;a[L+m>>0]=s;n=a[r>>0]|0}while((m|0)<(n&255|0));m=r}else m=r;break}default:{}}while(0);a[L+((n&255)+1)>>0]=s;m=m+1|0}}while(0);n=v?p+1|0:31;s=(t|0)==1;i:do if(s){if(i){j=k6(n<<2)|0;if(!j){k=0;j=0;i=1;O=137;break b}}else j=x;c[K>>2]=0;c[y>>2]=0;r=n;k=0;j:while(1){q=(j|0)==0;do{k:while(1){n=c[z>>2]|0;if(n>>>0<(c[A>>2]|0)>>>0){c[z>>2]=n+1;n=d[n>>0]|0}else n=W1(b)|0;if(!(a[L+(n+1)>>0]|0))break j;a[N>>0]=n;switch(I3(M,N,1,K)|0){case -1:{k=0;O=137;break b}case -2:break;default:break k}}if(!q){c[j+(k<<2)>>2]=c[M>>2];k=k+1|0}}while(!(i&(k|0)==(r|0)));k=r<<1|1;n=n6(j,k<<2)|0;if(!n){k=0;i=1;O=137;break b}else{t=r;r=k;j=n;k=t}}if(!(w4(K)|0)){k=0;O=137;break b}else{n=k;k=0;r=j}}else{if(i){k=k6(n)|0;if(!k){k=0;j=0;i=1;O=137;break b}else{q=n;j=0}while(1){do{n=c[z>>2]|0;if(n>>>0<(c[A>>2]|0)>>>0){c[z>>2]=n+1;n=d[n>>0]|0}else n=W1(b)|0;if(!(a[L+(n+1)>>0]|0)){n=j;r=0;j=0;break i}a[k+j>>0]=n;j=j+1|0}while((j|0)!=(q|0));j=q<<1|1;n=n6(k,j)|0;if(!n){j=0;i=1;O=137;break b}else{t=q;q=j;k=n;j=t}}}if(!x){k=q;while(1){j=c[z>>2]|0;if(j>>>0>>0){c[z>>2]=j+1;j=d[j>>0]|0}else j=W1(b)|0;if(!(a[L+(j+1)>>0]|0)){n=0;k=0;r=0;j=0;break i}k=c[A>>2]|0}}else{n=0;k=q;while(1){j=c[z>>2]|0;if(j>>>0>>0){c[z>>2]=j+1;j=d[j>>0]|0}else j=W1(b)|0;if(!(a[L+(j+1)>>0]|0)){k=x;r=0;j=0;break i}a[x+n>>0]=j;n=n+1|0;k=c[A>>2]|0}}}while(0);if(!(c[A>>2]|0))q=c[z>>2]|0;else{q=(c[z>>2]|0)+-1|0;c[z>>2]=q}q=q-(c[C>>2]|0)+(c[B>>2]|0)|0;if(!q){O=139;break b}if(!((q|0)==(p|0)|v^1)){O=139;break b}do if(i)if(s){c[x>>2]=r;break}else{c[x>>2]=k;break}while(0);if(!v){if(r|0)c[r+(n<<2)>>2]=0;if(!k){k=0;break f}a[k+n>>0]=0}break}case 120:case 88:case 112:{n=16;O=125;break}case 111:{n=8;O=125;break}case 117:case 100:{n=10;O=125;break}case 105:{n=0;O=125;break}case 71:case 103:case 70:case 102:case 69:case 101:case 65:case 97:{o=+s3(b,t,0);if((c[B>>2]|0)==((c[C>>2]|0)-(c[z>>2]|0)|0)){O=139;break b}if(x)switch(t|0){case 0:{g[x>>2]=o;break f}case 1:{h[x>>3]=o;break f}case 2:{h[x>>3]=o;break f}default:break f}break}default:{}}while(0);do if((O|0)==125){O=0;n=V1(b,n,0,-1,-1)|0;if((c[B>>2]|0)==((c[C>>2]|0)-(c[z>>2]|0)|0)){O=139;break b}if(w&(s|0)==112){c[x>>2]=n;break}else{v4(x,t,n,D);break}}while(0);e=(w&1)+e|0;n=(c[B>>2]|0)+u+(c[z>>2]|0)-(c[C>>2]|0)|0;break c}while(0);m=m+(i&1)|0;U1(b,0);i=c[z>>2]|0;if(i>>>0<(c[A>>2]|0)>>>0){c[z>>2]=i+1;i=d[i>>0]|0}else i=W1(b)|0;if((i|0)!=(d[m>>0]|0)){O=22;break b}n=u+1|0}else{while(1){i=m+1|0;if(!(X1(d[i>>0]|0)|0))break;else m=i}U1(b,0);do{i=c[z>>2]|0;if(i>>>0<(c[A>>2]|0)>>>0){c[z>>2]=i+1;i=d[i>>0]|0}else i=W1(b)|0}while((X1(i)|0)!=0);if(!(c[A>>2]|0))i=c[z>>2]|0;else{i=(c[z>>2]|0)+-1|0;c[z>>2]=i}n=(c[B>>2]|0)+u+i-(c[C>>2]|0)|0}while(0);m=m+1|0;i=a[m>>0]|0;if(!(i<<24>>24))break a;else u=n}if((O|0)==22){if(c[A>>2]|0)c[z>>2]=(c[z>>2]|0)+-1;if((e|0)!=0|(i|0)>-1)break;else{i=0;O=138}}else if((O|0)==137){i=i&1;if(!e)O=138}else if((O|0)==139)i=i&1;if((O|0)==138)e=-1;if(i){l6(k);l6(j)}}else e=0;while(0);if(P|0)o2(b);l=Q;return e|0}function u4(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;e=l;l=l+16|0;d=e;c[d>>2]=c[a>>2];while(1){f=(c[d>>2]|0)+(4-1)&~(4-1);a=c[f>>2]|0;c[d>>2]=f+4;if(b>>>0>1)b=b+-1|0;else break}l=e;return a|0}function v4(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;a:do if(d|0)switch(e|0){case -2:{a[d>>0]=f;break a}case -1:{b[d>>1]=f;break a}case 0:{c[d>>2]=f;break a}case 1:{c[d>>2]=f;break a}case 3:{e=d;c[e>>2]=f;c[e+4>>2]=g;break a}default:break a}while(0);return}function w4(a){a=a|0;if(!a)a=1;else a=(c[a>>2]|0)==0;return a&1|0}function x4(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=a+84|0;g=c[e>>2]|0;h=d+256|0;f=w2(g,0,h)|0;f=(f|0)==0?h:f-g|0;d=f>>>0>>0?f:d;B6(b|0,g|0,d|0)|0;c[a+4>>2]=g+d;b=g+f|0;c[a+8>>2]=b;c[e>>2]=b;return d|0}function y4(a,b,c){a=a|0;b=b|0;c=c|0;return A4(a,b,c)|0}function z4(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=l2(a,b,f)|0;l=e;return d|0}function A4(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if((c[a+76>>2]|0)>-1){e=(n2(a)|0)==0;b=B4(a,b,d)|0;if(!e)o2(a)}else b=B4(a,b,d)|0;return b|0}function B4(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;if((d|0)==1)b=b-(c[a+8>>2]|0)+(c[a+4>>2]|0)|0;e=a+20|0;f=a+28|0;if((c[e>>2]|0)>>>0>(c[f>>2]|0)>>>0?(eb[c[a+36>>2]&63](a,0,0)|0,(c[e>>2]|0)==0):0)b=-1;else{c[a+16>>2]=0;c[f>>2]=0;c[e>>2]=0;if((eb[c[a+40>>2]&63](a,b,d)|0)<0)b=-1;else{c[a+8>>2]=0;c[a+4>>2]=0;c[a>>2]=c[a>>2]&-17;b=0}}return b|0}function C4(b,c){b=b|0;c=c|0;var d=0;d=a[c>>0]|0;do if(d<<24>>24){b=F3(b,d<<24>>24)|0;if(b){if(a[c+1>>0]|0)if(a[b+1>>0]|0){if(!(a[c+2>>0]|0)){b=D4(b,c)|0;break}if(a[b+2>>0]|0){if(!(a[c+3>>0]|0)){b=E4(b,c)|0;break}if(a[b+3>>0]|0)if(!(a[c+4>>0]|0)){b=F4(b,c)|0;break}else{b=G4(b,c)|0;break}else b=0}else b=0}else b=0}else b=0}while(0);return b|0}function D4(b,c){b=b|0;c=c|0;var e=0,f=0,g=0;g=(d[c>>0]|0)<<8|(d[c+1>>0]|0);f=d[b>>0]|0;while(1){c=b+1|0;e=a[c>>0]|0;if(!(e<<24>>24)){b=0;break}f=e&255|f<<8&65280;if((f|0)==(g|0))break;else b=c}return b|0}function E4(b,c){b=b|0;c=c|0;var e=0,f=0;f=(d[c+1>>0]|0)<<16|(d[c>>0]|0)<<24|(d[c+2>>0]|0)<<8;e=b+2|0;c=a[e>>0]|0;b=(d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(c&255)<<8;c=c<<24>>24!=0;if(!((b|0)==(f|0)|c^1))do{e=e+1|0;c=a[e>>0]|0;b=(c&255|b)<<8;c=c<<24>>24!=0}while(!((b|0)==(f|0)|c^1));return (c?e+-2|0:0)|0}function F4(b,c){b=b|0;c=c|0;var e=0,f=0,g=0;f=(d[c+1>>0]|0)<<16|(d[c>>0]|0)<<24|(d[c+2>>0]|0)<<8|(d[c+3>>0]|0);c=b+3|0;g=a[c>>0]|0;e=g&255|((d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(d[b+2>>0]|0)<<8);b=g<<24>>24!=0;if(!((e|0)==(f|0)|b^1))do{c=c+1|0;b=a[c>>0]|0;e=b&255|e<<8;b=b<<24>>24!=0}while(!((e|0)==(f|0)|b^1));return (b?c+-3|0:0)|0}function G4(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+1056|0;t=v+1024|0;u=v;c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;c[t+20>>2]=0;c[t+24>>2]=0;c[t+28>>2]=0;e=a[d>>0]|0;a:do if(e<<24>>24){s=0;f=e;e=e&255;while(1){if(!(a[b+s>>0]|0)){e=0;break a}r=t+(((f&255)>>>5&255)<<2)|0;c[r>>2]=c[r>>2]|1<<(f&31);s=s+1|0;c[u+(e<<2)>>2]=s;e=a[d+s>>0]|0;if(!(e<<24>>24))break;else{f=e;e=e&255}}m=s>>>0>1;if(m){f=0;k=-1;g=1;b:while(1){h=1;e=f;while(1){f=g;c:while(1){j=1;while(1){g=a[d+(j+k)>>0]|0;i=a[d+f>>0]|0;if(g<<24>>24!=i<<24>>24)break c;if((j|0)==(h|0))break;j=j+1|0;f=j+e|0;if(f>>>0>=s>>>0){n=h;e=k;break b}}e=h+e|0;f=e+1|0;if(f>>>0>=s>>>0){n=h;e=k;break b}}h=f-k|0;if((g&255)<=(i&255))break;g=f+1|0;if(g>>>0>=s>>>0){n=h;e=k;break b}else e=f}g=e+2|0;if(g>>>0>=s>>>0){n=1;break}else{f=e+1|0;k=e}}if(m){h=0;m=-1;i=1;while(1){f=1;g=h;while(1){h=i;d:while(1){k=1;while(1){i=a[d+(k+m)>>0]|0;j=a[d+h>>0]|0;if(i<<24>>24!=j<<24>>24)break d;if((k|0)==(f|0))break;k=k+1|0;h=k+g|0;if(h>>>0>=s>>>0){h=n;g=m;i=27;break a}}g=f+g|0;h=g+1|0;if(h>>>0>=s>>>0){h=n;g=m;i=27;break a}}f=h-m|0;if((i&255)>=(j&255))break;i=h+1|0;if(i>>>0>=s>>>0){h=n;g=m;i=27;break a}else g=h}i=g+2|0;if(i>>>0>=s>>>0){h=n;f=1;i=27;break}else{h=g+1|0;m=g}}}else{h=n;f=1;g=-1;i=27}}else{h=1;e=-1;f=1;g=-1;i=27}}else{h=1;e=-1;s=0;f=1;g=-1;i=27}while(0);e:do if((i|0)==27){q=(g+1|0)>>>0>(e+1|0)>>>0;f=q?f:h;q=q?g:e;r=q+1|0;if(!(g2(d,d+f|0,r)|0))p=s-f|0;else{f=s-q+-1|0;p=0;f=(q>>>0>f>>>0?q:f)+1|0}k=s|63;m=s+-1|0;n=(p|0)!=0;o=s-f|0;e=b;j=0;g=b;while(1){h=e;do if((g-h|0)>>>0>>0){i=w2(g,0,k)|0;if(i)if((i-h|0)>>>0>>0){e=0;break e}else break;else{i=g+k|0;break}}else i=g;while(0);g=a[e+m>>0]|0;f:do if(!(1<<(g&31)&c[t+(((g&255)>>>5&255)<<2)>>2])){h=0;g=s}else{g=s-(c[u+((g&255)<<2)>>2]|0)|0;if(g|0){h=0;g=n&(j|0)!=0&g>>>0>>0?o:g;break}g=r>>>0>j>>>0?r:j;h=a[d+g>>0]|0;g:do if(!(h<<24>>24))g=r;else{while(1){if(h<<24>>24!=(a[e+g>>0]|0))break;g=g+1|0;h=a[d+g>>0]|0;if(!(h<<24>>24)){g=r;break g}}h=0;g=g-q|0;break f}while(0);while(1){if(g>>>0<=j>>>0)break e;g=g+-1|0;if((a[d+g>>0]|0)!=(a[e+g>>0]|0)){h=p;g=f;break}}}while(0);e=e+g|0;j=h;g=i}}while(0);l=v;return e|0}function H4(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=a;c[e+4>>2]=b;b=K1(Pa(33,e|0)|0)|0;l=d;return b|0}function I4(a,b){a=a|0;b=b|0;return J4(a,b,(D3(a)|0)+1|0)|0}function J4(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;e=c&255;do{if(!d){c=0;break}d=d+-1|0;c=b+d|0}while((a[c>>0]|0)!=e<<24>>24);return c|0}function K4(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;j=l;l=l+32|0;i=j;h=((g|0)<0)<<31>>31;do if((g&4095|0)==0&(h&-4096|0)==0){if(b>>>0>2147483646){c[(L1()|0)>>2]=12;a=-1;break}if(e&16|0)H3();h=z6(g|0,h|0,12)|0;c[i>>2]=a;c[i+4>>2]=b;c[i+8>>2]=d;c[i+12>>2]=e;c[i+16>>2]=f;c[i+20>>2]=h;a=K1(Ga(192,i|0)|0)|0}else{c[(L1()|0)>>2]=22;a=-1}while(0);l=j;return a|0}function L4(a){a=a|0;return M4(a)|0}function M4(a){a=a|0;return L6(a|0)|0}function N4(a,b,c){a=a|0;b=b|0;c=c|0;O4(a,b,c)|0;return a|0}function O4(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=d;do if(!((g^b)&3)){f=(e|0)!=0;a:do if(f&(g&3|0)!=0)while(1){g=a[d>>0]|0;a[b>>0]=g;if(!(g<<24>>24))break a;e=e+-1|0;d=d+1|0;b=b+1|0;f=(e|0)!=0;if(!(f&(d&3|0)!=0)){h=5;break}}else h=5;while(0);if((h|0)==5)if(!f){e=0;break}if(a[d>>0]|0){b:do if(e>>>0>3){f=d;while(1){d=c[f>>2]|0;if((d&-2139062144^-2139062144)&d+-16843009|0){d=f;break b}c[b>>2]=d;e=e+-4|0;d=f+4|0;b=b+4|0;if(e>>>0>3)f=d;else break}}while(0);h=11}}else h=11;while(0);c:do if((h|0)==11)if(!e)e=0;else while(1){h=a[d>>0]|0;a[b>>0]=h;if(!(h<<24>>24))break c;e=e+-1|0;b=b+1|0;if(!e){e=0;break}else d=d+1|0}while(0);u6(b|0,0,e|0)|0;return b|0}function P4(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=l;l=l+32|0;f=g;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;c[f+24>>2]=0;c[f+28>>2]=0;e=a[d>>0]|0;do if(!(e<<24>>24))d=0;else{if(!(a[d+1>>0]|0)){d=b;while(1)if((a[d>>0]|0)==e<<24>>24)d=d+1|0;else break;d=d-b|0;break}do{h=f+(((e&255)>>>5&255)<<2)|0;c[h>>2]=c[h>>2]|1<<(e&31);d=d+1|0;e=a[d>>0]|0}while(e<<24>>24!=0);e=a[b>>0]|0;a:do if(!(e<<24>>24))d=b;else{d=b;do{if(!(c[f+(((e&255)>>>5&255)<<2)>>2]&1<<(e&31)))break a;d=d+1|0;e=a[d>>0]|0}while(e<<24>>24!=0)}while(0);d=d-b|0}while(0);l=g;return d|0}function Q4(a,c){a=a|0;c=c|0;var d=0,f=0,g=0;g=a+2|0;f=a+4|0;d=G6((e[c+2>>1]|0)<<16|(e[c>>1]|0)|0,e[c+4>>1]|0|0,(e[g>>1]|0)<<16|(e[a>>1]|0)|0,e[f>>1]|0|0)|0;c=w6(d|0,D|0,e[c+6>>1]|0|0,0)|0;d=D;b[a>>1]=c;a=z6(c|0,d|0,16)|0;b[g>>1]=a;b[f>>1]=d;D=d&65535;return c|0}function R4(a){a=a|0;var b=0;b=Q4(a,66122)|0;b=v6(b|0,D|0,4)|0;a=D|1072693248;c[j>>2]=b;c[j+4>>2]=a;return +(+h[j>>3]+-1.0)}function S4(){return +(+R4(66116))}function T4(a){a=a|0;var b=0;b=186776;c[b>>2]=a+-1;c[b+4>>2]=0;return}function U4(){var a=0,b=0,d=0;b=186776;b=G6(c[b>>2]|0,c[b+4>>2]|0,1284865837,1481765933)|0;b=w6(b|0,D|0,1,0)|0;a=D;d=186776;c[d>>2]=b;c[d+4>>2]=a;a=z6(b|0,a|0,33)|0;return a|0}function V4(a){a=a|0;b[97016]=b[33058]|0;b[97017]=b[33059]|0;b[97018]=b[33060]|0;b[33058]=b[a>>1]|0;b[33059]=b[a+2>>1]|0;b[33060]=b[a+4>>1]|0;return 194032}function W4(a){a=a|0;var c=0,d=0;c=l;l=l+16|0;d=c;b[d>>1]=13070;b[d+2>>1]=a;b[d+4>>1]=a>>>16;V4(d)|0;l=c;return}function X4(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;v=l;l=l+48|0;i=v;t=Y4()|0;a:do if(!t)b=12;else{u=Z4(0,0)|0;if(!u){_4(t);b=12;break}e=i+8|0;c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;c[e+12>>2]=0;c[e+16>>2]=0;c[i>>2]=u;c[i+4>>2]=t;c[i+16>>2]=b;c[i+32>>2]=d;e=i+28|0;c[e>>2]=-1;b=$4(i)|0;b:do if(!b){h=i+20|0;f=c[h>>2]|0;c[a>>2]=f+-1;j=c[i+8>>2]|0;b=c[e>>2]|0;if((b|0)<(f|0)){g=m6(1,68)|0;if(g){r=b>>>31^1;c[g+60>>2]=r;c[g+28>>2]=f;if((d&8|0)==0|(r|0)!=0){b=a5(0,t,j,g)|0;if(b|0){h=0;i=0;f=0;e=0;break}f=c[g+40>>2]|0;if((f|0)>0){b=(f<<2)+4|0;e=k6(b)|0;if(!e){h=0;i=0;b=12;f=0;e=0;break}c[g+32>>2]=e;u6(e|0,-1,b|0)|0}else e=0;r=m6(f<<1|1,4)|0;c[g+36>>2]=r;if(!r){h=0;i=0;b=12;f=0;e=0;break}b=m6(c[h>>2]|0,12)|0;if(!b){h=0;i=0;b=12;f=0;e=0;break}c[g+16>>2]=b;b=a5(u,t,j,g)|0;if(!b)b=e;else{h=0;i=0;f=0;e=0;break}}else b=0;r=i+24|0;b=b5(u,t,j,r,b)|0;if(!b){b=c[r>>2]|0;c[r>>2]=b+1;b=c5(u,0,0,b)|0;if((b|0)!=0?(s=d5(u,j,b)|0,(s|0)!=0):0){b=e5(u,t,s)|0;if(!b){e=c[r>>2]|0;b=e<<2;p=k6(b)|0;if(p){q=k6(b)|0;if(q){if((e|0)>0)u6(p|0,0,e<<2|0)|0;f5(s,0,p,0)|0;f=c[r>>2]|0;if((f|0)>0){b=0;e=0;do{c[q+(e<<2)>>2]=b;o=p+(e<<2)|0;b=b+1+(c[o>>2]|0)|0;c[o>>2]=0;e=e+1|0}while((e|0)<(f|0));m=b}else m=0;n=m6(m+1|0,32)|0;if(n){c[g>>2]=n;o=g+4|0;c[o>>2]=m;b=f5(s,n,p,q)|0;if(!b){c[g+20>>2]=0;f=s+24|0;b=c[f>>2]|0;e=0;while(1){e=e+1|0;if((c[b>>2]|0)<=-1)break;else b=b+32|0}k=m6(e,32)|0;if(!k){h=p;i=q;b=12;f=p;e=q}else{c[g+8>>2]=k;b=c[f>>2]|0;e=c[b>>2]|0;if((e|0)>-1){j=b;b=0;do{c[k+(b<<5)+8>>2]=n+(c[q+(e<<2)>>2]<<5);c[k+(b<<5)+12>>2]=e;h=k+(b<<5)+16|0;c[h>>2]=0;i=j+12|0;f=c[i>>2]|0;if(f|0){e=0;do{w=e;e=e+1|0}while((c[f+(w<<2)>>2]|0)>-1);e=e<<2;f=k6(e)|0;c[h>>2]=f;if(!f){h=p;i=q;b=12;f=p;e=q;break b}B6(f|0,c[i>>2]|0,e|0)|0}c[k+(b<<5)+20>>2]=c[j+16>>2];b=b+1|0;j=j+32|0;e=c[j>>2]|0}while((e|0)>-1)}else b=0;c[k+(b<<5)+8>>2]=0;c[o>>2]=m;c[g+12>>2]=n+(c[q+(c[c[s+28>>2]>>2]<<2)>>2]<<5);c[g+52>>2]=c[r>>2];c[g+56>>2]=d;g5(u);_4(t);l6(p);l6(q);c[a+4>>2]=g;b=0;break a}}else{h=p;i=q;f=p;e=q}}else{h=p;i=q;b=12;f=p;e=q}}else{h=p;i=q;b=12;f=p;e=0}}else{h=p;i=0;b=12;f=0;e=0}}else{h=0;i=0;f=0;e=0}}else{h=0;i=0;b=12;f=0;e=0}}else{h=0;i=0;f=0;e=0}}else{h=0;i=0;b=12;f=0;e=0}}else{g=0;h=0;i=0;b=6;f=0;e=0}}else{g=0;h=0;i=0;f=0;e=0}while(0);g5(u);_4(t);if(h|0)l6(f);if(i|0)l6(e);c[a+4>>2]=g;h5(a)}while(0);l=v;return b|0}function Y4(){var a=0,b=0;a=k6(20)|0;do if(a){b=k6(2048)|0;c[a+16>>2]=b;if(!b){l6(a);a=0;break}else{c[a>>2]=512;c[a+4>>2]=1024e3;c[a+8>>2]=128;c[a+12>>2]=0;break}}while(0);return a|0}function Z4(a,b){a=a|0;b=b|0;if(!a)b=m6(1,24)|0;else{c[b>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;c[b+12>>2]=0;c[b+16>>2]=0;c[b+20>>2]=0}return b|0}function _4(a){a=a|0;l6(c[a+16>>2]|0);l6(a);return}function $4(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+16|0;q=v+4|0;r=v;s=c[b+32>>2]&1;t=b+16|0;e=c[t>>2]|0;u=c[b+4>>2]|0;d=l5(u,0)|0;a:do if(!d){n=(s|0)!=0;o=b+8|0;p=b+12|0;m=n^1;d=0;k=1;b:while(1){g=0;h=d;f=0;c:while(1){d=a[e>>0]|0;if(n){if(d<<24>>24==40)break;if((h|0)!=0&d<<24>>24==41)j=13;else j=14}else if(d<<24>>24==92)switch(a[e+1>>0]|0){case 40:break c;case 41:{j=13;break}default:j=14}else j=14;if((j|0)==13){j=0;i=c5(c[b>>2]|0,-1,-1,-1)|0;c[o>>2]=i;if(!i){d=12;break a}else i=f}else if((j|0)==14){j=0;d=B5(b,e)|0;if(d|0)break a;i=f;e=c[p>>2]|0}while(1){d:while(1){d=a[e>>0]|0;switch(d<<24>>24){case 42:case 92:break;default:{if(!n)break d;switch(d<<24>>24){case 123:case 63:case 43:break;default:break d}}}d=d<<24>>24==92;if(n&d)break;f=e+1|0;if(d)switch(a[f>>0]|0){case 123:case 63:case 43:break;default:break d}e=d?f:e;if((!n?(e|0)==((c[t>>2]|0)+1|0):0)?(a[e+-1>>0]|0)==94:0)break;if((a[e>>0]|0)==123){e=C5(e+1|0,s,q,r)|0;if(!e){j=28;break b}d=c[r>>2]|0;f=c[b>>2]|0;if(!d)d=c5(f,-1,-1,-1)|0;else j=36}else{c[q>>2]=0;c[r>>2]=-1;d=a[e>>0]|0;if(d<<24>>24==43){c[q>>2]=1;d=a[e>>0]|0}if(d<<24>>24==63){c[r>>2]=1;d=1}else d=-1;e=e+1|0;f=c[b>>2]|0;j=36}if((j|0)==36){j=0;d=w5(f,c[o>>2]|0,c[q>>2]|0,d,0)|0}c[o>>2]=d;if(!d){d=12;break a}}g=d5(c[b>>2]|0,g,c[o>>2]|0)|0;f=a[e>>0]|0;do if(!n)if(f<<24>>24==92)if((a[e+1>>0]|0)==41){d=x5(c[b>>2]|0,i,g)|0;j=49}else{d=92;j=44}else{d=f;j=46}else{if(f<<24>>24!=124)if((h|0)!=0&f<<24>>24==41)f=41;else{d=f;j=44;break}else f=124;d=x5(c[b>>2]|0,i,g)|0;j=50}while(0);if((j|0)==44)if(d<<24>>24==92&m)if((a[e+1>>0]|0)==124)j=48;else{f=i;continue c}else j=46;if((j|0)==46)if(!(d<<24>>24))j=48;else{f=i;continue c}if((j|0)==48){d=x5(c[b>>2]|0,i,g)|0;if(f<<24>>24==92)j=49;else j=50}if((j|0)==49){j=0;if((a[e+1>>0]|0)==124){f=2;break}if(!h){d=8;break a}e=e+2|0;f=92}else if((j|0)==50){j=0;if(f<<24>>24==124){f=1;break}e=f<<24>>24==41?e+1|0:e}d=D5(b,d,m5(u)|0)|0;if(d|0)break a;d=f<<24>>24==0;f=(h|0)<1;if(f&d){j=56;break b}if(f|d){d=8;break a}g=n5(u)|0;h=h+-1|0;i=n5(u)|0}g=0;e=e+f|0;f=d}d=k5(u,f)|0;if(d|0)break a;d=k5(u,g)|0;if(d|0)break a;d=l5(u,k)|0;if(d|0)break a;d=h+1|0;k=k+1|0;e=n?e+1|0:e+2|0}if((j|0)==28){d=10;break}else if((j|0)==56){c[b+20>>2]=k;d=0;break}}while(0);l=v;return d|0}function a5(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;x=j5(d)|0;y=(b|0)==0|(f|0)==0;if(!y){c[f+48>>2]=0;c[c[f+36>>2]>>2]=-1}h=c[f+28>>2]|0;z=k6((h<<3)+8|0)|0;do if(!z)g=12;else{c[z>>2]=-1;A=k6((h<<2)+4|0)|0;if(!A){l6(z);g=12;break}c[A>>2]=-1;g=0;while(1)if(g>>>0>h>>>0)break;else g=g+1|0;k5(d,e)|0;g=l5(d,0)|0;a:do if((g|0)!=0|(j5(d)|0)<=(x|0)){e=z;n=0;h=0;m=0;l=-1}else{u=f+32|0;v=f+36|0;w=f+16|0;e=z;n=0;h=0;m=0;t=1;l=-1;s=0;while(1){b:do switch(m5(d)|0){case 6:{i=m5(d)|0;g=0;do{j=e+(g<<2)|0;g=g+1|0}while((c[j>>2]|0)>-1);c[j>>2]=i<<1|1;c[e+(g<<2)>>2]=-1;g=0;while(1)if((c[A+(g<<2)>>2]|0)>-1)g=g+1|0;else break;c[A+(g+-1<<2)>>2]=-1;g=0;j=t;i=s;break}case 0:{q=n5(d)|0;r=q+12|0;j=c[r>>2]|0;if((j|0)>-1){g=0;do{i=e+(g<<2)|0;g=g+1|0}while((c[i>>2]|0)>-1);c[i>>2]=j<<1;c[e+(g<<2)>>2]=-1;if(!y){g=0;while(1)if((c[A+(g<<2)>>2]|0)>-1)g=g+1|0;else break;i=(c[w>>2]|0)+(j*12|0)+8|0;c[i>>2]=0;if((g|0)>0){g=k6((g<<2)+4|0)|0;if(!g){g=12;j=t;i=s;break b}c[i>>2]=g;i=c[A>>2]|0;if((i|0)>-1){k=0;j=g;do{c[j>>2]=i;k=k+1|0;i=c[A+(k<<2)>>2]|0;j=g+(k<<2)|0}while((i|0)>-1);g=j}c[g>>2]=-1}}g=l5(d,c[r>>2]|0)|0;if(g|0){j=t;i=s;break b}g=l5(d,6)|0;if(g|0){j=t;i=s;break b}}c:do switch(c[q>>2]|0){case 0:{p=c[c[q+4>>2]>>2]|0;if((p|0)>-1|(p|0)==-4?(c[e>>2]|0)>-1:0){if(y){c[q+20>>2]=1;g=0}else{g=y5(b,q,m)|0;c[(c[u>>2]|0)+(m<<2)>>2]=s;if((l|0)>-1){j=c[v>>2]|0;i=0;while(1){k=j+(i<<2)|0;o=i+1|0;if((c[k>>2]|0)>-1)i=o;else break}c[k>>2]=m;c[j+(o<<2)>>2]=l;c[j+(i+2<<2)>>2]=-1;h=h+1|0;l=-1}z5(e,f,m)}c[e>>2]=-1;p=t+1|0;o=s;n=n+1|0;m=t}else{p=t;g=0;o=s}break}case 1:{j=c[q+4>>2]|0;k=c[j>>2]|0;j=c[j+4>>2]|0;g=k5(d,q)|0;if(!g){g=l5(d,5)|0;if(!g){g=k5(d,j)|0;if(!g){g=l5(d,0)|0;if(!g){i=k+20|0;g=l5(d,(c[i>>2]|0)+t|0)|0;if(!g){if((c[i>>2]|0)>0){i=(c[j+20>>2]|0)>0;g=i?t:-1;i=(i&1)+t|0}else{g=-1;i=t}g=l5(d,g)|0;if(!g){g=l5(d,4)|0;if(!g){g=k5(d,k)|0;if(!g){p=i;g=l5(d,0)|0;o=s}else{p=i;o=s}}else{p=i;o=s}}else{p=i;o=s}}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}break}case 2:{i=c[q+4>>2]|0;if(y){if((c[e>>2]|0)>-1)g=1;else g=(a[i+12>>0]&1)!=0;g=l5(d,g&1)|0;if(g|0){p=t;o=s;break c}}else{g=l5(d,m)|0;if(g|0){p=t;o=s;break c}g=l5(d,a[i+12>>0]&1)|0;if(g|0){p=t;o=s;break c}}g=k5(d,q)|0;if(!g){g=l5(d,1)|0;if(!g){g=k5(d,c[i>>2]|0)|0;if(!g){g=l5(d,0)|0;if(!g){if((c[e>>2]|0)<=-1?(a[i+12>>0]&1)==0:0){p=t;g=0;o=0;break c}if(y)g=0;else{g=y5(b,q,m)|0;c[(c[u>>2]|0)+(m<<2)>>2]=(a[i+12>>0]&1)==0?s:1;if((l|0)>-1){j=c[v>>2]|0;i=0;while(1){k=j+(i<<2)|0;o=i+1|0;if((c[k>>2]|0)>-1)i=o;else break}c[k>>2]=m;c[j+(o<<2)>>2]=l;c[j+(i+2<<2)>>2]=-1;h=h+1|0;l=-1}z5(e,f,m)}c[e>>2]=-1;p=t+1|0;o=0;n=n+1|0;m=t}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}break}case 3:{j=c[q+4>>2]|0;k=c[j>>2]|0;j=c[j+4>>2]|0;i=(c[e>>2]|0)>-1;p=t+1|0;g=l5(d,i?p:t)|0;if(!g){g=l5(d,i?t:m)|0;if(!g){g=k5(d,e)|0;if(!g){g=l5(d,(c[e>>2]|0)>>>31^1)|0;if(!g){g=k5(d,q)|0;if(!g){g=k5(d,j)|0;if(!g){g=k5(d,k)|0;if(!g){g=l5(d,3)|0;if(!g){g=k5(d,j)|0;if(!g){g=l5(d,0)|0;if(!g){g=l5(d,2)|0;if(g|0){p=t;o=s;break c}g=k5(d,k)|0;if(g|0){p=t;o=s;break c}g=l5(d,0)|0;if(g|0){p=t;o=s;break c}if((c[e>>2]|0)>-1){if(y)g=0;else{g=y5(b,q,m)|0;c[(c[u>>2]|0)+(m<<2)>>2]=s;if((l|0)>-1){j=c[v>>2]|0;i=0;while(1){k=j+(i<<2)|0;o=i+1|0;if((c[k>>2]|0)>-1)i=o;else break}c[k>>2]=m;c[j+(o<<2)>>2]=l;c[j+(i+2<<2)>>2]=-1;h=h+1|0;l=-1}z5(e,f,m)}c[e>>2]=-1;n=n+1|0;m=t;i=p}else{g=0;i=t}t=(c[q+16>>2]|0)>0;p=t?i+2|0:i;o=s;m=t?i+1|0:m}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}}else{p=t;o=s}break}default:{p=t;g=0;o=s}}while(0);j=c[r>>2]|0;if((j|0)>-1){i=0;do{k=A+(i<<2)|0;i=i+1|0}while((c[k>>2]|0)>-1);c[k>>2]=j;c[A+(i<<2)>>2]=-1;j=p;i=o}else{j=p;i=o}break}case 1:{g=n5(d)|0;if(y){i=c[(c[c[g+4>>2]>>2]|0)+20>>2]|0;c[g+20>>2]=(m5(d)|0)+i;i=0;l=-1}else{q=m5(d)|0;r=m5(d)|0;i=q;l=(q|0)==0?l:r}g=0;j=t;i=y?s:(i|0)==0&1;break}case 4:{i=m5(d)|0;j=m5(d)|0;g=0;m=(i|0)>-1?i:m;i=s;break}case 5:{g=n5(d)|0;if(y){j=c[g+4>>2]|0;c[g+20>>2]=(c[(c[j+4>>2]|0)+20>>2]|0)+(c[(c[j>>2]|0)+20>>2]|0);g=0;j=t;i=s}else{g=0;j=t;i=s}break}case 2:{while(1)if((c[e>>2]|0)>-1)e=e+4|0;else{g=0;j=t;i=s;break}break}case 3:{j=n5(d)|0;o=n5(d)|0;g=n5(d)|0;e=m5(d)|0;if(y){r=c[g+4>>2]|0;s=g+16|0;c[g+20>>2]=(c[(c[r>>2]|0)+20>>2]|0)+e+(c[(c[r+4>>2]|0)+20>>2]|0)+((c[s>>2]|0)>0?2:0);g=s}else g=g+16|0;e=n5(d)|0;i=m5(d)|0;k=m5(d)|0;if((c[g>>2]|0)>0){if(y)g=0;else{g=A5(b,j,i)|0;c[(c[u>>2]|0)+(i<<2)>>2]=1;if(!g)g=A5(b,o,k)|0;c[(c[u>>2]|0)+(k<<2)>>2]=1}n=n+2|0;j=t;i=1}else{g=0;j=t;i=1}break}default:{g=0;j=t;i=s}}while(0);if((g|0)!=0|(j5(d)|0)<=(x|0))break a;else{t=j;s=i}}}while(0);if(!y?(z5(e,f,m),(l|0)>-1):0){i=c[f+36>>2]|0;e=0;while(1){j=i+(e<<2)|0;k=e+1|0;if((c[j>>2]|0)>-1)e=k;else break}c[j>>2]=m;c[i+(k<<2)>>2]=l;c[i+(e+2<<2)>>2]=-1;h=h+1|0}c[f+48>>2]=n;c[f+40>>2]=n;c[f+44>>2]=h;l6(z);l6(A)}while(0);return g|0}function b5(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;y=l;l=l+16|0;t=y+12|0;w=y+8|0;x=y+4|0;u=y;v=j5(b)|0;c[t>>2]=0;c[w>>2]=0;d=k5(b,d)|0;a:do if(!d){d=l5(b,0)|0;if(!d){b:do if((j5(b)|0)>(v|0)){g=0;i=0;j=0;c:while(1){q=m5(b)|0;r=n5(b)|0;d:do switch(q|0){case 0:{switch(c[r>>2]|0){case 0:{d=c[r+4>>2]|0;r=c[d>>2]|0;if(!((r|0)>-1|(r|0)==-4)){d=j;break d}r=d+8|0;d=(c[r>>2]|0)+j|0;c[r>>2]=d;if((d|0)<=(c[w>>2]|0)){d=j;break d}c[w>>2]=d;d=j;break d}case 3:{h=c[r+4>>2]|0;d=k5(b,c[h+4>>2]|0)|0;if(d|0)break b;d=l5(b,0)|0;if(d|0)break b;d=k5(b,c[h>>2]|0)|0;if(d|0)break b;break}case 1:{h=c[r+4>>2]|0;d=k5(b,c[h+4>>2]|0)|0;if(d|0)break b;d=l5(b,0)|0;if(d|0)break b;d=k5(b,c[h>>2]|0)|0;if(d|0)break b;break}case 2:{h=c[r+4>>2]|0;d=l5(b,j)|0;if(d|0)break b;d=k5(b,r)|0;if(d|0)break b;d=l5(b,1)|0;if(d|0)break b;d=k5(b,c[h>>2]|0)|0;if(d|0)break b;d=l5(b,0)|0;if(d|0)break b;if((c[h+4>>2]|0)<=1?(c[h+8>>2]|0)<=1:0)d=j;else{c[t>>2]=0;d=0}i=i+1|0;break d}default:{d=j;break d}}d=l5(b,0)|0;if(!d)d=j;else break b;break}case 1:{p=r+4|0;o=c[p>>2]|0;q=m5(b)|0;c[t>>2]=q;n=o+4|0;j=c[n>>2]|0;if((j|0)<=1)if((c[o+8>>2]|0)>1){c[x>>2]=0;if((j|0)>0)s=30;else{d=q;h=0;s=37}}else d=q;else{c[x>>2]=0;s=30}e:do if((s|0)==30){d=v5(a,b,c[o>>2]|0,(j|0)>1?1:2,t,f,u,w)|0;if(!d){h=0;k=q;m=1}else{s=34;break c}while(1){d=c[u>>2]|0;if(!h)h=d;else h=d5(a,h,d)|0;if(!h){d=12;s=34;break c}j=c[n>>2]|0;if((m|0)>=(j|0)){d=k;s=37;break e}k=c[t>>2]|0;m=m+1|0;d=v5(a,b,c[o>>2]|0,(m|0)<(j|0)?1:2,t,f,u,w)|0;if(d|0){s=34;break c}}}while(0);if((s|0)==37){s=0;n=o+8|0;k=c[n>>2]|0;if((k|0)==-1){k=c[t>>2]|0;d=v5(a,b,c[o>>2]|0,0,t,0,x,w)|0;if(d|0)break c;j=w5(a,c[x>>2]|0,0,-1,0)|0;c[x>>2]=j;if(!j){d=12;break c}else d=k}else if((j|0)<(k|0)){k=j;j=0;do{m=c[t>>2]|0;d=v5(a,b,c[o>>2]|0,0,t,0,u,w)|0;if(d|0){g=j;s=48;break c}d=c[u>>2]|0;if(!j)j=d;else j=d5(a,d,j)|0;if(!j){d=12;g=0;s=48;break c}d=c5(a,-1,-1,-1)|0;if(!d){d=12;g=j;s=48;break c}j=x5(a,d,j)|0;if(!j){d=12;g=0;s=48;break c}k=k+1|0}while((k|0)<(c[n>>2]|0));c[x>>2]=j;d=m}else j=0;c[t>>2]=d;if(h){if(j){h=d5(a,h,j)|0;s=54}}else{h=j;s=54}if((s|0)==54){s=0;if(!h){d=12;break c}}c[p>>2]=c[h+4>>2];c[r>>2]=c[h>>2]}i=i+-1|0;h=d-q+g|0;if(!i){c[t>>2]=h;g=h;i=0;d=h}else g=h;break}default:d=j}while(0);if((j5(b)|0)>(v|0))j=d;else{d=0;break b}}if((s|0)!=34)if((s|0)==48)c[x>>2]=g;break a}else{d=0;g=0}while(0);x=(c[e>>2]|0)+g|0;w=c[w>>2]|0;c[e>>2]=(w|0)>(x|0)?w:x}}while(0);l=y;return d|0}function c5(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=s5(a,0,0,1,20)|0;a=u5(a,0,f)|0;if(!a)a=0;else{c[f>>2]=b;c[f+4>>2]=d;c[f+8>>2]=e}return a|0}function d5(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if(b){e=s5(a,0,0,1,8)|0;a=u5(a,1,e)|0;if(!a)d=0;else{c[e>>2]=b;c[e+4>>2]=d;c[a+16>>2]=(c[d+16>>2]|0)+(c[b+16>>2]|0);d=a}}return d|0}function e5(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;j=o+4|0;k=o;m=j5(b)|0;d=k5(b,d)|0;a:do if(!d){d=l5(b,0)|0;if(!d)if((j5(b)|0)>(m|0)){b:while(1){h=m5(b)|0;i=n5(b)|0;c:do switch(h|0){case 0:switch(c[i>>2]|0){case 0:{g=c[i+4>>2]|0;f=c[g>>2]|0;if((f|0)==-4){c[i+8>>2]=0;d=g+8|0;h=o5(a,c[d>>2]|0,0,1114111,0,0,-1)|0;c[i+24>>2]=h;if(!h){d=12;break a}h=o5(a,c[d>>2]|0,0,1114111,0,0,c[g+4>>2]|0)|0;c[i+28>>2]=h;if(!h){d=12;break a}else break c}d=i+8|0;if((f|0)<0){c[d>>2]=1;h=p5(a)|0;c[i+24>>2]=h;if(!h){d=12;break a}h=p5(a)|0;c[i+28>>2]=h;if(!h){d=12;break a}else break c}else{c[d>>2]=0;d=g+8|0;e=g+4|0;h=o5(a,c[d>>2]|0,f,c[e>>2]|0,0,0,-1)|0;c[i+24>>2]=h;if(!h){d=12;break a}h=o5(a,c[d>>2]|0,c[g>>2]|0,c[e>>2]|0,c[g+12>>2]|0,c[g+16>>2]|0,-1)|0;c[i+28>>2]=h;if(!h){d=12;break a}else break c}}case 3:{d=k5(b,i)|0;if(d|0)break a;d=l5(b,1)|0;if(d|0)break a;e=i+4|0;d=k5(b,c[(c[e>>2]|0)+4>>2]|0)|0;if(d|0)break a;d=l5(b,0)|0;if(d|0)break a;d=k5(b,c[c[e>>2]>>2]|0)|0;if(d|0)break a;d=l5(b,0)|0;if(!d)break c;else break a}case 1:{d=k5(b,i)|0;if(d|0)break a;d=l5(b,2)|0;if(d|0)break a;e=i+4|0;d=k5(b,c[(c[e>>2]|0)+4>>2]|0)|0;if(d|0)break a;d=l5(b,0)|0;if(d|0)break a;d=k5(b,c[c[e>>2]>>2]|0)|0;if(d|0)break a;d=l5(b,0)|0;if(!d)break c;else break a}case 2:{d=k5(b,i)|0;if(d|0)break a;d=l5(b,3)|0;if(d|0)break a;d=k5(b,c[c[i+4>>2]>>2]|0)|0;if(d|0)break a;d=l5(b,0)|0;if(!d)break c;else break a}default:break c}case 1:{d=c[i+4>>2]|0;e=c[d>>2]|0;f=d+4|0;g=c[f>>2]|0;if(!(c[e+8>>2]|0))h=(c[g+8>>2]|0)!=0;else h=1;c[i+8>>2]=h&1;h=q5(a,c[e+24>>2]|0,c[g+24>>2]|0,0,0)|0;c[i+24>>2]=h;if(!h){d=12;break a}h=q5(a,c[(c[d>>2]|0)+28>>2]|0,c[(c[f>>2]|0)+28>>2]|0,0,0)|0;c[i+28>>2]=h;if(!h){d=12;break a}break}case 3:{h=c[i+4>>2]|0;d=c[h>>2]|0;if(!(c[h+4>>2]|0))e=1;else e=(c[d+8>>2]|0)!=0&1;c[i+8>>2]=e;c[i+24>>2]=c[d+24>>2];c[i+28>>2]=c[d+28>>2];break}case 2:{g=c[i+4>>2]|0;d=c[g>>2]|0;e=d+8|0;if(!(c[e>>2]|0))f=0;else f=(c[(c[g+4>>2]|0)+8>>2]|0)!=0;c[i+8>>2]=f&1;if(c[e>>2]|0){d=r5(b,d,0,0,j)|0;if(d|0)break b;e=k6((c[j>>2]<<2)+4|0)|0;if(!e){d=12;break b}c[e>>2]=-1;c[k>>2]=0;d=r5(b,c[g>>2]|0,e,k,0)|0;if(d|0){n=45;break b}d=g+4|0;h=i+24|0;c[h>>2]=q5(a,c[(c[d>>2]|0)+24>>2]|0,c[(c[g>>2]|0)+24>>2]|0,e,c[k>>2]|0)|0;l6(e);if(!(c[h>>2]|0)){d=12;break b}else f=d}else{c[i+24>>2]=c[d+24>>2];f=g+4|0}d=c[f>>2]|0;if(c[d+8>>2]|0){d=r5(b,d,0,0,j)|0;if(d|0)break b;e=k6((c[j>>2]<<2)+4|0)|0;if(!e){d=12;break b}c[e>>2]=-1;c[k>>2]=0;d=r5(b,c[f>>2]|0,e,k,0)|0;if(d|0){n=52;break b}i=i+28|0;c[i>>2]=q5(a,c[(c[g>>2]|0)+28>>2]|0,c[(c[f>>2]|0)+28>>2]|0,e,c[k>>2]|0)|0;l6(e);if(!(c[i>>2]|0)){d=12;break b}}else c[i+28>>2]=c[d+28>>2];break}default:{}}while(0);if((j5(b)|0)<=(m|0)){d=0;break a}}if((n|0)==45)l6(e);else if((n|0)==52)l6(e)}else d=0}while(0);l=o;return d|0}function f5(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;a:while(1){switch(c[a>>2]|0){case 2:{a=c[a+4>>2]|0;if((c[a+8>>2]|0)==-1?(h=c[a>>2]|0,h=i5(c[h+28>>2]|0,c[h+24>>2]|0,b,d,e)|0,(h|0)!=0):0){a=h;break a}break}case 3:{f=c[a+4>>2]|0;a=f5(c[f>>2]|0,b,d,e)|0;if(a|0)break a;a=f+4|0;break}case 1:{f=c[a+4>>2]|0;g=f+4|0;a=i5(c[(c[f>>2]|0)+28>>2]|0,c[(c[g>>2]|0)+24>>2]|0,b,d,e)|0;if(a|0)break a;a=f5(c[f>>2]|0,b,d,e)|0;if(!a)a=g;else break a;break}default:{a=0;break a}}a=c[a>>2]|0}return a|0}function g5(a){a=a|0;var b=0,d=0;b=c[a>>2]|0;if(b|0)do{l6(c[b>>2]|0);d=b;b=c[b+4>>2]|0;l6(d)}while((b|0)!=0);l6(a);return}function h5(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;h=c[a+4>>2]|0;if(h|0){e=h+4|0;a=c[h>>2]|0;if(c[e>>2]|0){d=0;do{if(c[a+(d<<5)+8>>2]|0){b=c[a+(d<<5)+16>>2]|0;if(b){l6(b);a=c[h>>2]|0}b=c[a+(d<<5)+28>>2]|0;if(b){l6(b);a=c[h>>2]|0}}d=d+1|0}while(d>>>0<(c[e>>2]|0)>>>0)}if(a|0)l6(a);d=h+8|0;a=c[d>>2]|0;if(a|0){if(c[a+8>>2]|0){while(1){b=c[a+16>>2]|0;if(b|0)l6(b);if(!(c[a+40>>2]|0))break;else a=a+32|0}a=c[d>>2]|0}l6(a)}f=h+16|0;a=c[f>>2]|0;if(a|0){g=h+28|0;b=c[g>>2]|0;if(b){e=0;do{d=c[a+(e*12|0)+8>>2]|0;if(d){l6(d);b=c[g>>2]|0;a=c[f>>2]|0}e=e+1|0}while(e>>>0>>0)}l6(a)}a=c[h+32>>2]|0;if(a|0)l6(a);a=c[h+20>>2]|0;if(a|0)l6(a);a=c[h+36>>2]|0;if(a|0)l6(a);l6(h)}return}function i5(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;g=c[a>>2]|0;h=(g|0)>-1;a:do if(!d)if(h){h=b+32|0;do{if((c[b>>2]|0)>-1?(y=e+(g<<2)|0,c[y>>2]=(c[y>>2]|0)+1,(c[h>>2]|0)>-1):0){g=h;do{y=e+(c[a>>2]<<2)|0;c[y>>2]=(c[y>>2]|0)+1;g=g+32|0}while((c[g>>2]|0)>-1)}a=a+32|0;g=c[a>>2]|0}while((g|0)>-1);g=0}else g=0;else if(h)while(1){h=c[b>>2]|0;b:do if((h|0)>-1){p=a+4|0;q=a+8|0;r=a+16|0;s=a+20|0;t=a+24|0;u=a+28|0;v=a+12|0;e=-1;g=b;while(1){o=h;while(1){if((o|0)!=(e|0))break;g=g+32|0;h=c[g>>2]|0;if((h|0)>-1)o=h;else break b}n=d+(c[f+(c[a>>2]<<2)>>2]<<5)|0;while(1){h=n+8|0;if(!(c[h>>2]|0))break;else n=n+32|0}c[n+40>>2]=0;c[n>>2]=c[p>>2];c[n+4>>2]=c[q>>2];c[h>>2]=d+(c[f+(o<<2)>>2]<<5);c[n+12>>2]=o;h=c[s>>2]|0;m=c[t>>2]|0;e=(m|0)!=0;i=c[g+16>>2]|c[r>>2]|(h|0?4:0)|(e?8:0);j=n+20|0;c[j>>2]=i;k=c[u>>2]|0;l=n+24|0;if((k|0)>-1){c[l>>2]=k;c[j>>2]=i|256}else c[l>>2]=h;if(e){h=0;do{l=h;h=h+1|0}while((c[m+(l<<2)>>2]|0)!=0);h=k6(h<<2)|0;c[n+28>>2]=h;if(!h){g=12;break a}k=c[t>>2]|0;e=c[k>>2]|0;if(e){j=0;i=h;do{c[i>>2]=e;j=j+1|0;e=c[k+(j<<2)>>2]|0;i=h+(j<<2)|0}while((e|0)!=0);h=i}c[h>>2]=0}else c[n+28>>2]=0;e=c[v>>2]|0;if(!e)h=0;else{h=0;while(1)if((c[e+(h<<2)>>2]|0)>-1)h=h+1|0;else break}k=g+12|0;i=c[k>>2]|0;if(!i)e=0;else{e=0;while(1)if((c[i+(e<<2)>>2]|0)>-1)e=e+1|0;else break}j=n+16|0;i=c[j>>2]|0;if(i|0)l6(i);c[j>>2]=0;h=e+h|0;if((h|0)>0){n=k6((h<<2)+4|0)|0;c[j>>2]=n;if(!n){g=12;break a}i=c[v>>2]|0;if((i|0)!=0?(w=c[i>>2]|0,(w|0)>-1):0){h=0;e=w;do{c[n+(h<<2)>>2]=e;h=h+1|0;e=c[i+(h<<2)>>2]|0}while((e|0)>-1);m=h}else m=0;j=c[k>>2]|0;if((j|0)!=0?(x=c[j>>2]|0,(x|0)>-1):0){k=(m|0)>0;h=m;i=0;l=x;do{c:do if(k){e=0;while(1){if((c[n+(e<<2)>>2]|0)==(l|0))break c;e=e+1|0;if((e|0)>=(m|0)){y=40;break}}}else y=40;while(0);if((y|0)==40){y=0;c[n+(h<<2)>>2]=l;h=h+1|0}i=i+1|0;l=c[j+(i<<2)>>2]|0}while((l|0)>-1)}else h=m;c[n+(h<<2)>>2]=-1}g=g+32|0;h=c[g>>2]|0;if((h|0)<=-1)break;else e=o}}while(0);a=a+32|0;if((c[a>>2]|0)<=-1){g=0;break}}else g=0;while(0);return g|0}function j5(a){a=a|0;return c[a+12>>2]|0}function k5(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d+4|0;f=d;c[f>>2]=b;c[e>>2]=c[f>>2];b=t5(a,e)|0;l=d;return b|0}function l5(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=l;l=l+16|0;e=d+4|0;f=d;c[f>>2]=b;c[e>>2]=c[f>>2];b=t5(a,e)|0;l=d;return b|0}function m5(a){a=a|0;var b=0,d=0;b=c[a+16>>2]|0;d=a+12|0;a=(c[d>>2]|0)+-1|0;c[d>>2]=a;return c[b+(a<<2)>>2]|0}function n5(a){a=a|0;var b=0,d=0;b=c[a+16>>2]|0;d=a+12|0;a=(c[d>>2]|0)+-1|0;c[d>>2]=a;return c[b+(a<<2)>>2]|0}function o5(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;a=s5(a,0,0,1,64)|0;if(!a)a=0;else{c[a>>2]=b;c[a+4>>2]=d;c[a+8>>2]=e;c[a+20>>2]=f;c[a+24>>2]=g;c[a+28>>2]=h;c[a+32>>2]=-1;c[a+36>>2]=-1;c[a+40>>2]=-1}return a|0}function p5(a){a=a|0;a=s5(a,0,0,1,32)|0;if(!a)a=0;else{c[a>>2]=-1;c[a+4>>2]=-1;c[a+8>>2]=-1}return a|0}function q5(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=(e|0)==0;if(o)n=0;else{g=0;while(1)if((c[e+(g<<2)>>2]|0)>-1)g=g+1|0;else{n=g;break}}h=0;while(1)if((c[b+(h<<5)>>2]|0)>-1)h=h+1|0;else{g=0;break}while(1)if((c[d+(g<<5)>>2]|0)>-1)g=g+1|0;else break;g=s5(a,0,0,1,(g+h<<5)+32|0)|0;a:do if(!g)g=0;else{h=c[b>>2]|0;if((h|0)>-1){m=(n|0)>0;i=0;while(1){c[g+(i<<5)>>2]=h;c[g+(i<<5)+4>>2]=c[b+(i<<5)+4>>2];c[g+(i<<5)+8>>2]=c[b+(i<<5)+8>>2];c[g+(i<<5)+16>>2]=c[b+(i<<5)+16>>2]|f;c[g+(i<<5)+20>>2]=c[b+(i<<5)+20>>2];c[g+(i<<5)+24>>2]=c[b+(i<<5)+24>>2];c[g+(i<<5)+28>>2]=c[b+(i<<5)+28>>2];l=b+(i<<5)+12|0;k=c[l>>2]|0;h=(k|0)==0;if(o&h)h=0;else{if(h)j=0;else{j=0;while(1)if((c[k+(j<<2)>>2]|0)>-1)j=j+1|0;else break}h=s5(a,0,0,0,(j+n<<2)+4|0)|0;if(!h){g=0;break a}if((j|0)>0){l=c[l>>2]|0;k=0;do{c[h+(k<<2)>>2]=c[l+(k<<2)>>2];k=k+1|0}while((k|0)!=(j|0))}else j=0;if(m){l=0;k=j;while(1){c[h+(k<<2)>>2]=c[e+(l<<2)>>2];k=l+1|0;if((k|0)==(n|0))break;else{l=k;k=k+j|0}}j=n+j|0}c[h+(j<<2)>>2]=-1}c[g+(i<<5)+12>>2]=h;i=i+1|0;h=c[b+(i<<5)>>2]|0;if((h|0)<=-1){n=i;break}}}else n=0;i=c[d>>2]|0;h=g+(n<<5)|0;if((i|0)>-1){m=0;l=n;do{c[h>>2]=i;c[g+(l<<5)+4>>2]=c[d+(m<<5)+4>>2];c[g+(l<<5)+8>>2]=c[d+(m<<5)+8>>2];c[g+(l<<5)+16>>2]=c[d+(m<<5)+16>>2];c[g+(l<<5)+20>>2]=c[d+(m<<5)+20>>2];c[g+(l<<5)+24>>2]=c[d+(m<<5)+24>>2];c[g+(l<<5)+28>>2]=c[d+(m<<5)+28>>2];k=d+(m<<5)+12|0;h=c[k>>2]|0;if(!h)h=0;else{i=0;while(1){j=i+1|0;if((c[h+(i<<2)>>2]|0)>-1)i=j;else break}h=s5(a,0,0,0,j<<2)|0;if(!h){g=0;break a}if((i|0)>0){k=c[k>>2]|0;j=0;do{c[h+(j<<2)>>2]=c[k+(j<<2)>>2];j=j+1|0}while((j|0)!=(i|0))}else i=0;c[h+(i<<2)>>2]=-1}c[g+(l<<5)+12>>2]=h;m=m+1|0;i=c[d+(m<<5)>>2]|0;l=m+n|0;h=g+(l<<5)|0}while((i|0)>-1)}c[h>>2]=-1}while(0);return g|0}function r5(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;o=j5(a)|0;p=(f|0)!=0;if(p)c[f>>2]=0;b=k5(a,b)|0;a:do if(!b){m=(d|0)==0;l=(e|0)==0;if((j5(a)|0)>(o|0))while(1){b=n5(a)|0;b:do switch(c[b>>2]|0){case 0:{b=c[b+4>>2]|0;switch(c[b>>2]|0){case -3:break;case -2:{if(l)break b;c[e>>2]=c[e>>2]|c[b+4>>2];break b}default:break b}h=c[b+4>>2]|0;if((h|0)>-1){c:do if(!m){b=0;while(1){i=d+(b<<2)|0;j=c[i>>2]|0;if((j|0)<=-1)break;if((j|0)==(h|0))break c;else b=b+1|0}c[i>>2]=h;c[d+(b+1<<2)>>2]=-1}while(0);if(p)c[f>>2]=(c[f>>2]|0)+1}break}case 3:{b=c[b+4>>2]|0;h=c[b>>2]|0;if(c[h+8>>2]|0){k=h;n=6;break b}b=c[b+4>>2]|0;if(c[b+8>>2]|0){k=b;n=6}break}case 1:{b=c[b+4>>2]|0;h=k5(a,c[b>>2]|0)|0;if(h|0){g=h;break a}k=c[b+4>>2]|0;n=6;break}case 2:{b=c[c[b+4>>2]>>2]|0;if(c[b+8>>2]|0){k=b;n=6}break}default:{}}while(0);if((n|0)==6?(n=0,g=k5(a,k)|0,g|0):0)break a;if((j5(a)|0)<=(o|0)){g=0;break a}}else g=0}else g=b;while(0);return g|0}function s5(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;h=a+16|0;a:do if(!(c[h>>2]|0)){j=a+12|0;g=c[j>>2]|0;if(g>>>0>>0){do if(b)if(!d){c[h>>2]=1;d=0;break a}else{b=a+8|0;c[b>>2]=d;g=1024;break}else{g=f<<3;g=g>>>0>1024?g:1024;i=k6(8)|0;if(!i){c[h>>2]=1;d=0;break a}d=k6(g)|0;c[i>>2]=d;if(!d){l6(i);c[h>>2]=1;d=0;break a}c[i+4>>2]=0;b=a+4|0;h=c[b>>2]|0;if(h|0)c[h+4>>2]=i;if(!(c[a>>2]|0))c[a>>2]=i;c[b>>2]=i;b=a+8|0;c[b>>2]=d}while(0);c[j>>2]=g;h=b}else{d=a+8|0;h=d;d=c[d>>2]|0}b=d+f&3;b=((b|0)==0?0:4-b|0)+f|0;c[h>>2]=d+b;c[j>>2]=g-b;if(e)u6(d|0,0,b|0)|0}else d=0;while(0);return d|0}function t5(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;g=k;d=a+12|0;e=c[d>>2]|0;j=c[a>>2]|0;if((e|0)>=(j|0)){d=c[a+4>>2]|0;if((j|0)<(d|0)?(f=(c[a+8>>2]|0)+j|0,f=(f|0)>(d|0)?d:f,h=a+16|0,i=n6(c[h>>2]|0,f<<2)|0,(i|0)!=0):0){c[a>>2]=f;c[h>>2]=i;c[g>>2]=c[b>>2];t5(a,g)|0;d=0}else d=12}else{c[(c[a+16>>2]|0)+(e<<2)>>2]=c[b>>2];c[d>>2]=(c[d>>2]|0)+1;d=0}l=k;return d|0}function u5(a,b,d){a=a|0;b=b|0;d=d|0;a=s5(a,0,0,1,32)|0;if((d|0)!=0&(a|0)!=0){c[a+4>>2]=d;c[a>>2]=b;c[a+8>>2]=-1;c[a+12>>2]=-1}else a=0;return a|0}function v5(b,d,e,f,g,h,i,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=j5(d)|0;k5(d,e)|0;e=l5(d,0)|0;a:do if(!e){r=(f&1|0)==0;q=(f&2|0)!=0;o=0;p=1;e=i;while(1){if((j5(d)|0)>(s|0))n=e;else{f=o;e=0;break a}b:while(1){c:while(1){switch(m5(d)|0){case 1:{i=7;break c}case 0:{e=n5(d)|0;switch(c[e>>2]|0){case 0:{i=9;break b}case 3:{i=19;break b}case 1:{i=26;break b}case 2:{i=33;break c}default:{}}break}default:{}}if((j5(d)|0)<=(s|0)){f=o;e=0;break a}}if((i|0)==7)e=n5(d)|0;else if((i|0)==33){f=c[e+4>>2]|0;e=k5(d,c[f>>2]|0)|0;if(e|0){f=o;break a}e=l5(d,0)|0;if(e|0){f=o;break a}e=w5(b,c[f>>2]|0,c[f+4>>2]|0,c[f+8>>2]|0,a[f+12>>0]&1)|0;c[n>>2]=e;if(!e){f=o;e=12;break a}e=c[e+4>>2]|0}if((j5(d)|0)>(s|0))n=e;else{f=o;e=0;break a}}if((i|0)==9){m=c[e+4>>2]|0;k=c[m+8>>2]|0;i=c[m>>2]|0;e=c[m+4>>2]|0;if(!((i|0)>-1|(i|0)==-4)){f=(i|0)==-3;if(r|f^1)if(f)if(q&(p|0)!=0){c[h+(e<<2)>>2]=1;i=-3;l=k;f=o;k=0}else{i=-3;l=k;f=o;k=p}else{l=k;f=o;k=p}else{e=-1;i=-1;l=-1;f=o;k=p}}else{l=(c[g>>2]|0)+k|0;f=o+1|0;k=p}e=c5(b,i,e,l)|0;c[n>>2]=e;if(!e)e=12;else{e=c[e+4>>2]|0;c[e+12>>2]=c[m+12>>2];c[e+16>>2]=c[m+16>>2];e=0}if((l|0)>(c[j>>2]|0)){c[j>>2]=l;l=f;f=n}else{l=f;f=n}}else if((i|0)==19){i=c[e+4>>2]|0;f=i+4|0;e=x5(b,c[i>>2]|0,c[f>>2]|0)|0;c[n>>2]=e;if(!e){f=o;e=12;break a}m=c[e+4>>2]|0;e=k5(d,c[f>>2]|0)|0;if(e|0){f=o;break a}e=l5(d,0)|0;if(e|0){f=o;break a}e=k5(d,m+4|0)|0;if(e|0){f=o;break a}e=l5(d,1)|0;if(e|0){f=o;break a}e=k5(d,c[i>>2]|0)|0;if(e|0){f=o;break a}l=o;k=p;f=m;e=l5(d,0)|0}else if((i|0)==26){l=c[e+4>>2]|0;i=l+4|0;e=d5(b,c[l>>2]|0,c[i>>2]|0)|0;c[n>>2]=e;if(!e){f=o;e=12;break a}f=c[e+4>>2]|0;c[f>>2]=0;k=f+4|0;c[k>>2]=0;e=k5(d,c[i>>2]|0)|0;if(e|0){f=o;break a}e=l5(d,0)|0;if(e|0){f=o;break a}e=k5(d,k)|0;if(e|0){f=o;break a}e=l5(d,1)|0;if(e|0){f=o;break a}e=k5(d,c[l>>2]|0)|0;if(e|0){f=o;break a}l=o;k=p;e=l5(d,0)|0}if(!e){o=l;p=k;e=f}else{f=l;break}}}else f=0;while(0);c[g>>2]=(c[g>>2]|0)+f;return e|0}function w5(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=s5(b,0,0,1,16)|0;b=u5(b,2,h)|0;if(!b)b=0;else{c[h>>2]=d;c[h+4>>2]=e;c[h+8>>2]=f;h=h+12|0;a[h>>0]=a[h>>0]&-2|g&1;c[b+16>>2]=c[d+16>>2]}return b|0}function x5(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if(b){e=s5(a,0,0,1,8)|0;a=u5(a,3,e)|0;if((d|0)!=0&(a|0)!=0){c[e>>2]=b;c[e+4>>2]=d;c[a+16>>2]=(c[d+16>>2]|0)+(c[b+16>>2]|0);d=a}else d=0}return d|0}function y5(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=s5(a,0,0,0,8)|0;if(((e|0)!=0?(d=c5(a,-3,d,-1)|0,c[e>>2]=d,(d|0)!=0):0)?(f=s5(a,0,0,0,32)|0,c[e+4>>2]=f,(f|0)!=0):0){a=b+4|0;c[f+4>>2]=c[a>>2];c[f>>2]=c[b>>2];c[f+8>>2]=-1;c[f+12>>2]=-1;f=f+16|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[a>>2]=e;c[b>>2]=1;a=0}else a=12;return a|0}function z5(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=c[a>>2]|0;if((f|0)>-1){g=c[b+16>>2]|0;e=0;b=f;do{f=b>>>1;c[((b&1|0)==0?g+(f*12|0)|0:g+(f*12|0)+4|0)>>2]=d;e=e+1|0;b=c[a+(e<<2)>>2]|0}while((b|0)>-1)}c[a>>2]=-1;return}function A5(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=s5(a,0,0,0,8)|0;if(((e|0)!=0?(d=c5(a,-3,d,-1)|0,c[e+4>>2]=d,(d|0)!=0):0)?(f=s5(a,0,0,0,32)|0,c[e>>2]=f,(f|0)!=0):0){a=b+4|0;c[f+4>>2]=c[a>>2];c[f>>2]=c[b>>2];c[f+8>>2]=-1;c[f+12>>2]=-1;f=f+16|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[a>>2]=e;c[b>>2]=1;a=0}else a=12;return a|0}function B5(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+16|0;j=m;i=b+32|0;h=c[i>>2]|0;g=h&1;a:do switch(a[d>>0]|0){case 91:{e=F5(b,d+1|0)|0;break}case 92:{e=d+1|0;f=G5(e)|0;if(f|0){e=B5(b,f)|0;c[b+12>>2]=d+2;break a}f=a[e>>0]|0;switch(f|0){case 0:{e=5;break a}case 98:{f=c5(c[b>>2]|0,-2,64,-1)|0;break}case 66:{f=c5(c[b>>2]|0,-2,128,-1)|0;break}case 60:{f=c5(c[b>>2]|0,-2,16,-1)|0;break}case 62:{f=c5(c[b>>2]|0,-2,32,-1)|0;break}case 120:{h=d+2|0;i=(a[h>>0]|0)==123;g=i?8:2;h=i?d+3|0:h;e=0;f=0;do{d=H5(a[h+e>>0]|0)|0;if((d|0)<0)break;f=d+(f<<4)|0;e=e+1|0}while((f|0)<1114112&(e|0)<(g|0));e=h+e|0;if(i){if((a[e>>0]|0)!=125){e=9;break a}e=e+1|0}j=c[b>>2]|0;i=b+24|0;k=c[i>>2]|0;c[i>>2]=k+1;f=c5(j,f,f,k)|0;e=e+-1|0;break}case 63:case 43:case 123:if(!g){e=13;break a}else{k=37;break a}case 124:{if(g|0){k=37;break a}e=c5(c[b>>2]|0,-1,-1,-1)|0;k=45;break a}default:{if(!((g|0)==0&(f+-49|0)>>>0<9)){k=37;break a}j=f+-48|0;k=c[b>>2]|0;i=b+24|0;f=c[i>>2]|0;c[i>>2]=f+1;f=c5(k,-4,j,f)|0;k=b+28|0;i=c[k>>2]|0;c[k>>2]=(j|0)<(i|0)?i:j}}d=e+1|0;e=f;k=45;break}case 46:{g=b+24|0;e=c[g>>2]|0;c[g>>2]=e+1;f=c[b>>2]|0;if(h&4){f=c5(f,0,9,e)|0;k=c[b>>2]|0;e=c[g>>2]|0;c[g>>2]=e+1;e=c5(k,11,1114111,e)|0;if((f|0)!=0&(e|0)!=0)e=x5(c[b>>2]|0,f,e)|0;else e=0}else e=c5(f,0,1114111,e)|0;d=d+1|0;k=45;break}case 94:{if((g|0)==0?(c[b+16>>2]|0)!=(d|0):0){e=d;k=37;break a}d=d+1|0;e=c5(c[b>>2]|0,-2,1,-1)|0;k=45;break}case 36:{e=d+1|0;if((g|0)==0?a[e>>0]|0:0){e=d;k=37;break a}d=e;e=c5(c[b>>2]|0,-2,2,-1)|0;k=45;break}case 63:case 43:case 123:case 42:{if(!g){e=d;k=37}else e=13;break}case 124:{if(!g){e=d;k=37}else k=36;break}case 0:{k=36;break}default:{e=d;k=37}}while(0);if((k|0)==36){e=c5(c[b>>2]|0,-1,-1,-1)|0;k=45}else if((k|0)==37){h=c4(j,e,-1)|0;if((h|0)<0)e=2;else{do if(c[i>>2]&2){if((a3(c[j>>2]|0)|0)==0?(Y2(c[j>>2]|0)|0)==0:0){k=43;break}i=c[b>>2]|0;n=g3(c[j>>2]|0)|0;g=g3(c[j>>2]|0)|0;f=b+24|0;g=c5(i,n,g,c[f>>2]|0)|0;n=c[b>>2]|0;i=c3(c[j>>2]|0)|0;d=c3(c[j>>2]|0)|0;d=c5(n,i,d,c[f>>2]|0)|0;if((g|0)!=0&(d|0)!=0)g=x5(c[b>>2]|0,g,d)|0;else g=0}else k=43;while(0);if((k|0)==43){g=c[j>>2]|0;f=b+24|0;g=c5(c[b>>2]|0,g,g,c[f>>2]|0)|0}c[f>>2]=(c[f>>2]|0)+1;d=e+h|0;e=g;k=45}}if((k|0)==45)if(!e)e=12;else{c[b+8>>2]=e;c[b+12>>2]=d;e=0}l=m;return e|0}function C5(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;j=l;l=l+16|0;i=j+4|0;g=j;b=E5(b,i)|0;if((a[b>>0]|0)==44){b=E5(b+1|0,g)|0;h=c[g>>2]|0;g=c[i>>2]|0}else{i=c[i>>2]|0;c[g>>2]=i;h=i;g=i}do if(!(g>>>0>255|((h|0)>255|(h|0)>-1&(h|0)<(g|0)))){if(!d)if((a[b>>0]|0)==92)b=b+1|0;else{b=0;break}if((a[b>>0]|0)==125){c[e>>2]=g;c[f>>2]=h;b=b+1|0}else b=0}else b=0;while(0);l=j;return b|0}function D5(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;if((c[b+12>>2]|0)>-1){e=c5(c[a>>2]|0,-1,-1,-1)|0;if((e|0)!=0?(f=d5(c[a>>2]|0,e,b)|0,(f|0)!=0):0){e=c[b+16>>2]|0;c[f+16>>2]=e;g=6}else e=12}else{f=b;e=c[b+16>>2]|0;g=6}if((g|0)==6){c[f+12>>2]=d;c[f+16>>2]=e+1;c[a+8>>2]=f;e=0}return e|0}function E5(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;c[d>>2]=-1;if(((a[b>>0]|0)+-48|0)>>>0<10){c[d>>2]=0;e=b;g=0;f=a[b>>0]|0;while(1){g=(g*10|0)+-48+(f<<24>>24)|0;c[d>>2]=g;b=e+1|0;f=a[b>>0]|0;if((g|0)>255|((f<<24>>24)+-48|0)>>>0>9)break;else e=b}}return b|0}function F5(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+288|0;e=s+264|0;g=s;c[e>>2]=c[b>>2];h=e+8|0;c[h>>2]=0;c[e+12>>2]=32;p=k6(128)|0;r=e+4|0;c[r>>2]=p;if(!p)d=12;else{f=g+4|0;c[f>>2]=0;p=(a[d>>0]|0)==94;c[g>>2]=p&1;d=I5(b,p?d+1|0:d,e,g)|0;a:do if(!d){p=(c[g>>2]|0)==0;if(!p){k3(c[r>>2]|0,c[h>>2]|0,4,111);d=K5(e)|0;if(!d){d=12;e=0;break}c[d>>2]=1114112;c[d+4>>2]=1114112;c[d+8>>2]=-1;d=c[f>>2]|0;if(d){e=d<<2;f=s5(c[b>>2]|0,0,0,0,e+4|0)|0;if(!f){d=12;e=0;break}B6(f|0,g+8|0,e|0)|0;c[f+(d<<2)>>2]=0}else f=0}else f=0;m=c[h>>2]|0;if((m|0)>0){n=c[r>>2]|0;o=b+24|0;e=0;d=0;k=0;while(1){i=c[n+(k<<2)>>2]|0;g=c[i>>2]|0;h=i+4|0;do if(!p){j=(c[h>>2]|0)+1|0;if((g|0)>(d|0)){c[i>>2]=d;c[h>>2]=g+-1;d=j;q=14;break}else{d=(j|0)>=(d|0)?j:d;break}}else q=14;while(0);if((q|0)==14){q=0;c[i+8>>2]=c[o>>2];c[i+16>>2]=f;j=u5(c[b>>2]|0,0,i)|0;e=x5(c[b>>2]|0,e,j)|0;if(!e){d=12;e=0;break a}}k=k+1|0;if((k|0)>=(m|0)){d=0;break}}}else{d=0;e=0}}else e=0;while(0);l6(c[r>>2]|0);r=b+24|0;c[r>>2]=(c[r>>2]|0)+1;c[b+8>>2]=e}l=s;return d|0}function G5(b){b=b|0;var d=0;d=a[b>>0]|0;b=0;while(1){if((a[64024+(b<<3)>>0]|0)==d<<24>>24)break;b=b+1|0;if((b|0)==12){b=12;break}}return c[64024+(b<<3)+4>>2]|0}function H5(a){a=a|0;var b=0;b=a+-48|0;if(b>>>0<10)return b|0;else{b=a|32;return ((b+-97|0)>>>0<6?b+-87|0:-1)|0}return 0}function I5(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=l;l=l+32|0;o=t;q=t+4|0;i=c4(o,d,-1)|0;g=a[d>>0]|0;a:do if((i|0)>=1){r=f+4|0;n=b+32|0;h=d;j=i;b:while(1){i=(h|0)==(d|0);if(!(i|g<<24>>24!=93)){s=5;break}c:do if(!(i|g<<24>>24!=45)){switch(a[h+1>>0]|0){case 93:break c;case 45:break;default:{g=11;break a}}if((a[h+2>>0]|0)==93){g=11;break a}}while(0);d:do if(g<<24>>24==91){switch(a[h+1>>0]|0){case 61:case 46:{g=3;break a}case 58:break;default:{s=17;break d}}i=h+2|0;g=0;e:while(1){switch(a[i+g>>0]|0){case 0:{s=16;break b}case 58:break e;default:{}}g=g+1|0;if((g|0)>=14){s=16;break b}}B6(q|0,i|0,g|0)|0;a[q+g>>0]=0;j=h3(q)|0;if(!j){s=16;break b}h=i+(g+2)|0;if((a[i+(g+1)>>0]|0)!=93){s=16;break b}if(!(c[f>>2]|0)){g=1114111;m=0;k=1;s=25}else{g=c[r>>2]|0;if((g|0)>63){g=12;break a}c[r>>2]=g+1;c[f+8+(g<<2)>>2]=j}}else s=17;while(0);if((s|0)==17){s=0;i=c[o>>2]|0;h=h+j|0;if((a[h>>0]|0)==45?(p=h+1|0,(a[p>>0]|0)!=93):0){h=c4(o,p,-1)|0;g=c[o>>2]|0;if((h|0)<1|(i|0)>(g|0)){g=11;break a}j=0;m=i;h=p+h|0;k=0;s=25}else{j=0;g=i;m=i;k=0;s=25}}if((s|0)==25){s=0;i=K5(e)|0;if(!i){g=12;break a}c[i>>2]=m;c[i+4>>2]=g;c[i+12>>2]=j;c[i+8>>2]=-1;if(!(k|(c[n>>2]&2|0)==0)?(L5(e,m,g)|0)!=0:0){g=12;break a}}j=c4(o,h,-1)|0;g=a[h>>0]|0;if((j|0)<1){s=3;break a}}if((s|0)==5){c[b+12>>2]=h+1;g=0;break}else if((s|0)==16){g=4;break}}else s=3;while(0);if((s|0)==3)g=g<<24>>24?2:7;l=t;return g|0}function J5(a,b){a=a|0;b=b|0;return (c[c[a>>2]>>2]|0)-(c[c[b>>2]>>2]|0)|0}function K5(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;h=a+8|0;d=c[h>>2]|0;e=a+12|0;f=c[e>>2]|0;if((d|0)>=(f|0))if((f|0)<=32767?(c[e>>2]=f<<1,g=a+4|0,b=n6(c[g>>2]|0,f<<3)|0,(b|0)!=0):0){c[g>>2]=b;d=c[h>>2]|0;i=6}else b=0;else{b=c[a+4>>2]|0;i=6}if((i|0)==6){c[h>>2]=d+1;i=s5(c[a>>2]|0,0,0,1,20)|0;c[b+(d<<2)>>2]=i;b=i}return b|0}function L5(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;a:do if((b|0)>(d|0))b=0;else while(1){b:do if(!(Y2(b)|0)){if(!(a3(b)|0)){b=b+1|0;break}f=c3(b)|0;e=f;while(1){g=b+1|0;e=e+1|0;if((b|0)>=(d|0)){h=f;b=g;g=12;break b}if((c3(g)|0)==(e|0))b=g;else{h=f;b=g;g=12;break}}}else{f=g3(b)|0;e=f;while(1){g=b+1|0;e=e+1|0;if((b|0)>=(d|0)){h=f;b=g;g=12;break b}if((g3(g)|0)==(e|0))b=g;else{h=f;b=g;g=12;break}}}while(0);if((g|0)==12){g=0;f=K5(a)|0;if(!f){b=-1;break a}c[f>>2]=h;c[f+4>>2]=e+-1;c[f+8>>2]=-1}if((b|0)>(d|0)){b=0;break}}while(0);return b|0}function M5(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+16|0;k=n;i=c[a+4>>2]|0;j=i+56|0;h=(c[j>>2]&8|0)==0?d:0;a=c[i+40>>2]|0;if((a|0)>0&(h|0)!=0){a=k6(a<<2)|0;if(!a)a=12;else{g=a;d=a;m=3}}else{g=0;d=0;m=3}if((m|0)==3){if(!(c[i+60>>2]|0))a=O5(i,b,g,f,k)|0;else a=N5(i,b,g,f,k)|0;if(!a)P5(h,e,c[j>>2]|0,i,g,c[k>>2]|0);if(g)l6(d)}l=n;return a|0}function N5(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0;W=l;l=l+16|0;U=W;c[U>>2]=0;o=e&1;S=e&2;T=a+56|0;n=c[T>>2]&4;V=Z4(0,0)|0;a:do if(V){p=s5(V,0,0,0,32)|0;if(!p){g5(V);e=12;break}c[p+24>>2]=0;c[p+28>>2]=0;R=a+40|0;q=c[R>>2]|0;if(q){e=k6(q<<2)|0;if(!e){m=0;k=0;j=e;e=12;i=0;h=0;g=0}else{j=e;i=e;C=6}}else{j=0;i=0;C=6}b:do if((C|0)==6){e=c[a+28>>2]|0;if(e){e=k6(e<<3)|0;if(!e){m=e;k=0;e=12;h=0;g=0;break}else{m=e;h=e}}else{m=0;h=0}Q=a+52|0;e=c[Q>>2]|0;if(e){e=k6(e<<2)|0;if(!e){k=e;e=12;g=0;break}else{k=e;g=e}}else{k=0;g=0}M=a+8|0;N=a+12|0;O=(d|0)!=0;P=a+32|0;J=(n|0)!=0;K=(d|0)==0;L=(o|0)==0;I=(o|0)==0;s=b;e=1;r=-1;v=-1;n=q;B=0;c:while(1){if((n|0)>0){o=0;do{c[j+(o<<2)>>2]=-1;if(!K){c[d+(o<<2)>>2]=-1;n=c[R>>2]|0}o=o+1|0}while((o|0)<(n|0))}n=c[Q>>2]|0;if((n|0)>0)u6(g|0,0,n<<2|0)|0;G=e+r|0;e=c4(U,s,4)|0;if((e|0)<1)if((e|0)<0){e=1;break b}else e=1;F=s+e|0;H=c[U>>2]|0;n=c[M>>2]|0;o=n+8|0;if(c[o>>2]|0){w=(G|0)!=0;x=(B|0)==95;y=(G|0)==0;A=J&(B|0)==10;z=(G|0)<1&I;u=n;n=0;t=0;s=o;while(1){r=u+20|0;o=c[r>>2]|0;d:do if(o)if((o&1|0)==0|z|A){if(o&2|0?(E=c[U>>2]|0,!((E|S|0)==0|J&(E|0)==10)):0){q=t;break}do if(o&16|0){if(x){q=t;break d}if(R2(B)|0){q=t;break d}o=c[U>>2]|0;if((o|0)==95)break;if(!(R2(o)|0)){q=t;break d}}while(0);o=c[r>>2]|0;if(o&32){if(x){o=c[U>>2]|0;if((o|0)==95){q=t;break}}else{E=(R2(B)|0)==0;o=c[U>>2]|0;if(E|(o|0)==95){q=t;break}}if(R2(o)|0){q=t;break}o=c[r>>2]|0}q=c[U>>2]|0;do if((q|0)!=0&(w&(o&64|0)!=0)){if(x){o=q;q=1}else{q=(R2(B)|0)!=0;o=c[U>>2]|0}if((o|0)==95)if(q){q=t;break d}else break;else if(q^(R2(o)|0)!=0)break;else{q=t;break d}}while(0);if(!(c[r>>2]&128)){C=49;break}o=c[U>>2]|0;if(y|(o|0)==0){q=t;break}if(x)q=1;else{q=(R2(B)|0)!=0;o=c[U>>2]|0}if((o|0)==95)if(q){C=49;break}else{q=t;break}else if(q^(R2(o)|0)!=0){q=t;break}else{C=49;break}}else q=t;else C=49;while(0);do if((C|0)==49){C=0;if(!t){n=c[u+16>>2]|0;q=c[s>>2]|0;break}q=p+28|0;o=c[q>>2]|0;if(!o){o=s5(V,0,0,0,32)|0;if(!o){C=53;break c}c[o+24>>2]=p;c[o+28>>2]=0;E=s5(V,0,0,0,c[R>>2]<<2)|0;c[o+20>>2]=E;if(!E){C=60;break c}c[q>>2]=o;p=o}else p=o;c[p>>2]=G;c[p+4>>2]=F;c[p+8>>2]=c[s>>2];c[p+12>>2]=c[u+12>>2];c[p+16>>2]=c[U>>2];if((c[R>>2]|0)>0){q=c[p+20>>2]|0;o=0;do{c[q+(o<<2)>>2]=c[j+(o<<2)>>2];o=o+1|0}while((o|0)<(c[R>>2]|0))}o=c[u+16>>2]|0;if(!o)q=t;else{q=c[o>>2]|0;if((q|0)<=-1){q=t;break}r=c[p+20>>2]|0;do{o=o+4|0;c[r+(q<<2)>>2]=G;q=c[o>>2]|0}while((q|0)>-1);q=t}}while(0);s=u+40|0;if(!(c[s>>2]|0))break;else{u=u+32|0;t=q}}if(n){o=c[n>>2]|0;if((o|0)>-1)do{c[j+(o<<2)>>2]=G;n=n+4|0;o=c[n>>2]|0}while((o|0)>-1)}else n=0;if(!q)C=170;else{s=G;r=F;w=q;x=n;C=79}}else{n=0;C=170}e:while(1){if((C|0)==79){if((w|0)==(c[N>>2]|0)){if((v|0)>=(s|0)){if(!(O&(v|0)==(s|0))){n=x;C=170;continue}if(!(R5(c[R>>2]|0,c[P>>2]|0,j,d)|0)){n=x;C=170;continue}}if(!O){v=s;n=x;C=170;continue}if((c[R>>2]|0)>0)n=0;else{v=s;n=x;C=170;continue}while(1){c[d+(n<<2)>>2]=c[j+(n<<2)>>2];n=n+1|0;if((n|0)>=(c[R>>2]|0)){v=s;n=x;C=170;continue e}}}u=w+8|0;if((c[u>>2]|0)!=0?(c[w+20>>2]&256|0)!=0:0){o=c[w+24>>2]|0;P5(o+1|0,m,c[T>>2]&-9,a,j,s);E=c[m+(o<<3)>>2]|0;o=(c[m+(o<<3)+4>>2]|0)-E|0;if(h2(b+E|0,r+-1|0,o)|0){n=x;C=170;continue}E=(o|0)==0;n=E&1;q=k+(c[w+12>>2]<<2)|0;if(E?c[q>>2]|0:0){n=x;C=170;continue}c[q>>2]=n;o=o+-1|0;r=r+o|0;o=o+s|0;q=c[U>>2]|0;n=c4(U,r,4)|0;if((n|0)<1)if((n|0)<0){e=1;break b}else n=1;D=r+n|0;E=n}else{q=c[U>>2]|0;if(!q){n=x;C=170;continue}n=c4(U,r,4)|0;if((n|0)<1)if((n|0)<0){e=1;break b}else n=1;o=s;D=r+n|0;E=n}s=o+e|0;if(!(c[u>>2]|0)){e=E;n=x;C=170;continue}y=(s|0)!=0;z=(q|0)==95;A=(s|0)==0;C=J&(q|0)==10;B=(s|0)<1&L;t=0;n=x;while(1){f:do if((c[w>>2]|0)>>>0<=q>>>0){if((c[w+4>>2]|0)>>>0>>0)break;r=w+20|0;e=c[r>>2]|0;do if(e|0){if(!((e&1|0)==0|B|C))break f;if(e&2|0?(x=c[U>>2]|0,!((x|S|0)==0|J&(x|0)==10)):0)break f;do if(e&16|0){if(z)break f;if(R2(q)|0)break f;e=c[U>>2]|0;if((e|0)==95)break;if(!(R2(e)|0))break f}while(0);e=c[r>>2]|0;if(e&32){if(z){e=c[U>>2]|0;if((e|0)==95)break f}else{x=(R2(q)|0)==0;e=c[U>>2]|0;if(x|(e|0)==95)break f}if(R2(e)|0)break f;e=c[r>>2]|0}o=c[U>>2]|0;do if((o|0)!=0&(y&(e&64|0)!=0)){if(z)e=1;else{e=(R2(q)|0)!=0;o=c[U>>2]|0}if((o|0)==95)if(e)break f;else break;else if(e^(R2(o)|0)!=0)break;else break f}while(0);do if(c[r>>2]&128|0){e=c[U>>2]|0;if(A|(e|0)==0)break f;if(z)o=1;else{o=(R2(q)|0)!=0;e=c[U>>2]|0}if((e|0)==95)if(o)break;else break f;else if(o^(R2(e)|0)!=0)break f;else break}while(0);e=c[r>>2]|0;do if(e&4){if(c[T>>2]&2|0)break;if(!(W2(q,c[w+24>>2]|0)|0))break f;e=c[r>>2]|0}while(0);do if(e&4|0){if(!(c[T>>2]&2))break;x=c3(q)|0;e=w+24|0;if(W2(x,c[e>>2]|0)|0)break;x=g3(q)|0;if(!(W2(x,c[e>>2]|0)|0))break f}while(0);if(!(c[r>>2]&8))break;if(Q5(c[w+28>>2]|0,q,c[T>>2]&2)|0)break f}while(0);if(!t){t=c[u>>2]|0;n=c[w+16>>2]|0;break}o=p+28|0;e=c[o>>2]|0;if(!e){e=s5(V,0,0,0,32)|0;if(!e){C=144;break c}c[e+24>>2]=p;c[e+28>>2]=0;x=s5(V,0,0,0,c[R>>2]<<2)|0;c[e+20>>2]=x;if(!x){C=151;break c}c[o>>2]=e;p=e}else p=e;c[p>>2]=s;c[p+4>>2]=D;c[p+8>>2]=c[u>>2];c[p+12>>2]=c[w+12>>2];c[p+16>>2]=c[U>>2];if((c[R>>2]|0)>0){o=c[p+20>>2]|0;e=0;do{c[o+(e<<2)>>2]=c[j+(e<<2)>>2];e=e+1|0}while((e|0)<(c[R>>2]|0))}e=c[w+16>>2]|0;if(!e)break;o=c[e>>2]|0;if((o|0)<=-1)break;r=c[p+20>>2]|0;do{c[r+(o<<2)>>2]=s;e=e+4|0;o=c[e>>2]|0}while((o|0)>-1)}while(0);u=w+40|0;if(!(c[u>>2]|0))break;else w=w+32|0}if(!t){e=E;C=170;continue}if(n){e=c[n>>2]|0;if((e|0)>-1){do{n=n+4|0;c[j+(e<<2)>>2]=s;e=c[n>>2]|0}while((e|0)>-1);q=v;o=D;e=E}else{q=v;o=D;e=E}}else{q=v;o=D;e=E;n=0}}else if((C|0)==170){C=0;r=c[p+24>>2]|0;if(!r)break;t=c[p+8>>2]|0;if(c[t+20>>2]&256|0)c[k+(c[p+12>>2]<<2)>>2]=0;s=c[p>>2]|0;u=c[p+4>>2]|0;c[U>>2]=c[p+16>>2];q=c[R>>2]|0;if((q|0)>0){p=c[p+20>>2]|0;o=0;do{c[j+(o<<2)>>2]=c[p+(o<<2)>>2];o=o+1|0}while((o|0)<(q|0));p=r;q=v;o=u}else{p=r;q=v;o=u}}r=o;v=q;w=t;x=n;C=79}n=(v|0)>-1;if(n|(c[U>>2]|0)==0){C=179;break}c[U>>2]=H;s=F;r=G;n=c[R>>2]|0;B=H}if((C|0)==53){g5(V);if(j|0)l6(i);if(m|0)l6(h);if(!k){e=12;break a}l6(g);e=12;break a}else if((C|0)==60){g5(V);if(j|0)l6(i);if(m|0)l6(h);if(!k){e=12;break a}l6(g);e=12;break a}else if((C|0)==144){g5(V);if(j|0)l6(i);if(m|0)l6(h);if(!k){e=12;break a}l6(g);e=12;break a}else if((C|0)==151){g5(V);if(j|0)l6(i);if(m|0)l6(h);if(!k){e=12;break a}l6(g);e=12;break a}else if((C|0)==179){c[f>>2]=v;e=(n^1)&1;break}}while(0);g5(V);if(j|0)l6(i);if(m|0)l6(h);if(k)l6(g)}else e=12;while(0);l=W;return e|0}function O5(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0;X=l;l=l+16|0;U=X;c[U>>2]=0;k=e&1;Q=e&2;R=a+56|0;j=c[R>>2]&4;if(!d)O=0;else O=c[a+40>>2]|0;P=O<<2;i=c[a+52>>2]|0;h=i<<3;g=h+8|0;e=P+12+h+(g+(S(P,i)|0)<<1)|0;V=k6(e)|0;if(!V)e=12;else{u6(V|0,0,e|0)|0;e=V+P|0;m=e&3;m=e+((m|0)==0?0:4-m|0)|0;e=m+g|0;n=e&3;n=e+((n|0)==0?0:4-n|0)|0;e=n+g|0;N=e&3;N=e+((N|0)==0?0:4-N|0)|0;e=N+h|0;g=e&3;h=(i|0)>0;if(h){e=e+((g|0)==0?0:4-g|0)|0;g=0;while(1){c[n+(g<<3)+4>>2]=e;e=e+P|0;c[m+(g<<3)+4>>2]=e;g=g+1|0;if((g|0)>=(i|0))break;else e=e+P|0}if(h){e=0;do{c[N+(e<<3)>>2]=-1;e=e+1|0}while((e|0)<(i|0))}}e=c4(U,b,4)|0;if((e|0)<1)if((e|0)<0)e=1;else{i=1;W=11}else{i=e;W=11}a:do if((W|0)==11){M=a+8|0;H=(j|0)!=0;I=(O|0)>0;J=a+12|0;K=a+44|0;L=a+32|0;E=a+36|0;F=(O|0)==0;G=(k|0)==0;D=(O|0)<1;C=(k|0)==0;h=0;v=b+i|0;u=0;j=0;e=-1;g=m;A=V;x=m;w=n;while(1){if((e|0)<0){k=c[M>>2]|0;a=k+8|0;b:do if(c[a>>2]|0){p=(u|0)!=0;q=(h|0)==95;r=(u|0)==0;t=H&(h|0)==10;s=(u|0)<1&G;while(1){c:while(1){o=k+12|0;if((c[N+(c[o>>2]<<3)>>2]|0)>=(u|0))break;n=k+20|0;b=c[n>>2]|0;if(!b){W=46;break}d:do if((b&1|0)==0|s|t){if(b&2|0?(B=c[U>>2]|0,!((B|Q|0)==0|H&(B|0)==10)):0)break;do if(b&16|0){if(q)break d;if(R2(h)|0)break d;b=c[U>>2]|0;if((b|0)==95)break;if(!(R2(b)|0))break d}while(0);b=c[n>>2]|0;if(b&32){if(q){b=c[U>>2]|0;if((b|0)==95)break}else{B=(R2(h)|0)==0;b=c[U>>2]|0;if(B|(b|0)==95)break}if(R2(b)|0)break;b=c[n>>2]|0}m=c[U>>2]|0;do if((m|0)!=0&(p&(b&64|0)!=0)){if(q)b=1;else{b=(R2(h)|0)!=0;m=c[U>>2]|0}if((m|0)==95)if(b)break d;else break;else if(b^(R2(m)|0)!=0)break;else break d}while(0);if(!(c[n>>2]&128)){W=46;break c}b=c[U>>2]|0;if(r|(b|0)==0)break;if(q)m=1;else{m=(R2(h)|0)!=0;b=c[U>>2]|0}if((b|0)==95)if(m){W=46;break c}else break;else if(m^(R2(b)|0)!=0)break;else{W=46;break c}}while(0);a=k+40|0;if(!(c[a>>2]|0))break b;else k=k+32|0}if((W|0)==46){W=0;c[g>>2]=c[a>>2];if(I)u6(c[g+4>>2]|0,-1,P|0)|0;a=c[k+16>>2]|0;if(a|0?(T=c[a>>2]|0,(T|0)>-1):0){m=g+4|0;b=T;do{if((b|0)<(O|0))c[(c[m>>2]|0)+(b<<2)>>2]=u;a=a+4|0;b=c[a>>2]|0}while((b|0)>-1)}a=(c[g>>2]|0)!=(c[J>>2]|0);if(a|D){j=a?j:1;e=a?e:u;a=g+4|0}else{a=g+4|0;j=c[a>>2]|0;e=0;do{c[d+(e<<2)>>2]=c[j+(e<<2)>>2];e=e+1|0}while((e|0)!=(O|0));j=1;e=u}B=c[o>>2]|0;c[N+(B<<3)>>2]=u;c[N+(B<<3)+4>>2]=a;g=g+8|0}a=k+40|0;if(!(c[a>>2]|0))break;else k=k+32|0}}while(0);c[g>>2]=0;g=c[U>>2]|0;if(!g)break;else h=g}else{if(F)break;h=c[U>>2]|0;if(!((g|0)!=(x|0)&(h|0)!=0))break}B=u+i|0;g=c4(U,v,4)|0;if((g|0)<1)if((g|0)<0){e=1;break a}else i=1;else i=g;z=v+i|0;if((j|0)!=0&(c[K>>2]|0)!=0){if(!(c[x>>2]|0))g=w;else{o=c[E>>2]|0;p=c[o>>2]|0;q=(p|0)>-1;n=x;g=w;do{m=n+4|0;e:do if(q){a=0;b=p;do{k=c[o+((a|1)<<2)>>2]|0;if((b|0)>=(O|0))break e;j=c[m>>2]|0;if((c[j+(k<<2)>>2]|0)==(c[d+(k<<2)>>2]|0)?(c[j+(b<<2)>>2]|0)<(c[d+(b<<2)>>2]|0):0)break e;a=a+2|0;b=c[o+(a<<2)>>2]|0}while((b|0)>-1);a=m;W=75}else{a=m;j=c[m>>2]|0;W=75}while(0);if((W|0)==75){W=0;c[g>>2]=c[n>>2];v=g+4|0;y=c[v>>2]|0;c[v>>2]=j;c[a>>2]=y;g=g+8|0}n=n+8|0}while((c[n>>2]|0)!=0)}c[g>>2]=0;y=x;j=0}else{y=w;w=x}a=c[w>>2]|0;if(!a){a=A;g=y}else{r=(B|0)!=0;s=(h|0)==95;t=(B|0)==0;v=H&(h|0)==10;u=(B|0)<1&C;q=w;k=A;g=y;while(1){b=a+8|0;if(c[b>>2]|0){p=q+4|0;o=k;n=b;while(1){f:do if((c[a>>2]|0)>>>0<=h>>>0?(c[a+4>>2]|0)>>>0>=h>>>0:0){m=a+20|0;k=c[m>>2]|0;do if(k|0){if(!((k&1|0)==0|u|v)){k=o;break f}if(k&2|0?(A=c[U>>2]|0,!((A|Q|0)==0|H&(A|0)==10)):0){k=o;break f}do if(k&16|0){if(s){k=o;break f}if(R2(h)|0){k=o;break f}k=c[U>>2]|0;if((k|0)==95)break;if(!(R2(k)|0)){k=o;break f}}while(0);k=c[m>>2]|0;if(k&32){if(s){k=c[U>>2]|0;if((k|0)==95){k=o;break f}}else{A=(R2(h)|0)==0;k=c[U>>2]|0;if(A|(k|0)==95){k=o;break f}}if(R2(k)|0){k=o;break f}k=c[m>>2]|0}b=c[U>>2]|0;do if((b|0)!=0&(r&(k&64|0)!=0)){if(s)k=1;else{k=(R2(h)|0)!=0;b=c[U>>2]|0}if((b|0)==95)if(k){k=o;break f}else break;else if(k^(R2(b)|0)!=0)break;else{k=o;break f}}while(0);do if(c[m>>2]&128|0){k=c[U>>2]|0;if(t|(k|0)==0){k=o;break f}if(s)b=1;else{b=(R2(h)|0)!=0;k=c[U>>2]|0}if((k|0)==95)if(b)break;else{k=o;break f}else if(b^(R2(k)|0)!=0){k=o;break f}else break}while(0);k=c[m>>2]|0;do if(k&4){if(c[R>>2]&2|0)break;if(!(W2(h,c[a+24>>2]|0)|0)){k=o;break f}k=c[m>>2]|0}while(0);do if(k&4|0){if(!(c[R>>2]&2))break;A=c3(h)|0;k=a+24|0;if(W2(A,c[k>>2]|0)|0)break;A=g3(h)|0;if(!(W2(A,c[k>>2]|0)|0)){k=o;break f}}while(0);if(!(c[m>>2]&8))break;if(Q5(c[a+28>>2]|0,h,c[R>>2]&2)|0){k=o;break f}}while(0);if(I){b=c[p>>2]|0;k=0;do{c[o+(k<<2)>>2]=c[b+(k<<2)>>2];k=k+1|0}while((k|0)!=(O|0))}k=c[a+16>>2]|0;do if(k|0){b=c[k>>2]|0;if((b|0)<=-1)break;do{if((b|0)<(O|0))c[o+(b<<2)>>2]=B;k=k+4|0;b=c[k>>2]|0}while((b|0)>-1)}while(0);k=c[a+12>>2]|0;b=N+(k<<3)|0;if((c[b>>2]|0)>=(B|0)){k=c[N+(k<<3)+4>>2]|0;b=c[k>>2]|0;if(!(R5(O,c[L>>2]|0,o,b)|0)){k=o;break}c[k>>2]=o;if((c[n>>2]|0)!=(c[J>>2]|0)){k=b;break}if(I)e=0;else{j=1;k=b;e=B;break}while(1){c[d+(e<<2)>>2]=c[o+(e<<2)>>2];e=e+1|0;if((e|0)==(O|0)){j=1;k=b;e=B;break f}}}A=c[n>>2]|0;c[g>>2]=A;x=g+4|0;m=c[x>>2]|0;c[x>>2]=o;c[b>>2]=B;c[N+(k<<3)+4>>2]=x;do if((A|0)==(c[J>>2]|0)){if((e|0)==-1)if(I)e=0;else{e=B;j=1;break}else{if(!I)break;if((c[o>>2]|0)>(c[d>>2]|0))break;else e=0}do{c[d+(e<<2)>>2]=c[o+(e<<2)>>2];e=e+1|0}while((e|0)<(O|0));e=B;j=1}while(0);k=m;g=g+8|0}else k=o;while(0);n=a+40|0;if(!(c[n>>2]|0))break;else{a=a+32|0;o=k}}}q=q+8|0;a=c[q>>2]|0;if(!a){a=k;break}}}c[g>>2]=0;v=z;u=B;A=a;x=y}c[f>>2]=e;e=e>>>31}while(0);l6(V)}l=X;return e|0}function P5(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;if((d&8|0)==0&(g|0)>-1?(m=c[e+16>>2]|0,n=c[e+28>>2]|0,l=(a|0)!=0&(n|0)!=0,l):0){k=c[e+48>>2]|0;j=0;do{d=c[m+(j*12|0)>>2]|0;if((d|0)==(k|0))i=g;else i=c[f+(d<<2)>>2]|0;h=b+(j<<3)|0;c[h>>2]=i;d=c[m+(j*12|0)+4>>2]|0;if((d|0)==(k|0))d=g;else d=c[f+(d<<2)>>2]|0;e=b+(j<<3)+4|0;c[e>>2]=d;if((d|0)==-1|(i|0)==-1){c[e>>2]=-1;c[h>>2]=-1}j=j+1|0}while(j>>>0>>0&j>>>0>>0);if(l){d=0;do{i=b+(d<<3)+4|0;j=c[m+(d*12|0)+8>>2]|0;if(j|0?(o=c[j>>2]|0,(o|0)>-1):0){k=b+(d<<3)|0;h=0;f=o;e=c[k>>2]|0;do{if(!((e|0)>=(c[b+(f<<3)>>2]|0)?(c[i>>2]|0)<=(c[b+(f<<3)+4>>2]|0):0)){c[i>>2]=-1;c[k>>2]=-1;e=-1}h=h+1|0;f=c[j+(h<<2)>>2]|0}while((f|0)>-1)}d=d+1|0}while(d>>>0>>0&d>>>0>>0)}else d=0}else d=0;if(d>>>0>>0)u6(b+(d<<3)|0,-1,a-d<<3|0)|0;return}function Q5(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=c[a>>2]|0;a:do if(!e)d=0;else{f=(d|0)==0;d=e;while(1){if(f){if(W2(b,d)|0){d=1;break a}}else{e=g3(b)|0;if(W2(e,c[a>>2]|0)|0){d=1;break a}e=c3(b)|0;if(W2(e,c[a>>2]|0)|0){d=1;break a}}a=a+4|0;d=c[a>>2]|0;if(!d){d=0;break}}}while(0);return d|0}function R5(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;a:do if((a|0)>0){f=0;while(1){h=c[d+(f<<2)>>2]|0;g=c[e+(f<<2)>>2]|0;if(!(c[b+(f<<2)>>2]|0)){if((h|0)<(g|0)){f=1;break a}if((h|0)>(g|0)){f=0;break a}}else{if((h|0)>(g|0)){f=1;break a}if((h|0)<(g|0)){f=0;break a}}f=f+1|0;if((f|0)>=(a|0)){f=0;break}}}else f=0;while(0);return f|0}function S5(a){a=a|0;var b=0,e=0,f=0;if((c[a+76>>2]|0)>=0?(n2(a)|0)!=0:0){b=a+4|0;e=c[b>>2]|0;if(e>>>0<(c[a+8>>2]|0)>>>0){c[b>>2]=e+1;b=d[e>>0]|0}else b=Y1(a)|0}else f=3;do if((f|0)==3){b=a+4|0;e=c[b>>2]|0;if(e>>>0<(c[a+8>>2]|0)>>>0){c[b>>2]=e+1;b=d[e>>0]|0;break}else{b=Y1(a)|0;break}}while(0);return b|0}function T5(a){a=a|0;var b=0;if((c[a+76>>2]|0)>-1){b=(n2(a)|0)==0;a=U5(a)|0}else a=U5(a)|0;return a|0}function U5(a){a=a|0;var b=0;if(!(c[a>>2]&128))b=1;else b=(c[a+20>>2]|0)>>>0>(c[a+28>>2]|0)>>>0?2:1;b=eb[c[a+40>>2]&63](a,0,b)|0;if((b|0)>=0)b=b-(c[a+8>>2]|0)+(c[a+4>>2]|0)+(c[a+20>>2]|0)-(c[a+28>>2]|0)|0;return b|0}function V5(a){a=a|0;(c[a+76>>2]|0)>-1?n2(a)|0:0;return c[a+60>>2]|0}function W5(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;j=b&255;e=b&255;if((c[d+76>>2]|0)>=0?(n2(d)|0)!=0:0){if((e|0)!=(a[d+75>>0]|0)?(h=d+20|0,i=c[h>>2]|0,i>>>0<(c[d+16>>2]|0)>>>0):0){c[h>>2]=i+1;a[i>>0]=j}else e=b4(d,b)|0;o2(d)}else k=3;do if((k|0)==3){if((e|0)!=(a[d+75>>0]|0)?(f=d+20|0,g=c[f>>2]|0,g>>>0<(c[d+16>>2]|0)>>>0):0){c[f>>2]=g+1;a[g>>0]=j;break}e=b4(d,b)|0}while(0);return e|0}function X5(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;k=S(e,d)|0;e=(d|0)==0?0:e;if((c[f+76>>2]|0)>-1)j=n2(f)|0;else j=0;g=f+74|0;h=a[g>>0]|0;a[g>>0]=h+255|h;g=f+4|0;h=c[g>>2]|0;m=(c[f+8>>2]|0)-h|0;i=m>>>0>>0?m:k;if((m|0)>0){B6(b|0,h|0,i|0)|0;c[g>>2]=h+i;g=k-i|0;b=b+i|0}else g=k;a:do if(!g)l=13;else{i=f+32|0;while(1){if(Z1(f)|0)break;h=eb[c[i>>2]&63](f,b,g)|0;if((h+1|0)>>>0<2)break;g=g-h|0;if(!g){l=13;break a}else b=b+h|0}if(j|0)o2(f);e=((k-g|0)>>>0)/(d>>>0)|0}while(0);if((l|0)==13)if(j)o2(f);return e|0}function Y5(a){a=a|0;return T5(a)|0}function Z5(b){b=b|0;var d=0,e=0,f=0,g=0;f=c[15840]|0;if((c[f+76>>2]|0)>-1)g=n2(f)|0;else g=0;do if((Z3(b,f)|0)<0)b=1;else{if((a[f+75>>0]|0)!=10?(d=f+20|0,e=c[d>>2]|0,e>>>0<(c[f+16>>2]|0)>>>0):0){c[d>>2]=e+1;a[e>>0]=10;b=0;break}b=(b4(f,10)|0)<0}while(0);if(g|0)o2(f);return b<<31>>31|0}function _5(b){b=b|0;var d=0,e=0,f=0;f=l;l=l+16|0;e=f;Xa(0,e|0)|0;d=0;e=(c[e+4>>2]|0)*65537^(e>>>4)+b;while(1){a[b+d>>0]=(e&15)+65|e<<1&32;d=d+1|0;if((d|0)==6)break;else e=e>>>5}l=f;return b|0}function $5(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+48|0;i=k+24|0;h=k+16|0;g=k;d=k+28|0;b=d;e=153835;f=b+20|0;do{a[b>>0]=a[e>>0]|0;b=b+1|0;e=e+1|0}while((b|0)<(f|0));e=d+13|0;b=0;while(1){_5(e)|0;c[g>>2]=d;c[g+4>>2]=32962;c[g+8>>2]=384;f=K1(Wa(5,g|0)|0)|0;b=b+1|0;if((f|0)>-1){j=4;break}if((b|0)>=100){b=0;break}}if((j|0)==4){c[h>>2]=d;Ta(10,h|0)|0;b=h4(f,153855)|0;if(!b){c[i>>2]=f;xa(6,i|0)|0;b=0}}l=k;return b|0}function a6(a){a=a|0;return +(+b6(a,0))}function b6(a,b){a=a|0;b=b|0;return +(+c6(a,b,1))}function c6(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0,g=0,h=0,i=0;i=l;l=l+128|0;h=i;f=h;g=f+124|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));f=h+4|0;c[f>>2]=a;g=h+8|0;c[g>>2]=-1;c[h+44>>2]=a;c[h+76>>2]=-1;U1(h,0);e=+s3(h,d,1);d=(c[f>>2]|0)-(c[g>>2]|0)+(c[h+108>>2]|0)|0;if(b|0)c[b>>2]=d|0?a+d|0:a;l=i;return +e}function d6(b){b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;while(1){e=a[b>>0]|0;c=e<<24>>24;f=b+1|0;if(!(X1(c)|0))break;else b=f}switch(c|0){case 45:{b=1;g=5;break}case 43:{b=0;g=5;break}default:{h=0;d=b;b=e}}if((g|0)==5){h=b;d=f;b=a[f>>0]|0}c=(b<<24>>24)+-48|0;if(c>>>0<10){b=0;do{d=d+1|0;b=(b*10|0)-c|0;c=(a[d>>0]|0)+-48|0}while(c>>>0<10)}else b=0;return (h|0?b:0-b|0)|0}function e6(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;a:do if(!c)b=0;else{h=b;while(1){g=c>>>1;b=h+(S(g,d)|0)|0;f=vb[e&127](a,b)|0;if(!f)break a;if((c|0)==1){b=0;break a}f=(f|0)<0;c=f?g:c-g|0;if(!c){b=0;break}else h=f?h:b}}while(0);return b|0}function f6(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=l;l=l+32|0;f=h;e=a[d>>0]|0;a:do if(e<<24>>24!=0?(a[d+1>>0]|0)!=0:0){c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[f+20>>2]=0;c[f+24>>2]=0;c[f+28>>2]=0;do{i=f+(((e&255)>>>5&255)<<2)|0;c[i>>2]=c[i>>2]|1<<(e&31);d=d+1|0;e=a[d>>0]|0}while(e<<24>>24!=0);e=a[b>>0]|0;if(!(e<<24>>24))d=b;else{d=b;do{if(c[f+(((e&255)>>>5&255)<<2)>>2]&1<<(e&31)|0)break a;d=d+1|0;e=a[d>>0]|0}while(e<<24>>24!=0)}}else g=3;while(0);if((g|0)==3)d=G3(b,e<<24>>24)|0;l=h;return d-b|0}function g6(a,b){a=a|0;b=b|0;O3(a+(D3(a)|0)|0,b)|0;return a|0}function h6(b,c){b=b|0;c=c|0;c=b+(f6(b,c)|0)|0;return (a[c>>0]|0?c:0)|0}function i6(b,d){b=b|0;d=d|0;var e=0;if(!b){b=c[47615]|0;if(!b)b=0;else e=3}else e=3;do if((e|0)==3){b=b+(P4(b,d)|0)|0;if(!(a[b>>0]|0)){c[47615]=0;b=0;break}d=b+(f6(b,d)|0)|0;c[47615]=d;if(!(a[d>>0]|0)){c[47615]=0;break}else{c[47615]=d+1;a[d>>0]=0;break}}while(0);return b|0}function j6(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;if(!b){b=c[e>>2]|0;if(!b)b=0;else f=3}else f=3;do if((f|0)==3){b=b+(P4(b,d)|0)|0;if(!(a[b>>0]|0)){c[e>>2]=0;b=0;break}d=b+(f6(b,d)|0)|0;c[e>>2]=d;if(!(a[d>>0]|0)){c[e>>2]=0;break}else{c[e>>2]=d+1;a[d>>0]=0;break}}while(0);return b|0}function k6(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;K=l;l=l+16|0;o=K;do if(a>>>0<245){p=a>>>0<11?16:a+11&-8;a=p>>>3;t=c[47616]|0;d=t>>>a;if(d&3|0){a=(d&1^1)+a|0;d=190504+(a<<1<<2)|0;e=d+8|0;f=c[e>>2]|0;g=f+8|0;h=c[g>>2]|0;do if((d|0)!=(h|0)){if(h>>>0<(c[47620]|0)>>>0)Va();b=h+12|0;if((c[b>>2]|0)==(f|0)){c[b>>2]=d;c[e>>2]=h;break}else Va()}else c[47616]=t&~(1<>2]=J|3;J=f+J+4|0;c[J>>2]=c[J>>2]|1;J=g;l=K;return J|0}s=c[47618]|0;if(p>>>0>s>>>0){if(d|0){i=2<>>12&16;a=a>>>i;e=a>>>5&8;a=a>>>e;g=a>>>2&4;a=a>>>g;d=a>>>1&2;a=a>>>d;b=a>>>1&1;b=(e|i|g|d|b)+(a>>>b)|0;a=190504+(b<<1<<2)|0;d=a+8|0;g=c[d>>2]|0;i=g+8|0;e=c[i>>2]|0;do if((a|0)!=(e|0)){if(e>>>0<(c[47620]|0)>>>0)Va();f=e+12|0;if((c[f>>2]|0)==(g|0)){c[f>>2]=a;c[d>>2]=e;j=t;break}else Va()}else{j=t&~(1<>2]=p|3;e=g+p|0;c[e+4>>2]=h|1;c[e+h>>2]=h;if(s|0){f=c[47621]|0;b=s>>>3;d=190504+(b<<1<<2)|0;b=1<>2]|0;if(a>>>0<(c[47620]|0)>>>0)Va();else{k=a;m=b}}else{c[47616]=j|b;k=d;m=d+8|0}c[m>>2]=f;c[k+12>>2]=f;c[f+8>>2]=k;c[f+12>>2]=d}c[47618]=h;c[47621]=e;J=i;l=K;return J|0}k=c[47617]|0;if(k){a=(k&0-k)+-1|0;I=a>>>12&16;a=a>>>I;H=a>>>5&8;a=a>>>H;J=a>>>2&4;a=a>>>J;d=a>>>1&2;a=a>>>d;b=a>>>1&1;b=c[190768+((H|I|J|d|b)+(a>>>b)<<2)>>2]|0;a=(c[b+4>>2]&-8)-p|0;d=c[b+16+(((c[b+16>>2]|0)==0&1)<<2)>>2]|0;if(!d){j=b;h=a}else{do{I=(c[d+4>>2]&-8)-p|0;J=I>>>0>>0;a=J?I:a;b=J?d:b;d=c[d+16+(((c[d+16>>2]|0)==0&1)<<2)>>2]|0}while((d|0)!=0);j=b;h=a}f=c[47620]|0;if(j>>>0>>0)Va();i=j+p|0;if(j>>>0>=i>>>0)Va();g=c[j+24>>2]|0;d=c[j+12>>2]|0;do if((d|0)==(j|0)){a=j+20|0;b=c[a>>2]|0;if(!b){a=j+16|0;b=c[a>>2]|0;if(!b){n=0;break}}while(1){d=b+20|0;e=c[d>>2]|0;if(e|0){b=e;a=d;continue}d=b+16|0;e=c[d>>2]|0;if(!e)break;else{b=e;a=d}}if(a>>>0>>0)Va();else{c[a>>2]=0;n=b;break}}else{e=c[j+8>>2]|0;if(e>>>0>>0)Va();b=e+12|0;if((c[b>>2]|0)!=(j|0))Va();a=d+8|0;if((c[a>>2]|0)==(j|0)){c[b>>2]=d;c[a>>2]=e;n=d;break}else Va()}while(0);a:do if(g|0){b=c[j+28>>2]|0;a=190768+(b<<2)|0;do if((j|0)==(c[a>>2]|0)){c[a>>2]=n;if(!n){c[47617]=k&~(1<>>0>=(c[47620]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(j|0)&1)<<2)>>2]=n;if(!n)break a;else break}else Va();while(0);a=c[47620]|0;if(n>>>0>>0)Va();c[n+24>>2]=g;b=c[j+16>>2]|0;do if(b|0)if(b>>>0>>0)Va();else{c[n+16>>2]=b;c[b+24>>2]=n;break}while(0);b=c[j+20>>2]|0;if(b|0)if(b>>>0<(c[47620]|0)>>>0)Va();else{c[n+20>>2]=b;c[b+24>>2]=n;break}}while(0);if(h>>>0<16){J=h+p|0;c[j+4>>2]=J|3;J=j+J+4|0;c[J>>2]=c[J>>2]|1}else{c[j+4>>2]=p|3;c[i+4>>2]=h|1;c[i+h>>2]=h;if(s|0){e=c[47621]|0;b=s>>>3;d=190504+(b<<1<<2)|0;b=1<>2]|0;if(a>>>0<(c[47620]|0)>>>0)Va();else{q=a;r=b}}else{c[47616]=t|b;q=d;r=d+8|0}c[r>>2]=e;c[q+12>>2]=e;c[e+8>>2]=q;c[e+12>>2]=d}c[47618]=h;c[47621]=i}J=j+8|0;l=K;return J|0}}}else if(a>>>0<=4294967231){a=a+11|0;p=a&-8;k=c[47617]|0;if(k){e=0-p|0;a=a>>>8;if(a)if(p>>>0>16777215)i=31;else{r=(a+1048320|0)>>>16&8;C=a<>>16&4;C=C<>>16&2;i=14-(q|r|i)+(C<>>15)|0;i=p>>>(i+7|0)&1|i<<1}else i=0;d=c[190768+(i<<2)>>2]|0;b:do if(!d){d=0;a=0;C=81}else{a=0;h=p<<((i|0)==31?0:25-(i>>>1)|0);g=0;while(1){f=(c[d+4>>2]&-8)-p|0;if(f>>>0>>0)if(!f){a=d;e=0;f=d;C=85;break b}else{a=d;e=f}f=c[d+20>>2]|0;d=c[d+16+(h>>>31<<2)>>2]|0;g=(f|0)==0|(f|0)==(d|0)?g:f;f=(d|0)==0;if(f){d=g;C=81;break}else h=h<<((f^1)&1)}}while(0);if((C|0)==81){if((d|0)==0&(a|0)==0){a=2<>>12&16;r=r>>>m;j=r>>>5&8;r=r>>>j;n=r>>>2&4;r=r>>>n;q=r>>>1&2;r=r>>>q;d=r>>>1&1;a=0;d=c[190768+((j|m|n|q|d)+(r>>>d)<<2)>>2]|0}if(!d){j=a;i=e}else{f=d;C=85}}if((C|0)==85)while(1){C=0;d=(c[f+4>>2]&-8)-p|0;r=d>>>0>>0;d=r?d:e;a=r?f:a;f=c[f+16+(((c[f+16>>2]|0)==0&1)<<2)>>2]|0;if(!f){j=a;i=d;break}else{e=d;C=85}}if((j|0)!=0?i>>>0<((c[47618]|0)-p|0)>>>0:0){f=c[47620]|0;if(j>>>0>>0)Va();h=j+p|0;if(j>>>0>=h>>>0)Va();g=c[j+24>>2]|0;d=c[j+12>>2]|0;do if((d|0)==(j|0)){a=j+20|0;b=c[a>>2]|0;if(!b){a=j+16|0;b=c[a>>2]|0;if(!b){s=0;break}}while(1){d=b+20|0;e=c[d>>2]|0;if(e|0){b=e;a=d;continue}d=b+16|0;e=c[d>>2]|0;if(!e)break;else{b=e;a=d}}if(a>>>0>>0)Va();else{c[a>>2]=0;s=b;break}}else{e=c[j+8>>2]|0;if(e>>>0>>0)Va();b=e+12|0;if((c[b>>2]|0)!=(j|0))Va();a=d+8|0;if((c[a>>2]|0)==(j|0)){c[b>>2]=d;c[a>>2]=e;s=d;break}else Va()}while(0);c:do if(g){b=c[j+28>>2]|0;a=190768+(b<<2)|0;do if((j|0)==(c[a>>2]|0)){c[a>>2]=s;if(!s){t=k&~(1<>>0>=(c[47620]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(j|0)&1)<<2)>>2]=s;if(!s){t=k;break c}else break}else Va();while(0);a=c[47620]|0;if(s>>>0>>0)Va();c[s+24>>2]=g;b=c[j+16>>2]|0;do if(b|0)if(b>>>0>>0)Va();else{c[s+16>>2]=b;c[b+24>>2]=s;break}while(0);b=c[j+20>>2]|0;if(b)if(b>>>0<(c[47620]|0)>>>0)Va();else{c[s+20>>2]=b;c[b+24>>2]=s;t=k;break}else t=k}else t=k;while(0);do if(i>>>0>=16){c[j+4>>2]=p|3;c[h+4>>2]=i|1;c[h+i>>2]=i;b=i>>>3;if(i>>>0<256){d=190504+(b<<1<<2)|0;a=c[47616]|0;b=1<>2]|0;if(a>>>0<(c[47620]|0)>>>0)Va();else{x=a;y=b}}else{c[47616]=a|b;x=d;y=d+8|0}c[y>>2]=h;c[x+12>>2]=h;c[h+8>>2]=x;c[h+12>>2]=d;break}b=i>>>8;if(b)if(i>>>0>16777215)b=31;else{I=(b+1048320|0)>>>16&8;J=b<>>16&4;J=J<>>16&2;b=14-(H|I|b)+(J<>>15)|0;b=i>>>(b+7|0)&1|b<<1}else b=0;d=190768+(b<<2)|0;c[h+28>>2]=b;a=h+16|0;c[a+4>>2]=0;c[a>>2]=0;a=1<>2]=h;c[h+24>>2]=d;c[h+12>>2]=h;c[h+8>>2]=h;break}a=i<<((b|0)==31?0:25-(b>>>1)|0);e=c[d>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(i|0)){C=139;break}d=e+16+(a>>>31<<2)|0;b=c[d>>2]|0;if(!b){C=136;break}else{a=a<<1;e=b}}if((C|0)==136)if(d>>>0<(c[47620]|0)>>>0)Va();else{c[d>>2]=h;c[h+24>>2]=e;c[h+12>>2]=h;c[h+8>>2]=h;break}else if((C|0)==139){b=e+8|0;a=c[b>>2]|0;J=c[47620]|0;if(a>>>0>=J>>>0&e>>>0>=J>>>0){c[a+12>>2]=h;c[b>>2]=h;c[h+8>>2]=a;c[h+12>>2]=e;c[h+24>>2]=0;break}else Va()}}else{J=i+p|0;c[j+4>>2]=J|3;J=j+J+4|0;c[J>>2]=c[J>>2]|1}while(0);J=j+8|0;l=K;return J|0}}}else p=-1;while(0);d=c[47618]|0;if(d>>>0>=p>>>0){b=d-p|0;a=c[47621]|0;if(b>>>0>15){J=a+p|0;c[47621]=J;c[47618]=b;c[J+4>>2]=b|1;c[J+b>>2]=b;c[a+4>>2]=p|3}else{c[47618]=0;c[47621]=0;c[a+4>>2]=d|3;J=a+d+4|0;c[J>>2]=c[J>>2]|1}J=a+8|0;l=K;return J|0}h=c[47619]|0;if(h>>>0>p>>>0){H=h-p|0;c[47619]=H;J=c[47622]|0;I=J+p|0;c[47622]=I;c[I+4>>2]=H|1;c[J+4>>2]=p|3;J=J+8|0;l=K;return J|0}if(!(c[47734]|0)){c[47736]=4096;c[47735]=4096;c[47737]=-1;c[47738]=-1;c[47739]=0;c[47727]=0;a=o&-16^1431655768;c[o>>2]=a;c[47734]=a;a=4096}else a=c[47736]|0;i=p+48|0;j=p+47|0;g=a+j|0;f=0-a|0;k=g&f;if(k>>>0<=p>>>0){J=0;l=K;return J|0}a=c[47726]|0;if(a|0?(x=c[47724]|0,y=x+k|0,y>>>0<=x>>>0|y>>>0>a>>>0):0){J=0;l=K;return J|0}d:do if(!(c[47727]&4)){d=c[47622]|0;e:do if(d){e=190912;while(1){a=c[e>>2]|0;if(a>>>0<=d>>>0?(w=e+4|0,(a+(c[w>>2]|0)|0)>>>0>d>>>0):0)break;a=c[e+8>>2]|0;if(!a){C=163;break e}else e=a}b=g-h&f;if(b>>>0<2147483647){a=H6(b|0)|0;if((a|0)==((c[e>>2]|0)+(c[w>>2]|0)|0)){if((a|0)!=(-1|0)){h=b;g=a;C=180;break d}}else{e=a;C=171}}else b=0}else C=163;while(0);do if((C|0)==163){d=H6(0)|0;if((d|0)!=(-1|0)?(b=d,u=c[47735]|0,v=u+-1|0,b=((v&b|0)==0?0:(v+b&0-u)-b|0)+k|0,u=c[47724]|0,v=b+u|0,b>>>0>p>>>0&b>>>0<2147483647):0){y=c[47726]|0;if(y|0?v>>>0<=u>>>0|v>>>0>y>>>0:0){b=0;break}a=H6(b|0)|0;if((a|0)==(d|0)){h=b;g=d;C=180;break d}else{e=a;C=171}}else b=0}while(0);do if((C|0)==171){d=0-b|0;if(!(i>>>0>b>>>0&(b>>>0<2147483647&(e|0)!=(-1|0))))if((e|0)==(-1|0)){b=0;break}else{h=b;g=e;C=180;break d}a=c[47736]|0;a=j-b+a&0-a;if(a>>>0>=2147483647){h=b;g=e;C=180;break d}if((H6(a|0)|0)==(-1|0)){H6(d|0)|0;b=0;break}else{h=a+b|0;g=e;C=180;break d}}while(0);c[47727]=c[47727]|4;C=178}else{b=0;C=178}while(0);if(((C|0)==178?k>>>0<2147483647:0)?(B=H6(k|0)|0,y=H6(0)|0,z=y-B|0,A=z>>>0>(p+40|0)>>>0,!((B|0)==(-1|0)|A^1|B>>>0>>0&((B|0)!=(-1|0)&(y|0)!=(-1|0))^1)):0){h=A?z:b;g=B;C=180}if((C|0)==180){b=(c[47724]|0)+h|0;c[47724]=b;if(b>>>0>(c[47725]|0)>>>0)c[47725]=b;k=c[47622]|0;do if(k){b=190912;while(1){a=c[b>>2]|0;d=b+4|0;e=c[d>>2]|0;if((g|0)==(a+e|0)){C=190;break}f=c[b+8>>2]|0;if(!f)break;else b=f}if(((C|0)==190?(c[b+12>>2]&8|0)==0:0)?k>>>0>>0&k>>>0>=a>>>0:0){c[d>>2]=e+h;J=k+8|0;J=(J&7|0)==0?0:0-J&7;I=k+J|0;J=(c[47619]|0)+(h-J)|0;c[47622]=I;c[47619]=J;c[I+4>>2]=J|1;c[I+J+4>>2]=40;c[47623]=c[47738];break}b=c[47620]|0;if(g>>>0>>0){c[47620]=g;i=g}else i=b;d=g+h|0;b=190912;while(1){if((c[b>>2]|0)==(d|0)){C=198;break}a=c[b+8>>2]|0;if(!a)break;else b=a}if((C|0)==198?(c[b+12>>2]&8|0)==0:0){c[b>>2]=g;n=b+4|0;c[n>>2]=(c[n>>2]|0)+h;n=g+8|0;n=g+((n&7|0)==0?0:0-n&7)|0;b=d+8|0;b=d+((b&7|0)==0?0:0-b&7)|0;m=n+p|0;j=b-n-p|0;c[n+4>>2]=p|3;do if((b|0)!=(k|0)){if((b|0)==(c[47621]|0)){J=(c[47618]|0)+j|0;c[47618]=J;c[47621]=m;c[m+4>>2]=J|1;c[m+J>>2]=J;break}a=c[b+4>>2]|0;if((a&3|0)==1){h=a&-8;f=a>>>3;f:do if(a>>>0>=256){g=c[b+24>>2]|0;e=c[b+12>>2]|0;do if((e|0)==(b|0)){e=b+16|0;d=e+4|0;a=c[d>>2]|0;if(!a){a=c[e>>2]|0;if(!a){H=0;break}else d=e}while(1){e=a+20|0;f=c[e>>2]|0;if(f|0){a=f;d=e;continue}e=a+16|0;f=c[e>>2]|0;if(!f)break;else{a=f;d=e}}if(d>>>0>>0)Va();else{c[d>>2]=0;H=a;break}}else{f=c[b+8>>2]|0;if(f>>>0>>0)Va();a=f+12|0;if((c[a>>2]|0)!=(b|0))Va();d=e+8|0;if((c[d>>2]|0)==(b|0)){c[a>>2]=e;c[d>>2]=f;H=e;break}else Va()}while(0);if(!g)break;a=c[b+28>>2]|0;d=190768+(a<<2)|0;do if((b|0)!=(c[d>>2]|0))if(g>>>0>=(c[47620]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(b|0)&1)<<2)>>2]=H;if(!H)break f;else break}else Va();else{c[d>>2]=H;if(H|0)break;c[47617]=c[47617]&~(1<>>0>>0)Va();c[H+24>>2]=g;a=b+16|0;d=c[a>>2]|0;do if(d|0)if(d>>>0>>0)Va();else{c[H+16>>2]=d;c[d+24>>2]=H;break}while(0);a=c[a+4>>2]|0;if(!a)break;if(a>>>0<(c[47620]|0)>>>0)Va();else{c[H+20>>2]=a;c[a+24>>2]=H;break}}else{d=c[b+8>>2]|0;e=c[b+12>>2]|0;a=190504+(f<<1<<2)|0;do if((d|0)!=(a|0)){if(d>>>0>>0)Va();if((c[d+12>>2]|0)==(b|0))break;Va()}while(0);if((e|0)==(d|0)){c[47616]=c[47616]&~(1<>>0>>0)Va();a=e+8|0;if((c[a>>2]|0)==(b|0)){E=a;break}Va()}while(0);c[d+12>>2]=e;c[E>>2]=d}while(0);b=b+h|0;f=h+j|0}else f=j;b=b+4|0;c[b>>2]=c[b>>2]&-2;c[m+4>>2]=f|1;c[m+f>>2]=f;b=f>>>3;if(f>>>0<256){d=190504+(b<<1<<2)|0;a=c[47616]|0;b=1<>2]|0;if(a>>>0>=(c[47620]|0)>>>0){I=a;J=b;break}Va()}while(0);c[J>>2]=m;c[I+12>>2]=m;c[m+8>>2]=I;c[m+12>>2]=d;break}b=f>>>8;do if(!b)b=0;else{if(f>>>0>16777215){b=31;break}I=(b+1048320|0)>>>16&8;J=b<>>16&4;J=J<>>16&2;b=14-(H|I|b)+(J<>>15)|0;b=f>>>(b+7|0)&1|b<<1}while(0);e=190768+(b<<2)|0;c[m+28>>2]=b;a=m+16|0;c[a+4>>2]=0;c[a>>2]=0;a=c[47617]|0;d=1<>2]=m;c[m+24>>2]=e;c[m+12>>2]=m;c[m+8>>2]=m;break}a=f<<((b|0)==31?0:25-(b>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(f|0)){C=265;break}d=e+16+(a>>>31<<2)|0;b=c[d>>2]|0;if(!b){C=262;break}else{a=a<<1;e=b}}if((C|0)==262)if(d>>>0<(c[47620]|0)>>>0)Va();else{c[d>>2]=m;c[m+24>>2]=e;c[m+12>>2]=m;c[m+8>>2]=m;break}else if((C|0)==265){b=e+8|0;a=c[b>>2]|0;J=c[47620]|0;if(a>>>0>=J>>>0&e>>>0>=J>>>0){c[a+12>>2]=m;c[b>>2]=m;c[m+8>>2]=a;c[m+12>>2]=e;c[m+24>>2]=0;break}else Va()}}else{J=(c[47619]|0)+j|0;c[47619]=J;c[47622]=m;c[m+4>>2]=J|1}while(0);J=n+8|0;l=K;return J|0}b=190912;while(1){a=c[b>>2]|0;if(a>>>0<=k>>>0?(D=a+(c[b+4>>2]|0)|0,D>>>0>k>>>0):0)break;b=c[b+8>>2]|0}f=D+-47|0;a=f+8|0;a=f+((a&7|0)==0?0:0-a&7)|0;f=k+16|0;a=a>>>0>>0?k:a;b=a+8|0;d=g+8|0;d=(d&7|0)==0?0:0-d&7;J=g+d|0;d=h+-40-d|0;c[47622]=J;c[47619]=d;c[J+4>>2]=d|1;c[J+d+4>>2]=40;c[47623]=c[47738];d=a+4|0;c[d>>2]=27;c[b>>2]=c[47728];c[b+4>>2]=c[47729];c[b+8>>2]=c[47730];c[b+12>>2]=c[47731];c[47728]=g;c[47729]=h;c[47731]=0;c[47730]=b;b=a+24|0;do{J=b;b=b+4|0;c[b>>2]=7}while((J+8|0)>>>0>>0);if((a|0)!=(k|0)){g=a-k|0;c[d>>2]=c[d>>2]&-2;c[k+4>>2]=g|1;c[a>>2]=g;b=g>>>3;if(g>>>0<256){d=190504+(b<<1<<2)|0;a=c[47616]|0;b=1<>2]|0;if(a>>>0<(c[47620]|0)>>>0)Va();else{F=a;G=b}}else{c[47616]=a|b;F=d;G=d+8|0}c[G>>2]=k;c[F+12>>2]=k;c[k+8>>2]=F;c[k+12>>2]=d;break}b=g>>>8;if(b)if(g>>>0>16777215)d=31;else{I=(b+1048320|0)>>>16&8;J=b<>>16&4;J=J<>>16&2;d=14-(H|I|d)+(J<>>15)|0;d=g>>>(d+7|0)&1|d<<1}else d=0;e=190768+(d<<2)|0;c[k+28>>2]=d;c[k+20>>2]=0;c[f>>2]=0;b=c[47617]|0;a=1<>2]=k;c[k+24>>2]=e;c[k+12>>2]=k;c[k+8>>2]=k;break}a=g<<((d|0)==31?0:25-(d>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(g|0)){C=292;break}d=e+16+(a>>>31<<2)|0;b=c[d>>2]|0;if(!b){C=289;break}else{a=a<<1;e=b}}if((C|0)==289)if(d>>>0<(c[47620]|0)>>>0)Va();else{c[d>>2]=k;c[k+24>>2]=e;c[k+12>>2]=k;c[k+8>>2]=k;break}else if((C|0)==292){b=e+8|0;a=c[b>>2]|0;J=c[47620]|0;if(a>>>0>=J>>>0&e>>>0>=J>>>0){c[a+12>>2]=k;c[b>>2]=k;c[k+8>>2]=a;c[k+12>>2]=e;c[k+24>>2]=0;break}else Va()}}}else{J=c[47620]|0;if((J|0)==0|g>>>0>>0)c[47620]=g;c[47728]=g;c[47729]=h;c[47731]=0;c[47625]=c[47734];c[47624]=-1;b=0;do{J=190504+(b<<1<<2)|0;c[J+12>>2]=J;c[J+8>>2]=J;b=b+1|0}while((b|0)!=32);J=g+8|0;J=(J&7|0)==0?0:0-J&7;I=g+J|0;J=h+-40-J|0;c[47622]=I;c[47619]=J;c[I+4>>2]=J|1;c[I+J+4>>2]=40;c[47623]=c[47738]}while(0);b=c[47619]|0;if(b>>>0>p>>>0){H=b-p|0;c[47619]=H;J=c[47622]|0;I=J+p|0;c[47622]=I;c[I+4>>2]=H|1;c[J+4>>2]=p|3;J=J+8|0;l=K;return J|0}}c[(L1()|0)>>2]=12;J=0;l=K;return J|0}function l6(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;if(!a)return;d=a+-8|0;h=c[47620]|0;if(d>>>0>>0)Va();a=c[a+-4>>2]|0;b=a&3;if((b|0)==1)Va();e=a&-8;o=d+e|0;a:do if(!(a&1)){a=c[d>>2]|0;if(!b)return;k=d+(0-a)|0;j=a+e|0;if(k>>>0>>0)Va();if((k|0)==(c[47621]|0)){a=o+4|0;b=c[a>>2]|0;if((b&3|0)!=3){r=k;f=j;m=k;break}c[47618]=j;c[a>>2]=b&-2;c[k+4>>2]=j|1;c[k+j>>2]=j;return}e=a>>>3;if(a>>>0<256){b=c[k+8>>2]|0;d=c[k+12>>2]|0;a=190504+(e<<1<<2)|0;if((b|0)!=(a|0)){if(b>>>0>>0)Va();if((c[b+12>>2]|0)!=(k|0))Va()}if((d|0)==(b|0)){c[47616]=c[47616]&~(1<>>0>>0)Va();a=d+8|0;if((c[a>>2]|0)==(k|0))g=a;else Va()}else g=d+8|0;c[b+12>>2]=d;c[g>>2]=b;r=k;f=j;m=k;break}g=c[k+24>>2]|0;d=c[k+12>>2]|0;do if((d|0)==(k|0)){d=k+16|0;b=d+4|0;a=c[b>>2]|0;if(!a){a=c[d>>2]|0;if(!a){i=0;break}else b=d}while(1){d=a+20|0;e=c[d>>2]|0;if(e|0){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}if(b>>>0>>0)Va();else{c[b>>2]=0;i=a;break}}else{e=c[k+8>>2]|0;if(e>>>0>>0)Va();a=e+12|0;if((c[a>>2]|0)!=(k|0))Va();b=d+8|0;if((c[b>>2]|0)==(k|0)){c[a>>2]=d;c[b>>2]=e;i=d;break}else Va()}while(0);if(g){a=c[k+28>>2]|0;b=190768+(a<<2)|0;do if((k|0)==(c[b>>2]|0)){c[b>>2]=i;if(!i){c[47617]=c[47617]&~(1<>>0>=(c[47620]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(k|0)&1)<<2)>>2]=i;if(!i){r=k;f=j;m=k;break a}else break}else Va();while(0);d=c[47620]|0;if(i>>>0>>0)Va();c[i+24>>2]=g;a=k+16|0;b=c[a>>2]|0;do if(b|0)if(b>>>0>>0)Va();else{c[i+16>>2]=b;c[b+24>>2]=i;break}while(0);a=c[a+4>>2]|0;if(a)if(a>>>0<(c[47620]|0)>>>0)Va();else{c[i+20>>2]=a;c[a+24>>2]=i;r=k;f=j;m=k;break}else{r=k;f=j;m=k}}else{r=k;f=j;m=k}}else{r=d;f=e;m=d}while(0);if(m>>>0>=o>>>0)Va();a=o+4|0;b=c[a>>2]|0;if(!(b&1))Va();if(!(b&2)){a=c[47621]|0;if((o|0)==(c[47622]|0)){q=(c[47619]|0)+f|0;c[47619]=q;c[47622]=r;c[r+4>>2]=q|1;if((r|0)!=(a|0))return;c[47621]=0;c[47618]=0;return}if((o|0)==(a|0)){q=(c[47618]|0)+f|0;c[47618]=q;c[47621]=m;c[r+4>>2]=q|1;c[m+q>>2]=q;return}f=(b&-8)+f|0;e=b>>>3;b:do if(b>>>0>=256){g=c[o+24>>2]|0;a=c[o+12>>2]|0;do if((a|0)==(o|0)){d=o+16|0;b=d+4|0;a=c[b>>2]|0;if(!a){a=c[d>>2]|0;if(!a){n=0;break}else b=d}while(1){d=a+20|0;e=c[d>>2]|0;if(e|0){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}if(b>>>0<(c[47620]|0)>>>0)Va();else{c[b>>2]=0;n=a;break}}else{b=c[o+8>>2]|0;if(b>>>0<(c[47620]|0)>>>0)Va();d=b+12|0;if((c[d>>2]|0)!=(o|0))Va();e=a+8|0;if((c[e>>2]|0)==(o|0)){c[d>>2]=a;c[e>>2]=b;n=a;break}else Va()}while(0);if(g|0){a=c[o+28>>2]|0;b=190768+(a<<2)|0;do if((o|0)==(c[b>>2]|0)){c[b>>2]=n;if(!n){c[47617]=c[47617]&~(1<>>0>=(c[47620]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(o|0)&1)<<2)>>2]=n;if(!n)break b;else break}else Va();while(0);d=c[47620]|0;if(n>>>0>>0)Va();c[n+24>>2]=g;a=o+16|0;b=c[a>>2]|0;do if(b|0)if(b>>>0>>0)Va();else{c[n+16>>2]=b;c[b+24>>2]=n;break}while(0);a=c[a+4>>2]|0;if(a|0)if(a>>>0<(c[47620]|0)>>>0)Va();else{c[n+20>>2]=a;c[a+24>>2]=n;break}}}else{b=c[o+8>>2]|0;d=c[o+12>>2]|0;a=190504+(e<<1<<2)|0;if((b|0)!=(a|0)){if(b>>>0<(c[47620]|0)>>>0)Va();if((c[b+12>>2]|0)!=(o|0))Va()}if((d|0)==(b|0)){c[47616]=c[47616]&~(1<>>0<(c[47620]|0)>>>0)Va();a=d+8|0;if((c[a>>2]|0)==(o|0))l=a;else Va()}else l=d+8|0;c[b+12>>2]=d;c[l>>2]=b}while(0);c[r+4>>2]=f|1;c[m+f>>2]=f;if((r|0)==(c[47621]|0)){c[47618]=f;return}}else{c[a>>2]=b&-2;c[r+4>>2]=f|1;c[m+f>>2]=f}a=f>>>3;if(f>>>0<256){d=190504+(a<<1<<2)|0;b=c[47616]|0;a=1<>2]|0;if(b>>>0<(c[47620]|0)>>>0)Va();else{p=b;q=a}}else{c[47616]=b|a;p=d;q=d+8|0}c[q>>2]=r;c[p+12>>2]=r;c[r+8>>2]=p;c[r+12>>2]=d;return}a=f>>>8;if(a)if(f>>>0>16777215)a=31;else{p=(a+1048320|0)>>>16&8;q=a<>>16&4;q=q<>>16&2;a=14-(o|p|a)+(q<>>15)|0;a=f>>>(a+7|0)&1|a<<1}else a=0;e=190768+(a<<2)|0;c[r+28>>2]=a;c[r+20>>2]=0;c[r+16>>2]=0;b=c[47617]|0;d=1<>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(f|0)){a=124;break}d=e+16+(b>>>31<<2)|0;a=c[d>>2]|0;if(!a){a=121;break}else{b=b<<1;e=a}}if((a|0)==121)if(d>>>0<(c[47620]|0)>>>0)Va();else{c[d>>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r;break}else if((a|0)==124){a=e+8|0;b=c[a>>2]|0;q=c[47620]|0;if(b>>>0>=q>>>0&e>>>0>=q>>>0){c[b+12>>2]=r;c[a>>2]=r;c[r+8>>2]=b;c[r+12>>2]=e;c[r+24>>2]=0;break}else Va()}}else{c[47617]=b|d;c[e>>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r}while(0);r=(c[47624]|0)+-1|0;c[47624]=r;if(!r)a=190920;else return;while(1){a=c[a>>2]|0;if(!a)break;else a=a+8|0}c[47624]=-1;return}function m6(a,b){a=a|0;b=b|0;var d=0;if(a){d=S(b,a)|0;if((b|a)>>>0>65535)d=((d>>>0)/(a>>>0)|0|0)==(b|0)?d:-1}else d=0;a=k6(d)|0;if(!a)return a|0;if(!(c[a+-4>>2]&3))return a|0;u6(a|0,0,d|0)|0;return a|0}function n6(a,b){a=a|0;b=b|0;var d=0,e=0;if(!a){b=k6(b)|0;return b|0}if(b>>>0>4294967231){c[(L1()|0)>>2]=12;b=0;return b|0}d=o6(a+-8|0,b>>>0<11?16:b+11&-8)|0;if(d|0){b=d+8|0;return b|0}d=k6(b)|0;if(!d){b=0;return b|0}e=c[a+-4>>2]|0;e=(e&-8)-((e&3|0)==0?8:4)|0;B6(d|0,a|0,(e>>>0>>0?e:b)|0)|0;l6(a);b=d;return b|0} +function o6(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=a+4|0;n=c[o>>2]|0;d=n&-8;k=a+d|0;i=c[47620]|0;e=n&3;if(!((e|0)!=1&a>>>0>=i>>>0&a>>>0>>0))Va();f=c[k+4>>2]|0;if(!(f&1))Va();if(!e){if(b>>>0<256){a=0;return a|0}if(d>>>0>=(b+4|0)>>>0?(d-b|0)>>>0<=c[47736]<<1>>>0:0)return a|0;a=0;return a|0}if(d>>>0>=b>>>0){d=d-b|0;if(d>>>0<=15)return a|0;m=a+b|0;c[o>>2]=n&1|b|2;c[m+4>>2]=d|3;o=m+d+4|0;c[o>>2]=c[o>>2]|1;p6(m,d);return a|0}if((k|0)==(c[47622]|0)){m=(c[47619]|0)+d|0;d=m-b|0;e=a+b|0;if(m>>>0<=b>>>0){a=0;return a|0}c[o>>2]=n&1|b|2;c[e+4>>2]=d|1;c[47622]=e;c[47619]=d;return a|0}if((k|0)==(c[47621]|0)){f=(c[47618]|0)+d|0;if(f>>>0>>0){a=0;return a|0}d=f-b|0;e=n&1;if(d>>>0>15){n=a+b|0;m=n+d|0;c[o>>2]=e|b|2;c[n+4>>2]=d|1;c[m>>2]=d;e=m+4|0;c[e>>2]=c[e>>2]&-2;e=n}else{c[o>>2]=e|f|2;e=a+f+4|0;c[e>>2]=c[e>>2]|1;e=0;d=0}c[47618]=d;c[47621]=e;return a|0}if(f&2|0){a=0;return a|0}l=(f&-8)+d|0;if(l>>>0>>0){a=0;return a|0}m=l-b|0;g=f>>>3;a:do if(f>>>0>=256){h=c[k+24>>2]|0;f=c[k+12>>2]|0;do if((f|0)==(k|0)){f=k+16|0;e=f+4|0;d=c[e>>2]|0;if(!d){d=c[f>>2]|0;if(!d){j=0;break}else e=f}while(1){f=d+20|0;g=c[f>>2]|0;if(g|0){d=g;e=f;continue}f=d+16|0;g=c[f>>2]|0;if(!g)break;else{d=g;e=f}}if(e>>>0>>0)Va();else{c[e>>2]=0;j=d;break}}else{g=c[k+8>>2]|0;if(g>>>0>>0)Va();d=g+12|0;if((c[d>>2]|0)!=(k|0))Va();e=f+8|0;if((c[e>>2]|0)==(k|0)){c[d>>2]=f;c[e>>2]=g;j=f;break}else Va()}while(0);if(h|0){d=c[k+28>>2]|0;e=190768+(d<<2)|0;do if((k|0)==(c[e>>2]|0)){c[e>>2]=j;if(!j){c[47617]=c[47617]&~(1<>>0>=(c[47620]|0)>>>0){c[h+16+(((c[h+16>>2]|0)!=(k|0)&1)<<2)>>2]=j;if(!j)break a;else break}else Va();while(0);f=c[47620]|0;if(j>>>0>>0)Va();c[j+24>>2]=h;d=k+16|0;e=c[d>>2]|0;do if(e|0)if(e>>>0>>0)Va();else{c[j+16>>2]=e;c[e+24>>2]=j;break}while(0);d=c[d+4>>2]|0;if(d|0)if(d>>>0<(c[47620]|0)>>>0)Va();else{c[j+20>>2]=d;c[d+24>>2]=j;break}}}else{e=c[k+8>>2]|0;f=c[k+12>>2]|0;d=190504+(g<<1<<2)|0;if((e|0)!=(d|0)){if(e>>>0>>0)Va();if((c[e+12>>2]|0)!=(k|0))Va()}if((f|0)==(e|0)){c[47616]=c[47616]&~(1<>>0>>0)Va();d=f+8|0;if((c[d>>2]|0)==(k|0))h=d;else Va()}else h=f+8|0;c[e+12>>2]=f;c[h>>2]=e}while(0);d=n&1;if(m>>>0<16){c[o>>2]=l|d|2;o=a+l+4|0;c[o>>2]=c[o>>2]|1;return a|0}else{n=a+b|0;c[o>>2]=d|b|2;c[n+4>>2]=m|3;o=n+m+4|0;c[o>>2]=c[o>>2]|1;p6(n,m);return a|0}return 0}function p6(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;o=a+b|0;d=c[a+4>>2]|0;a:do if(!(d&1)){g=c[a>>2]|0;if(!(d&3))return;l=a+(0-g)|0;k=g+b|0;i=c[47620]|0;if(l>>>0>>0)Va();if((l|0)==(c[47621]|0)){a=o+4|0;d=c[a>>2]|0;if((d&3|0)!=3){r=l;f=k;break}c[47618]=k;c[a>>2]=d&-2;c[l+4>>2]=k|1;c[l+k>>2]=k;return}e=g>>>3;if(g>>>0<256){d=c[l+8>>2]|0;b=c[l+12>>2]|0;a=190504+(e<<1<<2)|0;if((d|0)!=(a|0)){if(d>>>0>>0)Va();if((c[d+12>>2]|0)!=(l|0))Va()}if((b|0)==(d|0)){c[47616]=c[47616]&~(1<>>0>>0)Va();a=b+8|0;if((c[a>>2]|0)==(l|0))h=a;else Va()}else h=b+8|0;c[d+12>>2]=b;c[h>>2]=d;r=l;f=k;break}g=c[l+24>>2]|0;b=c[l+12>>2]|0;do if((b|0)==(l|0)){b=l+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){j=0;break}else d=b}while(1){b=a+20|0;e=c[b>>2]|0;if(e|0){a=e;d=b;continue}b=a+16|0;e=c[b>>2]|0;if(!e)break;else{a=e;d=b}}if(d>>>0>>0)Va();else{c[d>>2]=0;j=a;break}}else{e=c[l+8>>2]|0;if(e>>>0>>0)Va();a=e+12|0;if((c[a>>2]|0)!=(l|0))Va();d=b+8|0;if((c[d>>2]|0)==(l|0)){c[a>>2]=b;c[d>>2]=e;j=b;break}else Va()}while(0);if(g){a=c[l+28>>2]|0;d=190768+(a<<2)|0;do if((l|0)==(c[d>>2]|0)){c[d>>2]=j;if(!j){c[47617]=c[47617]&~(1<>>0>=(c[47620]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(l|0)&1)<<2)>>2]=j;if(!j){r=l;f=k;break a}else break}else Va();while(0);b=c[47620]|0;if(j>>>0>>0)Va();c[j+24>>2]=g;a=l+16|0;d=c[a>>2]|0;do if(d|0)if(d>>>0>>0)Va();else{c[j+16>>2]=d;c[d+24>>2]=j;break}while(0);a=c[a+4>>2]|0;if(a)if(a>>>0<(c[47620]|0)>>>0)Va();else{c[j+20>>2]=a;c[a+24>>2]=j;r=l;f=k;break}else{r=l;f=k}}else{r=l;f=k}}else{r=a;f=b}while(0);h=c[47620]|0;if(o>>>0>>0)Va();a=o+4|0;d=c[a>>2]|0;if(!(d&2)){a=c[47621]|0;if((o|0)==(c[47622]|0)){q=(c[47619]|0)+f|0;c[47619]=q;c[47622]=r;c[r+4>>2]=q|1;if((r|0)!=(a|0))return;c[47621]=0;c[47618]=0;return}if((o|0)==(a|0)){q=(c[47618]|0)+f|0;c[47618]=q;c[47621]=r;c[r+4>>2]=q|1;c[r+q>>2]=q;return}f=(d&-8)+f|0;e=d>>>3;b:do if(d>>>0>=256){g=c[o+24>>2]|0;b=c[o+12>>2]|0;do if((b|0)==(o|0)){b=o+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){n=0;break}else d=b}while(1){b=a+20|0;e=c[b>>2]|0;if(e|0){a=e;d=b;continue}b=a+16|0;e=c[b>>2]|0;if(!e)break;else{a=e;d=b}}if(d>>>0>>0)Va();else{c[d>>2]=0;n=a;break}}else{e=c[o+8>>2]|0;if(e>>>0>>0)Va();a=e+12|0;if((c[a>>2]|0)!=(o|0))Va();d=b+8|0;if((c[d>>2]|0)==(o|0)){c[a>>2]=b;c[d>>2]=e;n=b;break}else Va()}while(0);if(g|0){a=c[o+28>>2]|0;d=190768+(a<<2)|0;do if((o|0)==(c[d>>2]|0)){c[d>>2]=n;if(!n){c[47617]=c[47617]&~(1<>>0>=(c[47620]|0)>>>0){c[g+16+(((c[g+16>>2]|0)!=(o|0)&1)<<2)>>2]=n;if(!n)break b;else break}else Va();while(0);b=c[47620]|0;if(n>>>0>>0)Va();c[n+24>>2]=g;a=o+16|0;d=c[a>>2]|0;do if(d|0)if(d>>>0>>0)Va();else{c[n+16>>2]=d;c[d+24>>2]=n;break}while(0);a=c[a+4>>2]|0;if(a|0)if(a>>>0<(c[47620]|0)>>>0)Va();else{c[n+20>>2]=a;c[a+24>>2]=n;break}}}else{d=c[o+8>>2]|0;b=c[o+12>>2]|0;a=190504+(e<<1<<2)|0;if((d|0)!=(a|0)){if(d>>>0>>0)Va();if((c[d+12>>2]|0)!=(o|0))Va()}if((b|0)==(d|0)){c[47616]=c[47616]&~(1<>>0>>0)Va();a=b+8|0;if((c[a>>2]|0)==(o|0))m=a;else Va()}else m=b+8|0;c[d+12>>2]=b;c[m>>2]=d}while(0);c[r+4>>2]=f|1;c[r+f>>2]=f;if((r|0)==(c[47621]|0)){c[47618]=f;return}}else{c[a>>2]=d&-2;c[r+4>>2]=f|1;c[r+f>>2]=f}a=f>>>3;if(f>>>0<256){b=190504+(a<<1<<2)|0;d=c[47616]|0;a=1<>2]|0;if(d>>>0<(c[47620]|0)>>>0)Va();else{p=d;q=a}}else{c[47616]=d|a;p=b;q=b+8|0}c[q>>2]=r;c[p+12>>2]=r;c[r+8>>2]=p;c[r+12>>2]=b;return}a=f>>>8;if(a)if(f>>>0>16777215)a=31;else{p=(a+1048320|0)>>>16&8;q=a<>>16&4;q=q<>>16&2;a=14-(o|p|a)+(q<>>15)|0;a=f>>>(a+7|0)&1|a<<1}else a=0;e=190768+(a<<2)|0;c[r+28>>2]=a;c[r+20>>2]=0;c[r+16>>2]=0;d=c[47617]|0;b=1<>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r;return}d=f<<((a|0)==31?0:25-(a>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(f|0)){a=121;break}b=e+16+(d>>>31<<2)|0;a=c[b>>2]|0;if(!a){a=118;break}else{d=d<<1;e=a}}if((a|0)==118){if(b>>>0<(c[47620]|0)>>>0)Va();c[b>>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r;return}else if((a|0)==121){a=e+8|0;d=c[a>>2]|0;q=c[47620]|0;if(!(d>>>0>=q>>>0&e>>>0>=q>>>0))Va();c[d+12>>2]=r;c[a>>2]=r;c[r+8>>2]=d;c[r+12>>2]=e;c[r+24>>2]=0;return}}function q6(a,b){a=a|0;b=b|0;if(a>>>0<9){b=k6(b)|0;return b|0}else{b=r6(a,b)|0;return b|0}return 0}function r6(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;a=a>>>0>16?a:16;if(a+-1&a){d=16;while(1)if(d>>>0>>0)d=d<<1;else{a=d;break}}if((-64-a|0)>>>0<=b>>>0){c[(L1()|0)>>2]=12;h=0;return h|0}g=b>>>0<11?16:b+11&-8;d=k6(g+12+a|0)|0;if(!d){h=0;return h|0}f=d+-8|0;do if(d&a+-1){e=(d+a+-1&0-a)+-8|0;b=f;e=(e-b|0)>>>0>15?e:e+a|0;b=e-b|0;a=d+-4|0;i=c[a>>2]|0;d=(i&-8)-b|0;if(!(i&3)){c[e>>2]=(c[f>>2]|0)+b;c[e+4>>2]=d;a=e;b=e;break}else{i=e+4|0;c[i>>2]=d|c[i>>2]&1|2;d=e+d+4|0;c[d>>2]=c[d>>2]|1;c[a>>2]=b|c[a>>2]&1|2;c[i>>2]=c[i>>2]|1;p6(f,b);a=e;b=e;break}}else{a=f;b=f}while(0);a=a+4|0;d=c[a>>2]|0;if(d&3|0?(h=d&-8,h>>>0>(g+16|0)>>>0):0){i=h-g|0;h=b+g|0;c[a>>2]=g|d&1|2;c[h+4>>2]=i|3;g=h+i+4|0;c[g>>2]=c[g>>2]|1;p6(h,i)}i=b+8|0;return i|0}function s6(){}function t6(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (D=d,a-c>>>0|0)|0}function u6(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=b+e|0;d=d&255;if((e|0)>=67){while(b&3){a[b>>0]=d;b=b+1|0}f=h&-4|0;g=f-64|0;i=d|d<<8|d<<16|d<<24;while((b|0)<=(g|0)){c[b>>2]=i;c[b+4>>2]=i;c[b+8>>2]=i;c[b+12>>2]=i;c[b+16>>2]=i;c[b+20>>2]=i;c[b+24>>2]=i;c[b+28>>2]=i;c[b+32>>2]=i;c[b+36>>2]=i;c[b+40>>2]=i;c[b+44>>2]=i;c[b+48>>2]=i;c[b+52>>2]=i;c[b+56>>2]=i;c[b+60>>2]=i;b=b+64|0}while((b|0)<(f|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(h|0)){a[b>>0]=d;b=b+1|0}return h-e|0}function v6(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b<>>32-c;return a<>>0;return (D=b+d+(c>>>0>>0|0)>>>0,c|0)|0}function x6(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;q=q+1|0;c[a>>2]=q;while((f|0)<(e|0)){if(!(c[d+(f<<3)>>2]|0)){c[d+(f<<3)>>2]=q;c[d+((f<<3)+4)>>2]=b;c[d+((f<<3)+8)>>2]=0;D=e;return d|0}f=f+1|0}e=e*2|0;d=n6(d|0,8*(e+1|0)|0)|0;d=x6(a|0,b|0,d|0,e|0)|0;D=e;return d|0}function y6(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b>>c;return a>>>c|(b&(1<>c-32|0}function z6(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){D=b>>>c;return a>>>c|(b&(1<>>c-32|0}function A6(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;while((f|0)<(d|0)){e=c[b+(f<<3)>>2]|0;if(!e)break;if((e|0)==(a|0))return c[b+((f<<3)+4)>>2]|0;f=f+1|0}return 0}function B6(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192)return La(b|0,d|0,e|0)|0;h=b|0;g=b+e|0;if((b&3)==(d&3)){while(b&3){if(!e)return h|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}e=g&-4|0;f=e-64|0;while((b|0)<=(f|0)){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+44>>2]=c[d+44>>2];c[b+48>>2]=c[d+48>>2];c[b+52>>2]=c[d+52>>2];c[b+56>>2]=c[d+56>>2];c[b+60>>2]=c[d+60>>2];b=b+64|0;d=d+64|0}while((b|0)<(e|0)){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}}else{e=g-4|0;while((b|0)<(e|0)){a[b>>0]=a[d>>0]|0;a[b+1>>0]=a[d+1>>0]|0;a[b+2>>0]=a[d+2>>0]|0;a[b+3>>0]=a[d+3>>0]|0;b=b+4|0;d=d+4|0}}while((b|0)<(g|0)){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0}return h|0}function C6(b){b=b|0;var c=0;c=a[n+(b&255)>>0]|0;if((c|0)<8)return c|0;c=a[n+(b>>8&255)>>0]|0;if((c|0)<8)return c+8|0;c=a[n+(b>>16&255)>>0]|0;if((c|0)<8)return c+16|0;return (a[n+(b>>>24)>>0]|0)+24|0}function D6(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=a;j=b;k=j;h=d;n=e;i=n;if(!k){g=(f|0)!=0;if(!i){if(g){c[f>>2]=(l>>>0)%(h>>>0);c[f+4>>2]=0}n=0;f=(l>>>0)/(h>>>0)>>>0;return (D=n,f)|0}else{if(!g){n=0;f=0;return (D=n,f)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;f=0;return (D=n,f)|0}}g=(i|0)==0;do if(h){if(!g){g=(V(i|0)|0)-(V(k|0)|0)|0;if(g>>>0<=31){m=g+1|0;i=31-g|0;b=g-31>>31;h=m;a=l>>>(m>>>0)&b|k<>>(m>>>0)&b;g=0;i=l<>2]=a|0;c[f+4>>2]=j|b&0;n=0;f=0;return (D=n,f)|0}g=h-1|0;if(g&h|0){i=(V(h|0)|0)+33-(V(k|0)|0)|0;p=64-i|0;m=32-i|0;j=m>>31;o=i-32|0;b=o>>31;h=i;a=m-1>>31&k>>>(o>>>0)|(k<>>(i>>>0))&b;b=b&k>>>(i>>>0);g=l<>>(o>>>0))&j|l<>31;break}if(f|0){c[f>>2]=g&l;c[f+4>>2]=0}if((h|0)==1){o=j|b&0;p=a|0|0;return (D=o,p)|0}else{p=C6(h|0)|0;o=k>>>(p>>>0)|0;p=k<<32-p|l>>>(p>>>0)|0;return (D=o,p)|0}}else{if(g){if(f|0){c[f>>2]=(k>>>0)%(h>>>0);c[f+4>>2]=0}o=0;p=(k>>>0)/(h>>>0)>>>0;return (D=o,p)|0}if(!l){if(f|0){c[f>>2]=0;c[f+4>>2]=(k>>>0)%(i>>>0)}o=0;p=(k>>>0)/(i>>>0)>>>0;return (D=o,p)|0}g=i-1|0;if(!(g&i)){if(f|0){c[f>>2]=a|0;c[f+4>>2]=g&k|b&0}o=0;p=k>>>((C6(i|0)|0)>>>0);return (D=o,p)|0}g=(V(i|0)|0)-(V(k|0)|0)|0;if(g>>>0<=30){b=g+1|0;i=31-g|0;h=b;a=k<>>(b>>>0);b=k>>>(b>>>0);g=0;i=l<>2]=a|0;c[f+4>>2]=j|b&0;o=0;p=0;return (D=o,p)|0}while(0);if(!h){k=i;j=0;i=0}else{m=d|0|0;l=n|e&0;k=w6(m|0,l|0,-1,-1)|0;d=D;j=i;i=0;do{e=j;j=g>>>31|j<<1;g=i|g<<1;e=a<<1|e>>>31|0;n=a>>>31|b<<1|0;t6(k|0,d|0,e|0,n|0)|0;p=D;o=p>>31|((p|0)<0?-1:0)<<1;i=o&1;a=t6(e|0,n|0,o&m|0,(((p|0)<0?-1:0)>>31|((p|0)<0?-1:0)<<1)&l|0)|0;b=D;h=h-1|0}while((h|0)!=0);k=j;j=0}h=0;if(f|0){c[f>>2]=a;c[f+4>>2]=b}o=(g|0)>>>31|(k|h)<<1|(h<<1|g>>>31)&0|j;p=(g<<1|0>>>31)&-2|i;return (D=o,p)|0}function E6(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return D6(a,b,c,d,0)|0}function F6(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=S(e,f)|0;d=a>>>16;a=(c>>>16)+(S(e,d)|0)|0;e=b>>>16;b=S(e,f)|0;return (D=(a>>>16)+(S(e,d)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|c&65535|0)|0}function G6(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=F6(e,f)|0;a=D;return (D=(S(b,f)|0)+(S(d,e)|0)+a|a&0,c|0|0)|0}function H6(a){a=a|0;var b=0,d=0;d=a+15&-16|0;b=c[i>>2]|0;a=b+d|0;if((d|0)>0&(a|0)<(b|0)|(a|0)<0){_()|0;Fa(12);return -1}c[i>>2]=a;if((a|0)>(Z()|0)?(Y()|0)==0:0){Fa(12);c[i>>2]=b;return -1}return b|0}function I6(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if((c|0)<(b|0)&(b|0)<(c+d|0)){e=b;c=c+d|0;b=b+d|0;while((d|0)>0){b=b-1|0;c=c-1|0;d=d-1|0;a[b>>0]=a[c>>0]|0}b=e}else B6(b,c,d)|0;return b|0}function J6(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+16|0;f=g|0;D6(a,b,d,e,f)|0;l=g;return (D=c[f+4>>2]|0,c[f>>2]|0)|0}function K6(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function L6(a){a=a|0;return (a&255)<<8|a>>8&255|0}function M6(a,b){a=a|0;b=b|0;db[a&127](b|0)}function N6(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return eb[a&63](b|0,c|0,d|0)|0}function O6(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;fb[a&31](b|0,c|0,d|0,e|0,f|0)}function P6(a){a=a|0;return +gb[a&1]()}function Q6(a,b){a=a|0;b=b|0;return +hb[a&1](b|0)}function R6(a){a=a|0;return ib[a&3]()|0}function S6(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;return jb[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0)|0}function T6(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=+d;e=+e;return kb[a&3](b|0,c|0,+d,+e)|0}function U6(a,b,c){a=a|0;b=b|0;c=c|0;lb[a&63](b|0,c|0)}function V6(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return mb[a&1](b|0,c|0,d|0,e|0,f|0,g|0)|0}function W6(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=+f;g=g|0;nb[a&15](b|0,c|0,d|0,+e,+f,g|0)}function X6(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;ob[a&0](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0)}function Y6(a,b){a=a|0;b=b|0;return pb[a&63](b|0)|0}function Z6(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;return +qb[a&7](+b,+c,+d)}function _6(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;rb[a&127](b|0,c|0,d|0)}function $6(a){a=a|0;sb[a&15]()}function a7(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return tb[a&127](b|0,c|0,d|0,e|0)|0}function b7(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;ub[a&15](b|0,c|0,d|0,e|0,f|0,g|0)}function c7(a,b,c){a=a|0;b=b|0;c=c|0;return vb[a&127](b|0,c|0)|0}function d7(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return wb[a&63](b|0,c|0,d|0,e|0,f|0)|0}function e7(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;xb[a&31](b|0,c|0,d|0,e|0)}function f7(a){a=a|0;W(0)}function g7(a,b,c){a=a|0;b=b|0;c=c|0;W(1);return 0}function h7(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;W(2)}function i7(){W(3);return 0.0}function j7(a){a=a|0;W(4);return 0.0}function k7(){W(5);return 0}function l7(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;W(6);return 0}function m7(a,b,c,d){a=a|0;b=b|0;c=+c;d=+d;W(7);return 0}function n7(a,b){a=a|0;b=b|0;W(8)}function o7(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;W(9);return 0}function p7(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=+d;e=+e;f=f|0;W(10)}function q7(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;W(11)}function r7(a){a=a|0;W(12);return 0}function s7(a,b,c){a=+a;b=+b;c=+c;W(13);return 0.0}function t7(a,b,c){a=a|0;b=b|0;c=c|0;W(14)}function u7(){W(15)}function v7(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;W(16);return 0}function w7(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;W(17)}function x7(a,b){a=a|0;b=b|0;W(18);return 0}function y7(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;W(19);return 0}function z7(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;W(20)} + +// EMSCRIPTEN_END_FUNCS +var db=[f7,Jb,Kb,Ob,Pb,Qb,ic,jc,Hc,Ic,Jc,Kc,Lc,Mc,Nc,Zc,_c,bd,cd,dd,ed,fd,gd,hd,td,ud,vd,xd,yd,zd,Ad,Bd,Cd,Dd,Ed,Pd,Qd,Rd,Td,Ud,Vd,Wd,Xd,Yd,Zd,_d,$d,be,oe,pe,qe,re,Ce,De,Ee,Ge,Te,Ue,Ve,Xe,Ye,Ze,_e,$e,af,bf,cf,df,nf,of,pf,qf,Tf,Of,mm,Yl,ap,Bo,Lp,Up,Xn,Zn,Ip,Jp,Ul,Vl,$n,io,ko,vo,CB,VM,lN,XM,WM,HN,sM,vM,FS,KS,Hf,Al,Fo,Jo,bp,l6,Uv,qA,wG,pI,TU,yR,zQ,LL,lV,OX,hY,iY,oY,f7,f7,f7,f7,f7,f7,f7,f7,f7];var eb=[g7,Em,Jv,Az,Iz,Rz,Wz,TB,XB,UL,NP,OU,w_,C_,W$,a0,k$,q$,I1,J1,P1,Q1,N2,dA,Um,xv,op,kt,Sx,Ux,Xx,Yz,rG,i2,LD,z4,OO,QL,FR,jY,C0,K$,w0,G0,s4,g7,g7,g7,g7,g7,g7,g7,g7,g7,g7,g7,g7,g7,g7,g7,g7,g7,g7,g7];var fb=[h7,$c,Fd,Md,ae,Fe,F_,G_,W_,X_,t0,d0,e0,t$,u$,xl,uG,AQ,o_,p_,h7,h7,h7,h7,h7,h7,h7,h7,h7,h7,h7,h7];var gb=[i7,SO];var hb=[j7,ZO];var ib=[k7,Yq,RK,IL];var jb=[l7,F0,v0,l7];var kb=[m7,su,nu,m7];var lb=[n7,Pc,Uc,jd,od,Ld,he,xe,Me,kf,wf,$B,pN,TN,LN,GN,jN,kN,PN,QN,IS,MS,aM,gA,sG,TK,qQ,PW,NX,kY,lY,pY,rY,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7,n7];var mb=[o7,PX];var nb=[p7,KH,LH,MH,NH,OH,PH,QH,RH,p7,p7,p7,p7,p7,p7,p7];var ob=[q7];var pb=[r7,$g,ug,Im,Jm,VB,YB,FQ,GQ,xS,yS,zS,AS,BS,CS,DS,ES,H1,Fb,oF,vl,yl,Xm,IK,qB,gC,pB,NK,SK,rB,rQ,HK,wQ,xQ,qY,k6,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7,r7];var qb=[s7,bJ,cJ,dJ,eJ,s7,s7,s7];var rb=[t7,Rb,Sb,Vb,Gc,Oc,Qc,Tc,id,kd,nd,Gd,Hd,Kd,ce,de,ge,se,te,we,He,Ie,Le,ef,ff,jf,rf,sf,vf,lk,mk,nk,Fm,Bz,Jz,nA,DB,dC,NC,RD,jG,OJ,JL,VL,uM,OP,RP,fR,dR,GS,HS,JS,LS,NS,PU,CW,BW,GA,gB,rC,VC,YC,MK,PO,OL,uQ,yQ,DW,FW,GW,OW,QW,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7,t7];var sb=[u7,RO,OK,PK,QK,UK,VK,WK,UU,u7,u7,u7,u7,u7,u7,u7];var tb=[v7,Gm,Or,Kv,Cz,Kz,SA,QD,TA,kB,zB,BB,MB,LB,_B,cC,eC,KL,PP,gR,eR,cT,QU,kV,jV,q_,r_,s_,t_,u_,v_,x_,A_,E_,Q$,R$,S$,T$,U$,V$,X$,_$,c0,e$,f$,g$,h$,i$,j$,l$,o$,s$,$z,RC,vG,QO,dZ,hZ,oZ,yZ,HZ,MZ,KZ,NZ,H0,j_,a_,M$,N$,D0,E0,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7,v7];var ub=[w7,Ub,Sc,md,Jd,fe,ve,Ke,hf,uf,BQ,w7,w7,w7,w7,w7];var vb=[x7,xB,UB,ZB,RN,SN,JN,FN,nN,ZW,_W,$W,aX,bX,cX,eX,fX,gX,hX,iX,jX,kX,lX,mX,nX,oX,pX,qX,rX,sX,tX,uX,vX,wX,xX,yX,zX,AX,BX,CX,y_,z_,B_,Y_,Z_,__,$_,a$,b$,c$,d$,Y$,Z$,$$,m$,n$,p$,mF,kg,_g,Bh,di,vi,Gk,Ek,wl,zl,Wo,eq,gr,Cr,Er,Gr,Hr,Jr,Ir,Ur,et,jt,lt,qv,px,CE,BE,AE,tG,hC,KK,GG,WG,RG,SG,TH,Z3,W5,MO,_P,NA,cV,UA,WA,sQ,f2,DT,YW,mY,nY,n6,l_,m_,n_,J5,x7,x7,x7,x7,x7,x7,x7,x7,x7,x7,x7,x7,x7,x7,x7,x7];var wb=[y7,yB,oN,KN,J0,K0,L0,M0,O0,P0,Q0,R0,S0,U0,V0,W0,X0,Y0,T0,w1,x1,n1,g1,Z0,_0,$0,b1,a1,c1,d1,e1,f1,h1,i1,j1,k1,l1,m1,o1,p1,q1,r1,v1,t1,s1,u1,C1,y1,z1,A1,B1,D1,E1,F1,y7,y7,y7,y7,y7,y7,y7,y7,y7,y7];var xb=[z7,Tb,Rc,ld,wd,Id,Sd,ee,ue,Je,We,gf,tf,Kf,Jf,If,Gf,Ff,Ef,hc,Df,Cf,AB,mN,IN,D_,b0,r$,k3,tQ,vQ,O$];return{_i64Subtract:t6,_memset:u6,_bitshift64Lshr:z6,_bitshift64Shl:v6,_fflush:m4,_bitshift64Ashr:y6,_vizLastErrorMessage:Gb,_sbrk:H6,_memcpy:B6,_llvm_bswap_i32:K6,___muldi3:G6,___uremdi3:J6,_testSetjmp:A6,_llvm_cttz_i32:C6,_vizCreateFile:Hb,___udivmoddi4:D6,_realloc:n6,_i64Add:w6,_llvm_bswap_i16:L6,_emscripten_get_global_libc:G1,_htons:L4,___udivdi3:E6,___errno_location:L1,___muldsi3:F6,_vizRenderFromString:Ib,_saveSetjmp:x6,_free:l6,_dtextract:Pz,_memmove:I6,_malloc:k6,_memalign:q6,runPostSets:s6,stackAlloc:yb,stackSave:zb,stackRestore:Ab,establishStackSpace:Bb,setTempRet0:Db,getTempRet0:Eb,setThrew:Cb,stackAlloc:yb,stackSave:zb,stackRestore:Ab,establishStackSpace:Bb,setThrew:Cb,setTempRet0:Db,getTempRet0:Eb,dynCall_vi:M6,dynCall_iiii:N6,dynCall_viiiii:O6,dynCall_d:P6,dynCall_di:Q6,dynCall_i:R6,dynCall_iiiiiiiiiii:S6,dynCall_iiidd:T6,dynCall_vii:U6,dynCall_iiiiiii:V6,dynCall_viiiddi:W6,dynCall_viiiiiiiii:X6,dynCall_ii:Y6,dynCall_dddd:Z6,dynCall_viii:_6,dynCall_v:$6,dynCall_iiiii:a7,dynCall_viiiiii:b7,dynCall_iii:c7,dynCall_iiiiii:d7,dynCall_viiii:e7}}) + + +// EMSCRIPTEN_END_ASM +(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var stackSave=Module["stackSave"]=asm["stackSave"];var _vizCreateFile=Module["_vizCreateFile"]=asm["_vizCreateFile"];var _vizLastErrorMessage=Module["_vizLastErrorMessage"]=asm["_vizLastErrorMessage"];var getTempRet0=Module["getTempRet0"]=asm["getTempRet0"];var _vizRenderFromString=Module["_vizRenderFromString"]=asm["_vizRenderFromString"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var _fflush=Module["_fflush"]=asm["_fflush"];var _bitshift64Ashr=Module["_bitshift64Ashr"]=asm["_bitshift64Ashr"];var _memset=Module["_memset"]=asm["_memset"];var _sbrk=Module["_sbrk"]=asm["_sbrk"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var ___errno_location=Module["___errno_location"]=asm["___errno_location"];var ___muldi3=Module["___muldi3"]=asm["___muldi3"];var ___uremdi3=Module["___uremdi3"]=asm["___uremdi3"];var stackAlloc=Module["stackAlloc"]=asm["stackAlloc"];var _llvm_cttz_i32=Module["_llvm_cttz_i32"]=asm["_llvm_cttz_i32"];var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var ___udivmoddi4=Module["___udivmoddi4"]=asm["___udivmoddi4"];var setTempRet0=Module["setTempRet0"]=asm["setTempRet0"];var _realloc=Module["_realloc"]=asm["_realloc"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _llvm_bswap_i16=Module["_llvm_bswap_i16"]=asm["_llvm_bswap_i16"];var _emscripten_get_global_libc=Module["_emscripten_get_global_libc"]=asm["_emscripten_get_global_libc"];var _htons=Module["_htons"]=asm["_htons"];var ___udivdi3=Module["___udivdi3"]=asm["___udivdi3"];var _llvm_bswap_i32=Module["_llvm_bswap_i32"]=asm["_llvm_bswap_i32"];var ___muldsi3=Module["___muldsi3"]=asm["___muldsi3"];var _testSetjmp=Module["_testSetjmp"]=asm["_testSetjmp"];var _saveSetjmp=Module["_saveSetjmp"]=asm["_saveSetjmp"];var _free=Module["_free"]=asm["_free"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var setThrew=Module["setThrew"]=asm["setThrew"];var _dtextract=Module["_dtextract"]=asm["_dtextract"];var _memmove=Module["_memmove"]=asm["_memmove"];var stackRestore=Module["stackRestore"]=asm["stackRestore"];var _malloc=Module["_malloc"]=asm["_malloc"];var establishStackSpace=Module["establishStackSpace"]=asm["establishStackSpace"];var _memalign=Module["_memalign"]=asm["_memalign"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_d=Module["dynCall_d"]=asm["dynCall_d"];var dynCall_di=Module["dynCall_di"]=asm["dynCall_di"];var dynCall_i=Module["dynCall_i"]=asm["dynCall_i"];var dynCall_iiiiiiiiiii=Module["dynCall_iiiiiiiiiii"]=asm["dynCall_iiiiiiiiiii"];var dynCall_iiidd=Module["dynCall_iiidd"]=asm["dynCall_iiidd"];var dynCall_vii=Module["dynCall_vii"]=asm["dynCall_vii"];var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=asm["dynCall_iiiiiii"];var dynCall_viiiddi=Module["dynCall_viiiddi"]=asm["dynCall_viiiddi"];var dynCall_viiiiiiiii=Module["dynCall_viiiiiiiii"]=asm["dynCall_viiiiiiiii"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_dddd=Module["dynCall_dddd"]=asm["dynCall_dddd"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_v=Module["dynCall_v"]=asm["dynCall_v"];var dynCall_iiiii=Module["dynCall_iiiii"]=asm["dynCall_iiiii"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];var dynCall_iii=Module["dynCall_iii"]=asm["dynCall_iii"];var dynCall_iiiiii=Module["dynCall_iiiiii"]=asm["dynCall_iiiiii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];Runtime.stackAlloc=Module["stackAlloc"];Runtime.stackSave=Module["stackSave"];Runtime.stackRestore=Module["stackRestore"];Runtime.establishStackSpace=Module["establishStackSpace"];Runtime.setTempRet0=Module["setTempRet0"];Runtime.getTempRet0=Module["getTempRet0"];Module["asm"]=asm;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};Module["callMain"]=Module.callMain=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module["thisProgram"]),"i8",ALLOC_NORMAL)];pad();for(var i=0;i0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(Module["_main"]&&shouldRunNow)Module["callMain"](args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=Module.run=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}if(ENVIRONMENT_IS_NODE){process["exit"](status)}Module["quit"](status,new ExitStatus(status))}Module["exit"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;var extra="\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";var output="abort("+what+") at "+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module["abort"]=Module.abort=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"]){shouldRunNow=false}run() + + + + + + return Module; +}; +function Viz(src) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + var format = options.format === undefined ? "svg" : options.format; + var engine = options.engine === undefined ? "dot" : options.engine; + var scale = options.scale; + var totalMemory = options.totalMemory; + var files = options.files === undefined ? [] : options.files; + var images = options.images === undefined ? [] : options.images; + var i; + + for (i = 0; i < images.length; i++) { + files.push({ path: images[i].path, data: "\n\n" }); + } + + if (format == "png-image-element") { + return Viz.svgXmlToPngImageElement(render(src, "svg", engine, totalMemory, files), scale); + } else { + return render(src, format, engine, totalMemory, files); + } +} + +function render(src, format, engine, totalMemory, files) { + var graphviz = Module({ TOTAL_MEMORY: totalMemory }); + var i; + + for (i = 0; i < files.length; i++) { + graphviz["ccall"]("vizCreateFile", "number", ["string", "string"], [files[i].path, files[i].data]); + } + + var resultPointer = graphviz["ccall"]("vizRenderFromString", "number", ["string", "string", "string"], [src, format, engine]); + var resultString = graphviz["Pointer_stringify"](resultPointer); + + var errorMessagePointer = graphviz["ccall"]("vizLastErrorMessage", "number", [], []); + var errorMessageString = graphviz["Pointer_stringify"](errorMessagePointer); + + if (errorMessageString != "") { + throw new Error(errorMessageString); + } + + return resultString; +} + +// https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding +function b64EncodeUnicode(str) { + return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) { + return String.fromCharCode('0x' + p1); + })); +} + +Viz.svgXmlToPngImageElement = function(svgXml, scale, callback) { + if (scale === undefined) { + if ("devicePixelRatio" in window && window.devicePixelRatio > 1) { + scale = window.devicePixelRatio; + } else { + scale = 1; + } + } + + var pngImage = new Image(); + + try { + if (typeof fabric === "object" && fabric.loadSVGFromString) { + fabric.loadSVGFromString(svgXml, function(objects, options) { + // If there's something wrong with the SVG, Fabric may return an empty array of objects. Graphviz appears to give us at least one element back even given an empty graph, so we will assume an error in this case. + if (objects.length == 0) { + if (callback !== undefined) { + callback(new Error("Error loading SVG with Fabric")); + return; + } else { + throw new Error("Error loading SVG with Fabric"); + } + } + + var element = document.createElement("canvas"); + element.width = options.width; + element.height = options.height; + + var canvas = new fabric.Canvas(element, { enableRetinaScaling: false }); + var obj = fabric.util.groupSVGElements(objects, options); + canvas.add(obj).renderAll(); + + pngImage.src = canvas.toDataURL({ multiplier: scale }); + pngImage.width = options.width; + pngImage.height = options.height; + + if (callback !== undefined) { + callback(null, pngImage); + } + }); + } else { + var svgImage = new Image(); + + svgImage.onload = function() { + var canvas = document.createElement("canvas"); + canvas.width = svgImage.width * scale; + canvas.height = svgImage.height * scale; + + var context = canvas.getContext("2d"); + context.drawImage(svgImage, 0, 0, canvas.width, canvas.height); + + pngImage.src = canvas.toDataURL("image/png"); + pngImage.width = svgImage.width; + pngImage.height = svgImage.height; + + if (callback !== undefined) { + callback(null, pngImage); + } + } + + svgImage.onerror = function(e) { + var error; + + if ('error' in e) { + error = e.error; + } else { + error = new Error('Error loading SVG'); + } + + if (callback !== undefined) { + callback(error); + } else { + throw error; + } + } + + svgImage.src = "data:image/svg+xml;base64," + b64EncodeUnicode(svgXml); + } + } catch (e) { + if (callback !== undefined) { + callback(e); + } else { + throw e; + } + } + + if (callback === undefined) { + return pngImage; + } +} + +Viz.svgXmlToPngBase64 = function(svgXml, scale, callback) { + Viz.svgXmlToPngImageElement(svgXml, scale, function(err, image) { + if (err) { + callback(err); + } else { + callback(null, image.src.slice("data:image/png;base64,".length)); + } + }); +} +if (typeof module === "object" && module.exports) { + module.exports = Viz; +} else { + global.Viz = Viz; +} + +})(this); diff --git a/pkg/ui/v1beta1/frontend/scripts/build.js b/pkg/ui/v1beta1/frontend/scripts/build.js new file mode 100644 index 00000000000..e01b7a5ee2f --- /dev/null +++ b/pkg/ui/v1beta1/frontend/scripts/build.js @@ -0,0 +1,192 @@ +'use strict'; + +// Do this as the first thing so that any code reading it knows the right env. +process.env.BABEL_ENV = 'production'; +process.env.NODE_ENV = 'production'; + +// Makes the script crash on unhandled rejections instead of silently +// ignoring them. In the future, promise rejections that are not handled will +// terminate the Node.js process with a non-zero exit code. +process.on('unhandledRejection', err => { + throw err; +}); + +// Ensure environment variables are read. +require('../config/env'); + + +const path = require('path'); +const chalk = require('react-dev-utils/chalk'); +const fs = require('fs-extra'); +const webpack = require('webpack'); +const bfj = require('bfj'); +const configFactory = require('../config/webpack.config'); +const paths = require('../config/paths'); +const checkRequiredFiles = require('react-dev-utils/checkRequiredFiles'); +const formatWebpackMessages = require('react-dev-utils/formatWebpackMessages'); +const printHostingInstructions = require('react-dev-utils/printHostingInstructions'); +const FileSizeReporter = require('react-dev-utils/FileSizeReporter'); +const printBuildError = require('react-dev-utils/printBuildError'); + +const measureFileSizesBeforeBuild = + FileSizeReporter.measureFileSizesBeforeBuild; +const printFileSizesAfterBuild = FileSizeReporter.printFileSizesAfterBuild; +const useYarn = fs.existsSync(paths.yarnLockFile); + +// These sizes are pretty large. We'll warn for bundles exceeding them. +const WARN_AFTER_BUNDLE_GZIP_SIZE = 512 * 1024; +const WARN_AFTER_CHUNK_GZIP_SIZE = 1024 * 1024; + +const isInteractive = process.stdout.isTTY; + +// Warn and crash if required files are missing +if (!checkRequiredFiles([paths.appHtml, paths.appIndexJs])) { + process.exit(1); +} + +// Process CLI arguments +const argv = process.argv.slice(2); +const writeStatsJson = argv.indexOf('--stats') !== -1; + +// Generate configuration +const config = configFactory('production'); + +// We require that you explicitly set browsers and do not fall back to +// browserslist defaults. +const { checkBrowsers } = require('react-dev-utils/browsersHelper'); +checkBrowsers(paths.appPath, isInteractive) + .then(() => { + // First, read the current file sizes in build directory. + // This lets us display how much they changed later. + return measureFileSizesBeforeBuild(paths.appBuild); + }) + .then(previousFileSizes => { + // Remove all content but keep the directory so that + // if you're in it, you don't end up in Trash + fs.emptyDirSync(paths.appBuild); + // Merge with the public folder + copyPublicFolder(); + // Start the webpack build + return build(previousFileSizes); + }) + .then( + ({ stats, previousFileSizes, warnings }) => { + if (warnings.length) { + console.log(chalk.yellow('Compiled with warnings.\n')); + console.log(warnings.join('\n\n')); + console.log( + '\nSearch for the ' + + chalk.underline(chalk.yellow('keywords')) + + ' to learn more about each warning.' + ); + console.log( + 'To ignore, add ' + + chalk.cyan('// eslint-disable-next-line') + + ' to the line before.\n' + ); + } else { + console.log(chalk.green('Compiled successfully.\n')); + } + + console.log('File sizes after gzip:\n'); + printFileSizesAfterBuild( + stats, + previousFileSizes, + paths.appBuild, + WARN_AFTER_BUNDLE_GZIP_SIZE, + WARN_AFTER_CHUNK_GZIP_SIZE + ); + console.log(); + + const appPackage = require(paths.appPackageJson); + const publicUrl = paths.publicUrl; + const publicPath = config.output.publicPath; + const buildFolder = path.relative(process.cwd(), paths.appBuild); + printHostingInstructions( + appPackage, + publicUrl, + publicPath, + buildFolder, + useYarn + ); + }, + err => { + console.log(chalk.red('Failed to compile.\n')); + printBuildError(err); + process.exit(1); + } + ) + .catch(err => { + if (err && err.message) { + console.log(err.message); + } + process.exit(1); + }); + +// Create the production build and print the deployment instructions. +function build(previousFileSizes) { + console.log('Creating an optimized production build...'); + + let compiler = webpack(config); + return new Promise((resolve, reject) => { + compiler.run((err, stats) => { + let messages; + if (err) { + if (!err.message) { + return reject(err); + } + messages = formatWebpackMessages({ + errors: [err.message], + warnings: [], + }); + } else { + messages = formatWebpackMessages( + stats.toJson({ all: false, warnings: true, errors: true }) + ); + } + if (messages.errors.length) { + // Only keep the first error. Others are often indicative + // of the same problem, but confuse the reader with noise. + if (messages.errors.length > 1) { + messages.errors.length = 1; + } + return reject(new Error(messages.errors.join('\n\n'))); + } + if ( + process.env.CI && + (typeof process.env.CI !== 'string' || + process.env.CI.toLowerCase() !== 'false') && + messages.warnings.length + ) { + console.log( + chalk.yellow( + '\nTreating warnings as errors because process.env.CI = true.\n' + + 'Most CI servers set it automatically.\n' + ) + ); + return reject(new Error(messages.warnings.join('\n\n'))); + } + + const resolveArgs = { + stats, + previousFileSizes, + warnings: messages.warnings, + }; + if (writeStatsJson) { + return bfj + .write(paths.appBuild + '/bundle-stats.json', stats.toJson()) + .then(() => resolve(resolveArgs)) + .catch(error => reject(new Error(error))); + } + + return resolve(resolveArgs); + }); + }); +} + +function copyPublicFolder() { + fs.copySync(paths.appPublic, paths.appBuild, { + dereference: true, + filter: file => file !== paths.appHtml, + }); +} diff --git a/pkg/ui/v1beta1/frontend/scripts/check-format-error.js b/pkg/ui/v1beta1/frontend/scripts/check-format-error.js new file mode 100644 index 00000000000..476196e26a3 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/scripts/check-format-error.js @@ -0,0 +1,6 @@ +console.error(); +console.error('-----------------------------------------------'); +console.error('Please run `npm run format:write` to format your code.'); +console.error('-----------------------------------------------'); +console.error(); +process.exit(1); diff --git a/pkg/ui/v1beta1/frontend/scripts/start.js b/pkg/ui/v1beta1/frontend/scripts/start.js new file mode 100644 index 00000000000..06bfbb12110 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/scripts/start.js @@ -0,0 +1,133 @@ +'use strict'; + +// Do this as the first thing so that any code reading it knows the right env. +process.env.BABEL_ENV = 'development'; +process.env.NODE_ENV = 'development'; + +// Makes the script crash on unhandled rejections instead of silently +// ignoring them. In the future, promise rejections that are not handled will +// terminate the Node.js process with a non-zero exit code. +process.on('unhandledRejection', err => { + throw err; +}); + +// Ensure environment variables are read. +require('../config/env'); + + +const fs = require('fs'); +const chalk = require('react-dev-utils/chalk'); +const webpack = require('webpack'); +const WebpackDevServer = require('webpack-dev-server'); +const clearConsole = require('react-dev-utils/clearConsole'); +const checkRequiredFiles = require('react-dev-utils/checkRequiredFiles'); +const { + choosePort, + createCompiler, + prepareProxy, + prepareUrls, +} = require('react-dev-utils/WebpackDevServerUtils'); +const openBrowser = require('react-dev-utils/openBrowser'); +const paths = require('../config/paths'); +const configFactory = require('../config/webpack.config'); +const createDevServerConfig = require('../config/webpackDevServer.config'); + +const useYarn = fs.existsSync(paths.yarnLockFile); +const isInteractive = process.stdout.isTTY; + +// Warn and crash if required files are missing +if (!checkRequiredFiles([paths.appHtml, paths.appIndexJs])) { + process.exit(1); +} + +// Tools like Cloud9 rely on this. +const DEFAULT_PORT = parseInt(process.env.PORT, 10) || 3000; +const HOST = process.env.HOST || '0.0.0.0'; + +if (process.env.HOST) { + console.log( + chalk.cyan( + `Attempting to bind to HOST environment variable: ${chalk.yellow( + chalk.bold(process.env.HOST) + )}` + ) + ); + console.log( + `If this was unintentional, check that you haven't mistakenly set it in your shell.` + ); + console.log( + `Learn more here: ${chalk.yellow('https://bit.ly/CRA-advanced-config')}` + ); + console.log(); +} + +// We require that you explictly set browsers and do not fall back to +// browserslist defaults. +const { checkBrowsers } = require('react-dev-utils/browsersHelper'); +checkBrowsers(paths.appPath, isInteractive) + .then(() => { + // We attempt to use the default port but if it is busy, we offer the user to + // run on a different port. `choosePort()` Promise resolves to the next free port. + return choosePort(HOST, DEFAULT_PORT); + }) + .then(port => { + if (port == null) { + // We have not found a port. + return; + } + const config = configFactory('development'); + const protocol = process.env.HTTPS === 'true' ? 'https' : 'http'; + const appName = require(paths.appPackageJson).name; + const useTypeScript = fs.existsSync(paths.appTsConfig); + const urls = prepareUrls(protocol, HOST, port); + const devSocket = { + warnings: warnings => + devServer.sockWrite(devServer.sockets, 'warnings', warnings), + errors: errors => + devServer.sockWrite(devServer.sockets, 'errors', errors), + }; + // Create a webpack compiler that is configured with custom messages. + const compiler = createCompiler({ + appName, + config, + devSocket, + urls, + useYarn, + useTypeScript, + webpack, + }); + // Load proxy config + const proxySetting = require(paths.appPackageJson).proxy; + const proxyConfig = prepareProxy(proxySetting, paths.appPublic); + // Serve webpack assets generated by the compiler over a web server. + const serverConfig = createDevServerConfig( + proxyConfig, + urls.lanUrlForConfig + ); + const devServer = new WebpackDevServer(compiler, serverConfig); + // Launch WebpackDevServer. + devServer.listen(port, HOST, err => { + if (err) { + return console.log(err); + } + if (isInteractive) { + clearConsole(); + } + console.log(chalk.cyan(`Starting the development server on ${HOST}:${port}...\n`)); + openBrowser(urls.localUrlForBrowser); + }); + + ['SIGINT', 'SIGTERM', 'SIGQUIT'].forEach(function(sig) { + process.on(sig, function() { + console.log("Terminating"); + devServer.close(); + process.exit(); + }); + }); + }) + .catch(err => { + if (err && err.message) { + console.log(err.message); + } + process.exit(1); + }); diff --git a/pkg/ui/v1beta1/frontend/scripts/test.js b/pkg/ui/v1beta1/frontend/scripts/test.js new file mode 100644 index 00000000000..4172e422c75 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/scripts/test.js @@ -0,0 +1,60 @@ +'use strict'; + +// Do this as the first thing so that any code reading it knows the right env. +process.env.BABEL_ENV = 'test'; +process.env.NODE_ENV = 'test'; +process.env.PUBLIC_URL = ''; + +// Makes the script crash on unhandled rejections instead of silently +// ignoring them. In the future, promise rejections that are not handled will +// terminate the Node.js process with a non-zero exit code. +process.on('unhandledRejection', err => { + throw err; +}); + +// Ensure environment variables are read. +require('../config/env'); + + +const jest = require('jest'); +const execSync = require('child_process').execSync; +let argv = process.argv.slice(2); + +function isInGitRepository() { + try { + execSync('git rev-parse --is-inside-work-tree', { stdio: 'ignore' }); + return true; + } catch (e) { + return false; + } +} + +function isInMercurialRepository() { + try { + execSync('hg --cwd . root', { stdio: 'ignore' }); + return true; + } catch (e) { + return false; + } +} + +// Watch unless on CI, in coverage mode, explicitly adding `--no-watch`, +// or explicitly running all tests +if ( + !process.env.CI && + argv.indexOf('--coverage') === -1 && + argv.indexOf('--no-watch') === -1 && + argv.indexOf('--watchAll') === -1 +) { + // https://github.com/facebook/create-react-app/issues/5210 + const hasSourceControl = isInGitRepository() || isInMercurialRepository(); + argv.push(hasSourceControl ? '--watch' : '--watchAll'); +} + +// Jest doesn't have this option so we'll remove it +if (argv.indexOf('--no-watch') !== -1) { + argv = argv.filter(arg => arg !== '--no-watch'); +} + + +jest.run(argv); diff --git a/pkg/ui/v1beta1/frontend/src/actions/generalActions.js b/pkg/ui/v1beta1/frontend/src/actions/generalActions.js new file mode 100644 index 00000000000..bc4da0497c5 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/actions/generalActions.js @@ -0,0 +1,114 @@ +export const TOGGLE_MENU = 'TOGGLE_MENU'; + +export const toggleMenu = state => { + return { + type: TOGGLE_MENU, + state, + }; +}; + +export const CLOSE_SNACKBAR = 'CLOSE_SNACKBAR'; + +export const closeSnackbar = () => { + return { + type: CLOSE_SNACKBAR, + }; +}; + +export const SUBMIT_YAML_REQUEST = 'SUBMIT_YAML_REQUEST'; +export const SUBMIT_YAML_FAILURE = 'SUBMIT_YAML_FAILURE'; +export const SUBMIT_YAML_SUCCESS = 'SUBMIT_YAML_SUCCESS'; + +export const submitYaml = (yaml, globalNamespace) => ({ + type: SUBMIT_YAML_REQUEST, + yaml, + globalNamespace, +}); + +export const DELETE_EXPERIMENT_REQUEST = 'DELETE_EXPERIMENT_REQUEST'; +export const DELETE_EXPERIMENT_FAILURE = 'DELETE_EXPERIMENT_FAILURE'; +export const DELETE_EXPERIMENT_SUCCESS = 'DELETE_EXPERIMENT_SUCCESS'; + +export const deleteExperiment = (name, namespace) => ({ + type: DELETE_EXPERIMENT_REQUEST, + name, + namespace, +}); + +export const OPEN_DELETE_EXPERIMENT_DIALOG = 'OPEN_DELETE_EXPERIMENT_DIALOG'; + +export const openDeleteExperimentDialog = (name, namespace) => ({ + type: OPEN_DELETE_EXPERIMENT_DIALOG, + name, + namespace, +}); + +export const CLOSE_DELETE_EXPERIMENT_DIALOG = 'CLOSE_DELETE_EXPERIMENT_DIALOG'; + +export const closeDeleteExperimentDialog = () => ({ + type: CLOSE_DELETE_EXPERIMENT_DIALOG, +}); + +export const FETCH_NAMESPACES_REQUEST = 'FETCH_NAMESPACES_REQUEST'; +export const FETCH_NAMESPACES_SUCCESS = 'FETCH_NAMESPACES_SUCCESS'; +export const FETCH_NAMESPACES_FAILURE = 'FETCH_NAMESPACES_FAILURE'; + +export const fetchNamespaces = () => ({ + type: FETCH_NAMESPACES_REQUEST, +}); + +export const CHANGE_GLOBAL_NAMESPACE = 'CHANGE_GLOBAL_NAMESPACE'; + +export const FETCH_EXPERIMENT_REQUEST = 'FETCH_EXPERIMENT_REQUEST'; +export const FETCH_EXPERIMENT_SUCCESS = 'FETCH_EXPERIMENT_SUCCESS'; +export const FETCH_EXPERIMENT_FAILURE = 'FETCH_EXPERIMENT_FAILURE'; + +export const fetchExperiment = (name, namespace) => ({ + type: FETCH_EXPERIMENT_REQUEST, + name, + namespace, +}); + +export const CLOSE_DIALOG_EXPERIMENT = 'CLOSE_DIALOG_EXPERIMENT'; + +export const closeDialogExperiment = () => ({ + type: CLOSE_DIALOG_EXPERIMENT, +}); + +export const FETCH_SUGGESTION_REQUEST = 'FETCH_SUGGESTION_REQUEST'; +export const FETCH_SUGGESTION_SUCCESS = 'FETCH_SUGGESTION_SUCCESS'; +export const FETCH_SUGGESTION_FAILURE = 'FETCH_SUGGESTION_FAILURE'; + +export const fetchSuggestion = (name, namespace) => ({ + type: FETCH_SUGGESTION_REQUEST, + name, + namespace, +}); + +export const CLOSE_DIALOG_SUGGESTION = 'CLOSE_DIALOG_SUGGESTION'; + +export const closeDialogSuggestion = () => ({ + type: CLOSE_DIALOG_SUGGESTION, +}); + +export const FILTER_TEMPLATES_EXPERIMENT = 'FILTER_TEMPLATES_EXPERIMENT'; + +export const filterTemplatesExperiment = (trialNamespace, trialConfigMapName) => ({ + type: FILTER_TEMPLATES_EXPERIMENT, + trialNamespace, + trialConfigMapName, +}); + +export const CHANGE_TEMPLATE_NAME = 'CHANGE_TEMPLATE_NAME'; + +export const changeTemplateName = templateName => ({ + type: CHANGE_TEMPLATE_NAME, + templateName, +}); + +export const VALIDATION_ERROR = 'VALIDATION_ERROR'; + +export const validationError = message => ({ + type: VALIDATION_ERROR, + message, +}); diff --git a/pkg/ui/v1beta1/frontend/src/actions/hpCreateActions.js b/pkg/ui/v1beta1/frontend/src/actions/hpCreateActions.js new file mode 100644 index 00000000000..bd1b1260323 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/actions/hpCreateActions.js @@ -0,0 +1,209 @@ +export const CHANGE_YAML_HP = 'CHANGE_YAML_HP'; + +export const changeYaml = yaml => ({ + type: CHANGE_YAML_HP, + payload: yaml, +}); + +export const CHANGE_META_HP = 'CHANGE_META_HP'; + +export const changeMeta = (name, value) => ({ + type: CHANGE_META_HP, + name, + value, +}); + +export const CHANGE_SPEC_HP = 'CHANGE_SPEC_HP'; + +export const changeSpec = (name, value) => ({ + type: CHANGE_SPEC_HP, + name, + value, +}); + +export const CHANGE_OBJECTIVE_HP = 'CHANGE_OBJECTIVE_HP'; + +export const changeObjective = (name, value) => ({ + type: CHANGE_OBJECTIVE_HP, + name, + value, +}); +export const ADD_METRICS_HP = 'ADD_METRICS_HP'; + +export const addMetrics = () => ({ + type: ADD_METRICS_HP, +}); + +export const DELETE_METRICS_HP = 'DELETE_METRICS_HP'; + +export const deleteMetrics = index => ({ + type: DELETE_METRICS_HP, + index, +}); + +export const EDIT_METRICS_HP = 'EDIT_METRICS_HP'; + +export const editMetrics = (index, value) => ({ + type: EDIT_METRICS_HP, + index, + value, +}); + +export const CHANGE_ALGORITHM_NAME_HP = 'CHANGE_ALGORITHM_NAME_HP'; + +export const changeAlgorithmName = algorithmName => ({ + type: CHANGE_ALGORITHM_NAME_HP, + algorithmName, +}); + +export const ADD_ALGORITHM_SETTING_HP = 'ADD_ALGORITHM_SETTING_HP'; + +export const addAlgorithmSetting = () => ({ + type: ADD_ALGORITHM_SETTING_HP, +}); + +export const CHANGE_ALGORITHM_SETTING_HP = 'CHANGE_ALGORITHM_SETTING_HP'; + +export const changeAlgorithmSetting = (index, field, value) => ({ + type: CHANGE_ALGORITHM_SETTING_HP, + field, + value, + index, +}); + +export const DELETE_ALGORITHM_SETTING_HP = 'DELETE_ALGORITHM_SETTING_HP'; + +export const deleteAlgorithmSetting = index => ({ + type: DELETE_ALGORITHM_SETTING_HP, + index, +}); + +export const ADD_PARAMETER_HP = 'CHANGE_PARAMETER_HP'; + +export const addParameter = () => ({ + type: ADD_PARAMETER_HP, +}); + +export const EDIT_PARAMETER_HP = 'EDIT_PARAMTER_HP'; + +export const editParameter = (index, field, value) => ({ + type: EDIT_PARAMETER_HP, + index, + field, + value, +}); + +export const DELETE_PARAMETER_HP = 'DELETE_PARAMETER_HP'; + +export const deleteParameter = index => ({ + type: DELETE_PARAMETER_HP, + index, +}); + +export const ADD_LIST_PARAMETER_HP = 'ADD_LIST_PARAMETER_HP'; + +export const addListParameter = paramIndex => ({ + type: ADD_LIST_PARAMETER_HP, + paramIndex, +}); + +export const EDIT_LIST_PARAMETER_HP = 'EDIT_LIST_PARAMETER_HP'; + +export const editListParameter = (paramIndex, index, value) => ({ + type: EDIT_LIST_PARAMETER_HP, + paramIndex, + index, + value, +}); + +export const DELETE_LIST_PARAMETER_HP = 'DELETE_LIST_PARAMETER_HP'; + +export const deleteListParameter = (paramIndex, index) => ({ + type: DELETE_LIST_PARAMETER_HP, + paramIndex, + index, +}); + +export const SUBMIT_HP_JOB_REQUEST = 'SUBMIT_HP_JOB_REQUEST'; +export const SUBMIT_HP_JOB_SUCCESS = 'SUBMIT_HP_JOB_SUCCESS'; +export const SUBMIT_HP_JOB_FAILURE = 'SUBMIT_HP_JOB_FAILURE'; + +export const submitHPJob = data => ({ + type: SUBMIT_HP_JOB_REQUEST, + data, +}); + +export const CHANGE_MC_KIND_HP = 'CHANGE_MC_KIND_HP'; + +export const changeMCKindHP = kind => ({ + type: CHANGE_MC_KIND_HP, + kind, +}); + +export const CHANGE_MC_FILE_SYSTEM_HP = 'CHANGE_MC_FILE_SYSTEM_HP'; + +export const changeMCFileSystemHP = (kind, path) => ({ + type: CHANGE_MC_FILE_SYSTEM_HP, + kind, + path, +}); + +export const CHANGE_MC_HTTP_GET_HP = 'CHANGE_MC_HTTP_GET_HP'; + +export const changeMCHttpGetHP = (port, path, scheme, host) => ({ + type: CHANGE_MC_HTTP_GET_HP, + port, + path, + scheme, + host, +}); + +export const ADD_MC_HTTP_GET_HEADER_HP = 'ADD_MC_HTTP_GET_HEADER_HP'; + +export const addMCHttpGetHeaderHP = () => ({ + type: ADD_MC_HTTP_GET_HEADER_HP, +}); + +export const CHANGE_MC_HTTP_GET_HEADER_HP = 'CHANGE_MC_HTTP_GET_HEADER_HP'; + +export const changeMCHttpGetHeaderHP = (fieldName, value, index) => ({ + type: CHANGE_MC_HTTP_GET_HEADER_HP, + fieldName, + value, + index, +}); + +export const DELETE_MC_HTTP_GET_HEADER_HP = 'DELETE_MC_HTTP_GET_HEADER_HP'; + +export const deleteMCHttpGetHeaderHP = index => ({ + type: DELETE_MC_HTTP_GET_HEADER_HP, + index, +}); + +export const ADD_MC_METRICS_FORMAT_HP = 'ADD_MC_METRICS_FORMAT_HP'; + +export const addMCMetricsFormatHP = () => ({ + type: ADD_MC_METRICS_FORMAT_HP, +}); + +export const CHANGE_MC_METRIC_FORMAT_HP = 'CHANGE_MC_METRIC_FORMAT_HP'; + +export const changeMCMetricsFormatHP = (format, index) => ({ + type: CHANGE_MC_METRIC_FORMAT_HP, + format, + index, +}); + +export const DELETE_MC_METRIC_FORMAT_HP = 'DELETE_MC_METRIC_FORMAT_HP'; + +export const deleteMCMetricsFormatHP = index => ({ + type: DELETE_MC_METRIC_FORMAT_HP, + index, +}); + +export const CHANGE_MC_CUSTOM_CONTAINER_HP = 'CHANGE_MC_CUSTOM_CONTAINER_HP'; + +export const changeMCCustomContainerHP = yamlContainer => ({ + type: CHANGE_MC_CUSTOM_CONTAINER_HP, + yamlContainer, +}); diff --git a/pkg/ui/v1beta1/frontend/src/actions/hpMonitorActions.js b/pkg/ui/v1beta1/frontend/src/actions/hpMonitorActions.js new file mode 100644 index 00000000000..3df7803c9ae --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/actions/hpMonitorActions.js @@ -0,0 +1,49 @@ +export const FILTER_JOBS = 'FILTER_JOBS'; + +export const filterJobs = (experimentName, experimentNamespace) => ({ + type: FILTER_JOBS, + experimentName, + experimentNamespace, +}); + +export const CHANGE_TYPE = 'CHANGE_TYPE'; + +export const changeType = (filter, checked) => ({ + type: CHANGE_TYPE, + filter, + checked, +}); + +export const FETCH_HP_JOBS_REQUEST = 'FETCH_HP_JOBS_REQUEST'; +export const FETCH_HP_JOBS_SUCCESS = 'FETCH_HP_JOBS_SUCCESS'; +export const FETCH_HP_JOBS_FAILURE = 'FETCH_HP_JOBS_FAILURE'; + +export const fetchHPJobs = () => ({ + type: FETCH_HP_JOBS_REQUEST, +}); + +export const FETCH_HP_JOB_INFO_REQUEST = 'FETCH_HP_JOB_INFO_REQUEST'; +export const FETCH_HP_JOB_INFO_SUCCESS = 'FETCH_HP_JOB_INFO_SUCCESS'; +export const FETCH_HP_JOB_INFO_FAILURE = 'FETCH_HP_JOB_INFO_FAILURE'; + +export const fetchHPJobInfo = (name, namespace) => ({ + type: FETCH_HP_JOB_INFO_REQUEST, + name, + namespace, +}); + +export const FETCH_HP_JOB_TRIAL_INFO_REQUEST = 'FETCH_HP_JOB_TRIAL_INFO_REQUEST'; +export const FETCH_HP_JOB_TRIAL_INFO_SUCCESS = 'FETCH_HP_JOB_TRIAL_INFO_SUCCESS'; +export const FETCH_HP_JOB_TRIAL_INFO_FAILURE = 'FETCH_HP_JOB_TRIAL_INFO_FAILURE'; + +export const fetchHPJobTrialInfo = (trialName, namespace) => ({ + type: FETCH_HP_JOB_TRIAL_INFO_REQUEST, + trialName, + namespace, +}); + +export const CLOSE_DIALOG_TRIAL = 'CLOSE_DIALOG_TRIAL'; + +export const closeDialogTrial = () => ({ + type: CLOSE_DIALOG_TRIAL, +}); diff --git a/pkg/ui/v1beta1/frontend/src/actions/nasCreateActions.js b/pkg/ui/v1beta1/frontend/src/actions/nasCreateActions.js new file mode 100644 index 00000000000..3ac2429645e --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/actions/nasCreateActions.js @@ -0,0 +1,274 @@ +export const CHANGE_YAML_NAS = 'CHANGE_YAML_NAS'; + +export const changeYaml = yaml => ({ + type: CHANGE_YAML_NAS, + payload: yaml, +}); + +export const CHANGE_META_NAS = 'CHANGE_META_NAS'; + +export const changeMeta = (name, value) => ({ + type: CHANGE_META_NAS, + name, + value, +}); + +export const CHANGE_SPEC_NAS = 'CHANGE_SPEC_NAS'; + +export const changeSpec = (name, value) => ({ + type: CHANGE_SPEC_NAS, + name, + value, +}); + +export const CHANGE_OBJECTIVE_NAS = 'CHANGE_OBJECTIVE_NAS'; + +export const changeObjective = (name, value) => ({ + type: CHANGE_OBJECTIVE_NAS, + name, + value, +}); + +export const ADD_METRICS_NAS = 'ADD_METRICS_NAS'; + +export const addMetrics = () => ({ + type: ADD_METRICS_NAS, +}); + +export const DELETE_METRICS_NAS = 'DELETE_METRICS_NAS'; + +export const deleteMetrics = index => ({ + type: DELETE_METRICS_NAS, + index, +}); + +export const EDIT_METRICS_NAS = 'EDIT_METRICS_NAS'; + +export const editMetrics = (index, value) => ({ + type: EDIT_METRICS_NAS, + index, + value, +}); + +export const CHANGE_ALGORITHM_NAME_NAS = 'CHANGE_ALGORITHM_NAME_NAS'; + +export const changeAlgorithmName = algorithmName => ({ + type: CHANGE_ALGORITHM_NAME_NAS, + algorithmName, +}); + +export const ADD_ALGORITHM_SETTING_NAS = 'ADD_ALGORITHM_SETTING_NAS'; + +export const addAlgorithmSetting = () => ({ + type: ADD_ALGORITHM_SETTING_NAS, +}); + +export const CHANGE_ALGORITHM_SETTING_NAS = 'CHANGE_ALGORITHM_SETTING_NAS'; + +export const changeAlgorithmSetting = (index, field, value) => ({ + type: CHANGE_ALGORITHM_SETTING_NAS, + field, + value, + index, +}); + +export const DELETE_ALGORITHM_SETTING_NAS = 'DELETE_ALGORITHM_SETTING_NAS'; + +export const deleteAlgorithmSetting = index => ({ + type: DELETE_ALGORITHM_SETTING_NAS, + index, +}); + +export const EDIT_NUM_LAYERS = 'EDIT_NUM_LAYERS'; + +export const editNumLayers = value => ({ + type: EDIT_NUM_LAYERS, + value, +}); + +export const ADD_SIZE = 'ADD_SIZE'; + +export const addSize = sizeType => ({ + type: ADD_SIZE, + sizeType, +}); + +export const EDIT_SIZE = 'EDIT_SIZE'; + +export const editSize = (sizeType, index, value) => ({ + type: EDIT_SIZE, + sizeType, + index, + value, +}); + +export const DELETE_SIZE = 'DELETE_SIZE'; + +export const deleteSize = (sizeType, index) => ({ + type: DELETE_SIZE, + sizeType, + index, +}); + +export const ADD_OPERATION = 'ADD_OPERATION'; + +export const addOperation = () => ({ + type: ADD_OPERATION, +}); + +export const DELETE_OPERATION = 'DELETE_OPERATION'; + +export const deleteOperation = index => ({ + type: DELETE_OPERATION, + index, +}); + +export const CHANGE_OPERATION = 'CHANGE_OPERATION'; + +export const changeOperation = (index, value) => ({ + type: CHANGE_OPERATION, + index, + value, +}); + +export const ADD_PARAMETER_NAS = 'ADD_PARAMETER_NAS'; + +export const addParameter = opIndex => ({ + type: ADD_PARAMETER_NAS, + opIndex, +}); + +export const CHANGE_PARAMETER_NAS = 'CHANGE_PARAMETER_NAS'; + +export const changeParameter = (opIndex, paramIndex, field, value) => ({ + type: CHANGE_PARAMETER_NAS, + opIndex, + paramIndex, + field, + value, +}); + +export const DELETE_PARAMETER_NAS = 'DELETE_PARAMETER_NAS'; + +export const deleteParameter = (opIndex, paramIndex) => ({ + type: DELETE_PARAMETER_NAS, + opIndex, + paramIndex, +}); + +export const ADD_LIST_PARAMETER_NAS = 'ADD_LIST_PARAMETER_NAS'; + +export const addListParameter = (opIndex, paramIndex) => ({ + type: ADD_LIST_PARAMETER_NAS, + opIndex, + paramIndex, +}); + +export const EDIT_LIST_PARAMETER_NAS = 'EDIT_LIST_PARAMETER_NAS'; + +export const editListParameter = (opIndex, paramIndex, listIndex, value) => ({ + type: EDIT_LIST_PARAMETER_NAS, + opIndex, + paramIndex, + listIndex, + value, +}); + +export const DELETE_LIST_PARAMETER_NAS = 'DELETE_LIST_PARAMETER_NAS'; + +export const deleteListParameter = (opIndex, paramIndex, listIndex) => ({ + type: DELETE_LIST_PARAMETER_NAS, + opIndex, + paramIndex, + listIndex, +}); + +export const SUBMIT_NAS_JOB_REQUEST = 'SUBMIT_NAS_JOB_REQUEST'; +export const SUBMIT_NAS_JOB_SUCCESS = 'SUBMIT_NAS_JOB_SUCCESS'; +export const SUBMIT_NAS_JOB_FAILURE = 'SUBMIT_NAS_JOB_FAILURE'; + +export const submitNASJob = data => ({ + type: SUBMIT_NAS_JOB_REQUEST, + data, +}); + +export const CLOSE_SNACKBAR = 'CLOSE_SNACKBAR'; + +export const closeSnackbar = () => ({ + type: CLOSE_SNACKBAR, +}); + +export const CHANGE_MC_KIND_NAS = 'CHANGE_MC_KIND_NAS'; + +export const changeMCKindNAS = kind => ({ + type: CHANGE_MC_KIND_NAS, + kind, +}); + +export const CHANGE_MC_FILE_SYSTEM_NAS = 'CHANGE_MC_FILE_SYSTEM_NAS'; + +export const changeMCFileSystemNAS = (kind, path) => ({ + type: CHANGE_MC_FILE_SYSTEM_NAS, + kind, + path, +}); + +export const CHANGE_MC_HTTP_GET_NAS = 'CHANGE_MC_HTTP_GET_NAS'; + +export const changeMCHttpGetNAS = (port, path, scheme, host) => ({ + type: CHANGE_MC_HTTP_GET_NAS, + port, + path, + scheme, + host, +}); + +export const ADD_MC_HTTP_GET_HEADER_NAS = 'ADD_MC_HTTP_GET_HEADER_NAS'; + +export const addMCHttpGetHeaderNAS = () => ({ + type: ADD_MC_HTTP_GET_HEADER_NAS, +}); + +export const CHANGE_MC_HTTP_GET_HEADER_NAS = 'CHANGE_MC_HTTP_GET_HEADER_NAS'; + +export const changeMCHttpGetHeaderNAS = (fieldName, value, index) => ({ + type: CHANGE_MC_HTTP_GET_HEADER_NAS, + fieldName, + value, + index, +}); + +export const DELETE_MC_HTTP_GET_HEADER_NAS = 'DELETE_MC_HTTP_GET_HEADER_NAS'; + +export const deleteMCHttpGetHeaderNAS = index => ({ + type: DELETE_MC_HTTP_GET_HEADER_NAS, + index, +}); + +export const ADD_MC_METRICS_FORMAT_NAS = 'ADD_MC_METRICS_FORMAT_NAS'; + +export const addMCMetricsFormatNAS = () => ({ + type: ADD_MC_METRICS_FORMAT_NAS, +}); + +export const CHANGE_MC_METRIC_FORMAT_NAS = 'CHANGE_MC_METRIC_FORMAT_NAS'; + +export const changeMCMetricsFormatNAS = (format, index) => ({ + type: CHANGE_MC_METRIC_FORMAT_NAS, + format, + index, +}); + +export const DELETE_MC_METRIC_FORMAT_NAS = 'DELETE_MC_METRIC_FORMAT_NAS'; + +export const deleteMCMetricsFormatNAS = index => ({ + type: DELETE_MC_METRIC_FORMAT_NAS, + index, +}); + +export const CHANGE_MC_CUSTOM_CONTAINER_NAS = 'CHANGE_MC_CUSTOM_CONTAINER_NAS'; + +export const changeMCCustomContainerNAS = yamlContainer => ({ + type: CHANGE_MC_CUSTOM_CONTAINER_NAS, + yamlContainer, +}); diff --git a/pkg/ui/v1beta1/frontend/src/actions/nasMonitorActions.js b/pkg/ui/v1beta1/frontend/src/actions/nasMonitorActions.js new file mode 100644 index 00000000000..d965b2e0f8a --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/actions/nasMonitorActions.js @@ -0,0 +1,33 @@ +export const FILTER_JOBS = 'FILTER_JOBS'; + +export const filterJobs = (experimentName, experimentNamespace) => ({ + type: FILTER_JOBS, + experimentName, + experimentNamespace, +}); + +export const CHANGE_TYPE = 'CHANGE_TYPE'; + +export const changeType = (filter, checked) => ({ + type: CHANGE_TYPE, + filter, + checked, +}); + +export const FETCH_NAS_JOBS_REQUEST = 'FETCH_NAS_JOBS_REQUEST'; +export const FETCH_NAS_JOBS_SUCCESS = 'FETCH_NAS_JOBS_SUCCESS'; +export const FETCH_NAS_JOBS_FAILURE = 'FETCH_NAS_JOBS_FAILURE'; + +export const fetchNASJobs = () => ({ + type: FETCH_NAS_JOBS_REQUEST, +}); + +export const FETCH_NAS_JOB_INFO_REQUEST = 'FETCH_NAS_JOB_INFO_REQUEST'; +export const FETCH_NAS_JOB_INFO_SUCCESS = 'FETCH_NAS_JOB_INFO_SUCCESS'; +export const FETCH_NAS_JOB_INFO_FAILURE = 'FETCH_NAS_JOB_INFO_FAILURE'; + +export const fetchNASJobInfo = (experimentName, namespace) => ({ + type: FETCH_NAS_JOB_INFO_REQUEST, + experimentName, + namespace, +}); diff --git a/pkg/ui/v1beta1/frontend/src/actions/templateActions.js b/pkg/ui/v1beta1/frontend/src/actions/templateActions.js new file mode 100644 index 00000000000..bbbd8a99b9e --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/actions/templateActions.js @@ -0,0 +1,97 @@ +export const CLOSE_DIALOG = 'CLOSE_DIALOG'; + +export const closeDialog = () => ({ + type: CLOSE_DIALOG, +}); + +export const OPEN_DIALOG = 'OPEN_DIALOG'; + +export const openDialog = ( + dialogType, + namespace = '', + configMapName = '', + templateName = '', + templateYaml = '', +) => ({ + type: OPEN_DIALOG, + dialogType, + namespace, + configMapName, + templateName, + templateYaml, +}); + +export const FETCH_TRIAL_TEMPLATES_REQUEST = 'FETCH_TRIAL_TEMPLATES_REQUEST'; +export const FETCH_TRIAL_TEMPLATES_SUCCESS = 'FETCH_TRIAL_TEMPLATES_SUCCESS'; +export const FETCH_TRIAL_TEMPLATES_FAILURE = 'FETCH_TRIAL_TEMPLATES_FAILURE'; + +export const fetchTrialTemplates = () => ({ + type: FETCH_TRIAL_TEMPLATES_REQUEST, +}); + +export const ADD_TEMPLATE_REQUEST = 'ADD_TEMPLATE_REQUEST'; +export const ADD_TEMPLATE_SUCCESS = 'ADD_TEMPLATE_SUCCESS'; +export const ADD_TEMPLATE_FAILURE = 'ADD_TEMPLATE_FAILURE'; + +export const addTemplate = (edittedNamespace, edittedConfigMapName, edittedName, edittedYaml) => ({ + type: ADD_TEMPLATE_REQUEST, + edittedNamespace, + edittedConfigMapName, + edittedName, + edittedYaml, +}); + +export const EDIT_TEMPLATE_REQUEST = 'EDIT_TEMPLATE_REQUEST'; +export const EDIT_TEMPLATE_SUCCESS = 'EDIT_TEMPLATE_SUCCESS'; +export const EDIT_TEMPLATE_FAILURE = 'EDIT_TEMPLATE_FAILURE'; + +export const editTemplate = ( + edittedNamespace, + edittedConfigMapName, + currentName, + edittedName, + edittedYaml, +) => ({ + type: EDIT_TEMPLATE_REQUEST, + edittedNamespace, + edittedConfigMapName, + currentName, + edittedName, + edittedYaml, +}); + +export const DELETE_TEMPLATE_REQUEST = 'DELETE_TEMPLATE_REQUEST'; +export const DELETE_TEMPLATE_SUCCESS = 'DELETE_TEMPLATE_SUCCESS'; +export const DELETE_TEMPLATE_FAILURE = 'DELETE_TEMPLATE_FAILURE'; + +export const deleteTemplate = (edittedNamespace, edittedConfigMapName, edittedName) => ({ + type: DELETE_TEMPLATE_REQUEST, + edittedNamespace, + edittedConfigMapName, + edittedName, +}); + +export const CHANGE_TEMPLATE = 'CHANGE_TEMPLATE'; + +export const changeTemplate = ( + edittedTemplateNamespace, + edittedTemplateConfigMapName, + edittedTemplateName, + edittedTemplateYaml, + edittedTemplateConfigMapSelectList, +) => ({ + type: CHANGE_TEMPLATE, + edittedTemplateNamespace, + edittedTemplateConfigMapName, + edittedTemplateName, + edittedTemplateYaml, + edittedTemplateConfigMapSelectList, +}); + +export const FILTER_TEMPLATES = 'FILTER_TEMPLATES'; + +export const filterTemplates = (filteredNamespace, filteredConfigMapName) => ({ + type: FILTER_TEMPLATES, + filteredNamespace, + filteredConfigMapName, +}); diff --git a/pkg/ui/v1beta1/frontend/src/components/App.jsx b/pkg/ui/v1beta1/frontend/src/components/App.jsx new file mode 100644 index 00000000000..3d361f7b36a --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/App.jsx @@ -0,0 +1,44 @@ +import React from 'react'; +import { Route } from 'react-router-dom'; + +import { makeStyles } from '@material-ui/styles'; + +import Main from './Menu/Main'; +import HPJobMonitor from './HP/Monitor/HPJobMonitor'; +import HPJobInfo from './HP/Monitor/HPJobInfo'; +import NASJobMonitor from './NAS/Monitor/NASJobMonitor'; +import NASJobInfo from './NAS/Monitor/NASJobInfo'; +import Trial from './Templates/Trial'; +import Header from './Menu/Header'; +import Snack from './Menu/Snack'; +import TabPanel from './Common/Create/TabPanel'; + +import * as constants from '../constants/constants'; + +const useStyles = makeStyles({ + root: { + width: '90%', + margin: '0 auto', + paddingTop: 20, + }, +}); + +const App = props => { + const classes = useStyles(); + return ( +

+ ); +}; + +export default App; diff --git a/pkg/ui/v1beta1/frontend/src/components/Common/Create/Params/MetricsCollector.jsx b/pkg/ui/v1beta1/frontend/src/components/Common/Create/Params/MetricsCollector.jsx new file mode 100644 index 00000000000..f900967f181 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/Common/Create/Params/MetricsCollector.jsx @@ -0,0 +1,656 @@ +import React from 'react'; +import { connect } from 'react-redux'; + +import AceEditor from 'react-ace'; +import 'ace-builds/src-noconflict/theme-sqlserver'; +import 'ace-builds/src-noconflict/mode-yaml'; + +import withStyles from '@material-ui/styles/withStyles'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; +import Tooltip from '@material-ui/core/Tooltip'; +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; +import FormControl from '@material-ui/core/FormControl'; +import InputLabel from '@material-ui/core/InputLabel'; +import Select from '@material-ui/core/Select'; +import OutlinedInput from '@material-ui/core/OutlinedInput'; +import MenuItem from '@material-ui/core/MenuItem'; +import TextField from '@material-ui/core/TextField'; +import Button from '@material-ui/core/Button'; +import IconButton from '@material-ui/core/IconButton'; +import DeleteIcon from '@material-ui/icons/Delete'; +import Divider from '@material-ui/core/Divider'; + +import * as constants from '../../../../constants/constants'; +import { + changeMCKindHP, + changeMCFileSystemHP, + addMCMetricsFormatHP, + changeMCMetricsFormatHP, + deleteMCMetricsFormatHP, + changeMCHttpGetHP, + addMCHttpGetHeaderHP, + changeMCHttpGetHeaderHP, + deleteMCHttpGetHeaderHP, + changeMCCustomContainerHP, +} from '../../../../actions/hpCreateActions'; + +import { + changeMCKindNAS, + changeMCFileSystemNAS, + addMCMetricsFormatNAS, + changeMCMetricsFormatNAS, + deleteMCMetricsFormatNAS, + changeMCHttpGetNAS, + addMCHttpGetHeaderNAS, + changeMCHttpGetHeaderNAS, + deleteMCHttpGetHeaderNAS, + changeMCCustomContainerNAS, +} from '../../../../actions/nasCreateActions'; + +const module = 'general'; +const hpModule = 'hpCreate'; +const nasModule = 'nasCreate'; + +const styles = theme => ({ + help: { + padding: 4 / 2, + verticalAlign: 'middle', + marginRight: 5, + }, + formSelect: { + width: '70%', + }, + textField: { + width: '95%', + }, + grid: { + marginTop: 20, + marginBottom: 30, + }, + textsList: { + marginBottom: 15, + }, + headerButton: { + marginTop: 10, + }, +}); + +class MetricsCollectorSpec extends React.Component { + onMCKindChange = event => { + this.props.jobType === constants.JOB_TYPE_HP + ? this.props.changeMCKindHP(event.target.value) + : this.props.changeMCKindNAS(event.target.value); + }; + + onMCFileSystemKindChange = event => { + this.props.jobType === constants.JOB_TYPE_HP + ? this.props.changeMCFileSystemHP( + event.target.value, + this.props.mcSpecHP.source.fileSystemPath.path, + ) + : this.props.changeMCFileSystemNAS( + event.target.value, + this.props.mcSpecNAS.source.fileSystemPath.path, + ); + }; + + onMCFileSystemPathChange = event => { + this.props.jobType === constants.JOB_TYPE_HP + ? this.props.changeMCFileSystemHP( + this.props.mcSpecHP.source.fileSystemPath.kind, + event.target.value, + ) + : this.props.changeMCFileSystemNAS( + this.props.mcSpecNAS.source.fileSystemPath.kind, + event.target.value, + ); + }; + + onMCMetricsFormatAdd = () => { + this.props.jobType === constants.JOB_TYPE_HP + ? this.props.addMCMetricsFormatHP() + : this.props.addMCMetricsFormatNAS(); + }; + + onMCMetricsFormatChange = index => event => { + this.props.jobType == constants.JOB_TYPE_HP + ? this.props.changeMCMetricsFormatHP(event.target.value, index) + : this.props.changeMCMetricsFormatNAS(event.target.value, index); + }; + + onMCMetricsFormatDelete = index => event => { + this.props.jobType === constants.JOB_TYPE_HP + ? this.props.deleteMCMetricsFormatHP(index) + : this.props.deleteMCMetricsFormatNAS(index); + }; + + onMCHttpGetPortChange = event => { + this.props.jobType === constants.JOB_TYPE_HP + ? this.props.changeMCHttpGetHP( + event.target.value, + this.props.mcSpecHP.source.httpGet.path, + this.props.mcSpecHP.source.httpGet.scheme, + this.props.mcSpecHP.source.httpGet.host, + ) + : this.props.changeMCHttpGetNAS( + event.target.value, + this.props.mcSpecNAS.source.httpGet.path, + this.props.mcSpecNAS.source.httpGet.scheme, + this.props.mcSpecNAS.source.httpGet.host, + ); + }; + + onMCHttpGetPathChange = event => { + this.props.jobType === constants.JOB_TYPE_HP + ? this.props.changeMCHttpGetHP( + this.props.mcSpecHP.source.httpGet.port, + event.target.value, + this.props.mcSpecHP.source.httpGet.scheme, + this.props.mcSpecHP.source.httpGet.host, + ) + : this.props.changeMCHttpGetNAS( + this.props.mcSpecNAS.source.httpGet.port, + event.target.value, + this.props.mcSpecNAS.source.httpGet.scheme, + this.props.mcSpecNAS.source.httpGet.host, + ); + }; + + onMCHttpGetSchemeChange = event => { + this.props.jobType === constants.JOB_TYPE_HP + ? this.props.changeMCHttpGetHP( + this.props.mcSpecHP.source.httpGet.port, + this.props.mcSpecHP.source.httpGet.path, + event.target.value, + this.props.mcSpecHP.source.httpGet.host, + ) + : this.props.changeMCHttpGetNAS( + this.props.mcSpecNAS.source.httpGet.port, + this.props.mcSpecNAS.source.httpGet.path, + event.target.value, + this.props.mcSpecNAS.source.httpGet.host, + ); + }; + + onMCHttpGetHostChange = event => { + this.props.jobType === constants.JOB_TYPE_HP + ? this.props.changeMCHttpGetHP( + this.props.mcSpecHP.source.httpGet.port, + this.props.mcSpecHP.source.httpGet.path, + this.props.mcSpecHP.source.httpGet.scheme, + event.target.value, + ) + : this.props.changeMCHttpGetNAS( + this.props.mcSpecNAS.source.httpGet.port, + this.props.mcSpecNAS.source.httpGet.path, + this.props.mcSpecNAS.source.httpGet.scheme, + event.target.value, + ); + }; + + onMCHttpGetHeaderAdd = () => { + this.props.jobType === constants.JOB_TYPE_HP + ? this.props.addMCHttpGetHeaderHP() + : this.props.addMCHttpGetHeaderNAS(); + }; + + onMCHttpGetHeaderChange = (fieldName, index) => event => { + this.props.jobType === constants.JOB_TYPE_HP + ? this.props.changeMCHttpGetHeaderHP(fieldName, event.target.value, index) + : this.props.changeMCHttpGetHeaderNAS(fieldName, event.target.value, index); + }; + + onMCHttpGetHeaderDelete = index => event => { + this.props.jobType === constants.JOB_TYPE_HP + ? this.props.deleteMCHttpGetHeaderHP(index) + : this.props.deleteMCHttpGetHeaderNAS(index); + }; + + onMCCustomContainerChange = yamlContainer => { + this.props.jobType === constants.JOB_TYPE_HP + ? this.props.changeMCCustomContainerHP(yamlContainer) + : this.props.changeMCCustomContainerNAS(yamlContainer); + }; + render() { + const { classes } = this.props; + return ( +
+ + + + + + + {'Kind'} + + + + + Kind + + + + + {((this.props.jobType === constants.JOB_TYPE_HP && + (this.props.mcSpecHP.collector.kind === constants.MC_KIND_FILE || + this.props.mcSpecHP.collector.kind === constants.MC_KIND_TENSORFLOW_EVENT || + this.props.mcSpecHP.collector.kind === constants.MC_KIND_CUSTOM)) || + (this.props.jobType === constants.JOB_TYPE_NAS && + (this.props.mcSpecNAS.collector.kind === constants.MC_KIND_FILE || + this.props.mcSpecNAS.collector.kind === constants.MC_KIND_TENSORFLOW_EVENT || + this.props.mcSpecNAS.collector.kind === constants.MC_KIND_CUSTOM))) && ( + + + + + + + {'File System Kind and Path'} + + + + + File System Kind + + + + {((this.props.jobType === constants.JOB_TYPE_HP && + this.props.mcSpecHP.source.fileSystemPath.kind != constants.MC_FILE_SYSTEM_NO_KIND) || + (this.props.jobType === constants.JOB_TYPE_NAS && + this.props.mcSpecNAS.source.fileSystemPath.kind != + constants.MC_FILE_SYSTEM_NO_KIND)) && ( + + + + )} + + )} + {((this.props.jobType === constants.JOB_TYPE_HP && + this.props.mcSpecHP.collector.kind === constants.MC_KIND_PROMETHEUS) || + (this.props.jobType === constants.JOB_TYPE_NAS && + this.props.mcSpecNAS.collector.kind === constants.MC_KIND_PROMETHEUS)) && ( +
+ + + + + + + {'HttpGet Port and Path'} + + + + + + + + + + + + + + + + {'HttpGet Scheme and Host (optional)'} + + + + + Scheme + + + + + + + + + + + + + + {'HttpGet Headers (optional)'} + + + + + {this.props.jobType === constants.JOB_TYPE_HP + ? this.props.mcSpecHP.source.httpGet.httpHeaders.map((header, index) => { + return ( +
+ + + + + + + + + + + + + + +
+ ); + }) + : this.props.mcSpecNAS.source.httpGet.httpHeaders.map((header, index) => { + return ( +
+ + + + + + + + + + + + + + +
+ ); + })} +
+ )} + {((this.props.jobType === constants.JOB_TYPE_HP && + this.props.mcSpecHP.collector.kind === constants.MC_KIND_CUSTOM) || + (this.props.jobType === constants.JOB_TYPE_NAS && + this.props.mcSpecNAS.collector.kind === constants.MC_KIND_CUSTOM)) && ( + + + + + + + {'Yaml for the Custom Container'} + + + + + + + )} + + + + + + + + {this.props.jobType === constants.JOB_TYPE_HP && + this.props.mcSpecHP.source != undefined && + this.props.mcSpecHP.source.filter != undefined && + this.props.mcSpecHP.source.filter.metricsFormat.map((format, index) => { + return ( +
+ + + + + + + + + + + +
+ ); + })} + {this.props.jobType === constants.JOB_TYPE_NAS && + this.props.mcSpecNAS.source != undefined && + this.props.mcSpecNAS.source.filter != undefined && + this.props.mcSpecNAS.source.filter.metricsFormat.map((format, index) => { + return ( +
+ + + + + + + + + + + +
+ ); + })} +
+ ); + } +} + +const mapStateToProps = state => { + return { + mcSpecHP: state[hpModule].mcSpec, + mcSpecNAS: state[nasModule].mcSpec, + mcCustomContainerYamlHP: state[hpModule].mcCustomContainerYaml, + mcCustomContainerYamlNAS: state[nasModule].mcCustomContainerYaml, + mcKindsList: state[module].mcKindsList, + mcFileSystemKindsList: state[module].mcFileSystemKindsList, + mcURISchemesList: state[module].mcURISchemesList, + }; +}; + +export default connect(mapStateToProps, { + changeMCKindHP, + changeMCFileSystemHP, + addMCMetricsFormatHP, + changeMCMetricsFormatHP, + deleteMCMetricsFormatHP, + changeMCHttpGetHP, + addMCHttpGetHeaderHP, + changeMCHttpGetHeaderHP, + deleteMCHttpGetHeaderHP, + changeMCCustomContainerHP, + changeMCKindNAS, + changeMCFileSystemNAS, + addMCMetricsFormatNAS, + changeMCMetricsFormatNAS, + deleteMCMetricsFormatNAS, + changeMCHttpGetNAS, + addMCHttpGetHeaderNAS, + changeMCHttpGetHeaderNAS, + deleteMCHttpGetHeaderNAS, + changeMCCustomContainerNAS, +})(withStyles(styles)(MetricsCollectorSpec)); diff --git a/pkg/ui/v1beta1/frontend/src/components/Common/Create/TabPanel.jsx b/pkg/ui/v1beta1/frontend/src/components/Common/Create/TabPanel.jsx new file mode 100644 index 00000000000..18b4b974f76 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/Common/Create/TabPanel.jsx @@ -0,0 +1,81 @@ +import React from 'react'; + +import { withStyles } from '@material-ui/core/styles'; +import makeStyles from '@material-ui/styles/makeStyles'; +import Tabs from '@material-ui/core/Tabs'; +import Tab from '@material-ui/core/Tab'; + +import HPYAML from '../../HP/Create/YAML'; +import HPParameters from '../../HP/Create/HPParameters'; +import NASYAML from '../../NAS/Create/YAML'; +import NASParameters from '../../NAS/Create/NASParameters'; + +import * as constants from '../../../constants/constants'; + +const useStyles = makeStyles({ + root: { + marginTop: 40, + }, +}); + +const MyTabs = withStyles({ + root: { + borderBottom: '1px solid #e8e8e8', + marginBottom: 15, + }, + indicator: { + backgroundColor: '#1890ff', + }, +})(Tabs); + +const MyTab = withStyles(theme => ({ + root: { + textTransform: 'none', + marginRight: 40, + minWidth: 40, + fontWeight: theme.typography.fontWeightRegular, + fontSize: 14, + opacity: 1, + '&:hover': { + color: '#40a9ff', + }, + '&$selected': { + color: '#1890ff', + fontWeight: theme.typography.fontWeightMedium, + }, + '&:focus': { + color: '#1890ff', + }, + }, + selected: {}, +}))(props => ); + +const TabsPanel = props => { + const [tabIndex, setTabIndex] = React.useState(0); + + const onTabChange = (event, newIndex) => { + setTabIndex(newIndex); + }; + const classes = useStyles(); + return ( +
+ + + + + {props.match.path === constants.LINK_HP_CREATE ? ( + tabIndex === 0 ? ( + + ) : ( + + ) + ) : tabIndex === 0 ? ( + + ) : ( + + )} +
+ ); +}; + +export default TabsPanel; diff --git a/pkg/ui/v1beta1/frontend/src/components/Common/ExperimentInfoDialog.jsx b/pkg/ui/v1beta1/frontend/src/components/Common/ExperimentInfoDialog.jsx new file mode 100644 index 00000000000..9e4b8b9828b --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/Common/ExperimentInfoDialog.jsx @@ -0,0 +1,69 @@ +import React from 'react'; +import { connect } from 'react-redux'; + +import { withStyles } from '@material-ui/styles'; +import Dialog from '@material-ui/core/Dialog'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import DialogContent from '@material-ui/core/DialogContent'; + +import AceEditor from 'react-ace'; +import 'ace-builds/src-noconflict/theme-xcode'; +import 'ace-builds/src-noconflict/mode-json'; + +import { closeDialogExperiment } from '../../actions/generalActions'; + +const module = 'general'; + +const styles = theme => ({ + header: { + textAlign: 'center', + width: 900, + }, +}); + +const ExperimentInfoDialog = props => { + const { classes } = props; + + return ( + + + {props.experiment.metadata && props.experiment.metadata.name + ? 'Experiment ' + JSON.stringify(props.experiment.metadata.name, null, 2) + : ''} + + + + + + ); +}; + +const mapStateToProps = state => { + return { + dialogExperimentOpen: state[module].dialogExperimentOpen, + experiment: state[module].experiment, + }; +}; + +export default connect(mapStateToProps, { closeDialogExperiment })( + withStyles(styles)(ExperimentInfoDialog), +); diff --git a/pkg/ui/v1beta1/frontend/src/components/Common/SuggestionInfoDialog.jsx b/pkg/ui/v1beta1/frontend/src/components/Common/SuggestionInfoDialog.jsx new file mode 100644 index 00000000000..5b6614b80d5 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/Common/SuggestionInfoDialog.jsx @@ -0,0 +1,92 @@ +import React from 'react'; +import { connect } from 'react-redux'; + +import { withStyles } from '@material-ui/styles'; + +import AceEditor from 'react-ace'; +import 'ace-builds/src-noconflict/theme-xcode'; +import 'ace-builds/src-noconflict/mode-json'; + +import Dialog from '@material-ui/core/Dialog'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import DialogContent from '@material-ui/core/DialogContent'; + +import { closeDialogSuggestion } from '../../actions/generalActions'; + +const module = 'general'; + +const styles = theme => ({ + header: { + textAlign: 'center', + width: 900, + }, + aceMarker: { + position: 'absolute', + backgroundColor: '#FFFF00', + }, +}); + +const SuggestionStatusFailed = '"type": "Failed",'; + +const SuggestionInfoDialog = props => { + const { classes } = props; + + let markers = []; + let failedSuggestion = ''; + if (props.dialogSuggestionOpen) { + let jsonString = JSON.stringify(props.suggestion, null, 2); + let jsonSplit = jsonString.split(/\n/); + for (var i = jsonSplit.length - 1; i >= 0; i--) { + if (jsonSplit[i].trim() === SuggestionStatusFailed) { + markers.push({ + startRow: i - 1, + endRow: i + 7, + className: classes.aceMarker, + fullLine: true, + }); + failedSuggestion = ' failed, check conditions'; + break; + } + } + } + + return ( + + + {props.suggestion.metadata && props.suggestion.metadata.name + ? 'Suggestion ' + + JSON.stringify(props.suggestion.metadata.name, null, 2) + + failedSuggestion + : ''} + + + + + + ); +}; + +const mapStateToProps = state => { + return { + dialogSuggestionOpen: state[module].dialogSuggestionOpen, + suggestion: state[module].suggestion, + }; +}; + +export default connect(mapStateToProps, { closeDialogSuggestion })( + withStyles(styles)(SuggestionInfoDialog), +); diff --git a/pkg/ui/v1beta1/frontend/src/components/HP/Create/HPParameters.jsx b/pkg/ui/v1beta1/frontend/src/components/HP/Create/HPParameters.jsx new file mode 100644 index 00000000000..75401ed04dd --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/HP/Create/HPParameters.jsx @@ -0,0 +1,275 @@ +import React from 'react'; +import { connect } from 'react-redux'; + +import jsyaml from 'js-yaml'; + +import withStyles from '@material-ui/styles/withStyles'; +import Button from '@material-ui/core/Button'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; + +import CommonParametersMeta from './Params/CommonMeta'; +import CommonParametersSpec from './Params/CommonSpec'; +import Objective from './Params/Objective'; +import TrialSpecParam from './Params/Trial'; +import Parameters from './Params/Parameters'; +import Algorithm from './Params/Algorithm'; + +import { submitHPJob } from '../../../actions/hpCreateActions'; +import MetricsCollectorSpec from '../../Common/Create/Params/MetricsCollector'; + +import { validationError } from '../../../actions/generalActions'; +import * as constants from '../../../constants/constants'; + +const module = 'hpCreate'; +const generalModule = 'general'; + +const styles = theme => ({ + root: { + width: '90%', + margin: '0 auto', + }, + submit: { + textAlign: 'center', + marginTop: 10, + }, + textField: { + marginLeft: 4, + marginRight: 4, + width: '100%', + }, + help: { + padding: 4 / 2, + verticalAlign: 'middle', + }, + section: { + padding: 4, + }, + parameter: { + padding: 2, + }, + formControl: { + margin: 4, + width: '100%', + }, + selectEmpty: { + marginTop: 10, + }, + button: { + margin: 10, + }, +}); + +const SectionInTypography = (name, classes) => { + return ( +
+ + + {name} +
+
+
+
+ ); +}; + +// probably get render into a function +const deCapitalizeFirstLetterAndAppend = (source, destination) => { + source.map((parameter, i) => { + let value = Number(parameter.value); + let name = parameter.name.charAt(0).toLowerCase() + parameter.name.slice(1); + destination[name] = isNaN(value) ? parameter.value : value; + }); +}; + +const addAlgorithmSettings = (spec, destination) => { + spec.map((parameter, i) => { + destination.push(parameter); + }); +}; + +const addParameter = (source, destination) => { + source.map((param, i) => { + let tempParam = {}; + tempParam.name = param.name; + tempParam.parameterType = param.parameterType; + tempParam.feasibleSpace = {}; + if (param.feasibleSpace === 'list') { + tempParam.feasibleSpace.list = param.list.map((param, i) => param.value); + } else { + tempParam.feasibleSpace.min = param.min; + tempParam.feasibleSpace.max = param.max; + if (param.step != '') { + tempParam.feasibleSpace.step = param.step; + } + } + destination.push(tempParam); + }); +}; + +const HPParameters = props => { + const submitJob = () => { + let data = {}; + data.metadata = {}; + deCapitalizeFirstLetterAndAppend(props.commonParametersMetadata, data.metadata); + data.spec = {}; + deCapitalizeFirstLetterAndAppend(props.commonParametersSpec, data.spec); + data.spec.objective = {}; + deCapitalizeFirstLetterAndAppend(props.objective, data.spec.objective); + data.spec.objective.additionalMetricNames = props.additionalMetricNames.map( + (metrics, i) => metrics.value, + ); + + data.spec.algorithm = {}; + data.spec.algorithm.algorithmName = props.algorithmName; + data.spec.algorithm.algorithmSettings = []; + addAlgorithmSettings(props.algorithmSettings, data.spec.algorithm.algorithmSettings); + + data.spec.parameters = []; + addParameter(props.parameters, data.spec.parameters); + + // Metrics Collector + let newMCSpec = JSON.parse(JSON.stringify(props.mcSpec)); + + // Delete empty metrics format + if ( + newMCSpec.source.filter.metricsFormat.length === 0 || + newMCSpec.collector.kind === constants.MC_KIND_NONE + ) { + delete newMCSpec.source.filter; + } + + if ( + newMCSpec.collector.kind === constants.MC_KIND_STDOUT || + newMCSpec.collector.kind === constants.MC_KIND_NONE + ) { + // Delete fileSystemPath and httpGet + delete newMCSpec.source.fileSystemPath; + delete newMCSpec.source.httpGet; + } + + if ( + newMCSpec.collector.kind === constants.MC_KIND_FILE || + newMCSpec.collector.kind === constants.MC_KIND_TENSORFLOW_EVENT || + newMCSpec.collector.kind === constants.MC_KIND_CUSTOM + ) { + // Delete httpGet + delete newMCSpec.source.httpGet; + // Delete empty fileSystemPath + if (newMCSpec.source.fileSystemPath.kind === constants.MC_FILE_SYSTEM_NO_KIND) { + delete newMCSpec.source.fileSystemPath; + } + } + + if (newMCSpec.collector.kind === constants.MC_KIND_PROMETHEUS) { + // Delete file System Path + delete newMCSpec.source.fileSystemPath; + // Delete empty host + if (newMCSpec.source.httpGet.host === '') { + delete newMCSpec.source.httpGet.host; + } + // Delete empty headers + if (newMCSpec.source.httpGet.httpHeaders.length === 0) { + delete newMCSpec.source.httpGet.httpHeaders; + } + } + + // Delete empty source + if (newMCSpec.source != undefined && Object.keys(newMCSpec.source).length === 0) { + delete newMCSpec.source; + } + + // Add Custom Container YAML to the Metrics Collector + if ( + newMCSpec.collector.kind === constants.MC_KIND_CUSTOM && + props.mcCustomContainerYaml != '' + ) { + try { + let mcCustomContainerJson = jsyaml.load(props.mcCustomContainerYaml); + newMCSpec.collector.customCollector = mcCustomContainerJson; + } catch { + props.validationError('Metrics Collector Custom Container is not valid YAML!'); + return; + } + } + + data.spec.metricsCollectorSpec = newMCSpec; + + data.spec.trialTemplate = { + goTemplate: { + templateSpec: { + configMapName: props.templateConfigMapName, + configMapNamespace: props.templateNamespace, + templatePath: props.templateName, + }, + }, + }; + + props.submitHPJob(data); + }; + + const { classes } = props; + + return ( +
+ {/* Common Metadata */} + {SectionInTypography('Metadata', classes)} +
+ + {SectionInTypography('Common Parameters', classes)} + + {SectionInTypography('Objective', classes)} + + {SectionInTypography('Algorithm', classes)} + + + {SectionInTypography('Parameters', classes)} + + {SectionInTypography('Metrics Collector Spec', classes)} + + {SectionInTypography('Trial Spec', classes)} + + +
+ +
+
+ ); +}; + +// TODO: think of a better way of passing those +const mapStateToProps = state => ({ + commonParametersMetadata: state[module].commonParametersMetadata, + commonParametersSpec: state[module].commonParametersSpec, + objective: state[module].objective, + additionalMetricNames: state[module].additionalMetricNames, + algorithmName: state[module].algorithmName, + algorithmSettings: state[module].algorithmSettings, + parameters: state[module].parameters, + templateNamespace: state[generalModule].templateNamespace, + templateConfigMapName: state[generalModule].templateConfigMapName, + templateName: state[generalModule].templateName, + trial: state[module].trial, + trialNamespace: state[module].trialNamespace, + mcSpec: state[module].mcSpec, + mcCustomContainerYaml: state[module].mcCustomContainerYaml, +}); + +//TODO: Added validation and remove it +// HPParameters.propTypes = { +// trial: PropTypes.string, +// requestNumber: PropTypes.number, +// suggestionAlgorithm: PropTypes.string, +// metricsName: PropTypes.arrayOf(PropTypes.string), +// } + +export default connect(mapStateToProps, { submitHPJob, validationError })( + withStyles(styles)(HPParameters), +); diff --git a/pkg/ui/v1beta1/frontend/src/components/HP/Create/Params/Algorithm.jsx b/pkg/ui/v1beta1/frontend/src/components/HP/Create/Params/Algorithm.jsx new file mode 100644 index 00000000000..a6e3ebc6c7d --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/HP/Create/Params/Algorithm.jsx @@ -0,0 +1,170 @@ +import React from 'react'; +import makeStyles from '@material-ui/styles/makeStyles'; +import Button from '@material-ui/core/Button'; +import Grid from '@material-ui/core/Grid'; +import Tooltip from '@material-ui/core/Tooltip'; +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; +import Typography from '@material-ui/core/Typography'; +import OutlinedInput from '@material-ui/core/OutlinedInput'; +import MenuItem from '@material-ui/core/MenuItem'; +import FormControl from '@material-ui/core/FormControl'; +import Select from '@material-ui/core/Select'; +import InputLabel from '@material-ui/core/InputLabel'; +import TextField from '@material-ui/core/TextField'; +import IconButton from '@material-ui/core/IconButton'; + +import DeleteIcon from '@material-ui/icons/Delete'; + +import { connect } from 'react-redux'; +import { + changeAlgorithmName, + addAlgorithmSetting, + changeAlgorithmSetting, + deleteAlgorithmSetting, +} from '../../../../actions/hpCreateActions'; + +const module = 'hpCreate'; + +const useStyles = makeStyles({ + textField: { + marginLeft: 4, + marginRight: 4, + width: '80%', + }, + help: { + padding: 4 / 2, + verticalAlign: 'middle', + marginRight: 5, + }, + parameter: { + padding: 2, + marginBottom: 10, + }, + icon: { + padding: 4, + margin: '0 auto', + verticalAlign: 'middle !important', + }, + formControl: { + margin: 4, + width: '100%', + }, + addButton: { + margin: 10, + }, +}); + +const Algorithm = props => { + const classes = useStyles(); + + const onAlgorithmNameChange = event => { + props.changeAlgorithmName(event.target.value); + }; + + const onAddAlgorithmSetting = () => { + props.addAlgorithmSetting(); + }; + + const onChangeAlgorithmSetting = (name, index) => event => { + props.changeAlgorithmSetting(index, name, event.target.value); + }; + + const onDeleteAlgorithmSetting = index => event => { + props.deleteAlgorithmSetting(index); + }; + return ( +
+ +
+ + + + + + + {'Algorithm Name'} + + + + + Algorithm Name + + + + +
+
+ {props.algorithmSettings.map((param, i) => { + return ( +
+ + + + + + + + + + + + + + +
+ ); + })} +
+ ); +}; + +const mapStateToProps = state => { + return { + algorithmName: state[module].algorithmName, + allAlgorithms: state[module].allAlgorithms, + algorithmSettings: state[module].algorithmSettings, + }; +}; + +export default connect(mapStateToProps, { + changeAlgorithmName, + addAlgorithmSetting, + changeAlgorithmSetting, + deleteAlgorithmSetting, +})(Algorithm); diff --git a/pkg/ui/v1beta1/frontend/src/components/HP/Create/Params/CommonMeta.jsx b/pkg/ui/v1beta1/frontend/src/components/HP/Create/Params/CommonMeta.jsx new file mode 100644 index 00000000000..d4a0cfeb24c --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/HP/Create/Params/CommonMeta.jsx @@ -0,0 +1,95 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import Grid from '@material-ui/core/Grid'; +import Tooltip from '@material-ui/core/Tooltip'; +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; +import Typography from '@material-ui/core/Typography'; +import TextField from '@material-ui/core/TextField'; + +import { changeMeta } from '../../../../actions/hpCreateActions'; +import { withStyles } from '@material-ui/core'; + +const module = 'hpCreate'; +const generalModule = 'general'; + +const styles = () => ({ + textField: { + marginLeft: 4, + marginRight: 4, + width: '100%', + }, + help: { + padding: 4 / 2, + verticalAlign: 'middle', + marginRight: 5, + }, + parameter: { + padding: 2, + marginBottom: 10, + }, +}); + +class CommonParametersMeta extends React.Component { + componentDidMount() { + if (this.props.globalNamespace != '') { + this.props.changeMeta('Namespace', this.props.globalNamespace); + } + } + + onMetaChange = param => event => { + this.props.changeMeta(param, event.target.value); + }; + + render() { + const { classes } = this.props; + + return ( +
+ {this.props.commonParametersMetadata.map((param, i) => { + return ( +
+ + + + + + + {param.name} + + + + {param.name == 'Namespace' && this.props.globalNamespace == '' && ( + + )} + {param.name == 'Namespace' && this.props.globalNamespace != '' && ( + + )} + {param.name != 'Namespace' && ( + + )} + + +
+ ); + })} +
+ ); + } +} + +const mapStateToProps = state => { + return { + commonParametersMetadata: state[module].commonParametersMetadata, + globalNamespace: state[generalModule].globalNamespace, + }; +}; + +export default connect(mapStateToProps, { changeMeta })(withStyles(styles)(CommonParametersMeta)); diff --git a/pkg/ui/v1beta1/frontend/src/components/HP/Create/Params/CommonSpec.jsx b/pkg/ui/v1beta1/frontend/src/components/HP/Create/Params/CommonSpec.jsx new file mode 100644 index 00000000000..61ed545ff0c --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/HP/Create/Params/CommonSpec.jsx @@ -0,0 +1,73 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import makeStyles from '@material-ui/styles/makeStyles'; +import Grid from '@material-ui/core/Grid'; +import Tooltip from '@material-ui/core/Tooltip'; +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; +import Typography from '@material-ui/core/Typography'; +import TextField from '@material-ui/core/TextField'; + +import { changeSpec } from '../../../../actions/hpCreateActions'; + +const module = 'hpCreate'; + +const useStyles = makeStyles({ + textField: { + marginLeft: 4, + marginRight: 4, + width: '100%', + }, + help: { + padding: 4 / 2, + verticalAlign: 'middle', + marginRight: 5, + }, + parameter: { + padding: 2, + marginBottom: 10, + }, +}); + +const CommonParametersSpec = props => { + const classes = useStyles(); + + const onSpecChange = name => event => { + props.changeSpec(name, event.target.value); + }; + + return ( +
+ {props.commonParametersSpec.map((param, i) => { + return ( +
+ + + + + + + {param.name} + + + + + + +
+ ); + })} +
+ ); +}; + +const mapStateToProps = state => { + return { + commonParametersSpec: state[module].commonParametersSpec, + }; +}; + +export default connect(mapStateToProps, { changeSpec })(CommonParametersSpec); diff --git a/pkg/ui/v1beta1/frontend/src/components/HP/Create/Params/Objective.jsx b/pkg/ui/v1beta1/frontend/src/components/HP/Create/Params/Objective.jsx new file mode 100644 index 00000000000..fa131373416 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/HP/Create/Params/Objective.jsx @@ -0,0 +1,180 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import makeStyles from '@material-ui/styles/makeStyles'; +import Grid from '@material-ui/core/Grid'; +import Tooltip from '@material-ui/core/Tooltip'; +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; +import Typography from '@material-ui/core/Typography'; +import TextField from '@material-ui/core/TextField'; +import IconButton from '@material-ui/core/IconButton'; +import DeleteIcon from '@material-ui/icons/Delete'; +import Fab from '@material-ui/core/Fab'; +import AddIcon from '@material-ui/icons/Add'; +import FormControl from '@material-ui/core/FormControl'; +import Select from '@material-ui/core/Select'; +import InputLabel from '@material-ui/core/InputLabel'; +import OutlinedInput from '@material-ui/core/OutlinedInput'; +import MenuItem from '@material-ui/core/MenuItem'; + +import { + changeObjective, + addMetrics, + editMetrics, + deleteMetrics, +} from '../../../../actions/hpCreateActions'; + +const module = 'hpCreate'; + +const useStyles = makeStyles({ + textField: { + marginLeft: 4, + marginRight: 4, + width: '100%', + }, + help: { + padding: 4 / 2, + verticalAlign: 'middle', + marginRight: 5, + }, + parameter: { + padding: 2, + marginBottom: 10, + }, + selectBox: { + width: 150, + }, +}); + +const Objective = props => { + const classes = useStyles(); + + const onObjectiveChange = name => event => { + props.changeObjective(name, event.target.value); + }; + + const onMetricsEdit = index => event => { + props.editMetrics(index, event.target.value); + }; + + const onMetricsDelete = index => event => { + props.deleteMetrics(index); + }; + + return ( +
+ {props.objective.map((param, i) => { + return param.name === 'Type' ? ( +
+ + + + + + + {param.name} + + + + + Objective Type + + + + +
+ ) : ( +
+ + + + + + + {param.name} + + + + + + +
+ ); + })} +
+ + + + + + + AdditionalMetricNames + + + + {props.additionalMetricNames.map((metrics, mIndex) => { + return ( + + + + + + + + + + + ); + })} + + + + + + + +
+
+ ); +}; + +const mapStateToProps = state => { + return { + allObjectiveTypes: state[module].allObjectiveTypes, + objective: state[module].objective, + additionalMetricNames: state[module].additionalMetricNames, + }; +}; + +export default connect(mapStateToProps, { + changeObjective, + addMetrics, + editMetrics, + deleteMetrics, +})(Objective); diff --git a/pkg/ui/v1beta1/frontend/src/components/HP/Create/Params/Parameters.jsx b/pkg/ui/v1beta1/frontend/src/components/HP/Create/Params/Parameters.jsx new file mode 100644 index 00000000000..2e80e556221 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/HP/Create/Params/Parameters.jsx @@ -0,0 +1,242 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import makeStyles from '@material-ui/styles/makeStyles'; +import Button from '@material-ui/core/Button'; +import Grid from '@material-ui/core/Grid'; +import TextField from '@material-ui/core/TextField'; +import OutlinedInput from '@material-ui/core/OutlinedInput'; +import InputLabel from '@material-ui/core/InputLabel'; +import MenuItem from '@material-ui/core/MenuItem'; +import FormControl from '@material-ui/core/FormControl'; +import Select from '@material-ui/core/Select'; +import IconButton from '@material-ui/core/IconButton'; +import DeleteIcon from '@material-ui/icons/Delete'; +import Radio from '@material-ui/core/Radio'; +import RadioGroup from '@material-ui/core/RadioGroup'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import Divider from '@material-ui/core/Divider'; +import Fab from '@material-ui/core/Fab'; +import AddIcon from '@material-ui/icons/Add'; + +import { + addParameter, + editParameter, + deleteParameter, + addListParameter, + editListParameter, + deleteListParameter, +} from '../../../../actions/hpCreateActions'; + +const module = 'hpCreate'; + +const useStyles = makeStyles({ + textField: { + marginLeft: 4, + marginRight: 4, + width: '80%', + }, + help: { + padding: 4 / 2, + verticalAlign: 'middle', + marginRight: 5, + }, + parameter: { + padding: 2, + marginBottom: 10, + }, + formControl: { + margin: 4, + width: '100%', + }, + selectEmpty: { + marginTop: 10, + }, + group: { + flexDirection: 'row', + justifyContent: 'space-around', + }, + divider: { + margin: 5, + }, + addButton: { + margin: 10, + }, + fab: { + margin: 2, + }, +}); + +const Parameters = props => { + const classes = useStyles(); + + const onDelete = index => event => { + props.deleteParameter(index); + }; + + const onGeneralEdit = (index, field) => event => { + props.editParameter(index, field, event.target.value); + }; + + const onParamAdd = index => event => { + props.addListParameter(index); + }; + + const onParamEdit = (paramIndex, index) => event => { + props.editListParameter(paramIndex, index, event.target.value); + }; + + const onParamDelete = (paramIndex, index) => event => { + props.deleteListParameter(paramIndex, index); + }; + + return ( +
+ + {props.parameters.map((param, i) => { + return ( +
+ + + + + + + Parameter Type + + + + + + } + label="FeasibleSpace" + /> + } + label="List" + /> + + + + {param.feasibleSpace === 'list' && + param.list.map((element, elIndex) => { + return ( +
+ + + + +
+ ); + })} + {param.feasibleSpace === 'feasibleSpace' && ( +
+ + + {props.algorithmName === 'grid' && param.parameterType === 'double' && ( + + )} +
+ )} +
+ + {param.feasibleSpace === 'list' && ( + + + + )} + + + + + + +
+ +
+ ); + })} +
+ ); +}; + +const mapStateToProps = state => { + return { + parameters: state[module].parameters, + allParameterTypes: state[module].allParameterTypes, + algorithmName: state[module].algorithmName, + }; +}; + +export default connect(mapStateToProps, { + addParameter, + editParameter, + deleteParameter, + addListParameter, + editListParameter, + deleteListParameter, +})(Parameters); diff --git a/pkg/ui/v1beta1/frontend/src/components/HP/Create/Params/Trial.jsx b/pkg/ui/v1beta1/frontend/src/components/HP/Create/Params/Trial.jsx new file mode 100644 index 00000000000..4f038ba4ff0 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/HP/Create/Params/Trial.jsx @@ -0,0 +1,165 @@ +import React from 'react'; +import { connect } from 'react-redux'; + +import withStyles from '@material-ui/styles/withStyles'; +import Grid from '@material-ui/core/Grid'; +import Tooltip from '@material-ui/core/Tooltip'; +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; +import Typography from '@material-ui/core/Typography'; +import OutlinedInput from '@material-ui/core/OutlinedInput'; +import InputLabel from '@material-ui/core/InputLabel'; +import MenuItem from '@material-ui/core/MenuItem'; +import FormControl from '@material-ui/core/FormControl'; +import Select from '@material-ui/core/Select'; + +import { filterTemplatesExperiment, changeTemplateName } from '../../../../actions/generalActions'; +import { fetchTrialTemplates } from '../../../../actions/templateActions'; + +const module = 'hpCreate'; +const generalModule = 'general'; + +const styles = theme => ({ + help: { + padding: 4 / 2, + verticalAlign: 'middle', + marginRight: 5, + }, + section: { + padding: 4, + }, + parameter: { + padding: 2, + marginBottom: 10, + }, + trialForm: { + margin: 4, + width: '100%', + }, + selectForm: { + margin: 4, + width: '20%', + }, + selectNS: { + marginRight: 10, + }, +}); + +class TrialSpecParam extends React.Component { + componentDidMount() { + this.props.fetchTrialTemplates(); + } + + onTrialNamespaceChange = event => { + this.props.filterTemplatesExperiment(event.target.value, ''); + }; + + onTrialConfigMapChange = event => { + this.props.filterTemplatesExperiment(this.props.templateNamespace, event.target.value); + }; + + onTrialTemplateChange = event => { + this.props.changeTemplateName(event.target.value); + }; + + render() { + const { classes } = this.props; + return ( +
+
+ + + + + + + {'Namespace and ConfigMapName'} + + + + + Namespace + + + + ConfigMap + + + + +
+
+ + + + + + + {'Trial Template Name'} + + + + + Trial Template + + + + +
+
+ ); + } +} + +const mapStateToProps = state => { + return { + trialTemplatesList: state[generalModule].trialTemplatesList, + templateNamespace: state[generalModule].templateNamespace, + templateConfigMapName: state[generalModule].templateConfigMapName, + currentTemplateConfigMapsList: state[generalModule].currentTemplateConfigMapsList, + templateName: state[generalModule].templateName, + currentTemplateNamesList: state[generalModule].currentTemplateNamesList, + }; +}; + +export default connect(mapStateToProps, { + filterTemplatesExperiment, + changeTemplateName, + fetchTrialTemplates, +})(withStyles(styles)(TrialSpecParam)); diff --git a/pkg/ui/v1beta1/frontend/src/components/HP/Create/YAML.jsx b/pkg/ui/v1beta1/frontend/src/components/HP/Create/YAML.jsx new file mode 100644 index 00000000000..c897eb845f9 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/HP/Create/YAML.jsx @@ -0,0 +1,81 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import makeStyles from '@material-ui/styles/makeStyles'; + +import AceEditor from 'react-ace'; +import 'ace-builds/src-noconflict/theme-sqlserver'; +import 'ace-builds/src-noconflict/mode-yaml'; + +import Button from '@material-ui/core/Button'; +import Typography from '@material-ui/core/Typography'; + +import { changeYaml } from '../../../actions/hpCreateActions'; +import { submitYaml } from '../../../actions/generalActions'; + +const module = 'hpCreate'; +const generalModule = 'general'; + +const useStyles = makeStyles({ + editor: { + margin: '0 auto', + }, + submit: { + textAlign: 'center', + marginTop: 10, + }, + button: { + margin: 15, + }, +}); + +const YAML = props => { + const onYamlChange = value => { + props.changeYaml(value); + }; + + const submitWholeYaml = () => { + props.submitYaml(props.currentYaml, props.globalNamespace); + }; + + const classes = useStyles(); + return ( +
+ {'Generate'} +
+
+ +
+
+ +
+
+ ); +}; + +const mapStateToProps = state => { + return { + currentYaml: state[module].currentYaml, + globalNamespace: state[generalModule].globalNamespace, + }; +}; + +export default connect(mapStateToProps, { changeYaml, submitYaml })(YAML); diff --git a/pkg/ui/v1beta1/frontend/src/components/HP/Monitor/FilterPanel.jsx b/pkg/ui/v1beta1/frontend/src/components/HP/Monitor/FilterPanel.jsx new file mode 100644 index 00000000000..66880bb302b --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/HP/Monitor/FilterPanel.jsx @@ -0,0 +1,137 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import { withStyles } from '@material-ui/core/styles'; + +import TextField from '@material-ui/core/TextField'; +import FormGroup from '@material-ui/core/FormGroup'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import Switch from '@material-ui/core/Switch'; +import Button from '@material-ui/core/Button'; +import Select from '@material-ui/core/Select'; +import InputLabel from '@material-ui/core/InputLabel'; +import MenuItem from '@material-ui/core/MenuItem'; +import FormControl from '@material-ui/core/FormControl'; + +import { filterJobs, changeType, fetchHPJobs } from '../../../actions/hpMonitorActions'; +import { fetchNamespaces } from '../../../actions/generalActions'; + +const module = 'hpMonitor'; +const generalModule = 'general'; + +const styles = theme => ({ + textField: { + marginLeft: theme.spacing.unit, + marginRight: theme.spacing.unit, + }, + filter: { + margin: '0 auto', + textAlign: 'center', + }, + selectBox: { + marginLeft: theme.spacing.unit, + marginRight: theme.spacing.unit, + width: 200, + height: 56, + textAlign: 'left', + }, +}); + +class FilterPanel extends React.Component { + componentDidMount() { + if (this.props.globalNamespace != '') { + this.props.filterJobs(this.props.experimentName, this.props.globalNamespace); + } else { + this.props.fetchNamespaces(); + this.props.filterJobs(this.props.experimentName, this.props.experimentNamespace); + } + } + + handleType = name => event => { + this.props.changeType(name, event.target.checked); + }; + + onNameChange = event => { + this.props.filterJobs(event.target.value, this.props.experimentNamespace); + }; + + onNamespaceChange = event => { + this.props.filterJobs(this.props.experimentName, event.target.value); + }; + + render() { + const { classes } = this.props; + + return ( +
+ + + Namespace + {this.props.globalNamespace === '' ? ( + + ) : ( + + )} + + + {Object.keys(this.props.filterType).map((filter, i) => { + return ( + + } + label={filter} + /> + ); + })} + + +
+ ); + } +} + +const mapStateToProps = state => { + return { + experimentName: state[module].experimentName, + experimentNamespace: state[module].experimentNamespace, + filterType: state[module].filterType, + namespaces: state[generalModule].namespaces, + globalNamespace: state[generalModule].globalNamespace, + }; +}; + +export default connect(mapStateToProps, { filterJobs, changeType, fetchHPJobs, fetchNamespaces })( + withStyles(styles)(FilterPanel), +); diff --git a/pkg/ui/v1beta1/frontend/src/components/HP/Monitor/HPJobInfo.jsx b/pkg/ui/v1beta1/frontend/src/components/HP/Monitor/HPJobInfo.jsx new file mode 100644 index 00000000000..164d096d125 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/HP/Monitor/HPJobInfo.jsx @@ -0,0 +1,120 @@ +import React from 'react'; +import { connect } from 'react-redux'; + +import { withStyles } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; +import Button from '@material-ui/core/Button'; +import { Link } from 'react-router-dom'; +import LinearProgress from '@material-ui/core/LinearProgress'; +import Grid from '@material-ui/core/Grid'; + +import { fetchHPJobInfo } from '../../../actions/hpMonitorActions'; +import { fetchExperiment, fetchSuggestion } from '../../../actions/generalActions'; + +import HPJobPlot from './HPJobPlot'; +import HPJobTable from './HPJobTable'; +import TrialInfoDialog from './TrialInfoDialog'; +import ExperimentInfoDialog from '../../Common/ExperimentInfoDialog'; +import SuggestionInfoDialog from '../../Common/SuggestionInfoDialog'; + +const module = 'hpMonitor'; + +const styles = theme => ({ + root: { + width: '90%', + margin: '0 auto', + padding: 20, + }, + loading: { + marginTop: 30, + }, + header: { + marginTop: 10, + textAlign: 'center', + marginBottom: 15, + }, + link: { + textDecoration: 'none', + }, + grid: { + marginBottom: 10, + }, +}); + +class HPJobInfo extends React.Component { + componentDidMount() { + this.props.fetchHPJobInfo(this.props.match.params.name, this.props.match.params.namespace); + } + + fetchAndOpenDialogExperiment = (experimentName, experimentNamespace) => event => { + this.props.fetchExperiment(experimentName, experimentNamespace); + }; + + fetchAndOpenDialogSuggestion = (suggestionName, suggestionNamespace) => event => { + this.props.fetchSuggestion(suggestionName, suggestionNamespace); + }; + + render() { + const { classes } = this.props; + return ( +
+ + + + {this.props.loading ? ( + + ) : ( +
+ + Experiment Name: {this.props.match.params.name} + + + Experiment Namespace: {this.props.match.params.namespace} + + + + + + + + + + + + + + +
+ )} +
+ ); + } +} + +const mapStateToProps = state => ({ + loading: state[module].loading, +}); + +export default connect(mapStateToProps, { fetchHPJobInfo, fetchExperiment, fetchSuggestion })( + withStyles(styles)(HPJobInfo), +); diff --git a/pkg/ui/v1beta1/frontend/src/components/HP/Monitor/HPJobList.jsx b/pkg/ui/v1beta1/frontend/src/components/HP/Monitor/HPJobList.jsx new file mode 100644 index 00000000000..adbdd079415 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/HP/Monitor/HPJobList.jsx @@ -0,0 +1,98 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import { withStyles } from '@material-ui/core/styles'; +import List from '@material-ui/core/List'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; +import { Link } from 'react-router-dom'; +import { ListItemSecondaryAction, IconButton } from '@material-ui/core'; + +import { openDeleteExperimentDialog } from '../../../actions/generalActions'; +import DeleteDialog from '../../Menu/DeleteDialog'; + +import ScheduleIcon from '@material-ui/icons/Schedule'; +import RestoreIcon from '@material-ui/icons/Restore'; +import HighlightOffIcon from '@material-ui/icons/HighlightOff'; +import DoneIcon from '@material-ui/icons/Done'; +import DeleteIcon from '@material-ui/icons/Delete'; +import HourglassFullIcon from '@material-ui/icons/HourglassFull'; + +const module = 'hpMonitor'; + +const styles = theme => ({ + created: { + color: theme.colors.created, + }, + running: { + color: theme.colors.running, + }, + restarting: { + color: theme.colors.restarting, + }, + succeeded: { + color: theme.colors.succeeded, + }, + failed: { + color: theme.colors.failed, + }, +}); + +const HPJobList = props => { + const { classes } = props; + + const onDeleteExperiment = (name, namespace) => event => { + props.openDeleteExperimentDialog(name, namespace); + }; + + return ( +
+ + {props.filteredJobsList.map((job, i) => { + let icon; + if (job.status === 'Created') { + icon = ; + } else if (job.status === 'Running') { + icon = ; + } else if (job.status === 'Restarting') { + icon = ; + } else if (job.status === 'Succeeded') { + icon = ; + } else if (job.status === 'Failed') { + icon = ; + } + return ( + + {icon} + + + + + + + + ); + })} + + +
+ ); +}; + +const mapStateToProps = state => { + return { + filteredJobsList: state[module].filteredJobsList, + }; +}; + +export default connect(mapStateToProps, { openDeleteExperimentDialog })( + withStyles(styles)(HPJobList), +); diff --git a/pkg/ui/v1beta1/frontend/src/components/HP/Monitor/HPJobMonitor.jsx b/pkg/ui/v1beta1/frontend/src/components/HP/Monitor/HPJobMonitor.jsx new file mode 100644 index 00000000000..7c197d925a4 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/HP/Monitor/HPJobMonitor.jsx @@ -0,0 +1,43 @@ +import React from 'react'; +import { connect } from 'react-redux'; + +import { withStyles } from '@material-ui/core/styles'; +import Typography from '@material-ui/core/Typography'; + +import FilterPanel from './FilterPanel'; +import HPJobList from './HPJobList'; + +import { fetchHPJobs } from '../../../actions/hpMonitorActions'; + +const styles = theme => ({ + root: { + width: '90%', + margin: '0 auto', + marginTop: 10, + }, + text: { + marginBottom: 20, + }, +}); + +class HPJobMonitor extends React.Component { + componentDidMount() { + this.props.fetchHPJobs(); + } + + render() { + const { classes } = this.props; + + return ( +
+ + {'Experiment Monitor'} + + + +
+ ); + } +} + +export default connect(null, { fetchHPJobs })(withStyles(styles)(HPJobMonitor)); diff --git a/pkg/ui/v1beta1/frontend/src/components/HP/Monitor/HPJobPlot.jsx b/pkg/ui/v1beta1/frontend/src/components/HP/Monitor/HPJobPlot.jsx new file mode 100644 index 00000000000..2e5d8f1a62f --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/HP/Monitor/HPJobPlot.jsx @@ -0,0 +1,97 @@ +import React from 'react'; +import makeStyles from '@material-ui/styles/makeStyles'; + +import { connect } from 'react-redux'; +import Plot from 'react-plotly.js'; + +const module = 'hpMonitor'; + +const useStyles = makeStyles({ + root: { + textAlign: 'center', + }, +}); + +const HPJobPlot = props => { + const classes = useStyles(); + let dimensions = []; + let isShowPlot = false; + + if (props.jobData && props.jobData.length > 1) { + // everything for the third column + let header = props.jobData[0]; + let data = props.jobData.slice(1); + for (let i = 2; i < data[0].length; i++) { + if (header[i] !== '') { + let track = { + label: header[i], + }; + let flag = 'number'; + let values = []; + for (let j = 0; j < data.length; j++) { + if (data[j][1] == 'Succeeded') { + isShowPlot = true; + let number = Number(data[j][i]); + if (isNaN(number)) { + flag = 'string'; + values.push(data[j][i]); + } else { + values.push(number); + } + } + } + track.values = values; + if (flag === 'number' && flag !== 'string') { + track.range = [Math.min.apply(null, values), Math.max.apply(null, values)]; + if (Math.min.apply(null, values) < 1) { + track.tickformat = '.3f'; + } else { + track.tickformat = 'd'; + } + } else { + // check logic + // track.ticktext = values; + let options = new Set(values); + options = [...options]; + let mapping = {}; + for (let k = 0; k < options.length; k++) { + mapping[options[k]] = k; + } + track.tickvals = options.map((option, index) => index); + track.ticktext = options.map((option, index) => option); + track.values = values.map((value, index) => mapping[value]); + track.constraintrange = [0, values.length]; + } + dimensions.push(track); + } + } + } + + return ( +
+ {props.jobData.length > 1 && isShowPlot && ( + + )} +
+ ); +}; + +const mapStateToProps = state => ({ + jobData: state[module].jobData, +}); + +export default connect(mapStateToProps, null)(HPJobPlot); diff --git a/pkg/ui/v1beta1/frontend/src/components/HP/Monitor/HPJobTable.jsx b/pkg/ui/v1beta1/frontend/src/components/HP/Monitor/HPJobTable.jsx new file mode 100644 index 00000000000..d41a5db98b1 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/HP/Monitor/HPJobTable.jsx @@ -0,0 +1,127 @@ +import React from 'react'; +import { withStyles } from '@material-ui/core/styles'; +import Table from '@material-ui/core/Table'; +import TableBody from '@material-ui/core/TableBody'; +import TableCell from '@material-ui/core/TableCell'; +import TableHead from '@material-ui/core/TableHead'; +import TableRow from '@material-ui/core/TableRow'; +import Paper from '@material-ui/core/Paper'; + +import { connect } from 'react-redux'; +import { fetchHPJobTrialInfo } from '../../../actions/hpMonitorActions'; + +const module = 'hpMonitor'; + +const styles = theme => ({ + root: { + width: '100%', + marginTop: theme.spacing.unit * 3, + overflowX: 'auto', + }, + table: { + minWidth: 700, + }, + hover: { + '&:hover': { + cursor: 'pointer', + }, + }, + created: { + color: theme.colors.created, + }, + running: { + color: theme.colors.running, + }, + succeeded: { + color: theme.colors.succeeded, + }, + killed: { + color: theme.colors.killed, + }, + failed: { + color: theme.colors.failed, + }, +}); + +class HPJobTable extends React.Component { + fetchAndOpenDialogTrial = trialName => event => { + this.props.fetchHPJobTrialInfo(trialName, this.props.namespace); + }; + + render() { + const { classes } = this.props; + + let header = []; + let data = []; + if (this.props.jobData && this.props.jobData.length > 1) { + header = this.props.jobData[0]; + // TODO: Add sorting by each table column + // Sort jobData by Trial Status + data = this.props.jobData.slice(1).sort(function(a, b) { + if (a[1] < b[1]) { + return -1; + } + if (a[1] > b[1]) { + return 1; + } + return 0; + }); + } + return ( + + {this.props.jobData.length > 1 && ( + + + + {header.map(header => ( + {header} + ))} + + + + {data.map((row, id) => ( + + {row.map((element, index) => { + if (index === 0 && row[1] == 'Succeeded') { + return ( + + {element} + + ); + } else if (index === 1) { + if (element === 'Created') { + return {element}; + } else if (element === 'Running') { + return {element}; + } else if (element === 'Succeeded') { + return {element}; + } else if (element === 'Killed') { + return {element}; + } else if (element === 'Failed') { + return {element}; + } + } else { + return {element}; + } + })} + + ))} + +
+ )} +
+ ); + } +} + +const mapStateToProps = state => ({ + jobData: state[module].jobData, +}); + +export default connect(mapStateToProps, { fetchHPJobTrialInfo })(withStyles(styles)(HPJobTable)); diff --git a/pkg/ui/v1beta1/frontend/src/components/HP/Monitor/TrialInfoDialog.jsx b/pkg/ui/v1beta1/frontend/src/components/HP/Monitor/TrialInfoDialog.jsx new file mode 100644 index 00000000000..64837c2b8e5 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/HP/Monitor/TrialInfoDialog.jsx @@ -0,0 +1,94 @@ +import React from 'react'; +import { withStyles } from '@material-ui/styles'; +import Dialog from '@material-ui/core/Dialog'; +import DialogContent from '@material-ui/core/DialogContent'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import { connect } from 'react-redux'; + +import { closeDialogTrial } from '../../../actions/hpMonitorActions'; +import Plot from 'react-plotly.js'; + +const module = 'hpMonitor'; + +const styles = theme => ({ + header: { + textAlign: 'center', + }, +}); + +const TrialInfoDialog = props => { + const { classes } = props; + + let dataToPlot = []; + if (props.trialData.length !== 0) { + let data = props.trialData.slice(1); + let tracks = {}; + for (let i = 0; i < data.length; i++) { + // Data format should be ["metricName", "time", "value"] + if (data[i].length == 3) { + if (typeof tracks[data[i][0]] !== 'undefined') { + tracks[data[i][0]].x.push(data[i][1]); + tracks[data[i][0]].y.push(Number(data[i][2])); + } else { + tracks[data[i][0]] = {}; + tracks[data[i][0]].x = [data[i][1]]; + tracks[data[i][0]].y = [Number(data[i][2])]; + } + } + } + + //For plot legend + let keys = Object.keys(tracks); + keys.map((key, i) => { + if (key !== '') { + dataToPlot.push({ + x: tracks[key].x, + y: tracks[key].y, + type: 'scatter', + mode: 'line', + name: key, + showlegend: true, + hoverinfo: 'x+y', + }); + } + }); + } + return ( + + + {'Trial Name: ' + props.trialName} + + + + + + ); +}; + +const mapStateToProps = state => { + return { + open: state[module].dialogTrialOpen, + trialData: state[module].trialData, + trialName: state[module].trialName, + }; +}; + +export default connect(mapStateToProps, { closeDialogTrial })(withStyles(styles)(TrialInfoDialog)); diff --git a/pkg/ui/v1beta1/frontend/src/components/KubeflowDashboard.jsx b/pkg/ui/v1beta1/frontend/src/components/KubeflowDashboard.jsx new file mode 100644 index 00000000000..bb51b6870d1 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/KubeflowDashboard.jsx @@ -0,0 +1,34 @@ +import React from 'react'; +import { CHANGE_GLOBAL_NAMESPACE } from '../actions/generalActions'; +import generalReducer from '../reducers/general'; + +// TODO: Think about better way of update namespace +// Right now, after updating namespace in select list +// user must go to Kubeflow dashboard home page to update Global Namespace in Katib UI +function onGlobalNamespaceChange(namespace) { + generalReducer(undefined, { type: CHANGE_GLOBAL_NAMESPACE, globalNamespace: namespace }); +} + +class KubeflowDashboard extends React.Component { + componentDidMount() { + window.addEventListener('DOMContentLoaded', function(event) { + if (window.centraldashboard && window.centraldashboard.CentralDashboardEventHandler) { + // Init method will invoke the callback with the event handler instance + // and a boolean indicating whether the page is iframed or not + window.centraldashboard.CentralDashboardEventHandler.init(function(cdeh) { + // Binds a callback that gets invoked anytime the Dashboard's + // namespace is changed + cdeh.onNamespaceSelected = namespace => { + onGlobalNamespaceChange(namespace); + }; + }); + } + }); + } + + render() { + return
; + } +} + +export default KubeflowDashboard; diff --git a/pkg/ui/v1beta1/frontend/src/components/Menu/DeleteDialog.jsx b/pkg/ui/v1beta1/frontend/src/components/Menu/DeleteDialog.jsx new file mode 100644 index 00000000000..23a91759420 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/Menu/DeleteDialog.jsx @@ -0,0 +1,59 @@ +import React from 'react'; +import Button from '@material-ui/core/Button'; +import Dialog from '@material-ui/core/Dialog'; +import DialogActions from '@material-ui/core/DialogActions'; +import DialogContent from '@material-ui/core/DialogContent'; +import DialogContentText from '@material-ui/core/DialogContentText'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import makeStyles from '@material-ui/styles/makeStyles'; + +import { connect } from 'react-redux'; +import { deleteExperiment, closeDeleteExperimentDialog } from '../../actions/generalActions'; + +const module = 'general'; + +const useStyles = makeStyles({ + root: {}, +}); + +const DeleteDialog = props => { + const classes = useStyles(); + + const onDelete = () => { + props.deleteExperiment(props.deleteExperimentName, props.deleteExperimentNamespace); + }; + + return ( + + {'Delete Experiment?'} + + + Are you sure you want to delete this experiment? + + + + + + + + ); +}; + +const mapStateToProps = state => ({ + open: state[module].deleteDialog, + deleteExperimentName: state[module].deleteExperimentName, + deleteExperimentNamespace: state[module].deleteExperimentNamespace, +}); + +export default connect(mapStateToProps, { closeDeleteExperimentDialog, deleteExperiment })( + DeleteDialog, +); diff --git a/pkg/ui/v1beta1/frontend/src/components/Menu/Header.jsx b/pkg/ui/v1beta1/frontend/src/components/Menu/Header.jsx new file mode 100644 index 00000000000..6bbd813887a --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/Menu/Header.jsx @@ -0,0 +1,63 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import { Link } from 'react-router-dom'; + +import makeStyles from '@material-ui/styles/makeStyles'; +import { withStyles } from '@material-ui/core/styles'; + +import AppBar from '@material-ui/core/AppBar'; +import Toolbar from '@material-ui/core/Toolbar'; +import Typography from '@material-ui/core/Typography'; +import IconButton from '@material-ui/core/IconButton'; +import MenuIcon from '@material-ui/icons/Menu'; + +import Menu from './Menu'; + +import { toggleMenu } from '../../actions/generalActions'; + +const useStyles = makeStyles({ + menuButton: { + marginLeft: -12, + marginRight: 20, + }, +}); + +const KatibLink = withStyles({ + root: { + textDecoration: 'none', + '&:hover': { + color: '#40a9ff', + }, + }, +})(Typography); + +const Header = props => { + const classes = useStyles(); + + const toggleMenu = event => { + props.toggleMenu(true); + }; + + return ( +
+ + + + + + + Katib + + + + +
+ ); +}; + +export default connect(null, { toggleMenu })(Header); diff --git a/pkg/ui/v1beta1/frontend/src/components/Menu/Main.jsx b/pkg/ui/v1beta1/frontend/src/components/Menu/Main.jsx new file mode 100644 index 00000000000..39fd6ee30ca --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/Menu/Main.jsx @@ -0,0 +1,84 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; + +import { makeStyles } from '@material-ui/styles'; +import Paper from '@material-ui/core/Paper'; +import Typography from '@material-ui/core/Typography'; +import Grid from '@material-ui/core/Grid'; + +import * as constants from '../../constants/constants'; + +const useStyles = makeStyles({ + root: { + margin: '0 auto', + marginTop: 50, + flexGrow: 1, + width: '50%', + height: 400, + textAlign: 'center', + }, + item: { + padding: '40px !important', + textDecoration: 'none !important', + }, + block: { + backgroundColor: '#4e4e4e', + height: '100%', + width: '100%', + padding: 40, + '&:hover': { + backgroundColor: 'black', + }, + }, + link: { + textDecoration: 'none', + color: '#1890ff', + }, +}); + +const Main = props => { + const classes = useStyles(); + + return ( + + Welcome to Katib + Choose type of experiment +
+ + + + + Hyperparameter Tuning + + + + + + + Neural Architecture Search + + + + +
+ + For usage instructions, see the{' '} +
+ Kubeflow docs + + + + To contribute to Katib, visit{' '} + + GitHub + + + + ); +}; + +export default Main; diff --git a/pkg/ui/v1beta1/frontend/src/components/Menu/Menu.jsx b/pkg/ui/v1beta1/frontend/src/components/Menu/Menu.jsx new file mode 100644 index 00000000000..8b76a801467 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/Menu/Menu.jsx @@ -0,0 +1,184 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import { Link } from 'react-router-dom'; + +import makeStyles from '@material-ui/styles/makeStyles'; +import Drawer from '@material-ui/core/Drawer'; +import List from '@material-ui/core/List'; +import Typography from '@material-ui/core/Typography'; +import Divider from '@material-ui/core/Divider'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; +import Collapse from '@material-ui/core/Collapse'; +import TuneIcon from '@material-ui/icons/Tune'; +import NoteAddIcon from '@material-ui/icons/NoteAdd'; +import WatchLaterIcon from '@material-ui/icons/WatchLater'; +import SearchIcon from '@material-ui/icons/Search'; +import SettingsIcon from '@material-ui/icons/Settings'; +import ExpandLess from '@material-ui/icons/ExpandLess'; +import ExpandMore from '@material-ui/icons/ExpandMore'; +import InfoIcon from '@material-ui/icons/Info'; + +import { toggleMenu } from '../../actions/generalActions'; + +const module = 'general'; + +const useStyles = makeStyles({ + list: { + width: 250, + }, + nested: { + paddingLeft: 10 * 4, + }, +}); + +const Menu = props => { + const [hp, setHP] = React.useState(false); + const [nas, setNAS] = React.useState(false); + + const toggleHP = () => { + setHP(!hp); + }; + + const toggleNAS = () => { + setNAS(!nas); + }; + + const classes = useStyles(); + + const onCloseMenu = () => { + props.toggleMenu(false); + }; + + // Add links + const color = 'primary'; + const iconColor = 'primary'; + const variant = 'title'; + return ( +
+ + + {/* HP */} + + + + + + + HP + + + {hp ? : } + + + + + + + + + + Submit + + + + + + + + + + Monitor + + + + + + + {/* NAS */} + + + + + + + NAS + + + {hp ? : } + + + + + + + + + + Submit + + + + + + + + + + Monitor + + + + + + + {/* TRIAL MANIFESTS */} + + + + + + + Trial Manifests + + + + + + +
+ ); +}; + +const mapStateToProps = state => { + return { + menuOpen: state[module].menuOpen, + }; +}; + +export default connect(mapStateToProps, { toggleMenu })(Menu); diff --git a/pkg/ui/v1beta1/frontend/src/components/Menu/Snack.jsx b/pkg/ui/v1beta1/frontend/src/components/Menu/Snack.jsx new file mode 100644 index 00000000000..474a52dee6f --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/Menu/Snack.jsx @@ -0,0 +1,59 @@ +import React from 'react'; +import makeStyles from '@material-ui/styles/makeStyles'; +import Snackbar from '@material-ui/core/Snackbar'; +import IconButton from '@material-ui/core/IconButton'; + +import CloseIcon from '@material-ui/icons/Close'; + +import { connect } from 'react-redux'; +import { closeSnackbar } from '../../actions/generalActions'; + +const module = 'general'; + +const useStyles = makeStyles({ + close: { + padding: 4, + }, +}); + +const Snack = props => { + const classes = useStyles(); + + const vertical = 'top'; + const horizontal = 'center'; + return ( + {props.snackText}} + action={[ + + + , + ]} + /> + ); +}; + +const mapStateToProps = state => { + return { + snackText: state[module].snackText, + snackOpen: state[module].snackOpen, + }; +}; + +export default connect(mapStateToProps, { closeSnackbar })(Snack); diff --git a/pkg/ui/v1beta1/frontend/src/components/NAS/Create/NASParameters.jsx b/pkg/ui/v1beta1/frontend/src/components/NAS/Create/NASParameters.jsx new file mode 100644 index 00000000000..2b723d9bc25 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/NAS/Create/NASParameters.jsx @@ -0,0 +1,290 @@ +import React from 'react'; +import { connect } from 'react-redux'; + +import jsyaml from 'js-yaml'; + +import withStyles from '@material-ui/styles/withStyles'; +import Button from '@material-ui/core/Button'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; + +import CommonParametersMeta from './Params/CommonMeta'; +import CommonParametersSpec from './Params/CommonSpec'; +import Objective from './Params/Objective'; +import Algorithm from './Params/Algorithm'; +import TrialSpecParam from './Params/Trial'; +import NASConfig from './Params/NASConfig'; + +import { submitNASJob } from '../../../actions/nasCreateActions'; +import MetricsCollectorSpec from '../../Common/Create/Params/MetricsCollector'; + +import { validationError } from '../../../actions/generalActions'; +import * as constants from '../../../constants/constants'; + +const module = 'nasCreate'; +const generalModule = 'general'; + +const styles = theme => ({ + root: { + width: '90%', + margin: '0 auto', + }, + submit: { + textAlign: 'center', + marginTop: 10, + }, + textField: { + marginLeft: 4, + marginRight: 4, + width: '100%', + }, + help: { + padding: 4 / 2, + verticalAlign: 'middle', + }, + section: { + padding: 4, + }, + parameter: { + padding: 2, + }, + formControl: { + margin: 4, + width: '100%', + }, + selectEmpty: { + marginTop: 10, + }, + addButton: { + margin: 10, + }, +}); + +const SectionInTypography = (name, classes) => { + return ( +
+ + + {name} +
+
+
+
+ ); +}; + +// probably get render into a function +const deCapitalizeFirstLetterAndAppend = (source, destination) => { + source.map((parameter, i) => { + let value = Number(parameter.value); + let name = parameter.name.charAt(0).toLowerCase() + parameter.name.slice(1); + destination[name] = isNaN(value) ? parameter.value : value; + }); +}; + +const addAlgorithmSettings = (spec, destination) => { + spec.map((parameter, i) => { + destination.push(parameter); + }); +}; + +const addOperations = (source, destination) => { + source.map((operation, index) => { + let parameters = []; + operation.parameters.map((param, i) => { + let tempParam = {}; + tempParam.name = param.name; + tempParam.parametertype = param.parameterType; + tempParam.feasibleSpace = {}; + if (param.feasibleSpace === 'list') { + tempParam.feasibleSpace.list = param.list.map((param, i) => param.value); + } else { + tempParam.feasibleSpace.min = param.min; + tempParam.feasibleSpace.max = param.max; + tempParam.feasibleSpace.step = param.step; + } + parameters.push(tempParam); + }); + destination.push({ + operationType: operation.operationType, + parameters: parameters, + }); + }); +}; + +const NASParameters = props => { + const submitNASJob = () => { + let data = {}; + + data.metadata = {}; + deCapitalizeFirstLetterAndAppend(props.commonParametersMetadata, data.metadata); + + data.spec = {}; + deCapitalizeFirstLetterAndAppend(props.commonParametersSpec, data.spec); + + data.spec.objective = {}; + deCapitalizeFirstLetterAndAppend(props.objective, data.spec.objective); + data.spec.objective.additionalMetricNames = props.additionalMetricNames.map( + (metrics, i) => metrics.value, + ); + + data.spec.algorithm = {}; + data.spec.algorithm.algorithmName = props.algorithmName; + data.spec.algorithm.algorithmSettings = []; + addAlgorithmSettings(props.algorithmSettings, data.spec.algorithm.algorithmSettings); + + data.spec.nasConfig = {}; + data.spec.nasConfig.graphConfig = { + numLayers: Number(props.numLayers), + inputSizes: props.inputSize.map(size => Number(size)), + outputSizes: props.outputSize.map(size => Number(size)), + }; + data.spec.nasConfig.operations = []; + addOperations(props.operations, data.spec.nasConfig.operations); + + // Metrics Collector + let newMCSpec = JSON.parse(JSON.stringify(props.mcSpec)); + + // Delete empty metrics format + if ( + newMCSpec.source.filter.metricsFormat.length === 0 || + newMCSpec.collector.kind === constants.MC_KIND_NONE + ) { + delete newMCSpec.source.filter; + } + + if ( + newMCSpec.collector.kind === constants.MC_KIND_STDOUT || + newMCSpec.collector.kind === constants.MC_KIND_NONE + ) { + // Delete fileSystemPath and httpGet + delete newMCSpec.source.fileSystemPath; + delete newMCSpec.source.httpGet; + } + + if ( + newMCSpec.collector.kind === constants.MC_KIND_FILE || + newMCSpec.collector.kind === constants.MC_KIND_TENSORFLOW_EVENT || + newMCSpec.collector.kind === constants.MC_KIND_CUSTOM + ) { + // Delete httpGet + delete newMCSpec.source.httpGet; + // Delete empty fileSystemPath + if (newMCSpec.source.fileSystemPath.kind === constants.MC_FILE_SYSTEM_NO_KIND) { + delete newMCSpec.source.fileSystemPath; + } + } + + if (newMCSpec.collector.kind === constants.MC_KIND_PROMETHEUS) { + // Delete file System Path + delete newMCSpec.source.fileSystemPath; + // Delete empty host + if (newMCSpec.source.httpGet.host === '') { + delete newMCSpec.source.httpGet.host; + } + // Delete empty headers + if (newMCSpec.source.httpGet.httpHeaders.length === 0) { + delete newMCSpec.source.httpGet.httpHeaders; + } + } + + // Delete empty source + if (newMCSpec.source != undefined && Object.keys(newMCSpec.source).length === 0) { + delete newMCSpec.source; + } + + // Add Custom Container YAML to the Metrics Collector + if ( + newMCSpec.collector.kind === constants.MC_KIND_CUSTOM && + props.mcCustomContainerYaml != '' + ) { + try { + let mcCustomContainerJson = jsyaml.load(props.mcCustomContainerYaml); + newMCSpec.collector.customCollector = mcCustomContainerJson; + } catch { + props.validationError('Metrics Collector Custom Container is not valid YAML!'); + return; + } + } + + data.spec.metricsCollectorSpec = newMCSpec; + + data.spec.trialTemplate = { + goTemplate: { + templateSpec: { + configMapName: props.templateConfigMapName, + configMapNamespace: props.templateNamespace, + templatePath: props.templateName, + }, + }, + }; + + props.submitNASJob(data); + }; + + const { classes } = props; + + return ( +
+ {/* Common Metadata */} + {SectionInTypography('Metadata', classes)} + + {SectionInTypography('Common Parameters', classes)} + + {SectionInTypography('Objective', classes)} + + {SectionInTypography('Algorithm', classes)} + + {SectionInTypography('NAS Config', classes)} + + {SectionInTypography('Metrics Collector Spec', classes)} + + {SectionInTypography('Trial Spec', classes)} + +
+ +
+
+ ); +}; + +// TODO: think of a better way of passing those +const mapStateToProps = state => ({ + commonParametersMetadata: state[module].commonParametersMetadata, + commonParametersSpec: state[module].commonParametersSpec, + objective: state[module].objective, + additionalMetricNames: state[module].additionalMetricNames, + algorithmName: state[module].algorithmName, + algorithmSettings: state[module].algorithmSettings, + numLayers: state[module].numLayers, + inputSize: state[module].inputSize, + outputSize: state[module].outputSize, + operations: state[module].operations, + templateNamespace: state[generalModule].templateNamespace, + templateConfigMapName: state[generalModule].templateConfigMapName, + templateName: state[generalModule].templateName, + trial: state[module].trial, + trialNamespace: state[module].trialNamespace, + mcSpec: state[module].mcSpec, + mcCustomContainerYaml: state[module].mcCustomContainerYaml, +}); + +//TODO: Added validation and remove it +// NASParameters.propTypes = { +// numLayers: PropTypes.number, +// trial: PropTypes.string, +// requestNumber: PropTypes.number, +// suggestionAlgorithm: PropTypes.string, +// metricsName: PropTypes.arrayOf(PropTypes.string), +// } + +export default connect(mapStateToProps, { submitNASJob, validationError })( + withStyles(styles)(NASParameters), +); diff --git a/pkg/ui/v1beta1/frontend/src/components/NAS/Create/Params/Algorithm.jsx b/pkg/ui/v1beta1/frontend/src/components/NAS/Create/Params/Algorithm.jsx new file mode 100644 index 00000000000..c54dfeaa2b3 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/NAS/Create/Params/Algorithm.jsx @@ -0,0 +1,171 @@ +import React from 'react'; +import makeStyles from '@material-ui/styles/makeStyles'; +import Button from '@material-ui/core/Button'; +import Grid from '@material-ui/core/Grid'; +import Tooltip from '@material-ui/core/Tooltip'; +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; +import Typography from '@material-ui/core/Typography'; +import OutlinedInput from '@material-ui/core/OutlinedInput'; +import MenuItem from '@material-ui/core/MenuItem'; +import FormControl from '@material-ui/core/FormControl'; +import Select from '@material-ui/core/Select'; +import InputLabel from '@material-ui/core/InputLabel'; +import TextField from '@material-ui/core/TextField'; +import IconButton from '@material-ui/core/IconButton'; + +import DeleteIcon from '@material-ui/icons/Delete'; + +import { connect } from 'react-redux'; +import { + changeAlgorithmName, + addAlgorithmSetting, + changeAlgorithmSetting, + deleteAlgorithmSetting, +} from '../../../../actions/nasCreateActions'; + +const module = 'nasCreate'; + +const useStyles = makeStyles({ + textField: { + marginLeft: 4, + marginRight: 4, + width: '80%', + }, + help: { + padding: 4 / 2, + verticalAlign: 'middle', + marginRight: 5, + }, + parameter: { + padding: 2, + marginBottom: 10, + }, + icon: { + padding: 4, + margin: '0 auto', + verticalAlign: 'middle !important', + }, + formControl: { + margin: 4, + width: '100%', + }, + addButton: { + margin: 10, + }, +}); + +const Algorithm = props => { + const classes = useStyles(); + + const onAlgorithmNameChange = event => { + props.changeAlgorithmName(event.target.value); + }; + + const onAddAlgorithmSetting = () => { + props.addAlgorithmSetting(); + }; + + const onChangeAlgorithmSetting = (name, index) => event => { + props.changeAlgorithmSetting(index, name, event.target.value); + }; + + const onDeleteAlgorithmSetting = index => event => { + props.deleteAlgorithmSetting(index); + }; + + return ( +
+ +
+ + + + + + + {'Algorithm Name'} + + + + + Algorithm Name + + + + +
+
+ {props.algorithmSettings.map((param, i) => { + return ( +
+ + + + + + + + + + + + + + +
+ ); + })} +
+ ); +}; + +const mapStateToProps = state => { + return { + algorithmName: state[module].algorithmName, + allAlgorithms: state[module].allAlgorithms, + algorithmSettings: state[module].algorithmSettings, + }; +}; + +export default connect(mapStateToProps, { + changeAlgorithmName, + addAlgorithmSetting, + changeAlgorithmSetting, + deleteAlgorithmSetting, +})(Algorithm); diff --git a/pkg/ui/v1beta1/frontend/src/components/NAS/Create/Params/CommonMeta.jsx b/pkg/ui/v1beta1/frontend/src/components/NAS/Create/Params/CommonMeta.jsx new file mode 100644 index 00000000000..dfd5302b182 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/NAS/Create/Params/CommonMeta.jsx @@ -0,0 +1,95 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import Grid from '@material-ui/core/Grid'; +import Tooltip from '@material-ui/core/Tooltip'; +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; +import Typography from '@material-ui/core/Typography'; +import TextField from '@material-ui/core/TextField'; + +import { changeMeta } from '../../../../actions/nasCreateActions'; +import { withStyles } from '@material-ui/core'; + +const module = 'nasCreate'; +const generalModule = 'general'; + +const styles = () => ({ + textField: { + marginLeft: 4, + marginRight: 4, + width: '100%', + }, + help: { + padding: 4 / 2, + verticalAlign: 'middle', + marginRight: 5, + }, + parameter: { + padding: 2, + marginBottom: 10, + }, +}); + +class CommonParametersMeta extends React.Component { + componentDidMount() { + if (this.props.globalNamespace != '') { + this.props.changeMeta('Namespace', this.props.globalNamespace); + } + } + + onMetaChange = param => event => { + this.props.changeMeta(param, event.target.value); + }; + + render() { + const { classes } = this.props; + + return ( +
+ {this.props.commonParametersMetadata.map((param, i) => { + return ( +
+ + + + + + + {param.name} + + + + {param.name == 'Namespace' && this.props.globalNamespace == '' && ( + + )} + {param.name == 'Namespace' && this.props.globalNamespace != '' && ( + + )} + {param.name != 'Namespace' && ( + + )} + + +
+ ); + })} +
+ ); + } +} + +const mapStateToProps = state => { + return { + commonParametersMetadata: state[module].commonParametersMetadata, + globalNamespace: state[generalModule].globalNamespace, + }; +}; + +export default connect(mapStateToProps, { changeMeta })(withStyles(styles)(CommonParametersMeta)); diff --git a/pkg/ui/v1beta1/frontend/src/components/NAS/Create/Params/CommonSpec.jsx b/pkg/ui/v1beta1/frontend/src/components/NAS/Create/Params/CommonSpec.jsx new file mode 100644 index 00000000000..97b396c3135 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/NAS/Create/Params/CommonSpec.jsx @@ -0,0 +1,73 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import makeStyles from '@material-ui/styles/makeStyles'; +import Grid from '@material-ui/core/Grid'; +import Tooltip from '@material-ui/core/Tooltip'; +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; +import Typography from '@material-ui/core/Typography'; +import TextField from '@material-ui/core/TextField'; + +import { changeSpec } from '../../../../actions/nasCreateActions'; + +const module = 'nasCreate'; + +const useStyles = makeStyles({ + textField: { + marginLeft: 4, + marginRight: 4, + width: '100%', + }, + help: { + padding: 4 / 2, + verticalAlign: 'middle', + marginRight: 5, + }, + parameter: { + padding: 2, + marginBottom: 10, + }, +}); + +const CommonParametersSpec = props => { + const classes = useStyles(); + + const onSpecChange = name => event => { + props.changeSpec(name, event.target.value); + }; + + return ( +
+ {props.commonParametersSpec.map((param, i) => { + return ( +
+ + + + + + + {param.name} + + + + + + +
+ ); + })} +
+ ); +}; + +const mapStateToProps = state => { + return { + commonParametersSpec: state[module].commonParametersSpec, + }; +}; + +export default connect(mapStateToProps, { changeSpec })(CommonParametersSpec); diff --git a/pkg/ui/v1beta1/frontend/src/components/NAS/Create/Params/NASConfig.jsx b/pkg/ui/v1beta1/frontend/src/components/NAS/Create/Params/NASConfig.jsx new file mode 100644 index 00000000000..56f2f0e5a51 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/NAS/Create/Params/NASConfig.jsx @@ -0,0 +1,457 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import makeStyles from '@material-ui/styles/makeStyles'; +import Button from '@material-ui/core/Button'; +import Grid from '@material-ui/core/Grid'; +import Tooltip from '@material-ui/core/Tooltip'; +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; +import Typography from '@material-ui/core/Typography'; +import TextField from '@material-ui/core/TextField'; +import IconButton from '@material-ui/core/IconButton'; +import AddIcon from '@material-ui/icons/Add'; +import DeleteIcon from '@material-ui/icons/Delete'; +import Fab from '@material-ui/core/Fab'; +import Divider from '@material-ui/core/Divider'; +import Select from '@material-ui/core/Select'; +import OutlinedInput from '@material-ui/core/OutlinedInput'; +import InputLabel from '@material-ui/core/InputLabel'; +import MenuItem from '@material-ui/core/MenuItem'; +import FormControl from '@material-ui/core/FormControl'; + +import Radio from '@material-ui/core/Radio'; +import RadioGroup from '@material-ui/core/RadioGroup'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; + +import { + editNumLayers, + addSize, + editSize, + deleteSize, + addOperation, + deleteOperation, + changeOperation, + addParameter, + changeParameter, + deleteParameter, + addListParameter, + editListParameter, + deleteListParameter, +} from '../../../../actions/nasCreateActions'; + +const module = 'nasCreate'; + +const useStyles = makeStyles({ + textField: { + marginLeft: 4, + marginRight: 4, + width: '80%', + }, + numLayers: { + padding: 2, + marginBottom: 30, + }, + help: { + padding: 4 / 2, + verticalAlign: 'middle', + marginRight: 5, + }, + parameter: { + padding: 2, + marginBottom: 10, + }, + formControl: { + margin: 4, + width: '100%', + }, + selectEmpty: { + marginTop: 10, + }, + group: { + flexDirection: 'row', + justifyContent: 'space-around', + }, + divider: { + margin: 5, + }, + addButton: { + margin: 10, + }, + fab: { + margin: 2, + }, + section: { + marginTop: 20, + }, +}); + +const SectionInTypography = (name, classes, variant) => { + return ( +
+ + + {name} +
+
+
+
+ ); +}; + +const NASConfig = props => { + const classes = useStyles(); + + const onEditNumLayers = () => event => { + props.editNumLayers(event.target.value); + }; + const onAddSize = type => event => { + props.addSize(type); + }; + + const onEditSize = (index, type) => event => { + props.editSize(type, index, event.target.value); + }; + + const onDeleteSize = (index, type) => event => { + props.deleteSize(type, index); + }; + + const onDeleteOperation = index => event => { + props.deleteOperation(index); + }; + + const onChangeOperation = index => event => { + props.changeOperation(index, event.target.value); + }; + + const onAddParameter = opIndex => event => { + props.addParameter(opIndex); + }; + + const onChangeParameter = (opIndex, paramIndex, name) => event => { + props.changeParameter(opIndex, paramIndex, name, event.target.value); + }; + + const onDeleteParameter = (opIndex, paramIndex) => event => { + props.deleteParameter(opIndex, paramIndex); + }; + + const onAddListParameter = (opIndex, paramIndex) => event => { + props.addListParameter(opIndex, paramIndex); + }; + + const onDeleteListParameter = (opIndex, paramIndex, listIndex) => event => { + props.deleteListParameter(opIndex, paramIndex, listIndex); + }; + + const onEditListParameter = (opIndex, paramIndex, listIndex) => event => { + props.editListParameter(opIndex, paramIndex, listIndex, event.target.value); + }; + + return ( +
+ {/* NUM LAYERS */} +
+ + + + + + + {'NumLayers'} + + + + + + +
+ {/* INPUT SIZE */} +
+ + + + + + + {'InputSizes'} + + + + {props.inputSize.map((size, index) => { + return ( +
+ + + + +
+ ); + })} +
+ + + + + +
+
+ {/* OUTPUT SIZE */} +
+ + + + + + + {'OutputSizes'} + + + + {props.outputSize.map((size, index) => { + return ( +
+ + + + +
+ ); + })} +
+ + + + + +
+
+ {/* OPERATIONS */} + {SectionInTypography('Operations', classes, 'h6')} +
+ +
+ {props.operations.map((operation, opIndex) => { + return ( +
+
+ + + OperationType + + + + + + + + + +
+
+
+ +
+
+ {operation.parameters.map((param, paramIndex) => { + return ( +
+ + + + + + + Parameter Type + + + + + + } + label="FeasibleSpace" + /> + } + label="List" + /> + + + + {param.feasibleSpace === 'list' && + param.list.map((element, elIndex) => { + return ( +
+ + + + +
+ ); + })} + {param.feasibleSpace === 'feasibleSpace' && ( +
+ + + +
+ )} +
+ + {param.feasibleSpace === 'list' && ( + + + + )} + + + + + + +
+
+ ); + })} + +
+ ); + })} +
+ ); +}; + +const mapStateToProps = state => { + return { + numLayers: state[module].numLayers, + inputSize: state[module].inputSize, + outputSize: state[module].outputSize, + operations: state[module].operations, + allParameterTypes: state[module].allParameterTypes, + }; +}; + +export default connect(mapStateToProps, { + editNumLayers, + addSize, + editSize, + deleteSize, + addOperation, + deleteOperation, + changeOperation, + addParameter, + changeParameter, + deleteParameter, + addListParameter, + editListParameter, + deleteListParameter, +})(NASConfig); diff --git a/pkg/ui/v1beta1/frontend/src/components/NAS/Create/Params/Objective.jsx b/pkg/ui/v1beta1/frontend/src/components/NAS/Create/Params/Objective.jsx new file mode 100644 index 00000000000..76ca9325058 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/NAS/Create/Params/Objective.jsx @@ -0,0 +1,180 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import makeStyles from '@material-ui/styles/makeStyles'; +import Grid from '@material-ui/core/Grid'; +import Tooltip from '@material-ui/core/Tooltip'; +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; +import Typography from '@material-ui/core/Typography'; +import TextField from '@material-ui/core/TextField'; +import IconButton from '@material-ui/core/IconButton'; +import DeleteIcon from '@material-ui/icons/Delete'; +import Fab from '@material-ui/core/Fab'; +import AddIcon from '@material-ui/icons/Add'; +import FormControl from '@material-ui/core/FormControl'; +import Select from '@material-ui/core/Select'; +import InputLabel from '@material-ui/core/InputLabel'; +import OutlinedInput from '@material-ui/core/OutlinedInput'; +import MenuItem from '@material-ui/core/MenuItem'; + +import { + changeObjective, + addMetrics, + editMetrics, + deleteMetrics, +} from '../../../../actions/nasCreateActions'; + +const module = 'nasCreate'; + +const useStyles = makeStyles({ + textField: { + marginLeft: 4, + marginRight: 4, + width: '100%', + }, + help: { + padding: 4 / 2, + verticalAlign: 'middle', + marginRight: 5, + }, + parameter: { + padding: 2, + marginBottom: 10, + }, + selectBox: { + width: 150, + }, +}); + +const Objective = props => { + const classes = useStyles(); + + const onObjectiveChange = name => event => { + props.changeObjective(name, event.target.value); + }; + + const onMetricsEdit = index => event => { + props.editMetrics(index, event.target.value); + }; + + const onMetricsDelete = index => event => { + props.deleteMetrics(index); + }; + + return ( +
+ {props.objective.map((param, i) => { + return param.name === 'Type' ? ( +
+ + + + + + + {param.name} + + + + + Objective Type + + + + +
+ ) : ( +
+ + + + + + + {param.name} + + + + + + +
+ ); + })} +
+ + + + + + + AdditionalMetricNames + + + + {props.additionalMetricNames.map((metrics, mIndex) => { + return ( + + + + + + + + + + + ); + })} + + + + + + + +
+
+ ); +}; + +const mapStateToProps = state => { + return { + allObjectiveTypes: state[module].allObjectiveTypes, + objective: state[module].objective, + additionalMetricNames: state[module].additionalMetricNames, + }; +}; + +export default connect(mapStateToProps, { + changeObjective, + addMetrics, + editMetrics, + deleteMetrics, +})(Objective); diff --git a/pkg/ui/v1beta1/frontend/src/components/NAS/Create/Params/Trial.jsx b/pkg/ui/v1beta1/frontend/src/components/NAS/Create/Params/Trial.jsx new file mode 100644 index 00000000000..489cfd5e32a --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/NAS/Create/Params/Trial.jsx @@ -0,0 +1,165 @@ +import React from 'react'; +import { connect } from 'react-redux'; + +import withStyles from '@material-ui/styles/withStyles'; +import Grid from '@material-ui/core/Grid'; +import Tooltip from '@material-ui/core/Tooltip'; +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; +import Typography from '@material-ui/core/Typography'; +import OutlinedInput from '@material-ui/core/OutlinedInput'; +import InputLabel from '@material-ui/core/InputLabel'; +import MenuItem from '@material-ui/core/MenuItem'; +import FormControl from '@material-ui/core/FormControl'; +import Select from '@material-ui/core/Select'; + +import { filterTemplatesExperiment, changeTemplateName } from '../../../../actions/generalActions'; +import { fetchTrialTemplates } from '../../../../actions/templateActions'; + +const module = 'nasCreate'; +const generalModule = 'general'; + +const styles = theme => ({ + help: { + padding: 4 / 2, + verticalAlign: 'middle', + marginRight: 5, + }, + section: { + padding: 4, + }, + parameter: { + padding: 2, + marginBottom: 10, + }, + trialForm: { + margin: 4, + width: '100%', + }, + selectForm: { + margin: 4, + width: '20%', + }, + selectNS: { + marginRight: 10, + }, +}); + +class TrialSpecParam extends React.Component { + componentDidMount() { + this.props.fetchTrialTemplates(); + } + + onTrialNamespaceChange = event => { + this.props.filterTemplatesExperiment(event.target.value, ''); + }; + + onTrialConfigMapChange = event => { + this.props.filterTemplatesExperiment(this.props.templateNamespace, event.target.value); + }; + + onTrialTemplateChange = event => { + this.props.changeTemplateName(event.target.value); + }; + + render() { + const { classes } = this.props; + return ( +
+
+ + + + + + + {'Namespace and ConfigMapName'} + + + + + Namespace + + + + ConfigMap + + + + +
+
+ + + + + + + {'Trial Template Name'} + + + + + Trial Template + + + + +
+
+ ); + } +} + +const mapStateToProps = state => { + return { + trialTemplatesList: state[generalModule].trialTemplatesList, + templateNamespace: state[generalModule].templateNamespace, + templateConfigMapName: state[generalModule].templateConfigMapName, + currentTemplateConfigMapsList: state[generalModule].currentTemplateConfigMapsList, + templateName: state[generalModule].templateName, + currentTemplateNamesList: state[generalModule].currentTemplateNamesList, + }; +}; + +export default connect(mapStateToProps, { + filterTemplatesExperiment, + changeTemplateName, + fetchTrialTemplates, +})(withStyles(styles)(TrialSpecParam)); diff --git a/pkg/ui/v1beta1/frontend/src/components/NAS/Create/YAML.jsx b/pkg/ui/v1beta1/frontend/src/components/NAS/Create/YAML.jsx new file mode 100644 index 00000000000..8b980e3b82c --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/NAS/Create/YAML.jsx @@ -0,0 +1,81 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import makeStyles from '@material-ui/styles/makeStyles'; + +import AceEditor from 'react-ace'; +import 'ace-builds/src-noconflict/theme-sqlserver'; +import 'ace-builds/src-noconflict/mode-yaml'; + +import Button from '@material-ui/core/Button'; +import Typography from '@material-ui/core/Typography'; + +import { changeYaml } from '../../../actions/nasCreateActions'; +import { submitYaml } from '../../../actions/generalActions'; + +const module = 'nasCreate'; +const generalModule = 'general'; + +const useStyles = makeStyles({ + editor: { + margin: '0 auto', + }, + submit: { + textAlign: 'center', + marginTop: 10, + }, + button: { + margin: 15, + }, +}); + +const YAML = props => { + const onYamlChange = value => { + props.changeYaml(value); + }; + + const submitWholeYaml = () => { + props.submitYaml(props.currentYaml, props.globalNamespace); + }; + + const classes = useStyles(); + return ( +
+ {'Generate'} +
+
+ +
+
+ +
+
+ ); +}; + +const mapStateToProps = state => { + return { + currentYaml: state[module].currentYaml, + globalNamespace: state[generalModule].globalNamespace, + }; +}; + +export default connect(mapStateToProps, { changeYaml, submitYaml })(YAML); diff --git a/pkg/ui/v1beta1/frontend/src/components/NAS/Monitor/FilterPanel.jsx b/pkg/ui/v1beta1/frontend/src/components/NAS/Monitor/FilterPanel.jsx new file mode 100644 index 00000000000..f6498c74360 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/NAS/Monitor/FilterPanel.jsx @@ -0,0 +1,137 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import { withStyles } from '@material-ui/core/styles'; + +import TextField from '@material-ui/core/TextField'; +import FormGroup from '@material-ui/core/FormGroup'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import Switch from '@material-ui/core/Switch'; +import Button from '@material-ui/core/Button'; +import Select from '@material-ui/core/Select'; +import InputLabel from '@material-ui/core/InputLabel'; +import MenuItem from '@material-ui/core/MenuItem'; +import FormControl from '@material-ui/core/FormControl'; + +import { filterJobs, changeType, fetchNASJobs } from '../../../actions/nasMonitorActions'; +import { fetchNamespaces } from '../../../actions/generalActions'; + +const module = 'nasMonitor'; +const generalModule = 'general'; + +const styles = theme => ({ + textField: { + marginLeft: theme.spacing.unit, + marginRight: theme.spacing.unit, + }, + filter: { + margin: '0 auto', + textAlign: 'center', + }, + selectBox: { + marginLeft: theme.spacing.unit, + marginRight: theme.spacing.unit, + width: 200, + height: 56, + textAlign: 'left', + }, +}); + +class FilterPanel extends React.Component { + componentDidMount() { + if (this.props.globalNamespace != '') { + this.props.filterJobs(this.props.experimentName, this.props.globalNamespace); + } else { + this.props.fetchNamespaces(); + this.props.filterJobs(this.props.experimentName, this.props.experimentNamespace); + } + } + + handleType = name => event => { + this.props.changeType(name, event.target.checked); + }; + + onNameChange = event => { + this.props.filterJobs(event.target.value, this.props.experimentNamespace); + }; + + onNamespaceChange = event => { + this.props.filterJobs(this.props.experimentName, event.target.value); + }; + + render() { + const { classes } = this.props; + + return ( +
+ + + Namespace + {this.props.globalNamespace === '' ? ( + + ) : ( + + )} + + + {Object.keys(this.props.filterType).map((filter, i) => { + return ( + + } + label={filter} + /> + ); + })} + + +
+ ); + } +} + +const mapStateToProps = state => { + return { + experimentName: state[module].experimentName, + experimentNamespace: state[module].experimentNamespace, + filterType: state[module].filterType, + namespaces: state[generalModule].namespaces, + globalNamespace: state[generalModule].globalNamespace, + }; +}; + +export default connect(mapStateToProps, { filterJobs, changeType, fetchNASJobs, fetchNamespaces })( + withStyles(styles)(FilterPanel), +); diff --git a/pkg/ui/v1beta1/frontend/src/components/NAS/Monitor/NASJobInfo.jsx b/pkg/ui/v1beta1/frontend/src/components/NAS/Monitor/NASJobInfo.jsx new file mode 100644 index 00000000000..9249b5814c8 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/NAS/Monitor/NASJobInfo.jsx @@ -0,0 +1,142 @@ +import React from 'react'; +import { connect } from 'react-redux'; + +import { withStyles } from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import { Link } from 'react-router-dom'; +import ExpansionPanel from '@material-ui/core/ExpansionPanel'; +import ExpansionPanelSummary from '@material-ui/core/ExpansionPanelSummary'; +import ExpansionPanelDetails from '@material-ui/core/ExpansionPanelDetails'; +import Typography from '@material-ui/core/Typography'; +import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; +import LinearProgress from '@material-ui/core/LinearProgress'; +import Grid from '@material-ui/core/Grid'; + +import { fetchNASJobInfo } from '../../../actions/nasMonitorActions'; +import { fetchExperiment, fetchSuggestion } from '../../../actions/generalActions'; + +import NASJobStepInfo from './NASJobStepInfo'; +import ExperimentInfoDialog from '../../Common/ExperimentInfoDialog'; +import SuggestionInfoDialog from '../../Common/SuggestionInfoDialog'; + +const module = 'nasMonitor'; + +const styles = theme => ({ + root: { + width: '90%', + margin: '0 auto', + padding: 20, + }, + loading: { + marginTop: 30, + }, + heading: { + fontSize: theme.typography.pxToRem(15), + fontWeight: theme.typography.fontWeightRegular, + }, + panel: { + width: '100%', + }, + header: { + marginTop: 10, + textAlign: 'center', + marginBottom: 15, + }, + link: { + textDecoration: 'none', + }, + grid: { + marginBottom: 10, + }, +}); + +class NASJobInfo extends React.Component { + componentDidMount() { + this.props.fetchNASJobInfo(this.props.match.params.name, this.props.match.params.namespace); + } + + fetchAndOpenDialogExperiment = (experimentName, experimentNamespace) => event => { + this.props.fetchExperiment(experimentName, experimentNamespace); + }; + + fetchAndOpenDialogSuggestion = (suggestionName, suggestionNamespace) => event => { + this.props.fetchSuggestion(suggestionName, suggestionNamespace); + }; + + render() { + const { classes } = this.props; + return ( +
+ + + + {this.props.loading ? ( + + ) : ( +
+ + Experiment Name: {this.props.match.params.name} + + + Experiment Namespace: {this.props.match.params.namespace} + + + + + + + + + + + {this.props.steps.map((step, i) => { + return ( + + }> + {step.name} + + + + + + ); + })} + + +
+ )} +
+ ); + } +} + +const mapStateToProps = state => { + return { + steps: state[module].steps, + loading: state[module].loading, + }; +}; + +export default connect(mapStateToProps, { fetchNASJobInfo, fetchExperiment, fetchSuggestion })( + withStyles(styles)(NASJobInfo), +); diff --git a/pkg/ui/v1beta1/frontend/src/components/NAS/Monitor/NASJobList.jsx b/pkg/ui/v1beta1/frontend/src/components/NAS/Monitor/NASJobList.jsx new file mode 100644 index 00000000000..9764b02f5c0 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/NAS/Monitor/NASJobList.jsx @@ -0,0 +1,97 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import { withStyles } from '@material-ui/core/styles'; +import List from '@material-ui/core/List'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; +import { Link } from 'react-router-dom'; +import { ListItemSecondaryAction, IconButton } from '@material-ui/core'; + +import { openDeleteExperimentDialog } from '../../../actions/generalActions'; +import DeleteDialog from '../../Menu/DeleteDialog'; +import ScheduleIcon from '@material-ui/icons/Schedule'; +import RestoreIcon from '@material-ui/icons/Restore'; +import HighlightOffIcon from '@material-ui/icons/HighlightOff'; +import DoneIcon from '@material-ui/icons/Done'; +import DeleteIcon from '@material-ui/icons/Delete'; +import HourglassFullIcon from '@material-ui/icons/HourglassFull'; + +const module = 'nasMonitor'; + +const styles = theme => ({ + created: { + color: theme.colors.created, + }, + running: { + color: theme.colors.running, + }, + restarting: { + color: theme.colors.restarting, + }, + succeeded: { + color: theme.colors.succeeded, + }, + failed: { + color: theme.colors.failed, + }, +}); + +const NASJobList = props => { + const { classes } = props; + + const onDeleteExperiment = (name, namespace) => event => { + props.openDeleteExperimentDialog(name, namespace); + }; + + return ( +
+ + {props.filteredJobsList.map((job, i) => { + let icon; + if (job.status === 'Created') { + icon = ; + } else if (job.status === 'Running') { + icon = ; + } else if (job.status === 'Restarting') { + icon = ; + } else if (job.status === 'Succeeded') { + icon = ; + } else if (job.status === 'Failed') { + icon = ; + } + return ( + + {icon} + + + + + + + + ); + })} + + +
+ ); +}; + +const mapStateToProps = state => { + return { + filteredJobsList: state[module].filteredJobsList, + }; +}; + +export default connect(mapStateToProps, { openDeleteExperimentDialog })( + withStyles(styles)(NASJobList), +); diff --git a/pkg/ui/v1beta1/frontend/src/components/NAS/Monitor/NASJobMonitor.jsx b/pkg/ui/v1beta1/frontend/src/components/NAS/Monitor/NASJobMonitor.jsx new file mode 100644 index 00000000000..108450fd84c --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/NAS/Monitor/NASJobMonitor.jsx @@ -0,0 +1,42 @@ +import React from 'react'; +import { connect } from 'react-redux'; + +import { withStyles } from '@material-ui/core/styles'; +import Typography from '@material-ui/core/Typography'; + +import FilterPanel from './FilterPanel'; +import NASJobList from './NASJobList'; + +import { fetchNASJobs } from '../../../actions/nasMonitorActions'; + +const styles = theme => ({ + root: { + width: '90%', + margin: '0 auto', + marginTop: 10, + }, + text: { + marginBottom: 20, + }, +}); + +class NASJobMonitor extends React.Component { + componentDidMount() { + this.props.fetchNASJobs(); + } + + render() { + const { classes } = this.props; + return ( +
+ + {'Experiment Monitor'} + + + +
+ ); + } +} + +export default connect(null, { fetchNASJobs })(withStyles(styles)(NASJobMonitor)); diff --git a/pkg/ui/v1beta1/frontend/src/components/NAS/Monitor/NASJobStepInfo.jsx b/pkg/ui/v1beta1/frontend/src/components/NAS/Monitor/NASJobStepInfo.jsx new file mode 100644 index 00000000000..c2d9b80a518 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/NAS/Monitor/NASJobStepInfo.jsx @@ -0,0 +1,57 @@ +import React from 'react'; +import { withStyles } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; +import Button from '@material-ui/core/Button'; + +import * as d3 from 'd3'; +import * as d3Graphviz from 'd3-graphviz'; + +const styles = theme => ({ + root: { + margin: '0 auto', + textAlign: 'center', + }, + link: { + textDecoration: 'none', + }, +}); + +class NASJobStepInfo extends React.Component { + componentDidMount() { + const id = `graph${this.props.id}`; + d3.select(`#${id}`) + .graphviz() + .renderDot(this.props.step.architecture) + .width(640) + .height(480) + .fit(true); + } + + render() { + const { step, classes } = this.props; + const id = `graph${this.props.id}`; + return ( +
+ Architecture for Trial: {step.trialname} +
+
+ {step.metricsname.map((metrics, index) => { + return ( + + {step.metricsname[index]}: {step.metricsvalue[index]}. + + ); + })} +
+ {/* TODO: add link in backend */} + {/* + + */} +
+ ); + } +} + +export default withStyles(styles)(NASJobStepInfo); diff --git a/pkg/ui/v1beta1/frontend/src/components/Templates/Common/AddDialog.jsx b/pkg/ui/v1beta1/frontend/src/components/Templates/Common/AddDialog.jsx new file mode 100644 index 00000000000..36844cad3df --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/Templates/Common/AddDialog.jsx @@ -0,0 +1,239 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import withStyles from '@material-ui/styles/withStyles'; + +import AceEditor from 'react-ace'; +import 'ace-builds/src-noconflict/theme-sqlserver'; +import 'ace-builds/src-noconflict/mode-yaml'; + +import Button from '@material-ui/core/Button'; +import Dialog from '@material-ui/core/Dialog'; +import DialogActions from '@material-ui/core/DialogActions'; +import DialogContent from '@material-ui/core/DialogContent'; +import TextField from '@material-ui/core/TextField'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import Typography from '@material-ui/core/Typography'; +import Select from '@material-ui/core/Select'; +import MenuItem from '@material-ui/core/MenuItem'; +import FormControl from '@material-ui/core/FormControl'; +import InputLabel from '@material-ui/core/InputLabel'; +import OutlinedInput from '@material-ui/core/OutlinedInput'; + +import { closeDialog, addTemplate, changeTemplate } from '../../../actions/templateActions'; + +const module = 'template'; + +const styles = theme => ({ + header: { + textAlign: 'center', + width: 650, + }, + headerTypography: { + textAlign: 'center', + marginTop: 5, + fontSize: 19, + }, + textField: { + marginBottom: 10, + width: '100%', + }, + selectBox: { + width: 200, + }, + selectForm: { + margin: 10, + }, + selectDiv: { + textAlign: 'center', + }, +}); + +//TODO: Add functionality to create new ConfigMap with Trial Template +class AddDialog extends React.Component { + componentDidMount() { + if (this.props.trialTemplatesList.length != 0) { + let configMaps = this.props.trialTemplatesList[0].ConfigMapsList; + if (configMaps.length != 0) { + let configMapsList = []; + configMaps.forEach(configMap => configMapsList.push(configMap.ConfigMapName)); + this.props.changeTemplate( + this.props.edittedTemplateNamespace, + this.props.edittedTemplateConfigMapName, + this.props.edittedTemplateName, + this.props.edittedTemplateYaml, + configMapsList, + ); + } + } + } + + onNamespaceChange = event => { + let newNamespace = event.target.value; + + let namespaceIndex = this.props.trialTemplatesList.findIndex(function(trialTemplate, i) { + return trialTemplate.Namespace === newNamespace; + }); + + if (this.props.trialTemplatesList.length != 0) { + let configMaps = this.props.trialTemplatesList[namespaceIndex].ConfigMapsList; + //TODO: add logic when configMapsList is empty + if (configMaps.length != 0) { + let configMapsList = []; + configMaps.forEach(configMap => configMapsList.push(configMap.ConfigMapName)); + + this.props.changeTemplate( + newNamespace, + configMapsList[0], + this.props.edittedTemplateName, + this.props.edittedTemplateYaml, + configMapsList, + ); + } + } + }; + + onConfigMapNameChange = event => { + this.props.changeTemplate( + this.props.edittedTemplateNamespace, + event.target.value, + this.props.edittedTemplateName, + this.props.edittedTemplateYaml, + this.props.edittedTemplateConfigMapSelectList, + ); + }; + + onNameChange = event => { + this.props.changeTemplate( + this.props.edittedTemplateNamespace, + this.props.edittedTemplateConfigMapName, + event.target.value, + this.props.edittedTemplateYaml, + this.props.edittedTemplateConfigMapSelectList, + ); + }; + + onYamlChange = newTemplateYaml => { + this.props.changeTemplate( + this.props.edittedTemplateNamespace, + this.props.edittedTemplateConfigMapName, + this.props.edittedTemplateName, + newTemplateYaml, + this.props.edittedTemplateConfigMapSelectList, + ); + }; + + submitAddTemplate = () => { + this.props.addTemplate( + this.props.edittedTemplateNamespace, + this.props.edittedTemplateConfigMapName, + this.props.edittedTemplateName, + this.props.edittedTemplateYaml, + ); + }; + + render() { + const { classes } = this.props; + + return ( +
+ + + {'Template Creator'} + + {'Select Namespace and ConfigMap'} + + + +
+ + Namespace + + + + ConfigMap + + +
+ +
+ +
+ + + + +
+
+ ); + } +} + +const mapStateToProps = state => { + return { + addOpen: state[module].addOpen, + trialTemplatesList: state[module].trialTemplatesList, + edittedTemplateNamespace: state[module].edittedTemplateNamespace, + edittedTemplateConfigMapName: state[module].edittedTemplateConfigMapName, + edittedTemplateName: state[module].edittedTemplateName, + edittedTemplateYaml: state[module].edittedTemplateYaml, + edittedTemplateConfigMapSelectList: state[module].edittedTemplateConfigMapSelectList, + }; +}; + +export default connect(mapStateToProps, { + closeDialog, + addTemplate, + changeTemplate, +})(withStyles(styles)(AddDialog)); diff --git a/pkg/ui/v1beta1/frontend/src/components/Templates/Common/DeleteDialog.jsx b/pkg/ui/v1beta1/frontend/src/components/Templates/Common/DeleteDialog.jsx new file mode 100644 index 00000000000..7dae7504034 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/Templates/Common/DeleteDialog.jsx @@ -0,0 +1,54 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import withStyles from '@material-ui/styles/withStyles'; + +import Button from '@material-ui/core/Button'; +import Dialog from '@material-ui/core/Dialog'; +import DialogActions from '@material-ui/core/DialogActions'; +import DialogContent from '@material-ui/core/DialogContent'; +import DialogContentText from '@material-ui/core/DialogContentText'; +import DialogTitle from '@material-ui/core/DialogTitle'; + +import { closeDialog, deleteTemplate } from '../../../actions/templateActions'; + +const module = 'template'; + +const DeleteDialog = props => { + const submitDeleteTemplate = () => { + props.deleteTemplate( + props.edittedTemplateNamespace, + props.edittedTemplateConfigMapName, + props.edittedTemplateName, + ); + }; + + return ( +
+ + {'Are you sure?'} + + Are you sure you want to delete this template? + + + + + + +
+ ); +}; + +const mapStateToProps = state => { + return { + deleteOpen: state[module].deleteOpen, + edittedTemplateNamespace: state[module].edittedTemplateNamespace, + edittedTemplateConfigMapName: state[module].edittedTemplateConfigMapName, + edittedTemplateName: state[module].edittedTemplateName, + }; +}; + +export default connect(mapStateToProps, { closeDialog, deleteTemplate })(DeleteDialog); diff --git a/pkg/ui/v1beta1/frontend/src/components/Templates/Common/EditDialog.jsx b/pkg/ui/v1beta1/frontend/src/components/Templates/Common/EditDialog.jsx new file mode 100644 index 00000000000..3cc4c5f6d71 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/Templates/Common/EditDialog.jsx @@ -0,0 +1,137 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import withStyles from '@material-ui/styles/withStyles'; + +import AceEditor from 'react-ace'; +import 'ace-builds/src-noconflict/theme-sqlserver'; +import 'ace-builds/src-noconflict/mode-yaml'; + +import Button from '@material-ui/core/Button'; +import Dialog from '@material-ui/core/Dialog'; +import DialogActions from '@material-ui/core/DialogActions'; +import DialogContent from '@material-ui/core/DialogContent'; +import TextField from '@material-ui/core/TextField'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import Typography from '@material-ui/core/Typography'; + +import { closeDialog, editTemplate, changeTemplate } from '../../../actions/templateActions'; + +const module = 'template'; + +const styles = theme => ({ + header: { + textAlign: 'center', + width: 650, + }, + headerTypography: { + textAlign: 'center', + marginTop: 5, + fontSize: 19, + }, + textField: { + marginBottom: 10, + width: '100%', + }, +}); + +class EditDialog extends React.Component { + onNameChange = event => { + this.props.changeTemplate( + this.props.edittedTemplateNamespace, + this.props.edittedTemplateConfigMapName, + event.target.value, + this.props.edittedTemplateYaml, + this.props.edittedTemplateConfigMapSelectList, + ); + }; + + onYamlChange = newTemplateYaml => { + this.props.changeTemplate( + this.props.edittedTemplateNamespace, + this.props.edittedTemplateConfigMapName, + this.props.edittedTemplateName, + newTemplateYaml, + this.props.edittedTemplateConfigMapSelectList, + ); + }; + + submitEditTemplate = () => { + this.props.editTemplate( + this.props.edittedTemplateNamespace, + this.props.edittedTemplateConfigMapName, + this.props.currentTemplateName, + this.props.edittedTemplateName, + this.props.edittedTemplateYaml, + ); + }; + + render() { + const { classes } = this.props; + return ( + + + {'Template Editor'} + + {'Namespace: ' + this.props.edittedTemplateNamespace} + + + + {'ConfigMap: ' + this.props.edittedTemplateConfigMapName} + + + + + +
+ +
+ + + + +
+ ); + } +} + +const mapStateToProps = state => { + return { + editOpen: state[module].editOpen, + edittedTemplateNamespace: state[module].edittedTemplateNamespace, + edittedTemplateConfigMapName: state[module].edittedTemplateConfigMapName, + currentTemplateName: state[module].currentTemplateName, + edittedTemplateName: state[module].edittedTemplateName, + edittedTemplateYaml: state[module].edittedTemplateYaml, + edittedTemplateConfigMapSelectList: state[module].edittedTemplateConfigMapSelectList, + }; +}; + +export default connect(mapStateToProps, { closeDialog, editTemplate, changeTemplate })( + withStyles(styles)(EditDialog), +); diff --git a/pkg/ui/v1beta1/frontend/src/components/Templates/Common/FilterPanel.jsx b/pkg/ui/v1beta1/frontend/src/components/Templates/Common/FilterPanel.jsx new file mode 100644 index 00000000000..9a0ae7d4606 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/Templates/Common/FilterPanel.jsx @@ -0,0 +1,88 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import { withStyles } from '@material-ui/core/styles'; + +import TextField from '@material-ui/core/TextField'; +import Select from '@material-ui/core/Select'; +import InputLabel from '@material-ui/core/InputLabel'; +import MenuItem from '@material-ui/core/MenuItem'; +import FormControl from '@material-ui/core/FormControl'; + +import { fetchNamespaces } from '../../../actions/generalActions'; +import { filterTemplates } from '../../../actions/templateActions'; + +const module = 'template'; +const generalModule = 'general'; + +const styles = theme => ({ + selectBox: { + marginLeft: theme.spacing.unit, + marginRight: theme.spacing.unit, + width: 200, + height: 56, + }, + textField: { + marginLeft: theme.spacing.unit, + marginRight: theme.spacing.unit, + }, +}); + +class FilterPanel extends React.Component { + componentDidMount() { + this.props.fetchNamespaces(); + this.props.filterTemplates(this.props.filteredNamespace, this.props.filteredConfigMapName); + } + + onNamespaceChange = event => { + this.props.filterTemplates(event.target.value, this.props.filteredConfigMapName); + }; + + onConfigMapNameChange = event => { + this.props.filterTemplates(this.props.filteredNamespace, event.target.value); + }; + + render() { + const { classes } = this.props; + + return ( +
+ + Namespace + + + +
+ ); + } +} + +const mapStateToProps = state => { + return { + namespaces: state[generalModule].namespaces, + filteredNamespace: state[module].filteredNamespace, + filteredConfigMapName: state[module].filteredConfigMapName, + }; +}; + +export default connect(mapStateToProps, { fetchNamespaces, filterTemplates })( + withStyles(styles)(FilterPanel), +); diff --git a/pkg/ui/v1beta1/frontend/src/components/Templates/Common/TemplateList.jsx b/pkg/ui/v1beta1/frontend/src/components/Templates/Common/TemplateList.jsx new file mode 100644 index 00000000000..97919ed40b2 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/Templates/Common/TemplateList.jsx @@ -0,0 +1,174 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import { withStyles } from '@material-ui/core/styles'; + +import ExpansionPanel from '@material-ui/core/ExpansionPanel'; +import ExpansionPanelSummary from '@material-ui/core/ExpansionPanelSummary'; +import ExpansionPanelDetails from '@material-ui/core/ExpansionPanelDetails'; +import Typography from '@material-ui/core/Typography'; +import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; +import Grid from '@material-ui/core/Grid'; +import Divider from '@material-ui/core/Divider'; +import Button from '@material-ui/core/Button'; +import LinearProgress from '@material-ui/core/LinearProgress'; + +import TemplatePanel from './TemplatePanel'; +import FilterPanel from './FilterPanel'; +import AddDialog from './AddDialog'; +import EditDialog from './EditDialog'; +import DeleteDialog from './DeleteDialog'; + +import { openDialog } from '../../../actions/templateActions'; + +const module = 'template'; + +const styles = theme => ({ + namespace: { + marginTop: 25, + marginRight: 15, + fontSize: theme.typography.pxToRem(26), + }, + configMap: { + margin: 15, + fontSize: theme.typography.pxToRem(23), + }, + templatesBlock: { + width: '96%', + margin: '0 auto', + }, + template: { + fontSize: theme.typography.pxToRem(20), + fontWeight: theme.typography.fontWeightRegular, + }, + divider: { + marginTop: 20, + }, + buttonAdd: { + textAlign: 'center', + }, + noTemplates: { + marginTop: 25, + marginRight: 15, + fontSize: theme.typography.pxToRem(50), + }, + loading: { + marginTop: 30, + }, +}); + +const dialogTypeAdd = 'add'; + +//TODO: Add functionality to create new ConfigMap with Trial Template +class TemplateList extends React.Component { + openAddDialog = () => { + this.props.openDialog( + dialogTypeAdd, + this.props.trialTemplatesList[0].Namespace, + this.props.trialTemplatesList[0].ConfigMapsList[0].ConfigMapName, + ); + }; + + render() { + const { classes } = this.props; + return ( +
+ {this.props.loading ? ( + + ) : ( +
+ {this.props.trialTemplatesList.length != 0 ? ( +
+ +
+ +
+ {this.props.filteredTrialTemplatesList.map((trialTemplate, nsIndex) => { + return ( +
+ + + Namespace: + + + + {trialTemplate.Namespace} + + + +
+
+
+ + {trialTemplate.ConfigMapsList.map((configMap, cmIndex) => { + return ( +
+ + + ConfigMap: + + + + {configMap.ConfigMapName} + + + + + {configMap.TemplatesList.map((template, templateIndex) => { + return ( +
+ + }> + + {template.Name} + + + + + + +
+ ); + })} + +
+ ); + })} +
+ ); + })} + + + + +
+ ) : ( +
+ No Katib Trial Templates +
+ )} +
+ )} +
+ ); + } +} + +const mapStateToProps = state => { + return { + filteredTrialTemplatesList: state[module].filteredTrialTemplatesList, + trialTemplatesList: state[module].trialTemplatesList, + loading: state[module].loading, + }; +}; + +export default connect(mapStateToProps, { openDialog })(withStyles(styles)(TemplateList)); diff --git a/pkg/ui/v1beta1/frontend/src/components/Templates/Common/TemplatePanel.jsx b/pkg/ui/v1beta1/frontend/src/components/Templates/Common/TemplatePanel.jsx new file mode 100644 index 00000000000..7414c02c676 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/Templates/Common/TemplatePanel.jsx @@ -0,0 +1,90 @@ +import React from 'react'; +import { connect } from 'react-redux'; + +import AceEditor from 'react-ace'; +import 'ace-builds/src-noconflict/theme-sqlserver'; +import 'ace-builds/src-noconflict/mode-yaml'; + +import makeStyles from '@material-ui/styles/makeStyles'; +import Button from '@material-ui/core/Button'; +import DeleteIcon from '@material-ui/icons/Delete'; +import CreateIcon from '@material-ui/icons/Create'; + +import { openDialog } from '../../../actions/templateActions'; + +const useStyles = makeStyles({ + root: { + width: '98%', + margin: '0 auto', + }, + + buttons: { + marginTop: 30, + marginLeft: 20, + }, + icon: { + margin: 4, + }, +}); +const dialogTypeEdit = 'edit'; +const dialogTypeDelete = 'delete'; + +const TemplatePanel = props => { + const classes = useStyles(); + + const openEditDialog = (namespace, configMapName, templateName, templateYaml) => event => { + props.openDialog(dialogTypeEdit, namespace, configMapName, templateName, templateYaml); + }; + + const openDeleteDialog = (namespace, configMapName, templateName) => event => { + props.openDialog(dialogTypeDelete, namespace, configMapName, templateName); + }; + + return ( +
+ + + + +
+ ); +}; + +const mapStateToProps = state => { + return {}; +}; + +export default connect(mapStateToProps, { openDialog })(TemplatePanel); diff --git a/pkg/ui/v1beta1/frontend/src/components/Templates/Trial.jsx b/pkg/ui/v1beta1/frontend/src/components/Templates/Trial.jsx new file mode 100644 index 00000000000..6fc2393ce50 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/components/Templates/Trial.jsx @@ -0,0 +1,41 @@ +import React from 'react'; +import { connect } from 'react-redux'; + +import { withStyles } from '@material-ui/core/styles'; +import Typography from '@material-ui/core/Typography'; + +import TemplateList from './Common/TemplateList'; + +import { fetchTrialTemplates } from '../../actions/templateActions'; + +const styles = theme => ({ + root: { + width: '90%', + margin: '0 auto', + marginTop: 10, + }, + text: { + marginBottom: 20, + }, +}); + +class Trial extends React.Component { + componentDidMount() { + this.props.fetchTrialTemplates(); + } + + render() { + const { classes } = this.props; + + return ( +
+ + {'Trial Templates'} + + + +
+ ); + } +} +export default connect(null, { fetchTrialTemplates })(withStyles(styles)(Trial)); diff --git a/pkg/ui/v1beta1/frontend/src/constants/constants.js b/pkg/ui/v1beta1/frontend/src/constants/constants.js new file mode 100644 index 00000000000..d0ff7834322 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/constants/constants.js @@ -0,0 +1,23 @@ +// Here we store global constants for React frontend + +export const JOB_TYPE_HP = 'hp'; +export const JOB_TYPE_NAS = 'nas'; + +export const MC_KIND_STDOUT = 'StdOut'; +export const MC_KIND_FILE = 'File'; +export const MC_KIND_TENSORFLOW_EVENT = 'TensorFlowEvent'; +export const MC_KIND_PROMETHEUS = 'PrometheusMetric'; +export const MC_KIND_CUSTOM = 'Custom'; +export const MC_KIND_NONE = 'None'; + +export const MC_FILE_SYSTEM_KIND_FILE = 'File'; +export const MC_FILE_SYSTEM_KIND_DIRECTORY = 'Directory'; +export const MC_FILE_SYSTEM_NO_KIND = 'No File System'; + +export const MC_HTTP_GET_HTTP_SCHEME = 'HTTP'; + +export const MC_PROMETHEUS_DEFAULT_PORT = 8080; +export const MC_PROMETHEUS_DEFAULT_PATH = '/metrics'; + +export const LINK_HP_CREATE = '/katib/hp'; +export const LINK_NAS_CREATE = '/katib/nas'; diff --git a/pkg/ui/v1beta1/frontend/src/index.js b/pkg/ui/v1beta1/frontend/src/index.js new file mode 100755 index 00000000000..68f35eea727 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/index.js @@ -0,0 +1,58 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import App from './components/App'; +import KubeflowDashboard from './components/KubeflowDashboard'; +import * as serviceWorker from './serviceWorker'; +import CssBaseline from '@material-ui/core/CssBaseline'; +import { createMuiTheme, MuiThemeProvider } from '@material-ui/core/styles'; +import configureStore from './store'; +import rootSaga from './sagas'; + +import { HashRouter as Router } from 'react-router-dom'; + +import { Provider } from 'react-redux'; + +const store = configureStore(); + +store.runSaga(rootSaga); + +const theme = createMuiTheme({ + palette: { + primary: { + main: '#000', + }, + secondary: { + main: '#fff', + }, + }, + colors: { + created: '#33adff', + running: '#0911f6', + restarting: '#1eb9af', + succeeded: '#02970a', + failed: '#e62e00', + killed: '#ff5c33', + }, + typography: { + fontFamily: + 'open sans,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol', + }, +}); + +ReactDOM.render( + + + + + + + + + , + document.getElementById('root'), +); + +// If you want your app to work offline and load faster, you can change +// unregister() to register() below. Note this comes with some pitfalls. +// Learn more about service workers: http://bit.ly/CRA-PWA +serviceWorker.unregister(); diff --git a/pkg/ui/v1beta1/frontend/src/reducers/general.js b/pkg/ui/v1beta1/frontend/src/reducers/general.js new file mode 100644 index 00000000000..d0989ad6355 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/reducers/general.js @@ -0,0 +1,255 @@ +import * as actions from '../actions/generalActions'; +import * as nasCreateActions from '../actions/nasCreateActions'; +import * as hpCreateActions from '../actions/hpCreateActions'; +import * as hpMonitorActions from '../actions/hpMonitorActions'; +import * as nasMonitorActions from '../actions/nasMonitorActions'; +import * as templateActions from '../actions/templateActions'; + +const initialState = { + menuOpen: false, + snackOpen: false, + snackText: '', + deleteDialog: false, + deleteId: '', + namespaces: [], + globalNamespace: '', + experiment: {}, + dialogExperimentOpen: false, + suggestion: {}, + dialogSuggestionOpen: false, + + templateNamespace: '', + templateConfigMapName: '', + templateName: '', + trialTemplatesList: [], + currentTemplateConfigMapsList: [], + currentTemplateNamesList: [], + mcKindsList: ['StdOut', 'File', 'TensorFlowEvent', 'PrometheusMetric', 'Custom', 'None'], + mcFileSystemKindsList: ['No File System', 'File', 'Directory'], + mcURISchemesList: ['HTTP', 'HTTPS'], +}; + +const generalReducer = (state = initialState, action) => { + switch (action.type) { + case actions.TOGGLE_MENU: + return { + ...state, + menuOpen: action.state, + }; + case actions.CLOSE_SNACKBAR: + return { + ...state, + snackOpen: false, + }; + case actions.SUBMIT_YAML_SUCCESS: + return { + ...state, + snackOpen: true, + snackText: 'Successfully submitted', + }; + case actions.SUBMIT_YAML_FAILURE: + return { + ...state, + snackOpen: true, + snackText: action.message, + }; + case actions.DELETE_EXPERIMENT_FAILURE: + return { + ...state, + deleteDialog: false, + snackOpen: true, + snackText: 'Whoops, something went wrong', + }; + case actions.DELETE_EXPERIMENT_SUCCESS: + return { + ...state, + deleteDialog: false, + snackOpen: true, + snackText: 'Successfully deleted. Press Update button', + }; + case actions.OPEN_DELETE_EXPERIMENT_DIALOG: + return { + ...state, + deleteDialog: true, + deleteExperimentName: action.name, + deleteExperimentNamespace: action.namespace, + }; + case actions.CLOSE_DELETE_EXPERIMENT_DIALOG: + return { + ...state, + deleteDialog: false, + }; + case nasCreateActions.SUBMIT_NAS_JOB_REQUEST: + return { + ...state, + loading: true, + }; + case nasCreateActions.SUBMIT_NAS_JOB_SUCCESS: + return { + ...state, + loading: false, + snackOpen: true, + snackText: 'Successfully submitted', + }; + case nasCreateActions.SUBMIT_NAS_JOB_FAILURE: + return { + ...state, + loading: false, + snackOpen: true, + snackText: action.message, + }; + case hpCreateActions.SUBMIT_HP_JOB_REQUEST: + return { + ...state, + loading: true, + }; + case hpCreateActions.SUBMIT_HP_JOB_SUCCESS: + return { + ...state, + loading: false, + snackOpen: true, + snackText: 'Successfully submitted', + }; + case hpCreateActions.SUBMIT_HP_JOB_FAILURE: + return { + ...state, + loading: false, + snackOpen: true, + snackText: action.message, + }; + case actions.FETCH_NAMESPACES_SUCCESS: + return { + ...state, + namespaces: action.namespaces, + }; + case actions.CHANGE_GLOBAL_NAMESPACE: + state.globalNamespace = action.globalNamespace; + return { + ...state, + globalNamespace: action.globalNamespace, + }; + case actions.FETCH_EXPERIMENT_SUCCESS: + return { + ...state, + experiment: action.experiment, + dialogExperimentOpen: true, + }; + case actions.CLOSE_DIALOG_EXPERIMENT: + return { + ...state, + dialogExperimentOpen: false, + }; + case actions.FETCH_SUGGESTION_SUCCESS: + return { + ...state, + suggestion: action.suggestion, + dialogSuggestionOpen: true, + }; + case actions.CLOSE_DIALOG_SUGGESTION: + return { + ...state, + dialogSuggestionOpen: false, + }; + case hpMonitorActions.FETCH_HP_JOB_INFO_REQUEST: + return { + ...state, + dialogExperimentOpen: false, + dialogSuggestionOpen: false, + }; + case nasMonitorActions.FETCH_NAS_JOB_INFO_REQUEST: + return { + ...state, + dialogExperimentOpen: false, + dialogSuggestionOpen: false, + }; + case templateActions.FETCH_TRIAL_TEMPLATES_SUCCESS: + let templates = action.trialTemplatesList; + + let configMapNames = templates[0].ConfigMapsList.map(configMap => configMap.ConfigMapName); + + let templateNames = templates[0].ConfigMapsList[0].TemplatesList.map( + template => template.Name, + ); + + return { + ...state, + trialTemplatesList: templates, + templateNamespace: templates[0].Namespace, + templateConfigMapName: templates[0].ConfigMapsList[0].ConfigMapName, + templateName: templates[0].ConfigMapsList[0].TemplatesList[0].Name, + currentTemplateConfigMapsList: configMapNames, + currentTemplateNamesList: templateNames, + }; + + case actions.FILTER_TEMPLATES_EXPERIMENT: + switch (action.trialConfigMapName) { + // Case when we change namespace + case '': + // Get Namespace index + let nsIndex = state.trialTemplatesList.findIndex(function(trialTemplate, i) { + return trialTemplate.Namespace === action.trialNamespace; + }); + + // Get new ConfigMapNames List + configMapNames = state.trialTemplatesList[nsIndex].ConfigMapsList.map( + configMap => configMap.ConfigMapName, + ); + + // Get new Template Names List + templateNames = state.trialTemplatesList[nsIndex].ConfigMapsList[0].TemplatesList.map( + template => template.Name, + ); + + return { + ...state, + templateNamespace: action.trialNamespace, + templateConfigMapName: configMapNames[0], + templateName: templateNames[0], + currentTemplateConfigMapsList: configMapNames, + currentTemplateNamesList: templateNames, + }; + // Case when we change configMap + default: + // Get Namespace index + nsIndex = state.trialTemplatesList.findIndex(function(trialTemplate, i) { + return trialTemplate.Namespace === action.trialNamespace; + }); + + // Get ConfigMap index + let cmIndex = state.trialTemplatesList[nsIndex].ConfigMapsList.findIndex(function( + configMap, + i, + ) { + return configMap.ConfigMapName === action.trialConfigMapName; + }); + + // Get new Template Names List + templateNames = state.trialTemplatesList[nsIndex].ConfigMapsList[ + cmIndex + ].TemplatesList.map(template => template.Name); + + return { + ...state, + templateNamespace: action.trialNamespace, + templateConfigMapName: action.trialConfigMapName, + templateName: templateNames[0], + currentTemplateNamesList: templateNames, + }; + } + case actions.CHANGE_TEMPLATE_NAME: + return { + ...state, + templateName: action.templateName, + }; + case actions.VALIDATION_ERROR: + return { + ...state, + snackOpen: true, + snackText: action.message, + }; + default: + return state; + } +}; + +export default generalReducer; diff --git a/pkg/ui/v1beta1/frontend/src/reducers/hpCreate.js b/pkg/ui/v1beta1/frontend/src/reducers/hpCreate.js new file mode 100644 index 00000000000..3901e7d0bde --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/reducers/hpCreate.js @@ -0,0 +1,382 @@ +import * as actions from '../actions/hpCreateActions'; +import * as constants from '../constants/constants'; + +const initialState = { + loading: false, + commonParametersMetadata: [ + { + name: 'Name', + value: 'random-experiment', + description: 'A name of an experiment', + }, + { + name: 'Namespace', + value: 'kubeflow', + description: 'Namespace to deploy an experiment', + }, + ], + commonParametersSpec: [ + { + name: 'ParallelTrialCount', + value: '3', + description: 'How many trials can be processed in parallel', + }, + { + name: 'MaxTrialCount', + value: '12', + description: 'Max completed trials to mark experiment as succeeded', + }, + { + name: 'MaxFailedTrialCount', + value: '3', + description: 'Max failed trials to mark experiment as failed', + }, + ], + allObjectiveTypes: ['minimize', 'maximize'], + objective: [ + { + name: 'Type', + value: 'maximize', + description: 'Type of optimization', + }, + { + name: 'Goal', + value: '0.99', + description: 'Goal of optimization', + }, + { + name: 'ObjectiveMetricName', + value: 'Validation-accuracy', + description: 'Name for the objective metric', + }, + ], + additionalMetricNames: [ + { + value: 'Train-accuracy', + }, + ], + algorithmName: 'random', + allAlgorithms: ['grid', 'random', 'hyperband', 'bayesianoptimization', 'tpe'], + algorithmSettings: [], + parameters: [ + { + name: '--lr', + parameterType: 'double', + feasibleSpace: 'feasibleSpace', + min: '0.01', + max: '0.03', + list: [], + }, + { + name: '--num-layers', + parameterType: 'int', + feasibleSpace: 'feasibleSpace', + min: '2', + max: '5', + list: [], + }, + { + name: '--optimizer', + parameterType: 'categorical', + feasibleSpace: 'list', + min: '', + max: '', + list: [ + { + value: 'sgd', + }, + { + value: 'adam', + }, + { + value: 'ftrl', + }, + ], + }, + ], + allParameterTypes: ['int', 'double', 'categorical'], + currentYaml: '', + mcSpec: { + collector: { + kind: 'StdOut', + }, + source: { + filter: { + metricsFormat: [], + }, + }, + }, + mcCustomContainerYaml: '', +}; + +const filterValue = (obj, key) => { + return obj.findIndex(p => p.name === key); +}; + +const hpCreateReducer = (state = initialState, action) => { + switch (action.type) { + case actions.CHANGE_YAML_HP: + return { + ...state, + currentYaml: action.payload, + }; + case actions.CHANGE_META_HP: + let meta = state.commonParametersMetadata.slice(); + let index = filterValue(meta, action.name); + meta[index].value = action.value; + return { + ...state, + commonParametersMetadata: meta, + }; + case actions.CHANGE_SPEC_HP: + let spec = state.commonParametersSpec.slice(); + index = filterValue(spec, action.name); + spec[index].value = action.value; + return { + ...state, + commonParametersSpec: spec, + }; + case actions.CHANGE_OBJECTIVE_HP: + let obj = state.objective.slice(); + index = filterValue(obj, action.name); + obj[index].value = action.value; + return { + ...state, + objective: obj, + }; + case actions.ADD_METRICS_HP: + let additionalMetricNames = state.additionalMetricNames.slice(); + additionalMetricNames.push({ + value: '', + }); + return { + ...state, + additionalMetricNames: additionalMetricNames, + }; + case actions.DELETE_METRICS_HP: + additionalMetricNames = state.additionalMetricNames.slice(); + additionalMetricNames.splice(action.index, 1); + return { + ...state, + additionalMetricNames: additionalMetricNames, + }; + case actions.EDIT_METRICS_HP: + additionalMetricNames = state.additionalMetricNames.slice(); + additionalMetricNames[action.index].value = action.value; + return { + ...state, + additionalMetricNames: additionalMetricNames, + }; + case actions.CHANGE_ALGORITHM_NAME_HP: + return { + ...state, + algorithmName: action.algorithmName, + }; + case actions.ADD_ALGORITHM_SETTING_HP: + let algorithmSettings = state.algorithmSettings.slice(); + let setting = { name: '', value: '' }; + algorithmSettings.push(setting); + return { + ...state, + algorithmSettings: algorithmSettings, + }; + case actions.CHANGE_ALGORITHM_SETTING_HP: + algorithmSettings = state.algorithmSettings.slice(); + algorithmSettings[action.index][action.field] = action.value; + return { + ...state, + algorithmSettings: algorithmSettings, + }; + case actions.DELETE_ALGORITHM_SETTING_HP: + algorithmSettings = state.algorithmSettings.slice(); + algorithmSettings.splice(action.index, 1); + return { + ...state, + algorithmSettings: algorithmSettings, + }; + case actions.ADD_PARAMETER_HP: + let parameters = state.parameters.slice(); + parameters.push({ + name: '', + parameterType: '', + feasibleSpace: 'feasibleSpace', + min: '', + max: '', + list: [], + }); + return { + ...state, + parameters: parameters, + }; + case actions.EDIT_PARAMETER_HP: + parameters = state.parameters.slice(); + parameters[action.index][action.field] = action.value; + return { + ...state, + parameters: parameters, + }; + case actions.DELETE_PARAMETER_HP: + parameters = state.parameters.slice(); + parameters.splice(action.index, 1); + return { + ...state, + parameters: parameters, + }; + case actions.ADD_LIST_PARAMETER_HP: + parameters = state.parameters.slice(); + parameters[action.paramIndex].list.push({ + value: '', + }); + return { + ...state, + parameters: parameters, + }; + case actions.EDIT_LIST_PARAMETER_HP: + parameters = state.parameters.slice(); + parameters[action.paramIndex].list[action.index].value = action.value; + return { + ...state, + parameters: parameters, + }; + case actions.DELETE_LIST_PARAMETER_HP: + parameters = state.parameters.slice(); + parameters[action.paramIndex].list.splice(action.index, 1); + return { + ...state, + parameters: parameters, + }; + // Metrics Collector Kind change + case actions.CHANGE_MC_KIND_HP: + let newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); + newMCSpec.collector.kind = action.kind; + + if ( + action.kind === constants.MC_KIND_FILE || + action.kind === constants.MC_KIND_TENSORFLOW_EVENT || + action.kind === constants.MC_KIND_CUSTOM + ) { + let newKind; + switch (action.kind) { + case constants.MC_KIND_FILE: + newKind = constants.MC_FILE_SYSTEM_KIND_FILE; + break; + + case constants.MC_KIND_TENSORFLOW_EVENT: + newKind = constants.MC_FILE_SYSTEM_KIND_DIRECTORY; + break; + + default: + newKind = constants.MC_FILE_SYSTEM_NO_KIND; + } + // File or TF Event Kind + newMCSpec.source.fileSystemPath = { + kind: newKind, + path: '', + }; + } else if (action.kind === constants.MC_KIND_PROMETHEUS) { + // Prometheus Kind + newMCSpec.source.httpGet = { + port: constants.MC_PROMETHEUS_DEFAULT_PORT, + path: constants.MC_PROMETHEUS_DEFAULT_PATH, + scheme: constants.MC_HTTP_GET_HTTP_SCHEME, + host: '', + httpHeaders: [], + }; + } + + return { + ...state, + mcSpec: newMCSpec, + mcCustomContainerYaml: '', + }; + // File System Path change + case actions.CHANGE_MC_FILE_SYSTEM_HP: + newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); + newMCSpec.source.fileSystemPath.kind = action.kind; + newMCSpec.source.fileSystemPath.path = action.path; + return { + ...state, + mcSpec: newMCSpec, + }; + // HTTPGet settings + case actions.CHANGE_MC_HTTP_GET_HP: + newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); + + newMCSpec.source.httpGet.port = action.port; + newMCSpec.source.httpGet.path = action.path; + newMCSpec.source.httpGet.scheme = action.scheme; + newMCSpec.source.httpGet.host = action.host; + + return { + ...state, + mcSpec: newMCSpec, + }; + // Collector HTTPGet Headers + case actions.ADD_MC_HTTP_GET_HEADER_HP: + newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); + let currentHeaders = newMCSpec.source.httpGet.httpHeaders.slice(); + let newHeader = { name: '', value: '' }; + currentHeaders.push(newHeader); + newMCSpec.source.httpGet.httpHeaders = currentHeaders; + return { + ...state, + mcSpec: newMCSpec, + }; + case actions.CHANGE_MC_HTTP_GET_HEADER_HP: + newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); + currentHeaders = newMCSpec.source.httpGet.httpHeaders.slice(); + currentHeaders[action.index][action.fieldName] = action.value; + newMCSpec.source.httpGet.httpHeaders = currentHeaders; + return { + ...state, + mcSpec: newMCSpec, + }; + case actions.DELETE_MC_HTTP_GET_HEADER_HP: + newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); + currentHeaders = newMCSpec.source.httpGet.httpHeaders.slice(); + currentHeaders.splice(action.index, 1); + newMCSpec.source.httpGet.httpHeaders = currentHeaders; + return { + ...state, + mcSpec: newMCSpec, + }; + // Collector Custom container + case actions.CHANGE_MC_CUSTOM_CONTAINER_HP: + return { + ...state, + mcCustomContainerYaml: action.yamlContainer, + }; + // Collector Metrics Format + case actions.ADD_MC_METRICS_FORMAT_HP: + newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); + let currentFormats = newMCSpec.source.filter.metricsFormat.slice(); + currentFormats.push(''); + newMCSpec.source.filter.metricsFormat = currentFormats; + return { + ...state, + mcSpec: newMCSpec, + }; + case actions.CHANGE_MC_METRIC_FORMAT_HP: + newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); + currentFormats = newMCSpec.source.filter.metricsFormat.slice(); + currentFormats[action.index] = action.format; + newMCSpec.source.filter.metricsFormat = currentFormats; + return { + ...state, + mcSpec: newMCSpec, + }; + case actions.DELETE_MC_METRIC_FORMAT_HP: + newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); + currentFormats = newMCSpec.source.filter.metricsFormat.slice(); + currentFormats.splice(action.index, 1); + newMCSpec.source.filter.metricsFormat = currentFormats; + return { + ...state, + mcSpec: newMCSpec, + }; + default: + return state; + } +}; + +export default hpCreateReducer; diff --git a/pkg/ui/v1beta1/frontend/src/reducers/hpMonitor.js b/pkg/ui/v1beta1/frontend/src/reducers/hpMonitor.js new file mode 100644 index 00000000000..a1110f5ef51 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/reducers/hpMonitor.js @@ -0,0 +1,127 @@ +import * as actions from '../actions/hpMonitorActions'; + +const initialState = { + experimentName: '', + experimentNamespace: '', + filterType: { + Created: true, + Running: true, + Restarting: true, + Succeeded: true, + Failed: true, + }, + jobsList: [], + filteredJobsList: [], + jobData: [], + trialData: [], + dialogTrialOpen: false, + loading: false, + trialName: '', +}; + +const hpMonitorReducer = (state = initialState, action) => { + switch (action.type) { + case actions.FILTER_JOBS: + let jobs = state.jobsList.slice(); + let newList = jobs.filter( + job => + job.name.includes(action.experimentName) && + (job.namespace == action.experimentNamespace || + action.experimentNamespace == 'All namespaces' || + action.experimentNamespace.length == 0), + ); + let types = Object.assign({}, state.filterType); + var typeKeys = Object.keys(types); + + var filters = typeKeys.filter(key => { + return types[key]; + }); + + let filteredJobs = newList.filter(job => filters.includes(job.status)); + + return { + ...state, + filteredJobsList: filteredJobs, + experimentName: action.experimentName, + experimentNamespace: action.experimentNamespace, + }; + case actions.CHANGE_TYPE: + jobs = state.jobsList.slice(); + newList = jobs.filter( + job => + job.name.includes(state.experimentName) && + (job.namespace == state.experimentNamespace || + state.experimentNamespace == 'All namespaces' || + state.experimentNamespace.length == 0), + ); + types = Object.assign({}, state.filterType); + types[action.filter] = action.checked; + typeKeys = Object.keys(types); + + filters = typeKeys.filter(key => { + return types[key]; + }); + filteredJobs = newList.filter(job => filters.includes(job.status)); + + return { + ...state, + filterType: types, + filteredJobsList: filteredJobs, + }; + case actions.FETCH_HP_JOBS_SUCCESS: + jobs = action.jobs; + types = Object.assign({}, state.filterType); + typeKeys = Object.keys(types); + + filters = typeKeys.filter(key => { + return types[key]; + }); + + filteredJobs = jobs.filter( + job => + filters.includes(job.status) && + job.name.includes(state.experimentName) && + (job.namespace == state.experimentNamespace || + state.experimentNamespace == 'All namespaces' || + state.experimentNamespace.length == 0), + ); + return { + ...state, + jobsList: action.jobs, + filteredJobsList: filteredJobs, + }; + case actions.FETCH_HP_JOB_INFO_REQUEST: + return { + ...state, + loading: true, + dialogTrialOpen: false, + }; + case actions.FETCH_HP_JOB_INFO_SUCCESS: + return { + ...state, + jobData: action.jobData, + loading: false, + }; + case actions.FETCH_HP_JOB_INFO_FAILURE: + return { + ...state, + loading: false, + }; + case actions.FETCH_HP_JOB_TRIAL_INFO_SUCCESS: + return { + ...state, + trialData: action.trialData, + dialogTrialOpen: true, + trialName: action.trialName, + }; + case actions.CLOSE_DIALOG_TRIAL: + return { + ...state, + dialogTrialOpen: false, + }; + default: + return state; + } +}; + +export default hpMonitorReducer; diff --git a/pkg/ui/v1beta1/frontend/src/reducers/index.js b/pkg/ui/v1beta1/frontend/src/reducers/index.js new file mode 100644 index 00000000000..5e34e9f4782 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/reducers/index.js @@ -0,0 +1,18 @@ +import { combineReducers } from 'redux'; +import generalReducer from './general'; +import nasCreateReducer from './nasCreate'; +import nasMonitorReducer from './nasMonitor'; +import hpCreateReducer from './hpCreate'; +import templateReducer from './template'; +import hpMonitorReducer from './hpMonitor'; + +const rootReducer = combineReducers({ + ['general']: generalReducer, + ['template']: templateReducer, + ['hpCreate']: hpCreateReducer, + ['hpMonitor']: hpMonitorReducer, + ['nasCreate']: nasCreateReducer, + ['nasMonitor']: nasMonitorReducer, +}); + +export default rootReducer; diff --git a/pkg/ui/v1beta1/frontend/src/reducers/nasCreate.js b/pkg/ui/v1beta1/frontend/src/reducers/nasCreate.js new file mode 100644 index 00000000000..9a3198d80e5 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/reducers/nasCreate.js @@ -0,0 +1,682 @@ +import * as actions from '../actions/nasCreateActions'; +import * as constants from '../constants/constants'; + +const initialState = { + commonParametersMetadata: [ + { + name: 'Name', + value: 'enas-example', + description: 'A name of an experiment', + }, + { + name: 'Namespace', + value: 'kubeflow', + description: 'Namespace to deploy an experiment', + }, + ], + commonParametersSpec: [ + { + name: 'ParallelTrialCount', + value: '3', + description: 'How many trials can be processed in parallel', + }, + { + name: 'MaxTrialCount', + value: '12', + description: 'Max completed trials to mark experiment as succeeded', + }, + { + name: 'MaxFailedTrialCount', + value: '3', + description: 'Max failed trials to mark experiment as failed', + }, + ], + allObjectiveTypes: ['minimize', 'maximize'], + objective: [ + { + name: 'Type', + value: 'maximize', + description: 'Type of optimization', + }, + { + name: 'Goal', + value: '0.99', + description: 'Goal of optimization', + }, + { + name: 'ObjectiveMetricName', + value: 'Validation-Accuracy', + description: 'Name for the objective metric', + }, + ], + additionalMetricNames: [], + algorithmName: 'enas', + allAlgorithms: ['enas'], + algorithmSettings: [ + { + name: 'controller_hidden_size', + value: '64', + }, + { + name: 'controller_temperature', + value: '5', + }, + { + name: 'controller_tanh_const', + value: '2.25', + }, + { + name: 'controller_entropy_weight', + value: '1e-5', + }, + { + name: 'controller_baseline_decay', + value: '0.999', + }, + { + name: 'controller_learning_rate', + value: '5e-5', + }, + { + name: 'controller_skip_target', + value: '0.4', + }, + { + name: 'controller_skip_weight', + value: '0.8', + }, + { + name: 'controller_train_steps', + value: '50', + }, + { + name: 'controller_log_every_steps', + value: '10', + }, + ], + //Graph Config + numLayers: '8', + inputSize: ['32', '32', '3'], + outputSize: ['10'], + operations: [ + { + operationType: 'convolution', + parameters: [ + { + name: 'filter_size', + parameterType: 'categorical', + feasibleSpace: 'list', + min: '', + max: '', + step: '', + list: [ + { + value: '3', + }, + { + value: '5', + }, + { + value: '7', + }, + ], + }, + { + name: 'num_filter', + parameterType: 'categorical', + feasibleSpace: 'list', + min: '', + max: '', + step: '', + list: [ + { + value: '32', + }, + { + value: '48', + }, + { + value: '64', + }, + { + value: '96', + }, + { + value: '128', + }, + ], + }, + { + name: 'stride', + parameterType: 'categorical', + feasibleSpace: 'list', + min: '', + max: '', + step: '', + list: [ + { + value: '1', + }, + { + value: '2', + }, + ], + }, + ], + }, + { + operationType: 'separable_convolution', + parameters: [ + { + name: 'filter_size', + parameterType: 'categorical', + feasibleSpace: 'list', + min: '', + max: '', + step: '', + list: [ + { + value: '3', + }, + { + value: '5', + }, + { + value: '7', + }, + ], + }, + { + name: 'num_filter', + parameterType: 'categorical', + feasibleSpace: 'list', + min: '', + max: '', + step: '', + list: [ + { + value: '32', + }, + { + value: '48', + }, + { + value: '64', + }, + { + value: '96', + }, + { + value: '128', + }, + ], + }, + { + name: 'stride', + parameterType: 'categorical', + feasibleSpace: 'list', + min: '', + max: '', + step: '', + list: [ + { + value: '1', + }, + { + value: '2', + }, + ], + }, + { + name: 'depth_multiplier', + parameterType: 'categorical', + feasibleSpace: 'list', + min: '', + max: '', + step: '', + list: [ + { + value: '1', + }, + { + value: '2', + }, + ], + }, + ], + }, + { + operationType: 'depthwise_convolution', + parameters: [ + { + name: 'filter_size', + parameterType: 'categorical', + feasibleSpace: 'list', + min: '', + max: '', + step: '', + list: [ + { + value: '3', + }, + { + value: '5', + }, + { + value: '7', + }, + ], + }, + { + name: 'stride', + parameterType: 'categorical', + feasibleSpace: 'list', + min: '', + max: '', + step: '', + list: [ + { + value: '1', + }, + { + value: '2', + }, + ], + }, + { + name: 'depth_multiplier', + parameterType: 'categorical', + feasibleSpace: 'list', + min: '', + max: '', + step: '', + list: [ + { + value: '1', + }, + { + value: '2', + }, + ], + }, + ], + }, + { + operationType: 'reduction', + parameters: [ + { + name: 'reduction_type', + parameterType: 'categorical', + feasibleSpace: 'list', + min: '', + max: '', + step: '', + list: [ + { + value: 'max_pooling', + }, + { + value: 'avg_pooling', + }, + ], + }, + { + name: 'pool_size', + parameterType: 'int', + feasibleSpace: 'feasibleSpace', + min: '2', + max: '3', + step: '1', + list: [], + }, + ], + }, + ], + allParameterTypes: ['int', 'double', 'categorical'], + currentYaml: '', + snackText: '', + snackOpen: false, + mcSpec: { + collector: { + kind: 'StdOut', + }, + source: { + filter: { + metricsFormat: [], + }, + }, + }, + mcCustomContainerYaml: '', +}; + +const filterValue = (obj, key) => { + return obj.findIndex(p => p.name === key); +}; + +const nasCreateReducer = (state = initialState, action) => { + switch (action.type) { + case actions.CHANGE_YAML_NAS: + return { + ...state, + currentYaml: action.payload, + }; + case actions.CHANGE_META_NAS: + let meta = state.commonParametersMetadata.slice(); + let index = filterValue(meta, action.name); + meta[index].value = action.value; + return { + ...state, + commonParametersMetadata: meta, + }; + case actions.CHANGE_SPEC_NAS: + let spec = state.commonParametersSpec.slice(); + index = filterValue(spec, action.name); + spec[index].value = action.value; + return { + ...state, + commonParametersSpec: spec, + }; + case actions.CHANGE_OBJECTIVE_NAS: + let obj = state.objective.slice(); + index = filterValue(obj, action.name); + obj[index].value = action.value; + return { + ...state, + objective: obj, + }; + case actions.ADD_METRICS_NAS: + let additionalMetricNames = state.additionalMetricNames.slice(); + additionalMetricNames.push({ + value: '', + }); + return { + ...state, + additionalMetricNames: additionalMetricNames, + }; + case actions.DELETE_METRICS_NAS: + additionalMetricNames = state.additionalMetricNames.slice(); + additionalMetricNames.splice(action.index, 1); + return { + ...state, + additionalMetricNames: additionalMetricNames, + }; + case actions.EDIT_METRICS_NAS: + additionalMetricNames = state.additionalMetricNames.slice(); + additionalMetricNames[action.index].value = action.value; + return { + ...state, + additionalMetricNames: additionalMetricNames, + }; + case actions.CHANGE_ALGORITHM_NAME_NAS: + return { + ...state, + algorithmName: action.algorithmName, + }; + case actions.ADD_ALGORITHM_SETTING_NAS: + let algorithmSettings = state.algorithmSettings.slice(); + let setting = { name: '', value: '' }; + algorithmSettings.push(setting); + return { + ...state, + algorithmSettings: algorithmSettings, + }; + case actions.CHANGE_ALGORITHM_SETTING_NAS: + algorithmSettings = state.algorithmSettings.slice(); + algorithmSettings[action.index][action.field] = action.value; + return { + ...state, + algorithmSettings: algorithmSettings, + }; + case actions.DELETE_ALGORITHM_SETTING_NAS: + algorithmSettings = state.algorithmSettings.slice(); + algorithmSettings.splice(action.index, 1); + return { + ...state, + algorithmSettings: algorithmSettings, + }; + case actions.EDIT_NUM_LAYERS: + let numLayers = action.value; + return { + ...state, + numLayers: numLayers, + }; + case actions.ADD_SIZE: + let size = state[action.sizeType].slice(); + size.push('0'); + return { + ...state, + [action.sizeType]: size, + }; + case actions.EDIT_SIZE: + size = state[action.sizeType].slice(); + size[action.index] = action.value; + return { + ...state, + [action.sizeType]: size, + }; + case actions.DELETE_SIZE: + size = state[action.sizeType].slice(); + size.splice(action.index, 1); + return { + ...state, + [action.sizeType]: size, + }; + case actions.ADD_OPERATION: + let operations = state.operations.slice(); + operations.push({ + operationType: '', + parameters: [], + }); + return { + ...state, + operations, + }; + case actions.DELETE_OPERATION: + operations = state.operations.slice(); + operations.splice(action.index, 1); + return { + ...state, + operations, + }; + case actions.CHANGE_OPERATION: + operations = state.operations.slice(); + operations[action.index].operationType = action.value; + return { + ...state, + operations, + }; + case actions.ADD_PARAMETER_NAS: + operations = state.operations.slice(); + operations[action.opIndex].parameters.push({ + name: '', + parameterType: 'categorical', + feasibleSpace: 'list', + min: '', + max: '', + step: '', + list: [], + }); + return { + ...state, + operations, + }; + case actions.CHANGE_PARAMETER_NAS: + operations = state.operations.slice(); + operations[action.opIndex].parameters[action.paramIndex][action.field] = action.value; + return { + ...state, + operations, + }; + case actions.DELETE_PARAMETER_NAS: + operations = state.operations.slice(); + operations[action.opIndex].parameters.splice(action.paramIndex, 1); + return { + ...state, + operations, + }; + case actions.ADD_LIST_PARAMETER_NAS: + operations = state.operations.slice(); + operations[action.opIndex].parameters[action.paramIndex].list.push({ + //TODO: Remove it? + // name: "", + value: '', + }); + return { + ...state, + operations, + }; + case actions.DELETE_LIST_PARAMETER_NAS: + operations = state.operations.slice(); + operations[action.opIndex].parameters[action.paramIndex].list.splice(action.listIndex, 1); + return { + ...state, + operations, + }; + case actions.EDIT_LIST_PARAMETER_NAS: + operations = state.operations.slice(); + operations[action.opIndex].parameters[action.paramIndex].list[action.listIndex].value = + action.value; + return { + ...state, + operations, + }; + case actions.CLOSE_SNACKBAR: + return { + ...state, + snackOpen: false, + }; + // Metrics Collector Kind change + case actions.CHANGE_MC_KIND_NAS: + let newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); + newMCSpec.collector.kind = action.kind; + + if ( + action.kind === constants.MC_KIND_FILE || + action.kind === constants.MC_KIND_TENSORFLOW_EVENT || + action.kind === constants.MC_KIND_CUSTOM + ) { + let newKind; + switch (action.kind) { + case constants.MC_KIND_FILE: + newKind = constants.MC_FILE_SYSTEM_KIND_FILE; + break; + + case constants.MC_KIND_TENSORFLOW_EVENT: + newKind = constants.MC_FILE_SYSTEM_KIND_DIRECTORY; + break; + + default: + newKind = constants.MC_FILE_SYSTEM_NO_KIND; + } + // File or TF Event Kind + newMCSpec.source.fileSystemPath = { + kind: newKind, + path: '', + }; + } else if (action.kind === constants.MC_KIND_PROMETHEUS) { + // Prometheus Kind + newMCSpec.source.httpGet = { + port: constants.MC_PROMETHEUS_DEFAULT_PORT, + path: constants.MC_PROMETHEUS_DEFAULT_PATH, + scheme: constants.MC_HTTP_GET_HTTP_SCHEME, + host: '', + httpHeaders: [], + }; + } + + return { + ...state, + mcSpec: newMCSpec, + mcCustomContainerYaml: '', + }; + // File System Path change + case actions.CHANGE_MC_FILE_SYSTEM_NAS: + newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); + newMCSpec.source.fileSystemPath.kind = action.kind; + newMCSpec.source.fileSystemPath.path = action.path; + return { + ...state, + mcSpec: newMCSpec, + }; + // HTTPGet settings + case actions.CHANGE_MC_HTTP_GET_NAS: + newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); + + newMCSpec.source.httpGet.port = action.port; + newMCSpec.source.httpGet.path = action.path; + newMCSpec.source.httpGet.scheme = action.scheme; + newMCSpec.source.httpGet.host = action.host; + + return { + ...state, + mcSpec: newMCSpec, + }; + // Collector HTTPGet Headers + case actions.ADD_MC_HTTP_GET_HEADER_NAS: + newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); + let currentHeaders = newMCSpec.source.httpGet.httpHeaders.slice(); + let newHeader = { name: '', value: '' }; + currentHeaders.push(newHeader); + newMCSpec.source.httpGet.httpHeaders = currentHeaders; + return { + ...state, + mcSpec: newMCSpec, + }; + case actions.CHANGE_MC_HTTP_GET_HEADER_NAS: + newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); + currentHeaders = newMCSpec.source.httpGet.httpHeaders.slice(); + currentHeaders[action.index][action.fieldName] = action.value; + newMCSpec.source.httpGet.httpHeaders = currentHeaders; + return { + ...state, + mcSpec: newMCSpec, + }; + case actions.DELETE_MC_HTTP_GET_HEADER_NAS: + newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); + currentHeaders = newMCSpec.source.httpGet.httpHeaders.slice(); + currentHeaders.splice(action.index, 1); + newMCSpec.source.httpGet.httpHeaders = currentHeaders; + return { + ...state, + mcSpec: newMCSpec, + }; + // Collector Custom container + case actions.CHANGE_MC_CUSTOM_CONTAINER_NAS: + return { + ...state, + mcCustomContainerYaml: action.yamlContainer, + }; + // Collector Metrics Format + case actions.ADD_MC_METRICS_FORMAT_NAS: + newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); + let currentFormats = newMCSpec.source.filter.metricsFormat.slice(); + currentFormats.push(''); + newMCSpec.source.filter.metricsFormat = currentFormats; + return { + ...state, + mcSpec: newMCSpec, + }; + case actions.CHANGE_MC_METRIC_FORMAT_NAS: + newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); + currentFormats = newMCSpec.source.filter.metricsFormat.slice(); + currentFormats[action.index] = action.format; + newMCSpec.source.filter.metricsFormat = currentFormats; + return { + ...state, + mcSpec: newMCSpec, + }; + case actions.DELETE_MC_METRIC_FORMAT_NAS: + newMCSpec = JSON.parse(JSON.stringify(state.mcSpec)); + currentFormats = newMCSpec.source.filter.metricsFormat.slice(); + currentFormats.splice(action.index, 1); + newMCSpec.source.filter.metricsFormat = currentFormats; + return { + ...state, + mcSpec: newMCSpec, + }; + default: + return state; + } +}; + +export default nasCreateReducer; diff --git a/pkg/ui/v1beta1/frontend/src/reducers/nasMonitor.js b/pkg/ui/v1beta1/frontend/src/reducers/nasMonitor.js new file mode 100644 index 00000000000..7fbc12655db --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/reducers/nasMonitor.js @@ -0,0 +1,112 @@ +import * as actions from '../actions/nasMonitorActions'; + +const initialState = { + experimentName: '', + experimentNamespace: '', + filter: '', + filterType: { + Created: true, + Running: true, + Restarting: true, + Succeeded: true, + Failed: true, + }, + jobsList: [], + filteredJobsList: [], + loading: false, + steps: [], +}; + +const nasMonitorReducer = (state = initialState, action) => { + switch (action.type) { + case actions.FILTER_JOBS: + let jobs = state.jobsList.slice(); + let newList = jobs.filter( + job => + job.name.includes(action.experimentName) && + (job.namespace == action.experimentNamespace || + action.experimentNamespace == 'All namespaces' || + action.experimentNamespace.length == 0), + ); + let types = Object.assign({}, state.filterType); + var typeKeys = Object.keys(types); + + var filters = typeKeys.filter(key => { + return types[key]; + }); + + let filteredJobs = newList.filter(job => filters.includes(job.status)); + + return { + ...state, + filteredJobsList: filteredJobs, + experimentName: action.experimentName, + experimentNamespace: action.experimentNamespace, + }; + case actions.CHANGE_TYPE: + jobs = state.jobsList.slice(); + newList = jobs.filter( + job => + job.name.includes(state.experimentName) && + (job.namespace == state.experimentNamespace || + state.experimentNamespace == 'All namespaces' || + state.experimentNamespace.length == 0), + ); + types = Object.assign({}, state.filterType); + types[action.filter] = action.checked; + typeKeys = Object.keys(types); + + filters = typeKeys.filter(key => { + return types[key]; + }); + filteredJobs = newList.filter(job => filters.includes(job.status)); + + return { + ...state, + filterType: types, + filteredJobsList: filteredJobs, + }; + case actions.FETCH_NAS_JOBS_SUCCESS: + jobs = action.jobs; + types = Object.assign({}, state.filterType); + typeKeys = Object.keys(types); + + filters = typeKeys.filter(key => { + return types[key]; + }); + + filteredJobs = jobs.filter( + job => + filters.includes(job.status) && + job.name.includes(state.experimentName) && + (job.namespace == state.experimentNamespace || + state.experimentNamespace == 'All namespaces' || + state.experimentNamespace.length == 0), + ); + return { + ...state, + jobsList: action.jobs, + filteredJobsList: filteredJobs, + }; + case actions.FETCH_NAS_JOB_INFO_REQUEST: + return { + ...state, + loading: true, + }; + case actions.FETCH_NAS_JOB_INFO_FAILURE: + return { + ...state, + loading: false, + }; + case actions.FETCH_NAS_JOB_INFO_SUCCESS: + return { + ...state, + loading: false, + steps: action.steps, + }; + default: + return state; + } +}; + +export default nasMonitorReducer; diff --git a/pkg/ui/v1beta1/frontend/src/reducers/template.js b/pkg/ui/v1beta1/frontend/src/reducers/template.js new file mode 100644 index 00000000000..8759a3135a2 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/reducers/template.js @@ -0,0 +1,152 @@ +import * as actions from '../actions/templateActions'; + +const initialState = { + addOpen: false, + editOpen: false, + deleteOpen: false, + trialTemplatesList: [], + filteredTrialTemplatesList: [], + currentTemplateName: '', + edittedTemplateNamespace: '', + edittedTemplateConfigMapName: '', + edittedTemplateName: '', + edittedTemplateYaml: '', + loading: false, + edittedTemplateConfigMapSelectList: [], + filteredNamespace: 'All namespaces', + filteredConfigMapName: '', +}; + +const rootReducer = (state = initialState, action) => { + switch (action.type) { + case actions.CLOSE_DIALOG: + return { + ...state, + editOpen: false, + addOpen: false, + deleteOpen: false, + }; + case actions.OPEN_DIALOG: + switch (action.dialogType) { + case 'add': + return { + ...state, + addOpen: true, + edittedTemplateNamespace: action.namespace, + edittedTemplateConfigMapName: action.configMapName, + edittedTemplateName: '', + edittedTemplateYaml: '', + filteredNamespace: 'All namespaces', + filteredConfigMapName: '', + }; + case 'edit': + return { + ...state, + editOpen: true, + edittedTemplateNamespace: action.namespace, + edittedTemplateConfigMapName: action.configMapName, + edittedTemplateName: action.templateName, + edittedTemplateYaml: action.templateYaml, + currentTemplateName: action.templateName, + filteredNamespace: 'All namespaces', + filteredConfigMapName: '', + }; + case 'delete': + return { + ...state, + deleteOpen: true, + edittedTemplateNamespace: action.namespace, + edittedTemplateConfigMapName: action.configMapName, + edittedTemplateName: action.templateName, + filteredNamespace: 'All namespaces', + filteredConfigMapName: '', + }; + default: + return state; + } + case actions.FETCH_TRIAL_TEMPLATES_REQUEST: + return { + ...state, + loading: true, + }; + case actions.FETCH_TRIAL_TEMPLATES_FAILURE: + return { + ...state, + loading: false, + }; + case actions.FETCH_TRIAL_TEMPLATES_SUCCESS: + return { + ...state, + trialTemplatesList: action.trialTemplatesList, + filteredTrialTemplatesList: action.trialTemplatesList, + loading: false, + }; + case actions.ADD_TEMPLATE_SUCCESS: + case actions.DELETE_TEMPLATE_SUCCESS: + case actions.EDIT_TEMPLATE_SUCCESS: + return { + ...state, + addOpen: false, + deleteOpen: false, + editOpen: false, + trialTemplatesList: action.trialTemplatesList, + filteredTrialTemplatesList: action.trialTemplatesList, + }; + + case actions.ADD_TEMPLATE_FAILURE: + case actions.EDIT_TEMPLATE_FAILURE: + case actions.DELETE_TEMPLATE_FAILURE: + return { + ...state, + addOpen: false, + deleteOpen: false, + editOpen: false, + }; + case actions.CHANGE_TEMPLATE: + return { + ...state, + edittedTemplateNamespace: action.edittedTemplateNamespace, + edittedTemplateConfigMapName: action.edittedTemplateConfigMapName, + edittedTemplateName: action.edittedTemplateName, + edittedTemplateYaml: action.edittedTemplateYaml, + edittedTemplateConfigMapSelectList: action.edittedTemplateConfigMapSelectList, + }; + case actions.FILTER_TEMPLATES: + let templates = state.trialTemplatesList; + + //Filter ConfigMap + let filteredConfigMaps = []; + for (let i = 0; i < templates.length; i++) { + let configMapsList = []; + for (let j = 0; j < templates[i].ConfigMapsList.length; j++) { + if (templates[i].ConfigMapsList[j].ConfigMapName.includes(action.filteredConfigMapName)) { + configMapsList.push(templates[i].ConfigMapsList[j]); + } + } + if (configMapsList.length != 0) { + let newNamespaceBlock = {}; + newNamespaceBlock.Namespace = templates[i].Namespace; + newNamespaceBlock.ConfigMapsList = configMapsList; + filteredConfigMaps.push(newNamespaceBlock); + } + } + + //Filter Namespace + let filteredTemplates = filteredConfigMaps.filter( + template => + template.Namespace == action.filteredNamespace || + action.filteredNamespace == 'All namespaces', + ); + + return { + ...state, + filteredNamespace: action.filteredNamespace, + filteredConfigMapName: action.filteredConfigMapName, + filteredTrialTemplatesList: filteredTemplates, + }; + default: + return state; + } +}; + +export default rootReducer; diff --git a/pkg/ui/v1beta1/frontend/src/sagas/index.js b/pkg/ui/v1beta1/frontend/src/sagas/index.js new file mode 100644 index 00000000000..5ffb35c5212 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/sagas/index.js @@ -0,0 +1,691 @@ +import { take, put, call, fork, select, all, takeEvery } from 'redux-saga/effects'; +import axios from 'axios'; +import * as templateActions from '../actions/templateActions'; +import * as hpMonitorActions from '../actions/hpMonitorActions'; +import * as hpCreateActions from '../actions/hpCreateActions'; +import * as nasMonitorActions from '../actions/nasMonitorActions'; +import * as nasCreateActions from '../actions/nasCreateActions'; +import * as generalActions from '../actions/generalActions'; + +export const submitYaml = function*() { + while (true) { + const action = yield take(generalActions.SUBMIT_YAML_REQUEST); + try { + let isRightNamespace = false; + for (const [index, value] of Object.entries(action.yaml.split('\n'))) { + const noSpaceLine = value.replace(/\s/g, ''); + if (noSpaceLine == 'trialTemplate:') { + break; + } + if (action.globalNamespace == '' || noSpaceLine == 'namespace:' + action.globalNamespace) { + isRightNamespace = true; + break; + } + } + if (isRightNamespace) { + const result = yield call(goSubmitYaml, action.yaml); + if (result.status === 200) { + yield put({ + type: generalActions.SUBMIT_YAML_SUCCESS, + }); + } else { + yield put({ + type: generalActions.SUBMIT_YAML_FAILURE, + message: result.message, + }); + } + } else { + yield put({ + type: generalActions.SUBMIT_YAML_FAILURE, + message: 'You can submit experiments only in ' + action.globalNamespace + ' namespace!', + }); + } + } catch (err) { + yield put({ + type: generalActions.SUBMIT_YAML_FAILURE, + }); + } + } +}; + +const goSubmitYaml = function*(yaml) { + try { + const data = { + yaml, + }; + const result = yield call(axios.post, '/katib/submit_yaml/', data); + return result; + } catch (err) { + return { + status: 500, + message: err.response.data, + }; + } +}; + +export const deleteExperiment = function*() { + while (true) { + const action = yield take(generalActions.DELETE_EXPERIMENT_REQUEST); + try { + const result = yield call(goDeleteExperiment, action.name, action.namespace); + if (result.status === 200) { + yield put({ + type: generalActions.DELETE_EXPERIMENT_SUCCESS, + }); + } else { + yield put({ + type: generalActions.DELETE_EXPERIMENT_FAILURE, + }); + } + } catch (err) { + yield put({ + type: generalActions.DELETE_EXPERIMENT_FAILURE, + }); + } + } +}; + +const goDeleteExperiment = function*(name, namespace) { + try { + const result = yield call( + axios.get, + `/katib/delete_experiment/?experimentName=${name}&namespace=${namespace}`, + ); + return result; + } catch (err) { + yield put({ + type: generalActions.DELETE_EXPERIMENT_FAILURE, + }); + } +}; + +export const submitHPJob = function*() { + while (true) { + const action = yield take(hpCreateActions.SUBMIT_HP_JOB_REQUEST); + try { + const result = yield call(goSubmitHPJob, action.data); + if (result.status === 200) { + yield put({ + type: hpCreateActions.SUBMIT_HP_JOB_SUCCESS, + }); + } else { + yield put({ + type: hpCreateActions.SUBMIT_HP_JOB_FAILURE, + message: result.message, + }); + } + } catch (err) { + yield put({ + type: hpCreateActions.SUBMIT_HP_JOB_FAILURE, + }); + } + } +}; + +const goSubmitHPJob = function*(postData) { + try { + const data = { + postData, + }; + const result = yield call(axios.post, '/katib/submit_hp_job/', data); + return result; + } catch (err) { + return { + status: 500, + message: err.response.data, + }; + } +}; + +export const fetchHPJobs = function*() { + while (true) { + const action = yield take(hpMonitorActions.FETCH_HP_JOBS_REQUEST); + try { + const result = yield call(goFetchHPJobs); + if (result.status === 200) { + let data = Object.assign(result.data, {}); + data.map((template, i) => { + Object.keys(template).forEach(key => { + const value = template[key]; + delete template[key]; + template[key.toLowerCase()] = value; + }); + }); + yield put({ + type: hpMonitorActions.FETCH_HP_JOBS_SUCCESS, + jobs: data, + }); + } else { + yield put({ + type: hpMonitorActions.FETCH_HP_JOBS_FAILURE, + }); + } + } catch (err) { + yield put({ + type: hpMonitorActions.FETCH_HP_JOBS_FAILURE, + }); + } + } +}; + +const goFetchHPJobs = function*() { + try { + const result = yield call(axios.get, '/katib/fetch_hp_jobs/'); + return result; + } catch (err) { + yield put({ + type: hpMonitorActions.FETCH_HP_JOBS_FAILURE, + }); + } +}; + +export const fetchExperiment = function*() { + while (true) { + const action = yield take(generalActions.FETCH_EXPERIMENT_REQUEST); + try { + const result = yield call(goFetchExperiment, action.name, action.namespace); + if (result.status === 200) { + yield put({ + type: generalActions.FETCH_EXPERIMENT_SUCCESS, + experiment: result.data, + }); + } else { + yield put({ + type: generalActions.FETCH_EXPERIMENT_FAILURE, + }); + } + } catch (err) { + yield put({ + type: generalActions.FETCH_EXPERIMENT_FAILURE, + }); + } + } +}; + +const goFetchExperiment = function*(name, namespace) { + try { + const result = yield call( + axios.get, + `/katib/fetch_experiment/?experimentName=${name}&namespace=${namespace}`, + ); + return result; + } catch (err) { + yield put({ + type: generalActions.FETCH_EXPERIMENT_FAILURE, + }); + } +}; + +export const fetchSuggestion = function*() { + while (true) { + const action = yield take(generalActions.FETCH_SUGGESTION_REQUEST); + try { + const result = yield call(goFetchSuggestion, action.name, action.namespace); + if (result.status === 200) { + yield put({ + type: generalActions.FETCH_SUGGESTION_SUCCESS, + suggestion: result.data, + }); + } else { + yield put({ + type: generalActions.FETCH_SUGGESTION_FAILURE, + }); + } + } catch (err) { + yield put({ + type: generalActions.FETCH_SUGGESTION_FAILURE, + }); + } + } +}; + +const goFetchSuggestion = function*(name, namespace) { + try { + const result = yield call( + axios.get, + `/katib/fetch_suggestion/?suggestionName=${name}&namespace=${namespace}`, + ); + return result; + } catch (err) { + yield put({ + type: generalActions.FETCH_SUGGESTION_FAILURE, + }); + } +}; + +export const fetchHPJobInfo = function*() { + while (true) { + const action = yield take(hpMonitorActions.FETCH_HP_JOB_INFO_REQUEST); + try { + const result = yield call(goFetchHPJobInfo, action.name, action.namespace); + if (result.status === 200) { + let data = result.data.split('\n').map((line, i) => line.split(',')); + yield put({ + type: hpMonitorActions.FETCH_HP_JOB_INFO_SUCCESS, + jobData: data, + }); + } else { + yield put({ + type: hpMonitorActions.FETCH_HP_JOB_INFO_FAILURE, + }); + } + } catch (err) { + yield put({ + type: hpMonitorActions.FETCH_HP_JOB_INFO_FAILURE, + }); + } + } +}; + +const goFetchHPJobInfo = function*(name, namespace) { + try { + const result = yield call( + axios.get, + `/katib/fetch_hp_job_info/?experimentName=${name}&namespace=${namespace}`, + ); + return result; + } catch (err) { + yield put({ + type: hpMonitorActions.FETCH_HP_JOB_INFO_FAILURE, + }); + } +}; + +export const fetchHPJobTrialInfo = function*() { + while (true) { + const action = yield take(hpMonitorActions.FETCH_HP_JOB_TRIAL_INFO_REQUEST); + try { + const result = yield call(gofetchHPJobTrialInfo, action.trialName, action.namespace); + if (result.status === 200) { + let data = result.data.split('\n').map((line, i) => line.split(',')); + yield put({ + type: hpMonitorActions.FETCH_HP_JOB_TRIAL_INFO_SUCCESS, + trialData: data, + trialName: action.trialName, + }); + } else { + yield put({ + type: hpMonitorActions.FETCH_HP_JOB_TRIAL_INFO_FAILURE, + }); + } + } catch (err) { + yield put({ + type: hpMonitorActions.FETCH_HP_JOB_TRIAL_INFO_FAILURE, + }); + } + } +}; + +const gofetchHPJobTrialInfo = function*(trialName, namespace) { + try { + const result = yield call( + axios.get, + `/katib/fetch_hp_job_trial_info/?trialName=${trialName}&namespace=${namespace}`, + ); + return result; + } catch (err) { + yield put({ + type: hpMonitorActions.FETCH_HP_JOB_TRIAL_INFO_FAILURE, + }); + } +}; + +export const submitNASJob = function*() { + while (true) { + const action = yield take(nasCreateActions.SUBMIT_NAS_JOB_REQUEST); + try { + const result = yield call(goSubmitNASJob, action.data); + if (result.status === 200) { + yield put({ + type: nasCreateActions.SUBMIT_NAS_JOB_SUCCESS, + }); + } else { + yield put({ + type: nasCreateActions.SUBMIT_NAS_JOB_FAILURE, + message: result.message, + }); + } + } catch (err) { + yield put({ + type: nasCreateActions.SUBMIT_NAS_JOB_FAILURE, + }); + } + } +}; + +const goSubmitNASJob = function*(postData) { + try { + const data = { + postData, + }; + const result = yield call(axios.post, '/katib/submit_nas_job/', data); + return result; + } catch (err) { + return { + status: 500, + message: err.response.data, + }; + } +}; + +export const fetchNASJobs = function*() { + while (true) { + const action = yield take(nasMonitorActions.FETCH_NAS_JOBS_REQUEST); + try { + const result = yield call(goFetchNASJobs); + if (result.status === 200) { + let data = Object.assign(result.data, {}); + data.map((template, i) => { + Object.keys(template).forEach(key => { + const value = template[key]; + delete template[key]; + template[key.toLowerCase()] = value; + }); + }); + yield put({ + type: nasMonitorActions.FETCH_NAS_JOBS_SUCCESS, + jobs: data, + }); + } else { + yield put({ + type: nasMonitorActions.FETCH_NAS_JOBS_FAILURE, + }); + } + } catch (err) { + yield put({ + type: nasMonitorActions.FETCH_NAS_JOBS_FAILURE, + }); + } + } +}; + +const goFetchNASJobs = function*() { + try { + const result = yield call(axios.get, '/katib/fetch_nas_jobs/'); + return result; + } catch (err) { + yield put({ + type: nasMonitorActions.FETCH_NAS_JOBS_FAILURE, + }); + } +}; + +export const fetchNASJobInfo = function*() { + while (true) { + const action = yield take(nasMonitorActions.FETCH_NAS_JOB_INFO_REQUEST); + try { + const result = yield call(goFetchNASJobInfo, action.experimentName, action.namespace); + if (result.status === 200) { + let data = Object.assign(result.data, {}); + data.map((template, i) => { + Object.keys(template).forEach(key => { + const value = template[key]; + delete template[key]; + template[key.toLowerCase()] = value; + }); + }); + yield put({ + type: nasMonitorActions.FETCH_NAS_JOB_INFO_SUCCESS, + steps: data, + }); + } else { + yield put({ + type: nasMonitorActions.FETCH_NAS_JOB_INFO_FAILURE, + }); + } + } catch (err) { + yield put({ + type: nasMonitorActions.FETCH_NAS_JOB_INFO_FAILURE, + }); + } + } +}; + +const goFetchNASJobInfo = function*(experimentName, namespace) { + try { + const result = yield call( + axios.get, + `/katib/fetch_nas_job_info/?experimentName=${experimentName}&namespace=${namespace}`, + ); + return result; + } catch (err) { + yield put({ + type: nasMonitorActions.FETCH_NAS_JOB_INFO_FAILURE, + }); + } +}; + +export const fetchTrialTemplates = function*() { + while (true) { + const action = yield take(templateActions.FETCH_TRIAL_TEMPLATES_REQUEST); + try { + const result = yield call(goFetchTrialTemplates); + if (result.status === 200) { + yield put({ + type: templateActions.FETCH_TRIAL_TEMPLATES_SUCCESS, + trialTemplatesList: result.data.Data, + }); + } else { + yield put({ + type: templateActions.FETCH_TRIAL_TEMPLATES_FAILURE, + }); + } + } catch (err) { + yield put({ + type: templateActions.FETCH_TRIAL_TEMPLATES_FAILURE, + }); + } + } +}; + +const goFetchTrialTemplates = function*(namespace) { + try { + const result = yield call(axios.get, `/katib/fetch_trial_templates`); + return result; + } catch (err) { + yield put({ + type: templateActions.FETCH_TRIAL_TEMPLATES_FAILURE, + }); + } +}; + +export const addTemplate = function*() { + while (true) { + const action = yield take(templateActions.ADD_TEMPLATE_REQUEST); + try { + const result = yield call( + goAddTemplate, + action.edittedNamespace, + action.edittedConfigMapName, + action.edittedName, + action.edittedYaml, + ); + if (result.status === 200) { + yield put({ + type: templateActions.ADD_TEMPLATE_SUCCESS, + trialTemplatesList: result.data.Data, + }); + } else { + yield put({ + type: templateActions.ADD_TEMPLATE_FAILURE, + }); + } + } catch (err) { + yield put({ + type: templateActions.ADD_TEMPLATE_FAILURE, + }); + } + } +}; + +const goAddTemplate = function*(edittedNamespace, edittedConfigMapName, edittedName, edittedYaml) { + try { + const data = { + edittedNamespace, + edittedConfigMapName, + edittedName, + edittedYaml, + }; + const result = yield call(axios.post, '/katib/add_template/', data); + return result; + } catch (err) { + yield put({ + type: templateActions.ADD_TEMPLATE_FAILURE, + }); + } +}; + +export const editTemplate = function*() { + while (true) { + const action = yield take(templateActions.EDIT_TEMPLATE_REQUEST); + try { + const result = yield call( + goEditTemplate, + action.edittedNamespace, + action.edittedConfigMapName, + action.currentName, + action.edittedName, + action.edittedYaml, + ); + if (result.status === 200) { + yield put({ + type: templateActions.EDIT_TEMPLATE_SUCCESS, + trialTemplatesList: result.data.Data, + }); + } else { + yield put({ + type: templateActions.EDIT_TEMPLATE_FAILURE, + }); + } + } catch (err) { + yield put({ + type: templateActions.EDIT_TEMPLATE_FAILURE, + }); + } + } +}; + +const goEditTemplate = function*( + edittedNamespace, + edittedConfigMapName, + currentName, + edittedName, + edittedYaml, +) { + try { + const data = { + edittedNamespace, + edittedConfigMapName, + currentName, + edittedName, + edittedYaml, + }; + const result = yield call(axios.post, '/katib/edit_template/', data); + return result; + } catch (err) { + yield put({ + type: templateActions.EDIT_TEMPLATE_FAILURE, + }); + } +}; + +export const deleteTemplate = function*() { + while (true) { + const action = yield take(templateActions.DELETE_TEMPLATE_REQUEST); + try { + const result = yield call( + goDeleteTemplate, + action.edittedNamespace, + action.edittedConfigMapName, + action.edittedName, + ); + if (result.status === 200) { + yield put({ + type: templateActions.DELETE_TEMPLATE_SUCCESS, + trialTemplatesList: result.data.Data, + }); + } else { + yield put({ + type: templateActions.DELETE_TEMPLATE_FAILURE, + }); + } + } catch (err) { + yield put({ + type: templateActions.DELETE_TEMPLATE_FAILURE, + }); + } + } +}; + +const goDeleteTemplate = function*(edittedNamespace, edittedConfigMapName, edittedName) { + try { + const data = { + edittedNamespace, + edittedConfigMapName, + edittedName, + }; + const result = yield call(axios.post, '/katib/delete_template/', data); + return result; + } catch (err) { + yield put({ + type: templateActions.DELETE_TEMPLATE_FAILURE, + }); + } +}; + +export const fetchNamespaces = function*() { + while (true) { + const action = yield take(generalActions.FETCH_NAMESPACES_REQUEST); + try { + const result = yield call(goFetchNamespaces); + if (result.status === 200) { + let data = result.data; + data.unshift('All namespaces'); + yield put({ + type: generalActions.FETCH_NAMESPACES_SUCCESS, + namespaces: data, + }); + } else { + yield put({ + type: generalActions.FETCH_NAMESPACES_FAILURE, + }); + } + } catch (err) { + yield put({ + type: generalActions.FETCH_NAMESPACES_FAILURE, + }); + } + } +}; + +const goFetchNamespaces = function*() { + try { + const result = yield call(axios.get, '/katib/fetch_namespaces'); + return result; + } catch (err) { + yield put({ + type: generalActions.FETCH_NAMESPACES_FAILURE, + }); + } +}; + +export default function* rootSaga() { + yield all([ + fork(fetchTrialTemplates), + fork(fetchHPJobs), + fork(fetchNASJobs), + fork(addTemplate), + fork(editTemplate), + fork(deleteTemplate), + fork(submitYaml), + fork(deleteExperiment), + fork(submitHPJob), + fork(submitNASJob), + fork(fetchHPJobInfo), + fork(fetchExperiment), + fork(fetchSuggestion), + fork(fetchHPJobTrialInfo), + fork(fetchNASJobInfo), + fork(fetchNamespaces), + ]); +} diff --git a/pkg/ui/v1beta1/frontend/src/serviceWorker.js b/pkg/ui/v1beta1/frontend/src/serviceWorker.js new file mode 100755 index 00000000000..f4f3eb4b214 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/serviceWorker.js @@ -0,0 +1,131 @@ +// This optional code is used to register a service worker. +// register() is not called by default. + +// This lets the app load faster on subsequent visits in production, and gives +// it offline capabilities. However, it also means that developers (and users) +// will only see deployed updates on subsequent visits to a page, after all the +// existing tabs open on the page have been closed, since previously cached +// resources are updated in the background. + +// To learn more about the benefits of this model and instructions on how to +// opt-in, read http://bit.ly/CRA-PWA + +const isLocalhost = Boolean( + window.location.hostname === 'localhost' || + // [::1] is the IPv6 localhost address. + window.location.hostname === '[::1]' || + // 127.0.0.1/8 is considered localhost for IPv4. + window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/), +); + +export function register(config) { + if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { + // The URL constructor is available in all browsers that support SW. + const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); + if (publicUrl.origin !== window.location.origin) { + // Our service worker won't work if PUBLIC_URL is on a different origin + // from what our page is served on. This might happen if a CDN is used to + // serve assets; see https://github.com/facebook/create-react-app/issues/2374 + return; + } + + window.addEventListener('load', () => { + const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; + + if (isLocalhost) { + // This is running on localhost. Let's check if a service worker still exists or not. + checkValidServiceWorker(swUrl, config); + + // Add some additional logging to localhost, pointing developers to the + // service worker/PWA documentation. + navigator.serviceWorker.ready.then(() => { + console.log( + 'This web app is being served cache-first by a service ' + + 'worker. To learn more, visit http://bit.ly/CRA-PWA', + ); + }); + } else { + // Is not localhost. Just register service worker + registerValidSW(swUrl, config); + } + }); + } +} + +function registerValidSW(swUrl, config) { + navigator.serviceWorker + .register(swUrl) + .then(registration => { + registration.onupdatefound = () => { + const installingWorker = registration.installing; + if (installingWorker == null) { + return; + } + installingWorker.onstatechange = () => { + if (installingWorker.state === 'installed') { + if (navigator.serviceWorker.controller) { + // At this point, the updated precached content has been fetched, + // but the previous service worker will still serve the older + // content until all client tabs are closed. + console.log( + 'New content is available and will be used when all ' + + 'tabs for this page are closed. See http://bit.ly/CRA-PWA.', + ); + + // Execute callback + if (config && config.onUpdate) { + config.onUpdate(registration); + } + } else { + // At this point, everything has been precached. + // It's the perfect time to display a + // "Content is cached for offline use." message. + console.log('Content is cached for offline use.'); + + // Execute callback + if (config && config.onSuccess) { + config.onSuccess(registration); + } + } + } + }; + }; + }) + .catch(error => { + console.error('Error during service worker registration:', error); + }); +} + +function checkValidServiceWorker(swUrl, config) { + // Check if the service worker can be found. If it can't reload the page. + fetch(swUrl) + .then(response => { + // Ensure service worker exists, and that we really are getting a JS file. + const contentType = response.headers.get('content-type'); + if ( + response.status === 404 || + (contentType != null && contentType.indexOf('javascript') === -1) + ) { + // No service worker found. Probably a different app. Reload the page. + navigator.serviceWorker.ready.then(registration => { + registration.unregister().then(() => { + window.location.reload(); + }); + }); + } else { + // Service worker found. Proceed as normal. + registerValidSW(swUrl, config); + } + }) + .catch(() => { + console.log('No internet connection found. App is running in offline mode.'); + }); +} + +export function unregister() { + if ('serviceWorker' in navigator) { + navigator.serviceWorker.ready.then(registration => { + registration.unregister(); + }); + } +} diff --git a/pkg/ui/v1beta1/frontend/src/store/index.js b/pkg/ui/v1beta1/frontend/src/store/index.js new file mode 100644 index 00000000000..e8eab207613 --- /dev/null +++ b/pkg/ui/v1beta1/frontend/src/store/index.js @@ -0,0 +1,18 @@ +import { createStore, applyMiddleware, compose } from 'redux'; +import logger from 'redux-logger'; +import createSagaMiddleware, { END } from 'redux-saga'; +import rootReducer from '../reducers'; + +export default function configureStore(initialState) { + const sagaMiddleware = createSagaMiddleware(); + + const store = createStore( + rootReducer, + initialState, + compose(applyMiddleware(sagaMiddleware, logger)), + ); + + store.runSaga = sagaMiddleware.run; + store.close = () => store.dispatch(END); + return store; +} diff --git a/pkg/ui/v1beta1/hp.go b/pkg/ui/v1beta1/hp.go new file mode 100644 index 00000000000..4ddfa2062e6 --- /dev/null +++ b/pkg/ui/v1beta1/hp.go @@ -0,0 +1,235 @@ +package v1beta1 + +import ( + "context" + "encoding/json" + "log" + "net/http" + "strconv" + "strings" + "time" + + corev1 "k8s.io/api/core/v1" + + commonv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" + trialsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" + api_pb_v1beta1 "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" +) + +// FetchAllHPJobs gets experiments in all namespaces. +func (k *KatibUIHandler) FetchAllHPJobs(w http.ResponseWriter, r *http.Request) { + // At first, try to list experiments in cluster scope + jobs, err := k.getExperimentList([]string{""}, JobTypeHP) + if err != nil { + // If failed, just try to list experiments from own namespace + jobs, err = k.getExperimentList([]string{}, JobTypeHP) + } + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + response, err := json.Marshal(jobs) + if err != nil { + log.Printf("Marshal HP jobs failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Write(response) +} + +func (k *KatibUIHandler) FetchHPJobInfo(w http.ResponseWriter, r *http.Request) { + //enableCors(&w) + experimentName := r.URL.Query()["experimentName"][0] + namespace := r.URL.Query()["namespace"][0] + + conn, c := k.connectManager() + defer conn.Close() + + resultText := "trialName,Status" + experiment, err := k.katibClient.GetExperiment(experimentName, namespace) + if err != nil { + log.Printf("GetExperiment from HP job failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + log.Printf("Got Experiment") + metricsList := map[string]int{} + metricsName := experiment.Spec.Objective.ObjectiveMetricName + resultText += "," + metricsName + metricsList[metricsName] = 0 + for i, m := range experiment.Spec.Objective.AdditionalMetricNames { + resultText += "," + m + metricsList[m] = i + 1 + } + log.Printf("Got metrics names") + paramList := map[string]int{} + for i, p := range experiment.Spec.Parameters { + resultText += "," + p.Name + paramList[p.Name] = i + len(metricsList) + } + log.Printf("Got Parameters names") + + trialList, err := k.katibClient.GetTrialList(experimentName, namespace) + if err != nil { + log.Printf("GetTrialList from HP job failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + log.Printf("Got Trial List") + + for _, t := range trialList.Items { + succeeded := false + for _, condition := range t.Status.Conditions { + if condition.Type == trialsv1beta1.TrialSucceeded && + condition.Status == corev1.ConditionTrue { + succeeded = true + } + } + var lastTrialCondition string + + // Take only the latest condition + if len(t.Status.Conditions) > 0 { + lastTrialCondition = string(t.Status.Conditions[len(t.Status.Conditions)-1].Type) + } + + trialResText := make([]string, len(metricsList)+len(paramList)) + + if succeeded { + obsLogResp, err := c.GetObservationLog( + context.Background(), + &api_pb_v1beta1.GetObservationLogRequest{ + TrialName: t.Name, + StartTime: "", + EndTime: "", + }, + ) + if err != nil { + log.Printf("GetObservationLog from HP job failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + for _, m := range obsLogResp.ObservationLog.MetricLogs { + if trialResText[metricsList[m.Metric.Name]] == "" { + trialResText[metricsList[m.Metric.Name]] = m.Metric.Value + } else { + currentValue, _ := strconv.ParseFloat(m.Metric.Value, 64) + bestValue, _ := strconv.ParseFloat(trialResText[metricsList[m.Metric.Name]], 64) + if t.Spec.Objective.Type == commonv1beta1.ObjectiveTypeMinimize && currentValue < bestValue { + trialResText[metricsList[m.Metric.Name]] = m.Metric.Value + } else if t.Spec.Objective.Type == commonv1beta1.ObjectiveTypeMaximize && currentValue > bestValue { + trialResText[metricsList[m.Metric.Name]] = m.Metric.Value + } + } + } + } + for _, trialParam := range t.Spec.ParameterAssignments { + trialResText[paramList[trialParam.Name]] = trialParam.Value + } + resultText += "\n" + t.Name + "," + lastTrialCondition + "," + strings.Join(trialResText, ",") + } + log.Printf("Logs parsed, results:\n %v", resultText) + response, err := json.Marshal(resultText) + if err != nil { + log.Printf("Marshal result text for HP job failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Write(response) +} + +// FetchHPJobTrialInfo returns all metrics for the HP Job Trial +func (k *KatibUIHandler) FetchHPJobTrialInfo(w http.ResponseWriter, r *http.Request) { + //enableCors(&w) + trialName := r.URL.Query()["trialName"][0] + namespace := r.URL.Query()["namespace"][0] + conn, c := k.connectManager() + defer conn.Close() + + trial, err := k.katibClient.GetTrial(trialName, namespace) + + if err != nil { + log.Printf("GetTrial from HP job failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + } + + objectiveType := trial.Spec.Objective.Type + + // resultArray - array of arrays, where [i][0] - metricName, [i][1] - metricTime, [i][2] - metricValue + var resultArray [][]string + resultArray = append(resultArray, strings.Split("metricName,time,value", ",")) + obsLogResp, err := c.GetObservationLog( + context.Background(), + &api_pb_v1beta1.GetObservationLogRequest{ + TrialName: trialName, + StartTime: "", + EndTime: "", + }, + ) + if err != nil { + log.Printf("GetObservationLog failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + // prevMetricTimeValue is the dict, where key = metric name, + // value = array, where [0] - Last metric time, [1] - Best metric value for this time + prevMetricTimeValue := make(map[string][]string) + for _, m := range obsLogResp.ObservationLog.MetricLogs { + parsedCurrentTime, _ := time.Parse(time.RFC3339Nano, m.TimeStamp) + formatCurrentTime := parsedCurrentTime.Format("2006-01-02T15:04:05") + if _, found := prevMetricTimeValue[m.Metric.Name]; !found { + prevMetricTimeValue[m.Metric.Name] = []string{"", ""} + + } + + newMetricValue, err := strconv.ParseFloat(m.Metric.Value, 64) + if err != nil { + log.Printf("ParseFloat for new metric value: %v failed: %v", m.Metric.Value, err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + var prevMetricValue float64 + if prevMetricTimeValue[m.Metric.Name][1] != "" { + prevMetricValue, err = strconv.ParseFloat(prevMetricTimeValue[m.Metric.Name][1], 64) + if err != nil { + log.Printf("ParseFloat for prev metric value: %v failed: %v", prevMetricTimeValue[m.Metric.Name][1], err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + } + + if formatCurrentTime == prevMetricTimeValue[m.Metric.Name][0] && + ((objectiveType == commonv1beta1.ObjectiveTypeMinimize && + newMetricValue < prevMetricValue) || + (objectiveType == commonv1beta1.ObjectiveTypeMaximize && + newMetricValue > prevMetricValue)) { + + prevMetricTimeValue[m.Metric.Name][1] = m.Metric.Value + for i := len(resultArray) - 1; i >= 0; i-- { + if resultArray[i][0] == m.Metric.Name { + resultArray[i][2] = m.Metric.Value + break + } + } + } else if formatCurrentTime != prevMetricTimeValue[m.Metric.Name][0] { + resultArray = append(resultArray, []string{m.Metric.Name, formatCurrentTime, m.Metric.Value}) + prevMetricTimeValue[m.Metric.Name][0] = formatCurrentTime + prevMetricTimeValue[m.Metric.Name][1] = m.Metric.Value + } + } + + var resultText string + for _, metric := range resultArray { + resultText += strings.Join(metric, ",") + "\n" + } + + response, err := json.Marshal(resultText) + if err != nil { + log.Printf("Marshal result text in Trial info failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Write(response) +} diff --git a/pkg/ui/v1beta1/nas.go b/pkg/ui/v1beta1/nas.go new file mode 100644 index 00000000000..1dff1c5e5c6 --- /dev/null +++ b/pkg/ui/v1beta1/nas.go @@ -0,0 +1,110 @@ +package v1beta1 + +import ( + "context" + "encoding/json" + "log" + "net/http" + "strconv" + + trialsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" + api_pb_v1beta1 "github.com/kubeflow/katib/pkg/apis/manager/v1beta1" +) + +func (k *KatibUIHandler) FetchAllNASJobs(w http.ResponseWriter, r *http.Request) { + // At first, try to list experiments in cluster scope + jobs, err := k.getExperimentList([]string{""}, JobTypeNAS) + if err != nil { + // If failed, just try to list experiments from own namespace + jobs, err = k.getExperimentList([]string{}, JobTypeNAS) + } + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + response, err := json.Marshal(jobs) + if err != nil { + log.Printf("Marshal NAS jobs failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Write(response) +} + +func (k *KatibUIHandler) FetchNASJobInfo(w http.ResponseWriter, r *http.Request) { + //enableCors(&w) + experimentName := r.URL.Query()["experimentName"][0] + namespace := r.URL.Query()["namespace"][0] + + responseRaw := make([]NNView, 0) + var architecture string + var decoder string + + conn, c := k.connectManager() + + defer conn.Close() + + trials, err := k.katibClient.GetTrialList(experimentName, namespace) + if err != nil { + log.Printf("GetTrialList from NAS job failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + log.Printf("Got Trial List") + + for i, t := range trials.Items { + succeeded := false + for _, condition := range t.Status.Conditions { + if condition.Type == trialsv1beta1.TrialSucceeded { + succeeded = true + } + } + if succeeded { + obsLogResp, err := c.GetObservationLog( + context.Background(), + &api_pb_v1beta1.GetObservationLogRequest{ + TrialName: t.Name, + StartTime: "", + EndTime: "", + }, + ) + if err != nil { + log.Printf("GetObservationLog from NAS job failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + metricsName := make([]string, 0) + metricsValue := make([]string, 0) + for _, m := range obsLogResp.ObservationLog.MetricLogs { + metricsName = append(metricsName, m.Metric.Name) + metricsValue = append(metricsValue, m.Metric.Value) + + } + for _, trialParam := range t.Spec.ParameterAssignments { + if trialParam.Name == "architecture" { + architecture = trialParam.Value + } + if trialParam.Name == "nn_config" { + decoder = trialParam.Value + } + } + responseRaw = append(responseRaw, NNView{ + Name: "Generation " + strconv.Itoa(i), + TrialName: t.Name, + Architecture: generateNNImage(architecture, decoder), + MetricsName: metricsName, + MetricsValue: metricsValue, + }) + } + } + log.Printf("Logs parsed, result: %v", responseRaw) + + response, err := json.Marshal(responseRaw) + if err != nil { + log.Printf("Marshal result in NAS job failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Write(response) +} diff --git a/pkg/ui/v1beta1/types.go b/pkg/ui/v1beta1/types.go new file mode 100644 index 00000000000..045a68d5f71 --- /dev/null +++ b/pkg/ui/v1beta1/types.go @@ -0,0 +1,82 @@ +package v1beta1 + +import ( + "github.com/kubeflow/katib/pkg/controller.v1beta1/consts" + "github.com/kubeflow/katib/pkg/util/v1beta1/katibclient" +) + +const maxMsgSize = 1<<31 - 1 + +var ( + // namespace = "default" + allowedHeaders = "Accept, Content-Type, Content-Length, Accept-Encoding, Authorization, X-CSRF-Token" + + TrialTemplateLabel = map[string]string{ + consts.LabelTrialTemplateConfigMapName: consts.LabelTrialTemplateConfigMapValue} +) + +type Decoder struct { + Layers int `json:"num_layers"` + InputSize []int `json:"input_size"` + OutputSize []int `json:"output_size"` + Embedding map[int]*Block `json:"embedding"` +} + +type Block struct { + ID int `json:"opt_id"` + Type string `json:"opt_type"` + Param Option `json:"opt_params"` +} + +type Option struct { + FilterNumber string `json:"num_filter"` + FilterSize string `json:"filter_size"` + Stride string `json:"stride"` +} + +type JobView struct { + Name string + Status string + Namespace string +} + +type TrialTemplatesView struct { + Namespace string + ConfigMapsList []ConfigMapsList +} + +type TrialTemplatesResponse struct { + Data []TrialTemplatesView +} + +type ConfigMapsList struct { + ConfigMapName string + TemplatesList []TemplatesList +} + +type TemplatesList struct { + Name string + Yaml string +} + +type KatibUIHandler struct { + katibClient katibclient.Client +} + +type NNView struct { + Name string + TrialName string + Architecture string + MetricsName []string + MetricsValue []string +} + +type JobType string + +const ( + JobTypeHP = "HP" + JobTypeNAS = "NAS" + ActionTypeAdd = "add" + ActionTypeEdit = "edit" + ActionTypeDelete = "delete" +) diff --git a/pkg/ui/v1beta1/util.go b/pkg/ui/v1beta1/util.go new file mode 100644 index 00000000000..554a9c79e45 --- /dev/null +++ b/pkg/ui/v1beta1/util.go @@ -0,0 +1,237 @@ +package v1beta1 + +import ( + "encoding/json" + "log" + "net/http" + "strconv" + "strings" + + "github.com/kubeflow/katib/pkg/controller.v1beta1/consts" + + gographviz "github.com/awalterschulze/gographviz" + apiv1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func (k *KatibUIHandler) getExperimentList(namespace []string, typ JobType) ([]JobView, error) { + jobs := make([]JobView, 0) + + el, err := k.katibClient.GetExperimentList(namespace...) + if err != nil { + log.Printf("GetExperimentList failed: %v", err) + return nil, err + } + for _, experiment := range el.Items { + if (typ == JobTypeNAS && experiment.Spec.NasConfig != nil) || + (typ == JobTypeHP && experiment.Spec.NasConfig == nil) { + experimentLastCondition, err := experiment.GetLastConditionType() + if err != nil { + log.Printf("GetLastConditionType failed: %v", err) + return nil, err + } + jobs = append(jobs, JobView{ + Name: experiment.Name, + Namespace: experiment.Namespace, + Status: string(experimentLastCondition), + }) + } + } + return jobs, nil +} + +func enableCors(w *http.ResponseWriter) { + (*w).Header().Set("Content-Type", "text/html; charset=utf-8") + (*w).Header().Set("Access-Control-Allow-Origin", "*") + (*w).Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT, DELETE") + (*w).Header().Set("Access-Control-Allow-Headers", allowedHeaders) + (*w).Header().Set("Access-Control-Expose-Headers", "Access-Control-*") + (*w).Header().Set("Access-Control-Allow-Credentials", "true") +} + +func (k *KatibUIHandler) getTrialTemplatesViewList() ([]TrialTemplatesView, error) { + trialTemplatesViewList := make([]TrialTemplatesView, 0) + + // Get all available namespaces + namespaces, err := k.getAvailableNamespaces() + if err != nil { + log.Printf("GetAvailableNamespaces failed: %v", err) + return nil, err + } + + // Get Trial Template ConfigMap for each namespace + for _, ns := range namespaces { + trialTemplatesConfigMapList, err := k.katibClient.GetTrialTemplates(ns) + if err != nil { + log.Printf("GetTrialTemplates failed: %v", err) + return nil, err + } + + if len(trialTemplatesConfigMapList.Items) != 0 { + trialTemplatesViewList = append(trialTemplatesViewList, getTrialTemplatesView(trialTemplatesConfigMapList)) + } + } + return trialTemplatesViewList, nil +} + +func (k *KatibUIHandler) getAvailableNamespaces() ([]string, error) { + var namespaces []string + + namespaceList, err := k.katibClient.GetNamespaceList() + if err != nil { + namespaces = append(namespaces, consts.DefaultKatibNamespace) + return namespaces, nil + } + for _, ns := range namespaceList.Items { + namespaces = append(namespaces, ns.ObjectMeta.Name) + } + + return namespaces, nil +} + +func getTrialTemplatesView(templatesConfigMapList *apiv1.ConfigMapList) TrialTemplatesView { + + trialTemplateView := TrialTemplatesView{ + Namespace: templatesConfigMapList.Items[0].ObjectMeta.Namespace, + ConfigMapsList: []ConfigMapsList{}, + } + for _, configMap := range templatesConfigMapList.Items { + configMapList := ConfigMapsList{ + ConfigMapName: configMap.ObjectMeta.Name, + TemplatesList: []TemplatesList{}, + } + for key := range configMap.Data { + templatesList := TemplatesList{ + Name: key, + Yaml: configMap.Data[key], + } + configMapList.TemplatesList = append(configMapList.TemplatesList, templatesList) + } + + trialTemplateView.ConfigMapsList = append(trialTemplateView.ConfigMapsList, configMapList) + } + + return trialTemplateView +} + +func (k *KatibUIHandler) updateTrialTemplates( + edittedNamespace, + edittedConfigMapName, + edittedName, + edittedYaml, + currentName, + actionType string) ([]TrialTemplatesView, error) { + + templates, err := k.katibClient.GetConfigMap(edittedConfigMapName, edittedNamespace) + if err != nil { + log.Printf("GetConfigMap failed: %v", err) + return nil, err + } + + if actionType == ActionTypeAdd { + if len(templates) == 0 { + templates = make(map[string]string) + templates[edittedName] = edittedYaml + } else { + templates[edittedName] = edittedYaml + } + } else if actionType == ActionTypeEdit { + delete(templates, currentName) + templates[edittedName] = edittedYaml + } else if actionType == ActionTypeDelete { + delete(templates, edittedName) + } + + templatesConfigMap := &apiv1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: edittedConfigMapName, + Namespace: edittedNamespace, + Labels: TrialTemplateLabel, + }, + Data: templates, + } + + err = k.katibClient.UpdateConfigMap(templatesConfigMap) + if err != nil { + log.Printf("UpdateConfigMap failed: %v", err) + return nil, err + } + + newTemplates, err := k.getTrialTemplatesViewList() + if err != nil { + log.Printf("getTrialTemplatesViewList: %v", err) + return nil, err + } + + return newTemplates, nil + +} +func getNodeString(block *Block) string { + var nodeString string + switch block.Type { + case "convolution": + nodeString += block.Param.FilterSize + "x" + block.Param.FilterSize + nodeString += " conv\n" + nodeString += block.Param.FilterSize + " channels" + case "separable_convolution": + nodeString += block.Param.FilterSize + "x" + block.Param.FilterSize + nodeString += " sep_conv\n" + nodeString += block.Param.FilterSize + " channels" + case "depthwise_convolution": + nodeString += block.Param.FilterSize + "x" + block.Param.FilterSize + nodeString += " depth_conv\n" + case "reduction": + // TODO: Need to be fixed + nodeString += "3x3 max_pooling" + } + return strconv.Quote(nodeString) +} + +func generateNNImage(architecture string, decoder string) string { + + var architectureInt [][]int + + if err := json.Unmarshal([]byte(architecture), &architectureInt); err != nil { + panic(err) + } + /* + Always has num_layers, input_size, output_size and embeding + Embeding is a map: int to Parameter + Parameter has id, type, Option + + Beforehand substite all ' to " and wrap the string in ` + */ + + replacedDecoder := strings.Replace(decoder, `'`, `"`, -1) + var decoderParsed Decoder + + err := json.Unmarshal([]byte(replacedDecoder), &decoderParsed) + if err != nil { + panic(err) + } + + graphAst, _ := gographviz.ParseString(`digraph G {}`) + graph := gographviz.NewGraph() + if err := gographviz.Analyse(graphAst, graph); err != nil { + panic(err) + } + graph.AddNode("G", "0", map[string]string{"label": strconv.Quote("Input")}) + var i int + for i = 0; i < len(architectureInt); i++ { + graph.AddNode("G", strconv.Itoa(i+1), map[string]string{"label": getNodeString(decoderParsed.Embedding[architectureInt[i][0]])}) + graph.AddEdge(strconv.Itoa(i), strconv.Itoa(i+1), true, nil) + for j := 1; j < i+1; j++ { + if architectureInt[i][j] == 1 { + graph.AddEdge(strconv.Itoa(j-1), strconv.Itoa(i+1), true, nil) + } + } + } + graph.AddNode("G", strconv.Itoa(i+1), map[string]string{"label": strconv.Quote("GlobalAvgPool")}) + graph.AddEdge(strconv.Itoa(i), strconv.Itoa(i+1), true, nil) + graph.AddNode("G", strconv.Itoa(i+2), map[string]string{"label": strconv.Quote("FullConnect\nSoftmax")}) + graph.AddEdge(strconv.Itoa(i+1), strconv.Itoa(i+2), true, nil) + graph.AddNode("G", strconv.Itoa(i+3), map[string]string{"label": strconv.Quote("Output")}) + graph.AddEdge(strconv.Itoa(i+2), strconv.Itoa(i+3), true, nil) + s := graph.String() + return s +} diff --git a/pkg/util/v1beta1/env/env.go b/pkg/util/v1beta1/env/env.go new file mode 100644 index 00000000000..3de45f1865f --- /dev/null +++ b/pkg/util/v1beta1/env/env.go @@ -0,0 +1,10 @@ +package env + +import "os" + +func GetEnvOrDefault(key string, fallback string) string { + if value, ok := os.LookupEnv(key); ok { + return value + } + return fallback +} diff --git a/pkg/util/v1beta1/env/env_test.go b/pkg/util/v1beta1/env/env_test.go new file mode 100644 index 00000000000..b1f5d0caf74 --- /dev/null +++ b/pkg/util/v1beta1/env/env_test.go @@ -0,0 +1,21 @@ +package env + +import ( + "os" + "testing" +) + +func TestGetEnvWithDefault(t *testing.T) { + expected := "FAKE" + key := "TEST" + v := GetEnvOrDefault(key, expected) + if v != expected { + t.Errorf("Expected %s, got %s", expected, v) + } + expected = "FAKE1" + os.Setenv(key, expected) + v = GetEnvOrDefault(key, "") + if v != expected { + t.Errorf("Expected %s, got %s", expected, v) + } +} diff --git a/pkg/util/v1beta1/katibclient/katib_client.go b/pkg/util/v1beta1/katibclient/katib_client.go new file mode 100644 index 00000000000..66459fcc1dd --- /dev/null +++ b/pkg/util/v1beta1/katibclient/katib_client.go @@ -0,0 +1,223 @@ +/* + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package katibclient + +import ( + "context" + + apiv1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/kubernetes/scheme" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/client/config" + + experimentsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + suggestionsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/suggestions/v1beta1" + trialsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" + "github.com/kubeflow/katib/pkg/controller.v1beta1/consts" +) + +type Client interface { + InjectClient(c client.Client) + GetClient() client.Client + GetExperimentList(namespace ...string) (*experimentsv1beta1.ExperimentList, error) + CreateExperiment(experiment *experimentsv1beta1.Experiment, namespace ...string) error + UpdateExperiment(experiment *experimentsv1beta1.Experiment, namespace ...string) error + DeleteExperiment(experiment *experimentsv1beta1.Experiment, namespace ...string) error + GetExperiment(name string, namespace ...string) (*experimentsv1beta1.Experiment, error) + GetConfigMap(name string, namespace ...string) (map[string]string, error) + GetTrial(name string, namespace ...string) (*trialsv1beta1.Trial, error) + GetTrialList(name string, namespace ...string) (*trialsv1beta1.TrialList, error) + GetTrialTemplates(namespace ...string) (*apiv1.ConfigMapList, error) + GetSuggestion(name string, namespace ...string) (*suggestionsv1beta1.Suggestion, error) + UpdateConfigMap(newConfigMap *apiv1.ConfigMap) error + GetNamespaceList() (*apiv1.NamespaceList, error) +} + +type KatibClient struct { + client client.Client +} + +func NewWithGivenClient(c client.Client) Client { + return &KatibClient{ + client: c, + } +} + +func NewClient(options client.Options) (Client, error) { + cfg, err := config.GetConfig() + if err != nil { + return nil, err + } + experimentsv1beta1.AddToScheme(scheme.Scheme) + trialsv1beta1.AddToScheme(scheme.Scheme) + suggestionsv1beta1.AddToScheme(scheme.Scheme) + cl, err := client.New(cfg, options) + if err != nil { + return nil, err + } + return &KatibClient{ + client: cl, + }, nil +} + +func (k *KatibClient) InjectClient(c client.Client) { + k.client = c +} + +func (k *KatibClient) GetClient() client.Client { + return k.client +} + +func (k *KatibClient) GetExperimentList(namespace ...string) (*experimentsv1beta1.ExperimentList, error) { + ns := getNamespace(namespace...) + expList := &experimentsv1beta1.ExperimentList{} + listOpt := client.InNamespace(ns) + + if err := k.client.List(context.Background(), listOpt, expList); err != nil { + return expList, err + } + return expList, nil + +} + +// GetSuggestion returns the Suggestion CR for the given name and namespace +func (k *KatibClient) GetSuggestion(name string, namespace ...string) ( + *suggestionsv1beta1.Suggestion, error) { + ns := getNamespace(namespace...) + suggestion := &suggestionsv1beta1.Suggestion{} + + if err := k.client.Get(context.TODO(), types.NamespacedName{Name: name, Namespace: ns}, suggestion); err != nil { + return nil, err + } + return suggestion, nil + +} + +// GetTrial returns the Trial for the given name and namespace +func (k *KatibClient) GetTrial(name string, namespace ...string) (*trialsv1beta1.Trial, error) { + ns := getNamespace(namespace...) + trial := &trialsv1beta1.Trial{} + + if err := k.client.Get(context.TODO(), types.NamespacedName{Name: name, Namespace: ns}, trial); err != nil { + return nil, err + } + return trial, nil + +} + +func (k *KatibClient) GetTrialList(name string, namespace ...string) (*trialsv1beta1.TrialList, error) { + ns := getNamespace(namespace...) + trialList := &trialsv1beta1.TrialList{} + labels := map[string]string{consts.LabelExperimentName: name} + listOpt := &client.ListOptions{} + listOpt.MatchingLabels(labels).InNamespace(ns) + + if err := k.client.List(context.Background(), listOpt, trialList); err != nil { + return trialList, err + } + return trialList, nil + +} + +func (k *KatibClient) CreateExperiment(experiment *experimentsv1beta1.Experiment, namespace ...string) error { + + if err := k.client.Create(context.Background(), experiment); err != nil { + return err + } + return nil +} + +func (k *KatibClient) UpdateExperiment(experiment *experimentsv1beta1.Experiment, namespace ...string) error { + + if err := k.client.Update(context.Background(), experiment); err != nil { + return err + } + return nil +} + +func (k *KatibClient) DeleteExperiment(experiment *experimentsv1beta1.Experiment, namespace ...string) error { + + if err := k.client.Delete(context.Background(), experiment); err != nil { + return err + } + return nil +} + +func (k *KatibClient) GetExperiment(name string, namespace ...string) (*experimentsv1beta1.Experiment, error) { + ns := getNamespace(namespace...) + exp := &experimentsv1beta1.Experiment{} + if err := k.client.Get(context.TODO(), types.NamespacedName{Name: name, Namespace: ns}, exp); err != nil { + return nil, err + } + return exp, nil +} + +// GetConfigMap returns the configmap for the given name and namespace. +func (k *KatibClient) GetConfigMap(name string, namespace ...string) (map[string]string, error) { + ns := getNamespace(namespace...) + configMap := &apiv1.ConfigMap{} + if err := k.client.Get(context.TODO(), types.NamespacedName{Name: name, Namespace: ns}, configMap); err != nil { + return map[string]string{}, err + } + return configMap.Data, nil +} + +// GetTrialTemplates returns all trial templates from the given namespace +func (k *KatibClient) GetTrialTemplates(namespace ...string) (*apiv1.ConfigMapList, error) { + ns := getNamespace(namespace...) + + templatesConfigMapList := &apiv1.ConfigMapList{} + + templateLabel := map[string]string{consts.LabelTrialTemplateConfigMapName: consts.LabelTrialTemplateConfigMapValue} + listOpt := &client.ListOptions{} + listOpt.MatchingLabels(templateLabel).InNamespace(ns) + + err := k.client.List(context.TODO(), listOpt, templatesConfigMapList) + + if err != nil { + return nil, err + } + + return templatesConfigMapList, nil + +} + +func (k *KatibClient) UpdateConfigMap(newConfigMap *apiv1.ConfigMap) error { + + if err := k.client.Update(context.Background(), newConfigMap); err != nil { + return err + } + return nil +} + +func getNamespace(namespace ...string) string { + if len(namespace) == 0 { + return consts.DefaultKatibNamespace + } + return namespace[0] +} + +func (k *KatibClient) GetNamespaceList() (*apiv1.NamespaceList, error) { + + namespaceList := &apiv1.NamespaceList{} + listOpt := &client.ListOptions{} + + if err := k.client.List(context.TODO(), listOpt, namespaceList); err != nil { + return namespaceList, err + } + return namespaceList, nil +} diff --git a/pkg/util/v1beta1/katibconfig/config.go b/pkg/util/v1beta1/katibconfig/config.go new file mode 100644 index 00000000000..b53ff0562ae --- /dev/null +++ b/pkg/util/v1beta1/katibconfig/config.go @@ -0,0 +1,194 @@ +package katibconfig + +import ( + "context" + "encoding/json" + "errors" + "strings" + + corev1 "k8s.io/api/core/v1" + apitypes "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/client" + + common "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" + "github.com/kubeflow/katib/pkg/controller.v1beta1/consts" +) + +type suggestionConfigJSON struct { + Image string `json:"image"` + ImagePullPolicy corev1.PullPolicy `json:"imagePullPolicy"` + Resource corev1.ResourceRequirements `json:"resources"` + ServiceAccountName string `json:"serviceAccountName"` +} + +type metricsCollectorConfigJSON struct { + Image string `json:"image"` + ImagePullPolicy corev1.PullPolicy `json:"imagePullPolicy"` + Resource corev1.ResourceRequirements `json:"resources"` +} + +// GetSuggestionConfigData gets the config data for the given algorithm name. +func GetSuggestionConfigData(algorithmName string, client client.Client) (map[string]string, error) { + configMap := &corev1.ConfigMap{} + suggestionConfigData := map[string]string{} + err := client.Get( + context.TODO(), + apitypes.NamespacedName{Name: consts.KatibConfigMapName, Namespace: consts.DefaultKatibNamespace}, + configMap) + if err != nil { + return map[string]string{}, err + } + + if config, ok := configMap.Data[consts.LabelSuggestionTag]; ok { + suggestionsConfig := map[string]suggestionConfigJSON{} + if err := json.Unmarshal([]byte(config), &suggestionsConfig); err != nil { + return map[string]string{}, err + } + if suggestionConfig, ok := suggestionsConfig[algorithmName]; ok { + // Get image from config + image := suggestionConfig.Image + if strings.TrimSpace(image) != "" { + suggestionConfigData[consts.LabelSuggestionImageTag] = image + } else { + return map[string]string{}, errors.New("Required value for " + consts.LabelSuggestionImageTag + " configuration of algorithm name " + algorithmName) + } + + // Get Image Pull Policy + imagePullPolicy := suggestionConfig.ImagePullPolicy + if imagePullPolicy == corev1.PullAlways || imagePullPolicy == corev1.PullIfNotPresent || imagePullPolicy == corev1.PullNever { + suggestionConfigData[consts.LabelSuggestionImagePullPolicy] = string(imagePullPolicy) + } else { + suggestionConfigData[consts.LabelSuggestionImagePullPolicy] = consts.DefaultImagePullPolicy + } + + // Get Service Account Name + serviceAccountName := suggestionConfig.ServiceAccountName + if strings.TrimSpace(serviceAccountName) != "" { + suggestionConfigData[consts.LabelSuggestionServiceAccountName] = serviceAccountName + } + + // Set default values for CPU, Memory and Disk + suggestionConfigData[consts.LabelSuggestionCPURequestTag] = consts.DefaultCPURequest + suggestionConfigData[consts.LabelSuggestionMemRequestTag] = consts.DefaultMemRequest + suggestionConfigData[consts.LabelSuggestionDiskRequestTag] = consts.DefaultDiskRequest + suggestionConfigData[consts.LabelSuggestionCPULimitTag] = consts.DefaultCPULimit + suggestionConfigData[consts.LabelSuggestionMemLimitTag] = consts.DefaultMemLimit + suggestionConfigData[consts.LabelSuggestionDiskLimitTag] = consts.DefaultDiskLimit + + // Get CPU, Memory and Disk Requests from config + cpuRequest := suggestionConfig.Resource.Requests[corev1.ResourceCPU] + memRequest := suggestionConfig.Resource.Requests[corev1.ResourceMemory] + diskRequest := suggestionConfig.Resource.Requests[corev1.ResourceEphemeralStorage] + if !cpuRequest.IsZero() { + suggestionConfigData[consts.LabelSuggestionCPURequestTag] = cpuRequest.String() + } + if !memRequest.IsZero() { + suggestionConfigData[consts.LabelSuggestionMemRequestTag] = memRequest.String() + } + if !diskRequest.IsZero() { + suggestionConfigData[consts.LabelSuggestionDiskRequestTag] = diskRequest.String() + } + + // Get CPU, Memory and Disk Limits from config + cpuLimit := suggestionConfig.Resource.Limits[corev1.ResourceCPU] + memLimit := suggestionConfig.Resource.Limits[corev1.ResourceMemory] + diskLimit := suggestionConfig.Resource.Limits[corev1.ResourceEphemeralStorage] + if !cpuLimit.IsZero() { + suggestionConfigData[consts.LabelSuggestionCPULimitTag] = cpuLimit.String() + } + if !memLimit.IsZero() { + suggestionConfigData[consts.LabelSuggestionMemLimitTag] = memLimit.String() + } + if !diskLimit.IsZero() { + suggestionConfigData[consts.LabelSuggestionDiskLimitTag] = diskLimit.String() + } + + } else { + return map[string]string{}, errors.New("Failed to find algorithm " + algorithmName + " config in configmap " + consts.KatibConfigMapName) + } + } else { + return map[string]string{}, errors.New("Failed to find suggestions config in configmap " + consts.KatibConfigMapName) + } + return suggestionConfigData, nil +} + +// GetMetricsCollectorConfigData gets the config data for the given kind. +func GetMetricsCollectorConfigData(cKind common.CollectorKind, client client.Client) (map[string]string, error) { + configMap := &corev1.ConfigMap{} + metricsCollectorConfigData := map[string]string{} + err := client.Get( + context.TODO(), + apitypes.NamespacedName{Name: consts.KatibConfigMapName, Namespace: consts.DefaultKatibNamespace}, + configMap) + if err != nil { + return metricsCollectorConfigData, err + } + // Get the config with name metrics-collector-sidecar. + if config, ok := configMap.Data[consts.LabelMetricsCollectorSidecar]; ok { + kind := string(cKind) + mcsConfig := map[string]metricsCollectorConfigJSON{} + if err := json.Unmarshal([]byte(config), &mcsConfig); err != nil { + return metricsCollectorConfigData, err + } + // Get the config for the given cKind. + if metricsCollectorConfig, ok := mcsConfig[kind]; ok { + image := metricsCollectorConfig.Image + // If the image is not empty, we set it into result. + if strings.TrimSpace(image) != "" { + metricsCollectorConfigData[consts.LabelMetricsCollectorSidecarImage] = image + } else { + return metricsCollectorConfigData, errors.New("Required value for " + consts.LabelMetricsCollectorSidecarImage + "configuration of metricsCollector kind " + kind) + } + + // Get Image Pull Policy + imagePullPolicy := metricsCollectorConfig.ImagePullPolicy + if imagePullPolicy == corev1.PullAlways || imagePullPolicy == corev1.PullIfNotPresent || imagePullPolicy == corev1.PullNever { + metricsCollectorConfigData[consts.LabelMetricsCollectorImagePullPolicy] = string(imagePullPolicy) + } else { + metricsCollectorConfigData[consts.LabelMetricsCollectorImagePullPolicy] = consts.DefaultImagePullPolicy + } + + // Set default values for CPU, Memory and Disk + metricsCollectorConfigData[consts.LabelMetricsCollectorCPURequestTag] = consts.DefaultCPURequest + metricsCollectorConfigData[consts.LabelMetricsCollectorMemRequestTag] = consts.DefaultMemRequest + metricsCollectorConfigData[consts.LabelMetricsCollectorDiskRequestTag] = consts.DefaultDiskRequest + metricsCollectorConfigData[consts.LabelMetricsCollectorCPULimitTag] = consts.DefaultCPULimit + metricsCollectorConfigData[consts.LabelMetricsCollectorMemLimitTag] = consts.DefaultMemLimit + metricsCollectorConfigData[consts.LabelMetricsCollectorDiskLimitTag] = consts.DefaultDiskLimit + + // Get CPU, Memory and Disk Requests from config + cpuRequest := metricsCollectorConfig.Resource.Requests[corev1.ResourceCPU] + memRequest := metricsCollectorConfig.Resource.Requests[corev1.ResourceMemory] + diskRequest := metricsCollectorConfig.Resource.Requests[corev1.ResourceEphemeralStorage] + if !cpuRequest.IsZero() { + metricsCollectorConfigData[consts.LabelSuggestionCPURequestTag] = cpuRequest.String() + } + if !memRequest.IsZero() { + metricsCollectorConfigData[consts.LabelSuggestionMemRequestTag] = memRequest.String() + } + if !diskRequest.IsZero() { + metricsCollectorConfigData[consts.LabelSuggestionDiskRequestTag] = diskRequest.String() + } + + // Get CPU, Memory and Disk Limits from config + cpuLimit := metricsCollectorConfig.Resource.Limits[corev1.ResourceCPU] + memLimit := metricsCollectorConfig.Resource.Limits[corev1.ResourceMemory] + diskLimit := metricsCollectorConfig.Resource.Limits[corev1.ResourceEphemeralStorage] + if !cpuLimit.IsZero() { + metricsCollectorConfigData[consts.LabelSuggestionCPULimitTag] = cpuLimit.String() + } + if !memLimit.IsZero() { + metricsCollectorConfigData[consts.LabelSuggestionMemLimitTag] = memLimit.String() + } + if !diskLimit.IsZero() { + metricsCollectorConfigData[consts.LabelSuggestionDiskLimitTag] = diskLimit.String() + } + + } else { + return metricsCollectorConfigData, errors.New("Cannot support metricsCollector injection for kind " + kind) + } + } else { + return metricsCollectorConfigData, errors.New("Failed to find metrics collector configuration in configmap " + consts.KatibConfigMapName) + } + return metricsCollectorConfigData, nil +} diff --git a/pkg/webhook/v1beta1/common/const.go b/pkg/webhook/v1beta1/common/const.go new file mode 100644 index 00000000000..2ec4b28efaa --- /dev/null +++ b/pkg/webhook/v1beta1/common/const.go @@ -0,0 +1,22 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package common + +const ( + KatibMetricsCollectorInjection = "katib-metricscollector-injection" + KatibMetricsCollectorInjectionEnabled = "enabled" +) diff --git a/pkg/webhook/v1beta1/experiment/mutate_webhook.go b/pkg/webhook/v1beta1/experiment/mutate_webhook.go new file mode 100644 index 00000000000..93f919878cc --- /dev/null +++ b/pkg/webhook/v1beta1/experiment/mutate_webhook.go @@ -0,0 +1,70 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package experiment + +import ( + "context" + "net/http" + + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/runtime/inject" + "sigs.k8s.io/controller-runtime/pkg/webhook/admission" + "sigs.k8s.io/controller-runtime/pkg/webhook/admission/types" + + experimentsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" +) + +// experimentDefaulter that sets default fields in experiment +type experimentDefaulter struct { + client client.Client + decoder types.Decoder +} + +var _ admission.Handler = &experimentDefaulter{} + +func (e *experimentDefaulter) Handle(ctx context.Context, req types.Request) types.Response { + inst := &experimentsv1beta1.Experiment{} + err := e.decoder.Decode(req, inst) + if err != nil { + return admission.ErrorResponse(http.StatusBadRequest, err) + } + + copy := inst.DeepCopy() + copy.SetDefault() + + return admission.PatchResponse(inst, copy) +} + +var _ inject.Client = &experimentDefaulter{} + +func (e *experimentDefaulter) InjectClient(c client.Client) error { + e.client = c + return nil +} + +var _ inject.Decoder = &experimentDefaulter{} + +func (e *experimentDefaulter) InjectDecoder(d types.Decoder) error { + e.decoder = d + return nil +} + +func NewExperimentDefaulter(c client.Client) *experimentDefaulter { + return &experimentDefaulter{ + client: c, + } +} diff --git a/pkg/webhook/v1beta1/experiment/validation_webhook.go b/pkg/webhook/v1beta1/experiment/validation_webhook.go new file mode 100644 index 00000000000..1cf79f9178f --- /dev/null +++ b/pkg/webhook/v1beta1/experiment/validation_webhook.go @@ -0,0 +1,114 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package experiment + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "net/http" + + v1 "k8s.io/api/core/v1" + ktypes "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/runtime/inject" + "sigs.k8s.io/controller-runtime/pkg/webhook/admission" + "sigs.k8s.io/controller-runtime/pkg/webhook/admission/types" + + experimentsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + "github.com/kubeflow/katib/pkg/controller.v1beta1/experiment/manifest" + "github.com/kubeflow/katib/pkg/webhook/v1beta1/common" + "github.com/kubeflow/katib/pkg/webhook/v1beta1/experiment/validator" +) + +// experimentValidator validates Pods +type experimentValidator struct { + admission.Handler + client client.Client + decoder types.Decoder + validator.Validator +} + +func NewExperimentValidator(c client.Client) *experimentValidator { + p := manifest.New(c) + return &experimentValidator{ + Validator: validator.New(p), + } +} + +func (v *experimentValidator) Handle(ctx context.Context, req types.Request) types.Response { + inst := &experimentsv1beta1.Experiment{} + var oldInst *experimentsv1beta1.Experiment + err := v.decoder.Decode(req, inst) + if err != nil { + return admission.ErrorResponse(http.StatusBadRequest, err) + } + if len(req.AdmissionRequest.OldObject.Raw) > 0 { + oldDecoder := json.NewDecoder(bytes.NewBuffer(req.AdmissionRequest.OldObject.Raw)) + oldInst = &experimentsv1beta1.Experiment{} + if err := oldDecoder.Decode(&oldInst); err != nil { + return admission.ErrorResponse(http.StatusBadRequest, fmt.Errorf("cannot decode incoming old object: %v", err)) + } + } + + // After metrics collector sidecar injection in Job level done, delete validation for namespace labels + ns := &v1.Namespace{} + if err := v.client.Get(context.TODO(), ktypes.NamespacedName{Name: req.AdmissionRequest.Namespace}, ns); err != nil { + return admission.ErrorResponse(http.StatusInternalServerError, err) + } + validNS := true + if ns.Labels == nil { + validNS = false + } else { + if v, ok := ns.Labels[common.KatibMetricsCollectorInjection]; !ok || v != common.KatibMetricsCollectorInjectionEnabled { + validNS = false + } + } + if !validNS { + err = fmt.Errorf("Cannot create the Experiment %q in namespace %q: the namespace lacks label \"%s: %s\"", + inst.Name, req.AdmissionRequest.Namespace, common.KatibMetricsCollectorInjection, common.KatibMetricsCollectorInjectionEnabled) + return admission.ErrorResponse(http.StatusBadRequest, err) + } + + err = v.ValidateExperiment(inst, oldInst) + if err != nil { + return admission.ErrorResponse(http.StatusBadRequest, err) + } + return admission.ValidationResponse(true, "") +} + +// experimentValidator implements inject.Client. +// A client will be automatically injected. +var _ inject.Client = &experimentValidator{} + +// InjectClient injects the client. +func (v *experimentValidator) InjectClient(c client.Client) error { + v.client = c + v.Validator.InjectClient(c) + return nil +} + +// experimentValidator implements inject.Decoder. +// A decoder will be automatically injected. +var _ inject.Decoder = &experimentValidator{} + +// InjectDecoder injects the decoder. +func (v *experimentValidator) InjectDecoder(d types.Decoder) error { + v.decoder = d + return nil +} diff --git a/pkg/webhook/v1beta1/experiment/validator/validator.go b/pkg/webhook/v1beta1/experiment/validator/validator.go new file mode 100644 index 00000000000..f154d96cc9a --- /dev/null +++ b/pkg/webhook/v1beta1/experiment/validator/validator.go @@ -0,0 +1,234 @@ +package validator + +import ( + "bytes" + "fmt" + "path/filepath" + "regexp" + "strconv" + "strings" + + "k8s.io/apimachinery/pkg/api/equality" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + k8syaml "k8s.io/apimachinery/pkg/util/yaml" + "sigs.k8s.io/controller-runtime/pkg/client" + logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + + commonapiv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" + experimentsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + "github.com/kubeflow/katib/pkg/controller.v1beta1/experiment/manifest" + jobv1beta1 "github.com/kubeflow/katib/pkg/job/v1beta1" + mccommon "github.com/kubeflow/katib/pkg/metricscollector/v1beta1/common" +) + +var log = logf.Log.WithName("experiment-validating-webhook") + +type Validator interface { + ValidateExperiment(instance, oldInst *experimentsv1beta1.Experiment) error + InjectClient(c client.Client) +} + +type DefaultValidator struct { + manifest.Generator +} + +func New(generator manifest.Generator) Validator { + return &DefaultValidator{ + Generator: generator, + } +} + +func (g *DefaultValidator) InjectClient(c client.Client) { + g.Generator.InjectClient(c) +} + +func (g *DefaultValidator) ValidateExperiment(instance, oldInst *experimentsv1beta1.Experiment) error { + if instance.Spec.MaxFailedTrialCount != nil && *instance.Spec.MaxFailedTrialCount < 0 { + return fmt.Errorf("spec.maxFailedTrialCount should not be less than 0") + } + if instance.Spec.MaxTrialCount != nil && *instance.Spec.MaxTrialCount <= 0 { + return fmt.Errorf("spec.maxTrialCount must be greater than 0") + } + if instance.Spec.ParallelTrialCount != nil && *instance.Spec.ParallelTrialCount <= 0 { + return fmt.Errorf("spec.parallelTrialCount must be greater than 0") + } + if oldInst != nil { + oldInst.Spec.MaxFailedTrialCount = instance.Spec.MaxFailedTrialCount + oldInst.Spec.MaxTrialCount = instance.Spec.MaxTrialCount + oldInst.Spec.ParallelTrialCount = instance.Spec.ParallelTrialCount + if equality.Semantic.DeepEqual(instance.Spec, oldInst.Spec) { + return nil + } else { + return fmt.Errorf("Only spec.parallelTrialCount, spec.maxTrialCount and spec.maxFailedTrialCount are editable.") + } + } + if err := g.validateObjective(instance.Spec.Objective); err != nil { + return err + } + if err := g.validateAlgorithm(instance.Spec.Algorithm); err != nil { + return err + } + if err := g.validateResumePolicy(instance.Spec.ResumePolicy); err != nil { + return err + } + + if err := g.validateTrialTemplate(instance); err != nil { + return err + } + + if len(instance.Spec.Parameters) == 0 && instance.Spec.NasConfig == nil { + return fmt.Errorf("spec.parameters or spec.nasConfig must be specified.") + } + + if len(instance.Spec.Parameters) > 0 && instance.Spec.NasConfig != nil { + return fmt.Errorf("Only one of spec.parameters and spec.nasConfig can be specified.") + } + + if err := g.validateMetricsCollector(instance); err != nil { + return err + } + return nil +} + +func (g *DefaultValidator) validateObjective(obj *commonapiv1beta1.ObjectiveSpec) error { + if obj == nil { + return fmt.Errorf("No spec.objective specified.") + } + if obj.Type != commonapiv1beta1.ObjectiveTypeMinimize && obj.Type != commonapiv1beta1.ObjectiveTypeMaximize { + return fmt.Errorf("spec.objective.type must be %s or %s.", commonapiv1beta1.ObjectiveTypeMinimize, commonapiv1beta1.ObjectiveTypeMaximize) + } + if obj.ObjectiveMetricName == "" { + return fmt.Errorf("No spec.objective.objectiveMetricName specified.") + } + return nil +} + +func (g *DefaultValidator) validateAlgorithm(ag *commonapiv1beta1.AlgorithmSpec) error { + if ag == nil { + return fmt.Errorf("No spec.algorithm specified.") + } + if ag.AlgorithmName == "" { + return fmt.Errorf("No spec.algorithm.name specified.") + } + + if _, err := g.GetSuggestionConfigData(ag.AlgorithmName); err != nil { + return fmt.Errorf("Don't support algorithm %s: %v.", ag.AlgorithmName, err) + } + + return nil +} + +func (g *DefaultValidator) validateResumePolicy(resume experimentsv1beta1.ResumePolicyType) error { + validTypes := map[experimentsv1beta1.ResumePolicyType]string{ + "": "", + experimentsv1beta1.NeverResume: "", + experimentsv1beta1.LongRunning: "", + } + if _, ok := validTypes[resume]; !ok { + return fmt.Errorf("invalid ResumePolicyType %s", resume) + } + return nil +} + +func (g *DefaultValidator) validateTrialTemplate(instance *experimentsv1beta1.Experiment) error { + trialName := fmt.Sprintf("%s-trial", instance.GetName()) + runSpec, err := g.GetRunSpec(instance, instance.GetName(), trialName, instance.GetNamespace()) + if err != nil { + return fmt.Errorf("Invalid spec.trialTemplate: %v.", err) + } + + bufSize := 1024 + buf := bytes.NewBufferString(runSpec) + + job := &unstructured.Unstructured{} + if err := k8syaml.NewYAMLOrJSONDecoder(buf, bufSize).Decode(job); err != nil { + return fmt.Errorf("Invalid spec.trialTemplate: %v.", err) + } + + if err := g.validateSupportedJob(job); err != nil { + return fmt.Errorf("Invalid spec.trialTemplate: %v.", err) + } + + if job.GetNamespace() != instance.GetNamespace() { + return fmt.Errorf("Invalid spec.trialTemplate: metadata.namespace should be %s or {{.NameSpace}}", instance.GetNamespace()) + } + if job.GetName() != trialName { + return fmt.Errorf("Invalid spec.trialTemplate: metadata.name should be {{.Trial}}") + } + return nil +} + +func (g *DefaultValidator) validateSupportedJob(job *unstructured.Unstructured) error { + gvk := job.GroupVersionKind() + supportedJobs := jobv1beta1.SupportedJobList + for _, sJob := range supportedJobs { + if gvk == sJob { + return nil + } + } + return fmt.Errorf("Job type %v not supported", gvk) +} + +func (g *DefaultValidator) validateMetricsCollector(inst *experimentsv1beta1.Experiment) error { + mcSpec := inst.Spec.MetricsCollectorSpec + mcKind := mcSpec.Collector.Kind + for _, mc := range mccommon.AutoInjectMetricsCollecterList { + if mcKind != mc { + continue + } + if _, err := g.GetMetricsCollectorImage(mcKind); err != nil { + return fmt.Errorf("GetMetricsCollectorImage failed: %v.", err) + } + break + } + // TODO(hougangliu): log warning message if some field will not be used for the metricsCollector kind + switch mcKind { + case commonapiv1beta1.NoneCollector, commonapiv1beta1.StdOutCollector: + return nil + case commonapiv1beta1.FileCollector: + if mcSpec.Source == nil || mcSpec.Source.FileSystemPath == nil || + mcSpec.Source.FileSystemPath.Kind != commonapiv1beta1.FileKind || !filepath.IsAbs(mcSpec.Source.FileSystemPath.Path) { + return fmt.Errorf("File path where metrics file exists is required by .spec.metricsCollectorSpec.source.fileSystemPath.path") + } + case commonapiv1beta1.TfEventCollector: + if mcSpec.Source == nil || mcSpec.Source.FileSystemPath == nil || + mcSpec.Source.FileSystemPath.Kind != commonapiv1beta1.DirectoryKind || !filepath.IsAbs(mcSpec.Source.FileSystemPath.Path) { + return fmt.Errorf("Directory path where tensorflow event files exist is required by .spec.metricsCollectorSpec.source.fileSystemPath.path") + } + case commonapiv1beta1.PrometheusMetricCollector: + i, err := strconv.Atoi(mcSpec.Source.HttpGet.Port.String()) + if err != nil || i <= 0 { + return fmt.Errorf(".spec.metricsCollectorSpec.source.httpGet.port must be a positive integer value for metrics collector kind: %v.", mcKind) + } + if !strings.HasPrefix(mcSpec.Source.HttpGet.Path, "/") { + return fmt.Errorf(".spec.metricsCollectorSpec.source.httpGet.path is invalid for metrics collector kind: %v.", mcKind) + } + case commonapiv1beta1.CustomCollector: + if mcSpec.Collector.CustomCollector == nil { + return fmt.Errorf(".spec.metricsCollectorSpec.collector.customCollector is required for metrics collector kind: %v.", mcKind) + } + if mcSpec.Source.FileSystemPath != nil { + if !filepath.IsAbs(mcSpec.Source.FileSystemPath.Path) || (mcSpec.Source.FileSystemPath.Kind != commonapiv1beta1.DirectoryKind && + mcSpec.Source.FileSystemPath.Kind != commonapiv1beta1.FileKind) { + return fmt.Errorf(".spec.metricsCollectorSpec.source is invalid") + } + } + default: + return fmt.Errorf("Invalid metrics collector kind: %v.", mcKind) + } + if mcSpec.Source != nil && mcSpec.Source.Filter != nil && len(mcSpec.Source.Filter.MetricsFormat) > 0 { + // the filter regular expression must have two top subexpressions, the first matched one will be taken as metric name, the second one as metric value + mustTwoBracket, _ := regexp.Compile(`.*\(.*\).*\(.*\).*`) + for _, mFormat := range mcSpec.Source.Filter.MetricsFormat { + if _, err := regexp.Compile(mFormat); err != nil { + return fmt.Errorf("Invalid %q in .spec.metricsCollectorSpec.source.filter: %v.", mFormat, err) + } else { + if !mustTwoBracket.MatchString(mFormat) { + return fmt.Errorf("Invalid %q in .spec.metricsCollectorSpec.source.filter: two top subexpressions are required", mFormat) + } + } + } + } + + return nil +} diff --git a/pkg/webhook/v1beta1/experiment/validator/validator_test.go b/pkg/webhook/v1beta1/experiment/validator/validator_test.go new file mode 100644 index 00000000000..2a692ff037a --- /dev/null +++ b/pkg/webhook/v1beta1/experiment/validator/validator_test.go @@ -0,0 +1,563 @@ +package validator + +import ( + "strings" + "testing" + + "github.com/golang/mock/gomock" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" + logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + + commonv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" + experimentsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + "github.com/kubeflow/katib/pkg/controller.v1beta1/consts" + manifestmock "github.com/kubeflow/katib/pkg/mock/v1beta1/experiment/manifest" + v1 "k8s.io/api/core/v1" +) + +func init() { + logf.SetLogger(logf.ZapLogger(false)) +} + +func TestValidateTFJobTrialTemplate(t *testing.T) { + trialTFJobTemplate := `apiVersion: "kubeflow.org/v1" +kind: "TFJob" +metadata: + name: "dist-mnist-for-e2e-test" +spec: + tfReplicaSpecs: + Worker: + template: + spec: + containers: + - name: tensorflow + image: gaocegege/mnist:1` + + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + p := manifestmock.NewMockGenerator(mockCtrl) + g := New(p) + + p.EXPECT().GetRunSpec(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(trialTFJobTemplate, nil) + + instance := newFakeInstance() + if err := g.(*DefaultValidator).validateTrialTemplate(instance); err == nil { + t.Errorf("Expected error, got nil") + } +} + +func TestValidateJobTrialTemplate(t *testing.T) { + trialJobTemplate := `apiVersion: batch/v1 +kind: Job +metadata: + name: fake-trial + namespace: fakens +spec: + template: + spec: + containers: + - name: fake-trial + image: test-image` + + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + p := manifestmock.NewMockGenerator(mockCtrl) + g := New(p) + + invalidYaml := strings.Replace(trialJobTemplate, "- name", "- * -", -1) + invalidJobType := strings.Replace(trialJobTemplate, "Job", "NewJobType", -1) + invalidNamespace := strings.Replace(trialJobTemplate, "fakens", "not-fakens", -1) + invalidJobName := strings.Replace(trialJobTemplate, "fake-trial", "new-name", -1) + + validRun := p.EXPECT().GetRunSpec(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(trialJobTemplate, nil) + invalidYamlRun := p.EXPECT().GetRunSpec(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(invalidYaml, nil) + invalidJobTypeRun := p.EXPECT().GetRunSpec(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(invalidJobType, nil) + invalidNamespaceRun := p.EXPECT().GetRunSpec(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(invalidNamespace, nil) + invalidJobNameRun := p.EXPECT().GetRunSpec(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(invalidJobName, nil) + + gomock.InOrder( + validRun, + invalidYamlRun, + invalidJobTypeRun, + invalidNamespaceRun, + invalidJobNameRun, + ) + + tcs := []struct { + Instance *experimentsv1beta1.Experiment + Err bool + }{ + { + Instance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.TrialTemplate = newFakeTrialTemplate(trialJobTemplate) + return i + }(), + Err: false, + }, + { + Instance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.TrialTemplate = newFakeTrialTemplate(invalidYaml) + return i + }(), + Err: true, + }, + { + Instance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.TrialTemplate = newFakeTrialTemplate(invalidJobType) + return i + }(), + Err: true, + }, + { + Instance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.TrialTemplate = newFakeTrialTemplate(invalidNamespace) + return i + }(), + Err: true, + }, + { + Instance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.TrialTemplate = newFakeTrialTemplate(invalidJobName) + return i + }(), + Err: true, + }, + } + for _, tc := range tcs { + err := g.(*DefaultValidator).validateTrialTemplate(tc.Instance) + if !tc.Err && err != nil { + t.Errorf("Expected nil, got %v", err) + } else if tc.Err && err == nil { + t.Errorf("Expected err, got nil") + } + } +} + +func TestValidateExperiment(t *testing.T) { + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + p := manifestmock.NewMockGenerator(mockCtrl) + g := New(p) + + trialJobTemplate := `apiVersion: "batch/v1" +kind: "Job" +metadata: + name: "fake-trial" + namespace: fakens` + + suggestionConfigData := map[string]string{} + suggestionConfigData[consts.LabelSuggestionImageTag] = "algorithmImage" + fakeNegativeInt := int32(-1) + + p.EXPECT().GetRunSpec(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(trialJobTemplate, nil).AnyTimes() + p.EXPECT().GetSuggestionConfigData(gomock.Any()).Return(suggestionConfigData, nil).AnyTimes() + p.EXPECT().GetMetricsCollectorImage(gomock.Any()).Return("metricsCollectorImage", nil).AnyTimes() + + tcs := []struct { + Instance *experimentsv1beta1.Experiment + Err bool + oldInstance *experimentsv1beta1.Experiment + }{ + //Objective + { + Instance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.Objective = nil + return i + }(), + Err: true, + }, + { + Instance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.Objective.Type = commonv1beta1.ObjectiveTypeUnknown + return i + }(), + Err: true, + }, + { + Instance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.Objective.ObjectiveMetricName = "" + return i + }(), + Err: true, + }, + //Algorithm + { + Instance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.Algorithm = nil + return i + }(), + Err: true, + }, + { + Instance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.Algorithm.AlgorithmName = "" + return i + }(), + Err: true, + }, + { + Instance: newFakeInstance(), + Err: false, + }, + { + Instance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.MaxFailedTrialCount = &fakeNegativeInt + return i + }(), + Err: true, + }, + { + Instance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.MaxTrialCount = &fakeNegativeInt + return i + }(), + Err: true, + }, + { + Instance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.ParallelTrialCount = &fakeNegativeInt + return i + }(), + Err: true, + }, + { + Instance: newFakeInstance(), + Err: false, + oldInstance: newFakeInstance(), + }, + { + Instance: newFakeInstance(), + Err: true, + oldInstance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.Algorithm.AlgorithmName = "not-test" + return i + }(), + }, + { + Instance: newFakeInstance(), + Err: true, + oldInstance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.ResumePolicy = "invalid-policy" + return i + }(), + }, + { + Instance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.Parameters = []experimentsv1beta1.ParameterSpec{} + i.Spec.NasConfig = nil + return i + }(), + Err: true, + }, + { + Instance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.NasConfig = &experimentsv1beta1.NasConfig{ + Operations: []experimentsv1beta1.Operation{ + { + OperationType: "op1", + }, + }, + } + return i + }(), + Err: true, + }, + } + + for _, tc := range tcs { + err := g.ValidateExperiment(tc.Instance, tc.oldInstance) + if !tc.Err && err != nil { + t.Errorf("Expected nil, got %v", err) + } else if tc.Err && err == nil { + t.Errorf("Expected err, got nil") + } + } +} + +func TestValidateMetricsCollector(t *testing.T) { + + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + p := manifestmock.NewMockGenerator(mockCtrl) + g := New(p) + + p.EXPECT().GetMetricsCollectorImage(gomock.Any()).Return("metricsCollectorImage", nil).AnyTimes() + + tcs := []struct { + Instance *experimentsv1beta1.Experiment + Err bool + }{ + // Invalid Metrics Collector Kind + { + Instance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.MetricsCollectorSpec = &commonv1beta1.MetricsCollectorSpec{ + Collector: &commonv1beta1.CollectorSpec{ + Kind: commonv1beta1.CollectorKind("invalid-kind"), + }, + } + return i + }(), + Err: true, + }, + // FileCollector invalid Path + { + Instance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.MetricsCollectorSpec = &commonv1beta1.MetricsCollectorSpec{ + Collector: &commonv1beta1.CollectorSpec{ + Kind: commonv1beta1.FileCollector, + }, + Source: &commonv1beta1.SourceSpec{ + FileSystemPath: &commonv1beta1.FileSystemPath{ + Path: "not/absolute/path", + }, + }, + } + return i + }(), + Err: true, + }, + // TfEventCollector invalid Path + { + Instance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.MetricsCollectorSpec = &commonv1beta1.MetricsCollectorSpec{ + Collector: &commonv1beta1.CollectorSpec{ + Kind: commonv1beta1.TfEventCollector, + }, + Source: &commonv1beta1.SourceSpec{ + FileSystemPath: &commonv1beta1.FileSystemPath{ + Path: "not/absolute/path", + }, + }, + } + return i + }(), + Err: true, + }, + // PrometheusMetricCollector invalid Port + { + Instance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.MetricsCollectorSpec = &commonv1beta1.MetricsCollectorSpec{ + Collector: &commonv1beta1.CollectorSpec{ + Kind: commonv1beta1.PrometheusMetricCollector, + }, + Source: &commonv1beta1.SourceSpec{ + HttpGet: &v1.HTTPGetAction{ + Port: intstr.IntOrString{ + StrVal: "Port", + }, + }, + }, + } + return i + }(), + Err: true, + }, + // PrometheusMetricCollector invalid Path + { + Instance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.MetricsCollectorSpec = &commonv1beta1.MetricsCollectorSpec{ + Collector: &commonv1beta1.CollectorSpec{ + Kind: commonv1beta1.PrometheusMetricCollector, + }, + Source: &commonv1beta1.SourceSpec{ + HttpGet: &v1.HTTPGetAction{ + Port: intstr.IntOrString{ + IntVal: 8888, + }, + Path: "not/valid/path", + }, + }, + } + return i + }(), + Err: true, + }, + // CustomCollector empty CustomCollector + { + Instance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.MetricsCollectorSpec = &commonv1beta1.MetricsCollectorSpec{ + Collector: &commonv1beta1.CollectorSpec{ + Kind: commonv1beta1.CustomCollector, + }, + } + return i + }(), + Err: true, + }, + // CustomCollector invalid Path + { + Instance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.MetricsCollectorSpec = &commonv1beta1.MetricsCollectorSpec{ + Collector: &commonv1beta1.CollectorSpec{ + Kind: commonv1beta1.CustomCollector, + CustomCollector: &v1.Container{ + Name: "my-collector", + }, + }, + Source: &commonv1beta1.SourceSpec{ + FileSystemPath: &commonv1beta1.FileSystemPath{ + Path: "not/absolute/path", + }, + }, + } + return i + }(), + Err: true, + }, + // FileMetricCollector invalid regexp in metrics format + { + Instance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.MetricsCollectorSpec = &commonv1beta1.MetricsCollectorSpec{ + Collector: &commonv1beta1.CollectorSpec{ + Kind: commonv1beta1.FileCollector, + }, + Source: &commonv1beta1.SourceSpec{ + Filter: &commonv1beta1.FilterSpec{ + MetricsFormat: []string{ + "[", + }, + }, + FileSystemPath: &commonv1beta1.FileSystemPath{ + Path: "/absolute/path", + Kind: commonv1beta1.FileKind, + }, + }, + } + return i + }(), + Err: true, + }, + // FileMetricCollector one subexpression in metrics format + { + Instance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.MetricsCollectorSpec = &commonv1beta1.MetricsCollectorSpec{ + Collector: &commonv1beta1.CollectorSpec{ + Kind: commonv1beta1.FileCollector, + }, + Source: &commonv1beta1.SourceSpec{ + Filter: &commonv1beta1.FilterSpec{ + MetricsFormat: []string{ + "{metricName: ([\\w|-]+)}", + }, + }, + FileSystemPath: &commonv1beta1.FileSystemPath{ + Path: "/absolute/path", + Kind: commonv1beta1.FileKind, + }, + }, + } + return i + }(), + Err: true, + }, + // Valid FileMetricCollector + { + Instance: func() *experimentsv1beta1.Experiment { + i := newFakeInstance() + i.Spec.MetricsCollectorSpec = &commonv1beta1.MetricsCollectorSpec{ + Collector: &commonv1beta1.CollectorSpec{ + Kind: commonv1beta1.FileCollector, + }, + Source: &commonv1beta1.SourceSpec{ + FileSystemPath: &commonv1beta1.FileSystemPath{ + Path: "/absolute/path", + Kind: commonv1beta1.FileKind, + }, + }, + } + return i + }(), + Err: false, + }, + } + + for _, tc := range tcs { + err := g.(*DefaultValidator).validateMetricsCollector(tc.Instance) + if !tc.Err && err != nil { + t.Errorf("Expected nil, got %v", err) + } else if tc.Err && err == nil { + t.Errorf("Expected err, got nil") + } + } + +} + +func newFakeInstance() *experimentsv1beta1.Experiment { + goal := 0.11 + return &experimentsv1beta1.Experiment{ + ObjectMeta: metav1.ObjectMeta{ + Name: "fake", + Namespace: "fakens", + }, + Spec: experimentsv1beta1.ExperimentSpec{ + MetricsCollectorSpec: &commonv1beta1.MetricsCollectorSpec{ + Collector: &commonv1beta1.CollectorSpec{ + Kind: commonv1beta1.StdOutCollector, + }, + }, + Objective: &commonv1beta1.ObjectiveSpec{ + Type: commonv1beta1.ObjectiveTypeMaximize, + Goal: &goal, + ObjectiveMetricName: "testme", + }, + Algorithm: &commonv1beta1.AlgorithmSpec{ + AlgorithmName: "test", + AlgorithmSettings: []commonv1beta1.AlgorithmSetting{ + { + Name: "test1", + Value: "value1", + }, + }, + }, + Parameters: []experimentsv1beta1.ParameterSpec{ + { + Name: "test", + ParameterType: experimentsv1beta1.ParameterTypeCategorical, + FeasibleSpace: experimentsv1beta1.FeasibleSpace{ + List: []string{"1", "2"}, + }, + }, + }, + }, + } +} + +func newFakeTrialTemplate(template string) *experimentsv1beta1.TrialTemplate { + return &experimentsv1beta1.TrialTemplate{ + Retain: false, + GoTemplate: &experimentsv1beta1.GoTemplate{ + RawTemplate: template, + }, + } +} diff --git a/pkg/webhook/v1beta1/pod/const.go b/pkg/webhook/v1beta1/pod/const.go new file mode 100644 index 00000000000..e4566e4f620 --- /dev/null +++ b/pkg/webhook/v1beta1/pod/const.go @@ -0,0 +1,34 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package pod + +import ( + common "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" +) + +const ( + MasterRole = "master" + BatchJob = "Job" +) + +var ( + NeedWrapWorkerMetricsCollecterList = [...]common.CollectorKind{ + common.StdOutCollector, + common.TfEventCollector, + common.FileCollector, + } +) diff --git a/pkg/webhook/v1beta1/pod/inject_webhook.go b/pkg/webhook/v1beta1/pod/inject_webhook.go new file mode 100644 index 00000000000..4228ae64e92 --- /dev/null +++ b/pkg/webhook/v1beta1/pod/inject_webhook.go @@ -0,0 +1,391 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package pod + +import ( + "context" + "fmt" + "net/http" + "path/filepath" + "strings" + + "github.com/spf13/viper" + v1 "k8s.io/api/core/v1" + k8serrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/resource" + apitypes "k8s.io/apimachinery/pkg/types" + "k8s.io/utils/pointer" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/runtime/inject" + logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + "sigs.k8s.io/controller-runtime/pkg/webhook/admission" + "sigs.k8s.io/controller-runtime/pkg/webhook/admission/types" + + common "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" + trialsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/trials/v1beta1" + katibmanagerv1beta1 "github.com/kubeflow/katib/pkg/common/v1beta1" + "github.com/kubeflow/katib/pkg/controller.v1beta1/consts" + jobv1beta1 "github.com/kubeflow/katib/pkg/job/v1beta1" + mccommon "github.com/kubeflow/katib/pkg/metricscollector/v1beta1/common" + "github.com/kubeflow/katib/pkg/util/v1beta1/katibconfig" +) + +var log = logf.Log.WithName("injector-webhook") + +// sidecarInjector that inject metrics collect sidecar into master pod +type sidecarInjector struct { + client client.Client + decoder types.Decoder + + // injectSecurityContext indicates if we should inject the security + // context into the metrics collector sidecar. + injectSecurityContext bool +} + +var _ admission.Handler = &sidecarInjector{} + +func (s *sidecarInjector) Handle(ctx context.Context, req types.Request) types.Response { + // Get the namespace from req since the namespace in the pod is empty. + namespace := req.AdmissionRequest.Namespace + pod := &v1.Pod{} + err := s.decoder.Decode(req, pod) + if err != nil { + return admission.ErrorResponse(http.StatusBadRequest, err) + } + + // Check whether the pod need to be mutated + needMutate, err := s.MutationRequired(pod, namespace) + if err != nil { + return admission.ErrorResponse(http.StatusInternalServerError, err) + } else { + if !needMutate { + return admission.ValidationResponse(true, "") + } + } + + // Do mutation + mutatedPod, err := s.Mutate(pod, namespace) + if err != nil { + log.Error(err, "Failed to inject metrics collector") + return admission.ErrorResponse(http.StatusBadRequest, err) + } + + return admission.PatchResponse(pod, mutatedPod) +} + +var _ inject.Client = &sidecarInjector{} + +func (s *sidecarInjector) InjectClient(c client.Client) error { + s.client = c + return nil +} + +var _ inject.Decoder = &sidecarInjector{} + +func (s *sidecarInjector) InjectDecoder(d types.Decoder) error { + s.decoder = d + return nil +} + +// NewSidecarInjector returns a new sidecar injector. +func NewSidecarInjector(c client.Client) *sidecarInjector { + return &sidecarInjector{ + injectSecurityContext: viper.GetBool(consts.ConfigInjectSecurityContext), + client: c, + } +} + +func (s *sidecarInjector) MutationRequired(pod *v1.Pod, ns string) (bool, error) { + jobKind, jobName, err := getKatibJob(pod) + if err != nil { + return false, nil + } + if !isMasterRole(pod, jobKind) { + return false, nil + } + + trialName := jobName + trial := &trialsv1beta1.Trial{} + err = s.client.Get(context.TODO(), apitypes.NamespacedName{Name: trialName, Namespace: ns}, trial) + if err != nil { + if k8serrors.IsNotFound(err) { + return false, nil + } else { + return false, err + } + } + if trial.Spec.MetricsCollector.Collector.Kind == common.NoneCollector { + return false, nil + } + return true, nil +} + +func (s *sidecarInjector) Mutate(pod *v1.Pod, namespace string) (*v1.Pod, error) { + mutatedPod := pod.DeepCopy() + + kind, trialName, _ := getKatibJob(pod) + trial := &trialsv1beta1.Trial{} + if err := s.client.Get(context.TODO(), apitypes.NamespacedName{Name: trialName, Namespace: namespace}, trial); err != nil { + return nil, err + } + + injectContainer, err := s.getMetricsCollectorContainer(trial, pod) + if err != nil { + return nil, err + } + mutatedPod.Spec.Containers = append(mutatedPod.Spec.Containers, *injectContainer) + + mutatedPod.Spec.ShareProcessNamespace = pointer.BoolPtr(true) + + mountPath, pathKind := getMountPath(trial.Spec.MetricsCollector) + if mountPath != "" { + if err = mutateVolume(mutatedPod, kind, mountPath, injectContainer.Name, pathKind); err != nil { + return nil, err + } + } + if needWrapWorkerContainer(trial.Spec.MetricsCollector) { + if err = wrapWorkerContainer(mutatedPod, namespace, kind, mountPath, pathKind, trial.Spec.MetricsCollector); err != nil { + return nil, err + } + } + + log.Info("Inject metrics collector sidecar container", "Pod", pod.Name, "Trial", trialName) + return mutatedPod, nil +} + +func (s *sidecarInjector) getMetricsCollectorContainer(trial *trialsv1beta1.Trial, originalPod *v1.Pod) (*v1.Container, error) { + mc := trial.Spec.MetricsCollector + if mc.Collector.Kind == common.CustomCollector { + return mc.Collector.CustomCollector, nil + } + metricName := trial.Spec.Objective.ObjectiveMetricName + for _, v := range trial.Spec.Objective.AdditionalMetricNames { + metricName += ";" + metricName += v + } + metricsCollectorConfigData, err := katibconfig.GetMetricsCollectorConfigData(mc.Collector.Kind, s.client) + if err != nil { + return nil, err + } + args := getMetricsCollectorArgs(trial.Name, metricName, mc) + sidecarContainerName := getSidecarContainerName(trial.Spec.MetricsCollector.Collector.Kind) + + // Get metricsCollector data from config + metricsCollectorContainerImage := metricsCollectorConfigData[consts.LabelMetricsCollectorSidecarImage] + metricsCollectorImagePullPolicy := metricsCollectorConfigData[consts.LabelMetricsCollectorImagePullPolicy] + metricsCollectorCPULimit := metricsCollectorConfigData[consts.LabelMetricsCollectorCPULimitTag] + metricsCollectorCPURequest := metricsCollectorConfigData[consts.LabelMetricsCollectorCPURequestTag] + metricsCollectorMemLimit := metricsCollectorConfigData[consts.LabelMetricsCollectorMemLimitTag] + metricsCollectorMemRequest := metricsCollectorConfigData[consts.LabelMetricsCollectorMemRequestTag] + metricsCollectorDiskLimit := metricsCollectorConfigData[consts.LabelMetricsCollectorDiskLimitTag] + metricsCollectorDiskRequest := metricsCollectorConfigData[consts.LabelMetricsCollectorDiskRequestTag] + + cpuLimitQuantity, err := resource.ParseQuantity(metricsCollectorCPULimit) + if err != nil { + return nil, err + } + cpuRequestQuantity, err := resource.ParseQuantity(metricsCollectorCPURequest) + if err != nil { + return nil, err + } + memLimitQuantity, err := resource.ParseQuantity(metricsCollectorMemLimit) + if err != nil { + return nil, err + } + memRequestQuantity, err := resource.ParseQuantity(metricsCollectorMemRequest) + if err != nil { + return nil, err + } + diskLimitQuantity, err := resource.ParseQuantity(metricsCollectorDiskLimit) + if err != nil { + return nil, err + } + diskRequestQuantity, err := resource.ParseQuantity(metricsCollectorDiskRequest) + if err != nil { + return nil, err + } + + injectContainer := v1.Container{ + Name: sidecarContainerName, + Image: metricsCollectorContainerImage, + Args: args, + ImagePullPolicy: v1.PullPolicy(metricsCollectorImagePullPolicy), + Resources: v1.ResourceRequirements{ + Limits: v1.ResourceList{ + v1.ResourceCPU: cpuLimitQuantity, + v1.ResourceMemory: memLimitQuantity, + v1.ResourceEphemeralStorage: diskLimitQuantity, + }, + Requests: v1.ResourceList{ + v1.ResourceCPU: cpuRequestQuantity, + v1.ResourceMemory: memRequestQuantity, + v1.ResourceEphemeralStorage: diskRequestQuantity, + }, + }, + } + + // Inject the security context when the flag is enabled. + if s.injectSecurityContext { + if len(originalPod.Spec.Containers) != 0 && + originalPod.Spec.Containers[0].SecurityContext != nil { + injectContainer.SecurityContext = originalPod.Spec.Containers[0].SecurityContext.DeepCopy() + } + } + + return &injectContainer, nil +} + +func getMetricsCollectorArgs(trialName, metricName string, mc common.MetricsCollectorSpec) []string { + args := []string{"-t", trialName, "-m", metricName, "-s", katibmanagerv1beta1.GetDBManagerAddr()} + if mountPath, _ := getMountPath(mc); mountPath != "" { + args = append(args, "-path", mountPath) + } + if mc.Source != nil && mc.Source.Filter != nil && len(mc.Source.Filter.MetricsFormat) > 0 { + args = append(args, "-f", strings.Join(mc.Source.Filter.MetricsFormat, ";")) + } + return args +} + +func getMountPath(mc common.MetricsCollectorSpec) (string, common.FileSystemKind) { + if mc.Collector.Kind == common.StdOutCollector { + return common.DefaultFilePath, common.FileKind + } else if mc.Collector.Kind == common.FileCollector { + return mc.Source.FileSystemPath.Path, common.FileKind + } else if mc.Collector.Kind == common.TfEventCollector { + return mc.Source.FileSystemPath.Path, common.DirectoryKind + } else if mc.Collector.Kind == common.CustomCollector { + if mc.Source == nil || mc.Source.FileSystemPath == nil { + return "", common.InvalidKind + } + return mc.Source.FileSystemPath.Path, mc.Source.FileSystemPath.Kind + } else { + return "", common.InvalidKind + } +} + +func needWrapWorkerContainer(mc common.MetricsCollectorSpec) bool { + mcKind := mc.Collector.Kind + for _, kind := range NeedWrapWorkerMetricsCollecterList { + if mcKind == kind { + return true + } + } + return false +} + +func wrapWorkerContainer( + pod *v1.Pod, namespace, jobKind, metricsFile string, + pathKind common.FileSystemKind, + mc common.MetricsCollectorSpec) error { + index := -1 + for i, c := range pod.Spec.Containers { + jobProvider, err := jobv1beta1.New(jobKind) + if err != nil { + return err + } + if jobProvider.IsTrainingContainer(i, c) { + index = i + break + } + } + if index >= 0 { + command := []string{"sh", "-c"} + args, err := getContainerCommand(pod, namespace, index) + if err != nil { + return err + } + // If the first two commands are sh -c, we do not inject command. + if args[0] == "sh" || args[0] == "bash" { + if args[1] == "-c" { + command = args[0:2] + args = args[2:] + } + } + if mc.Collector.Kind == common.StdOutCollector { + redirectStr := fmt.Sprintf("1>%s 2>&1", metricsFile) + args = append(args, redirectStr) + } + args = append(args, "&&", getMarkCompletedCommand(metricsFile, pathKind)) + argsStr := strings.Join(args, " ") + c := &pod.Spec.Containers[index] + c.Command = command + c.Args = []string{argsStr} + } + return nil +} + +func getMarkCompletedCommand(mountPath string, pathKind common.FileSystemKind) string { + dir := mountPath + if pathKind == common.FileKind { + dir = filepath.Dir(mountPath) + } + // $$ is process id in shell + pidFile := filepath.Join(dir, "$$$$.pid") + return fmt.Sprintf("echo %s > %s", mccommon.TrainingCompleted, pidFile) +} + +func mutateVolume(pod *v1.Pod, jobKind, mountPath, sidecarContainerName string, pathKind common.FileSystemKind) error { + metricsVol := v1.Volume{ + Name: common.MetricsVolume, + VolumeSource: v1.VolumeSource{ + EmptyDir: &v1.EmptyDirVolumeSource{}, + }, + } + dir := mountPath + if pathKind == common.FileKind { + dir = filepath.Dir(mountPath) + } + vm := v1.VolumeMount{ + Name: metricsVol.Name, + MountPath: dir, + } + indexList := []int{} + for i, c := range pod.Spec.Containers { + shouldMount := false + if c.Name == sidecarContainerName { + shouldMount = true + } else { + jobProvider, err := jobv1beta1.New(jobKind) + if err != nil { + return err + } + shouldMount = jobProvider.IsTrainingContainer(i, c) + } + if shouldMount { + indexList = append(indexList, i) + } + } + for _, i := range indexList { + c := &pod.Spec.Containers[i] + if c.VolumeMounts == nil { + c.VolumeMounts = make([]v1.VolumeMount, 0) + } + c.VolumeMounts = append(c.VolumeMounts, vm) + pod.Spec.Containers[i] = *c + } + pod.Spec.Volumes = append(pod.Spec.Volumes, metricsVol) + + return nil +} + +func getSidecarContainerName(cKind common.CollectorKind) string { + if cKind == common.StdOutCollector || cKind == common.FileCollector { + return mccommon.MetricLoggerCollectorContainerName + } else { + return mccommon.MetricCollectorContainerName + } +} diff --git a/pkg/webhook/v1beta1/pod/inject_webhook_test.go b/pkg/webhook/v1beta1/pod/inject_webhook_test.go new file mode 100644 index 00000000000..2a91f9d5dbb --- /dev/null +++ b/pkg/webhook/v1beta1/pod/inject_webhook_test.go @@ -0,0 +1,542 @@ +package pod + +import ( + "reflect" + "testing" + + "path/filepath" + + common "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" + "github.com/kubeflow/katib/pkg/controller.v1beta1/consts" + mccommon "github.com/kubeflow/katib/pkg/metricscollector/v1beta1/common" + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/equality" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func TestWrapWorkerContainer(t *testing.T) { + testCases := []struct { + Pod *v1.Pod + Namespace string + JobKind string + MetricsFile string + PathKind common.FileSystemKind + MC common.MetricsCollectorSpec + Expected *v1.Pod + ExpectedError error + Name string + }{ + { + Pod: &v1.Pod{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "tensorflow", + Command: []string{ + "python main.py", + }, + }, + }, + }, + }, + Namespace: "nohere", + JobKind: "TFJob", + MetricsFile: "testfile", + PathKind: common.FileKind, + MC: common.MetricsCollectorSpec{ + Collector: &common.CollectorSpec{ + Kind: common.StdOutCollector, + }, + }, + Expected: &v1.Pod{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "tensorflow", + Command: []string{ + "sh", "-c", + }, + Args: []string{ + "python main.py 1>testfile 2>&1 && echo completed > $$$$.pid", + }, + }, + }, + }, + }, + ExpectedError: nil, + Name: "tensorflow container without sh -c", + }, + { + Pod: &v1.Pod{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "test", + Command: []string{ + "python main.py", + }, + }, + }, + }, + }, + Namespace: "nohere", + JobKind: "TFJob", + MetricsFile: "testfile", + PathKind: common.FileKind, + MC: common.MetricsCollectorSpec{ + Collector: &common.CollectorSpec{ + Kind: common.StdOutCollector, + }, + }, + Expected: &v1.Pod{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "test", + Command: []string{ + "python main.py", + }, + }, + }, + }, + }, + ExpectedError: nil, + Name: "test container without sh -c", + }, + { + Pod: &v1.Pod{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "tensorflow", + Command: []string{ + "sh", "-c", + "python main.py", + }, + }, + }, + }, + }, + Namespace: "nohere", + JobKind: "TFJob", + MetricsFile: "testfile", + PathKind: common.FileKind, + MC: common.MetricsCollectorSpec{ + Collector: &common.CollectorSpec{ + Kind: common.StdOutCollector, + }, + }, + Expected: &v1.Pod{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "tensorflow", + Command: []string{ + "sh", "-c", + }, + Args: []string{ + "python main.py 1>testfile 2>&1 && echo completed > $$$$.pid", + }, + }, + }, + }, + }, + ExpectedError: nil, + Name: "Tensorflow container with sh -c", + }, + } + + for _, c := range testCases { + err := wrapWorkerContainer(c.Pod, c.Namespace, c.JobKind, c.MetricsFile, c.PathKind, c.MC) + if err != c.ExpectedError { + t.Errorf("Expected error %v, got %v", c.ExpectedError, err) + } + if err == nil { + if !equality.Semantic.DeepEqual(c.Pod.Spec.Containers, c.Expected.Spec.Containers) { + t.Errorf("Case %s: Expected pod %v, got %v", + c.Name, c.Expected.Spec.Containers, c.Pod.Spec.Containers) + } + } + } +} + +func TestGetMetricsCollectorArgs(t *testing.T) { + testTrialName := "test-trial" + testMetricName := "accuracy" + katibDBAddress := "katib-db-manager.kubeflow:6789" + testPath := "/test/path" + testCases := []struct { + TrialName string + MetricName string + MCSpec common.MetricsCollectorSpec + ExpectedArgs []string + Name string + }{ + { + TrialName: testTrialName, + MetricName: testMetricName, + MCSpec: common.MetricsCollectorSpec{ + Collector: &common.CollectorSpec{ + Kind: common.StdOutCollector, + }, + }, + ExpectedArgs: []string{ + "-t", testTrialName, + "-m", testMetricName, + "-s", katibDBAddress, + "-path", common.DefaultFilePath, + }, + Name: "StdOut MC", + }, + { + TrialName: testTrialName, + MetricName: testMetricName, + MCSpec: common.MetricsCollectorSpec{ + Collector: &common.CollectorSpec{ + Kind: common.FileCollector, + }, + Source: &common.SourceSpec{ + FileSystemPath: &common.FileSystemPath{ + Path: testPath, + }, + Filter: &common.FilterSpec{ + MetricsFormat: []string{ + "{mn1: ([a-b]), mv1: [0-9]}", + "{mn2: ([a-b]), mv2: ([0-9])}", + }, + }, + }, + }, + ExpectedArgs: []string{ + "-t", testTrialName, + "-m", testMetricName, + "-s", katibDBAddress, + "-path", testPath, + "-f", "{mn1: ([a-b]), mv1: [0-9]};{mn2: ([a-b]), mv2: ([0-9])}", + }, + Name: "File MC with Filter", + }, + { + TrialName: testTrialName, + MetricName: testMetricName, + MCSpec: common.MetricsCollectorSpec{ + Collector: &common.CollectorSpec{ + Kind: common.TfEventCollector, + }, + Source: &common.SourceSpec{ + FileSystemPath: &common.FileSystemPath{ + Path: testPath, + }, + }, + }, + ExpectedArgs: []string{ + "-t", testTrialName, + "-m", testMetricName, + "-s", katibDBAddress, + "-path", testPath, + }, + Name: "Tf Event MC", + }, + { + TrialName: testTrialName, + MetricName: testMetricName, + MCSpec: common.MetricsCollectorSpec{ + Collector: &common.CollectorSpec{ + Kind: common.CustomCollector, + }, + }, + ExpectedArgs: []string{ + "-t", testTrialName, + "-m", testMetricName, + "-s", katibDBAddress, + }, + Name: "Custom MC without Path", + }, + { + TrialName: testTrialName, + MetricName: testMetricName, + MCSpec: common.MetricsCollectorSpec{ + Collector: &common.CollectorSpec{ + Kind: common.CustomCollector, + }, + Source: &common.SourceSpec{ + FileSystemPath: &common.FileSystemPath{ + Path: testPath, + }, + }, + }, + ExpectedArgs: []string{ + "-t", testTrialName, + "-m", testMetricName, + "-s", katibDBAddress, + "-path", testPath, + }, + Name: "Custom MC with Path", + }, + { + TrialName: testTrialName, + MetricName: testMetricName, + MCSpec: common.MetricsCollectorSpec{ + Collector: &common.CollectorSpec{ + Kind: common.PrometheusMetricCollector, + }, + }, + ExpectedArgs: []string{ + "-t", testTrialName, + "-m", testMetricName, + "-s", katibDBAddress, + }, + Name: "Prometheus MC without Path", + }, + } + + for _, tc := range testCases { + args := getMetricsCollectorArgs(tc.TrialName, tc.MetricName, tc.MCSpec) + if !reflect.DeepEqual(tc.ExpectedArgs, args) { + t.Errorf("Case %v failed. ExpectedArgs: %v, got %v", tc.Name, tc.ExpectedArgs, args) + } + } +} + +func TestNeedWrapWorkerContainer(t *testing.T) { + testCases := []struct { + MCSpec common.MetricsCollectorSpec + needWrap bool + }{ + { + MCSpec: common.MetricsCollectorSpec{ + Collector: &common.CollectorSpec{ + Kind: common.StdOutCollector, + }, + }, + needWrap: true, + }, + { + MCSpec: common.MetricsCollectorSpec{ + Collector: &common.CollectorSpec{ + Kind: common.CustomCollector, + }, + }, + needWrap: false, + }, + } + + for _, tc := range testCases { + needWrap := needWrapWorkerContainer(tc.MCSpec) + if needWrap != tc.needWrap { + t.Errorf("Expected needWrap %v, got %v", tc.needWrap, needWrap) + } + } +} + +func TestMutateVolume(t *testing.T) { + tc := struct { + Pod v1.Pod + ExpectedPod v1.Pod + JobKind string + MountPath string + SidecarContainerName string + PathKind common.FileSystemKind + Err bool + }{ + Pod: v1.Pod{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "train-job", + }, + { + Name: "init-container", + }, + { + Name: "metrics-collector", + }, + }, + }, + }, + ExpectedPod: v1.Pod{ + Spec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "train-job", + VolumeMounts: []v1.VolumeMount{ + { + Name: common.MetricsVolume, + MountPath: filepath.Dir(common.DefaultFilePath), + }, + }, + }, + { + Name: "init-container", + }, + { + Name: "metrics-collector", + }, + }, + Volumes: []v1.Volume{ + { + Name: common.MetricsVolume, + VolumeSource: v1.VolumeSource{ + EmptyDir: &v1.EmptyDirVolumeSource{}, + }, + }, + }, + }, + }, + JobKind: "Job", + MountPath: common.DefaultFilePath, + SidecarContainerName: "train-job", + PathKind: common.FileKind, + } + + err := mutateVolume( + &tc.Pod, + tc.JobKind, + tc.MountPath, + tc.SidecarContainerName, + tc.PathKind) + if err != nil { + t.Errorf("mutateVolume failed: %v", err) + } else if !equality.Semantic.DeepEqual(tc.Pod, tc.ExpectedPod) { + t.Errorf("Expected pod %v, got %v", tc.ExpectedPod, tc.Pod) + } +} + +func TestGetSidecarContainerName(t *testing.T) { + testCases := []struct { + CollectorKind common.CollectorKind + ExpectedCollectorKind string + }{ + { + CollectorKind: common.StdOutCollector, + ExpectedCollectorKind: mccommon.MetricLoggerCollectorContainerName, + }, + { + CollectorKind: common.TfEventCollector, + ExpectedCollectorKind: mccommon.MetricCollectorContainerName, + }, + } + + for _, tc := range testCases { + collectorKind := getSidecarContainerName(tc.CollectorKind) + if collectorKind != tc.ExpectedCollectorKind { + t.Errorf("Expected Collector Kind: %v, got %v", tc.ExpectedCollectorKind, collectorKind) + } + } +} + +func TestGetKatibJob(t *testing.T) { + testCases := []struct { + Pod v1.Pod + ExpectedJobKind string + ExpectedJobName string + Err bool + Name string + }{ + { + Pod: v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + OwnerReferences: []metav1.OwnerReference{ + { + APIVersion: "kubeflow.org/v1", + Kind: "PyTorchJob", + Name: "OwnerName", + }, + }, + }, + }, + ExpectedJobKind: "PyTorchJob", + ExpectedJobName: "OwnerName", + Err: false, + Name: "Valid Pod", + }, + { + Pod: v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + OwnerReferences: []metav1.OwnerReference{ + { + APIVersion: "notkubeflow.org/v1", + Kind: "PyTorchJob", + Name: "OwnerName", + }, + }, + }, + }, + Err: true, + Name: "Invalid APIVersion", + }, + { + Pod: v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + OwnerReferences: []metav1.OwnerReference{ + { + APIVersion: "kubeflow.org/v1", + Kind: "MXJob", + Name: "OwnerName", + }, + }, + }, + }, + Err: true, + Name: "Invalid Kind", + }, + } + + for _, tc := range testCases { + jobKind, jobName, err := getKatibJob(&tc.Pod) + if !tc.Err && err != nil { + t.Errorf("Case %v failed. Error %v", tc.Name, err) + } else if !tc.Err && (tc.ExpectedJobKind != jobKind || tc.ExpectedJobName != jobName) { + t.Errorf("Case %v failed. Expected jobKind %v, got %v, Expected jobName %v, got %v", + tc.Name, tc.ExpectedJobKind, jobKind, tc.ExpectedJobName, jobName) + } else if tc.Err && err == nil { + t.Errorf("Expected error got nil") + } + } +} + +func TestIsMasterRole(t *testing.T) { + masterRoleLabel := make(map[string]string) + masterRoleLabel[consts.JobRole] = MasterRole + invalidLabel := make(map[string]string) + invalidLabel["invalid-label"] = "invalid" + testCases := []struct { + Pod v1.Pod + JobKind string + IsMaster bool + Name string + }{ + { + JobKind: "Job", + IsMaster: true, + Name: "Kubernetes Batch Job Pod", + }, + { + Pod: v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Labels: masterRoleLabel, + }, + }, + JobKind: "PyTorchJob", + IsMaster: true, + Name: "Pytorch Master Pod", + }, + { + Pod: v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Labels: invalidLabel, + }, + }, + JobKind: "PyTorchJob", + IsMaster: false, + Name: "Pytorch Pod with invalid label", + }, + } + + for _, tc := range testCases { + isMaster := isMasterRole(&tc.Pod, tc.JobKind) + if isMaster != tc.IsMaster { + t.Errorf("Case %v. Expected isMaster %v, got %v", tc.Name, tc.IsMaster, isMaster) + } + } +} diff --git a/pkg/webhook/v1beta1/pod/utils.go b/pkg/webhook/v1beta1/pod/utils.go new file mode 100644 index 00000000000..739311d0070 --- /dev/null +++ b/pkg/webhook/v1beta1/pod/utils.go @@ -0,0 +1,143 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package pod + +import ( + "errors" + "fmt" + + "github.com/google/go-containerregistry/pkg/authn" + "github.com/google/go-containerregistry/pkg/authn/k8schain" + "github.com/google/go-containerregistry/pkg/name" + crv1 "github.com/google/go-containerregistry/pkg/v1" + "github.com/google/go-containerregistry/pkg/v1/remote" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + + jobv1beta1 "github.com/kubeflow/katib/pkg/job/v1beta1" +) + +func getKatibJob(pod *v1.Pod) (string, string, error) { + for _, gvk := range jobv1beta1.SupportedJobList { + owners := pod.GetOwnerReferences() + for _, owner := range owners { + if isMatchGVK(owner, gvk) { + return owner.Kind, owner.Name, nil + } + } + } + return "", "", errors.New("The Pod doesn't belong to Katib Job") +} + +func isMatchGVK(owner metav1.OwnerReference, gvk schema.GroupVersionKind) bool { + if owner.Kind != gvk.Kind { + return false + } + gv := gvk.Group + "/" + gvk.Version + if gv != owner.APIVersion { + return false + } + return true +} + +func isMasterRole(pod *v1.Pod, jobKind string) bool { + if labels, ok := jobv1beta1.JobRoleMap[jobKind]; ok { + if len(labels) == 0 { + return true + } + for _, label := range labels { + if v, err := getLabel(pod, label); err == nil { + if v == MasterRole { + return true + } + } + } + } + return false +} + +func getLabel(pod *v1.Pod, targetLabel string) (string, error) { + labels := pod.Labels + for k, v := range labels { + if k == targetLabel { + return v, nil + } + } + return "", errors.New("Label " + targetLabel + " not found.") +} + +func getRemoteImage(pod *v1.Pod, namespace string, containerIndex int) (crv1.Image, error) { + // verify the image name, then download the remote config file + c := pod.Spec.Containers[containerIndex] + ref, err := name.ParseReference(c.Image, name.WeakValidation) + if err != nil { + return nil, fmt.Errorf("Failed to parse image %q: %v", c.Image, err) + } + imagePullSecrets := []string{} + for _, s := range pod.Spec.ImagePullSecrets { + imagePullSecrets = append(imagePullSecrets, s.Name) + } + kc, err := k8schain.NewInCluster(k8schain.Options{ + Namespace: namespace, + ServiceAccountName: pod.Spec.ServiceAccountName, + ImagePullSecrets: imagePullSecrets, + }) + if err != nil { + return nil, fmt.Errorf("Failed to create k8schain: %v", err) + } + + mkc := authn.NewMultiKeychain(kc) + img, err := remote.Image(ref, remote.WithAuthFromKeychain(mkc)) + if err != nil { + return nil, fmt.Errorf("Failed to get container image %q info from registry: %v", c.Image, err) + } + + return img, nil +} + +func getContainerCommand(pod *v1.Pod, namespace string, containerIndex int) ([]string, error) { + // https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#notes + var err error + var img crv1.Image + var cfg *crv1.ConfigFile + args := []string{} + c := pod.Spec.Containers[containerIndex] + if len(c.Command) != 0 { + args = append(args, c.Command...) + } else { + img, err = getRemoteImage(pod, namespace, containerIndex) + if err != nil { + return nil, err + } + cfg, err = img.ConfigFile() + if err != nil { + return nil, fmt.Errorf("Failed to get config for image %q: %v", c.Image, err) + } + if len(cfg.Config.Entrypoint) != 0 { + args = append(args, cfg.Config.Entrypoint...) + } + } + if len(c.Args) != 0 { + args = append(args, c.Args...) + } else { + if cfg != nil && len(cfg.Config.Cmd) != 0 { + args = append(args, cfg.Config.Cmd...) + } + } + return args, nil +} diff --git a/pkg/webhook/v1beta1/webhook.go b/pkg/webhook/v1beta1/webhook.go new file mode 100644 index 00000000000..47b719031e9 --- /dev/null +++ b/pkg/webhook/v1beta1/webhook.go @@ -0,0 +1,118 @@ +/* + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package webhook + +import ( + "github.com/spf13/viper" + admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/webhook" + "sigs.k8s.io/controller-runtime/pkg/webhook/admission/builder" + + experimentsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + "github.com/kubeflow/katib/pkg/controller.v1beta1/consts" + "github.com/kubeflow/katib/pkg/webhook/v1beta1/common" + "github.com/kubeflow/katib/pkg/webhook/v1beta1/experiment" + "github.com/kubeflow/katib/pkg/webhook/v1beta1/pod" +) + +func AddToManager(m manager.Manager, port int32, serviceName string) error { + so := webhook.ServerOptions{ + CertDir: "/tmp/cert", + BootstrapOptions: &webhook.BootstrapOptions{ + Service: &webhook.Service{ + Namespace: consts.DefaultKatibNamespace, + Name: serviceName, + Selectors: map[string]string{ + "app": serviceName, + }, + }, + ValidatingWebhookConfigName: "katib-validating-webhook-config", + MutatingWebhookConfigName: "katib-mutating-webhook-config", + }, + Port: port, + } + + // Decide if we should use local file system. + // If not, we set a secret in BootstrapOptions. + usingFS := viper.GetBool(consts.ConfigCertLocalFS) + if !usingFS { + so.BootstrapOptions.Secret = &types.NamespacedName{ + Namespace: consts.DefaultKatibNamespace, + Name: serviceName, + } + } + server, err := webhook.NewServer("katib-admission-server", m, so) + if err != nil { + return err + } + + if err := register(m, server); err != nil { + return err + } + + return nil +} + +func register(manager manager.Manager, server *webhook.Server) error { + mutatingWebhook, err := builder.NewWebhookBuilder(). + FailurePolicy(admissionregistrationv1beta1.Fail). + Name("mutating.experiment.katib.kubeflow.org"). + Mutating(). + Operations(admissionregistrationv1beta1.Create, admissionregistrationv1beta1.Update). + WithManager(manager). + ForType(&experimentsv1beta1.Experiment{}). + Handlers(experiment.NewExperimentDefaulter(manager.GetClient())). + Build() + if err != nil { + return err + } + validatingWebhook, err := builder.NewWebhookBuilder(). + FailurePolicy(admissionregistrationv1beta1.Fail). + Name("validating.experiment.katib.kubeflow.org"). + Validating(). + Operations(admissionregistrationv1beta1.Create, admissionregistrationv1beta1.Update). + WithManager(manager). + ForType(&experimentsv1beta1.Experiment{}). + Handlers(experiment.NewExperimentValidator(manager.GetClient())). + Build() + if err != nil { + return err + } + nsSelector := &metav1.LabelSelector{ + MatchLabels: map[string]string{ + common.KatibMetricsCollectorInjection: common.KatibMetricsCollectorInjectionEnabled, + }, + } + injectWebhook, err := builder.NewWebhookBuilder(). + FailurePolicy(admissionregistrationv1beta1.Fail). + Name("mutating.pod.katib.kubeflow.org"). + NamespaceSelector(nsSelector). + Mutating(). + Operations(admissionregistrationv1beta1.Create). + WithManager(manager). + ForType(&v1.Pod{}). + Handlers(pod.NewSidecarInjector(manager.GetClient())). + FailurePolicy(admissionregistrationv1beta1.Ignore). + Build() + if err != nil { + return err + } + return server.Register(mutatingWebhook, validatingWebhook, injectWebhook) +} diff --git a/prow_config.yaml b/prow_config.yaml index c6b31e9cdde..6e91970a4e4 100644 --- a/prow_config.yaml +++ b/prow_config.yaml @@ -7,41 +7,41 @@ workflows: job_types: - presubmit include_dirs: - - pkg/apis/controller/common/v1alpha3/* - - pkg/apis/controller/experiments/v1alpha3/* - - pkg/apis/controller/trials/v1alpha3/* - - pkg/apis/controller/suggestions/v1alpha3/* - - pkg/apis/controller/*.go - - pkg/apis/manager/health/* - - pkg/apis/manager/v1alpha3/* - - pkg/common/v1alpha3/* - - pkg/controller.v1alpha3/* - - pkg/db/v1alpha3/* - - pkg/job/v1alpha3/* - - pkg/metricscollector/v1alpha3/* - - pkg/suggestion/v1alpha3/* - - pkg/ui/v1alpha3/* - - pkg/util/v1alpha3/* - - pkg/webhook/v1alpha3/* - - cmd/db-manager/v1alpha3/* - - cmd/katib-controller/v1alpha3/* - - cmd/metricscollector/v1alpha3/* - - cmd/suggestion/chocolate/v1alpha3/* - - cmd/suggestion/hyperband/v1alpha3/* - - cmd/suggestion/hyperopt/v1alpha3/* - - cmd/suggestion/nas/enas/v1alpha3/* - - cmd/suggestion/nas/darts/v1alpha3/* - - cmd/suggestion/skopt/v1alpha3/* - - cmd/suggestion/goptuna/v1alpha3/* - - cmd/ui/v1alpha3/* - - examples/v1alpha3/*.yaml - - examples/v1alpha3/nas/* - - test/e2e/v1alpha3/* - - test/scripts/v1alpha3/* - - test/workflows/* - - manifests/v1alpha3/* - - scripts/v1alpha3/* - - vendor/* + - pkg/apis/controller/common/v1alpha3/* + - pkg/apis/controller/experiments/v1alpha3/* + - pkg/apis/controller/trials/v1alpha3/* + - pkg/apis/controller/suggestions/v1alpha3/* + - pkg/apis/controller/*.go + - pkg/apis/manager/health/* + - pkg/apis/manager/v1alpha3/* + - pkg/common/v1alpha3/* + - pkg/controller.v1alpha3/* + - pkg/db/v1alpha3/* + - pkg/job/v1alpha3/* + - pkg/metricscollector/v1alpha3/* + - pkg/suggestion/v1alpha3/* + - pkg/ui/v1alpha3/* + - pkg/util/v1alpha3/* + - pkg/webhook/v1alpha3/* + - cmd/db-manager/v1alpha3/* + - cmd/katib-controller/v1alpha3/* + - cmd/metricscollector/v1alpha3/* + - cmd/suggestion/chocolate/v1alpha3/* + - cmd/suggestion/hyperband/v1alpha3/* + - cmd/suggestion/hyperopt/v1alpha3/* + - cmd/suggestion/nas/enas/v1alpha3/* + - cmd/suggestion/nas/darts/v1alpha3/* + - cmd/suggestion/skopt/v1alpha3/* + - cmd/suggestion/goptuna/v1alpha3/* + - cmd/ui/v1alpha3/* + - examples/v1alpha3/*.yaml + - examples/v1alpha3/nas/* + - test/e2e/v1alpha3/* + - test/scripts/v1alpha3/* + - test/workflows/* + - manifests/v1alpha3/* + - scripts/v1alpha3/* + - vendor/* params: registry: "gcr.io/kubeflow-ci" - app_dir: kubeflow/katib/test/workflows @@ -50,40 +50,126 @@ workflows: job_types: - postsubmit include_dirs: - - pkg/apis/controller/common/v1alpha3/* - - pkg/apis/controller/experiments/v1alpha3/* - - pkg/apis/controller/trials/v1alpha3/* - - pkg/apis/controller/suggestions/v1alpha3/* - - pkg/apis/controller/*.go - - pkg/apis/manager/health/* - - pkg/apis/manager/v1alpha3/* - - pkg/common/v1alpha3/* - - pkg/controller.v1alpha3/* - - pkg/db/v1alpha3/* - - pkg/job/v1alpha3/* - - pkg/metricscollector/v1alpha3/* - - pkg/suggestion/v1alpha3/* - - pkg/ui/v1alpha3/* - - pkg/util/v1alpha3/* - - pkg/webhook/v1alpha3/* - - cmd/db-manager/v1alpha3/* - - cmd/katib-controller/v1alpha3/* - - cmd/metricscollector/v1alpha3/* - - cmd/suggestion/chocolate/v1alpha3/* - - cmd/suggestion/hyperband/v1alpha3/* - - cmd/suggestion/hyperopt/v1alpha3/* - - cmd/suggestion/nas/enas/v1alpha3/* - - cmd/suggestion/nas/darts/v1alpha3/* - - cmd/suggestion/skopt/v1alpha3/* - - cmd/suggestion/goptuna/v1alpha3/* - - cmd/ui/v1alpha3/* - - examples/v1alpha3/*.yaml - - examples/v1alpha3/nas/* - - test/e2e/v1alpha3/* - - test/scripts/v1alpha3/* - - test/workflows/* - - manifests/v1alpha3/* - - scripts/v1alpha3/* - - vendor/* + - pkg/apis/controller/common/v1alpha3/* + - pkg/apis/controller/experiments/v1alpha3/* + - pkg/apis/controller/trials/v1alpha3/* + - pkg/apis/controller/suggestions/v1alpha3/* + - pkg/apis/controller/*.go + - pkg/apis/manager/health/* + - pkg/apis/manager/v1alpha3/* + - pkg/common/v1alpha3/* + - pkg/controller.v1alpha3/* + - pkg/db/v1alpha3/* + - pkg/job/v1alpha3/* + - pkg/metricscollector/v1alpha3/* + - pkg/suggestion/v1alpha3/* + - pkg/ui/v1alpha3/* + - pkg/util/v1alpha3/* + - pkg/webhook/v1alpha3/* + - cmd/db-manager/v1alpha3/* + - cmd/katib-controller/v1alpha3/* + - cmd/metricscollector/v1alpha3/* + - cmd/suggestion/chocolate/v1alpha3/* + - cmd/suggestion/hyperband/v1alpha3/* + - cmd/suggestion/hyperopt/v1alpha3/* + - cmd/suggestion/nas/enas/v1alpha3/* + - cmd/suggestion/nas/darts/v1alpha3/* + - cmd/suggestion/skopt/v1alpha3/* + - cmd/suggestion/goptuna/v1alpha3/* + - cmd/ui/v1alpha3/* + - examples/v1alpha3/*.yaml + - examples/v1alpha3/nas/* + - test/e2e/v1alpha3/* + - test/scripts/v1alpha3/* + - test/workflows/* + - manifests/v1alpha3/* + - scripts/v1alpha3/* + - vendor/* + params: + registry: "gcr.io/kubeflow-images-public" + - app_dir: kubeflow/katib/test/workflows + component: workflows-v1beta1 + name: e2e-v1beta1 + job_types: + - presubmit + include_dirs: + - pkg/apis/controller/common/v1beta1/* + - pkg/apis/controller/experiments/v1beta1/* + - pkg/apis/controller/trials/v1beta1/* + - pkg/apis/controller/suggestions/v1beta1/* + - pkg/apis/controller/*.go + - pkg/apis/manager/health/* + - pkg/apis/manager/v1beta1/* + - pkg/common/v1beta1/* + - pkg/controller.v1beta1/* + - pkg/db/v1beta1/* + - pkg/job/v1beta1/* + - pkg/metricscollector/v1beta1/* + - pkg/suggestion/v1beta1/* + - pkg/ui/v1beta1/* + - pkg/util/v1beta1/* + - pkg/webhook/v1beta1/* + - cmd/db-manager/v1beta1/* + - cmd/katib-controller/v1beta1/* + - cmd/metricscollector/v1beta1/* + - cmd/suggestion/chocolate/v1beta1/* + - cmd/suggestion/hyperband/v1beta1/* + - cmd/suggestion/hyperopt/v1beta1/* + - cmd/suggestion/nas/enas/v1beta1/* + - cmd/suggestion/nas/darts/v1beta1/* + - cmd/suggestion/skopt/v1beta1/* + - cmd/suggestion/goptuna/v1beta1/* + - cmd/ui/v1beta1/* + - examples/v1beta1/*.yaml + - examples/v1beta1/nas/* + - test/e2e/v1beta1/* + - test/scripts/v1beta1/* + - test/workflows/* + - manifests/v1beta1/* + - scripts/v1beta1/* + - vendor/* + params: + registry: "gcr.io/kubeflow-ci" + - app_dir: kubeflow/katib/test/workflows + component: workflows-v1beta1 + name: e2e-v1beta1 + job_types: + - postsubmit + include_dirs: + - pkg/apis/controller/common/v1beta1/* + - pkg/apis/controller/experiments/v1beta1/* + - pkg/apis/controller/trials/v1beta1/* + - pkg/apis/controller/suggestions/v1beta1/* + - pkg/apis/controller/*.go + - pkg/apis/manager/health/* + - pkg/apis/manager/v1beta1/* + - pkg/common/v1beta1/* + - pkg/controller.v1beta1/* + - pkg/db/v1beta1/* + - pkg/job/v1beta1/* + - pkg/metricscollector/v1beta1/* + - pkg/suggestion/v1beta1/* + - pkg/ui/v1beta1/* + - pkg/util/v1beta1/* + - pkg/webhook/v1beta1/* + - cmd/db-manager/v1beta1/* + - cmd/katib-controller/v1beta1/* + - cmd/metricscollector/v1beta1/* + - cmd/suggestion/chocolate/v1beta1/* + - cmd/suggestion/hyperband/v1beta1/* + - cmd/suggestion/hyperopt/v1beta1/* + - cmd/suggestion/nas/enas/v1beta1/* + - cmd/suggestion/nas/darts/v1beta1/* + - cmd/suggestion/skopt/v1beta1/* + - cmd/suggestion/goptuna/v1beta1/* + - cmd/ui/v1beta1/* + - examples/v1beta1/*.yaml + - examples/v1beta1/nas/* + - test/e2e/v1beta1/* + - test/scripts/v1beta1/* + - test/workflows/* + - manifests/v1beta1/* + - scripts/v1beta1/* + - vendor/* params: registry: "gcr.io/kubeflow-images-public" diff --git a/scripts/mockgen.sh b/scripts/mockgen.sh index 75a6d5c6f2f..db40aca632f 100755 --- a/scripts/mockgen.sh +++ b/scripts/mockgen.sh @@ -28,10 +28,25 @@ mockgen -package mock -destination pkg/mock/v1alpha3/api/suggestion.go github.co echo "Generating v1alpha3 KatibDBInterface..." mockgen -package mock -destination pkg/mock/v1alpha3/db/db.go github.com/kubeflow/katib/pkg/db/v1alpha3/common KatibDBInterface echo "Generating v1alpha3 Generator..." -mockgen -package mock -destination pkg/mock/v1alpha3/experiment/manifest/generator.go github.com/kubeflow/katib/pkg/controller.v1alpha3/experiment/manifest Generator +mockgen -package mock -destination pkg/mock/v1alpha3/experiment/manifest/generator.go github.com/kubeflow/katib/pkg/controller.v1alpha3/experiment/manifest Generator echo "Generating v1alpha3 KatibClient..." -mockgen -package mock -destination pkg/mock/v1alpha3/util/katibclient/katibclient.go github.com/kubeflow/katib/pkg/util/v1alpha3/katibclient Client +mockgen -package mock -destination pkg/mock/v1alpha3/util/katibclient/katibclient.go github.com/kubeflow/katib/pkg/util/v1alpha3/katibclient Client echo "Generating v1alpha3 ManagerClient in Trial Controller..." -mockgen -package mock -destination pkg/mock/v1alpha3/trial/managerclient/katibmanager.go github.com/kubeflow/katib/pkg/controller.v1alpha3/trial/managerclient ManagerClient +mockgen -package mock -destination pkg/mock/v1alpha3/trial/managerclient/katibmanager.go github.com/kubeflow/katib/pkg/controller.v1alpha3/trial/managerclient ManagerClient echo "Generating v1alpha3 Suggestion in Experiment Controller..." -mockgen -package mock -destination pkg/mock/v1alpha3/experiment/suggestion/suggestion.go github.com/kubeflow/katib/pkg/controller.v1alpha3/experiment/suggestion Suggestion +mockgen -package mock -destination pkg/mock/v1alpha3/experiment/suggestion/suggestion.go github.com/kubeflow/katib/pkg/controller.v1alpha3/experiment/suggestion Suggestion + +echo "Generating v1beta1 ManagerClient..." +mockgen -package mock -destination pkg/mock/v1beta1/api/manager.go github.com/kubeflow/katib/pkg/apis/manager/v1beta1 ManagerClient +echo "Generating v1beta1 SuggestionClient..." +mockgen -package mock -destination pkg/mock/v1beta1/api/suggestion.go github.com/kubeflow/katib/pkg/apis/manager/v1beta1 SuggestionClient +echo "Generating v1beta1 KatibDBInterface..." +mockgen -package mock -destination pkg/mock/v1beta1/db/db.go github.com/kubeflow/katib/pkg/db/v1beta1/common KatibDBInterface +echo "Generating v1beta1 Generator..." +mockgen -package mock -destination pkg/mock/v1beta1/experiment/manifest/generator.go github.com/kubeflow/katib/pkg/controller.v1beta1/experiment/manifest Generator +echo "Generating v1beta1 KatibClient..." +mockgen -package mock -destination pkg/mock/v1beta1/util/katibclient/katibclient.go github.com/kubeflow/katib/pkg/util/v1beta1/katibclient Client +echo "Generating v1beta1 ManagerClient in Trial Controller..." +mockgen -package mock -destination pkg/mock/v1beta1/trial/managerclient/katibmanager.go github.com/kubeflow/katib/pkg/controller.v1beta1/trial/managerclient ManagerClient +echo "Generating v1beta1 Suggestion in Experiment Controller..." +mockgen -package mock -destination pkg/mock/v1beta1/experiment/suggestion/suggestion.go github.com/kubeflow/katib/pkg/controller.v1beta1/experiment/suggestion Suggestion diff --git a/scripts/v1beta1/build.sh b/scripts/v1beta1/build.sh new file mode 100755 index 00000000000..d7d53fc2abc --- /dev/null +++ b/scripts/v1beta1/build.sh @@ -0,0 +1,83 @@ +#!/bin/bash + +# Copyright 2018 The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -o errexit +set -o nounset +set -o pipefail + +REGISTRY="gcr.io/kubeflow-images-public" +TAG="latest" +PREFIX="katib/v1beta1" +CMD_PREFIX="cmd" +MACHINE_ARCH=$(uname -m) + +SCRIPT_ROOT=$(dirname ${BASH_SOURCE})/../.. + +cd ${SCRIPT_ROOT} + +usage() { + echo "Usage: $0 [-t ] [-r ] [-p ]" 1>&2 + exit 1 +} + +while getopts ":t::r::p:" opt; do + case $opt in + t) + TAG=${OPTARG} + ;; + r) + REGISTRY=${OPTARG} + ;; + p) + PREFIX=${OPTARG} + ;; + *) + usage + ;; + esac +done +echo "Registry: ${REGISTRY}, tag: ${TAG}, prefix: ${PREFIX}" + +echo "Building core image..." +docker build -t ${REGISTRY}/${PREFIX}/katib-controller:${TAG} -f ${CMD_PREFIX}/katib-controller/v1beta1/Dockerfile . +docker build -t ${REGISTRY}/${PREFIX}/katib-db-manager:${TAG} -f ${CMD_PREFIX}/db-manager/v1beta1/Dockerfile . + +echo "Building UI image..." +docker build -t ${REGISTRY}/${PREFIX}/katib-ui:${TAG} -f ${CMD_PREFIX}/ui/v1beta1/Dockerfile . + +echo "Building file metrics collector image..." +docker build -t ${REGISTRY}/${PREFIX}/file-metrics-collector:${TAG} -f ${CMD_PREFIX}/metricscollector/v1beta1/file-metricscollector/Dockerfile . + +echo "Building TF Event metrics collector image..." +if [ $MACHINE_ARCH == "aarch64" ]; then + docker build -t ${REGISTRY}/${PREFIX}/tfevent-metrics-collector:${TAG} -f ${CMD_PREFIX}/metricscollector/v1beta1/tfevent-metricscollector/Dockerfile.aarch64 . +elif [ $MACHINE_ARCH == "ppc64le" ]; then + docker build -t ${REGISTRY}/${PREFIX}/tfevent-metrics-collector:${TAG} -f ${CMD_PREFIX}/metricscollector/v1beta1/tfevent-metricscollector/Dockerfile.ppc64le . +else + docker build -t ${REGISTRY}/${PREFIX}/tfevent-metrics-collector:${TAG} -f ${CMD_PREFIX}/metricscollector/v1beta1/tfevent-metricscollector/Dockerfile . +fi + +echo "Building suggestion images..." +docker build -t ${REGISTRY}/${PREFIX}/suggestion-hyperopt:${TAG} -f ${CMD_PREFIX}/suggestion/hyperopt/v1beta1/Dockerfile . +docker build -t ${REGISTRY}/${PREFIX}/suggestion-skopt:${TAG} -f ${CMD_PREFIX}/suggestion/skopt/v1beta1/Dockerfile . +docker build -t ${REGISTRY}/${PREFIX}/suggestion-chocolate:${TAG} -f ${CMD_PREFIX}/suggestion/chocolate/v1beta1/Dockerfile . +if [ $MACHINE_ARCH == "aarch64" ]; then + docker build -t ${REGISTRY}/${PREFIX}/suggestion-enas:${TAG} -f ${CMD_PREFIX}/suggestion/nas/enas/v1beta1/Dockerfile.aarch64 . +else + docker build -t ${REGISTRY}/${PREFIX}/suggestion-enas:${TAG} -f ${CMD_PREFIX}/suggestion/nas/enas/v1beta1/Dockerfile . +fi +docker build -t ${REGISTRY}/${PREFIX}/suggestion-hyperband:${TAG} -f ${CMD_PREFIX}/suggestion/hyperband/v1beta1/Dockerfile . +docker build -t ${REGISTRY}/${PREFIX}/suggestion-goptuna:${TAG} -f ${CMD_PREFIX}/suggestion/goptuna/v1beta1/Dockerfile . diff --git a/scripts/v1beta1/deploy.sh b/scripts/v1beta1/deploy.sh new file mode 100755 index 00000000000..f30e3439dbe --- /dev/null +++ b/scripts/v1beta1/deploy.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +# Copyright 2018 The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -o errexit +set -o nounset +set -o pipefail +set -o xtrace + +SCRIPT_ROOT=$(dirname ${BASH_SOURCE})/../.. + +cd ${SCRIPT_ROOT} +kubectl get validatingwebhookconfigurations katib-validating-webhook-config && kubectl delete validatingwebhookconfigurations katib-validating-webhook-config +kubectl get mutatingwebhookconfigurations katib-mutating-webhook-config && kubectl delete mutatingwebhookconfigurations katib-mutating-webhook-config +kubectl apply -f manifests/v1beta1 +kubectl apply -f manifests/v1beta1/katib-controller +kubectl apply -f manifests/v1beta1/db-manager +kubectl apply -f manifests/v1beta1/pv +kubectl apply -f manifests/v1beta1/mysql-db +kubectl apply -f manifests/v1beta1/ui +cd - >/dev/null diff --git a/scripts/v1beta1/undeploy.sh b/scripts/v1beta1/undeploy.sh new file mode 100755 index 00000000000..09542ed3f58 --- /dev/null +++ b/scripts/v1beta1/undeploy.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +# Copyright 2019 The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -o nounset +set -o pipefail +set -o xtrace + +# Delete CR first +experiments=$(kubectl get experiments --all-namespaces | awk '{if (NR>1) {print $1"/"$2}}') +for s in $experiments; do + ns=$(echo $s | cut -d "/" -f 1) + exp=$(echo $s | cut -d "/" -f 2) + kubectl delete experiments $exp -n $ns +done + +SCRIPT_ROOT=$(dirname ${BASH_SOURCE})/../.. + +cd ${SCRIPT_ROOT} +kubectl delete -f manifests/v1beta1/katib-controller +kubectl delete -f manifests/v1beta1/db-manager +kubectl delete -f manifests/v1beta1/mysql-db +kubectl delete -f manifests/v1beta1/ui +kubectl delete -f manifests/v1beta1/pv +kubectl delete -f manifests/v1beta1 +kubectl get mutatingwebhookconfigurations katib-mutating-webhook-config && kubectl delete mutatingwebhookconfigurations katib-mutating-webhook-config +kubectl get validatingwebhookconfigurations katib-validating-webhook-config && kubectl delete validatingwebhookconfigurations katib-validating-webhook-config +cd - >/dev/null diff --git a/test/e2e/v1beta1/invalid-experiment.yaml b/test/e2e/v1beta1/invalid-experiment.yaml new file mode 100644 index 00000000000..e3d4e097770 --- /dev/null +++ b/test/e2e/v1beta1/invalid-experiment.yaml @@ -0,0 +1,53 @@ +apiVersion: "kubeflow.org/v1beta1" +kind: Experiment +metadata: + namespace: kubeflow + name: invalid-experiment +spec: + maxTrialCount: 13 + maxFailedTrialCount: 3 + objective: + type: maximize + goal: 0.99 + objectiveMetricName: Validation-accuracy + additionalMetricNames: + - Train-accuracy + algorithm: + algorithmName: random + trialTemplate: + goTemplate: + rawTemplate: |- + apiVersion: batch/v1 + kind: invalid-kind # invalid + metadata: + name: {{.Trial}} + namespace: {{.NameSpace}} + spec: + template: + spec: + containers: + - name: {{.Trial}} + image: docker.io/kubeflowkatib/mxnet-mnist + command: + - "python3" + - "/opt/mxnet-mnist/mnist.py" + - "--batch-size=64" + restartPolicy: Never + parameters: + - name: --lr + parameterType: double + feasibleSpace: + min: "0.01" + max: "0.03" + - name: --num-layers + parameterType: int + feasibleSpace: + min: "2" + max: "5" + - name: --optimizer + parameterType: categorical + feasibleSpace: + list: + - sgd + - adam + - ftrl diff --git a/test/e2e/v1beta1/resume-e2e-experiment.go b/test/e2e/v1beta1/resume-e2e-experiment.go new file mode 100644 index 00000000000..91cf689c75d --- /dev/null +++ b/test/e2e/v1beta1/resume-e2e-experiment.go @@ -0,0 +1,182 @@ +package main + +import ( + "bytes" + "context" + "fmt" + "io/ioutil" + "log" + "os" + "time" + + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/types" + + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + k8syaml "k8s.io/apimachinery/pkg/util/yaml" + _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" + "sigs.k8s.io/controller-runtime/pkg/client" + + commonv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" + experimentsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + controllerUtil "github.com/kubeflow/katib/pkg/controller.v1beta1/util" + "github.com/kubeflow/katib/pkg/util/v1beta1/katibclient" +) + +const ( + timeout = 30 * time.Minute +) + +func verifyResult(exp *experimentsv1beta1.Experiment) (*float64, error) { + if len(exp.Status.CurrentOptimalTrial.ParameterAssignments) == 0 { + return nil, fmt.Errorf("Best parameter assignments not updated in status") + } + + if len(exp.Status.CurrentOptimalTrial.Observation.Metrics) == 0 { + return nil, fmt.Errorf("Best metrics not updated in status") + } + + metric := exp.Status.CurrentOptimalTrial.Observation.Metrics[0] + if metric.Name != exp.Spec.Objective.ObjectiveMetricName { + return nil, fmt.Errorf("Best objective metric not updated in status") + } + return &metric.Value, nil +} + +func main() { + if len(os.Args) != 2 { + log.Fatal("Experiment name is missing") + } + expName := os.Args[1] + b, err := ioutil.ReadFile(expName) + if err != nil { + log.Fatal("Error in reading file ", err) + } + exp := &experimentsv1beta1.Experiment{} + buf := bytes.NewBufferString(string(b)) + if err = k8syaml.NewYAMLOrJSONDecoder(buf, 1024).Decode(exp); err != nil { + log.Fatal("Yaml decode error ", err) + } + kclient, err := katibclient.NewClient(client.Options{}) + if err != nil { + log.Fatal("NewClient for Katib failed: ", err) + } + exp, err = kclient.GetExperiment(exp.Name, exp.Namespace) + if err != nil { + log.Fatal("Get Experiment error. Experiment not created yet ", err) + } + if exp.Spec.Algorithm.AlgorithmName != "hyperband" { + // Hyperband will validate the parallel trial count, + // thus we should not change it. + var maxtrials int32 = 7 + var paralleltrials int32 = 3 + exp.Spec.MaxTrialCount = &maxtrials + exp.Spec.ParallelTrialCount = ¶lleltrials + } + err = kclient.UpdateExperiment(exp) + if err != nil { + log.Fatal("UpdateExperiment from YAML failed: ", err) + } + endTime := time.Now().Add(timeout) + for time.Now().Before(endTime) { + log.Printf("Waiting for Experiment %s to start running.", exp.Name) + exp, err = kclient.GetExperiment(exp.Name, exp.Namespace) + if err != nil { + log.Fatal("Get Experiment error ", err) + } + if exp.IsRunning() { + log.Printf("Experiment %v started running", exp.Name) + break + } + time.Sleep(5 * time.Second) + } + + for time.Now().Before(endTime) { + exp, err = kclient.GetExperiment(exp.Name, exp.Namespace) + if err != nil { + log.Fatal("Get Experiment error ", err) + } + log.Printf("Waiting for Experiment %s to finish.", exp.Name) + log.Printf(`Experiment %s's trials: %d trials, %d pending trials, +%d running trials, %d killed trials, %d succeeded trials, %d failed trials.`, + exp.Name, + exp.Status.Trials, exp.Status.TrialsPending, exp.Status.TrialsRunning, + exp.Status.TrialsKilled, exp.Status.TrialsSucceeded, exp.Status.TrialsFailed) + log.Printf("Optimal Trial for Experiment %s: %v", exp.Name, + exp.Status.CurrentOptimalTrial) + log.Printf("Experiment %s's conditions: %v", exp.Name, exp.Status.Conditions) + + suggestion, err := kclient.GetSuggestion(exp.Name, exp.Namespace) + if err != nil { + log.Printf("Get Suggestion error: %v", err) + } else { + log.Printf("Suggestion %s's conditions: %v", suggestion.Name, + suggestion.Status.Conditions) + log.Printf("Suggestion %s's suggestions: %v", suggestion.Name, + suggestion.Status.Suggestions) + } + if exp.IsCompleted() { + log.Printf("Experiment %v finished", exp.Name) + break + } + time.Sleep(20 * time.Second) + } + + if !exp.IsCompleted() { + log.Fatal("Experiment run timed out") + } + + metricVal, err := verifyResult(exp) + if err != nil { + log.Fatal(err) + } + if metricVal == nil { + log.Fatal("Metric value in CurrentOptimalTrial not populated") + } + + objectiveType := exp.Spec.Objective.Type + var goal float64 + if exp.Spec.Objective.Goal != nil { + goal = *exp.Spec.Objective.Goal + } + if (exp.Spec.Objective.Goal != nil && objectiveType == commonv1beta1.ObjectiveTypeMinimize && *metricVal < goal) || + (exp.Spec.Objective.Goal != nil && objectiveType == commonv1beta1.ObjectiveTypeMaximize && *metricVal > goal) { + log.Print("Objective Goal reached") + } else { + + if exp.Status.Trials != *exp.Spec.MaxTrialCount { + log.Fatal("All trials are not run in the experiment ", exp.Status.Trials, exp.Spec.MaxTrialCount) + } + + if exp.Status.TrialsSucceeded != *exp.Spec.MaxTrialCount { + log.Fatal("All trials are not successful ", exp.Status.TrialsSucceeded, *exp.Spec.MaxTrialCount) + } + } + + sug, err := kclient.GetSuggestion(exp.Name, exp.Namespace) + if exp.Spec.ResumePolicy == experimentsv1beta1.LongRunning { + if sug.IsSucceeded() { + log.Fatal("Suggestion is terminated while ResumePolicy = LongRunning") + } + } + if exp.Spec.ResumePolicy == experimentsv1beta1.NeverResume { + if sug.IsRunning() { + log.Fatal("Suggestion is still running while ResumePolicy = NeverResume") + } + namespacedName := types.NamespacedName{Name: controllerUtil.GetAlgorithmServiceName(sug), Namespace: sug.Namespace} + service := &corev1.Service{} + err := kclient.GetClient().Get(context.TODO(), namespacedName, service) + if err == nil || !errors.IsNotFound(err) { + log.Fatal("Suggestion service is still alive while ResumePolicy = NeverResume") + } + namespacedName = types.NamespacedName{Name: controllerUtil.GetAlgorithmDeploymentName(sug), Namespace: sug.Namespace} + deployment := &appsv1.Deployment{} + err = kclient.GetClient().Get(context.TODO(), namespacedName, deployment) + if err == nil || !errors.IsNotFound(err) { + log.Fatal("Suggestion deployment is still alive while ResumePolicy = NeverResume") + } + } + + log.Printf("Experiment has recorded best current Optimal Trial %v", exp.Status.CurrentOptimalTrial) +} diff --git a/test/e2e/v1beta1/run-e2e-experiment.go b/test/e2e/v1beta1/run-e2e-experiment.go new file mode 100644 index 00000000000..ce24c3e7800 --- /dev/null +++ b/test/e2e/v1beta1/run-e2e-experiment.go @@ -0,0 +1,165 @@ +package main + +import ( + "bytes" + "context" + "fmt" + "io/ioutil" + "log" + "os" + "time" + + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/types" + + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + k8syaml "k8s.io/apimachinery/pkg/util/yaml" + _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" + "sigs.k8s.io/controller-runtime/pkg/client" + + commonv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/common/v1beta1" + experimentsv1beta1 "github.com/kubeflow/katib/pkg/apis/controller/experiments/v1beta1" + controllerUtil "github.com/kubeflow/katib/pkg/controller.v1beta1/util" + "github.com/kubeflow/katib/pkg/util/v1beta1/katibclient" +) + +const ( + timeout = 30 * time.Minute +) + +func verifyResult(exp *experimentsv1beta1.Experiment) (*float64, error) { + if len(exp.Status.CurrentOptimalTrial.ParameterAssignments) == 0 { + return nil, fmt.Errorf("Best parameter assignments not updated in status") + } + + if len(exp.Status.CurrentOptimalTrial.Observation.Metrics) == 0 { + return nil, fmt.Errorf("Best metrics not updated in status") + } + + metric := exp.Status.CurrentOptimalTrial.Observation.Metrics[0] + if metric.Name != exp.Spec.Objective.ObjectiveMetricName { + return nil, fmt.Errorf("Best objective metric not updated in status") + } + return &metric.Value, nil +} + +func main() { + if len(os.Args) != 2 { + log.Fatal("Experiment name is missing") + } + expName := os.Args[1] + b, err := ioutil.ReadFile(expName) + if err != nil { + log.Fatal("Error in reading file ", err) + } + exp := &experimentsv1beta1.Experiment{} + buf := bytes.NewBufferString(string(b)) + if err = k8syaml.NewYAMLOrJSONDecoder(buf, 1024).Decode(exp); err != nil { + log.Fatal("Yaml decode error ", err) + } + kclient, err := katibclient.NewClient(client.Options{}) + if err != nil { + log.Fatal("NewClient for Katib failed: ", err) + } + if exp.Spec.Algorithm.AlgorithmName != "hyperband" { + // Hyperband will validate the parallel trial count, + // thus we should not change it. + var maxtrials int32 = 3 + var paralleltrials int32 = 2 + exp.Spec.MaxTrialCount = &maxtrials + exp.Spec.ParallelTrialCount = ¶lleltrials + } + err = kclient.CreateExperiment(exp) + if err != nil { + log.Fatal("CreateExperiment from YAML failed: ", err) + } + + for endTime := time.Now().Add(timeout); time.Now().Before(endTime); { + exp, err = kclient.GetExperiment(exp.Name, exp.Namespace) + if err != nil { + log.Fatal("Get Experiment error ", err) + } + log.Printf("Waiting for Experiment %s to finish.", exp.Name) + log.Printf(`Experiment %s's trials: %d trials, %d pending trials, +%d running trials, %d killed trials, %d succeeded trials, %d failed trials.`, + exp.Name, + exp.Status.Trials, exp.Status.TrialsPending, exp.Status.TrialsRunning, + exp.Status.TrialsKilled, exp.Status.TrialsSucceeded, exp.Status.TrialsFailed) + log.Printf("Optimal Trial for Experiment %s: %v", exp.Name, + exp.Status.CurrentOptimalTrial) + log.Printf("Experiment %s's conditions: %v", exp.Name, exp.Status.Conditions) + + suggestion, err := kclient.GetSuggestion(exp.Name, exp.Namespace) + if err != nil { + log.Printf("Get Suggestion error: %v", err) + } else { + log.Printf("Suggestion %s's conditions: %v", suggestion.Name, + suggestion.Status.Conditions) + log.Printf("Suggestion %s's suggestions: %v", suggestion.Name, + suggestion.Status.Suggestions) + } + if exp.IsCompleted() { + log.Printf("Experiment %v finished", exp.Name) + break + } + time.Sleep(20 * time.Second) + } + + if !exp.IsCompleted() { + log.Fatal("Experiment run timed out") + } + + metricVal, err := verifyResult(exp) + if err != nil { + log.Fatal(err) + } + if metricVal == nil { + log.Fatal("Metric value in CurrentOptimalTrial not populated") + } + + objectiveType := exp.Spec.Objective.Type + var goal float64 + if exp.Spec.Objective.Goal != nil { + goal = *exp.Spec.Objective.Goal + } + if (exp.Spec.Objective.Goal != nil && objectiveType == commonv1beta1.ObjectiveTypeMinimize && *metricVal < goal) || + (exp.Spec.Objective.Goal != nil && objectiveType == commonv1beta1.ObjectiveTypeMaximize && *metricVal > goal) { + log.Print("Objective Goal reached") + } else { + + if exp.Status.Trials != *exp.Spec.MaxTrialCount { + log.Fatal("All trials are not run in the experiment ", exp.Status.Trials, exp.Spec.MaxTrialCount) + } + + if exp.Status.TrialsSucceeded != *exp.Spec.MaxTrialCount { + log.Fatal("All trials are not successful ", exp.Status.TrialsSucceeded, *exp.Spec.MaxTrialCount) + } + } + + sug, err := kclient.GetSuggestion(exp.Name, exp.Namespace) + if exp.Spec.ResumePolicy == experimentsv1beta1.LongRunning { + if sug.IsSucceeded() { + log.Fatal("Suggestion is terminated while ResumePolicy = LongRunning") + } + } + if exp.Spec.ResumePolicy == experimentsv1beta1.NeverResume { + if sug.IsRunning() { + log.Fatal("Suggestion is still running while ResumePolicy = NeverResume") + } + namespacedName := types.NamespacedName{Name: controllerUtil.GetAlgorithmServiceName(sug), Namespace: sug.Namespace} + service := &corev1.Service{} + err := kclient.GetClient().Get(context.TODO(), namespacedName, service) + if err == nil || !errors.IsNotFound(err) { + log.Fatal("Suggestion service is still alive while ResumePolicy = NeverResume") + } + namespacedName = types.NamespacedName{Name: controllerUtil.GetAlgorithmDeploymentName(sug), Namespace: sug.Namespace} + deployment := &appsv1.Deployment{} + err = kclient.GetClient().Get(context.TODO(), namespacedName, deployment) + if err == nil || !errors.IsNotFound(err) { + log.Fatal("Suggestion deployment is still alive while ResumePolicy = NeverResume") + } + } + + log.Printf("Experiment has recorded best current Optimal Trial %v", exp.Status.CurrentOptimalTrial) +} diff --git a/test/e2e/v1beta1/test_requirements.txt b/test/e2e/v1beta1/test_requirements.txt new file mode 100644 index 00000000000..ff4c69d2c7e --- /dev/null +++ b/test/e2e/v1beta1/test_requirements.txt @@ -0,0 +1,3 @@ +grpcio +gcloud +protobuf diff --git a/test/e2e/v1beta1/valid-experiment.yaml b/test/e2e/v1beta1/valid-experiment.yaml new file mode 100644 index 00000000000..e5cf7225fc2 --- /dev/null +++ b/test/e2e/v1beta1/valid-experiment.yaml @@ -0,0 +1,53 @@ +apiVersion: "kubeflow.org/v1beta1" +kind: Experiment +metadata: + namespace: kubeflow + name: valid-experiment +spec: + maxTrialCount: 13 + maxFailedTrialCount: 3 + objective: + type: maximize + goal: 0.99 + objectiveMetricName: Validation-accuracy + additionalMetricNames: + - Train-accuracy + algorithm: + algorithmName: random + trialTemplate: + goTemplate: + rawTemplate: |- + apiVersion: batch/v1 + kind: Job + metadata: + name: {{.Trial}} + namespace: {{.NameSpace}} + spec: + template: + spec: + containers: + - name: {{.Trial}} + image: docker.io/kubeflowkatib/mxnet-mnist + command: + - "python3" + - "/opt/mxnet-mnist/mnist.py" + - "--batch-size=64" + restartPolicy: Never + parameters: + - name: --lr + parameterType: double + feasibleSpace: + min: "0.01" + max: "0.03" + - name: --num-layers + parameterType: int + feasibleSpace: + min: "2" + max: "5" + - name: --optimizer + parameterType: categorical + feasibleSpace: + list: + - sgd + - adam + - ftrl diff --git a/test/scripts/v1alpha3/check-katib-ready.sh b/test/scripts/v1alpha3/check-katib-ready.sh index 6faa04b2255..cc9378668fb 100755 --- a/test/scripts/v1alpha3/check-katib-ready.sh +++ b/test/scripts/v1alpha3/check-katib-ready.sh @@ -78,15 +78,15 @@ sed -i -e "s@gcr.io\/kubeflow-images-public\/katib\/v1alpha3\/suggestion-hyperba sed -i -e "s@gcr.io\/kubeflow-images-public\/katib\/v1alpha3\/suggestion-chocolate@${REGISTRY}\/${REPO_NAME}\/v1alpha3\/suggestion-chocolate@" manifests/v1alpha3/katib-controller/katib-config.yaml sed -i -e "s@gcr.io\/kubeflow-images-public\/katib\/v1alpha3\/suggestion-hyperopt@${REGISTRY}\/${REPO_NAME}\/v1alpha3\/suggestion-hyperopt@" manifests/v1alpha3/katib-controller/katib-config.yaml sed -i -e "s@gcr.io\/kubeflow-images-public\/katib\/v1alpha3\/suggestion-skopt@${REGISTRY}\/${REPO_NAME}\/v1alpha3\/suggestion-skopt@" manifests/v1alpha3/katib-controller/katib-config.yaml +sed -i -e "s@gcr.io\/kubeflow-images-public\/katib\/v1alpha3\/suggestion-goptuna@${REGISTRY}\/${REPO_NAME}\/v1alpha3\/suggestion-goptuna@" manifests/v1alpha3/katib-controller/katib-config.yaml +sed -i -e "s@gcr.io\/kubeflow-images-public\/katib\/v1alpha3\/suggestion-darts@${REGISTRY}\/${REPO_NAME}\/v1alpha3\/suggestion-darts@" manifests/v1alpha3/katib-controller/katib-config.yaml cat manifests/v1alpha3/katib-controller/katib-config.yaml - mkdir -p ${GO_DIR} cp -r . ${GO_DIR}/ cp -r pkg/apis/manager/v1alpha3/python/* ${GO_DIR}/test/e2e/v1alpha3 - echo "Deploying tf-operator crds from kubeflow/manifests master" cd "${MANIFESTS_DIR}/tf-training/tf-job-crds/base" kustomize build . | kubectl apply -f - @@ -106,19 +106,18 @@ echo "Deploying pytorch-operator from kubeflow/manifests master" cd "${MANIFESTS_DIR}/pytorch-job/pytorch-operator/base/" kustomize build . | kubectl apply -n kubeflow -f - --validate=false - TIMEOUT=120 PODNUM=$(kubectl get deploy -n kubeflow | grep -v NAME | wc -l) until kubectl get pods -n kubeflow | grep Running | [[ $(wc -l) -eq $PODNUM ]]; do - echo Pod Status $(kubectl get pods -n kubeflow | grep "1/1" | wc -l)/$PODNUM - - sleep 10 - TIMEOUT=$(( TIMEOUT - 1 )) - if [[ $TIMEOUT -eq 0 ]];then - echo "NG" - kubectl get pods -n kubeflow - exit 1 - fi + echo Pod Status $(kubectl get pods -n kubeflow | grep "1/1" | wc -l)/$PODNUM + + sleep 10 + TIMEOUT=$((TIMEOUT - 1)) + if [[ $TIMEOUT -eq 0 ]]; then + echo "NG" + kubectl get pods -n kubeflow + exit 1 + fi done echo "All Katib components are running." @@ -146,13 +145,13 @@ if [ $? -ne 1 ]; then exit 1 fi set -o errexit -kubectl -n kubeflow port-forward $(kubectl -n kubeflow get pod -o=name | grep katib-db-manager |sed -e "s@pods\/@@") 6789:6789 & +kubectl -n kubeflow port-forward $(kubectl -n kubeflow get pod -o=name | grep katib-db-manager | sed -e "s@pods\/@@") 6789:6789 & echo "kubectl port-forward start" sleep 5 TIMEOUT=120 until curl localhost:6789 || [ $TIMEOUT -eq 0 ]; do - sleep 5 - TIMEOUT=$(( TIMEOUT - 1 )) + sleep 5 + TIMEOUT=$((TIMEOUT - 1)) done exit 0 diff --git a/test/scripts/v1alpha3/python-tests.sh b/test/scripts/v1alpha3/python-tests.sh index ced6f96ed31..8a1b5378b3f 100755 --- a/test/scripts/v1alpha3/python-tests.sh +++ b/test/scripts/v1alpha3/python-tests.sh @@ -28,4 +28,4 @@ pip install -r cmd/suggestion/skopt/v1alpha3/requirements.txt pip install -r cmd/suggestion/nas/enas/v1alpha3/requirements.txt pip install -r cmd/suggestion/hyperband/v1alpha3/requirements.txt pip install -r cmd/suggestion/nas/darts/v1alpha3/requirements.txt -pytest -s ./test +pytest -s ./test/suggestion/v1alpha3 diff --git a/test/scripts/v1beta1/build-earlystopping-median.sh b/test/scripts/v1beta1/build-earlystopping-median.sh new file mode 100755 index 00000000000..4da082329f6 --- /dev/null +++ b/test/scripts/v1beta1/build-earlystopping-median.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +# Copyright 2018 The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build an image from our argo workflow + +exit 0 + +set -o errexit +set -o nounset +set -o pipefail + +export PATH=${GOPATH}/bin:/usr/local/go/bin:${PATH} +REGISTRY="${GCP_REGISTRY}" +PROJECT="${GCP_PROJECT}" +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME}-earlystopping-median +VERSION=$(git describe --tags --always --dirty) + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} + +echo "Copy source to GOPATH" +mkdir -p ${GO_DIR} +cp -r cmd ${GO_DIR}/cmd +cp -r pkg ${GO_DIR}/pkg +cp -r vendor ${GO_DIR}/vendor + +cd ${GO_DIR} + +#cp cmd/earlystopping/medianstopping/Dockerfile . +#gcloud builds submit . --tag=${REGISTRY}/${REPO_NAME}/earlystopping-medianstopping:${VERSION} --project=${PROJECT} +#gcloud container images add-tag --quiet ${REGISTRY}/${REPO_NAME}/earlystopping-medianstopping:${VERSION} ${REGISTRY}/${REPO_NAME}/earlystopping-medianstopping:latest --verbosity=info diff --git a/test/scripts/v1beta1/build-katib-controller.sh b/test/scripts/v1beta1/build-katib-controller.sh new file mode 100755 index 00000000000..3a13712665c --- /dev/null +++ b/test/scripts/v1beta1/build-katib-controller.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +# Copyright 2018 The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build an image from our argo workflow + +set -o errexit +set -o nounset +set -o pipefail + +export PATH=${GOPATH}/bin:/usr/local/go/bin:${PATH} +REGISTRY="${GCP_REGISTRY}" +PROJECT="${GCP_PROJECT}" +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME}-katib-controller +VERSION=$(git describe --tags --always --dirty) + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} + +echo "Copy source to GOPATH" +mkdir -p ${GO_DIR} +cp -r cmd ${GO_DIR}/cmd +cp -r pkg ${GO_DIR}/pkg +cp -r vendor ${GO_DIR}/vendor + +cd ${GO_DIR} +cp cmd/katib-controller/v1beta1/Dockerfile . +gcloud builds submit . --tag=${REGISTRY}/${REPO_NAME}/v1beta1/katib-controller:${VERSION} --project=${PROJECT} +gcloud container images add-tag --quiet ${REGISTRY}/${REPO_NAME}/v1beta1/katib-controller:${VERSION} ${REGISTRY}/${REPO_NAME}/v1beta1/katib-controller:latest --verbosity=info + +cd ${GO_DIR} +cp cmd/metricscollector/v1beta1/file-metricscollector/Dockerfile . +gcloud builds submit . --tag=${REGISTRY}/${REPO_NAME}/v1beta1/file-metrics-collector:${VERSION} --project=${PROJECT} +gcloud container images add-tag --quiet ${REGISTRY}/${REPO_NAME}/v1beta1/file-metrics-collector:${VERSION} ${REGISTRY}/${REPO_NAME}/v1beta1/file-metrics-collector:latest --verbosity=info + +cd ${GO_DIR} +cp cmd/metricscollector/v1beta1/tfevent-metricscollector/Dockerfile . +gcloud builds submit . --tag=${REGISTRY}/${REPO_NAME}/v1beta1/tfevent-metrics-collector:${VERSION} --project=${PROJECT} +gcloud container images add-tag --quiet ${REGISTRY}/${REPO_NAME}/v1beta1/tfevent-metrics-collector:${VERSION} ${REGISTRY}/${REPO_NAME}/v1beta1/tfevent-metrics-collector:latest --verbosity=info diff --git a/test/scripts/v1beta1/build-manager.sh b/test/scripts/v1beta1/build-manager.sh new file mode 100755 index 00000000000..ba6c503b6e2 --- /dev/null +++ b/test/scripts/v1beta1/build-manager.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +# Copyright 2018 The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build an image from our argo workflow + +set -o errexit +set -o nounset +set -o pipefail + +export PATH=${GOPATH}/bin:/usr/local/go/bin:${PATH} +REGISTRY="${GCP_REGISTRY}" +PROJECT="${GCP_PROJECT}" +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME}-db-manager +VERSION=$(git describe --tags --always --dirty) + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} + +echo "Copy source to GOPATH" +mkdir -p ${GO_DIR} +cp -r cmd ${GO_DIR}/cmd +cp -r pkg ${GO_DIR}/pkg +cp -r vendor ${GO_DIR}/vendor + +cd ${GO_DIR} +cp cmd/db-manager/v1beta1/Dockerfile . +gcloud builds submit . --tag=${REGISTRY}/${REPO_NAME}/v1beta1/katib-db-manager:${VERSION} --project=${PROJECT} +gcloud container images add-tag --quiet ${REGISTRY}/${REPO_NAME}/v1beta1/katib-db-manager:${VERSION} ${REGISTRY}/${REPO_NAME}/v1beta1/katib-db-manager:latest --verbosity=info diff --git a/test/scripts/v1beta1/build-suggestion-chocolate.sh b/test/scripts/v1beta1/build-suggestion-chocolate.sh new file mode 100755 index 00000000000..d9dcb58a714 --- /dev/null +++ b/test/scripts/v1beta1/build-suggestion-chocolate.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +# Copyright 2018 The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build an image from our argo workflow + +set -o errexit +set -o nounset +set -o pipefail + +export PATH=${GOPATH}/bin:/usr/local/go/bin:${PATH} +REGISTRY="${GCP_REGISTRY}" +PROJECT="${GCP_PROJECT}" +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME}-suggestion-chocolate +VERSION=$(git describe --tags --always --dirty) + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} + +echo "Copy source to GOPATH" +mkdir -p ${GO_DIR} +cp -r cmd ${GO_DIR}/cmd +cp -r pkg ${GO_DIR}/pkg +cp -r vendor ${GO_DIR}/vendor + +cd ${GO_DIR} + +cp cmd/suggestion/chocolate/v1beta1/Dockerfile . +gcloud builds submit . --tag=${REGISTRY}/${REPO_NAME}/v1beta1/suggestion-chocolate:${VERSION} --project=${PROJECT} +gcloud container images add-tag --quiet ${REGISTRY}/${REPO_NAME}/v1beta1/suggestion-chocolate:${VERSION} ${REGISTRY}/${REPO_NAME}/v1beta1/suggestion-chocolate:latest --verbosity=info diff --git a/test/scripts/v1beta1/build-suggestion-darts.sh b/test/scripts/v1beta1/build-suggestion-darts.sh new file mode 100755 index 00000000000..e16837c79de --- /dev/null +++ b/test/scripts/v1beta1/build-suggestion-darts.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +# Copyright 2018 The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build an image from our argo workflow + +set -o errexit +set -o nounset +set -o pipefail + +export PATH=${GOPATH}/bin:/usr/local/go/bin:${PATH} +REGISTRY="${GCP_REGISTRY}" +PROJECT="${GCP_PROJECT}" +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME}-suggestion-darts +VERSION=$(git describe --tags --always --dirty) + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} + +echo "Copy source to GOPATH" +mkdir -p ${GO_DIR} +cp -r cmd ${GO_DIR}/cmd +cp -r pkg ${GO_DIR}/pkg +cp -r vendor ${GO_DIR}/vendor + +cd ${GO_DIR} + +cp cmd/suggestion/nas/darts/v1beta1/Dockerfile . +gcloud builds submit . --tag=${REGISTRY}/${REPO_NAME}/v1beta1/suggestion-darts:${VERSION} --project=${PROJECT} +gcloud container images add-tag --quiet ${REGISTRY}/${REPO_NAME}/v1beta1/suggestion-darts:${VERSION} ${REGISTRY}/${REPO_NAME}/v1beta1/suggestion-darts:latest --verbosity=info diff --git a/test/scripts/v1beta1/build-suggestion-enas.sh b/test/scripts/v1beta1/build-suggestion-enas.sh new file mode 100755 index 00000000000..7b7f090a5bf --- /dev/null +++ b/test/scripts/v1beta1/build-suggestion-enas.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +# Copyright 2018 The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build an image from our argo workflow + +set -o errexit +set -o nounset +set -o pipefail + +export PATH=${GOPATH}/bin:/usr/local/go/bin:${PATH} +REGISTRY="${GCP_REGISTRY}" +PROJECT="${GCP_PROJECT}" +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME}-suggestion-enas +VERSION=$(git describe --tags --always --dirty) + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} + +echo "Copy source to GOPATH" +mkdir -p ${GO_DIR} +cp -r cmd ${GO_DIR}/cmd +cp -r pkg ${GO_DIR}/pkg +cp -r vendor ${GO_DIR}/vendor + +cd ${GO_DIR} + +cp cmd/suggestion/nas/enas/v1beta1/Dockerfile . +gcloud builds submit . --tag=${REGISTRY}/${REPO_NAME}/v1beta1/suggestion-enas:${VERSION} --project=${PROJECT} +gcloud container images add-tag --quiet ${REGISTRY}/${REPO_NAME}/v1beta1/suggestion-enas:${VERSION} ${REGISTRY}/${REPO_NAME}/v1beta1/suggestion-enas:latest --verbosity=info diff --git a/test/scripts/v1beta1/build-suggestion-goptuna.sh b/test/scripts/v1beta1/build-suggestion-goptuna.sh new file mode 100755 index 00000000000..8d97c544981 --- /dev/null +++ b/test/scripts/v1beta1/build-suggestion-goptuna.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +# Copyright 2018 The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build an image from our argo workflow + +set -o errexit +set -o nounset +set -o pipefail + +export PATH=${GOPATH}/bin:/usr/local/go/bin:${PATH} +REGISTRY="${GCP_REGISTRY}" +PROJECT="${GCP_PROJECT}" +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME}-suggestion-goptuna +VERSION=$(git describe --tags --always --dirty) + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} + +echo "Copy source to GOPATH" +mkdir -p ${GO_DIR} +cp -r cmd ${GO_DIR}/cmd +cp -r pkg ${GO_DIR}/pkg +cp -r vendor ${GO_DIR}/vendor + +cd ${GO_DIR} + +cp cmd/suggestion/goptuna/v1beta1/Dockerfile . +gcloud builds submit . --tag=${REGISTRY}/${REPO_NAME}/v1beta1/suggestion-goptuna:${VERSION} --project=${PROJECT} +gcloud container images add-tag --quiet ${REGISTRY}/${REPO_NAME}/v1beta1/suggestion-goptuna:${VERSION} ${REGISTRY}/${REPO_NAME}/v1beta1/suggestion-goptuna:latest --verbosity=info diff --git a/test/scripts/v1beta1/build-suggestion-hyperband.sh b/test/scripts/v1beta1/build-suggestion-hyperband.sh new file mode 100755 index 00000000000..26f7814e301 --- /dev/null +++ b/test/scripts/v1beta1/build-suggestion-hyperband.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +# Copyright 2018 The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build an image from our argo workflow + +set -o errexit +set -o nounset +set -o pipefail + +export PATH=${GOPATH}/bin:/usr/local/go/bin:${PATH} +REGISTRY="${GCP_REGISTRY}" +PROJECT="${GCP_PROJECT}" +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME}-suggestion-hyperband +VERSION=$(git describe --tags --always --dirty) + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} + +echo "Copy source to GOPATH" +mkdir -p ${GO_DIR} +cp -r cmd ${GO_DIR}/cmd +cp -r pkg ${GO_DIR}/pkg +cp -r vendor ${GO_DIR}/vendor + +cd ${GO_DIR} + +cp cmd/suggestion/hyperband/v1beta1/Dockerfile . +gcloud builds submit . --tag=${REGISTRY}/${REPO_NAME}/v1beta1/suggestion-hyperband:${VERSION} --project=${PROJECT} +gcloud container images add-tag --quiet ${REGISTRY}/${REPO_NAME}/v1beta1/suggestion-hyperband:${VERSION} ${REGISTRY}/${REPO_NAME}/v1beta1/suggestion-hyperband:latest --verbosity=info diff --git a/test/scripts/v1beta1/build-suggestion-hyperopt.sh b/test/scripts/v1beta1/build-suggestion-hyperopt.sh new file mode 100755 index 00000000000..7cde6c1a0c8 --- /dev/null +++ b/test/scripts/v1beta1/build-suggestion-hyperopt.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +# Copyright 2018 The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build an image from our argo workflow + +set -o errexit +set -o nounset +set -o pipefail + +export PATH=${GOPATH}/bin:/usr/local/go/bin:${PATH} +REGISTRY="${GCP_REGISTRY}" +PROJECT="${GCP_PROJECT}" +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME}-suggestion-hyperopt +VERSION=$(git describe --tags --always --dirty) + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} + +echo "Copy source to GOPATH" +mkdir -p ${GO_DIR} +cp -r cmd ${GO_DIR}/cmd +cp -r pkg ${GO_DIR}/pkg +cp -r vendor ${GO_DIR}/vendor + +cd ${GO_DIR} + +cp cmd/suggestion/hyperopt/v1beta1/Dockerfile . +gcloud builds submit . --tag=${REGISTRY}/${REPO_NAME}/v1beta1/suggestion-hyperopt:${VERSION} --project=${PROJECT} +gcloud container images add-tag --quiet ${REGISTRY}/${REPO_NAME}/v1beta1/suggestion-hyperopt:${VERSION} ${REGISTRY}/${REPO_NAME}/v1beta1/suggestion-hyperopt:latest --verbosity=info diff --git a/test/scripts/v1beta1/build-suggestion-nasenvelopenet.sh b/test/scripts/v1beta1/build-suggestion-nasenvelopenet.sh new file mode 100755 index 00000000000..02e348e2392 --- /dev/null +++ b/test/scripts/v1beta1/build-suggestion-nasenvelopenet.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +# Copyright 2018 The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build an image from our argo workflow + +exit 0 + +set -o errexit +set -o nounset +set -o pipefail + +export PATH=${GOPATH}/bin:/usr/local/go/bin:${PATH} +REGISTRY="${GCP_REGISTRY}" +PROJECT="${GCP_PROJECT}" +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME}-suggestion-nasenvelopenet +VERSION=$(git describe --tags --always --dirty) + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} + +echo "Copy source to GOPATH" +mkdir -p ${GO_DIR} +cp -r cmd ${GO_DIR}/cmd +cp -r pkg ${GO_DIR}/pkg +cp -r vendor ${GO_DIR}/vendor + +cd ${GO_DIR} + +cp cmd/suggestion/nasenvelopenet/Dockerfile . +gcloud builds submit . --tag=${REGISTRY}/${REPO_NAME}/suggestion-nasenvelopenet:${VERSION} --project=${PROJECT} +gcloud container images add-tag --quiet ${REGISTRY}/${REPO_NAME}/suggestion-nasenvelopenet:${VERSION} ${REGISTRY}/${REPO_NAME}/v1beta1/suggestion-nasenvelopenet:latest --verbosity=info diff --git a/test/scripts/v1beta1/build-suggestion-skopt.sh b/test/scripts/v1beta1/build-suggestion-skopt.sh new file mode 100755 index 00000000000..cc4c27b06bb --- /dev/null +++ b/test/scripts/v1beta1/build-suggestion-skopt.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +# Copyright 2018 The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build an image from our argo workflow + +set -o errexit +set -o nounset +set -o pipefail + +export PATH=${GOPATH}/bin:/usr/local/go/bin:${PATH} +REGISTRY="${GCP_REGISTRY}" +PROJECT="${GCP_PROJECT}" +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME}-suggestion-skopt +VERSION=$(git describe --tags --always --dirty) + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} + +echo "Copy source to GOPATH" +mkdir -p ${GO_DIR} +cp -r cmd ${GO_DIR}/cmd +cp -r pkg ${GO_DIR}/pkg +cp -r vendor ${GO_DIR}/vendor + +cd ${GO_DIR} + +cp cmd/suggestion/skopt/v1beta1/Dockerfile . +gcloud builds submit . --tag=${REGISTRY}/${REPO_NAME}/v1beta1/suggestion-skopt:${VERSION} --project=${PROJECT} +gcloud container images add-tag --quiet ${REGISTRY}/${REPO_NAME}/v1beta1/suggestion-skopt:${VERSION} ${REGISTRY}/${REPO_NAME}/v1beta1/suggestion-skopt:latest --verbosity=info diff --git a/test/scripts/v1beta1/build-ui.sh b/test/scripts/v1beta1/build-ui.sh new file mode 100755 index 00000000000..b5fc0dc2410 --- /dev/null +++ b/test/scripts/v1beta1/build-ui.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +# Copyright 2018 The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build an image from our argo workflow +# exit 0 + +set -o errexit +set -o nounset +set -o pipefail + +export PATH=${GOPATH}/bin:/usr/local/go/bin:${PATH} +REGISTRY="${GCP_REGISTRY}" +PROJECT="${GCP_PROJECT}" +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME}-katib-ui +VERSION=$(git describe --tags --always --dirty) + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} + +echo "Copy source to GOPATH" +mkdir -p ${GO_DIR} +cp -r cmd ${GO_DIR}/cmd +cp -r pkg ${GO_DIR}/pkg +cp -r vendor ${GO_DIR}/vendor + +cd ${GO_DIR} + +cp cmd/ui/v1beta1/Dockerfile . +gcloud builds submit . --tag=${REGISTRY}/${REPO_NAME}/v1beta1/katib-ui:${VERSION} --project=${PROJECT} --timeout=20m +gcloud container images add-tag --quiet ${REGISTRY}/${REPO_NAME}/v1beta1/katib-ui:${VERSION} ${REGISTRY}/${REPO_NAME}/v1beta1/katib-ui:latest --verbosity=info diff --git a/test/scripts/v1beta1/check-katib-ready.sh b/test/scripts/v1beta1/check-katib-ready.sh new file mode 100755 index 00000000000..b2ca2b12b0d --- /dev/null +++ b/test/scripts/v1beta1/check-katib-ready.sh @@ -0,0 +1,157 @@ +#!/bin/bash + +# Copyright 2018 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build a cluster and create a namespace from our +# argo workflow + +set -o errexit +set -o nounset +set -o pipefail + +CLUSTER_NAME="${CLUSTER_NAME}" +ZONE="${GCP_ZONE}" +PROJECT="${GCP_PROJECT}" +NAMESPACE="${DEPLOY_NAMESPACE}" +REGISTRY="${GCP_REGISTRY}" +VERSION=$(git describe --tags --always --dirty) +KUBECTL_VERSION="v1.14.0" +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME} + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} + +echo "Configuring kubectl" + +echo "CLUSTER_NAME: ${CLUSTER_NAME}" +echo "ZONE: ${GCP_ZONE}" +echo "PROJECT: ${GCP_PROJECT}" + +# The kubectl need to be upgraded to 1.14.0 to avoid dismatch issue. +wget -q -O /usr/local/bin/kubectl https://storage.googleapis.com/kubernetes-release/release/${KUBECTL_VERSION}/bin/linux/amd64/kubectl +chmod a+x /usr/local/bin/kubectl +gcloud --project ${PROJECT} container clusters get-credentials ${CLUSTER_NAME} \ + --zone ${ZONE} +kubectl config set-context $(kubectl config current-context) --namespace=default + +echo "Grant cluster-admin permissions to the current user ..." +kubectl create clusterrolebinding cluster-admin-binding \ + --clusterrole=cluster-admin \ + --user=$(gcloud config get-value core/account) + +#This is required. But I don't know why. +# VERSION=${VERSION/%?/} + +echo "Install Katib " +echo "REGISTRY ${REGISTRY}" +echo "REPO_NAME ${REPO_NAME}" +echo "VERSION ${VERSION}" + +# Katib controller +sed -i -e "s@image: gcr.io\/kubeflow-images-public\/katib\/v1beta1\/katib-controller@image: ${REGISTRY}\/${REPO_NAME}\/v1beta1\/katib-controller:${VERSION}@" manifests/v1beta1/katib-controller/katib-controller.yaml + +# Metrics collector +sed -i -e "s@gcr.io\/kubeflow-images-public\/katib\/v1beta1\/file-metrics-collector@${REGISTRY}\/${REPO_NAME}\/v1beta1\/file-metrics-collector:${VERSION}@" manifests/v1beta1/katib-controller/katib-config.yaml +sed -i -e "s@gcr.io\/kubeflow-images-public\/katib\/v1beta1\/tfevent-metrics-collector@${REGISTRY}\/${REPO_NAME}\/v1beta1\/tfevent-metrics-collector:${VERSION}@" manifests/v1beta1/katib-controller/katib-config.yaml + +# Katib DB manager +sed -i -e "s@image: gcr.io\/kubeflow-images-public\/katib\/v1beta1\/katib-db-manager@image: ${REGISTRY}\/${REPO_NAME}\/v1beta1\/katib-db-manager:${VERSION}@" manifests/v1beta1/db-manager/deployment.yaml + +# UI +sed -i -e "s@image: gcr.io\/kubeflow-images-public\/katib\/v1beta1\/katib-ui@image: ${REGISTRY}\/${REPO_NAME}\/v1beta1\/katib-ui:${VERSION}@" manifests/v1beta1/ui/deployment.yaml + +# Suggestion algorithms +sed -i -e "s@gcr.io\/kubeflow-images-public\/katib\/v1beta1\/suggestion-enas@${REGISTRY}\/${REPO_NAME}\/v1beta1\/suggestion-enas@" manifests/v1beta1/katib-controller/katib-config.yaml +sed -i -e "s@gcr.io\/kubeflow-images-public\/katib\/v1beta1\/suggestion-hyperband@${REGISTRY}\/${REPO_NAME}\/v1beta1\/suggestion-hyperband@" manifests/v1beta1/katib-controller/katib-config.yaml +sed -i -e "s@gcr.io\/kubeflow-images-public\/katib\/v1beta1\/suggestion-chocolate@${REGISTRY}\/${REPO_NAME}\/v1beta1\/suggestion-chocolate@" manifests/v1beta1/katib-controller/katib-config.yaml +sed -i -e "s@gcr.io\/kubeflow-images-public\/katib\/v1beta1\/suggestion-hyperopt@${REGISTRY}\/${REPO_NAME}\/v1beta1\/suggestion-hyperopt@" manifests/v1beta1/katib-controller/katib-config.yaml +sed -i -e "s@gcr.io\/kubeflow-images-public\/katib\/v1beta1\/suggestion-skopt@${REGISTRY}\/${REPO_NAME}\/v1beta1\/suggestion-skopt@" manifests/v1beta1/katib-controller/katib-config.yaml +sed -i -e "s@gcr.io\/kubeflow-images-public\/katib\/v1beta1\/suggestion-goptuna@${REGISTRY}\/${REPO_NAME}\/v1beta1\/suggestion-goptuna@" manifests/v1beta1/katib-controller/katib-config.yaml +sed -i -e "s@gcr.io\/kubeflow-images-public\/katib\/v1beta1\/suggestion-darts@${REGISTRY}\/${REPO_NAME}\/v1beta1\/suggestion-darts@" manifests/v1beta1/katib-controller/katib-config.yaml + +cat manifests/v1beta1/katib-controller/katib-config.yaml + +mkdir -p ${GO_DIR} +cp -r . ${GO_DIR}/ +cp -r pkg/apis/manager/v1beta1/python/* ${GO_DIR}/test/e2e/v1beta1 + +echo "Deploying tf-operator crds from kubeflow/manifests master" +cd "${MANIFESTS_DIR}/tf-training/tf-job-crds/base" +kustomize build . | kubectl apply -f - + +echo "Deploying pytorch-operator crds from kubeflow/manifests master" +cd "${MANIFESTS_DIR}/pytorch-job/pytorch-job-crds/base" +kustomize build . | kubectl apply -f - + +cd ${GO_DIR} +./scripts/v1beta1/deploy.sh + +echo "Deploying tf-operator from kubeflow/manifests master" +cd "${MANIFESTS_DIR}/tf-training/tf-job-operator/base" +kustomize build . | kubectl apply -n kubeflow -f - --validate=false + +echo "Deploying pytorch-operator from kubeflow/manifests master" +cd "${MANIFESTS_DIR}/pytorch-job/pytorch-operator/base/" +kustomize build . | kubectl apply -n kubeflow -f - --validate=false + +TIMEOUT=120 +PODNUM=$(kubectl get deploy -n kubeflow | grep -v NAME | wc -l) +until kubectl get pods -n kubeflow | grep Running | [[ $(wc -l) -eq $PODNUM ]]; do + echo Pod Status $(kubectl get pods -n kubeflow | grep "1/1" | wc -l)/$PODNUM + + sleep 10 + TIMEOUT=$((TIMEOUT - 1)) + if [[ $TIMEOUT -eq 0 ]]; then + echo "NG" + kubectl get pods -n kubeflow + exit 1 + fi +done + +echo "All Katib components are running." +kubectl version +kubectl cluster-info +echo "Katib deployments" +kubectl -n kubeflow get deploy +echo "Katib services" +kubectl -n kubeflow get svc +echo "Katib pods" +kubectl -n kubeflow get pod + +cd ${GO_DIR}/test/e2e/v1beta1 + +echo "Building run-e2e-experiment for e2e test cases" +go build -o run-e2e-experiment ./run-e2e-experiment.go +go build -o resume-e2e-experiment ./resume-e2e-experiment.go + +kubectl apply -f valid-experiment.yaml +kubectl delete -f valid-experiment.yaml +set +o errexit +kubectl apply -f invalid-experiment.yaml +if [ $? -ne 1 ]; then + echo "Failed to create invalid-experiment: return code $?" + exit 1 +fi +set -o errexit +kubectl -n kubeflow port-forward $(kubectl -n kubeflow get pod -o=name | grep katib-db-manager | sed -e "s@pods\/@@") 6789:6789 & +echo "kubectl port-forward start" +sleep 5 +TIMEOUT=120 +until curl localhost:6789 || [ $TIMEOUT -eq 0 ]; do + sleep 5 + TIMEOUT=$((TIMEOUT - 1)) +done + +exit 0 diff --git a/test/scripts/v1beta1/create-cluster.sh b/test/scripts/v1beta1/create-cluster.sh new file mode 100755 index 00000000000..f7003b89a4c --- /dev/null +++ b/test/scripts/v1beta1/create-cluster.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +# Copyright 2018 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build a cluster and create a namespace from our +# argo workflow + +set -o errexit +set -o nounset +set -o pipefail + +CLUSTER_NAME="${CLUSTER_NAME}" +ZONE="${GCP_ZONE}" +PROJECT="${GCP_PROJECT}" +NAMESPACE="${DEPLOY_NAMESPACE}" + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} +echo "Creating GPU cluster" +gcloud --project ${PROJECT} beta container clusters create ${CLUSTER_NAME} \ + --zone ${ZONE} \ + --machine-type=n1-standard-8 \ + --num-nodes=6 \ + --cluster-version 1.14 +echo "Configuring kubectl" +gcloud --project ${PROJECT} container clusters get-credentials ${CLUSTER_NAME} \ + --zone ${ZONE} diff --git a/test/scripts/v1beta1/delete-cluster.sh b/test/scripts/v1beta1/delete-cluster.sh new file mode 100755 index 00000000000..16e1864003c --- /dev/null +++ b/test/scripts/v1beta1/delete-cluster.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +# Copyright 2018 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build a cluster and create a namespace from our +# argo workflow + +set -o errexit +set -o nounset +set -o pipefail + +CLUSTER_NAME="${CLUSTER_NAME}" +ZONE="${GCP_ZONE}" +PROJECT="${GCP_PROJECT}" + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} +echo "Tearing down the cluster" +gcloud container clusters delete ${CLUSTER_NAME} --zone=${ZONE} --project=${PROJECT} diff --git a/test/scripts/v1beta1/python-tests.sh b/test/scripts/v1beta1/python-tests.sh new file mode 100755 index 00000000000..dcf0a655934 --- /dev/null +++ b/test/scripts/v1beta1/python-tests.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +# Copyright 2018 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to run the python tests in the argo workflow + +set -o errexit +set -o nounset +set -o pipefail + +export PYTHONPATH=$(pwd):$(pwd)/pkg/apis/manager/v1beta1/python:$(pwd)/pkg/apis/manager/health/python +pip install -r test/suggestion/v1beta1/test_requirements.txt +pip install -r cmd/suggestion/chocolate/v1beta1/requirements.txt +pip install -r cmd/suggestion/hyperopt/v1beta1/requirements.txt +pip install -r cmd/suggestion/skopt/v1beta1/requirements.txt +pip install -r cmd/suggestion/nas/enas/v1beta1/requirements.txt +pip install -r cmd/suggestion/hyperband/v1beta1/requirements.txt +pip install -r cmd/suggestion/nas/darts/v1beta1/requirements.txt +pytest -s ./test/suggestion/v1beta1 diff --git a/test/scripts/v1beta1/run-custom-metricscollector.sh b/test/scripts/v1beta1/run-custom-metricscollector.sh new file mode 100755 index 00000000000..c1c688f0884 --- /dev/null +++ b/test/scripts/v1beta1/run-custom-metricscollector.sh @@ -0,0 +1,66 @@ +#!/bin/bash + +# Copyright 2018 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build a cluster and create a namespace from our +# argo workflow + +# TODO(andreyvelich) I disabled custom metrics collector in v1beta1 version. +# To support running image kubeflowkatib/custom-metrics-collector in v1beta1 we need to modify the source code. +# It is currently using api.v1.alpha3.Manager instead of api.v1.beta1.Manager. +exit 0 + +set -o errexit +set -o nounset +set -o pipefail + +CLUSTER_NAME="${CLUSTER_NAME}" +ZONE="${GCP_ZONE}" +PROJECT="${GCP_PROJECT}" +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME} + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} + +echo "Configuring kubectl" + +echo "CLUSTER_NAME: ${CLUSTER_NAME}" +echo "ZONE: ${GCP_ZONE}" +echo "PROJECT: ${GCP_PROJECT}" + +gcloud --project ${PROJECT} container clusters get-credentials ${CLUSTER_NAME} \ + --zone ${ZONE} +kubectl config set-context $(kubectl config current-context) --namespace=default +USER=$(gcloud config get-value account) + +echo "All Katib components are running." +kubectl version +kubectl cluster-info +echo "Katib deployments" +kubectl -n kubeflow get deploy +echo "Katib services" +kubectl -n kubeflow get svc +echo "Katib pods" +kubectl -n kubeflow get pod + +cd ${GO_DIR}/test/e2e/v1beta1 + +echo "Running e2e custom metricscollector experiment" +export KUBECONFIG=$HOME/.kube/config +./run-e2e-experiment ../../../examples/v1beta1/custom-metricscollector-example.yaml +kubectl -n kubeflow describe experiment custom-metricscollector-example +kubectl delete -f ../../../examples/v1beta1/custom-metricscollector-example.yaml + +exit 0 diff --git a/test/scripts/v1beta1/run-file-metricscollector.sh b/test/scripts/v1beta1/run-file-metricscollector.sh new file mode 100755 index 00000000000..ad18c36cd7e --- /dev/null +++ b/test/scripts/v1beta1/run-file-metricscollector.sh @@ -0,0 +1,61 @@ +#!/bin/bash + +# Copyright 2018 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build a cluster and create a namespace from our +# argo workflow + +set -o errexit +set -o nounset +set -o pipefail + +CLUSTER_NAME="${CLUSTER_NAME}" +ZONE="${GCP_ZONE}" +PROJECT="${GCP_PROJECT}" +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME} + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} + +echo "Configuring kubectl" + +echo "CLUSTER_NAME: ${CLUSTER_NAME}" +echo "ZONE: ${GCP_ZONE}" +echo "PROJECT: ${GCP_PROJECT}" + +gcloud --project ${PROJECT} container clusters get-credentials ${CLUSTER_NAME} \ + --zone ${ZONE} +kubectl config set-context $(kubectl config current-context) --namespace=default +USER=$(gcloud config get-value account) + +echo "All Katib components are running." +kubectl version +kubectl cluster-info +echo "Katib deployments" +kubectl -n kubeflow get deploy +echo "Katib services" +kubectl -n kubeflow get svc +echo "Katib pods" +kubectl -n kubeflow get pod + +cd ${GO_DIR}/test/e2e/v1beta1 + +echo "Running e2e file metricscollector experiment" +export KUBECONFIG=$HOME/.kube/config +./run-e2e-experiment ../../../examples/v1beta1/file-metricscollector-example.yaml +kubectl -n kubeflow describe experiment file-metricscollector-example +kubectl delete -f ../../../examples/v1beta1/file-metricscollector-example.yaml + +exit 0 diff --git a/test/scripts/v1beta1/run-never-resume.sh b/test/scripts/v1beta1/run-never-resume.sh new file mode 100755 index 00000000000..797d13c169e --- /dev/null +++ b/test/scripts/v1beta1/run-never-resume.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +# Copyright 2018 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build a cluster and create a namespace from our +# argo workflow + +set -o errexit +set -o nounset +set -o pipefail + +CLUSTER_NAME="${CLUSTER_NAME}" +ZONE="${GCP_ZONE}" +PROJECT="${GCP_PROJECT}" +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME} + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} + +echo "Configuring kubectl" + +echo "CLUSTER_NAME: ${CLUSTER_NAME}" +echo "ZONE: ${GCP_ZONE}" +echo "PROJECT: ${GCP_PROJECT}" + +gcloud --project ${PROJECT} container clusters get-credentials ${CLUSTER_NAME} \ + --zone ${ZONE} +kubectl config set-context $(kubectl config current-context) --namespace=default +USER=$(gcloud config get-value account) + +echo "All Katib components are running." +kubectl version +kubectl cluster-info +echo "Katib deployments" +kubectl -n kubeflow get deploy +echo "Katib services" +kubectl -n kubeflow get svc +echo "Katib pods" +kubectl -n kubeflow get pod + +cd ${GO_DIR}/test/e2e/v1beta1 + +echo "Running e2e test for never resume experiment" +export KUBECONFIG=$HOME/.kube/config +./run-e2e-experiment ../../../examples/v1beta1/never-resume-example.yaml + +kubectl -n kubeflow describe suggestion never-resume-example + +kubectl -n kubeflow describe experiment never-resume-example +kubectl -n kubeflow delete experiment never-resume-example + +exit 0 diff --git a/test/scripts/v1beta1/run-pytorchjob.sh b/test/scripts/v1beta1/run-pytorchjob.sh new file mode 100755 index 00000000000..3011139da75 --- /dev/null +++ b/test/scripts/v1beta1/run-pytorchjob.sh @@ -0,0 +1,61 @@ +#!/bin/bash + +# Copyright 2018 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build a cluster and create a namespace from our +# argo workflow + +set -o errexit +set -o nounset +set -o pipefail + +CLUSTER_NAME="${CLUSTER_NAME}" +ZONE="${GCP_ZONE}" +PROJECT="${GCP_PROJECT}" +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME} + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} + +echo "Configuring kubectl" + +echo "CLUSTER_NAME: ${CLUSTER_NAME}" +echo "ZONE: ${GCP_ZONE}" +echo "PROJECT: ${GCP_PROJECT}" + +gcloud --project ${PROJECT} container clusters get-credentials ${CLUSTER_NAME} \ + --zone ${ZONE} +kubectl config set-context $(kubectl config current-context) --namespace=default +USER=$(gcloud config get-value account) + +echo "All Katib components are running." +kubectl version +kubectl cluster-info +echo "Katib deployments" +kubectl -n kubeflow get deploy +echo "Katib services" +kubectl -n kubeflow get svc +echo "Katib pods" +kubectl -n kubeflow get pod + +cd ${GO_DIR}/test/e2e/v1beta1 + +echo "Running e2e pytorchjob random experiment" +export KUBECONFIG=$HOME/.kube/config +./run-e2e-experiment ../../../examples/v1beta1/pytorchjob-example.yaml +kubectl -n kubeflow describe experiment pytorchjob-example +kubectl -n kubeflow delete experiment pytorchjob-example + +exit 0 diff --git a/test/scripts/v1beta1/run-suggestion-bayesian.sh b/test/scripts/v1beta1/run-suggestion-bayesian.sh new file mode 100755 index 00000000000..3434c9f5008 --- /dev/null +++ b/test/scripts/v1beta1/run-suggestion-bayesian.sh @@ -0,0 +1,61 @@ +#!/bin/bash + +# Copyright 2018 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build a cluster and create a namespace from our +# argo workflow + +set -o errexit +set -o nounset +set -o pipefail + +CLUSTER_NAME="${CLUSTER_NAME}" +ZONE="${GCP_ZONE}" +PROJECT="${GCP_PROJECT}" +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME} + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} + +echo "Configuring kubectl" + +echo "CLUSTER_NAME: ${CLUSTER_NAME}" +echo "ZONE: ${GCP_ZONE}" +echo "PROJECT: ${GCP_PROJECT}" + +gcloud --project ${PROJECT} container clusters get-credentials ${CLUSTER_NAME} \ + --zone ${ZONE} +kubectl config set-context $(kubectl config current-context) --namespace=default +USER=$(gcloud config get-value account) + +echo "All Katib components are running." +kubectl version +kubectl cluster-info +echo "Katib deployments" +kubectl -n kubeflow get deploy +echo "Katib services" +kubectl -n kubeflow get svc +echo "Katib pods" +kubectl -n kubeflow get pod + +cd ${GO_DIR}/test/e2e/v1beta1 + +echo "Running e2e skopt bayesian optimization experiment" +export KUBECONFIG=$HOME/.kube/config +./run-e2e-experiment ../../../examples/v1beta1/bayesianoptimization-example.yaml +kubectl -n kubeflow describe experiment bayesianoptimization-example +kubectl -n kubeflow delete experiment bayesianoptimization-example + +exit 0 diff --git a/test/scripts/v1beta1/run-suggestion-cmaes.sh b/test/scripts/v1beta1/run-suggestion-cmaes.sh new file mode 100755 index 00000000000..1818b8835d4 --- /dev/null +++ b/test/scripts/v1beta1/run-suggestion-cmaes.sh @@ -0,0 +1,61 @@ +#!/bin/bash + +# Copyright 2018 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build a cluster and create a namespace from our +# argo workflow + +set -o errexit +set -o nounset +set -o pipefail + +CLUSTER_NAME="${CLUSTER_NAME}" +ZONE="${GCP_ZONE}" +PROJECT="${GCP_PROJECT}" +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME} + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} + +echo "Configuring kubectl" + +echo "CLUSTER_NAME: ${CLUSTER_NAME}" +echo "ZONE: ${GCP_ZONE}" +echo "PROJECT: ${GCP_PROJECT}" + +gcloud --project ${PROJECT} container clusters get-credentials ${CLUSTER_NAME} \ + --zone ${ZONE} +kubectl config set-context $(kubectl config current-context) --namespace=default +USER=$(gcloud config get-value account) + +echo "All Katib components are running." +kubectl version +kubectl cluster-info +echo "Katib deployments" +kubectl -n kubeflow get deploy +echo "Katib services" +kubectl -n kubeflow get svc +echo "Katib pods" +kubectl -n kubeflow get pod + +cd ${GO_DIR}/test/e2e/v1beta1 + +echo "Running e2e Goptuna CMA ES experiment" +export KUBECONFIG=$HOME/.kube/config +./run-e2e-experiment ../../../examples/v1beta1/cmaes-example.yaml +kubectl -n kubeflow describe experiment cmaes-example +kubectl -n kubeflow delete experiment cmaes-example + +exit 0 diff --git a/test/scripts/v1beta1/run-suggestion-enas.sh b/test/scripts/v1beta1/run-suggestion-enas.sh new file mode 100755 index 00000000000..0a3e12bc99a --- /dev/null +++ b/test/scripts/v1beta1/run-suggestion-enas.sh @@ -0,0 +1,61 @@ +#!/bin/bash + +# Copyright 2018 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build a cluster and create a namespace from our +# argo workflow + +set -o errexit +set -o nounset +set -o pipefail + +CLUSTER_NAME="${CLUSTER_NAME}" +ZONE="${GCP_ZONE}" +PROJECT="${GCP_PROJECT}" +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME} + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} + +echo "Configuring kubectl" + +echo "CLUSTER_NAME: ${CLUSTER_NAME}" +echo "ZONE: ${GCP_ZONE}" +echo "PROJECT: ${GCP_PROJECT}" + +gcloud --project ${PROJECT} container clusters get-credentials ${CLUSTER_NAME} \ + --zone ${ZONE} +kubectl config set-context $(kubectl config current-context) --namespace=default +USER=$(gcloud config get-value account) + +echo "All Katib components are running." +kubectl version +kubectl cluster-info +echo "Katib deployments" +kubectl -n kubeflow get deploy +echo "Katib services" +kubectl -n kubeflow get svc +echo "Katib pods" +kubectl -n kubeflow get pod + +cd ${GO_DIR}/test/e2e/v1beta1 + +echo "Running e2e ENAS experiment" +export KUBECONFIG=$HOME/.kube/config +./run-e2e-experiment ../../../examples/v1beta1/nas/enas-example-cpu.yaml +kubectl -n kubeflow describe experiment enas-example-cpu +kubectl -n kubeflow delete experiment enas-example-cpu + +exit 0 diff --git a/test/scripts/v1beta1/run-suggestion-grid.sh b/test/scripts/v1beta1/run-suggestion-grid.sh new file mode 100755 index 00000000000..f2d4ba951bb --- /dev/null +++ b/test/scripts/v1beta1/run-suggestion-grid.sh @@ -0,0 +1,61 @@ +#!/bin/bash + +# Copyright 2018 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build a cluster and create a namespace from our +# argo workflow + +set -o errexit +set -o nounset +set -o pipefail + +CLUSTER_NAME="${CLUSTER_NAME}" +ZONE="${GCP_ZONE}" +PROJECT="${GCP_PROJECT}" +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME} + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} + +echo "Configuring kubectl" + +echo "CLUSTER_NAME: ${CLUSTER_NAME}" +echo "ZONE: ${GCP_ZONE}" +echo "PROJECT: ${GCP_PROJECT}" + +gcloud --project ${PROJECT} container clusters get-credentials ${CLUSTER_NAME} \ + --zone ${ZONE} +kubectl config set-context $(kubectl config current-context) --namespace=default +USER=$(gcloud config get-value account) + +echo "All Katib components are running." +kubectl version +kubectl cluster-info +echo "Katib deployments" +kubectl -n kubeflow get deploy +echo "Katib services" +kubectl -n kubeflow get svc +echo "Katib pods" +kubectl -n kubeflow get pod + +cd ${GO_DIR}/test/e2e/v1beta1 + +echo "Running e2e chocolate grid experiment" +export KUBECONFIG=$HOME/.kube/config +./run-e2e-experiment ../../../examples/v1beta1/grid-example.yaml +kubectl -n kubeflow describe experiment grid-example +kubectl -n kubeflow delete experiment grid-example + +exit 0 diff --git a/test/scripts/v1beta1/run-suggestion-hyperband.sh b/test/scripts/v1beta1/run-suggestion-hyperband.sh new file mode 100755 index 00000000000..c86cc34aa3f --- /dev/null +++ b/test/scripts/v1beta1/run-suggestion-hyperband.sh @@ -0,0 +1,61 @@ +#!/bin/bash + +# Copyright 2018 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build a cluster and create a namespace from our +# argo workflow + +set -o errexit +set -o nounset +set -o pipefail + +CLUSTER_NAME="${CLUSTER_NAME}" +ZONE="${GCP_ZONE}" +PROJECT="${GCP_PROJECT}" +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME} + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} + +echo "Configuring kubectl" + +echo "CLUSTER_NAME: ${CLUSTER_NAME}" +echo "ZONE: ${GCP_ZONE}" +echo "PROJECT: ${GCP_PROJECT}" + +gcloud --project ${PROJECT} container clusters get-credentials ${CLUSTER_NAME} \ + --zone ${ZONE} +kubectl config set-context $(kubectl config current-context) --namespace=default +USER=$(gcloud config get-value account) + +echo "All Katib components are running." +kubectl version +kubectl cluster-info +echo "Katib deployments" +kubectl -n kubeflow get deploy +echo "Katib services" +kubectl -n kubeflow get svc +echo "Katib pods" +kubectl -n kubeflow get pod + +cd ${GO_DIR}/test/e2e/v1beta1 + +echo "Running e2e hyperband experiment" +export KUBECONFIG=$HOME/.kube/config +./run-e2e-experiment ../../../examples/v1beta1/hyperband-example.yaml +kubectl -n kubeflow describe experiment hyperband-example +kubectl -n kubeflow delete experiment hyperband-example + +exit 0 diff --git a/test/scripts/v1beta1/run-suggestion-random.sh b/test/scripts/v1beta1/run-suggestion-random.sh new file mode 100755 index 00000000000..25c5364de20 --- /dev/null +++ b/test/scripts/v1beta1/run-suggestion-random.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +# Copyright 2018 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build a cluster and create a namespace from our +# argo workflow + +set -o errexit +set -o nounset +set -o pipefail + +CLUSTER_NAME="${CLUSTER_NAME}" +ZONE="${GCP_ZONE}" +PROJECT="${GCP_PROJECT}" +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME} + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} + +echo "Configuring kubectl" + +echo "CLUSTER_NAME: ${CLUSTER_NAME}" +echo "ZONE: ${GCP_ZONE}" +echo "PROJECT: ${GCP_PROJECT}" + +gcloud --project ${PROJECT} container clusters get-credentials ${CLUSTER_NAME} \ + --zone ${ZONE} +kubectl config set-context $(kubectl config current-context) --namespace=default +USER=$(gcloud config get-value account) + +echo "All Katib components are running." +kubectl version +kubectl cluster-info +echo "Katib deployments" +kubectl -n kubeflow get deploy +echo "Katib services" +kubectl -n kubeflow get svc +echo "Katib pods" +kubectl -n kubeflow get pod + +cd ${GO_DIR}/test/e2e/v1beta1 + +echo "Running e2e hyperopt random experiment" +export KUBECONFIG=$HOME/.kube/config +./run-e2e-experiment ../../../examples/v1beta1/random-example.yaml +kubectl -n kubeflow describe experiment random-example +echo "Resuming the completed random experiment" +./resume-e2e-experiment ../../../examples/v1beta1/random-example.yaml +kubectl -n kubeflow describe experiment random-example +kubectl -n kubeflow delete experiment random-example + +exit 0 diff --git a/test/scripts/v1beta1/run-suggestion-tpe.sh b/test/scripts/v1beta1/run-suggestion-tpe.sh new file mode 100755 index 00000000000..cbe541ccf6d --- /dev/null +++ b/test/scripts/v1beta1/run-suggestion-tpe.sh @@ -0,0 +1,61 @@ +#!/bin/bash + +# Copyright 2018 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build a cluster and create a namespace from our +# argo workflow + +set -o errexit +set -o nounset +set -o pipefail + +CLUSTER_NAME="${CLUSTER_NAME}" +ZONE="${GCP_ZONE}" +PROJECT="${GCP_PROJECT}" +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME} + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} + +echo "Configuring kubectl" + +echo "CLUSTER_NAME: ${CLUSTER_NAME}" +echo "ZONE: ${GCP_ZONE}" +echo "PROJECT: ${GCP_PROJECT}" + +gcloud --project ${PROJECT} container clusters get-credentials ${CLUSTER_NAME} \ + --zone ${ZONE} +kubectl config set-context $(kubectl config current-context) --namespace=default +USER=$(gcloud config get-value account) + +echo "All Katib components are running." +kubectl version +kubectl cluster-info +echo "Katib deployments" +kubectl -n kubeflow get deploy +echo "Katib services" +kubectl -n kubeflow get svc +echo "Katib pods" +kubectl -n kubeflow get pod + +cd ${GO_DIR}/test/e2e/v1beta1 + +echo "Running e2e hyperopt tpe experiment" +export KUBECONFIG=$HOME/.kube/config +./run-e2e-experiment ../../../examples/v1beta1/tpe-example.yaml +kubectl -n kubeflow describe experiment tpe-example +kubectl -n kubeflow delete experiment tpe-example + +exit 0 diff --git a/test/scripts/v1beta1/run-tfjob.sh b/test/scripts/v1beta1/run-tfjob.sh new file mode 100755 index 00000000000..94e8079601a --- /dev/null +++ b/test/scripts/v1beta1/run-tfjob.sh @@ -0,0 +1,61 @@ +#!/bin/bash + +# Copyright 2018 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This shell script is used to build a cluster and create a namespace from our +# argo workflow + +set -o errexit +set -o nounset +set -o pipefail + +CLUSTER_NAME="${CLUSTER_NAME}" +ZONE="${GCP_ZONE}" +PROJECT="${GCP_PROJECT}" +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME} + +echo "Activating service-account" +gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS} + +echo "Configuring kubectl" + +echo "CLUSTER_NAME: ${CLUSTER_NAME}" +echo "ZONE: ${GCP_ZONE}" +echo "PROJECT: ${GCP_PROJECT}" + +gcloud --project ${PROJECT} container clusters get-credentials ${CLUSTER_NAME} \ + --zone ${ZONE} +kubectl config set-context $(kubectl config current-context) --namespace=default +USER=$(gcloud config get-value account) + +echo "All Katib components are running." +kubectl version +kubectl cluster-info +echo "Katib deployments" +kubectl -n kubeflow get deploy +echo "Katib services" +kubectl -n kubeflow get svc +echo "Katib pods" +kubectl -n kubeflow get pod + +cd ${GO_DIR}/test/e2e/v1beta1 + +echo "Running e2e tfjob random experiment" +export KUBECONFIG=$HOME/.kube/config +./run-e2e-experiment ../../../examples/v1beta1/tfjob-example.yaml +kubectl -n kubeflow describe experiment tfjob-example +kubectl -n kubeflow delete experiment tfjob-example + +exit 0 diff --git a/test/suggestion/v1beta1/test_chocolate_service.py b/test/suggestion/v1beta1/test_chocolate_service.py new file mode 100644 index 00000000000..ccd9ba97d17 --- /dev/null +++ b/test/suggestion/v1beta1/test_chocolate_service.py @@ -0,0 +1,173 @@ +import grpc +import grpc_testing +import unittest + +from pkg.apis.manager.v1beta1.python import api_pb2_grpc +from pkg.apis.manager.v1beta1.python import api_pb2 + +from pkg.suggestion.v1beta1.chocolate.service import ChocolateService + + +class TestChocolate(unittest.TestCase): + def setUp(self): + servicers = { + api_pb2.DESCRIPTOR.services_by_name['Suggestion']: ChocolateService( + ) + } + + self.test_server = grpc_testing.server_from_dictionary( + servicers, grpc_testing.strict_real_time()) + + def test_get_suggestion(self): + trials = [ + api_pb2.Trial( + name="test-asfjh", + spec=api_pb2.TrialSpec( + objective=api_pb2.ObjectiveSpec( + type=api_pb2.MAXIMIZE, + objective_metric_name="metric-2", + goal=0.9 + ), + parameter_assignments=api_pb2.TrialSpec.ParameterAssignments( + assignments=[ + api_pb2.ParameterAssignment( + name="param-1", + value="2", + ), + api_pb2.ParameterAssignment( + name="param-2", + value="cat1", + ), + api_pb2.ParameterAssignment( + name="param-3", + value="2", + ), + api_pb2.ParameterAssignment( + name="param-4", + value="3.44", + ) + ] + ) + ), + status=api_pb2.TrialStatus( + observation=api_pb2.Observation( + metrics=[ + api_pb2.Metric( + name="metric=1", + value="435" + ), + api_pb2.Metric( + name="metric=2", + value="5643" + ), + ] + ) + ) + ), + api_pb2.Trial( + name="test-234hs", + spec=api_pb2.TrialSpec( + objective=api_pb2.ObjectiveSpec( + type=api_pb2.MAXIMIZE, + objective_metric_name="metric-2", + goal=0.9 + ), + parameter_assignments=api_pb2.TrialSpec.ParameterAssignments( + assignments=[ + api_pb2.ParameterAssignment( + name="param-1", + value="3", + ), + api_pb2.ParameterAssignment( + name="param-2", + value="cat2", + ), + api_pb2.ParameterAssignment( + name="param-3", + value="6", + ), + api_pb2.ParameterAssignment( + name="param-4", + value="4.44", + ) + ] + ) + ), + status=api_pb2.TrialStatus( + observation=api_pb2.Observation( + metrics=[ + api_pb2.Metric( + name="metric=1", + value="123" + ), + api_pb2.Metric( + name="metric=2", + value="3028" + ), + ] + ) + ) + ) + ] + experiment = api_pb2.Experiment( + name="test", + spec=api_pb2.ExperimentSpec( + algorithm=api_pb2.AlgorithmSpec( + algorithm_name="grid", + ), + objective=api_pb2.ObjectiveSpec( + type=api_pb2.MAXIMIZE, + goal=0.9 + ), + parameter_specs=api_pb2.ExperimentSpec.ParameterSpecs( + parameters=[ + api_pb2.ParameterSpec( + name="param-1", + parameter_type=api_pb2.INT, + feasible_space=api_pb2.FeasibleSpace( + max="5", min="1", list=[]), + ), + api_pb2.ParameterSpec( + name="param-2", + parameter_type=api_pb2.CATEGORICAL, + feasible_space=api_pb2.FeasibleSpace( + max=None, min=None, list=["cat1", "cat2", "cat3"]) + ), + api_pb2.ParameterSpec( + name="param-3", + parameter_type=api_pb2.DISCRETE, + feasible_space=api_pb2.FeasibleSpace( + max=None, min=None, list=["3", "2", "6"]) + ), + api_pb2.ParameterSpec( + name="param-4", + parameter_type=api_pb2.DOUBLE, + feasible_space=api_pb2.FeasibleSpace( + max="5", min="1", list=[], step="0.5") + ) + ] + ) + ) + ) + + request = api_pb2.GetSuggestionsRequest( + experiment=experiment, + trials=trials, + request_number=2, + ) + + get_suggestion = self.test_server.invoke_unary_unary( + method_descriptor=(api_pb2.DESCRIPTOR + .services_by_name['Suggestion'] + .methods_by_name['GetSuggestions']), + invocation_metadata={}, + request=request, timeout=100) + + response, metadata, code, details = get_suggestion.termination() + print(response.parameter_assignments) + self.assertEqual(code, grpc.StatusCode.OK) + self.assertEqual(2, len(response.parameter_assignments)) + + +if __name__ == '__main__': + unittest.main() diff --git a/test/suggestion/v1beta1/test_darts_service.py b/test/suggestion/v1beta1/test_darts_service.py new file mode 100644 index 00000000000..f78ef7a1f22 --- /dev/null +++ b/test/suggestion/v1beta1/test_darts_service.py @@ -0,0 +1,105 @@ +import grpc +import grpc_testing +import unittest +import json + +from pkg.apis.manager.v1beta1.python import api_pb2_grpc +from pkg.apis.manager.v1beta1.python import api_pb2 + +from pkg.suggestion.v1beta1.nas.darts.service import DartsService + + +class TestDarts(unittest.TestCase): + def setUp(self): + servicers = { + api_pb2.DESCRIPTOR.services_by_name['Suggestion']: DartsService( + ) + } + + self.test_server = grpc_testing.server_from_dictionary( + servicers, grpc_testing.strict_real_time()) + + def test_get_suggestion(self): + experiment = api_pb2.Experiment( + name="darts-experiment", + spec=api_pb2.ExperimentSpec( + algorithm=api_pb2.AlgorithmSpec( + algorithm_name="darts", + algorithm_setting=[ + api_pb2.AlgorithmSetting( + name="num_epoch", + value="10" + ) + ], + ), + objective=api_pb2.ObjectiveSpec( + type=api_pb2.MAXIMIZE, + objective_metric_name="Best-Genotype" + ), + parallel_trial_count=1, + max_trial_count=1, + nas_config=api_pb2.NasConfig( + graph_config=api_pb2.GraphConfig( + num_layers=3, + ), + operations=api_pb2.NasConfig.Operations( + operation=[ + api_pb2.Operation( + operation_type="separable_convolution", + parameter_specs=api_pb2.Operation.ParameterSpecs( + parameters=[ + api_pb2.ParameterSpec( + name="filter_size", + parameter_type=api_pb2.CATEGORICAL, + feasible_space=api_pb2.FeasibleSpace( + max=None, min=None, list=["3", "5"]) + ), + ] + ) + ), + ], + ) + ) + ) + ) + + request = api_pb2.GetSuggestionsRequest( + experiment=experiment, + request_number=1, + ) + + get_suggestion = self.test_server.invoke_unary_unary( + method_descriptor=(api_pb2.DESCRIPTOR + .services_by_name['Suggestion'] + .methods_by_name['GetSuggestions']), + invocation_metadata={}, + request=request, timeout=100) + + response, metadata, code, details = get_suggestion.termination() + print(response.parameter_assignments) + + self.assertEqual(code, grpc.StatusCode.OK) + self.assertEqual(1, len(response.parameter_assignments)) + + exp_algorithm_settings = {} + for setting in experiment.spec.algorithm.algorithm_setting: + exp_algorithm_settings[setting.name] = setting.value + + exp_num_layers = experiment.spec.nas_config.graph_config.num_layers + + exp_search_space = ["separable_convolution_3x3", "separable_convolution_5x5"] + for pa in response.parameter_assignments[0].assignments: + if (pa.name == "algorithm-settings"): + algorithm_settings = pa.value.replace("\'", "\"") + algorithm_settings = json.loads(algorithm_settings) + self.assertDictContainsSubset(exp_algorithm_settings, algorithm_settings) + elif (pa.name == "num-layers"): + self.assertEqual(exp_num_layers, int(pa.value)) + elif (pa.name == "search-space"): + search_space = pa.value.replace("\'", "\"") + search_space = json.loads(search_space) + self.assertEqual(exp_search_space, search_space) + + +if __name__ == '__main__': + unittest.main() diff --git a/test/suggestion/v1beta1/test_enas_service.py b/test/suggestion/v1beta1/test_enas_service.py new file mode 100644 index 00000000000..df9f883a5bd --- /dev/null +++ b/test/suggestion/v1beta1/test_enas_service.py @@ -0,0 +1,182 @@ +import grpc +import grpc_testing +import unittest + +from pkg.apis.manager.v1beta1.python import api_pb2_grpc +from pkg.apis.manager.v1beta1.python import api_pb2 + +from pkg.suggestion.v1beta1.nas.enas.service import EnasService + + +class TestEnas(unittest.TestCase): + def setUp(self): + servicers = { + api_pb2.DESCRIPTOR.services_by_name['Suggestion']: EnasService( + ) + } + + self.test_server = grpc_testing.server_from_dictionary( + servicers, grpc_testing.strict_real_time()) + + def test_get_suggestion(self): + trials = [ + api_pb2.Trial( + name="first-trial", + spec=api_pb2.TrialSpec( + objective=api_pb2.ObjectiveSpec( + type=api_pb2.MAXIMIZE, + objective_metric_name="Validation-Accuracy", + goal=0.99 + ), + parameter_assignments=api_pb2.TrialSpec.ParameterAssignments( + assignments=[ + api_pb2.ParameterAssignment( + name="architecture", + value="[[3], [0, 1], [0, 0, 1], [2, 1, 0, 0]]", + ), + api_pb2.ParameterAssignment( + name="nn_config", + value="{'num_layers': 4}", + ), + ] + ) + ), + status=api_pb2.TrialStatus( + observation=api_pb2.Observation( + metrics=[ + api_pb2.Metric( + name="Validation-Accuracy", + value="0.88" + ), + ] + ), + condition=api_pb2.TrialStatus.TrialConditionType.SUCCEEDED, + + ) + ), + api_pb2.Trial( + name="second-trial", + spec=api_pb2.TrialSpec( + objective=api_pb2.ObjectiveSpec( + type=api_pb2.MAXIMIZE, + objective_metric_name="Validation-Accuracy", + goal=0.99 + ), + parameter_assignments=api_pb2.TrialSpec.ParameterAssignments( + assignments=[ + api_pb2.ParameterAssignment( + name="architecture", + value="[[1], [0, 1], [2, 1, 1], [2, 1, 1, 0]]", + ), + api_pb2.ParameterAssignment( + name="nn_config", + value="{'num_layers': 4}", + ), + ], + ) + ), + status=api_pb2.TrialStatus( + observation=api_pb2.Observation( + metrics=[ + api_pb2.Metric( + name="Validation-Accuracy", + value="0.84" + ), + ] + ), + condition=api_pb2.TrialStatus.TrialConditionType.SUCCEEDED, + ) + ) + ] + experiment = api_pb2.Experiment( + name="enas-experiment", + spec=api_pb2.ExperimentSpec( + algorithm=api_pb2.AlgorithmSpec( + algorithm_name="enas", + ), + objective=api_pb2.ObjectiveSpec( + type=api_pb2.MAXIMIZE, + goal=0.9, + objective_metric_name="Validation-Accuracy" + ), + parallel_trial_count=2, + max_trial_count=10, + nas_config=api_pb2.NasConfig( + graph_config=api_pb2.GraphConfig( + num_layers=4, + input_sizes=[32, 32, 8], + output_sizes=[10] + ), + operations=api_pb2.NasConfig.Operations( + operation=[ + api_pb2.Operation( + operation_type="convolution", + parameter_specs=api_pb2.Operation.ParameterSpecs( + parameters=[ + api_pb2.ParameterSpec( + name="filter_size", + parameter_type=api_pb2.CATEGORICAL, + feasible_space=api_pb2.FeasibleSpace( + max=None, min=None, list=["5"]) + ), + api_pb2.ParameterSpec( + name="num_filter", + parameter_type=api_pb2.CATEGORICAL, + feasible_space=api_pb2.FeasibleSpace( + max=None, min=None, list=["128"]) + ), + api_pb2.ParameterSpec( + name="stride", + parameter_type=api_pb2.CATEGORICAL, + feasible_space=api_pb2.FeasibleSpace( + max=None, min=None, list=["1", "2"]) + ), + ] + ) + ), + api_pb2.Operation( + operation_type="reduction", + parameter_specs=api_pb2.Operation.ParameterSpecs( + parameters=[ + api_pb2.ParameterSpec( + name="reduction_type", + parameter_type=api_pb2.CATEGORICAL, + feasible_space=api_pb2.FeasibleSpace( + max=None, min=None, list=["max_pooling"]) + ), + api_pb2.ParameterSpec( + name="pool_size", + parameter_type=api_pb2.INT, + feasible_space=api_pb2.FeasibleSpace( + min="2", max="3", step="1", list=[]) + ), + ] + ) + ), + ], + ) + ) + ) + ) + + request = api_pb2.GetSuggestionsRequest( + experiment=experiment, + trials=trials, + request_number=2, + ) + + get_suggestion = self.test_server.invoke_unary_unary( + method_descriptor=(api_pb2.DESCRIPTOR + .services_by_name['Suggestion'] + .methods_by_name['GetSuggestions']), + invocation_metadata={}, + request=request, timeout=100) + + response, metadata, code, details = get_suggestion.termination() + print(response.parameter_assignments) + self.assertEqual(code, grpc.StatusCode.OK) + self.assertEqual(2, len(response.parameter_assignments)) + + +if __name__ == '__main__': + unittest.main() diff --git a/test/suggestion/v1beta1/test_hyperband_service.py b/test/suggestion/v1beta1/test_hyperband_service.py new file mode 100644 index 00000000000..d7dcfe5b3dc --- /dev/null +++ b/test/suggestion/v1beta1/test_hyperband_service.py @@ -0,0 +1,183 @@ +import grpc +import grpc_testing +import unittest + +from pkg.apis.manager.v1beta1.python import api_pb2_grpc +from pkg.apis.manager.v1beta1.python import api_pb2 + +from pkg.suggestion.v1beta1.hyperband.service import HyperbandService + + +class TestHyperband(unittest.TestCase): + def setUp(self): + servicers = { + api_pb2.DESCRIPTOR.services_by_name['Suggestion']: HyperbandService( + ) + } + + self.test_server = grpc_testing.server_from_dictionary( + servicers, grpc_testing.strict_real_time()) + + def test_get_suggestion(self): + trials = [ + api_pb2.Trial( + name="test-asfjh", + spec=api_pb2.TrialSpec( + objective=api_pb2.ObjectiveSpec( + type=api_pb2.MAXIMIZE, + objective_metric_name="metric-2", + goal=0.9 + ), + parameter_assignments=api_pb2.TrialSpec.ParameterAssignments( + assignments=[ + api_pb2.ParameterAssignment( + name="param-1", + value="2", + ), + api_pb2.ParameterAssignment( + name="param-2", + value="cat1", + ), + api_pb2.ParameterAssignment( + name="param-3", + value="2", + ), + api_pb2.ParameterAssignment( + name="param-4", + value="3.44", + ) + ] + ) + ), + status=api_pb2.TrialStatus( + observation=api_pb2.Observation( + metrics=[ + api_pb2.Metric( + name="metric=1", + value="435" + ), + api_pb2.Metric( + name="metric=2", + value="5643" + ), + ] + ) + ) + ), + api_pb2.Trial( + name="test-234hs", + spec=api_pb2.TrialSpec( + objective=api_pb2.ObjectiveSpec( + type=api_pb2.MAXIMIZE, + objective_metric_name="metric-2", + goal=0.9 + ), + parameter_assignments=api_pb2.TrialSpec.ParameterAssignments( + assignments=[ + api_pb2.ParameterAssignment( + name="param-1", + value="3", + ), + api_pb2.ParameterAssignment( + name="param-2", + value="cat2", + ), + api_pb2.ParameterAssignment( + name="param-3", + value="6", + ), + api_pb2.ParameterAssignment( + name="param-4", + value="4.44", + ) + ] + ) + ), + status=api_pb2.TrialStatus( + observation=api_pb2.Observation( + metrics=[ + api_pb2.Metric( + name="metric=1", + value="123" + ), + api_pb2.Metric( + name="metric=2", + value="3028" + ), + ] + ) + ) + ) + ] + experiment = api_pb2.Experiment( + name="test", + spec=api_pb2.ExperimentSpec( + algorithm=api_pb2.AlgorithmSpec( + algorithm_name="hyperband", + algorithm_setting=[ + api_pb2.AlgorithmSetting( + name="r_l", + value="10" + ), + api_pb2.AlgorithmSetting( + name="resource_name", + value="--num-epochs" + ) + ], + ), + objective=api_pb2.ObjectiveSpec( + type=api_pb2.MAXIMIZE, + goal=0.9 + ), + parameter_specs=api_pb2.ExperimentSpec.ParameterSpecs( + parameters=[ + api_pb2.ParameterSpec( + name="param-1", + parameter_type=api_pb2.INT, + feasible_space=api_pb2.FeasibleSpace( + max="5", min="1", list=[]), + ), + api_pb2.ParameterSpec( + name="param-2", + parameter_type=api_pb2.CATEGORICAL, + feasible_space=api_pb2.FeasibleSpace( + max=None, min=None, list=["cat1", "cat2", "cat3"]) + ), + api_pb2.ParameterSpec( + name="param-3", + parameter_type=api_pb2.DISCRETE, + feasible_space=api_pb2.FeasibleSpace( + max=None, min=None, list=["3", "2", "6"]) + ), + api_pb2.ParameterSpec( + name="param-4", + parameter_type=api_pb2.DOUBLE, + feasible_space=api_pb2.FeasibleSpace( + max="5", min="1", list=[]) + ) + ] + ) + ) + ) + + request = api_pb2.GetSuggestionsRequest( + experiment=experiment, + trials=trials, + request_number=2, + ) + + get_suggestion = self.test_server.invoke_unary_unary( + method_descriptor=(api_pb2.DESCRIPTOR + .services_by_name['Suggestion'] + .methods_by_name['GetSuggestions']), + invocation_metadata={}, + request=request, timeout=1) + + response, metadata, code, details = get_suggestion.termination() + print(response.parameter_assignments) + self.assertEqual(code, grpc.StatusCode.OK) + self.assertEqual(2, len(response.parameter_assignments)) + + +if __name__ == '__main__': + unittest.main() diff --git a/test/suggestion/v1beta1/test_hyperopt_service.py b/test/suggestion/v1beta1/test_hyperopt_service.py new file mode 100644 index 00000000000..76e595d6eaa --- /dev/null +++ b/test/suggestion/v1beta1/test_hyperopt_service.py @@ -0,0 +1,288 @@ +import unittest + +import grpc +import grpc_testing + +from pkg.apis.manager.v1beta1.python import api_pb2 +from pkg.suggestion.v1beta1.hyperopt.service import HyperoptService + + +class TestHyperopt(unittest.TestCase): + def setUp(self): + servicers = { + api_pb2.DESCRIPTOR.services_by_name['Suggestion']: HyperoptService( + ) + } + + self.test_server = grpc_testing.server_from_dictionary( + servicers, grpc_testing.strict_real_time()) + + def test_get_suggestion(self): + trials = [ + api_pb2.Trial( + name="test-asfjh", + spec=api_pb2.TrialSpec( + objective=api_pb2.ObjectiveSpec( + type=api_pb2.MAXIMIZE, + objective_metric_name="metric-2", + goal=0.9 + ), + parameter_assignments=api_pb2.TrialSpec.ParameterAssignments( + assignments=[ + api_pb2.ParameterAssignment( + name="param-1", + value="2", + ), + api_pb2.ParameterAssignment( + name="param-2", + value="cat1", + ), + api_pb2.ParameterAssignment( + name="param-3", + value="2", + ), + api_pb2.ParameterAssignment( + name="param-4", + value="3.44", + ) + ] + ) + ), + status=api_pb2.TrialStatus( + observation=api_pb2.Observation( + metrics=[ + api_pb2.Metric( + name="metric=1", + value="435" + ), + api_pb2.Metric( + name="metric=2", + value="5643" + ), + ] + ) + ) + ), + api_pb2.Trial( + name="test-234hs", + spec=api_pb2.TrialSpec( + objective=api_pb2.ObjectiveSpec( + type=api_pb2.MAXIMIZE, + objective_metric_name="metric-2", + goal=0.9 + ), + parameter_assignments=api_pb2.TrialSpec.ParameterAssignments( + assignments=[ + api_pb2.ParameterAssignment( + name="param-1", + value="3", + ), + api_pb2.ParameterAssignment( + name="param-2", + value="cat2", + ), + api_pb2.ParameterAssignment( + name="param-3", + value="6", + ), + api_pb2.ParameterAssignment( + name="param-4", + value="4.44", + ) + ] + ) + ), + status=api_pb2.TrialStatus( + observation=api_pb2.Observation( + metrics=[ + api_pb2.Metric( + name="metric=1", + value="123" + ), + api_pb2.Metric( + name="metric=2", + value="3028" + ), + ] + ) + ) + ) + ] + experiment = api_pb2.Experiment( + name="test", + spec=api_pb2.ExperimentSpec( + algorithm=api_pb2.AlgorithmSpec( + algorithm_name="tpe", + algorithm_setting=[ + api_pb2.AlgorithmSetting( + name="random_state", + value="10" + ), + api_pb2.AlgorithmSetting( + name="gamma", + value="0.25" + ), + api_pb2.AlgorithmSetting( + name="prior_weight", + value="1.0" + ), + api_pb2.AlgorithmSetting( + name="n_EI_candidates", + value="24" + ), + ], + ), + objective=api_pb2.ObjectiveSpec( + type=api_pb2.MAXIMIZE, + goal=0.9 + ), + parameter_specs=api_pb2.ExperimentSpec.ParameterSpecs( + parameters=[ + api_pb2.ParameterSpec( + name="param-1", + parameter_type=api_pb2.INT, + feasible_space=api_pb2.FeasibleSpace( + max="5", min="1", list=[]), + ), + api_pb2.ParameterSpec( + name="param-2", + parameter_type=api_pb2.CATEGORICAL, + feasible_space=api_pb2.FeasibleSpace( + max=None, min=None, list=["cat1", "cat2", "cat3"]) + ), + api_pb2.ParameterSpec( + name="param-3", + parameter_type=api_pb2.DISCRETE, + feasible_space=api_pb2.FeasibleSpace( + max=None, min=None, list=["3", "2", "6"]) + ), + api_pb2.ParameterSpec( + name="param-4", + parameter_type=api_pb2.DOUBLE, + feasible_space=api_pb2.FeasibleSpace( + max="5", min="1", list=[]) + ) + ] + ) + ) + ) + + request = api_pb2.GetSuggestionsRequest( + experiment=experiment, + trials=trials, + request_number=2, + ) + + get_suggestion = self.test_server.invoke_unary_unary( + method_descriptor=(api_pb2.DESCRIPTOR + .services_by_name['Suggestion'] + .methods_by_name['GetSuggestions']), + invocation_metadata={}, + request=request, timeout=1) + + response, metadata, code, details = get_suggestion.termination() + print(response.parameter_assignments) + self.assertEqual(code, grpc.StatusCode.OK) + self.assertEqual(2, len(response.parameter_assignments)) + + def test_validate_algorithm_settings(self): + experiment_spec = [None] + + def call_validate(): + experiment = api_pb2.Experiment(name="test", spec=experiment_spec[0]) + request = api_pb2.ValidateAlgorithmSettingsRequest(experiment=experiment) + + validate_algorithm_settings = self.test_server.invoke_unary_unary( + method_descriptor=(api_pb2.DESCRIPTOR + .services_by_name['Suggestion'] + .methods_by_name['ValidateAlgorithmSettings']), + invocation_metadata={}, + request=request, timeout=1) + + return validate_algorithm_settings.termination() + + # valid cases + algorithm_spec = api_pb2.AlgorithmSpec( + algorithm_name="tpe", + algorithm_setting=[ + api_pb2.AlgorithmSetting( + name="random_state", + value="10" + ), + api_pb2.AlgorithmSetting( + name="gamma", + value="0.25" + ), + api_pb2.AlgorithmSetting( + name="prior_weight", + value="1.0" + ), + api_pb2.AlgorithmSetting( + name="n_EI_candidates", + value="24" + ), + ], + ) + experiment_spec[0] = api_pb2.ExperimentSpec(algorithm=algorithm_spec) + self.assertEqual(call_validate()[2], grpc.StatusCode.OK) + + # invalid cases + experiment_spec[0] = api_pb2.ExperimentSpec( + algorithm=api_pb2.AlgorithmSpec(algorithm_name="unknown")) + _, _, code, details = call_validate() + self.assertEqual(code, grpc.StatusCode.INVALID_ARGUMENT) + self.assertEqual(details, 'unknown algorithm name unknown') + + experiment_spec[0] = api_pb2.ExperimentSpec( + algorithm=api_pb2.AlgorithmSpec( + algorithm_name="random", + algorithm_setting=[ + api_pb2.AlgorithmSetting(name="unknown_conf", value="1111")] + )) + _, _, code, details = call_validate() + self.assertEqual(code, grpc.StatusCode.INVALID_ARGUMENT) + self.assertEqual(details, 'unknown setting unknown_conf for algorithm random') + + experiment_spec[0] = api_pb2.ExperimentSpec( + algorithm=api_pb2.AlgorithmSpec( + algorithm_name="tpe", + algorithm_setting=[ + api_pb2.AlgorithmSetting(name="gamma", value="1.5")] + )) + _, _, code, details = call_validate() + self.assertEqual(code, grpc.StatusCode.INVALID_ARGUMENT) + self.assertEqual(details, 'gamma should be in the range of (0, 1)') + + experiment_spec[0] = api_pb2.ExperimentSpec( + algorithm=api_pb2.AlgorithmSpec( + algorithm_name="tpe", + algorithm_setting=[ + api_pb2.AlgorithmSetting(name="n_EI_candidates", value="0")] + )) + _, _, code, details = call_validate() + self.assertEqual(code, grpc.StatusCode.INVALID_ARGUMENT) + self.assertEqual(details, 'n_EI_candidates should be great than zero') + + experiment_spec[0] = api_pb2.ExperimentSpec( + algorithm=api_pb2.AlgorithmSpec( + algorithm_name="tpe", + algorithm_setting=[ + api_pb2.AlgorithmSetting(name="random_state", value="-1")] + )) + _, _, code, details = call_validate() + self.assertEqual(code, grpc.StatusCode.INVALID_ARGUMENT) + self.assertEqual(details, 'random_state should be great or equal than zero') + + experiment_spec[0] = api_pb2.ExperimentSpec( + algorithm=api_pb2.AlgorithmSpec( + algorithm_name="tpe", + algorithm_setting=[ + api_pb2.AlgorithmSetting(name="prior_weight", value="aaa")] + )) + _, _, code, details = call_validate() + self.assertEqual(code, grpc.StatusCode.INVALID_ARGUMENT) + self.assertTrue(details.startswith('failed to validate prior_weight(aaa)')) + + +if __name__ == '__main__': + unittest.main() diff --git a/test/suggestion/v1beta1/test_requirements.txt b/test/suggestion/v1beta1/test_requirements.txt new file mode 100644 index 00000000000..822837385d1 --- /dev/null +++ b/test/suggestion/v1beta1/test_requirements.txt @@ -0,0 +1,2 @@ +grpcio-testing +pytest==5.1.2 diff --git a/test/suggestion/v1beta1/test_skopt_service.py b/test/suggestion/v1beta1/test_skopt_service.py new file mode 100644 index 00000000000..58ccc137f93 --- /dev/null +++ b/test/suggestion/v1beta1/test_skopt_service.py @@ -0,0 +1,179 @@ +import grpc +import grpc_testing +import unittest + +from pkg.apis.manager.v1beta1.python import api_pb2_grpc +from pkg.apis.manager.v1beta1.python import api_pb2 + +from pkg.suggestion.v1beta1.skopt.service import SkoptService + + +class TestSkopt(unittest.TestCase): + def setUp(self): + servicers = { + api_pb2.DESCRIPTOR.services_by_name['Suggestion']: SkoptService( + ) + } + + self.test_server = grpc_testing.server_from_dictionary( + servicers, grpc_testing.strict_real_time()) + + def test_get_suggestion(self): + trials = [ + api_pb2.Trial( + name="test-asfjh", + spec=api_pb2.TrialSpec( + objective=api_pb2.ObjectiveSpec( + type=api_pb2.MAXIMIZE, + objective_metric_name="metric-2", + goal=0.9 + ), + parameter_assignments=api_pb2.TrialSpec.ParameterAssignments( + assignments=[ + api_pb2.ParameterAssignment( + name="param-1", + value="2", + ), + api_pb2.ParameterAssignment( + name="param-2", + value="cat1", + ), + api_pb2.ParameterAssignment( + name="param-3", + value="2", + ), + api_pb2.ParameterAssignment( + name="param-4", + value="3.44", + ) + ] + ) + ), + status=api_pb2.TrialStatus( + observation=api_pb2.Observation( + metrics=[ + api_pb2.Metric( + name="metric=1", + value="435" + ), + api_pb2.Metric( + name="metric=2", + value="5643" + ), + ] + ) + ) + ), + api_pb2.Trial( + name="test-234hs", + spec=api_pb2.TrialSpec( + objective=api_pb2.ObjectiveSpec( + type=api_pb2.MAXIMIZE, + objective_metric_name="metric-2", + goal=0.9 + ), + parameter_assignments=api_pb2.TrialSpec.ParameterAssignments( + assignments=[ + api_pb2.ParameterAssignment( + name="param-1", + value="3", + ), + api_pb2.ParameterAssignment( + name="param-2", + value="cat2", + ), + api_pb2.ParameterAssignment( + name="param-3", + value="6", + ), + api_pb2.ParameterAssignment( + name="param-4", + value="4.44", + ) + ] + ) + ), + status=api_pb2.TrialStatus( + observation=api_pb2.Observation( + metrics=[ + api_pb2.Metric( + name="metric=1", + value="123" + ), + api_pb2.Metric( + name="metric=2", + value="3028" + ), + ] + ) + ) + ) + ] + experiment = api_pb2.Experiment( + name="test", + spec=api_pb2.ExperimentSpec( + algorithm=api_pb2.AlgorithmSpec( + algorithm_name="bayesianoptimization", + algorithm_setting=[ + api_pb2.AlgorithmSetting( + name="random_state", + value="10" + ) + ], + ), + objective=api_pb2.ObjectiveSpec( + type=api_pb2.MAXIMIZE, + goal=0.9 + ), + parameter_specs=api_pb2.ExperimentSpec.ParameterSpecs( + parameters=[ + api_pb2.ParameterSpec( + name="param-1", + parameter_type=api_pb2.INT, + feasible_space=api_pb2.FeasibleSpace( + max="5", min="1", list=[]), + ), + api_pb2.ParameterSpec( + name="param-2", + parameter_type=api_pb2.CATEGORICAL, + feasible_space=api_pb2.FeasibleSpace( + max=None, min=None, list=["cat1", "cat2", "cat3"]) + ), + api_pb2.ParameterSpec( + name="param-3", + parameter_type=api_pb2.DISCRETE, + feasible_space=api_pb2.FeasibleSpace( + max=None, min=None, list=["3", "2", "6"]) + ), + api_pb2.ParameterSpec( + name="param-4", + parameter_type=api_pb2.DOUBLE, + feasible_space=api_pb2.FeasibleSpace( + max="5", min="1", list=[]) + ) + ] + ) + ) + ) + + request = api_pb2.GetSuggestionsRequest( + experiment=experiment, + trials=trials, + request_number=2, + ) + + get_suggestion = self.test_server.invoke_unary_unary( + method_descriptor=(api_pb2.DESCRIPTOR + .services_by_name['Suggestion'] + .methods_by_name['GetSuggestions']), + invocation_metadata={}, + request=request, timeout=1) + + response, metadata, code, details = get_suggestion.termination() + print(response.parameter_assignments) + self.assertEqual(code, grpc.StatusCode.OK) + self.assertEqual(2, len(response.parameter_assignments)) + + +if __name__ == '__main__': + unittest.main() diff --git a/test/unit/v1beta1/crds/pytorchjob_v1.yaml b/test/unit/v1beta1/crds/pytorchjob_v1.yaml new file mode 100644 index 00000000000..697294be50f --- /dev/null +++ b/test/unit/v1beta1/crds/pytorchjob_v1.yaml @@ -0,0 +1,12 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: pytorchjobs.kubeflow.org +spec: + group: kubeflow.org + version: v1 + scope: Namespaced + names: + kind: PyTorchJob + singular: pytorchjob + plural: pytorchjobs diff --git a/test/unit/v1beta1/crds/tfjob_v1.yaml b/test/unit/v1beta1/crds/tfjob_v1.yaml new file mode 100644 index 00000000000..580ca69aa8c --- /dev/null +++ b/test/unit/v1beta1/crds/tfjob_v1.yaml @@ -0,0 +1,12 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: tfjobs.kubeflow.org +spec: + group: kubeflow.org + version: v1 + scope: Namespaced + names: + kind: TFJob + singular: tfjob + plural: tfjobs diff --git a/test/workflows/components/params.libsonnet b/test/workflows/components/params.libsonnet index 101ad94db37..7e947fc4294 100644 --- a/test/workflows/components/params.libsonnet +++ b/test/workflows/components/params.libsonnet @@ -14,5 +14,13 @@ prow_env: "JOB_NAME=katib-v1alpha3-presubmit-test,JOB_TYPE=presubmit,PULL_NUMBER=374,REPO_NAME=k8s,REPO_OWNER=tensorflow,BUILD_NUMBER=6e32", versionTag: null, }, + "workflows-v1beta1": { + bucket: "kubeflow-ci_temp", + name: "some-very-very-very-very-very-long-name-katib-v1beta1-presubmit-test-374-6e32", + namespace: "kubeflow-test-infra", + registry: "gcr.io/kubbeflow-ci", + prow_env: "JOB_NAME=katib-v1beta1-presubmit-test,JOB_TYPE=presubmit,PULL_NUMBER=374,REPO_NAME=k8s,REPO_OWNER=tensorflow,BUILD_NUMBER=6e32", + versionTag: null, + }, }, } diff --git a/test/workflows/components/workflows-v1beta1.jsonnet b/test/workflows/components/workflows-v1beta1.jsonnet new file mode 100644 index 00000000000..a75a7f0e06d --- /dev/null +++ b/test/workflows/components/workflows-v1beta1.jsonnet @@ -0,0 +1,14 @@ +local params = std.extVar("__ksonnet/params").components["workflows-v1beta1"]; + +local k = import 'k.libsonnet'; +local workflows = import 'workflows-v1beta1.libsonnet'; +local namespace = params.namespace; + +// TODO(jlewi): Can we make name default so some random unique value? +// I didn't see any routines in the standard library for datetime or random. +local name = params.name; + +local prowEnv = workflows.parseEnv(params.prow_env); +local bucket = params.bucket; + +std.prune(k.core.v1.list.new([workflows.parts(namespace, name, params).e2e(prowEnv, bucket)])) diff --git a/test/workflows/components/workflows-v1beta1.libsonnet b/test/workflows/components/workflows-v1beta1.libsonnet new file mode 100644 index 00000000000..88548c6bc64 --- /dev/null +++ b/test/workflows/components/workflows-v1beta1.libsonnet @@ -0,0 +1,462 @@ +{ + // TODO(https://github.com/ksonnet/ksonnet/issues/222): Taking namespace as an argument is a work around for the fact that ksonnet + // doesn't support automatically piping in the namespace from the environment to prototypes. + + // convert a list of two items into a map representing an environment variable + // TODO(jlewi): Should we move this into kubeflow/core/util.libsonnet + listToMap:: function(v) + { + name: v[0], + value: v[1], + }, + + // Function to turn comma separated list of prow environment variables into a dictionary. + parseEnv:: function(v) + local pieces = std.split(v, ","); + if v != "" && std.length(pieces) > 0 then + std.map( + function(i) $.listToMap(std.split(i, "=")), + std.split(v, ",") + ) + else [], + + + // default parameters. + defaultParams:: { + project:: "kubeflow-ci", + zone:: "us-east1-d", + // Default registry to use. + //registry:: "gcr.io/" + $.defaultParams.project, + + // The image tag to use. + // Defaults to a value based on the name. + versionTag:: null, + + // The name of the secret containing GCP credentials. + gcpCredentialsSecretName:: "kubeflow-testing-credentials", + }, + + // overrides is a dictionary of parameters to provide in addition to defaults. + parts(namespace, name, overrides):: { + // Workflow to run the e2e test. + e2e(prow_env, bucket): + local params = $.defaultParams + overrides; + + // mountPath is the directory where the volume to store the test data + // should be mounted. + local mountPath = "/mnt/" + "test-data-volume"; + // testDir is the root directory for all data for a particular test run. + local testDir = mountPath + "/" + name; + // outputDir is the directory to sync to GCS to contain the output for this job. + local outputDir = testDir + "/output"; + local artifactsDir = outputDir + "/artifacts"; + local goDir = testDir + "/go"; + // Source directory where all repos should be checked out + local srcRootDir = testDir + "/src"; + // The directory containing the kubeflow/katib repo + local srcDir = srcRootDir + "/kubeflow/katib"; + // The directory containing the kubeflow/manifests repo; + local manifestsDir = srcRootDir + "/kubeflow/manifests"; + local testWorkerImage = "gcr.io/kubeflow-ci/test-worker:v20190802-c6f9140-e3b0c4"; + local pythonImage = "python:3.6-jessie"; + // The name of the NFS volume claim to use for test files. + // local nfsVolumeClaim = "kubeflow-testing"; + local nfsVolumeClaim = "nfs-external"; + // The name to use for the volume to use to contain test data. + local dataVolume = "kubeflow-test-volume"; + local versionTag = if params.versionTag != null then + params.versionTag + else name; + + // The namespace on the cluster we spin up to deploy into. + local deployNamespace = "kubeflow"; + // The directory within the kubeflow_testing submodule containing + // py scripts to use. + local k8sPy = srcDir; + local kubeflowPy = srcRootDir + "/kubeflow/testing/py"; + + local project = params.project; + // GKE cluster to use + // We need to truncate the cluster to no more than 40 characters because + // cluster names can be a max of 40 characters. + // We expect the suffix of the cluster name to be unique salt. + // We prepend a z because cluster name must start with an alphanumeric character + // and if we cut the prefix we might end up starting with "-" or other invalid + // character for first character. + local cluster = + if std.length(name) > 40 then + "z" + std.substr(name, std.length(name) - 39, 39) + else + name; + local zone = params.zone; + local registry = params.registry; + local chart = srcDir + "/katib-chart"; + { + // Build an Argo template to execute a particular command. + // step_name: Name for the template + // command: List to pass as the container command. + buildTemplate(step_name, image, command):: { + name: step_name, + container: { + command: command, + image: image, + workingDir: srcDir, + env: [ + { + // Add the source directories to the python path. + name: "PYTHONPATH", + value: k8sPy + ":" + kubeflowPy, + }, + { + name: "MANIFESTS_DIR", + value: manifestsDir, + }, + { + // Set the GOPATH + name: "GOPATH", + value: goDir, + }, + { + name: "CLUSTER_NAME", + value: cluster, + }, + { + name: "GCP_ZONE", + value: zone, + }, + { + name: "GCP_PROJECT", + value: project, + }, + { + name: "GCP_REGISTRY", + value: registry, + }, + { + name: "DEPLOY_NAMESPACE", + value: deployNamespace, + }, + { + name: "GOOGLE_APPLICATION_CREDENTIALS", + value: "/secret/gcp-credentials/key.json", + }, + { + name: "GIT_TOKEN", + valueFrom: { + secretKeyRef: { + name: "github-token", + key: "github_token", + }, + }, + }, + ] + prow_env, + volumeMounts: [ + { + name: dataVolume, + mountPath: mountPath, + }, + { + name: "github-token", + mountPath: "/secret/github-token", + }, + { + name: "gcp-credentials", + mountPath: "/secret/gcp-credentials", + }, + ], + }, + }, // buildTemplate + + apiVersion: "argoproj.io/v1alpha1", + kind: "Workflow", + metadata: { + name: name, + namespace: namespace, + }, + // TODO(jlewi): Use OnExit to run cleanup steps. + spec: { + entrypoint: "e2e", + volumes: [ + { + name: "github-token", + secret: { + secretName: "github-token", + }, + }, + { + name: "gcp-credentials", + secret: { + secretName: params.gcpCredentialsSecretName, + }, + }, + { + name: dataVolume, + persistentVolumeClaim: { + claimName: nfsVolumeClaim, + }, + }, + ], // volumes + // onExit specifies the template that should always run when the workflow completes. + onExit: "exit-handler", + templates: [ + { + name: "e2e", + steps: [ + [{ + name: "checkout", + template: "checkout", + }], + [ + { + name: "python-tests", + template: "python-tests", + }, + { + name: "build-suggestion-enas", + template: "build-suggestion-enas", + }, + { + name: "build-manager", + template: "build-manager", + }, + { + name: "build-katib-controller", + template: "build-katib-controller", + }, + { + name: "build-suggestion-chocolate", + template: "build-suggestion-chocolate", + }, + { + name: "build-suggestion-hyperband", + template: "build-suggestion-hyperband", + }, + { + name: "build-suggestion-hyperopt", + template: "build-suggestion-hyperopt", + }, + { + name: "build-suggestion-skopt", + template: "build-suggestion-skopt", + }, + { + name: "build-suggestion-goptuna", + template: "build-suggestion-goptuna", + }, + { + name: "build-suggestion-darts", + template: "build-suggestion-darts", + }, + { + name: "build-earlystopping-median", + template: "build-earlystopping-median", + }, + { + name: "build-ui", + template: "build-ui", + }, + { + name: "create-pr-symlink", + template: "create-pr-symlink", + }, + ], + [ + { + name: "setup-cluster", + template: "setup-cluster", + }, + ], + [ + { + name: "check-katib-ready", + template: "check-katib-ready", + }, + ], + [ + { + name: "run-random-e2e-tests", + template: "run-random-e2e-tests", + }, + { + name: "run-grid-e2e-tests", + template: "run-grid-e2e-tests", + }, + { + name: "run-file-metricscollector-e2e-tests", + template: "run-file-metricscollector-e2e-tests", + }, + { + name: "run-custom-metricscollector-e2e-tests", + template: "run-custom-metricscollector-e2e-tests", + }, + { + name: "run-bayesian-e2e-tests", + template: "run-bayesian-e2e-tests", + }, + { + name: "run-enas-e2e-tests", + template: "run-enas-e2e-tests", + }, + { + name: "run-hyperband-e2e-tests", + template: "run-hyperband-e2e-tests", + }, + { + name: "run-tpe-e2e-tests", + template: "run-tpe-e2e-tests", + }, + { + name: "run-tfjob-e2e-tests", + template: "run-tfjob-e2e-tests", + }, + { + name: "run-pytorchjob-e2e-tests", + template: "run-pytorchjob-e2e-tests", + }, + { + name: "run-cmaes-e2e-tests", + template: "run-cmaes-e2e-tests", + }, + { + name: "run-never-resume-e2e-tests", + template: "run-never-resume-e2e-tests", + }, + ], + ], + }, + { + name: "exit-handler", + steps: [ + [{ + name: "teardown-cluster", + template: "teardown-cluster", + + }], + [{ + name: "copy-artifacts", + template: "copy-artifacts", + }], + ], + }, + { + name: "checkout", + container: { + command: [ + "/usr/local/bin/checkout.sh", + srcRootDir, + ], + env: prow_env + [{ + name: "EXTRA_REPOS", + value: "kubeflow/testing@HEAD;kubeflow/manifests@HEAD", + }], + image: testWorkerImage, + volumeMounts: [ + { + name: dataVolume, + mountPath: mountPath, + }, + ], + }, + }, // checkout + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("setup-cluster",testWorkerImage, [ + "test/scripts/v1beta1/create-cluster.sh", + ]), // setup cluster + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("python-tests", pythonImage, [ + "test/scripts/v1beta1/python-tests.sh", + ]), // run python tests + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("check-katib-ready", testWorkerImage, [ + "test/scripts/v1beta1/check-katib-ready.sh", + ]), // check katib readiness + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("run-random-e2e-tests", testWorkerImage, [ + "test/scripts/v1beta1/run-suggestion-random.sh", + ]), // run random algorithm + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("run-tpe-e2e-tests", testWorkerImage, [ + "test/scripts/v1beta1/run-suggestion-tpe.sh", + ]), // run tpe algorithm + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("run-tfjob-e2e-tests", testWorkerImage, [ + "test/scripts/v1beta1/run-tfjob.sh", + ]), // run tfjob + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("run-pytorchjob-e2e-tests", testWorkerImage, [ + "test/scripts/v1beta1/run-pytorchjob.sh", + ]), // run pytorchjob + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("run-hyperband-e2e-tests", testWorkerImage, [ + "test/scripts/v1beta1/run-suggestion-hyperband.sh", + ]), // run hyperband algorithm + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("run-grid-e2e-tests", testWorkerImage, [ + "test/scripts/v1beta1/run-suggestion-grid.sh", + ]), // run grid algorithm + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("run-enas-e2e-tests", testWorkerImage, [ + "test/scripts/v1beta1/run-suggestion-enas.sh", + ]), // run enas algorithm + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("run-bayesian-e2e-tests", testWorkerImage, [ + "test/scripts/v1beta1/run-suggestion-bayesian.sh", + ]), // run bayesian algorithm + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("run-file-metricscollector-e2e-tests", testWorkerImage, [ + "test/scripts/v1beta1/run-file-metricscollector.sh", + ]), // run file metrics collector test + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("run-custom-metricscollector-e2e-tests", testWorkerImage, [ + "test/scripts/v1beta1/run-custom-metricscollector.sh", + ]), // run custom metrics collector test + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("run-cmaes-e2e-tests", testWorkerImage, [ + "test/scripts/v1beta1/run-suggestion-cmaes.sh", + ]), // run cmaes algorithm + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("run-never-resume-e2e-tests", testWorkerImage, [ + "test/scripts/v1beta1/run-never-resume.sh", + ]), // run never resume suggestion test + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("create-pr-symlink", testWorkerImage, [ + "python", + "-m", + "kubeflow.testing.prow_artifacts", + "--artifacts_dir=" + outputDir, + "create_pr_symlink", + "--bucket=" + bucket, + ]), // create-pr-symlink + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("teardown-cluster",testWorkerImage, [ + "test/scripts/v1beta1/delete-cluster.sh", + ]), // teardown cluster + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("copy-artifacts", testWorkerImage, [ + "python", + "-m", + "kubeflow.testing.prow_artifacts", + "--artifacts_dir=" + outputDir, + "copy_artifacts", + "--bucket=" + bucket, + ]), // copy-artifacts + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("build-manager", testWorkerImage, [ + "test/scripts/v1beta1/build-manager.sh", + ]), // build-manager + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("build-katib-controller", testWorkerImage, [ + "test/scripts/v1beta1/build-katib-controller.sh", + ]), // build-katib-controller + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("build-suggestion-hyperband", testWorkerImage, [ + "test/scripts/v1beta1/build-suggestion-hyperband.sh", + ]), // build-suggestion-hyperband + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("build-suggestion-hyperopt", testWorkerImage, [ + "test/scripts/v1beta1/build-suggestion-hyperopt.sh", + ]), // build-suggestion-hyperopt + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("build-suggestion-skopt", testWorkerImage, [ + "test/scripts/v1beta1/build-suggestion-skopt.sh", + ]), // build-suggestion-skopt + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("build-suggestion-chocolate", testWorkerImage, [ + "test/scripts/v1beta1/build-suggestion-chocolate.sh", + ]), // build-suggestion-chocolate + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("build-suggestion-enas", testWorkerImage, [ + "test/scripts/v1beta1/build-suggestion-enas.sh", + ]), // build-suggestion-enas + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("build-suggestion-goptuna", testWorkerImage, [ + "test/scripts/v1beta1/build-suggestion-goptuna.sh", + ]), // build-suggestion-goptuna + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("build-suggestion-darts", testWorkerImage, [ + "test/scripts/v1beta1/build-suggestion-darts.sh", + ]), // build-suggestion-darts + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("build-earlystopping-median", testWorkerImage, [ + "test/scripts/v1beta1/build-earlystopping-median.sh", + ]), // build-earlystopping-median + $.parts(namespace, name, overrides).e2e(prow_env, bucket).buildTemplate("build-ui", testWorkerImage, [ + "test/scripts/v1beta1/build-ui.sh", + ]), // build-ui + ], // templates + }, + }, // e2e + }, // parts +}